Coming next
TikTok Ads API for AI agents
The TikTok Ads API in Spaces is coming next and is not available yet. When it opens, the same ads routes and MCP tools that run Meta today will build paused TikTok campaigns, read spend and results and pause ads, with a confirmation before anything spends.
Spaces runs every ad network through one set of tools. You can build against Meta today, and when TikTok opens the same calls will work on a TikTok ad account. Every response carries network and currency, and where TikTok cannot do something, the API says so plainly rather than guessing.
This page sets out what will be different on TikTok, so that code you write now needs as little change as possible later.
What a request will look like
# 1. Upload the video from a public https link.
POST https://api.spacesos.com/v1/ads/accounts/{ad_account_id}/videos
Authorization: Bearer spc_live_…
Idempotency-Key: spring-video-1
{ "file_name": "spring.mp4", "url": "https://example.com/spring.mp4" }
→ { "video_id": "…" }
# 2. Find the TikTok identity to post as.
GET https://api.spacesos.com/v1/ads/accounts/{ad_account_id}/pages
Authorization: Bearer spc_live_…
# 3. Create the ad with that identity and the video. It starts paused.
POST https://api.spacesos.com/v1/ads/accounts/{ad_account_id}/ads
Authorization: Bearer spc_live_…
Idempotency-Key: spring-ad-1
{ "ad_set_id": "…", "name": "Spring video", "page_id": "…",
"video_id": "…", "message": "…", "link": "https://example.com" }Coming next, and shortened: how a TikTok ad will be built from a video. Fields not shown work as they do on Meta. Amounts are in the ad account's currency.
What will be different from Meta
- Ads on TikTok itself need a video, or a full-screen image. Upload the video with upload_ad_video from a public https link, and pass the video_id to create_ad.
- upload_ad_image takes a public https url on TikTok, not content_base64.
- Ads post as one of your TikTok identities, which list_ad_pages returns.
- TikTok has no spend cap on a single campaign, so there is no campaign spend_cap. The owner’s daily budget cap and monthly spend cap are the limits that apply.
- TikTok targets whole cities rather than a radius around one.
- pause_ad_object needs level (campaign, ad_set or ad) for objects Spaces did not create.
What will stay the same
Everything is created paused. Turning something on, or raising the budget of something running, answers confirmation_required and changes nothing until confirm_ad_change. A key can lower a cap but never raise one, and with no caps set nothing can be turned on. Conversions are hashed before they leave Spaces, and ad routines work the same way.
Building for it now
Read network from each response rather than assuming Meta, keep money in major units, and handle a refusal that says a network cannot do something. Do not depend on spend_cap for safety: rely on the owner’s caps, which apply on every network.
How a change that spends gets approved
- Call the tool as normal, for example launch_ad_campaign or a budget increase on update_ad_set.
- Spaces changes nothing and answers with status confirmation_required, a plain summary of the change against the caps, and preview links for each ad.
- Show the summary and previews to the person. If the ad account is set so a person approves, send them approve_url instead.
- After a clear yes, call confirm_ad_change with the confirmation id. It needs the ads:spend scope, and Spaces checks the caps again before it acts.
- If the person says no, call cancel_ad_change. list_ad_confirmations shows what is waiting and what was decided.
The caps sit above all of this. The owner sets a daily budget cap, which limits the total daily budget set to run, and a monthly spend cap, at which Spaces pauses the campaigns it runs. update_ad_limits can lower either one. Nothing can raise them except the owner, in the dashboard.
The tools, as they will work on TikTok Ads
Tools marked “asks first” can spend money, so they answer with a confirmation before they change anything. One-line summaries of every tool are on the ads API page.
Launch
| MCP tool | TikTok Ads | REST |
|---|---|---|
list_ad_pages | Your TikTok identities | GET /v1/ads/accounts/{ad_account_id}/pages |
list_ad_pixels | GET /v1/ads/accounts/{ad_account_id}/pixels | |
create_ad_campaign | POST /v1/ads/accounts/{ad_account_id}/campaigns | |
create_ad_set | POST /v1/ads/accounts/{ad_account_id}/ad-sets | |
create_ad | POST /v1/ads/accounts/{ad_account_id}/ads | |
upload_ad_image | Public https url | POST /v1/ads/accounts/{ad_account_id}/images |
upload_ad_video | Needed for ads on TikTok | POST /v1/ads/accounts/{ad_account_id}/videos |
get_ad_preview | GET /v1/ads/accounts/{ad_account_id}/ads/{ad_id}/preview | |
launch_ad_campaign | Asks first | POST /v1/ads/accounts/{ad_account_id}/campaigns/{campaign_id}/launch |
search_ad_targeting | GET /v1/ads/accounts/{ad_account_id}/targeting-search | |
estimate_ad_reach | POST /v1/ads/accounts/{ad_account_id}/reach-estimate |
Moderate
| MCP tool | TikTok Ads | REST |
|---|---|---|
update_ad_limits | PATCH /v1/ads/accounts/{ad_account_id}/limits | |
update_ad_campaign | Asks first. No campaign spend cap | PATCH /v1/ads/accounts/{ad_account_id}/campaigns/{campaign_id} |
update_ad_set | Asks first | PATCH /v1/ads/accounts/{ad_account_id}/ad-sets/{ad_set_id} |
pause_ad_object | level needed if Spaces did not create it | POST /v1/ads/accounts/{ad_account_id}/objects/{object_id}/pause |
resume_ad_object | Asks first | POST /v1/ads/accounts/{ad_account_id}/objects/{object_id}/resume |
create_ad_routine | Asks first | POST /v1/ads/accounts/{ad_account_id}/routines |
list_ad_routines | GET /v1/ads/routines | |
update_ad_routine | PATCH /v1/ads/routines/{routine_id} | |
delete_ad_routine | DELETE /v1/ads/routines/{routine_id} | |
list_ad_confirmations | GET /v1/ads/confirmations | |
get_ad_confirmation | GET /v1/ads/confirmations/{confirmation_id} | |
confirm_ad_change | POST /v1/ads/confirmations/{confirmation_id}/confirm | |
cancel_ad_change | POST /v1/ads/confirmations/{confirmation_id}/cancel |
Report
| MCP tool | TikTok Ads | REST |
|---|---|---|
list_ad_campaigns | GET /v1/ads/accounts/{ad_account_id}/campaigns | |
list_ad_sets | GET /v1/ads/accounts/{ad_account_id}/ad-sets | |
list_ads | GET /v1/ads/accounts/{ad_account_id}/ads | |
get_ad_review | GET /v1/ads/accounts/{ad_account_id}/ads/{ad_id}/review | |
get_ad_insights | GET /v1/ads/accounts/{ad_account_id}/insights | |
send_ad_conversions | POST /v1/ads/accounts/{ad_account_id}/conversions |
Connect and caps
| MCP tool | TikTok Ads | REST |
|---|---|---|
list_ad_networks | GET /v1/ads/networks | |
create_ads_connect_link | POST /v1/ads/connect-link | |
list_ad_accounts | GET /v1/ads/accounts | |
get_ad_account | GET /v1/ads/accounts/{ad_account_id} | |
update_ad_account | PATCH /v1/ads/accounts/{ad_account_id} | |
disconnect_ad_account | DELETE /v1/ads/accounts/{ad_account_id} |
FAQ
Can I call the TikTok Ads API today?
Not yet. TikTok Ads is coming next, and a TikTok ad account cannot be connected until it opens. Meta is in early access now on the same routes.
Will I need new endpoints for TikTok?
No. TikTok will use the same routes under /v1/ads and the same MCP tools. The ad account decides the network.
Why is there no campaign spend cap on TikTok?
TikTok does not offer a spend cap on a single campaign. The daily budget cap and monthly spend cap the owner sets in Spaces still apply.
Can I upload a video from my own server?
Yes, from a public https link. upload_ad_video fetches it and returns the video_id that create_ad takes.
Will conversions work on TikTok?
Yes, send_ad_conversions will send sales and leads back to TikTok, with personal details hashed before they leave Spaces.
How will I know when TikTok opens?
list_ad_networks will show it as live. You can also write to hello@spacesos.com to be told.
Useful next: TikTok Ads for owners, TikTok Ads from your AI agent, Meta Ads API, open now, Every ads tool, Spaces docs.