← Tracebird

Tracebird API & MCP

Last updated: 2026-10-23

Tracebird exposes your workspace to AI assistants through a hosted MCP server and to your own code through a REST API with an OpenAPI spec. Both are generated from the same operations and cover everything you can do in the app: ads, insights, dashboards and reports, automations, split tests, tracking and revenue, integrations, and workspace and team settings. Reads need the read scope; changes need write.

Quickstart

  1. Sign in and open Settings → API & MCP (workspace admins only).
  2. Click Create API key, choose Read only or Read & write, and copy the key. It is shown once.
  3. Call the API:
curl -H "Authorization: Bearer <your API key>" https://tracebird.io/api/v1/me

Connect AI assistants

Add https://tracebird.io/mcp to your assistant, sign in to Tracebird and click Allow. No API key is needed for clients that support OAuth.

  • Claude (web, desktop, mobile): Settings → Connectors → Add custom connector → paste the URL → Connect. Open Claude connectors.
  • ChatGPT: Settings → Apps & Connectors → Advanced settings → enable Developer mode → Create, paste https://tracebird.io/mcp?profile=compact and set Authentication to OAuth.
  • Cursor: Add to Cursor.
  • VS Code: Add to VS Code.

Claude Code, Codex and Grok Build plugin

The Tracebird plugin bundles the MCP server with skills for performance reviews, cutting wasted spend, automations, split tests, tracking setup, reports and workspace admin. One command installs it into every supported agent on your machine:

curl -fsSL https://tracebird.io/install.sh | sh

Or per agent. Signing in opens Tracebird in your browser; click Allow.

  • Claude Code: claude plugin install tracebird --marketplace brahimhamichan/tracebird-plugins, then /mcp → tracebird → Authenticate.
  • Codex: codex plugin marketplace add brahimhamichan/tracebird-plugins && codex plugin add tracebird@tracebird && codex mcp login tracebird
  • Grok Build: grok plugin install brahimhamichan/tracebird-plugins#plugins/tracebird --trust, then /mcps → tracebird → i.

Other clients and scripts (the Authorization header is only needed when the client cannot use OAuth):

{
  "mcpServers": {
    "tracebird": {
      "url": "https://tracebird.io/mcp",
      "headers": {
        "Authorization": "Bearer <your API key>"
      }
    }
  }
}

The MCP server offers one tool per API operation (226 today). Clients that load only part of a long tool list (Codex, ChatGPT) should use https://tracebird.io/mcp?profile=compact: a few everyday tools plus search_tools, call_read_tool and call_tool, which reach every operation with the same permissions and rate limits. Or load only some areas by adding ?toolsets= to the URL, for example https://tracebird.io/mcp?toolsets=ads,insights,automation. Toolsets: account, workspace, notifications, logs, billing, team, security, ads, insights, dashboard, views, embeds, reports, automation, split-tests, split-domains, conversions, customers, tracking, revenue-settings, integrations, google-sheets, supabase, bigquery.

Authentication

  • API keys: send Authorization: Bearer tb_live_…. Keys have read or read & write access, can expire, and can be revoked at any time.
  • OAuth 2.1 with PKCE: MCP clients register themselves, send you to a Tracebird consent page and receive a scoped token. You can revoke connected apps in Settings → API & MCP.
  • Scopes: read covers every GET operation; write also allows changes and implies read.
  • A key acts as the member who created it, in the workspace it was created for. It stops working if that member leaves the workspace.

Rate limits

  • 120 requests per minute per key or connected app (30 per minute for writes).
  • 600 per minute and 100,000 per day across the whole workspace.
  • Heavier aggregate reads count as more than one request.

Every response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset (seconds). Over the limit you get 429 with a Retry-After header.

Pagination and incremental sync

List endpoints take limit and cursor and return { "object": "list", "data": [...], "has_more": true, "next_cursor": "…" }. Pass next_cursor back as cursor until has_more is false. To keep another system in sync, store the time you started the last sync and pass it as updated_since next time.

since=$(cat last_sync.txt 2>/dev/null || echo 1970-01-01T00:00:00Z)
started=$(date -u +%FT%TZ)
cursor=""
while :; do
  page=$(curl -s -H "Authorization: Bearer $TRACEBIRD_KEY" \
    "https://tracebird.io/api/v1/campaigns?limit=100&updated_since=$since${cursor:+&cursor=$cursor}")
  echo "$page" | jq -c '.data[]' >> campaigns.ndjson
  [ "$(echo "$page" | jq .has_more)" = "true" ] || break
  cursor=$(echo "$page" | jq -r .next_cursor)
done
echo "$started" > last_sync.txt

Errors

Errors use one shape: { "error": { "code": "…", "message": "…", "details": {} } }.

  • invalid_request: 400 · The request is malformed or a parameter is invalid; details names the field.
  • unauthorized: 401 · The key or token is missing, invalid, expired or revoked.
  • forbidden: 403 · The key's owner is not allowed to do this (for example an admin-only operation).
  • insufficient_scope: 403 · The credential has read access but the operation needs write.
  • payment_required: 402 · The workspace has no active plan; only a few read operations still work.
  • not_found: 404 · The resource does not exist in this workspace.
  • method_not_allowed: 405 · The path exists but not for this HTTP method.
  • rate_limited: 429 · Too many requests; wait for Retry-After seconds.
  • payload_too_large: 413 · The request body is too large.
  • internal_error: 500 · Something went wrong on our side; retry later.

Webhooks

Outbound webhooks push events to your own HTTPS endpoint as they happen. Create one in Settings → Integrations → Webhooks, with POST /webhooks or the create_webhook MCP tool, and pick its events (default: all, including event types added later). The signing secret (whsec_…) is shown once, when the webhook is created. Up to 25 active webhooks per workspace.

Event types

  • automation_run.completed: An automation rule finished a run (scheduled, manual or API), with every per-asset action it took or recommended.
  • automation_run.failed: An automation rule run failed, or its write-back to the ad platform failed. Same payload as automation_run.completed.
  • automation_rule.created: An automation rule was created (in the app, through the API/MCP, or by duplicating one).
  • automation_rule.updated: An automation rule's configuration was saved.
  • automation_rule.deleted: An automation rule was deleted.
  • automation_rule.status_changed: An automation rule was turned ON or OFF.
  • split_test.winner_declared: A split test was completed with a winning variant, by hand or by its auto-stop rule.
  • conversion.created: A new live conversion (lead, sale, appointment…) was recorded. History imports and backfills are not sent.
  • webhook.test: sent only by the Send test button or POST /webhooks/{id}/test, whatever the webhook subscribes to.

Full JSON schemas for every payload are in the webhooks section of openapi.json.

Request

