Paid Ads API
Read every campaign from your connected Google Ads, ChatGPT ads (OpenAI) and Microsoft Advertising accounts with its results, clone campaigns into reviewed drafts, and decide proposed changes between cloned campaigns. Base URL: https://ads.financialrebrand.com
Authentication
Send Authorization: Bearer <personal access token> — create one at API tokens with orgs:read, ads:read (accounts, campaigns, drafts, families, proposals, change log) and, to change anything, ads:write. Every call acts on the organization currently selected for that person. Errors are { "error": { "code": "…", "message": "…" } }, with a message written for a person; a token without the scope an endpoint needs gets a 403 with the code insufficient_scope. Money is always in micros: 1,000,000 = one unit of the account's currency.
Endpoints
GET /api/v1/accounts | Connected ad accounts: platform, currency, status, last synced, sync error. |
GET /api/v1/campaigns | Campaigns with results for ?days=7|30|90 (default 30), and totals per platform. Filters ?platform=, ?account=, ?status=, ?family=. |
GET /api/v1/campaigns/:id | One campaign: targeting, ad groups, ads, keywords, and daily results (?days=). |
POST /api/v1/campaigns/:id/pause | Pause it on its platform. |
POST /api/v1/campaigns/:id/resume | Resume it; refused (409) if it would go over your daily budget limit. |
GET /api/v1/drafts | Clone drafts; ?status=draft|awaiting_approval|approved|created|failed|discarded. |
POST /api/v1/drafts | { "campaignIds": [...], "platform": "google"|"microsoft", "accountId"?, "recipeId"? } — one draft each. Creates nothing on a platform. |
GET /api/v1/drafts/:id | The draft, its problems, and approvalBlockers. |
PATCH /api/v1/drafts/:id | { "spec"?: { fields to change }, "accountId"?: "…" } — any edit sends it back to draft. |
POST /api/v1/drafts/:id/approve | Approve (validation, account chosen, budget limit; staff approval where your account requires it). |
POST /api/v1/drafts/:id/create | Create the campaign from an approved draft — always paused. |
GET /api/v1/families | Families with member campaign ids and the Off / Ask setting per kind of change. |
GET /api/v1/proposals | Proposed changes (?status=open by default, ?family=), each with a plain-English summary. |
POST /api/v1/proposals/:id/approve | Apply one proposed change to its campaign now. |
POST /api/v1/proposals/:id/reject | Reject it; nothing is applied. |
GET /api/v1/changes | The change log: who changed what, before and after; ?campaign=, ?limit=. |
Cloning
curl -X POST https://ads.financialrebrand.com/api/v1/drafts \
-H "Authorization: Bearer …" -H "Content-Type: application/json" \
-d '{"campaignIds":["…","…"],"platform":"google","accountId":"…"}'
201 {"drafts":[{"id":"…","status":"draft","issues":[…],"readyToApprove":false,"spec":{…}}],"skipped":0}Supported directions: ChatGPT ads → Google Ads, ChatGPT ads → Microsoft Advertising, Google Ads → Microsoft Advertising. A draft is the whole campaign — name, daily budget, bid strategy, networks (search partners and the audience network are off unless you turn them on), locations, schedule, devices, languages, tracking suffix, conversion goal, ad groups with responsive search ads (3–15 headlines of up to 30 characters, 2–4 descriptions of up to 90) and keywords with match types and negatives.
Nothing reaches an ad platform until a draft is approved and created, and every campaign is created paused. Approving checks the draft for problems, that an ad account is chosen, and your organization's maximum total daily budget across every platform. Where your account requires staff approval, approving moves the draft to awaiting_approval until staff approve it. Create works only on an approved draft.
Families and proposed changes
A clone stays linked to its source in a family. There is no automatic sync between members. For each kind of change — copy, keywords, status, budget — a family is set to off or ask. With ask, a change on one member becomes an open proposal for each other member; it takes effect only when someone approves it.
From Claude or ChatGPT
The MCP server wraps these as ads_accounts, ads_campaigns, ads_campaign, ads_pause_campaign, ads_resume_campaign, ads_drafts, ads_draft, ads_create_drafts, ads_update_draft, ads_approve_draft, ads_create_campaign, ads_families, ads_proposals, ads_approve_proposal, ads_reject_proposal and ads_changes. The tools that change a live ad account ask the assistant to confirm with you first.