POST /api/v2/storefront/storefronts/{storefrontId}/demand-signals/{signalId}/test-fit
Runs the matcher and reply drafter against a demand signal scoped to the caller’s storefront without persisting anything. Returns the match score, a per-factor breakdown, ranked product candidates, an agent-drafted reply, and the headline CPM. Idempotent and safe to call repeatedly — use it to preview before Respond to demand signal.
Request
Parameters
| Field | Type | Required | Notes |
|---|---|---|---|
storefrontId | integer | Yes | Storefront the caller owns (path) |
signalId | integer | Yes | Demand signal identifier (path) |
overrides | object | No | Steer the dry-run without changing stored data |
overrides.includeProductIds | string[] | No | Force-include these products (1–200) |
overrides.excludeProductIds | string[] | No | Force-exclude these products (max 200) |
overrides.cpmOverrides | object | No | Per-product CPM overrides (productId → number > 0) |
overrides.notesOverride | string | No | Override notes fed to the reply drafter (max 4000) |
Response
verdict is AUTO-QUOTE, REVIEW, or PASS. draftReply.source is gemini, template, or human. Nothing is written — call /respond to send a response.
Errors
400 VALIDATION_ERROR—includeProductIdsempty or over 200 entries, or acpmOverridesvalue ≤ 0.403 FORBIDDEN— thedemand-supply-signalsfeature is not enabled, or the caller does not own the storefront.404 NOT_FOUND— the signal is not routed to this storefront.
Related
Demand signal tasks
All demand-signal operations
Respond to demand signal
Send the response after previewing
Get demand signal
One signal with its target row
List demand signals
Filterable, paginated list