Create a campaign draft
Opens a draft campaign — the first step of the build flow. Nothing is scheduled, charged or printed by this call.
For USPS Every Door Direct Mail, pass channel: "ADM" with subtype: "EDDM". The campaign is created on your own account; there is no client id to pass.
Needs an OAuth access token carrying the campaigns:create scope — a plain client key is refused.
Authorization
campaignBuilderOAuth campaigns:createOAuth access token carrying the campaigns:create scope, obtained through the Oppizi consent screen (the same sign-in used by the MCP connector). A plain client key carries no scopes and is refused on these endpoints.
In: header
Scope: campaigns:create
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
curl -X POST "https://example.com/client/campaigns" \ -H "Content-Type: application/json" \ -d '{ "name": null }'{ "success": true, "data": { "campaignId": 9700, "status": "DRAFT", "note": "Draft created…" }}Campaign promo codes GET
The promo codes printed on this campaign. Each row's `code` is what you send as `coupon` when you [record a conversion](/docs/api-reference/tracking/createtrackingevent) — that is how a sale gets attributed back to the flyer that caused it. Page through with `first` (up to 500) and `skip`.
Set cities (street channels) POST
Chooses the cities for a hand-to-hand or door-to-door campaign, with an optional volume per city. Available cities are at [GET /client/cities](/docs/api-reference/assets/listcities). **For EDDM, use [Set EDDM routes](/docs/api-reference/campaign-builder/setcampaignareas) instead** — EDDM targets USPS carrier routes, not cities. Needs an OAuth access token carrying the `campaigns:create` scope — a plain client key is refused. The campaign must be one of yours; anything else returns 404.