Each event is a POST with Content-Type: application/json, this body, and these headers:

  • Tracebird-Event: the event type, e.g. automation_run.completed.
  • Tracebird-Delivery: unique delivery id (whd_…), the same on every retry. Store it (or the body's event id) to ignore duplicates.
  • Tracebird-Signature: t=<unix seconds>,v1=<hex>, where v1 is the HMAC-SHA256 of <t>.<raw body> keyed with the signing secret. t is the time of this attempt, so a retry carries a new signature.
{
  "id": "evt_…",              // event id: identical for every webhook that gets this event, and across retries
  "type": "automation_run.completed",
  "created_at": "2026-10-23T14:05:12.481Z",
  "workspace_id": "…",
  "data": { … }               // the event's object (see below and openapi.json)
}

Example: automation_run.completed

automation_run.completed and automation_run.failed share one payload: the run id (the same id list_automation_runs returns), the rule, the trigger (schedule, manual or api), start and finish times, and every per-asset action. Each action has the asset type and id, the action (status, budget or name), before and after values, the reason, and an outcome: applied (written to the ad platform), recommended (dry run or preview: not written), skipped (guardrail, cap or missing data) or error. The event is sent after the run's write-back finishes, so outcomes are final.

{
  "id": "evt_3f0c9a8e5b0d4c7a9e2f1b6d8c4a7e10",
  "type": "automation_run.completed",
  "created_at": "2026-10-23T14:05:12.481Z",
  "workspace_id": "ws_8d2f6c1a",
  "data": {
    "id": "4b1f0e3c-7a2d-4f5e-9c8b-1d2e3f4a5b6c",
    "rule_id": "9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b",
    "rule_name": "Pause ads with CPA over $80",
    "trigger": "schedule",
    "status": "succeeded",
    "dry_run": false,
    "started_at": "2026-10-23T14:05:03.112Z",
    "finished_at": "2026-10-23T14:05:12.470Z",
    "duration_ms": 9358,
    "message": "Pause ads with CPA over $80: matched 2 of 41 processed ad assets; recommended 2 changes. Meta write-back applied 2 changes to the ad account.",
    "asset_type": "ad",
    "processed_count": 41,
    "matched_count": 2,
    "changed_count": 2,
    "write_back": {
      "status": "applied",
      "applied": 2,
      "failed": 0
    },
    "actions": [
      {
        "asset_type": "ad",
        "asset_id": "120211234567890123",
        "asset_name": "UGC hook v3",
        "action": "status",
        "outcome": "applied",
        "before": "ACTIVE",
        "after": "PAUSED",
        "currency": null,
        "reason": "Paused: CPA $112.40 > $80.",
        "dry_run": false
      },
      {
        "asset_type": "adset",
        "asset_id": "120219876543210987",
        "asset_name": "Broad US 25-54",
        "action": "budget",
        "outcome": "applied",
        "before": 150,
        "after": 120,
        "currency": "USD",
        "reason": "Budget decreased by 20%.",
        "dry_run": false
      }
    ],
    "actions_truncated": false
  }
}

Verify the signature

Compute the HMAC over the raw request body (before any JSON parsing), compare in constant time, and reject timestamps more than 5 minutes old to block replays.

// Node.js / TypeScript
import { createHmac, timingSafeEqual } from "node:crypto";

export function verifyTracebird(rawBody: string, header: string | null, secret: string, toleranceSec = 300) {
  if (!header) return false;
  const parts = Object.fromEntries(header.split(",").map((p) => p.trim().split("=") as [string, string]));
  const t = Number(parts.t);
  if (!Number.isInteger(t) || Math.abs(Date.now() / 1000 - t) > toleranceSec) return false;
  const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest();
  const given = Buffer.from(parts.v1 ?? "", "hex");
  return given.length === expected.length && timingSafeEqual(given, expected);
}
# Python
import hmac, hashlib, time

def verify_tracebird(raw_body: bytes, header: str, secret: str, tolerance: int = 300) -> bool:
    parts = dict(p.strip().split("=", 1) for p in (header or "").split(",") if "=" in p)
    t = int(parts.get("t", "0"))
    if abs(time.time() - t) > tolerance:
        return False
    expected = hmac.new(secret.encode(), f"{t}.".encode() + raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, parts.get("v1", ""))

Retries, delivery log and auto-disable

  • Respond with any 2xx within 10 seconds. Redirects are not followed and count as failures.
  • Failures are retried with exponential backoff, 6 tries in total: after 5 minutes, 30 minutes, 2 hours, 6 hours and 15 hours (the last about 24 hours after the first). Events can arrive out of order; use created_at.
  • Every attempt is in the delivery log (Integrations → Webhooks, or GET /webhooks/{id}/deliveries), kept 30 days.
  • After 5 deliveries in a row fail every retry, the webhook is disabled and workspace admins get a notification. Fix the endpoint, send a test, then re-enable it (PATCH /webhooks/{id} with { "enabled": true }).

Endpoints

Generated from the same registry that powers the API and the MCP tools. The machine-readable version is at openapi.json.

Account

GET/api/v1/meread scope

Current workspace and credential

Returns the Tracebird workspace this credential belongs to (name, currency, timezone, plan), the acting user and the granted scopes. Call this first to confirm the connection works.

MCP tool: get_workspace

Workspace

GET/api/v1/workspaceread scope

Workspace profile and settings

Returns the workspace profile Settings → Workspace edits: name, website, logo, main currency, workspace timezone, revenue source preference and who owns it. Use get_workspace for the quick connection check including plan.

MCP tool: get_workspace_settings

PATCH/api/v1/workspacewrite scope

Update the workspace profile

Changes the workspace name, website, main currency, workspace timezone or revenue source preference (admins only; send only the fields to change). Currency and timezone change how every report and dashboard total is shown, so confirm with the user before calling.

ParameterTypeRequiredDescription
namestringnoWorkspace name (max 80 characters).
website_urlstringnoCompany website, like example.com. Omit to keep the current one; null removes it.
currencystringnoMain reporting currency as a three-letter ISO code, e.g. USD.
timezonestringnoIANA timezone of the workspace, e.g. America/New_York.
revenue_source_preferencestringnoWhich revenue source dashboards trust: auto or a specific one. One of: auto, stripe, crm, facebook.

MCP tool: update_workspace

GET/api/v1/workspacesread scope

Workspaces the user belongs to

Lists every workspace the credential's user is a member of, with their role. Informational only: a credential always acts on the one workspace it was issued for.

MCP tool: list_workspaces

GET/api/v1/me/settingsread scope

The user's settings

Returns the acting user's Settings → General preferences in this workspace: reporting timezone (the clock behind every day boundary), defaults, display and notification preferences.

MCP tool: get_user_settings

PATCH/api/v1/me/settingswrite scope

Update the user's settings

Saves Settings → General preferences for the acting user (send only the fields to change). Changing timezone moves the user's reporting day boundaries for all their reports, so confirm with the user before calling.

ParameterTypeRequiredDescription
timezonestringnoThe user's reporting timezone (IANA name, e.g. America/New_York). Follows the user across workspaces.
default_timeframestringnoDefault dashboard date range. One of: today, 7d, 30d, mtd.
default_landing_pagestringnoPage shown after sign-in. One of: dashboard, manager, automation, settings.
date_formatstringnoDate display format: browser locale, MM/DD/YYYY, DD/MM/YYYY or YYYY-MM-DD. One of: local, mdy, dmy, iso.
currencystringnoDisplay currency preference. One of: USD, EUR, GBP, CAD.
themestringnoUI theme. One of: dark, light.
ui_compact_modebooleannoCompact tables.
low_bandwidth_modebooleannoReduce data usage in the UI.
auto_refresh_intervalstringnoAuto refresh interval in seconds, 0 = off. One of: 0, 300, 900, 3600.
show_in_dashbooleannoShow in dashboard.
confirm_before_destructive_actionsbooleannoAsk for confirmation before destructive actions in the UI.
sync_after_integration_connectbooleannoStart a sync right after connecting an integration.
automation_default_statusstringnoDefault status for new automation rules. One of: OFF, ON.
automation_default_intervalstringnoDefault check interval for new automation rules, in minutes. One of: 5, 15, 60, 360.
notifications_weekly_reportbooleannoEmail the weekly report.
notifications_automation_alertsbooleannoNotify about automation alerts.
notifications_integration_alertsbooleannoNotify about integration alerts.

MCP tool: update_user_settings

Notifications

GET/api/v1/notificationsread scope

List notifications

Lists the workspace's in-app notifications (integration problems, automation alerts, system notices), newest first, excluding dismissed ones. Filter by unread or by category.

ParameterTypeRequiredDescription
filterstringnoOnly unread notifications, or one category (default all). One of: all, unread, integration, automation, system. Default: all.
limitintegernoPage size (default 25). Default: 25.
cursorstringnonext_cursor from the previous page.

MCP tool: list_notifications

GET/api/v1/notifications/summaryread scope

Unread notification count

Returns the number of unread notifications and the five most recent ones. Use it to check whether anything needs attention.

MCP tool: get_notification_summary

POST/api/v1/notifications/{id}/readwrite scope

Mark a notification read

Marks one notification as read. Safe to repeat.

ParameterTypeRequiredDescription
idstringyesNotification id.

MCP tool: mark_notification_read

POST/api/v1/notifications/read-allwrite scope

Mark all notifications read

Marks every unread notification in the workspace as read.

MCP tool: mark_all_notifications_read

POST/api/v1/notifications/{id}/dismisswrite scope

Dismiss a notification

Dismisses a notification so it no longer appears in the list (it is also marked read).

ParameterTypeRequiredDescription
idstringyesNotification id.

MCP tool: dismiss_notification

Logs

GET/api/v1/logsread scope

List workspace logs

Lists Settings → Logs, newest first: integration syncs, automation runs, actions by team members, API and MCP changes, and operational events. Filter by category, outcome (status), time window or search text.

ParameterTypeRequiredDescription
categorystringnoOnly this category. One of: integrations, automation, workspace, system.
statusstringnoOnly this outcome: success, warning or error. One of: success, warning, error.
sincestringnoTime window: 24h, 7d, 30d or all (default all). One of: 24h, 7d, 30d, all.
qstringnoSearch text.
limitintegernoPage size (max 100).
cursorstringnonext_cursor from the previous page.

MCP tool: list_logs

Billing

GET/api/v1/billingread scope

Billing status and plan usage

Returns the workspace's plan, billing status (demo, trialing, active, past_due, canceled), trial end, seat and ad account limits and trailing 30-day ad spend against the plan's allowance. Read-only: checkout, plan changes and the payment portal are only available in the app. Works on lapsed workspaces so you can see why access is limited.

MCP tool: get_billing

Team

GET/api/v1/team/membersread scope

List team members and seat usage

Returns { members, seats }: the workspace's members with their role (admin, manager or viewer), who owns the workspace, and seat usage against the plan's limit (pending invitations count against it). Admins only.

MCP tool: list_team_members

PATCH/api/v1/team/members/{id}write scope

Change a member's role

Team changes affect who can access the workspace: confirm with the user before calling. Sets a member's role to admin, manager or viewer (admins only). Promoting to admin needs a plan with team access. You cannot demote yourself or the workspace owner.

ParameterTypeRequiredDescription
idstringyesMember (user) id.
rolestringyesadmin (full access, can manage the team and billing) manager (campaigns, rules and reporting) or viewer (read-only). One of: admin, manager, viewer.

MCP tool: update_team_member_role

DELETE/api/v1/team/members/{id}write scope

Remove a team member

Team changes affect who can access the workspace: confirm with the user before calling. Removes a member from the workspace immediately (admins only). The owner and yourself cannot be removed.

ParameterTypeRequiredDescription
idstringyesMember (user) id.

MCP tool: remove_team_member

GET/api/v1/team/invitationsread scope

List team invitations

Lists the latest 100 invitations (pending, accepted or revoked), newest first. Admins only.

MCP tool: list_team_invitations

POST/api/v1/team/invitationswrite scope

Invite a team member

Team changes affect who can access the workspace: confirm with the user before calling. Emails an invitation to join the workspace as admin, manager or viewer (admins only, needs a plan with team access). The invitation is valid for seven days and counts against the seat limit; the same address can only be emailed 3 times per hour.

ParameterTypeRequiredDescription
emailstringyesEmail address of the person to invite.
rolestringnoadmin (full access, can manage the team and billing) manager (campaigns, rules and reporting) or viewer (read-only). One of: admin, manager, viewer. Default: manager.

MCP tool: invite_team_member

POST/api/v1/team/invitations/{id}/resendwrite scope

Resend a team invitation

Team changes affect who can access the workspace: confirm with the user before calling. Emails a pending invitation again with a fresh link and a new seven-day expiry; the previous link stops working (admins only).

ParameterTypeRequiredDescription
idstringyesInvitation id.

MCP tool: resend_team_invitation

DELETE/api/v1/team/invitations/{id}write scope

Revoke a team invitation

Team changes affect who can access the workspace: confirm with the user before calling. Revokes a pending invitation so its link stops working (admins only).

ParameterTypeRequiredDescription
idstringyesInvitation id.

MCP tool: revoke_team_invitation

Security

GET/api/v1/webhooksread scope

List outbound webhooks

Lists the workspace's outbound webhooks (Settings → Integrations → Webhooks), including revoked ones, with the event types each receives and whether it is enabled. Signing secrets are never returned after creation; non-admins see endpoint URLs without query strings.

MCP tool: list_webhooks

GET/api/v1/webhooks/event-typesread scope

List webhook event types

The event types an outbound webhook can subscribe to. Payload schemas are in the OpenAPI spec's webhooks section and on /docs/api#webhooks. Each delivery is a POST with a JSON body { id, type, created_at, workspace_id, data } and the headers Tracebird-Event, Tracebird-Delivery (unique id; use it or the event id for idempotency) and Tracebird-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<raw body>" keyed with the signing secret>.

MCP tool: list_webhook_event_types

POST/api/v1/webhookswrite scope

Create an outbound webhook

Creates an outbound webhook to an HTTPS endpoint (admins only, max 25 active) that receives the chosen events (default: all). The response contains the signing secret exactly once: show it to the user and never store or repeat it. Confirm the endpoint with the user first. Each delivery is a POST with a JSON body { id, type, created_at, workspace_id, data } and the headers Tracebird-Event, Tracebird-Delivery (unique id; use it or the event id for idempotency) and Tracebird-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<raw body>" keyed with the signing secret>. Failed deliveries (non-2xx or no answer in 10 s) are retried 5 more times over about 24 hours.

ParameterTypeRequiredDescription
namestringyesLabel for the webhook (max 80 characters).
endpoint_urlstringyesHTTPS URL that receives the events.
eventsstring[]noEvent types to send (list_webhook_event_types). ["*"] or omitted = every event, including ones added later.

MCP tool: create_webhook

PATCH/api/v1/webhooks/{id}write scope

Update an outbound webhook

Changes a webhook's name, endpoint URL or event types, or disables / re-enables it (admins only). Re-enabling a webhook that was disabled after repeated failed deliveries clears its failure count; send a test first to check the endpoint. Only the fields you pass change.

ParameterTypeRequiredDescription
idstringyesWebhook id.
namestringnoNew label.
endpoint_urlstringnoNew HTTPS URL.
eventsstring[]noEvent types to send (list_webhook_event_types). ["*"] or omitted = every event, including ones added later.
enabledbooleannofalse stops deliveries; true re-enables a disabled webhook.

MCP tool: update_webhook

POST/api/v1/webhooks/{id}/testwrite scope

Send a test event

Sends one signed `webhook.test` event to the webhook right now (also when it is disabled) and returns whether the endpoint answered 2xx. Test events are not retried and never count toward auto-disable.

ParameterTypeRequiredDescription
idstringyesWebhook id.

MCP tool: test_webhook

GET/api/v1/webhooks/{id}/deliveriesread scope

List a webhook's deliveries

The delivery log, newest first (kept 30 days): event type and id, status (pending = will retry at next_attempt_at, delivered, failed), attempts, the last HTTP status and error.

ParameterTypeRequiredDescription
idstringyesWebhook id.
limitintegernoHow many (1-100, default 50). Default: 50.

MCP tool: list_webhook_deliveries

DELETE/api/v1/webhooks/{id}write scope

Revoke an outbound webhook

Revokes a webhook so it stops receiving events (admins only). This cannot be undone; confirm with the user before calling.

ParameterTypeRequiredDescription
idstringyesWebhook id.

MCP tool: revoke_webhook

GET/api/v1/audit-logread scope

Security audit log

Returns the newest security and workspace audit events (who did what, when): API key and webhook changes, member actions, and changes made through the API or MCP. Newest first, one page of up to 100.

ParameterTypeRequiredDescription
limitintegernoNumber of events (default 50). Default: 50.

MCP tool: list_audit_log

GET/api/v1/api-keysread scope

List API keys

Lists the workspace's API keys (metadata only: name, key prefix, scopes, last use, expiry, revocation). Secrets are never returned, and keys can only be created or revoked in the app.

MCP tool: list_api_keys

GET/api/v1/connected-appsread scope

List connected apps

Lists the OAuth apps connected to the workspace, such as AI assistants using MCP (metadata only). Admins see everyone's connections, other members their own. Connections can only be revoked in the app.

MCP tool: list_connected_apps

Ads

GET/api/v1/ad-accountsread scope

List connected ad accounts

Lists the ad accounts connected to the workspace across Facebook and Google Ads, with currency, timezone and whether the account is enabled in Tracebird. Use it first to learn account ids (for the account_id filter) and the currency that spend and budget amounts are reported in.

ParameterTypeRequiredDescription
platformstringnoOnly this platform: facebook, google_ads, hyros or demo (sample data). One of: facebook, google_ads, hyros, demo.

MCP tool: list_ad_accounts

GET/api/v1/campaignsread scope

List campaigns

Lists campaigns synced from Facebook and Google Ads: name, status, objective, budget, bid strategy and account. Use it to find campaign ids or to monitor structure and status; use get_insights for performance numbers. Results are ordered by updated_at then id, so passing the newest `updated_at` you saw as `updated_since` and following `next_cursor` gives a stable incremental sync. Money fields are numbers in major units of the account `currency`; times are ISO 8601 UTC.

ParameterTypeRequiredDescription
platformstringnoOnly this platform: facebook, google_ads, hyros or demo (sample data). One of: facebook, google_ads, hyros, demo.
account_idstringnoOnly this ad account (the `id` from list_ad_accounts, for example `act_123` or `gads:1234567890`).
statusstringnoOnly this status. Status values are the platform's (for example ACTIVE, PAUSED, ARCHIVED, DELETED); matching is case-insensitive.
searchstringnoOnly campaigns whose name contains this text (case-insensitive).
updated_sincestring (date-time)noOnly rows changed at or after this ISO 8601 time. Store the latest `updated_at` you saw and pass it back for incremental sync.
limitintegernoPage size (1-500, default 100). Default: 100.
cursorstringnoOpaque `next_cursor` from the previous page. Omit for the first page.

MCP tool: list_campaigns

GET/api/v1/campaigns/{id}read scope

Get a campaign

Returns one campaign by its platform id (name, status, objective, budget, bid strategy, account and currency). Use list_campaigns to discover ids.

ParameterTypeRequiredDescription
idstringyesThe campaign's platform id, as returned by the list endpoint.

MCP tool: get_campaign

GET/api/v1/ad-setsread scope

List ad sets

Lists ad sets (Google Ads ad groups): name, status, budget, bid strategy, schedule and parent campaign. Filter by campaign_id to see one campaign's ad sets. Results are ordered by updated_at then id, so passing the newest `updated_at` you saw as `updated_since` and following `next_cursor` gives a stable incremental sync. Money fields are numbers in major units of the account `currency`; times are ISO 8601 UTC.

ParameterTypeRequiredDescription
platformstringnoOnly this platform: facebook, google_ads, hyros or demo (sample data). One of: facebook, google_ads, hyros, demo.
account_idstringnoOnly this ad account (the `id` from list_ad_accounts, for example `act_123` or `gads:1234567890`).
statusstringnoOnly this status. Status values are the platform's (for example ACTIVE, PAUSED, ARCHIVED, DELETED); matching is case-insensitive.
campaign_idstringnoOnly ad sets of this campaign.
searchstringnoOnly ad sets whose name contains this text (case-insensitive).
updated_sincestring (date-time)noOnly rows changed at or after this ISO 8601 time. Store the latest `updated_at` you saw and pass it back for incremental sync.
limitintegernoPage size (1-500, default 100). Default: 100.
cursorstringnoOpaque `next_cursor` from the previous page. Omit for the first page.

MCP tool: list_ad_sets

GET/api/v1/ad-sets/{id}read scope

Get an ad set

Returns one ad set by its platform id (status, budget, bid strategy, schedule, parent campaign). Use list_ad_sets to discover ids.

ParameterTypeRequiredDescription
idstringyesThe ad set's platform id, as returned by the list endpoint.

MCP tool: get_ad_set

GET/api/v1/adsread scope

List ads

Lists ads with status, parent ad set and campaign, and creative details (format, preview link, primary text, headline, call to action, destination URL). Filter by ad_set_id or campaign_id. Results are ordered by updated_at then id, so passing the newest `updated_at` you saw as `updated_since` and following `next_cursor` gives a stable incremental sync. Money fields are numbers in major units of the account `currency`; times are ISO 8601 UTC.

ParameterTypeRequiredDescription
platformstringnoOnly this platform: facebook, google_ads, hyros or demo (sample data). One of: facebook, google_ads, hyros, demo.
account_idstringnoOnly this ad account (the `id` from list_ad_accounts, for example `act_123` or `gads:1234567890`).
statusstringnoOnly this status. Status values are the platform's (for example ACTIVE, PAUSED, ARCHIVED, DELETED); matching is case-insensitive.
campaign_idstringnoOnly ads of this campaign.
ad_set_idstringnoOnly ads of this ad set.
searchstringnoOnly ads whose name contains this text (case-insensitive).
updated_sincestring (date-time)noOnly rows changed at or after this ISO 8601 time. Store the latest `updated_at` you saw and pass it back for incremental sync.
limitintegernoPage size (1-500, default 100). Default: 100.
cursorstringnoOpaque `next_cursor` from the previous page. Omit for the first page.

MCP tool: list_ads

GET/api/v1/ads/{id}read scope

Get an ad

Returns one ad by its platform id with status, parent ids and creative details. Use list_ads to discover ids.

ParameterTypeRequiredDescription
idstringyesThe ad's platform id, as returned by the list endpoint.

MCP tool: get_ad

POST/api/v1/ads/duplicatewrite scope

Duplicate campaigns, ad sets or ads

LIVE CHANGE on the real ad accounts. Confirm the exact assets and change with the user before calling. Up to 50 ids per call. Same rules as the Ads Manager: if an active automation rule has priority the change is refused (HTTP 409); every row reports its own result in "results". Creates copies on the ad platform (paused by default), as the Duplicate action in the Ads Manager does.

ParameterTypeRequiredDescription
levelstringyesWhat the ids are. One of: campaign, ad_set, ad.
idsstring[]yesProvider ids from the list endpoints (up to 50).
pausedbooleannoCreate the copies paused (default true). false copies go live like the originals. Default: true.
intent_idstringnoOptional idempotency key. Re-sending the same key after a timeout will not repeat a write that already went through.

MCP tool: duplicate_ads

POST/api/v1/ads/deletewrite scope

Delete campaigns, ad sets or ads

LIVE CHANGE on the real ad accounts. Confirm the exact assets and change with the user before calling. Up to 50 ids per call. Same rules as the Ads Manager: if an active automation rule has priority the change is refused (HTTP 409); every row reports its own result in "results". DESTRUCTIVE: deletes the assets on the ad platform and cannot be undone. Prefer pausing (update_campaign / update_ad_set / update_ad) unless the user explicitly asks to delete.

ParameterTypeRequiredDescription
levelstringyesWhat the ids are. One of: campaign, ad_set, ad.
idsstring[]yesProvider ids from the list endpoints (up to 50).
intent_idstringnoOptional idempotency key. Re-sending the same key after a timeout will not repeat a write that already went through.

MCP tool: delete_ads

POST/api/v1/ads/trackingwrite scope

Add Tracebird tracking parameters to ads

LIVE CHANGE on the real ad accounts. Confirm the exact assets and change with the user before calling. Up to 50 ids per call. Same rules as the Ads Manager: if an active automation rule has priority the change is refused (HTTP 409); every row reports its own result in "results". Copies each ad's creative with merged URL tracking parameters so CRM conversions can be matched to the ad (the "Add tracking to ads" action). Ads that already have tracking are skipped.

ParameterTypeRequiredDescription
idsstring[]yesProvider ids from the list endpoints (up to 50).
intent_idstringnoOptional idempotency key. Re-sending the same key after a timeout will not repeat a write that already went through.

MCP tool: add_ad_tracking

POST/api/v1/ads/destinationwrite scope

Change the destination URL of ads

LIVE CHANGE on the real ad accounts. Confirm the exact assets and change with the user before calling. Up to 50 ids per call. Same rules as the Ads Manager: if an active automation rule has priority the change is refused (HTTP 409); every row reports its own result in "results". Points the ads at a new destination URL (and optionally display link) by replacing their creative, as the Change destination action does. This changes where live traffic lands.

ParameterTypeRequiredDescription
idsstring[]yesProvider ids from the list endpoints (up to 50).
linkstringyesNew destination URL (https://...).
display_linkstringnoOptional display link shown on the ad.
intent_idstringnoOptional idempotency key. Re-sending the same key after a timeout will not repeat a write that already went through.

MCP tool: change_ad_destination

GET/api/v1/ads/write-intentsread scope

Ad writes that need review

Lists manual ad writes whose outcome is uncertain (the platform may or may not have applied them; the assets stay locked) and known partial results that need reconciling. Use before retrying a failed or timed-out write.

MCP tool: list_asset_write_intents

POST/api/v1/ads/write-intents/{id}/acknowledgewrite scope

Acknowledge a completed ad write

Releases a completed write intent after its result was received. Uncertain writes stay locked; they must be checked in the ad platform first. Confirm with the user.

ParameterTypeRequiredDescription
idstringyesWrite intent id from list_asset_write_intents.

MCP tool: acknowledge_asset_write_intent

GET/api/v1/ads/write-intents/{id}/inspectionread scope

Re-read Meta for a known partial write

Reads the current Meta state of the ads touched by a known partial write (live call, changes nothing) and returns an `inspectionVersion` to pass to reconcile_partial_write_intent.

ParameterTypeRequiredDescription
idstringyesWrite intent id from list_asset_write_intents.
versionstringyes`version` of the intent from list_asset_write_intents (confirmed_partial).

MCP tool: inspect_partial_write_intent

POST/api/v1/ads/write-intents/{id}/reconcilewrite scope

Acknowledge a known partial write

Marks a known partial write as reviewed after inspect_partial_write_intent. Re-reads Meta and refuses if the state changed since the inspection. Confirm with the user that they reviewed the latest Meta state; any new creative change needs a new explicit action.

ParameterTypeRequiredDescription
idstringyesWrite intent id from list_asset_write_intents.
versionstringyes`version` of the intent from list_asset_write_intents (confirmed_partial).
inspection_versionstringyes`inspectionVersion` returned by inspect_partial_write_intent.
confirmedbooleanyesMust be true: the user reviewed the latest Meta state.

MCP tool: reconcile_partial_write_intent

PATCH/api/v1/campaigns/{id}write scope

Pause, resume, rename or change the budget of a campaign

LIVE CHANGE: this takes effect on the real ad account immediately and can change delivery and spend. Confirm the exact change with the user before calling. It follows the same rules as the Tracebird Ads Manager: if an active automation rule has priority, the change is refused with an explanation (HTTP 409) instead of being forced. Send exactly one of status (ACTIVE | PAUSED), name or daily_budget per request. daily_budget only works on campaigns with their own budget (campaign budget / CBO); for ad set budgets (ABO) update each ad set instead.

ParameterTypeRequiredDescription
idstringyesCampaign id (the provider's id, as returned by the list endpoints).
statusstringnoResume (ACTIVE) or pause (PAUSED) delivery. One of: ACTIVE, PAUSED.
namestringnoNew name (max 200 characters).
daily_budgetnumbernoNew budget in major currency units of the ad account (e.g. 25 = 25.00), as shown in the Ads Manager. Sets the entity's own budget; refused where the budget lives elsewhere.

MCP tool: update_campaign

PATCH/api/v1/ad-sets/{id}write scope

Pause, resume, rename or change the budget of an ad set

LIVE CHANGE: this takes effect on the real ad account immediately and can change delivery and spend. Confirm the exact change with the user before calling. It follows the same rules as the Tracebird Ads Manager: if an active automation rule has priority, the change is refused with an explanation (HTTP 409) instead of being forced. Send exactly one of status (ACTIVE | PAUSED), name or daily_budget per request. daily_budget is refused when the ad set uses its campaign's budget (CBO); update the campaign instead.

ParameterTypeRequiredDescription
idstringyesAd set id (the provider's id, as returned by the list endpoints).
statusstringnoResume (ACTIVE) or pause (PAUSED) delivery. One of: ACTIVE, PAUSED.
namestringnoNew name (max 200 characters).
daily_budgetnumbernoNew budget in major currency units of the ad account (e.g. 25 = 25.00), as shown in the Ads Manager. Sets the entity's own budget; refused where the budget lives elsewhere.

MCP tool: update_ad_set

PATCH/api/v1/ads/{id}write scope

Pause, resume or rename an ad

LIVE CHANGE: this takes effect on the real ad account immediately and can change delivery and spend. Confirm the exact change with the user before calling. It follows the same rules as the Tracebird Ads Manager: if an active automation rule has priority, the change is refused with an explanation (HTTP 409) instead of being forced. Send exactly one of status (ACTIVE | PAUSED), name per request.

ParameterTypeRequiredDescription
idstringyesAd id (the provider's id, as returned by the list endpoints).
statusstringnoResume (ACTIVE) or pause (PAUSED) delivery. One of: ACTIVE, PAUSED.
namestringnoNew name (max 200 characters).

MCP tool: update_ad

Insights

GET/api/v1/insightsread scope

Ad performance by day or total

Returns advertising performance for a date range at account, campaign, ad set or ad level: spend, impressions, clicks, CTR, CPC, CPM, platform-reported purchases and purchase value, platform ROAS, plus attributed leads and revenue from the connected attribution source (HYROS) when present. Use time_increment=day for a daily time series (one row per entity per day) or total for one row per entity over the whole range. The range is limited to 93 days; request several windows for longer histories. Days are the calendar days the ad platform reports for each ad account (the account's own timezone), so they can differ slightly from the workspace reporting timezone. Money is a number in major units of the row's `currency` (the ad account currency); rows are never mixed across currencies. Reach is only returned at ad level with time_increment=day because reach is not additive across days or entities. For revenue that comes from CRM/Stripe sales (not ad-platform reported), use get_revenue or get_performance_summary.

ParameterTypeRequiredDescription
levelstringnoEntity level to report on (default campaign). One of: account, campaign, ad_set, ad. Default: campaign.
sincestring (date)noFirst day (YYYY-MM-DD, inclusive) in the workspace reporting timezone. Defaults to 6 days before `until`.
untilstring (date)noLast day (YYYY-MM-DD, inclusive). Defaults to today.
time_incrementstringnoday: one row per entity per day. total: one row per entity for the whole range. One of: day, total. Default: day.
idsstring[]noOnly these entity ids at the chosen level (for level=account use ids from list_ad_accounts). Up to 100.
platformstringnoOnly this platform: facebook, google_ads, hyros or demo (sample data). One of: facebook, google_ads, hyros, demo.
limitintegernoPage size (1-500, default 100). Default: 100.
cursorstringnoOpaque `next_cursor` from the previous page. Omit for the first page.

MCP tool: get_insights

GET/api/v1/metrics/summaryread scope

Workspace KPI totals for a date range

Returns the same workspace totals as the Tracebird dashboard for a date range: ad spend, impressions, clicks, platform purchases and ROAS, attributed leads and revenue, CRM funnel counts (leads, appointments, shows, sales) with CRM revenue, Stripe net revenue, and front-end / back-end / blended revenue with the dashboard's ROAS and CAC (revenue.roas, revenue.cac: revenue or customers against revenue.ad_spend; null when a stage has no revenue source or spend is in mixed currencies; lower bounds while revenue.maturing is true). Use it for a quick overview of how the business is doing; use get_insights for per-campaign or per-day breakdowns and get_revenue for the revenue split alone. Money is converted to the workspace main currency (`currency`) at daily FX rates where a rate exists. Days follow the workspace reporting timezone (`timezone`). The range is limited to 93 days; on a trial only the last 30 days are available.

ParameterTypeRequiredDescription
sincestring (date)noFirst day (YYYY-MM-DD, inclusive) in the workspace reporting timezone. Defaults to 6 days before `until`.
untilstring (date)noLast day (YYYY-MM-DD, inclusive). Defaults to today.
account_idstringnoOnly this ad account's spend and ad metrics (the `id` from list_ad_accounts). Commerce totals stay workspace-wide.

MCP tool: get_performance_summary

GET/api/v1/revenueread scope

Front-end, back-end and blended revenue

Returns workspace revenue split into front-end (the initial offer) and back-end (higher-ticket follow-up) sales, plus blended (their sum), with distinct buyers and deals, for a date range. Each sale is counted once by the revenue source configured under Settings > Revenue. basis=sale (default) uses the day each sale happened; basis=acquisition attributes revenue to the day the customer was acquired (later back-end sales still count, so recent ranges are lower bounds while `maturing` is true). Amounts are numbers in major units of the workspace main currency (`currency`) where FX rates exist; an amount in a currency without a rate is listed as its own entry in `by_currency`. Days follow the workspace reporting timezone. Range limit: 93 days.

ParameterTypeRequiredDescription
sincestring (date)noFirst day (YYYY-MM-DD, inclusive) in the workspace reporting timezone. Defaults to 6 days before `until`.
untilstring (date)noLast day (YYYY-MM-DD, inclusive). Defaults to today.
basisstringnosale: group by when the sale happened. acquisition: group by when the customer was acquired. One of: sale, acquisition. Default: sale.

MCP tool: get_revenue

GET/api/v1/insights/breakdownsread scope

Performance broken down by placement, age, gender, country...

Returns ad performance for a date range split by one dimension (placement, device, age, gender, age_gender, country, page or instagram), workspace-wide or scoped to one ad account or one campaign / ad set / ad. Same data and rules as the Insights breakdowns in the app: when the scope mixes currencies or ad accounts cannot be verified, `state` is `rejected` with a `reason` instead of rows. Money is in the `currency` of the scope.

ParameterTypeRequiredDescription
dimensionstringyesWhat to split by. One of: placement, device, age, gender, age_gender, country, page, instagram.
sincestring (date)noFirst day (YYYY-MM-DD, inclusive) in the workspace reporting timezone. Defaults to 6 days before `until`.
untilstring (date)noLast day (YYYY-MM-DD, inclusive). Defaults to today.
account_idstringnoOnly this ad account (id from list_ad_accounts).
entity_levelstringnoWith entity_id, scope to one campaign, ad set or ad. One of: campaign, ad_set, ad.
entity_idstringnoThe campaign / ad set / ad id for entity_level.

MCP tool: get_insight_breakdowns

GET/api/v1/insights/funnel-assetsread scope

Front-end / back-end revenue per campaign, ad set or ad

Returns front-end, back-end and blended revenue (and optionally LTV over 30, 90 or 365 days) for specific campaigns, ad sets or ads, the numbers behind the FE/BE columns of the Ads Manager. Money is in the workspace main currency. Range limit: 93 days.

ParameterTypeRequiredDescription
levelstringyesEntity level of `ids`. One of: campaign, ad_set, ad.
idsstring[]yesCampaign / ad set / ad ids (up to 100).
sincestring (date)noFirst day (YYYY-MM-DD, inclusive) in the workspace reporting timezone. Defaults to 6 days before `until`.
untilstring (date)noLast day (YYYY-MM-DD, inclusive). Defaults to today.
basisstringnosale: group by the day of each sale. acquisition: group by the day the customer was acquired. One of: sale, acquisition. Default: sale.
ltv_horizon_daysintegernoAlso return LTV over this window: 30, 90 or 365.

MCP tool: get_funnel_asset_metrics

GET/api/v1/creatives/{id}read scope

Daily performance of one creative with workspace benchmarks

Returns one ad's daily series (spend, impressions, reach, clicks, leads, purchases, revenue, CTR, frequency) for a date range plus workspace median benchmarks (hook rate, CTR, CPL, CPM, ROAS), as in the creative detail view. Range limit: 93 days.

ParameterTypeRequiredDescription
idstringyesAd id (the creative is the ad; ids come from list_ads).
sincestring (date)noFirst day (YYYY-MM-DD, inclusive) in the workspace reporting timezone. Defaults to 6 days before `until`.
untilstring (date)noLast day (YYYY-MM-DD, inclusive). Defaults to today.

MCP tool: get_creative_detail

GET/api/v1/creatives/{id}/breakdownsread scope

Placement, age, gender and device breakdowns of one creative

Returns placement, age, gender and device breakdowns for one ad over a date range. Meta ads are read live from Meta with the workspace connection (not stored); `source` says where the data came from and `error` explains when it is unavailable. Range limit: 93 days.

ParameterTypeRequiredDescription
idstringyesAd id (the creative is the ad; ids come from list_ads).
sincestring (date)noFirst day (YYYY-MM-DD, inclusive) in the workspace reporting timezone. Defaults to 6 days before `until`.
untilstring (date)noLast day (YYYY-MM-DD, inclusive). Defaults to today.

MCP tool: get_creative_breakdowns

GET/api/v1/creatives/{id}/previewread scope

Preview link of an ad

Returns how an ad looks: for Meta ads a preview iframe URL (`type` meta_preview_url), for Google Ads a native preview model (`type` google_ad). `type` is null when no preview is available (sample ads, disconnected account).

ParameterTypeRequiredDescription
idstringyesAd id (the creative is the ad; ids come from list_ads).

MCP tool: get_ad_preview

Dashboard

GET/api/v1/dashboard/catalogread scope

Cards, columns and chart options the dashboard accepts

Lists the metric card keys, campaign table columns, chart palettes and limits that get_dashboard_preferences / update_dashboard_preferences accept, so a valid layout can be built. Also lists the Ads Manager table view defaults.

MCP tool: list_dashboard_options

GET/api/v1/dashboard/preferencesread scope

The dashboard layout of the key owner

Returns the dashboard layout saved for the API key's owner in this workspace: main and secondary metric cards, chart series, campaign columns and chart styling. `saved` is false (and the app defaults are returned) until a layout was saved. Use list_dashboard_options for valid keys.

MCP tool: get_dashboard_preferences

PATCH/api/v1/dashboard/preferenceswrite scope

Change the dashboard layout of the key owner

Merges the given fields into the key owner's saved dashboard layout (only your own layout; other members are unaffected) and returns the normalized result; unknown card keys are dropped. Example: {"preferences":{"cards":["spend","funnel_blended_revenue"],"chartSeries":["spend","revenue"],"chartType":"bar"}}. Send expected_updated_at from get_dashboard_preferences to fail with 409 if the layout changed meanwhile.

ParameterTypeRequiredDescription
preferencesobjectyesFields to change: cards, secondaryCards, chartSeries, campaignColumns, sourceColumns, sourceSort, sourceFilters, chartType, chartPalette, chartShowValues, chartShowGrid, chartSmooth, abbreviations, stageMarks, roasBaselines, ltvHorizon.
expected_updated_atintegerno`updated_at` you last read; omit to overwrite the current layout.

MCP tool: update_dashboard_preferences

GET/api/v1/dashboard/trendread scope

Daily spend and revenue series

Returns the dashboard chart series: one point per day (zero-filled) with ad spend and revenue in the workspace main currency, in the key owner's reporting timezone, optionally for one ad account. Range limit: 93 days.

ParameterTypeRequiredDescription
sincestring (date)noFirst day (YYYY-MM-DD, inclusive) in the workspace reporting timezone. Defaults to 6 days before `until`.
untilstring (date)noLast day (YYYY-MM-DD, inclusive). Defaults to today.
account_idstringnoOnly this ad account (id from list_ad_accounts).

MCP tool: get_dashboard_trend

GET/api/v1/dashboard/revenueread scope

Stripe revenue for a period and the one before

Returns the dashboard's Stripe revenue view for the date range and the equal-length previous period (for the period-over-period comparison). `source` says whether Stripe data was available. Range limit: 93 days.

ParameterTypeRequiredDescription
sincestring (date)noFirst day (YYYY-MM-DD, inclusive) in the workspace reporting timezone. Defaults to 6 days before `until`.
untilstring (date)noLast day (YYYY-MM-DD, inclusive). Defaults to today.

MCP tool: get_dashboard_revenue

GET/api/v1/customers/groupsread scope

Customers grouped by source, campaign, ad or month

Returns customer counts and revenue grouped by acquisition source, campaign, ad or first-seen month, with the same filters as the Customers page.

ParameterTypeRequiredDescription
bystringnoGrouping. One of: source, campaign, ad, first_seen_month. Default: source.
searchstringnoName, email or phone contains.
sourcesstring[]noOnly customers seen in these sources.
attributionstringnoOnly customers with / without an ad attribution. One of: attributed, unattributed.
detailsstringnoContact details filter. One of: has_email, has_phone, has_name, missing.
revenuestringnoOnly paying / non-paying customers. One of: paying, none.
active_daysintegernoSeen in the last N days.
sortstringnoSort used by the filter query. One of: last_seen, first_seen, name, email, acquired, revenue.

MCP tool: list_customer_groups

Views

GET/api/v1/manager-viewsread scope

Saved Ads Manager views

Lists the workspace's saved Ads Manager filter views (up to 100, newest first).

MCP tool: list_manager_views

POST/api/v1/manager-viewswrite scope

Save an Ads Manager view

Saves a named set of Ads Manager filters and hidden columns, shared with the workspace. Example: {"name":"Active spenders","filters":[{"field":"status","value":"ACTIVE"}],"hidden_columns":["reach"]}.

ParameterTypeRequiredDescription
namestringnoView name.
filtersobject[]noSaved filters as the Ads Manager stores them (array of filter objects).
hidden_columnsstring[]noColumn keys hidden in this view.

MCP tool: create_manager_view

PATCH/api/v1/manager-views/{id}write scope

Change a saved Ads Manager view

Renames a saved view or replaces its filters / hidden columns; omitted fields keep their value.

ParameterTypeRequiredDescription
idstringyesView id.
namestringnoView name.
filtersobject[]noSaved filters as the Ads Manager stores them (array of filter objects).
hidden_columnsstring[]noColumn keys hidden in this view.

MCP tool: update_manager_view

DELETE/api/v1/manager-views/{id}write scope

Delete a saved Ads Manager view

Permanently deletes a saved view for the whole workspace. Confirm with the user.

ParameterTypeRequiredDescription
idstringyesView id.

MCP tool: delete_manager_view

GET/api/v1/table-viewsread scope

Ads Manager table views of the key owner

Returns the key owner's saved Ads Manager table views (column set and order, widths, sort, pinned columns) and which is selected. Defaults are returned until saved.

MCP tool: get_table_views

PATCH/api/v1/table-viewswrite scope

Save the Ads Manager table views of the key owner

Replaces the key owner's table views (last write wins; send the complete list from get_table_views with your changes). Example: {"preferences":{"selectedId":"mine","views":[{"id":"mine","name":"Mine","favorite":true,"columns":["delivery","spend","funnel_blended_roas"],"widths":{},"pinned":[],"sort":{"key":"spend","dir":"desc"}}]}}. At most 30 views.

ParameterTypeRequiredDescription
preferencesobjectyes{ selectedId, views: [{ id, name, favorite, columns, widths, sort: {key, dir}, pinned }] }

MCP tool: update_table_views

Embeds

GET/api/v1/dashboard-embedsread scope

The workspace's public dashboard embed link

Returns the workspace's embed link (public id, path /embed/<public_id>, display config, view counts, whether a password is set) or null when none exists. Passwords are never returned.

MCP tool: get_dashboard_embed

POST/api/v1/dashboard-embedswrite scope

Create or rotate the dashboard embed link

Creates the workspace's public embed link, or ROTATES it when one exists (the previous URL stops working; the display config and password are kept). Anyone with the link can see the configured numbers: confirm with the user, especially before rotating.

MCP tool: create_dashboard_embed

PATCH/api/v1/dashboard-embedswrite scope

Change what the embed shows

Merges the given display settings into the embed config (cards, timeframe, asset level, accounts, filters, theme, widget template...). Display only; it cannot widen data access. Changes what viewers of the public link see: confirm with the user.

ParameterTypeRequiredDescription
configobjectyesEmbed display config (camelCase, as the Settings > Embed dialog saves it), e.g. {"timeframe":"last_7","asset":"campaigns","cards":["spend","funnel_blended_roas"],"rowLimit":10,"theme":"dark"}. Unknown fields fall back to defaults.

MCP tool: update_dashboard_embed_config

DELETE/api/v1/dashboard-embedswrite scope

Revoke the dashboard embed link

Turns the public embed link off immediately; every page using it stops working. Confirm with the user. create_dashboard_embed makes a new one.

MCP tool: revoke_dashboard_embed

POST/api/v1/dashboard-embeds/passwordwrite scope

Set the embed password

Sets or changes the password viewers must enter to open the embed (8-128 characters recommended by the app limits); signs out current viewers. The password is never returned or readable afterwards. Confirm with the user.

ParameterTypeRequiredDescription
passwordstringyesNew embed password.

MCP tool: set_dashboard_embed_password

DELETE/api/v1/dashboard-embeds/passwordwrite scope

Remove the embed password

Removes the embed password so anyone with the link can open it. Confirm with the user.

MCP tool: clear_dashboard_embed_password

GET/api/v1/dashboard-embeds/accountsread scope

Ad accounts an embed can be scoped to

Lists the ad accounts (busiest first) that can be put in the embed config's `accounts`.

MCP tool: list_embed_account_options

GET/api/v1/dashboard-embeds/previewread scope

Preview what the embed shows

Renders the embed with live workspace data for a draft config (or the saved config when omitted) without saving anything.

ParameterTypeRequiredDescription
configobjectnoEmbed display config (camelCase, as the Settings > Embed dialog saves it), e.g. {"timeframe":"last_7","asset":"campaigns","cards":["spend","funnel_blended_roas"],"rowLimit":10,"theme":"dark"}. Unknown fields fall back to defaults.

MCP tool: preview_dashboard_embed

GET/api/v1/dashboard-embeds/widget-previewread scope

Preview the phone widget text

Renders the phone widget text of the embed for a draft config (or the saved config when omitted) without saving anything.

ParameterTypeRequiredDescription
configobjectnoEmbed display config (camelCase, as the Settings > Embed dialog saves it), e.g. {"timeframe":"last_7","asset":"campaigns","cards":["spend","funnel_blended_roas"],"rowLimit":10,"theme":"dark"}. Unknown fields fall back to defaults.

MCP tool: preview_dashboard_embed_widget

Reports

GET/api/v1/report-metricsread scope

KPI keys a report can include

Lists the KPI keys accepted in a report's config.metrics, the report templates and the row limit, so valid report definitions can be built. crm_* keys only show data once the workspace records CRM conversions.

MCP tool: list_report_metrics

GET/api/v1/reportsread scope

Saved reports

Lists the workspace's saved report definitions (newest first, up to 500). Archived reports are hidden unless status=archived or all.

ParameterTypeRequiredDescription
statusstringnoWhich reports to return (default active). One of: active, archived, all. Default: active.

MCP tool: list_reports

GET/api/v1/reports/{id}read scope

One saved report

Returns a saved report definition (name, template, KPI metrics, rows, saved date range).

ParameterTypeRequiredDescription
idstringyesId.

MCP tool: get_report

POST/api/v1/reportswrite scope

Save a new report

Saves a reusable report definition. Use list_report_metrics for valid KPI keys. Example: {"name":"Weekly buyer review","template":"efficiency","config":{"metrics":["spend","revenue","roas"],"rows":10,"comparison":"previous_period"}}.

ParameterTypeRequiredDescription
namestringyesReport name.
descriptionstringnoShort description.
templatestringnoReport template. One of: executive, efficiency, creative, pacing, attribution.
configobjectyesReport definition: { metrics: string[] (keys from list_report_metrics), rows: 1-100, dateRange?: { preset, fromDay, toDay } or a preset string, comparison?: "previous_period", accounts?: string[] of ad account ids }. A report is a KPI summary for the workspace (or the listed accounts) with no per-campaign grouping; for a per-campaign or per-ad table use get_insights with level. Example: {"metrics":["spend","revenue","roas"],"rows":10,"dateRange":{"preset":"last_7_days","fromDay":"2026-10-01","toDay":"2026-10-07"},"comparison":"previous_period"}.

MCP tool: create_report

PATCH/api/v1/reports/{id}write scope

Change a saved report

Changes a saved report's name, description, template or definition; omitted fields keep their value. `config` replaces the whole definition (send the complete config).

ParameterTypeRequiredDescription
idstringyesId.
namestringnoReport name.
descriptionstringnoShort description.
templatestringnoReport template. One of: executive, efficiency, creative, pacing, attribution.
configobjectnoReport definition: { metrics: string[] (keys from list_report_metrics), rows: 1-100, dateRange?: { preset, fromDay, toDay } or a preset string, comparison?: "previous_period", accounts?: string[] of ad account ids }. A report is a KPI summary for the workspace (or the listed accounts) with no per-campaign grouping; for a per-campaign or per-ad table use get_insights with level. Example: {"metrics":["spend","revenue","roas"],"rows":10,"dateRange":{"preset":"last_7_days","fromDay":"2026-10-01","toDay":"2026-10-07"},"comparison":"previous_period"}.

MCP tool: update_report

POST/api/v1/reports/{id}/duplicatewrite scope

Duplicate a saved report

Saves a copy of a report named "<name> copy" and returns it.

ParameterTypeRequiredDescription
idstringyesId.

MCP tool: duplicate_report

DELETE/api/v1/reports/{id}write scope

Archive a saved report

Archives a report (hidden from the default list; its schedules stay saved). Confirm with the user.

ParameterTypeRequiredDescription
idstringyesId.

MCP tool: archive_report

GET/api/v1/report-schedulesread scope

Report email schedules

Lists the workspace's saved report delivery schedules (recipients, cadence, format, enabled), as on the Reports page.

MCP tool: list_report_schedules

POST/api/v1/report-scheduleswrite scope

Schedule a report

Saves a delivery schedule (recipients, cadence, format) for a saved report, like the Reports page's saved schedule preferences. Confirm the recipients and cadence with the user.

ParameterTypeRequiredDescription
report_idstringyesSaved report id.
recipientsstring[]yesEmail addresses for the report (1-25).
timezonestringnoIANA timezone of the schedule, e.g. America/New_York (default UTC).
cadencestringnoHow often (default weekly). One of: daily, weekly, monthly.
formatstringnoDelivery format (default pdf). One of: pdf, csv.
enabledbooleannofalse pauses the schedule.

MCP tool: create_report_schedule

PATCH/api/v1/report-schedules/{id}write scope

Change a report schedule

Changes recipients, cadence, format, timezone or enabled; omitted fields keep their value. Confirm recipient changes with the user.

ParameterTypeRequiredDescription
idstringyesId.
recipientsstring[]noEmail addresses for the report (1-25).
timezonestringnoIANA timezone of the schedule, e.g. America/New_York (default UTC).
cadencestringnoHow often (default weekly). One of: daily, weekly, monthly.
formatstringnoDelivery format (default pdf). One of: pdf, csv.
enabledbooleannofalse pauses the schedule.

MCP tool: update_report_schedule

GET/api/v1/report-viewsread scope

Saved report views

Lists saved views (named page settings per route, private or shared) used by the reports pages.

MCP tool: list_report_views

POST/api/v1/report-viewswrite scope

Save a report view

Saves named page settings for a route. Example: {"name":"Last 30 days","route":"/dashboard/insights/reports","config":{"range":"last_30_days"},"visibility":"shared"}.

ParameterTypeRequiredDescription
namestringyesView name.
routestringnoApp route the view belongs to, e.g. /dashboard.
configobjectnoView settings object (filters, columns, date range...) as the page saves them.
visibilitystringnoshared makes it visible to the workspace. One of: private, shared.
is_defaultbooleannoMake this the default view for its route.

MCP tool: create_report_view

PATCH/api/v1/report-views/{id}write scope

Change a saved report view

Changes a saved view; omitted fields keep their value.

ParameterTypeRequiredDescription
idstringyesId.
namestringnoView name.
routestringnoApp route the view belongs to, e.g. /dashboard.
configobjectnoView settings object (filters, columns, date range...) as the page saves them.
visibilitystringnoshared makes it visible to the workspace. One of: private, shared.
is_defaultbooleannoMake this the default view for its route.

MCP tool: update_report_view

GET/api/v1/attribution-reportread scope

Meta attribution window report for ad sets

Runs the Attribution report for ad sets of one Meta ad account over a date range (live Meta read): mode=configured uses the account's configured window, mode=compare compares one extra attribution window. Meta only; Google Ads is not included. Purchase values are in the workspace main currency.

ParameterTypeRequiredDescription
account_idstringyesNumeric Meta ad account id (without act_).
ad_set_idsstring[]yesNumeric Meta ad set ids.
sincestring (date)yesFirst day (YYYY-MM-DD).
untilstring (date)yesLast day (YYYY-MM-DD).
time_zonestringnoReport timezone (default: the key owner's timezone).
modestringnoconfigured: the account's window. compare: add one comparison window. One of: configured, compare. Default: configured.
windowsstring[]noWith mode=compare, the single comparison window (e.g. 7d_click).

MCP tool: get_attribution_report

Automation

GET/api/v1/automation-rulesread scope

List automation rules

Lists the workspace's automation rules (up to 100): name, ON/OFF status, the action they take, asset types, schedule type, folder, appearance and when they last and next run. Use get_automation_rule for a rule's full configuration and list_automation_runs for what rules did.

ParameterTypeRequiredDescription
statusstringnoOnly rules with this status. One of: ON, OFF.
folder_idstringnoOnly rules in this folder (from list_automation_folders); "root" for rules outside any folder.

MCP tool: list_automation_rules

GET/api/v1/automation-rules/schemaread scope

Get the automation rule config structure

Describes the `config` document for create/update/preview_automation_rule: rule, filter and schedule fields, the formula grammar, every metric key with its unit and time windows, the action types and their params, plus complete example configs. Call this before writing a rule.

MCP tool: get_automation_rule_schema

GET/api/v1/automation-rules/{id}read scope

Get an automation rule

Returns one automation rule with its summary and full configuration (filter formula, actions and schedule). Use list_automation_rules to find ids and get_automation_rule_schema to understand the config.

ParameterTypeRequiredDescription
idstringyesRule id from list_automation_rules.

MCP tool: get_automation_rule

GET/api/v1/automation-runsread scope

List automation run history

Lists recent automation rule executions, newest first: which rule ran, when, whether it succeeded, how many assets it processed, matched and changed, whether it was a dry run, and up to 10 per-asset details. History is kept for 180 days. Times are ISO 8601 UTC.

ParameterTypeRequiredDescription
limitintegernoPage size (1-100, default 50). Default: 50.
cursorstringnoOpaque `next_cursor` from the previous page. Omit for the first page.

MCP tool: list_automation_runs

GET/api/v1/automation-runs/policyread scope

Get the automation run history policy

Returns how long automation run history is kept (retention_days) and how many per-asset details are stored for each run (detail_limit_per_run).

MCP tool: get_automation_history_policy

GET/api/v1/automation-foldersread scope

List automation rule folders

Lists the folders that group automation rules, with how many rules (and how many are ON) each holds. Rules outside any folder are at the root (folder_id null).

MCP tool: list_automation_folders

GET/api/v1/automation-priorityread scope

List pending automation priority items

Lists assets where an automation action is queued or its provider outcome is uncertain (state waiting, uncertain or resolved). While an item is pending, manual edits to that asset are blocked. Uncertain items need reconcile_automation_priority after the user confirms in Ads Manager.

MCP tool: list_automation_priority

POST/api/v1/automation-ruleswrite scope

Create an automation rule

Creates a rule from a config document (see get_automation_rule_schema; preview it first with preview_automation_rule). It is saved OFF unless status is ON, and only touches ads live when its write_back_mode is approved. Changes live automation; confirm with the user before calling. Turning it ON is refused with 409 if it opposes another enabled rule on the same assets.

ParameterTypeRequiredDescription
namestringyesRule name (overrides config.rule.name).
configobjectyesThe rule config document { rule, filter, schedule }, exactly as get_automation_rule returns it. Structure, metric keys and examples: get_automation_rule_schema.
folder_idstringnoFolder to put the rule in (from list_automation_folders). Omit or "root" for no folder.
statusstringnoON enables the rule immediately (default OFF). One of: ON, OFF. Default: OFF.
iconstringnoLucide icon name, lowercase with dashes (default zap).
colorstringnoSix-digit hex color such as #6366f1.
emojistringnoA single emoji shown with the rule; "none" removes it.

MCP tool: create_automation_rule

PATCH/api/v1/automation-rules/{id}write scope

Update an automation rule

Changes any of name, config (the whole document replaces the old one; fetch it with get_automation_rule, edit, send it back), folder_id ("root" moves it out of its folder), status and icon/color/emoji. Fields you omit stay as they are. Changes live automation; confirm with the user before calling. A rule that is ON keeps running with the new config; saving is refused with 409 if it would oppose another enabled rule.

ParameterTypeRequiredDescription
idstringyesAutomation rule id.
namestringnoNew name (overrides config.rule.name).
configobjectnoThe rule config document { rule, filter, schedule }, exactly as get_automation_rule returns it. Structure, metric keys and examples: get_automation_rule_schema.
folder_idstringnoMove the rule to this folder; "root" for no folder.
statusstringnoSet ON or OFF while saving. One of: ON, OFF.
iconstringnoLucide icon name, lowercase with dashes (default zap).
colorstringnoSix-digit hex color such as #6366f1.
emojistringnoA single emoji shown with the rule; "none" removes it.

MCP tool: update_automation_rule

DELETE/api/v1/automation-rules/{id}write scope

Delete an automation rule

Permanently deletes a rule together with its run history. To keep the history, turn it OFF instead. Changes live automation; confirm with the user before calling.

ParameterTypeRequiredDescription
idstringyesAutomation rule id.

MCP tool: delete_automation_rule

POST/api/v1/automation-rules/{id}/duplicatewrite scope

Duplicate an automation rule

Copies a rule (same folder and appearance) as "<name> Copy", always saved OFF. Returns the new rule.

ParameterTypeRequiredDescription
idstringyesAutomation rule id to copy.

MCP tool: duplicate_automation_rule

POST/api/v1/automation-rules/{id}/statuswrite scope

Turn an automation rule on or off

LIVE CHANGE: turning a rule ON lets it start pausing, scaling or editing real ads on its schedule; turning it OFF stops it. Confirm with the user before calling. Same behavior as the toggle in Tracebird: a rule cannot be turned ON while it has opposing actions with another enabled rule on overlapping assets (HTTP 409 with the conflicting rule named in the message), and workspaces without automation access are refused. Use update_automation_rule to change the rule itself.

ParameterTypeRequiredDescription
idstringyesAutomation rule id.
statusstringyesON enables the rule, OFF disables it. One of: ON, OFF.

MCP tool: set_automation_rule_status

POST/api/v1/automation-rules/previewwrite scope

Preview an automation rule without saving it

Evaluates a draft config against the workspace's synced assets and reports which match and what the actions would change (up to 100 assets), without saving the rule or changing anything. Check `issues` and `warnings` before create_automation_rule. A POST so the config travels in the body; it needs write scope but has no side effects.

ParameterTypeRequiredDescription
configobjectyesThe rule config document { rule, filter, schedule }, exactly as get_automation_rule returns it. Structure, metric keys and examples: get_automation_rule_schema.
dry_runbooleannoAlso require a rule name, as saving does.

MCP tool: preview_automation_rule

POST/api/v1/automation-rules/{id}/runwrite scope

Run an automation rule now

Evaluates a rule that is ON immediately, like "Run now" in Tracebird, and records the run in the history (an OFF rule must be turned ON first with set_automation_rule_status). Changes live automation; confirm with the user before calling. If the rule's write_back_mode is approved it pauses, enables, renames or re-budgets real ads right away; otherwise it only records what it would do. Preview with preview_automation_rule first.

ParameterTypeRequiredDescription
idstringyesAutomation rule id.

MCP tool: run_automation_rule

POST/api/v1/automation-rules/movewrite scope

Move automation rules to a folder

Moves up to 100 rules into a folder, or out of any folder with folder_id "root". All rule ids must exist, otherwise nothing moves (404).

ParameterTypeRequiredDescription
rule_idsstring[]yesRule ids to move (1-100).
folder_idstringyesTarget folder id from list_automation_folders, or "root" for no folder.

MCP tool: move_automation_rules

POST/api/v1/automation-folderswrite scope

Create an automation folder

Creates a folder for grouping rules (name up to 80 characters, unique in the workspace, up to 500 folders). Returns the folder; use move_automation_rules or the folder_id of create_automation_rule to fill it.

ParameterTypeRequiredDescription
namestringyesFolder name.

MCP tool: create_automation_folder

PATCH/api/v1/automation-folders/{id}write scope

Rename an automation folder

Renames a folder (unique name, up to 80 characters). Its rules stay in it.

ParameterTypeRequiredDescription
idstringyesFolder id.
namestringyesNew folder name.

MCP tool: rename_automation_folder

DELETE/api/v1/automation-folders/{id}write scope

Delete an automation folder

Deletes a folder. The rules inside are not deleted: they move to the root (no folder) and keep running. Returns how many rules were moved.

ParameterTypeRequiredDescription
idstringyesFolder id.

MCP tool: delete_automation_folder

POST/api/v1/automation-priority/{id}/reconcilewrite scope

Reconcile an uncertain automation priority item

Admin only. Clears an item whose provider outcome was uncertain, after a fresh sync, so automation can be re-evaluated (the old request is never replayed). Only call it after the user confirmed in Ads Manager that the earlier request finished, and set confirm_provider_settled to true. Changes live automation; confirm with the user before calling.

ParameterTypeRequiredDescription
idstringyesPriority item id from list_automation_priority (state uncertain).
confirm_provider_settledbooleanyesMust be true: the user verified in Ads Manager that the earlier provider request has finished.

MCP tool: reconcile_automation_priority

Split tests

GET/api/v1/split-testsread scope

List split tests

Lists the workspace's landing-page split tests (up to 100, newest first): status (draft, running, paused, completed), primary metric, variants and their traffic weights, the public split link, visitor counts and the current leader with its probability of beating the control. Use get_split_test_report for full results.

ParameterTypeRequiredDescription
statusstringnoOnly tests with this status. One of: draft, running, paused, completed.

MCP tool: list_split_tests

GET/api/v1/split-tests/{id}read scope

Get a split test report

Returns a split test with per-variant results: visitors, visits, leads, appointments, shows, sales, net revenue, conversion rates, revenue per visitor, the Bayesian probability each variant beats the control and its relative lift with a 95% interval, plus the verdict, a sample-ratio-mismatch check and daily unique visitors per variant. Revenue is in `revenue_currency`.

ParameterTypeRequiredDescription
idstringyesSplit test id from list_split_tests.

MCP tool: get_split_test_report

GET/api/v1/split-tests/{id}/definitionread scope

Get a split test definition

Returns a split test's setup without results: status, variants and weights, public link, domain, assignment mode, query pass-through and auto-stop rules. Use get_split_test_report for performance.

ParameterTypeRequiredDescription
idstringyesSplit test id from list_split_tests.

MCP tool: get_split_test

POST/api/v1/split-testswrite scope

Create a split test

Creates a draft landing-page split test with 2-5 variants and returns it with its public link (`split_url`, /go/<slug> on the shared host or a custom domain). Nothing is served until it is started with start_split_test; measuring results needs the Tracebird pixel (or CRM linking) on the landing pages.

ParameterTypeRequiredDescription
namestringyesTest name.
primary_metricstringyesMetric that decides the winner. One of: lead, appointment, show, sale, revenue.
variantsobject[]yes2 to 5 landing pages. The first is the control. Weights are relative.
slugstringnoLink name for /go/<slug>: lowercase letters, numbers, dashes. Random if omitted.
domain_idstringnoConnected custom domain id (list_split_domains). Omit for the workspace default domain (or the shared host if none).
assignment_modestringnosticky: a visitor always sees one variant. rotate: after the cooldown the visitor moves to another variant. Only changeable while draft. One of: sticky, rotate.
rotate_cooldown_hoursintegernoRotate mode only: hours before a returning visitor is moved to another variant (0 = every visit).
pass_query_paramsbooleannoForward the visitor's query string (UTMs, fbclid) to the landing page. Default true.
auto_stopobjectnoAutomatic stop rules; the first met wins. Replaces all existing rules; send {} to remove them.

MCP tool: create_split_test

PATCH/api/v1/split-tests/{id}write scope

Update a split test

LIVE CHANGE: affects real visitor traffic on the public split link. Confirm with the user first. Changes only the fields you send. Variants (URLs, weights) and the assignment mode can only change while the test is a draft; afterwards only variant names, slug, domain, query pass-through and auto-stop can change. Completed tests can't be edited. Sending variants replaces the whole list (include each kept variant's id).

ParameterTypeRequiredDescription
idstringyesSplit test id from list_split_tests.
namestringnoTest name.
primary_metricstringnoMetric that decides the winner. One of: lead, appointment, show, sale, revenue.
variantsobject[]no2 to 5 landing pages. The first is the control. Weights are relative.
slugstringnoLink name for /go/<slug>: lowercase letters, numbers, dashes. Random if omitted.
domain_idstringnoConnected custom domain id (list_split_domains). Omit for the workspace default domain (or the shared host if none).
assignment_modestringnosticky: a visitor always sees one variant. rotate: after the cooldown the visitor moves to another variant. Only changeable while draft. One of: sticky, rotate.
rotate_cooldown_hoursintegernoRotate mode only: hours before a returning visitor is moved to another variant (0 = every visit).
pass_query_paramsbooleannoForward the visitor's query string (UTMs, fbclid) to the landing page. Default true.
auto_stopobjectnoAutomatic stop rules; the first met wins. Replaces all existing rules; send {} to remove them.

MCP tool: update_split_test

DELETE/api/v1/split-tests/{id}write scope

Delete a split test

LIVE CHANGE: affects real visitor traffic on the public split link. Confirm with the user first. Deletes the test; its public link stops working immediately.

ParameterTypeRequiredDescription
idstringyesSplit test id from list_split_tests.

MCP tool: delete_split_test

POST/api/v1/split-tests/{id}/duplicatewrite scope

Duplicate a split test

Copies a test's settings and variants into a new draft named "<name> (copy)" with a fresh link. Results are not copied.

ParameterTypeRequiredDescription
idstringyesSplit test id from list_split_tests.

MCP tool: duplicate_split_test

POST/api/v1/split-tests/{id}/startwrite scope

Start or resume a split test

LIVE CHANGE: affects real visitor traffic on the public split link. Confirm with the user first. Starts a draft test or resumes a paused one: the public split link begins sending real visitors to the variants.

ParameterTypeRequiredDescription
idstringyesSplit test id from list_split_tests.

MCP tool: start_split_test

POST/api/v1/split-tests/{id}/pausewrite scope

Pause a split test

LIVE CHANGE: affects real visitor traffic on the public split link. Confirm with the user first. Pauses a running test so the split link stops splitting traffic. Resume with start_split_test; end it with declare_split_test_winner.

ParameterTypeRequiredDescription
idstringyesSplit test id from list_split_tests.

MCP tool: pause_split_test

POST/api/v1/split-tests/{id}/declare-winnerwrite scope

Declare a split test winner

LIVE CHANGE: affects real visitor traffic on the public split link. Confirm with the user first. Completes the test and sends 100% of the split link's traffic to the chosen variant. Cannot be undone.

ParameterTypeRequiredDescription
idstringyesSplit test id from list_split_tests.
variant_idstringyesWinning variant id (from the test's variants).

MCP tool: declare_split_test_winner

Split domains

GET/api/v1/split-domainsread scope

List split link domains

Lists the workspace's custom split link domains with DNS/verification status, the CNAME and TXT records to create, certificate state, usage by tests and which one is the default. `available` is false when this deployment has no custom-domain support. Stale pending domains are re-checked first.

MCP tool: list_split_domains

POST/api/v1/split-domainswrite scope

Connect a split link domain

Adds a custom subdomain (e.g. go.brand.com) for split links and returns the CNAME and TXT records the user must create at their DNS host; the domain goes active once both are verified (use refresh_split_domain). Admin only. Confirm the hostname with the user.

ParameterTypeRequiredDescription
hostnamestringyesSubdomain to serve split links on, e.g. go.brand.com.
labelstringnoOptional friendly name.

MCP tool: connect_split_domain

PATCH/api/v1/split-domains/{id}write scope

Update a split link domain

Renames a domain and/or makes it the workspace default (preselected for new split tests). Admin only.

ParameterTypeRequiredDescription
idstringyesSplit domain id from list_split_domains.
labelstringnoNew friendly name (empty clears it).
is_defaultbooleannotrue makes this the default domain.

MCP tool: update_split_domain

DELETE/api/v1/split-domains/{id}write scope

Remove a split link domain

LIVE CHANGE: affects the public split links served on this domain. Confirm with the user first. Removes the domain; split tests on it fall back to the shared Tracebird link, so links already shared on this domain stop working. Admin only.

ParameterTypeRequiredDescription
idstringyesSplit domain id from list_split_domains.

MCP tool: remove_split_domain

POST/api/v1/split-domains/{id}/refreshwrite scope

Re-check a split link domain

Re-runs the DNS (CNAME + TXT ownership) and Cloudflare certificate checks and returns the updated status. Throttled to one network check per 10 seconds per domain; call it after the user has created the DNS records.

ParameterTypeRequiredDescription
idstringyesSplit domain id from list_split_domains.

MCP tool: refresh_split_domain_verification

GET/api/v1/split-domains/{id}/dns-providerread scope

Detect a domain's DNS provider

Looks up where the domain's DNS is hosted (e.g. cloudflare) so you know whether apply_split_domain_cloudflare can set up the records automatically. Read-only lookup.

ParameterTypeRequiredDescription
idstringyesSplit domain id from list_split_domains.

MCP tool: detect_split_domain_dns

POST/api/v1/split-domains/{id}/apply-cloudflarewrite scope

Create the DNS records in the user's Cloudflare zone

LIVE CHANGE: affects the public split links served on this domain. Confirm with the user first. Uses a Cloudflare API token supplied by the user (DNS edit on the domain's zone; used once, never stored) to create the CNAME and TXT records, then re-checks the domain. Admin only.

ParameterTypeRequiredDescription
idstringyesSplit domain id from list_split_domains.
cloudflare_api_tokenstringyesCloudflare API token with DNS edit permission on the domain's zone.

MCP tool: apply_split_domain_cloudflare

Conversions

GET/api/v1/conversionsread scope

List conversion events

Lists conversion events recorded from CRMs and webhooks (GoHighLevel, HubSpot, custom/Cortana/Calendly/Whop webhooks): leads, appointments, shows and sales, with value, currency, label, the ad / ad set / campaign they were attributed to and the contact (name, email, phone) when known. Ordered oldest first by when Tracebird recorded the event (`created_at`, then id), so incremental sync is: pass the newest `created_at` you saw as `created_since` and follow `next_cursor`. Events are never edited in place except that a sale can later be voided (`voided_at` set) or partly refunded (`refunded_value`); those changes do not move `created_at`, so created_since will not re-deliver them. To catch voids and refunds, periodically re-read a recent window with since/until (by `occurred_at`). Sale amounts are in the event's own `currency` (major units), not converted. Times are ISO 8601 UTC.

ParameterTypeRequiredDescription
typestringnoOnly this event type. One of: lead, appointment, show, sale.
sourcestringnoOnly events from this integration (webhook covers custom, Cortana, Calendly and Whop webhooks). One of: ghl, hubspot, webhook.
sincestring (date-time)noOnly events that occurred at or after this ISO 8601 time.
untilstring (date-time)noOnly events that occurred before this ISO 8601 time.
created_sincestring (date-time)noOnly events recorded by Tracebird at or after this time (for incremental sync).
campaign_idstringnoOnly events attributed to this campaign id.
ad_set_idstringnoOnly events attributed to this ad set id.
ad_idstringnoOnly events attributed to this ad id.
include_voidedbooleannoInclude voided sales (default true; they carry `voided_at`). Set false to hide them. Default: true.
limitintegernoPage size (1-500, default 100). Default: 100.
cursorstringnoOpaque `next_cursor` from the previous page. Omit for the first page.

MCP tool: list_conversions

POST/api/v1/conversionswrite scope

Record a lead, appointment, show or sale

Sends one conversion from your own app into Tracebird. It is attributed to an ad (via tracebird_visitor_id from the Tracebird pixel, explicit ad_id / ad_set_id / campaign_id, UTM names, or the contact's earlier lead), appears in revenue, customers and conversion reports, and is forwarded to Meta Conversions API exactly like an event from a custom inbound webhook. Idempotent: sending the same type + external_id again records nothing new and returns deduplicated: true. A sale needs value > 0 (currency defaults to the workspace currency). Link a sale to its lead by sending the same email or phone, or the lead's external_id as lead_id. Events appear under the "Tracebird API" source in Integrations.

ParameterTypeRequiredDescription
typestringyeslead, appointment, show (the person attended) or sale. One of: lead, appointment, show, sale.
external_idstringyesYour unique id for this event (lead id, booking id, order id). Idempotency key per type: resending it never duplicates.
occurred_atstring (date-time)noWhen it happened, ISO 8601. Defaults to now; must not be in the future.
valuenumbernoSale amount in major currency units (required > 0 for sales).
currencystringnoISO 4217 code for value; defaults to the workspace currency.
labelstringnoOptional name for the event, e.g. the product or call type.
emailstringnoContact email; used to match the person to an ad click and to link their lead, appointment and sale.
phonestringnoContact phone, same use as email.
namestringnoContact full name shown on the Contacts page.
ad_idstringnoMeta ad id this conversion should be credited to.
ad_set_idstringnoMeta ad set id.
campaign_idstringnoMeta campaign id.
lead_idstringnoFor appointment/show/sale: the external_id of the lead this belongs to, to inherit its ad attribution.
utm_campaignstringnoCampaign name or id from the landing URL (utm_campaign).
utm_contentstringnoAd name or id from the landing URL (utm_content).
utm_termstringnoAd set name or id from the landing URL (utm_term).
tracebird_visitor_idstringnoVisitor (tracking) id captured by the Tracebird pixel on your site; the most reliable way to attribute.

MCP tool: record_conversion

Customers

GET/api/v1/customersread scope

List customers

Lists customers: people Tracebird has linked across CRMs, webhooks, Stripe and the Tracebird pixel, with name, email, phone, first/last seen, the ad and campaign that acquired them, which sources saw them and lifetime revenue. Pages are 50 customers; follow next_cursor. Most recently active first by default. Use get_customer for one person's full journey. `revenue` is sales minus refunds summed across sources without currency conversion (mixed currencies are added as-is), so treat it as approximate when the workspace sells in several currencies.

ParameterTypeRequiredDescription
searchstringnoMatch name, email or phone (case-insensitive contains).
sourcestringnoOnly customers seen in this source. One of: pixel, ghl, hubspot, webhook, cortana, calendly, whop, stripe.
attributionstringnoattributed: acquired through a known ad. One of: attributed, unattributed.
detailsstringnoContact-detail filter. One of: has_email, has_phone, has_name, missing.
revenuestringnopaying: net revenue above zero. none: no revenue. One of: paying, none.
active_daysintegernoOnly customers with activity in the last N days.
sortstringnoSort field (default last_seen). One of: last_seen, first_seen, name, email, acquired, revenue. Default: last_seen.
dirstringnoSort direction (default desc). One of: asc, desc. Default: desc.
cursorstringnoOpaque `next_cursor` from the previous page. Omit for the first page.

MCP tool: list_customers

GET/api/v1/customers/{id}read scope

Get a customer and their journey

Returns one customer with their full timeline across ad clicks, page views, split-test exposures, leads, appointments, shows, sales, Stripe payments and refunds (newest first), including the ad that drove each step and sale amounts with currency. Use list_customers to find ids.

ParameterTypeRequiredDescription
idstringyesCustomer id from list_customers.

MCP tool: get_customer

Tracking

GET/api/v1/conversion-sourcesread scope

Conversions overview: connected sources, webhooks, attribution model and pixel

The Integrations → Conversions page: GoHighLevel, HubSpot and Whop connections (with import progress), custom/Cortana/Calendly webhook rows (receive `url` shown to admins only), the click attribution model, last-7-day totals, recent events, ads missing tracking and Tracebird pixel status. Use it to find connection ids for the other conversion-source tools.

MCP tool: get_conversions_overview

POST/api/v1/conversion-sources/webhookswrite scope

Create an inbound conversion webhook

Confirm with the user first: this changes how conversions are attributed or sent to Meta. Creates a receive URL (returned as `url`) that a CRM, Zapier or Make posts conversions to. provider `cortana` creates the Cortana row (then add its API key with connect_cortana_api); Calendly and Whop have their own connect tools. Up to 10 webhooks per provider.

ParameterTypeRequiredDescription
namestringnoDisplay name (default 'Custom webhook').
providerstringnocustom (default) or cortana. One of: custom, cortana.
default_event_typestringnoEvent type recorded when the payload does not say (default lead). One of: lead, appointment, show, sale.

MCP tool: create_inbound_webhook

PATCH/api/v1/conversion-sources/webhooks/{id}write scope

Change an inbound webhook's URL slug

Confirm with the user first: this changes how conversions are attributed or sent to Meta. Renames the slug in the webhook's receive URL; the old URL stops working immediately, so senders must be updated. Returns the new `url`.

ParameterTypeRequiredDescription
idstringyesWebhook id from get_conversions_overview.
slugstringyes3-64 letters, numbers, - or _, starting with a letter or number.

MCP tool: rename_inbound_webhook_slug

DELETE/api/v1/conversion-sources/webhooks/{id}write scope

Delete an inbound webhook

Confirm with the user first: this changes how conversions are attributed or sent to Meta. Deletes the receive URL so it stops accepting events at once; conversions it already recorded stay. Calendly rows are removed with disconnect_calendly.

ParameterTypeRequiredDescription
idstringyesWebhook id from get_conversions_overview.

MCP tool: delete_inbound_webhook

GET/api/v1/conversion-sources/{provider}/connect-urlread scope

Get the sign-in link to connect GoHighLevel, HubSpot or Whop

These CRMs connect through a browser sign-in that cannot run over the API. Returns `connect_url` plus instructions: ask a signed-in admin to open the link, then use get_conversions_overview to see the new connection. Whop can also be connected with an API key via connect_whop_with_api_key.

ParameterTypeRequiredDescription
providerstringyesWhich CRM. One of: ghl, hubspot, whop.

MCP tool: get_conversion_source_connect_url

DELETE/api/v1/conversion-sources/ghl/connections/{id}write scope

Disconnect GoHighLevel

Confirm with the user first: this changes how conversions are attributed or sent to Meta. Disconnects a GoHighLevel connection: its tokens are erased and no new conversions arrive. Recorded conversions stay. Reconnecting needs a browser sign-in (get_conversion_source_connect_url).

ParameterTypeRequiredDescription
idstringyesGoHighLevel connection id from get_conversions_overview.

MCP tool: disconnect_ghl

POST/api/v1/conversion-sources/ghl/connections/{id}/importwrite scope

Choose the GoHighLevel history import

Confirm with the user first: this changes how conversions are attributed or sent to Meta. Answers 'import past data?' for a new GoHighLevel connection: days 30, 90 or 365 starts a backfill (leads, appointments, shows, sales) that adds historical conversions and revenue; 0 skips. Advance a running import with step_ghl_import until its import status is done.

ParameterTypeRequiredDescription
idstringyesGoHighLevel connection id.
daysintegeryes0 to skip, or 30, 90 or 365 days of history.

MCP tool: choose_ghl_import

POST/api/v1/conversion-sources/ghl/connections/{id}/import/resumewrite scope

Resume a failed GoHighLevel import

Picks a failed GoHighLevel import back up where it stopped (progress kept). Errors if there is no failed import to resume.

ParameterTypeRequiredDescription
idstringyesGoHighLevel connection id.

MCP tool: resume_ghl_import

POST/api/v1/conversion-sources/ghl/import/stepwrite scope

Advance running GoHighLevel imports

Runs one bounded batch of every running GoHighLevel import in the workspace (the app does this while the page is open; an hourly job also finishes imports). Call repeatedly, checking get_conversions_overview for the import status.

MCP tool: step_ghl_import

DELETE/api/v1/conversion-sources/hubspot/connections/{id}write scope

Disconnect HubSpot

Confirm with the user first: this changes how conversions are attributed or sent to Meta. Disconnects a HubSpot connection: its tokens are erased and no new conversions arrive. Recorded conversions stay. Reconnecting needs a browser sign-in (get_conversion_source_connect_url).

ParameterTypeRequiredDescription
idstringyesHubSpot connection id from get_conversions_overview.

MCP tool: disconnect_hubspot

POST/api/v1/conversion-sources/hubspot/connections/{id}/importwrite scope

Choose the HubSpot history import

Confirm with the user first: this changes how conversions are attributed or sent to Meta. Answers 'import past data?' for a new HubSpot connection: days 30, 90 or 365 starts a backfill (leads, appointments, shows, sales) that adds historical conversions and revenue; 0 skips. Advance a running import with step_hubspot_import until its import status is done.

ParameterTypeRequiredDescription
idstringyesHubSpot connection id.
daysintegeryes0 to skip, or 30, 90 or 365 days of history.

MCP tool: choose_hubspot_import

POST/api/v1/conversion-sources/hubspot/connections/{id}/import/resumewrite scope

Resume a failed HubSpot import

Picks a failed HubSpot import back up where it stopped (progress kept). Errors if there is no failed import to resume.

ParameterTypeRequiredDescription
idstringyesHubSpot connection id.

MCP tool: resume_hubspot_import

POST/api/v1/conversion-sources/hubspot/import/stepwrite scope

Advance running HubSpot imports

Runs one bounded batch of every running HubSpot import in the workspace (the app does this while the page is open; an hourly job also finishes imports). Call repeatedly, checking get_conversions_overview for the import status.

MCP tool: step_hubspot_import

POST/api/v1/conversion-sources/whop/connectionswrite scope

Connect Whop with an API key

Confirm with the user first: this changes how conversions are attributed or sent to Meta. Connects a Whop company with an API key (needs payment:basic:read and member:email:read; developer:manage_webhook enables real-time events) and imports the last 30 days of payments as sales. Returns an optional `warning`. For one-click OAuth use get_conversion_source_connect_url.

ParameterTypeRequiredDescription
api_keystringyesWhop API key (never echoed back).
company_idstringyesWhop company id like biz_XXXXXXXX.

MCP tool: connect_whop_with_api_key

POST/api/v1/conversion-sources/whop/connections/{id}/syncwrite scope

Sync a Whop connection now

Pulls new Whop payments and refunds right away instead of waiting for the hourly sync. Fails if Whop is turned off in Integrations.

ParameterTypeRequiredDescription
idstringyesWhop connection id from get_conversions_overview.

MCP tool: sync_whop

DELETE/api/v1/conversion-sources/whop/connections/{id}write scope

Disconnect Whop

Confirm with the user first: this changes how conversions are attributed or sent to Meta. Disconnects a Whop company: its credentials and webhook are removed and no new payments arrive. Recorded sales stay.

ParameterTypeRequiredDescription
idstringyesWhop connection id from get_conversions_overview.

MCP tool: disconnect_whop

POST/api/v1/conversion-sources/cortana/apiwrite scope

Save the Cortana API key

Confirm with the user first: this changes how conversions are attributed or sent to Meta. Validates and stores a Cortana REST API key and business id on the Cortana webhook row (create it first with create_inbound_webhook, provider cortana). Enables history import and hourly catch-up of missed deliveries.

ParameterTypeRequiredDescription
api_keystringyesCortana API key (never echoed back).
business_idstringyesBusiness id from the Cortana dashboard URL (app.usecortana.ai/business/<id>).

MCP tool: connect_cortana_api

DELETE/api/v1/conversion-sources/cortana/apiwrite scope

Remove the Cortana API key

Erases the stored Cortana API key and business id. The Cortana webhook URL keeps working; delete it with delete_inbound_webhook.

MCP tool: remove_cortana_api

POST/api/v1/conversion-sources/cortana/importwrite scope

Import Cortana history

Confirm with the user first: this changes how conversions are attributed or sent to Meta. Starts (days 7, 30 or 90) or continues (days 0) a Cortana history import and runs one bounded step. Call repeatedly until the result's `done` is true.

ParameterTypeRequiredDescription
daysintegeryes7, 30 or 90 to start a new import; 0 continues the running one.

MCP tool: import_cortana_history

POST/api/v1/conversion-sources/calendly/connectionwrite scope

Connect Calendly with a personal access token

Confirm with the user first: this changes how conversions are attributed or sent to Meta. Connects Calendly with a Personal Access Token (Calendly paid plan required): Tracebird subscribes to bookings and cancellations and records them as appointments. One Calendly connection per workspace.

ParameterTypeRequiredDescription
tokenstringyesCalendly Personal Access Token (never echoed back).

MCP tool: connect_calendly

DELETE/api/v1/conversion-sources/calendly/connectionwrite scope

Disconnect Calendly

Confirm with the user first: this changes how conversions are attributed or sent to Meta. Removes the Calendly connection and its webhook subscription (best effort). Recorded appointments stay.

MCP tool: disconnect_calendly

GET/api/v1/attribution-modelread scope

Get the CRM click attribution model

Returns whether GoHighLevel and HubSpot conversions are credited to the contact's first click or last click (first_click is the default).

MCP tool: get_attribution_model

PATCH/api/v1/attribution-modelwrite scope

Set the CRM click attribution model

Confirm with the user first: this changes how conversions are attributed or sent to Meta. Switches GoHighLevel and HubSpot between first-click and last-click credit and re-credits past conversions to the other touch, which changes ad-level conversion and revenue numbers everywhere. Returns how many events were swapped.

ParameterTypeRequiredDescription
modelstringyesfirst_click or last_click. One of: first_click, last_click.

MCP tool: set_attribution_model

GET/api/v1/pixelread scope

Get the Tracebird pixel install snippet and status

Returns the workspace pixel: the install snippet to paste in the site head, the allowed website domains, event counts and collection health, and the latest installation test (its `test_urls` to open and whether the site reported back). The pixel is created when the first domain is saved with update_pixel_domains.

MCP tool: get_pixel

PATCH/api/v1/pixelwrite scope

Save the pixel's allowed website domains

Confirm with the user first: this changes how conversions are attributed or sent to Meta. Replaces the website domains allowed to send pixel events (domain only, e.g. example.com; www is covered). Creates the pixel on first save. Events from other domains are rejected, so removing a domain stops its tracking. Returns the updated pixel.

ParameterTypeRequiredDescription
domainsstring[]yesWebsite domains, e.g. ["example.com"].

MCP tool: update_pixel_domains

POST/api/v1/pixel/install-testwrite scope

Start a pixel installation test

Issues a fresh test nonce for the next 15 minutes. Open one of the returned `test_urls` in a browser with the snippet installed, then poll get_pixel until `install_test.seen` is true. Needs at least one saved domain.

MCP tool: start_pixel_install_test

GET/api/v1/conversion-definitionsread scope

List named conversions

Lists the Tracking & Conversions definitions (name, matched event types / sources / names, Meta event, enabled) with last-90-day counts, plus `can_manage` and whether forwarding to Meta (`capi_enabled`) is on.

MCP tool: list_conversion_definitions

GET/api/v1/conversion-definitions/sourcesread scope

List sources and names a conversion can match

Every connection that sent conversions in the last 90 days with the event types and names (forms, calendars, products) it sent. Use the `key` values in a definition's `sources`.

MCP tool: list_conversion_sources_for_definitions

GET/api/v1/conversion-definitions/feedread scope

Conversion activity feed with Meta delivery status

Recent conversion events with which named conversions matched and the Meta delivery status of each. Offset paged.

ParameterTypeRequiredDescription
daysintegernoWindow: 1, 7, 14, 30 or 90 days (other values fall back to 14). Default: 14.
definition_idstringnoOnly events matching this conversion.
sourcestringnoOnly this source key.
offsetintegernoRows to skip (up to 10,000; for a full export page list_conversions instead). Default: 0.
limitintegernoPage size (1-100). Default: 25.

MCP tool: get_conversion_activity_feed

POST/api/v1/conversion-definitionswrite scope

Create a named conversion

Confirm with the user first: this changes how conversions are attributed or sent to Meta. Defines a conversion (event types + optional sources and names) and the Meta event it is sent as when forwarding to Meta is on.

ParameterTypeRequiredDescription
namestringyesConversion name.
descriptionstringnoOptional note.
event_typesstring[]yesEvent types it matches (at least one): lead, appointment, show, sale.
sourcesstring[]noSource keys '<source>:<connection id>' from list_conversion_sources_for_definitions; empty matches any source.
labelsstring[]noExact form, calendar or product names; empty matches any.
meta_event_namestringnoMeta standard event (e.g. Lead, Purchase) or a custom event name to send; omit to send nothing.

MCP tool: create_conversion_definition

PATCH/api/v1/conversion-definitions/{id}write scope

Update a named conversion

Confirm with the user first: this changes how conversions are attributed or sent to Meta. Replaces the definition's fields (send all of name, event_types, sources, labels, meta_event_name as returned by list_conversion_definitions); omitted optional fields are cleared.

ParameterTypeRequiredDescription
idstringyesConversion definition id.
namestringyesConversion name.
descriptionstringnoOptional note.
event_typesstring[]yesEvent types it matches (at least one): lead, appointment, show, sale.
sourcesstring[]noSource keys '<source>:<connection id>' from list_conversion_sources_for_definitions; empty matches any source.
labelsstring[]noExact form, calendar or product names; empty matches any.
meta_event_namestringnoMeta standard event (e.g. Lead, Purchase) or a custom event name to send; omit to send nothing.

MCP tool: update_conversion_definition

PATCH/api/v1/conversion-definitions/{id}/enabledwrite scope

Enable or disable a named conversion

Confirm with the user first: this changes how conversions are attributed or sent to Meta. Turns a conversion on or off; a disabled conversion stops being sent to Meta.

ParameterTypeRequiredDescription
idstringyesConversion definition id.
enabledbooleanyestrue to enable, false to disable.

MCP tool: set_conversion_definition_enabled

POST/api/v1/conversion-definitions/{id}/duplicatewrite scope

Duplicate a named conversion

Confirm with the user first: this changes how conversions are attributed or sent to Meta. Creates a copy named '<name> (copy)' with the same matching and Meta event, so it will send duplicate Meta events until edited or disabled.

ParameterTypeRequiredDescription
idstringyesConversion definition id.

MCP tool: duplicate_conversion_definition

DELETE/api/v1/conversion-definitions/{id}write scope

Delete a named conversion

Confirm with the user first: this changes how conversions are attributed or sent to Meta. Deletes the definition; it is no longer sent to Meta. Recorded conversion events are untouched.

ParameterTypeRequiredDescription
idstringyesConversion definition id.

MCP tool: delete_conversion_definition

POST/api/v1/conversion-definitions/retry-deliverywrite scope

Retry a failed Meta conversion delivery

Confirm with the user first: this changes how conversions are attributed or sent to Meta. Re-queues a conversion event's failed Meta Conversions API deliveries and sends them now. Needs forwarding to Meta turned on.

ParameterTypeRequiredDescription
refstringyesThe event's `ref` from get_conversion_activity_feed.

MCP tool: retry_meta_delivery

Revenue settings

GET/api/v1/offersread scope

List revenue offers with funnel stage

Settings → Revenue offers, grouped by source: products and prices with their own tag (`stage`: front_end, back_end or null for automatic), `effective_stage`, suggested stage, price, and 90-day sales and revenue. Includes the funnel settings (back-end threshold). Use the offer `key` with set_offer_stage.

MCP tool: list_offers

PATCH/api/v1/offers/stagewrite scope

Tag an offer front-end or back-end

Confirm with the user first: this changes how revenue is attributed and the front-end / back-end figures on dashboards. Sets an offer's funnel stage; `auto` returns it to automatic (the price threshold decides). Dashboard snapshots are refreshed.

ParameterTypeRequiredDescription
offer_keystringyesOffer `key` from list_offers.
stagestringyesfront_end, back_end, or auto. One of: front_end, back_end, auto.

MCP tool: set_offer_stage

GET/api/v1/revenue-streamsread scope

List revenue streams and what each counts as

Settings → Revenue sources: each payment / deal stream (Stripe account, Whop company, GoHighLevel, HubSpot, webhook) with its `role` (split, threshold, front_end, back_end, none), whether it is automatic, its threshold, 90-day sales and the Stripe-copy check. Use `id` with set_revenue_stream_role.

MCP tool: list_revenue_streams

PATCH/api/v1/revenue-streams/rolewrite scope

Set what a revenue stream counts as

Confirm with the user first: this changes how revenue is attributed and the front-end / back-end figures on dashboards. Sets a stream's role: split (both stages, offers by tag/threshold), threshold (both stages, every sale by this stream's own threshold), front_end, back_end, none (ignored), or auto. `threshold` (major currency units) applies only to role threshold.

ParameterTypeRequiredDescription
stream_idstringyesStream `id` from list_revenue_streams.
rolestringyesRole, or auto for the automatic choice. One of: split, threshold, front_end, back_end, none, auto.
thresholdnumbernoBack-end threshold for role threshold.

MCP tool: set_revenue_stream_role

GET/api/v1/revenue-settingsread scope

Get revenue settings

Returns the back-end price threshold, the front-end / back-end revenue source settings, the revenue `attribution_model` (which ad a sale is credited to) and the workspace revenue source of truth (auto, stripe, crm or facebook).

MCP tool: get_revenue_settings

PATCH/api/v1/revenue-settingswrite scope

Update revenue settings

Confirm with the user first: this changes how revenue is attributed and the front-end / back-end figures on dashboards. Sets the back-end price threshold (major currency units; sales at or above it count as back end), the revenue attribution model (which ad each sale's revenue is credited to; separate from the CRM click model in set_attribution_model) and/or the workspace revenue source of truth used by dashboards. Send at least one field.

ParameterTypeRequiredDescription
backend_thresholdnumbernoBack-end threshold.
attribution_modelstringnolast_click (default, matches Cortana), first_click or smart. One of: last_click, first_click, smart.
revenue_source_preferencestringnoauto, stripe, crm or facebook. One of: auto, stripe, crm, facebook.

MCP tool: update_revenue_settings

Integrations

GET/api/v1/integrationsread scope

Catalog of every integration with its connection status

Lists every integration Tracebird offers (ad platforms, attribution, payments, CRMs, analytics, data sources, tracking) with connection status, account name, last sync, errors and paused state, like the Integrations page. CRM and data-source integrations are only summarised here; manage them with their own tools.

MCP tool: list_integrations

GET/api/v1/integrations/{provider}read scope

Details of one integration

Returns one integration's status and details: ad accounts with their enabled flag and stored counts (facebook, google_ads), key preview (hyros), connected accounts and 90-day payment totals (stripe), properties (google_analytics), projects and cached-snapshot state (microsoft_clarity) or settings and delivery stats (meta_capi). Secrets are never returned.

ParameterTypeRequiredDescription
providerstringyesIntegration id as listed by list_integrations (for example facebook, google_ads, hyros, stripe, google_analytics, microsoft_clarity, meta_capi).

MCP tool: get_integration

GET/api/v1/integration-syncs/recentread scope

Last 20 syncs of the ad platforms and HYROS

Returns the 20 most recent sync runs of Facebook, Google Ads and HYROS (status, message, records read, timings). For full filterable history use list_sync_history.

MCP tool: list_recent_sync_runs

GET/api/v1/integration-syncs/historyread scope

Filterable sync history across integrations

Lists past sync runs of every integration, newest first, filtered by provider, status, sync type and time window (the Settings sync history table). Paginate with cursor.

ParameterTypeRequiredDescription
providerstringnoOnly this integration's runs. One of: facebook, hyros, stripe, ghl, hubspot, google_sheets, webhook, cortana, google_ads, calendly, whop, supabase, bigquery, bigquery_export.
statusstringnoOnly runs with this outcome. One of: success, partial, error.
sync_typestringnoOnly this kind of run: manual, scheduled, backfill, on_demand, webhook_event or unknown. One of: unknown, manual, scheduled, backfill, on_demand, webhook_event.
sincestring (date-time)noOnly runs started at or after this ISO 8601 time.
untilstring (date-time)noOnly runs started at or before this ISO 8601 time.
limitintegernoPage size (1-100, default 25). Default: 25.
cursorstringnoOpaque `next_cursor` from the previous page.

MCP tool: list_sync_history

POST/api/v1/integrations/{provider}/syncwrite scope

Sync an integration now

Starts a manual sync for facebook, google_ads, hyros or stripe and waits for it to finish, like "Sync now" in the app. Refused while the integration is turned off or already syncing. Stripe also accepts connection_id (one account) and sync_type backfill.

ParameterTypeRequiredDescription
providerstringyesIntegration id as listed by list_integrations (for example facebook, google_ads, hyros, stripe, google_analytics, microsoft_clarity, meta_capi).
connection_idstringnoStripe only: sync just this connected Stripe account (see get_integration for stripe).
sync_typestringnoStripe only: manual (default) or backfill. One of: manual, backfill.

MCP tool: sync_integration

POST/api/v1/integrations/{provider}/cancel-syncwrite scope

Stop a running sync

Stops a running facebook, google_ads or hyros sync; it exits cleanly at its next step. Confirm with the user before calling. Returns stopped=false when nothing was running.

ParameterTypeRequiredDescription
providerstringyesIntegration id as listed by list_integrations (for example facebook, google_ads, hyros, stripe, google_analytics, microsoft_clarity, meta_capi).

MCP tool: cancel_integration_sync

POST/api/v1/integrations/{provider}/pausewrite scope

Turn an integration off without disconnecting it

Stops syncing an integration but keeps its data and connection ("Turn off" in the app). mode "all" (default) also hides its data and defers automations; mode "sync" (ghl, hubspot, whop, stripe only) keeps webhooks live. Confirm with the user before calling. Undo with resume_integration.

ParameterTypeRequiredDescription
providerstringyesIntegration id as listed by list_integrations (for example facebook, google_ads, hyros, stripe, google_analytics, microsoft_clarity, meta_capi).
modestringnoall (default) or sync; sync is only valid for ghl, hubspot, whop and stripe. One of: sync, all.

MCP tool: pause_integration

POST/api/v1/integrations/{provider}/resumewrite scope

Turn a paused integration back on

Resumes a paused integration; it becomes due for sync immediately and backfills the gap. Does nothing if it was not paused.

ParameterTypeRequiredDescription
providerstringyesIntegration id as listed by list_integrations (for example facebook, google_ads, hyros, stripe, google_analytics, microsoft_clarity, meta_capi).

MCP tool: resume_integration

POST/api/v1/integrations/{provider}/connectwrite scope

Get the link a signed-in admin opens to connect an OAuth integration

Browser sign-in (OAuth) cannot happen over the API. For facebook, google_ads, google_analytics or stripe this returns connect_url (Tracebird's Integrations page) and instructions for the user to finish; every later step (choosing accounts or a property, sync, disconnect) has its own tool. API-key integrations connect directly with save_hyros_api_key, connect_microsoft_clarity and save_meta_capi_settings.

ParameterTypeRequiredDescription
providerstringyesIntegration id as listed by list_integrations (for example facebook, google_ads, hyros, stripe, google_analytics, microsoft_clarity, meta_capi).

MCP tool: get_integration_connect_url

GET/api/v1/integrations/{provider}/ad-account-choicesread scope

Ad accounts the connected login can access

Lists the ad accounts (facebook) or customers (google_ads) the connected login can pick from, queried live from the platform, with selected_ids showing the ones already tracked. Requires the platform to be connected first (get_integration_connect_url).

ParameterTypeRequiredDescription
providerstringyesIntegration id as listed by list_integrations (for example facebook, google_ads, hyros, stripe, google_analytics, microsoft_clarity, meta_capi).

MCP tool: list_ad_account_choices

POST/api/v1/integrations/{provider}/ad-accountswrite scope

Start tracking ad accounts

Adds the chosen ad accounts (ids from list_ad_account_choices) to the workspace for facebook or google_ads and starts their first sync; the plan's ad account limit applies. Confirm with the user before calling. This begins pulling that account's data into Tracebird.

ParameterTypeRequiredDescription
providerstringyesIntegration id as listed by list_integrations (for example facebook, google_ads, hyros, stripe, google_analytics, microsoft_clarity, meta_capi).
account_idsstring[]yesAd account ids from list_ad_account_choices.

MCP tool: select_ad_accounts

DELETE/api/v1/integrations/{provider}/ad-accounts/{account_id}write scope

Stop tracking an ad account and delete its data

Removes an ad account from facebook or google_ads and permanently deletes everything synced from it (campaigns, ad sets, ads, daily metrics). Confirm with the user before calling. This cannot be undone; to only pause it use set_ad_account_enabled.

ParameterTypeRequiredDescription
providerstringyesIntegration id as listed by list_integrations (for example facebook, google_ads, hyros, stripe, google_analytics, microsoft_clarity, meta_capi).
account_idstringyesAd account id as listed by get_integration / list_ad_accounts (for example act_123 or gads:1234567890).

MCP tool: remove_ad_account

PATCH/api/v1/integrations/{provider}/ad-accounts/{account_id}write scope

Enable or disable an ad account in Tracebird

Turns a tracked ad account on or off for facebook or google_ads. Disabling stops syncing it and deletes its synced data; enabling checks the plan's account limit and the live plan. Confirm with the user before calling. Disabling removes data from Tracebird (not from the ad platform).

ParameterTypeRequiredDescription
providerstringyesIntegration id as listed by list_integrations (for example facebook, google_ads, hyros, stripe, google_analytics, microsoft_clarity, meta_capi).
account_idstringyesAd account id as listed by get_integration / list_ad_accounts (for example act_123 or gads:1234567890).
enabledbooleanyestrue to enable, false to disable.

MCP tool: set_ad_account_enabled

POST/api/v1/integrations/hyros/api-keywrite scope

Connect HYROS with an API key

Validates the HYROS API key against HYROS, stores it encrypted (only a preview is ever shown again) and runs the first sync. Replaces any existing key. Requires a paid plan. Confirm with the user before calling.

ParameterTypeRequiredDescription
api_keystringyesThe HYROS API key.

MCP tool: save_hyros_api_key

DELETE/api/v1/integrations/{provider}write scope

Disconnect an integration and delete its synced data

Disconnects facebook, google_ads, hyros, google_analytics, microsoft_clarity or meta_capi: deletes the stored credential and the data synced with it, and stops syncing. Confirm with the user before calling. This cannot be undone; to only stop syncing use pause_integration. For Stripe use disconnect_stripe_connection.

ParameterTypeRequiredDescription
providerstringyesIntegration id as listed by list_integrations (for example facebook, google_ads, hyros, stripe, google_analytics, microsoft_clarity, meta_capi).

MCP tool: disconnect_integration

GET/api/v1/integrations/google_analytics/propertiesread scope

Google Analytics properties the connected login can use

Lists the GA4 properties available to the connected Google account (queried live). Requires Google Analytics to be connected first (get_integration_connect_url).

MCP tool: list_google_analytics_properties

POST/api/v1/integrations/google_analytics/propertywrite scope

Add a Google Analytics property

Selects the GA4 property (id from list_google_analytics_properties) to the properties whose reports Tracebird shows; earlier properties stay connected. Confirm with the user before calling.

ParameterTypeRequiredDescription
property_idstringyesNumeric GA4 property id.

MCP tool: select_google_analytics_property

POST/api/v1/integrations/microsoft_clarity/tokenwrite scope

Connect a Microsoft Clarity project with a Data Export API token

Validates the Clarity Data Export API token (one per Clarity project) by fetching a real snapshot, then stores it encrypted (never shown again). Adds a project, or replaces the token of project_id. Confirm with the user before calling.

ParameterTypeRequiredDescription
tokenstringyesClarity Data Export API token (no whitespace).
namestringnoLabel for the project, e.g. the site name.
project_idstringnoExisting project id (from get_microsoft_clarity_snapshot) whose token to replace.

MCP tool: connect_microsoft_clarity

GET/api/v1/integrations/microsoft_clarity/snapshotread scope

Cached Microsoft Clarity UX snapshot

Returns each connected Clarity project with its cached 3-day UX snapshot (sessions, rage and dead clicks, scroll depth, top pages) and connection state. Snapshots refresh from Clarity at most every 6 hours.

MCP tool: get_microsoft_clarity_snapshot

GET/api/v1/integrations/stripe/connectionsread scope

Connected Stripe accounts

Lists the connected Stripe accounts used for conversions (account, live or test mode, last sync, warnings, whether history backfill finished and a sync is running).

MCP tool: list_stripe_connections

DELETE/api/v1/integrations/stripe/connections/{connection_id}write scope

Disconnect one Stripe account and delete its imported data

Removes one connected Stripe account and only the payments, refunds and metrics imported from it. Confirm with the user before calling. This cannot be undone. Connection ids come from list_stripe_connections.

ParameterTypeRequiredDescription
connection_idstringyesStripe connection id from list_stripe_connections.

MCP tool: disconnect_stripe_connection

GET/api/v1/integrations/meta_capi/settingsread scope

Meta Conversions API settings and delivery stats

Returns whether leads and sales are forwarded to a Meta dataset: dataset id, whether an own token is set (never the token), test event code, which events are sent, 7-day delivery stats and the last error. settings is null when it is off.

MCP tool: get_meta_capi_settings

GET/api/v1/integrations/meta_capi/datasetsread scope

Meta datasets (pixels) available for the Conversions API

Lists the Meta datasets (pixels) owned by the connected Facebook ad accounts, queried live. Empty when Facebook is not connected.

MCP tool: list_meta_capi_datasets

POST/api/v1/integrations/meta_capi/settingswrite scope

Turn on or update Meta Conversions API forwarding

Saves the Meta dataset and which events (leads, purchases) are forwarded server-side. The optional dataset token is write-only; omit it to use the Facebook connection or keep the stored one. Confirm with the user before calling. This sends customer conversion data to Meta.

ParameterTypeRequiredDescription
dataset_idstringyesMeta dataset (pixel) id, digits only.
tokenstringnoOptional dataset access token (no whitespace); write-only.
clear_tokenbooleannotrue removes a stored token so the Facebook connection is used instead.
test_event_codestringnoOptional Meta test event code.
send_leadsbooleannoForward leads (default true). Default: true.
send_purchasesbooleannoForward purchases (default true). Default: true.

MCP tool: save_meta_capi_settings

GET/api/v1/integrations/meta_capi/deliveriesread scope

Recent Meta Conversions API deliveries

Lists the most recent events forwarded to Meta (source_ref, event name, status sent / failed / skipped, attempts, last error), newest first. Use the source_ref of a failed one with retry_meta_capi_delivery.

ParameterTypeRequiredDescription
statusstringnoOnly deliveries with this status. One of: sent, failed, skipped.
limitintegernoHow many (1-200, default 50). Default: 50.

MCP tool: list_meta_capi_deliveries

POST/api/v1/integrations/meta_capi/retrywrite scope

Retry a failed Meta Conversions API delivery

Re-queues one failed delivery and sends pending events to Meta right away, like Retry in the app. Confirm with the user before calling. Fails when forwarding is off or the delivery is not in a failed state.

ParameterTypeRequiredDescription
source_refstringyessource_ref of a failed delivery from list_meta_capi_deliveries.

MCP tool: retry_meta_capi_delivery

Google Sheets

GET/api/v1/data-sourcesread scope

List connected Google Sheets

Lists the Google Sheets lookup tables connected to the workspace (up to 5) with their columns, mode, row count, sync status and the rule fields they provide.

MCP tool: list_data_sources

GET/api/v1/data-sources/fieldsread scope

List sheet fields usable in rules

Flat list of the {sheet_*} fields that connected Google Sheets expose to automation rules and formulas.

MCP tool: list_data_source_fields

GET/api/v1/data-sources/issuesread scope

List Google Sheet problems

Problems with connected sheets: unreadable sheets, degraded matches and rules that point at columns that no longer exist.

MCP tool: list_data_source_issues

GET/api/v1/data-sources/{id}read scope

Get a connected Google Sheet

One connected Google Sheet with its columns, mode, match column, status and last error.

ParameterTypeRequiredDescription
idstringyesData source id, as returned by list_data_sources.

MCP tool: get_data_source

GET/api/v1/data-sources/{id}/rowsread scope

Preview rows of a Google Sheet

The first rows of the synced copy of a sheet (default 25, max 100), as column to value maps.

ParameterTypeRequiredDescription
idstringyesData source id, as returned by list_data_sources.
limitintegernoRows to return (default 25).

MCP tool: preview_data_source_rows

POST/api/v1/data-sourceswrite scope

Connect a Google Sheet

Connects a Google Sheet shared as 'anyone with the link can view' and imports its rows (max 5 sheets per workspace). Mode defaults to what the sheet's shape suggests; match_column applies to lookup mode.

ParameterTypeRequiredDescription
urlstringyesGoogle Sheets link, e.g. https://docs.google.com/spreadsheets/d/<id>/edit?gid=0 (the gid selects the tab).
namestringnoDisplay name (default 'Google Sheet N').
modestringnolookup: rows describe ads/campaigns and are matched by id or name. global: the first row applies to every asset. One of: lookup, global.
match_columnstringnoColumn whose values identify the asset (id or name) in lookup mode. Defaults to the first column.

MCP tool: connect_data_source

PATCH/api/v1/data-sources/{id}write scope

Update a Google Sheet's name, mode or match column

Renames a connected sheet, switches its mode, or changes the column used to match rows to ads. Changing the match column re-indexes the synced rows.

ParameterTypeRequiredDescription
idstringyesData source id, as returned by list_data_sources.
namestringnoNew display name.
modestringnolookup: rows describe ads/campaigns and are matched by id or name. global: the first row applies to every asset. One of: lookup, global.
match_columnstringnoExisting column to match rows on.

MCP tool: update_data_source

POST/api/v1/data-sources/{id}/refreshwrite scope

Refresh a Google Sheet now

Re-downloads the sheet immediately. A failed download is recorded on the source (status and error) and returned rather than raised.

ParameterTypeRequiredDescription
idstringyesData source id, as returned by list_data_sources.

MCP tool: refresh_data_source

DELETE/api/v1/data-sources/{id}write scope

Remove a Google Sheet

Removes a connected sheet and its synced rows. Rules that use its fields stop matching; the response lists them. Confirm with the user before calling.

ParameterTypeRequiredDescription
idstringyesData source id, as returned by list_data_sources.

MCP tool: delete_data_source

Supabase

GET/api/v1/supabaseread scope

Supabase source status

Connection state of the Supabase Facebook Ads source: project, mapping, last sync, errors, and whether one-click OAuth sign-in is available. Secrets are never returned.

MCP tool: get_supabase_status

GET/api/v1/supabase/connect-urlread scope

Get the Supabase sign-in link

Returns the link where a workspace admin signs in with Supabase in a browser (OAuth cannot run over the API). Afterwards use list_supabase_projects and select_supabase_project. Alternatively connect with a project URL and key.

MCP tool: get_supabase_connect_url

POST/api/v1/supabase/connectwrite scope

Connect Supabase with a project URL and key

Verifies the key can read the schema, stores it encrypted and returns the discovered tables with a suggested mapping. Finish with save_supabase_mapping.

ParameterTypeRequiredDescription
project_urlstringyesSupabase project URL, e.g. https://abcdefgh.supabase.co.
api_keystringyesSupabase anon, publishable or read-only service key. Stored encrypted, never returned.
schemastringnoPostgres schema to read (default public).

MCP tool: connect_supabase_with_key

GET/api/v1/supabase/projectsread scope

List Supabase projects after sign-in

Projects available to the Supabase account that signed in through the connect link. Requires that sign-in to have happened first.

MCP tool: list_supabase_projects

POST/api/v1/supabase/select-projectwrite scope

Pick the Supabase project to read

After sign-in, selects a project by ref; its key is fetched and stored encrypted. Returns the discovered tables with a suggested mapping.

ParameterTypeRequiredDescription
refstringyesProject ref from list_supabase_projects.
schemastringnoPostgres schema to read (default public).

MCP tool: select_supabase_project

GET/api/v1/supabase/tablesread scope

Discover Supabase tables and the mapping shape

Tables and columns of the connected project, a suggested mapping, the saved mapping, and mapping_shape describing every mappable entity and field. Projects that hide their schema return no tables; use get_supabase_table_columns.

ParameterTypeRequiredDescription
schemastringnoPostgres schema to read (default public).

MCP tool: list_supabase_tables

GET/api/v1/supabase/columnsread scope

List the columns of a Supabase table

Columns of one table, read from a sample row; for projects that do not expose their schema description.

ParameterTypeRequiredDescription
tablestringyesTable name.
schemastringnoPostgres schema to read (default public).

MCP tool: get_supabase_table_columns

POST/api/v1/supabase/mappingwrite scope

Save the Supabase table mapping

Imported rows overwrite this workspace's Facebook ad data (campaigns, ad sets, ads and daily metrics) like a Meta sync, so confirm with the user before calling. Validates and saves which tables and columns hold campaigns, ad sets, ads and daily metrics, marks the source connected and starts the first import in the background.

ParameterTypeRequiredDescription
mappingobjectyesTable mapping document. Get the shape and suggestions from the tables/datasets operation (mapping_shape and suggested); pass the suggested mapping back, adjusted if needed.

MCP tool: save_supabase_mapping

POST/api/v1/supabase/syncwrite scope

Sync Supabase now

Imported rows overwrite this workspace's Facebook ad data (campaigns, ad sets, ads and daily metrics) like a Meta sync, so confirm with the user before calling. Reads the mapped tables immediately (it also runs hourly). Returns a summary message and the rows read.

MCP tool: sync_supabase

DELETE/api/v1/supabasewrite scope

Disconnect Supabase

Removes the stored Supabase credentials and stops syncing. Already imported ad data stays. Confirm with the user before calling.

MCP tool: disconnect_supabase

BigQuery

GET/api/v1/bigqueryread scope

BigQuery source status

Connection state of the BigQuery Facebook Ads source: account, project, dataset, mapping, last sync, errors, and whether Google sign-in is available. Credentials are never returned.

MCP tool: get_bigquery_status

GET/api/v1/bigquery/connect-urlread scope

Get the Google sign-in link for BigQuery

Returns the link where a workspace admin signs in with Google (bigquery.readonly) in a browser; OAuth cannot run over the API. Afterwards list projects and datasets. Alternatively connect with a service-account key.

MCP tool: get_bigquery_connect_url

POST/api/v1/bigquery/connectwrite scope

Connect BigQuery with a service-account key

Verifies the service-account key JSON by fetching a token, then stores it encrypted. Next list projects and datasets and select a dataset.

ParameterTypeRequiredDescription
key_jsonstringyesContents of the service-account JSON key file. Stored encrypted, never returned.

MCP tool: connect_bigquery_with_service_account

GET/api/v1/bigquery/projectsread scope

List BigQuery projects

Google Cloud projects the connected credentials can read.

MCP tool: list_bigquery_projects

GET/api/v1/bigquery/datasetsread scope

List datasets of a BigQuery project

Lists the BigQuery datasets in one Google Cloud project that the connected credentials can read.

ParameterTypeRequiredDescription
projectstringyesProject id from list_bigquery_projects.

MCP tool: list_bigquery_datasets

POST/api/v1/bigquery/select-datasetwrite scope

Pick the BigQuery dataset to read

Saves the project and dataset and returns its tables with a suggested mapping, the saved mapping and mapping_shape. Re-selecting the same dataset keeps the mapping; another dataset clears it. Call again any time to re-list tables.

ParameterTypeRequiredDescription
projectstringyesProject id.
datasetstringyesDataset id.
locationstringnoDataset location, e.g. US or EU (optional).

MCP tool: select_bigquery_dataset

POST/api/v1/bigquery/mappingwrite scope

Save the BigQuery table mapping

Imported rows overwrite this workspace's Facebook ad data (campaigns, ad sets, ads and daily metrics) like a Meta sync, so confirm with the user before calling. Validates and saves which tables and columns of the selected dataset hold campaigns, ad sets, ads and daily metrics, marks the source connected and starts the first import in the background.

ParameterTypeRequiredDescription
mappingobjectyesTable mapping document. Get the shape and suggestions from the tables/datasets operation (mapping_shape and suggested); pass the suggested mapping back, adjusted if needed.

MCP tool: save_bigquery_mapping

POST/api/v1/bigquery/syncwrite scope

Sync BigQuery now

Imported rows overwrite this workspace's Facebook ad data (campaigns, ad sets, ads and daily metrics) like a Meta sync, so confirm with the user before calling. Queries the mapped tables immediately (it also runs hourly). Returns a summary message and the rows read.

MCP tool: sync_bigquery

DELETE/api/v1/bigquerywrite scope

Disconnect BigQuery

Removes the stored BigQuery credentials and stops syncing. Already imported ad data stays. Confirm with the user before calling.

MCP tool: disconnect_bigquery