Every amount in this API — budgets, bids, and insights spend — is in integer micros (
$1 = 1,000,000). Insights additionally pair each *_micros value with a formatted *_display string. Every timestamp is an ISO 8601 string in UTC (2026-04-02T00:00:00Z), never a Unix integer.1
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:2
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
3
Pick a creative asset
Ads don’t carry images — they reference an asset, which supplies the image and the destination URL. List your account’s assets and copy the
id of the one you want.200 OK
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).4
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
asset_id from Step 3 on the ad.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 budget (25000000) with period: "lifetime" — a single cumulative cap — and a $2.00 max bid (2000000). The minimum budget is 990000 ($0.99); max_bid_micros accepts 100–100000000 ($0.0001–$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 ad group and ad created by this call read status: "paused" too, so nothing serves before approval. They flip back to active on their own once the campaign is approved — you don’t need to activate them.The request omitted start_time, so it defaults to ~2 days in the future (the earliest allowed launch window) — the response shows that computed timestamp. Omitting end_time leaves it null, so this lifetime budget simply spends until it is exhausted.5
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.6
Read performance
Fetch metrics for the campaign. Insights default to the trailing 30-day window and combine Thrad + ChatGPT (OpenAI Ads) supply.
200 OK
Ask for metrics by their output field name —
spend_micros, cpc_micros, cpm_micros, ctr_ratio — the same names you get back and the same ones you use in filters[] and sort[]. Each arrives with a formatted *_display companion for showing to people; parse the *_micros integer.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.
Product feeds
Sync your catalog over SFTP so products become ad assets that pause and resume with stock.
