Authorization: Bearer ck_....
List campaigns
GET /v1/campaigns
Scope: campaigns:list
Query parameters
Response 200
data is a CampaignShort. The in_review field mirrors filters.deny_always.
Example
Create campaign
POST /v1/campaigns
Scope: campaigns:create
Request body
CampaignBody. See Campaign create for defaults and minimal example.Response 201
CampaignFull
Get campaign
GET /v1/campaigns/:id
Scope: campaigns:show
Path parameters
Response 200
CampaignFull — includes is_test_mode (true if caller IP is in filters.whitelist).
Update campaign
PUT /v1/campaigns/:id
Scope: campaigns:update
Full replace — same schema as create. Not a partial PATCH.
Request body
CampaignBodyResponse 200
CampaignFull
Delete campaign
DELETE /v1/campaigns/:id
Scope: campaigns:delete
Soft-deletes the campaign.
Response 204
HTTP status is 204. The handler may attach a JSON body { "message": "..." } (Express quirk). Treat success as status 204.
Clone campaign
POST /v1/campaigns/:id/clone
Scope: campaigns:clone
No request body.
Response 200
CampaignFull
Toggle status
PUT /v1/campaigns/:id/toggle-status
Scope: campaigns:toggle
Toggles the campaign active flag. No request body.
Response 200
Empty body. Re-fetch with GET show if you need the updated active value.