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.

Quickstart — Waveband Docs