POST /api/v2/buyer/campaigns
Creates a campaign in DRAFT status for the given advertiser. You set flight dates, budget, and campaign type up front; products, creatives, and audiences attach afterward. Execute the campaign later to turn it into live media buys.
Request
Parameters
| Field | Type | Required | Notes |
|---|---|---|---|
advertiserId | number | Yes | Owning advertiser |
name | string | Yes | Campaign name (max 255) |
campaignType | enum | Yes | DECISIONED or ROUTED. Immutable after creation |
flightDates | object | Yes | { startDate, endDate }, ISO 8601 dates |
budget | object | Yes | { total, currency?, dailyCap?, pacing? }. currency defaults to the advertiser’s primary currency when omitted. pacing is EVEN, ASAP, or FRONTLOADED |
brief | string | No | Free-text plan brief used to guide product selection |
constraints | object | No | channels filter plus AdCP targeting overlay: geo_countries, geo_metros, language |
pacingPeriods | object | No | Time-windowed pacing. mode is weight or budget; periods[] each carry label, start, end, and weight (weight mode) |
Response
status: "DRAFT". campaign.campaignId is the stable identifier you pass to every sibling operation. campaignType cannot be changed later. When the request included a discoveryId, the response also carries productGroups, budgetContext, and summary from the discovery session.
Errors
400 VALIDATION_ERROR— missing required field, malformedflightDates, or non-positivebudget.total.404 NOT_FOUND—advertiserIddoes not exist or is not visible to the authenticated customer.
Related
Campaign tasks
All campaign operations
Campaign overview
Fields, lifecycle, and concepts
Auto-select products
Populate a DECISIONED campaign
Execute campaign
Launch into media buys