POST /api/v2/buyer/planning-briefs
Creates a new planning brief (prospective brief) and shares it with one or more publisher targets in a single transaction. Each target identifies either an Interchange storefront (LIVE / COMING_SOON) or an external publisher (NOT_ON_INTERCHANGE). The brief is created in SEARCHING status.
Request
curl
Parameters
| Field | Type | Required | Notes |
|---|---|---|---|
buyerName | string | Yes | Buyer display name (1–200) |
advertiserName | string | Yes | Advertiser display name (1–200) |
audience | string | Yes | Target audience description (1–1000) |
geo | string | Yes | Geography description (1–200) |
channels | array | Yes | One or more of display, native, video, audio, ctv, dooh, newsletter, podcast |
startDate / endDate | string | Yes | Flight dates |
statedBudget | number | Yes | Total budget (> 0) |
currency | string | Yes | 3-letter ISO currency code |
advertiserId | integer | No | Owning advertiser |
campaignName | string | No | Prospective campaign name (1–200) |
exclusions | array | No | { type, values?, raw? }; type is category, adjacency, competitor, domain, keyword, or raw |
flexibility | object | No | { mode, days? }; mode is firm, flexible, or open |
primaryKpi | object | No | { raw, parsed? } where parsed is { kpi, op, value } |
priceExpect | number | No | Expected CPM/price (> 0) |
creativeReady | boolean | No | Whether creative is ready |
rawPrompt | string | No | Original free-text prompt (max 4000) |
targetingMode | enum | No | DIRECT, FILTERED, or BROAD |
targets | array | No | Publisher targets (max 200). Each requires bucket; identify by storefrontId or externalPublisherName + externalPublisherDomain |
targets[].bucket | enum | Yes (per target) | LIVE, COMING_SOON, or NOT_ON_INTERCHANGE |
Response
201 Created — returns the created brief plus its per-publisher target rows (DemandSignalWithTargets).
| Field | Type | Notes |
|---|---|---|
id | string | Brief ID — pass to GET /planning-briefs/:briefId |
status | enum | SEARCHING on create |
targets | array | Per-publisher target rows |
targets[].bucket | enum | LIVE, COMING_SOON, NOT_ON_INTERCHANGE |
targets[].dispatchStatus | enum | QUEUED, DISPATCHED, ACKNOWLEDGED, ON_HOLD, FAILED, DECLINED |
targets[].matchPct | integer | null | Match percentage, 0–100 |
Errors
400 VALIDATION_ERROR— missing required field,channelsempty, a target missingbucket, or a target supplying bothstorefrontIdandexternalPublisherName.401 UNAUTHORIZED— missing or invalid bearer token.
Related
Planning brief tasks
All planning brief operations
Get planning brief
Brief with target rows
List brief responses
Seller replies