card— an in-chat sponsored message (title, body, CTA, image).poll— a Thrad-only sponsored poll (question + 2–4 options).
All paths are relative to the base URL
https://api.thrad.ai/v1. Authenticate every request with Authorization: Bearer ak_.... See Authentication.The ad object
string
The ad’s unique identifier (UUID).
string
The UUID of the ad group this ad belongs to.
string
Human-readable ad name. When omitted on create, it defaults to the creative title (card headline or poll question), or
"Ad" if there is none.string
string
Read-only review state inherited from the parent campaign:
approved, in_review, or rejected. You cannot set this — it reflects where the campaign sits in Thrad’s approval flow.object
The ad creative. Shape depends on
type.List ads
GET /v1/ads
Lists the ads in a single ad group. ad_group_id is required — there is no all-ads listing.
string
required
The UUID of the ad group whose ads to list.
integer
default:"20"
Number of ads to return,
1–500.string
Cursor for the previous page — pass a prior response’s
first_id. Mutually exclusive with after.string
Cursor for the next page — pass a prior response’s
last_id. Mutually exclusive with before.string
default:"desc"
Sort order by creation time:
asc or desc.Create an ad
POST /v1/ads
Adds an ad to an existing ad group. The creative type must match the ad group’s type, or the request is rejected with 400 invalid_value on creative.type.
string
required
The UUID of the ad group to add this ad to.
string
required
The UUID of an existing asset — browse them with
GET /v1/assets. The asset supplies the card image and the destination URL. Omitting it returns 400 required; an asset from another ad account returns 400 invalid_value. For a poll, the asset must have a url.string
Ad name. Defaults to the creative title (card headline or poll question) when omitted.
boolean
default:"false"
Cards only. When
true, Thrad writes the card headline per impression at serve time. creative.title must then be omitted — sending one returns 400 invalid_value, because a title set here could never take effect. Setting auto_generate on a poll creative is rejected with poll_cannot_be_ai.object
required
The ad copy. Its
type must match the ad group.The older spellings
chat_card and product_ad_template are rejected. One concept, one word: card.Retrieve an ad
GET /v1/ads/{ad_id}
string
required
The UUID of the ad to retrieve.
Update an ad
POST /v1/ads/{ad_id}
Patches the ad’s name, creative, and/or asset_id. Only the fields you send are changed.
string
required
The UUID of the ad to update.
string
New ad name.
string
Re-point the ad at a different asset. The creative moves with it: a poll’s destination always re-derives from the new asset, and a card’s image re-derives when the image it was showing came from the asset being replaced (a custom image or logo fallback survives the swap).
object
A replacement creative. It must match the ad group’s type and follow the same field rules as on create (card
title ≤ 30; poll title ≤ 120 with 2–4 options). Copy only — swap the image or destination by re-pointing asset_id.Activate an ad
POST /v1/ads/{ad_id}/activate
Reactivates a paused ad. The parent campaign must be approved.
string
required
The UUID of the ad to activate.
Pause an ad
POST /v1/ads/{ad_id}/pause
Deactivates the ad.
string
required
The UUID of the ad to pause.
Archive an ad
POST /v1/ads/{ad_id}/archive
Thrad ads have no distinct archived state, so
/archive deactivates the ad and it reads back as paused — the same result as /pause.string
required
The UUID of the ad to archive.
Errors
Errors use the bare shape{ "error": { "message", "type", "param", "code" } }.
