Ads
Ad campaigns on Meta, Google, LinkedIn, TikTok, Pinterest, X and Reddit through an ads connection (platform meta-ads, google-ads…): list them with spend and results, pause, resume, change budgets, boost published posts, create campaigns and send conversions. Budgets are whole currency units, never cents.
List ad accounts
Section titled “List ad accounts”/v1/accounts/{id}/ads/ad-accountsThe ad accounts an ads connection reaches. Their id is the adAccountId of every other ads call.
Parameters
idstringrequired
Response 200
data []
idstringrequiredSend it as adAccountId (Meta act_…, Google customer id…).
namestringrequiredcurrencystringBudgets and bids are whole units of it.
timezonestringusablebooleanrequiredFalse when the network will not run ads on it (disabled, no payment method…).
curl "https://api.marsial.dev/v1/accounts/acc_3k9x2m/ads/ad-accounts" \ -H "Authorization: Bearer $MARSIAL_API_KEY"const res = await fetch('https://api.marsial.dev/v1/accounts/acc_3k9x2m/ads/ad-accounts', { headers: { Authorization: `Bearer ${process.env.MARSIAL_API_KEY}`, },});const { data } = await res.json();import os, requests
res = requests.get( "https://api.marsial.dev/v1/accounts/acc_3k9x2m/ads/ad-accounts", headers={"Authorization": f"Bearer {os.environ['MARSIAL_API_KEY']}"},)data = res.json()["data"]List campaigns with their results
Section titled “List campaigns with their results”/v1/accounts/{id}/ads/campaignsCampaigns created in Marsial and in the network's ads manager, with spend, impressions and clicks for the period.
Parameters
idstringrequiredadAccountIdstringOnly this ad account (GET …/ads/ad-accounts).
fromstringFirst day of the metrics (YYYY-MM-DD). 90 days ago by default.
tostringLast day of the metrics (YYYY-MM-DD). Today by default.
Response 200
data []
idstringrequiredThe network's campaign id.
accountIdstringrequiredThe ads connection.
networkstringrequiredfacebook, instagram, google, linkedin, tiktok, pinterest, twitter or reddit.
namestringrequiredstatusstringrequiredreviewStatusstringadAccountIdstringrequiredadAccountNamestringcurrencystringbudgetobjectbudget
amountnumberrequiredtypestringrequired
adCountintegerrequiredmetricsobjectrequiredmetrics
spendnumberrequiredimpressionsnumberrequiredclicksnumberrequiredreachnumberconversionsnumberctrnumbercpcnumbercpmnumber
curl "https://api.marsial.dev/v1/accounts/acc_3k9x2m/ads/campaigns?from=2026-10-01&to=2026-10-31" \ -H "Authorization: Bearer $MARSIAL_API_KEY"const res = await fetch('https://api.marsial.dev/v1/accounts/acc_3k9x2m/ads/campaigns?from=2026-10-01&to=2026-10-31', { headers: { Authorization: `Bearer ${process.env.MARSIAL_API_KEY}`, },});const { data } = await res.json();import os, requests
res = requests.get( "https://api.marsial.dev/v1/accounts/acc_3k9x2m/ads/campaigns?from=2026-10-01&to=2026-10-31", headers={"Authorization": f"Bearer {os.environ['MARSIAL_API_KEY']}"},)data = res.json()["data"]Create a campaign
Section titled “Create a campaign”/v1/accounts/{id}/ads/campaignsCampaign, ad group and ad in one call, in the network's own terms (adAccountId, goal, budgetAmount, budgetType, the creative, targeting…): see the ads guide. Marsial fills the connection in.
Parameters
idstringrequired
Body
Response 201
data
campaignIdstring | nullrequired
curl -X POST "https://api.marsial.dev/v1/accounts/acc_3k9x2m/ads/campaigns" \ -H "Authorization: Bearer $MARSIAL_API_KEY"const res = await fetch('https://api.marsial.dev/v1/accounts/acc_3k9x2m/ads/campaigns', { method: 'POST', headers: { Authorization: `Bearer ${process.env.MARSIAL_API_KEY}`, },});const { data } = await res.json();import os, requests
res = requests.post( "https://api.marsial.dev/v1/accounts/acc_3k9x2m/ads/campaigns", headers={"Authorization": f"Bearer {os.environ['MARSIAL_API_KEY']}"},)data = res.json()["data"]Pause, resume or change the budget
Section titled “Pause, resume or change the budget”/v1/accounts/{id}/ads/campaigns/{campaignId}Pausing always applies at once. Resuming and budgets answer 202 when the workspace requires approval for the caller.
Parameters
idstringrequiredcampaignIdstringrequired
Body
statusstringbudgetobjectbudget
amountnumberrequiredWhole units of the ad account currency: 50 is 50.00, never cents.
typestringrequired
Response 200
data
idstringrequiredThe network's campaign id.
accountIdstringrequiredThe ads connection.
networkstringrequiredfacebook, instagram, google, linkedin, tiktok, pinterest, twitter or reddit.
namestringrequiredstatusstringrequiredreviewStatusstringadAccountIdstringrequiredadAccountNamestringcurrencystringbudgetobjectbudget
amountnumberrequiredtypestringrequired
adCountintegerrequiredmetricsobjectrequiredmetrics
spendnumberrequiredimpressionsnumberrequiredclicksnumberrequiredreachnumberconversionsnumberctrnumbercpcnumbercpmnumber
curl -X PATCH "https://api.marsial.dev/v1/accounts/acc_3k9x2m/ads/campaigns/120210000000" \ -H "Authorization: Bearer $MARSIAL_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "status": "paused" }'const res = await fetch('https://api.marsial.dev/v1/accounts/acc_3k9x2m/ads/campaigns/120210000000', { method: 'PATCH', headers: { Authorization: `Bearer ${process.env.MARSIAL_API_KEY}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ "status": "paused" }),});const { data } = await res.json();import os, requests
res = requests.patch( "https://api.marsial.dev/v1/accounts/acc_3k9x2m/ads/campaigns/120210000000", headers={"Authorization": f"Bearer {os.environ['MARSIAL_API_KEY']}"}, json={ "status": "paused" },)data = res.json()["data"]Send conversions
Section titled “Send conversions”/v1/accounts/{id}/ads/conversionsServer-side events for the network: Meta Conversions API, Google offline conversions, LinkedIn and TikTok.
Parameters
idstringrequired
Body
Response 200
data
receivedintegerrequired
curl -X POST "https://api.marsial.dev/v1/accounts/acc_3k9x2m/ads/conversions" \ -H "Authorization: Bearer $MARSIAL_API_KEY"const res = await fetch('https://api.marsial.dev/v1/accounts/acc_3k9x2m/ads/conversions', { method: 'POST', headers: { Authorization: `Bearer ${process.env.MARSIAL_API_KEY}`, },});const { data } = await res.json();import os, requests
res = requests.post( "https://api.marsial.dev/v1/accounts/acc_3k9x2m/ads/conversions", headers={"Authorization": f"Bearer {os.environ['MARSIAL_API_KEY']}"},)data = res.json()["data"]Boost a published post
Section titled “Boost a published post”/v1/posts/{id}/boostTurns one published copy of the post (its accountId) into an ad paid by adAccountId. The network reviews it before it delivers.
Parameters
idstringrequired
Body
accountIdstringrequiredThe post's account whose published copy to promote.
adAccountIdstringrequiredThe ad account that pays (GET /v1/accounts/{id}/ads/ad-accounts on the ads connection).
namestringrequiredgoalstringrequiredWhat the network optimises for. Each network takes a subset.
budgetobjectrequiredbudget
amountnumberrequiredWhole units of the ad account currency: 50 is 50.00, never cents.
typestringrequired
startDatestring (date-time)endDatestring (date-time)Required with a lifetime budget.
targetingobjecttargeting
countriesstring[]ISO country codes.
ageMinintegerageMaxinteger
callToActionstringe.g. LEARN_MORE, SHOP_NOW; needs linkUrl.
linkUrlstring (uri)
Response 201
data
campaignIdstring | nullrequired
curl -X POST "https://api.marsial.dev/v1/posts/pst_7q1w0e/boost" \ -H "Authorization: Bearer $MARSIAL_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "accountId": "acc_3k9x2m", "adAccountId": "act_120210", "name": "Autumn", "goal": "traffic", "budget": { "amount": 40, "type": "daily" } }'const res = await fetch('https://api.marsial.dev/v1/posts/pst_7q1w0e/boost', { method: 'POST', headers: { Authorization: `Bearer ${process.env.MARSIAL_API_KEY}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ "accountId": "acc_3k9x2m", "adAccountId": "act_120210", "name": "Autumn", "goal": "traffic", "budget": { "amount": 40, "type": "daily" } }),});const { data } = await res.json();import os, requests
res = requests.post( "https://api.marsial.dev/v1/posts/pst_7q1w0e/boost", headers={"Authorization": f"Bearer {os.environ['MARSIAL_API_KEY']}"}, json={ "accountId": "acc_3k9x2m", "adAccountId": "act_120210", "name": "Autumn", "goal": "traffic", "budget": { "amount": 40, "type": "daily" } },)data = res.json()["data"]List ad changes waiting for approval
Section titled “List ad changes waiting for approval”/v1/ads/requestsWith requireAdsApproval on, members and AI agents (MCP) ask for ad changes that spend money instead of making them. Newest first, with what became of each.
Parameters
statusstringOnly changes in this state; all of them, newest first, otherwise.
Response 200
data []
idstringrequiredadr_…
changeobject | object | objectrequiredWhat reaches the network on approval.
change
kind"update_campaign"requiredaccountIdstringrequiredcampaignIdstringrequiredcampaignNamestringrequiredcurrencystringcurrentobjectrequiredThe campaign when the change was asked for.
current
statusstringrequiredbudgetobjectbudget
amountnumberrequiredtypestringrequired
statusstringbudgetobjectbudget
amountnumberrequiredtypestringrequired
statusstringrequiredfailed: approved, but the network refused it (seeerror).requestedBystringThe user who asked, or for whom an AI agent asked.
viastringrequiredrequestedAtstring (date-time)requireddecidedBystringdecidedAtstring (date-time)notestringcampaignIdstringThe campaign an approved boost or new campaign created.
errorstring
curl "https://api.marsial.dev/v1/ads/requests?status=pending" \ -H "Authorization: Bearer $MARSIAL_API_KEY"const res = await fetch('https://api.marsial.dev/v1/ads/requests?status=pending', { headers: { Authorization: `Bearer ${process.env.MARSIAL_API_KEY}`, },});const { data } = await res.json();import os, requests
res = requests.get( "https://api.marsial.dev/v1/ads/requests?status=pending", headers={"Authorization": f"Bearer {os.environ['MARSIAL_API_KEY']}"},)data = res.json()["data"]Get an ad change request
Section titled “Get an ad change request”/v1/ads/requests/{id}Parameters
idstringrequired
Response 200
data
idstringrequiredadr_…
changeobject | object | objectrequiredWhat reaches the network on approval.
change
kind"update_campaign"requiredaccountIdstringrequiredcampaignIdstringrequiredcampaignNamestringrequiredcurrencystringcurrentobjectrequiredThe campaign when the change was asked for.
current
statusstringrequiredbudgetobjectbudget
amountnumberrequiredtypestringrequired
statusstringbudgetobjectbudget
amountnumberrequiredtypestringrequired
statusstringrequiredfailed: approved, but the network refused it (seeerror).requestedBystringThe user who asked, or for whom an AI agent asked.
viastringrequiredrequestedAtstring (date-time)requireddecidedBystringdecidedAtstring (date-time)notestringcampaignIdstringThe campaign an approved boost or new campaign created.
errorstring
curl "https://api.marsial.dev/v1/ads/requests/adr_3m8p2q" \ -H "Authorization: Bearer $MARSIAL_API_KEY"const res = await fetch('https://api.marsial.dev/v1/ads/requests/adr_3m8p2q', { headers: { Authorization: `Bearer ${process.env.MARSIAL_API_KEY}`, },});const { data } = await res.json();import os, requests
res = requests.get( "https://api.marsial.dev/v1/ads/requests/adr_3m8p2q", headers={"Authorization": f"Bearer {os.environ['MARSIAL_API_KEY']}"},)data = res.json()["data"]Approve or reject an ad change
Section titled “Approve or reject an ad change”/v1/ads/requests/{id}/reviewOwners and admins (and API keys). Approving sends it to the network at once; if the network refuses, the request ends failed with the reason. AI agents cannot review.
Parameters
idstringrequired
Body
decisionstringrequiredapprovesends the change to the network now;rejectdrops it.notestringWhy, for whoever asked for it.
Response 200
data
idstringrequiredadr_…
changeobject | object | objectrequiredWhat reaches the network on approval.
change
kind"update_campaign"requiredaccountIdstringrequiredcampaignIdstringrequiredcampaignNamestringrequiredcurrencystringcurrentobjectrequiredThe campaign when the change was asked for.
current
statusstringrequiredbudgetobjectbudget
amountnumberrequiredtypestringrequired
statusstringbudgetobjectbudget
amountnumberrequiredtypestringrequired
statusstringrequiredfailed: approved, but the network refused it (seeerror).requestedBystringThe user who asked, or for whom an AI agent asked.
viastringrequiredrequestedAtstring (date-time)requireddecidedBystringdecidedAtstring (date-time)notestringcampaignIdstringThe campaign an approved boost or new campaign created.
errorstring
curl -X POST "https://api.marsial.dev/v1/ads/requests/adr_3m8p2q/review" \ -H "Authorization: Bearer $MARSIAL_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "decision": "approve" }'const res = await fetch('https://api.marsial.dev/v1/ads/requests/adr_3m8p2q/review', { method: 'POST', headers: { Authorization: `Bearer ${process.env.MARSIAL_API_KEY}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ "decision": "approve" }),});const { data } = await res.json();import os, requests
res = requests.post( "https://api.marsial.dev/v1/ads/requests/adr_3m8p2q/review", headers={"Authorization": f"Bearer {os.environ['MARSIAL_API_KEY']}"}, json={ "decision": "approve" },)data = res.json()["data"]© 2026 Marsial by TWOFACES ·marsial.dev ·Dashboard ·soporte@twofacesco.com