Skip to main content
An ad is a single creative inside an ad group. Every ad belongs to exactly one ad group, and its creative type must match the ad group’s type — an ad group is either all cards or all polls, never a mix. Two creative types are supported:
  • card — an in-chat sponsored message (title, body, CTA, image).
  • poll — a Thrad-only sponsored poll (question + 2–4 options).
An ad is copy plus an asset. Every ad requires an asset_id pointing at an existing asset, and that asset supplies the ad’s image (card) and destination URL (card and poll). The creative body carries text only — there is no file_id, no image_url, and no target_url on input, and /v1 never creates or mutates assets.
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 | null
The UUID of the asset backing this ad — the source of its image and destination URL.
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
One of active or paused. Change it only through /activate, /pause, and /archive.
Thrad ads have no separate archived state. Calling /archive deactivates the ad, so it reads back as paused — the same result as /pause.
A newly created ad’s status depends on how it was created. An ad added with POST /v1/ads comes back active. An ad created inside the nested POST /v1/campaigns call comes back paused — the whole tree is deactivated while the campaign awaits review, so nothing can serve before approval. Those ads return to active automatically when the campaign is approved; you do not need to call /activate.
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.
status is not accepted here. Sending it returns 400 use_status_action — use /activate, /pause, or /archive.
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" } }.