Quickstart
Everything in Waveband — campaigns, line items, creatives, targeting, conversion events, reports, webhooks — is available over a REST API with the same permissions model as the console. This page gets you from zero to a live campaign.
1. Create an API key
In the console, go to Settings → API keys and create a key with the scopes you need (for example campaigns:write, creatives:write, reports:read). The key is shown once — store it in a secret manager.
export WAVEBAND_API_KEY="wbk_..."
2. Find your workspace
curl -s https://waveband-staging.adwave.com/api/v1/workspaces \ -H "Authorization: Bearer $WAVEBAND_API_KEY"
3. Create a campaign
curl -s -X POST https://waveband-staging.adwave.com/api/v1/campaigns \
-H "Authorization: Bearer $WAVEBAND_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: my-first-campaign" \
-d '{
"workspaceId": "<workspace-id>",
"name": "Spring CTV Launch",
"channel": "ctv",
"startDate": "2026-08-01",
"budgetUsdMinor": 500000,
"goalType": "impressions"
}'Budgets are integer USD minor units (cents): 500000 = $5,000. All ids are Waveband UUIDs. POST endpoints accept an Idempotency-Key header so retries are safe.
4. Watch it go live
Trafficking changes sync to delivery asynchronously. Subscribe a webhook to sync.succeeded.v1 / sync.failed.v1 (see Webhooks & events) or poll GET /api/v1/events.
5. Pull results
curl -s "https://waveband-staging.adwave.com/api/v1/reports?workspaceId=<id>&from=2026-08-01&to=2026-08-07&groupBy=campaign" \ -H "Authorization: Bearer $WAVEBAND_API_KEY"
TypeScript SDK
import { WavebandClient } from "@waveband/sdk";
const waveband = new WavebandClient({
apiKey: process.env.WAVEBAND_API_KEY!,
baseUrl: "https://waveband-staging.adwave.com",
});
const campaigns = await waveband.campaigns.list({ workspaceId });The full REST surface is described by the OpenAPI 3.1 spec and browsable in the API reference.