Money in resource bodies (budgets, bids) is sent and returned as integer micros (
$1 = 1,000,000). Money in insights responses is different — spend, cpc, and cpm are dollar floats and ctr is a fraction. Each step below states the unit it uses.Create your API key
In the Thrad Platform dashboard, go to Settings → API keys and create a key. Your organization has one active key; the secret (
ak_...) is shown once at creation — copy it immediately.Export it so the cURL examples below can reuse it:Confirm access
Fetch your organization’s default ad account. A If the key is missing or invalid, you get a bare
200 confirms the key works and shows the account your campaigns will live under.200 OK
401:401 Unauthorized
Upload a creative image
Upload the image you want to use in your ad. The response returns a
file_id you’ll reference when creating the campaign.201 Created
Billing must be set up before the next step. Your campaign launch charges a deposit on the organization’s default card — add one in the Platform dashboard first, or the create call returns
400 billing_not_configured (with no charge).Create and launch a campaign
Create the whole campaign tree — campaign, one ad group, one card ad — in a single nested call. Use the The campaign is now submitted to review: it reads back as
file_id from Step 3 on the ad’s creative.This call:- requires a default card on the org (else
400 billing_not_configured, no charge), - atomically creates the campaign, ad group, and ad,
- charges a $10 deposit off-session on the default card,
- submits the campaign to review.
$1 = 1,000,000). The example below sets a $25.00 lifetime budget (25000000) and a $2.00 max bid (2000000). The minimum budget is 990000 ($0.99); max_bid_micros accepts 1–100000000 ($0.000001–$100).Pass an Idempotency-Key header so a retried request never charges twice.201 Created
status: "paused" with review_status: "in_review". The $10 deposit has been charged. There is no draft state — if the card is declined, the call returns 402 card_declined and the campaign is removed.The request omitted start_time, so it defaults to ~2 days in the future (the earliest allowed launch window) — the response shows that non-null Unix timestamp. Omitting end_time leaves it null (open-ended, spend until budget).Manage delivery once approved
Thrad reviews the campaign. Once it’s approved (Resume a paused campaign:
review_status becomes approved), you control delivery with the status actions. Sending status in an update body is rejected (400 use_status_action) — always use these endpoints.Pause a running campaign:200 OK
/activate only resumes a paused, approved campaign — it never launches one. Calling it on a campaign still in review returns 400 campaign_not_approved. Calling /pause on a campaign that isn’t running returns 400 campaign_not_running. /archive ends a running or paused campaign.Next steps
Authentication
Bearer keys, one active key per org, rotation, and error shapes.
Campaigns
Full nested-create schema, updates, and status actions.
Insights
Granularity, aggregation levels, fields, filters, segments, and supply splits.
Rate limits
| Limit | Scope |
|---|---|
1000 requests / hour | Per API key, across all /v1/ endpoints |
60 requests / hour | Additional limit on the charging POST /v1/campaigns |
