Ads API.

Connect to every ad platform through Cherrie’s simple API or MCP.

Meta
Google Ads
TikTok
X
Snapchat
Pinterest
Reddit
LinkedIn
ChatGPT
Cherrie Pixel
The whole tree

Accounts, campaigns, ad groups, ads. Read and write, every platform.

One key, one schema, every channel

The same four resources on every platform. Everything the Cherrie dashboard does runs through these endpoints—no separate or legacy path off to the side.

  • GET

    Accounts

    /accounts

    Every connected ad account, with its currency and timezone. Its id is account_id on everything else.

  • GETPOSTPATCH

    Campaigns

    /campaigns

    Create one, or a campaign and its first ad group in one call. Patch name, status and budget by id. Duplicate with its children.

  • GETPOSTPATCH

    Ad groups

    /ad-groups

    Meta ad set, X line item, Google ad group — one noun everywhere. Budget, bids, pixel event, schedule and audience live here.

  • GETPOSTPATCH

    Ads

    /ads

    Creative from a template or inline, uploaded for you. Patch name, status and schedule. Removing one is status: delete.

curl https://cherrie.ai/api/v1/accounts \
-H "Authorization: Bearer cherrie_sk_…"

Response

{
  "data": {
    "meta": [
      {
        "id": "104829375610284",
        "name": "Acme",
        "currency": "USD",
        "timezone": "America/Los_Angeles"
      }
    ],
    "google": [ … ],
    "tiktok": [ … ]
  }
}

One shape in, one shape out

Send one request. We speak every platform.

Send one request with the same fields everywhere—campaigns, budgets, status, and spend in one format. We translate it for each platform, make the calls, and return the same structure back, keyed by channel.

request · one shape
POST /api/v1/campaigns
{
  "account_id": "104829375610284",
  "name": "Spring launch",
  "objective": "sales",
  "daily_budget": 50
}
  • Meta
  • Google Ads
  • TikTok
  • X
  • Snapchat
  • Pinterest
  • Reddit
  • LinkedIn
  • ChatGPT
response · same shape back
{
  "data": {
    "platform": "meta",
    "campaign_id": "120918273645019283",
    "name": "Spring launch",
    "status": "paused",
    "daily_budget": 50
  }
}

Analytics

Every number, one schema.

GET /analytics, GET /summary, or include=metrics on any list. Spend, impressions, clicks and results at account, campaign, ad group or ad level — total or by day — ranked by spend across channels.

GET/analytics?preset=last_7d&level=campaign&granularity=day
CampaignLast 7 daysSpendPurchases
Spring launch$1,840.2062
Brand search$920.5041
Creator ads$610.0019
New product launch$340.7511
Story drop$185.006

spend in major units · currency on the account · days in the account’s timezone · page.platform_errors when one vendor fails

From anywhere

Cherrie API and MCP. Use with any AI.

One key works everywhere. Call it over REST, hand it to Claude or Cursor as an MCP server, or generate a client from the OpenAPI document.

REST

Any language, one key.

A cherrie_sk_… bearer token identifies you and the brand. JSON in, JSON out, 300 requests a minute.

http
GET /api/v1/campaigns?include=metrics
Host: cherrie.ai
Authorization: Bearer cherrie_sk_…

MCP

Point an agent at it.

The same API is an MCP server. Every endpoint is a tool; writes are marked destructive so the client confirms before spending.

ClaudeChatGPTGeminiCursor
mcp.json
{ "mcpServers": { "cherrie": {
  "url": "https://cherrie.ai/api/v1/mcp",
  "headers": {
    "Authorization": "Bearer cherrie_sk_…"
  }
} } }

OpenAPI

Generate a client.

An OpenAPI 3.1 document describes every route, field and error — the same source the in-app docs and try panel are built from.

openapi 3.1
GET /api/v1/openapi.json

# feed it to your codegen, your
# gateway, or your agent's tool loader

Rules that hold on every platform.

The API is small on purpose. Learn these once; the difficulty stays inside the providers.

  • Money is major units. 12.34 means $12.34 on every request and response. Never cents, never micros. Currency lives on the account.
  • Status is ours. active, paused, deleted, archived, pending, unknown — on every platform alike. New campaigns start paused.
  • Patch by id. Send only the fields that change. Campaign and ad group patches don't need an account or platform.
  • Lists are keyed by platform. limit applies per platform, results rank by spend, and page.next_cursor pages each lane.
  • Partial failures are reported, not hidden. If one vendor errors, the rest still return and page.platform_errors says who didn't.
  • Impossible calls fail here. validation_error or unsupported_operation with a message you can act on — never a vendor stack trace.
  • Unknown query params are a 400. A typo is never silently dropped.
  • Days are calendar days. In the account's timezone — the same day Ads Manager shows.

Everything the dashboard can do.

Base URL /api/v1. Same endpoints the Cherrie app runs on.

    GET

    /accounts

    Connected ad accounts, with currency, timezone and lifetime spend.

    GETPOSTPATCH

    /campaigns

    Native campaigns; create with a first ad group; duplicate with children.

    GETPOSTPATCH

    /ad-groups

    Budgets, bids, pixel events, schedules and audiences.

    GETPOSTPATCH

    /ads

    Ads from templates or inline creative, with previews.

    GET

    /analytics

    Spend, impressions, clicks and results at any level, total or by day.

    GET

    /summary

    One read of a window with the math done — ads and store together.

    GETPOSTPATCH

    /ad-templates

    Reusable copy, URL and page for new ads.

    GETPOST

    /media

    Upload images and video once, use them on any platform.

    GET

    /audiences

    Named audiences to target or exclude.

    GET

    /pixels

    Pixels and their events — the ids an ad group optimizes for.

    GETPOSTPATCH

    /customers

    Your people, their tags, value and activity.

    GET

    /shopify

    The connected store's sales report, by store, product or type.