API reference
Base URL: your Waveband host. Authenticate every request with Authorization: Bearer wbk_.... Machine-readable spec: OpenAPI 3.1. Rate limit: 240 requests/minute per key (HTTP 429 beyond that). Errors are JSON with a stable code and human-readable message — see the error reference.
Keys are created in Console → Developers with exactly the scopes they need, optionally pinned to a single workspace. The key is shown once at creation.

Scopes
Every operation below names its required scope. The full scope list (append-only — removing a scope would be a breaking change):
workspaces:readworkspaces:writecampaigns:readcampaigns:writeline_items:readline_items:writetargeting:readtargeting:writecreatives:readcreatives:writeevents:readevents:writesegments:readsegments:writeaudiences:readaudiences:writereports:readreports:writemetrics:readdatasets:readdatasets:exportbilling:readbilling:writewebhooks:readwebhooks:writeapi_keys:readapi_keys:writeautomations:readautomations:writebranding:readbranding:writedomains:readdomains:writeai:invokediagnostics:readdiagnostics:runadmin:readadmin:writecatalog:readcatalog:writeapprovals:readapprovals:write
Operations
/api/v1/workspacesList workspaces
Required scope: workspaces:read
/api/v1/workspacesCreate a workspace
Required scope: workspaces:write · supports Idempotency-Key
/api/v1/campaignsList campaigns in a workspace
Required scope: campaigns:read
/api/v1/campaignsCreate a campaign
Required scope: campaigns:write · supports Idempotency-Key
/api/v1/campaigns/{id}Get a campaign
Required scope: campaigns:read
/api/v1/campaigns/{id}Update a campaign
Also used for pause/resume via the status field.
Required scope: campaigns:write
/api/v1/line-itemsList line items in a campaign
Required scope: line_items:read
/api/v1/line-itemsCreate a line item
Required scope: line_items:write · supports Idempotency-Key
/api/v1/line-items/{id}Get a line item
Required scope: line_items:read
/api/v1/line-items/{id}Update a line item
Budget, bid, pacing, targeting, and status (pause/resume/activate) changes.
Required scope: line_items:write
/api/v1/line-items/{id}/creativesAttach a creative to a line item
Required scope: line_items:write
/api/v1/creativesList creatives in a workspace
Required scope: creatives:read
/api/v1/creativesCreate a creative
Assets are URL-based (upload to your storage or ours first). Video/audio transcode asynchronously.
Required scope: creatives:write · supports Idempotency-Key
/api/v1/creatives/{id}Get a creative
Required scope: creatives:read
/api/v1/conversion-eventsList conversion events
Required scope: events:read
/api/v1/conversion-eventsCreate a conversion event
Required scope: events:write · supports Idempotency-Key
/api/v1/audiencesList audience segments in a workspace
Required scope: audiences:read
/api/v1/audiencesCreate an audience segment
Pixel-based rules (site_visitors, converters, event_rule), uploaded lists (crm_list, ip_list), or a marketplace activation.
Required scope: audiences:write · supports Idempotency-Key
/api/v1/audiences/{id}Get an audience segment
Required scope: audiences:read
/api/v1/audiences/{id}Archive an audience segment
Required scope: audiences:write
/api/v1/audiences/{id}/membersUpload members to a list segment
crm_list: emails/phones (hashed at ingest; raw values are never stored) or pre-hashed sha256 lines. ip_list: IP addresses.
Required scope: audiences:write
/api/v1/audiences/{id}/attachAttach or detach a segment on a line item
One-click retargeting: merges the segment into the line item's audience targeting.
Required scope: audiences:write
/api/v1/marketplace-segmentsSearch the third-party segment marketplace
Required scope: audiences:read
/api/v1/reportsQuery metrics
Aggregated delivery/performance rows; format=csv streams a CSV export.
Required scope: reports:read
/api/v1/eventsList domain events
The event stream that webhooks deliver; useful for backfill and debugging.
Required scope: webhooks:read
/api/v1/webhooksList webhook endpoints
Required scope: webhooks:read
/api/v1/webhooksCreate a webhook endpoint
The signing secret is returned once. Verify deliveries via X-Waveband-Signature: sha256=HMAC(secret, body).
Required scope: webhooks:write · supports Idempotency-Key
/api/v1/webhooks/{id}Delete a webhook endpoint
Required scope: webhooks:write
/api/v1/webhook-deliveriesList webhook deliveries
Required scope: webhooks:read
/api/v1/webhook-deliveries/{id}/replayReplay a webhook delivery
Required scope: webhooks:write
/api/v1/rate-cardsList rate cards
Required scope: catalog:read
/api/v1/rate-cardsCreate a rate card
The first active card becomes the tenant default; isDefault switches it.
Required scope: catalog:write · supports Idempotency-Key
/api/v1/packagesList productized packages
Required scope: catalog:read
/api/v1/packagesCreate a package
Required scope: catalog:write · supports Idempotency-Key
/api/v1/packages/{id}/instantiateInstantiate a package into a draft campaign
Creates a draft campaign + line item priced from the package or default rate card.
Required scope: catalog:read
/api/v1/dealsList curated deals
Required scope: catalog:read
/api/v1/dealsAdd a deal to the library
Registers an SSP-issued deal ID; provisioning to delivery is asynchronous.
Required scope: catalog:write · supports Idempotency-Key
/api/v1/proposalsList proposals in a workspace
Required scope: campaigns:read
/api/v1/proposalsCreate a proposal
Line items priced in USD minor units; share at /p/{token} once sent.
Required scope: campaigns:write · supports Idempotency-Key
/api/v1/proposals/{id}/sendMark a proposal sent
Activates the public microsite for viewing and click-to-sign.
Required scope: campaigns:write
/api/v1/api-keysList API keys
Required scope: api_keys:read
/api/v1/api-keysCreate an API key
Scopes cannot exceed the calling key's scopes. The key is returned once.
Required scope: api_keys:write · supports Idempotency-Key
/api/v1/api-keys/{id}Revoke an API key
Required scope: api_keys:write