targeting.locations.include, an array of country objects. There is no separate targeting resource — targeting lives on the campaign body.
Targeting is country-level only. Region, state, and DMA (metro) targeting are not supported. This is a deliberate difference from OpenAI Ads — locations are resolved to a country and any sub-country detail is ignored.
Authentication
All requests use your organization’s API key.Bearer token:
Authorization: Bearer ak_.... One active key per organization — create it in the Thrad Platform dashboard under Settings → API keys. Examples below read it from the THRAD_ADS_API_KEY environment variable.The targeting object
Geographic targeting for the campaign.
Setting targeting on create
Passtargeting inside the campaign create body. Country codes are uppercased and normalized before the campaign is stored.
budget.lifetime_spend_limit_micros is in integer micros ($1 = 1,000,000); 50000000 is $50.00. max_bid_micros is likewise micros (2000000 = $2.00).
Read-back shape
On read, each targeted country is expanded to an object withid, type, and country_code — type is always "country", and id mirrors the uppercased country code. The campaign you created above reads back like this:
The lowercase
"de" you sent reads back as "DE". Timestamps (start_time, end_time, created_at, updated_at) are Unix seconds. A freshly created campaign submits to review, so it reads back as status: "paused" with review_status: "in_review".You omitted start_time on create, so it defaulted to roughly two days out (the earliest allowed launch window) — that is why start_time reads back as a non-null Unix timestamp rather than null. end_time was also omitted and stays null (open-ended, delivering until the budget is exhausted).Updating targeting
Send a newtargeting object to POST /v1/campaigns/{id} to replace the campaign’s countries. The same normalization and validation apply on update as on create.
cURL
Errors
Errors use the bare error shape:| HTTP | code | When |
|---|---|---|
400 | invalid_value | A location entry has neither country_code nor id. param is targeting.locations.include. |
400 | use_status_action | status was sent in a campaign update body. Use /activate, /pause, or /archive. |
401 | auth_required | No Authorization header was sent. |
401 | invalid_api_key | The Authorization: Bearer ak_... key is malformed, unknown, or revoked. |
404 | not_found | The campaign {id} does not exist for your organization. |
