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/accountsConnected ad accounts: platform, currency, status, last synced, sync error.
GET /api/v1/campaignsCampaigns with results for ?days=7|30|90 (default 30), and totals per platform. Filters ?platform=, ?account=, ?status=, ?family=.
GET /api/v1/campaigns/:idOne campaign: targeting, ad groups, ads, keywords, and daily results (?days=).
POST /api/v1/campaigns/:id/pausePause it on its platform.
POST /api/v1/campaigns/:id/resumeResume it; refused (409) if it would go over your daily budget limit.
GET /api/v1/draftsClone 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/:idThe 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/approveApprove (validation, account chosen, budget limit; staff approval where your account requires it).
POST /api/v1/drafts/:id/createCreate the campaign from an approved draft — always paused.
GET /api/v1/familiesFamilies with member campaign ids and the Off / Ask setting per kind of change.
GET /api/v1/proposalsProposed changes (?status=open by default, ?family=), each with a plain-English summary.
POST /api/v1/proposals/:id/approveApply one proposed change to its campaign now.
POST /api/v1/proposals/:id/rejectReject it; nothing is applied.
GET /api/v1/changesThe 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.