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.
- MCP server:
https://tracebird.io/mcp - REST base URL:
https://tracebird.io/api/v1 - OpenAPI 3 spec: https://tracebird.io/api/v1/openapi.json
Quickstart
- Sign in and open Settings → API & MCP (workspace admins only).
- Click Create API key, choose Read only or Read & write, and copy the key. It is shown once.
- Call the API:
curl -H "Authorization: Bearer <your API key>" https://tracebird.io/api/v1/meConnect 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=compactand 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 | shOr 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:
readcovers every GET operation;writealso 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.txtErrors
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 orPOST /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 eventid) to ignore duplicates.Tracebird-Signature:t=<unix seconds>,v1=<hex>, wherev1is the HMAC-SHA256 of<t>.<raw body>keyed with the signing secret.tis 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
2xxwithin 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
/api/v1/meread scopeCurrent 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
/api/v1/workspaceread scopeWorkspace 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
/api/v1/workspacewrite scopeUpdate 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | no | Workspace name (max 80 characters). |
website_url | string | no | Company website, like example.com. Omit to keep the current one; null removes it. |
currency | string | no | Main reporting currency as a three-letter ISO code, e.g. USD. |
timezone | string | no | IANA timezone of the workspace, e.g. America/New_York. |
revenue_source_preference | string | no | Which revenue source dashboards trust: auto or a specific one. One of: auto, stripe, crm, facebook. |
MCP tool: update_workspace
/api/v1/workspacesread scopeWorkspaces 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
/api/v1/me/settingsread scopeThe 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
/api/v1/me/settingswrite scopeUpdate 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
timezone | string | no | The user's reporting timezone (IANA name, e.g. America/New_York). Follows the user across workspaces. |
default_timeframe | string | no | Default dashboard date range. One of: today, 7d, 30d, mtd. |
default_landing_page | string | no | Page shown after sign-in. One of: dashboard, manager, automation, settings. |
date_format | string | no | Date display format: browser locale, MM/DD/YYYY, DD/MM/YYYY or YYYY-MM-DD. One of: local, mdy, dmy, iso. |
currency | string | no | Display currency preference. One of: USD, EUR, GBP, CAD. |
theme | string | no | UI theme. One of: dark, light. |
ui_compact_mode | boolean | no | Compact tables. |
low_bandwidth_mode | boolean | no | Reduce data usage in the UI. |
auto_refresh_interval | string | no | Auto refresh interval in seconds, 0 = off. One of: 0, 300, 900, 3600. |
show_in_dash | boolean | no | Show in dashboard. |
confirm_before_destructive_actions | boolean | no | Ask for confirmation before destructive actions in the UI. |
sync_after_integration_connect | boolean | no | Start a sync right after connecting an integration. |
automation_default_status | string | no | Default status for new automation rules. One of: OFF, ON. |
automation_default_interval | string | no | Default check interval for new automation rules, in minutes. One of: 5, 15, 60, 360. |
notifications_weekly_report | boolean | no | Email the weekly report. |
notifications_automation_alerts | boolean | no | Notify about automation alerts. |
notifications_integration_alerts | boolean | no | Notify about integration alerts. |
MCP tool: update_user_settings
Notifications
/api/v1/notificationsread scopeList 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter | string | no | Only unread notifications, or one category (default all). One of: all, unread, integration, automation, system. Default: all. |
limit | integer | no | Page size (default 25). Default: 25. |
cursor | string | no | next_cursor from the previous page. |
MCP tool: list_notifications
/api/v1/notifications/summaryread scopeUnread 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
/api/v1/notifications/{id}/readwrite scopeMark a notification read
Marks one notification as read. Safe to repeat.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Notification id. |
MCP tool: mark_notification_read
/api/v1/notifications/read-allwrite scopeMark all notifications read
Marks every unread notification in the workspace as read.
MCP tool: mark_all_notifications_read
/api/v1/notifications/{id}/dismisswrite scopeDismiss a notification
Dismisses a notification so it no longer appears in the list (it is also marked read).
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Notification id. |
MCP tool: dismiss_notification
Logs
/api/v1/logsread scopeList 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
category | string | no | Only this category. One of: integrations, automation, workspace, system. |
status | string | no | Only this outcome: success, warning or error. One of: success, warning, error. |
since | string | no | Time window: 24h, 7d, 30d or all (default all). One of: 24h, 7d, 30d, all. |
q | string | no | Search text. |
limit | integer | no | Page size (max 100). |
cursor | string | no | next_cursor from the previous page. |
MCP tool: list_logs
Billing
/api/v1/billingread scopeBilling 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
/api/v1/team/membersread scopeList 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
/api/v1/team/members/{id}write scopeChange 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Member (user) id. |
role | string | yes | admin (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
/api/v1/team/members/{id}write scopeRemove 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Member (user) id. |
MCP tool: remove_team_member
/api/v1/team/invitationsread scopeList team invitations
Lists the latest 100 invitations (pending, accepted or revoked), newest first. Admins only.
MCP tool: list_team_invitations
/api/v1/team/invitationswrite scopeInvite 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
email | string | yes | Email address of the person to invite. |
role | string | no | admin (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
/api/v1/team/invitations/{id}/resendwrite scopeResend 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).
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Invitation id. |
MCP tool: resend_team_invitation
/api/v1/team/invitations/{id}write scopeRevoke 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).
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Invitation id. |
MCP tool: revoke_team_invitation
Security
/api/v1/webhooksread scopeList 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
/api/v1/webhooks/event-typesread scopeList 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
/api/v1/webhookswrite scopeCreate 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | yes | Label for the webhook (max 80 characters). |
endpoint_url | string | yes | HTTPS URL that receives the events. |
events | string[] | no | Event types to send (list_webhook_event_types). ["*"] or omitted = every event, including ones added later. |
MCP tool: create_webhook
/api/v1/webhooks/{id}write scopeUpdate 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Webhook id. |
name | string | no | New label. |
endpoint_url | string | no | New HTTPS URL. |
events | string[] | no | Event types to send (list_webhook_event_types). ["*"] or omitted = every event, including ones added later. |
enabled | boolean | no | false stops deliveries; true re-enables a disabled webhook. |
MCP tool: update_webhook
/api/v1/webhooks/{id}/testwrite scopeSend 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Webhook id. |
MCP tool: test_webhook
/api/v1/webhooks/{id}/deliveriesread scopeList 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Webhook id. |
limit | integer | no | How many (1-100, default 50). Default: 50. |
MCP tool: list_webhook_deliveries
/api/v1/webhooks/{id}write scopeRevoke an outbound webhook
Revokes a webhook so it stops receiving events (admins only). This cannot be undone; confirm with the user before calling.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Webhook id. |
MCP tool: revoke_webhook
/api/v1/audit-logread scopeSecurity 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
limit | integer | no | Number of events (default 50). Default: 50. |
MCP tool: list_audit_log
/api/v1/api-keysread scopeList 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
/api/v1/connected-appsread scopeList 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
/api/v1/ad-accountsread scopeList 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
platform | string | no | Only this platform: facebook, google_ads, hyros or demo (sample data). One of: facebook, google_ads, hyros, demo. |
MCP tool: list_ad_accounts
/api/v1/campaignsread scopeList 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
platform | string | no | Only this platform: facebook, google_ads, hyros or demo (sample data). One of: facebook, google_ads, hyros, demo. |
account_id | string | no | Only this ad account (the `id` from list_ad_accounts, for example `act_123` or `gads:1234567890`). |
status | string | no | Only this status. Status values are the platform's (for example ACTIVE, PAUSED, ARCHIVED, DELETED); matching is case-insensitive. |
search | string | no | Only campaigns whose name contains this text (case-insensitive). |
updated_since | string (date-time) | no | Only rows changed at or after this ISO 8601 time. Store the latest `updated_at` you saw and pass it back for incremental sync. |
limit | integer | no | Page size (1-500, default 100). Default: 100. |
cursor | string | no | Opaque `next_cursor` from the previous page. Omit for the first page. |
MCP tool: list_campaigns
/api/v1/campaigns/{id}read scopeGet a campaign
Returns one campaign by its platform id (name, status, objective, budget, bid strategy, account and currency). Use list_campaigns to discover ids.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The campaign's platform id, as returned by the list endpoint. |
MCP tool: get_campaign
/api/v1/ad-setsread scopeList 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
platform | string | no | Only this platform: facebook, google_ads, hyros or demo (sample data). One of: facebook, google_ads, hyros, demo. |
account_id | string | no | Only this ad account (the `id` from list_ad_accounts, for example `act_123` or `gads:1234567890`). |
status | string | no | Only this status. Status values are the platform's (for example ACTIVE, PAUSED, ARCHIVED, DELETED); matching is case-insensitive. |
campaign_id | string | no | Only ad sets of this campaign. |
search | string | no | Only ad sets whose name contains this text (case-insensitive). |
updated_since | string (date-time) | no | Only rows changed at or after this ISO 8601 time. Store the latest `updated_at` you saw and pass it back for incremental sync. |
limit | integer | no | Page size (1-500, default 100). Default: 100. |
cursor | string | no | Opaque `next_cursor` from the previous page. Omit for the first page. |
MCP tool: list_ad_sets
/api/v1/ad-sets/{id}read scopeGet 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The ad set's platform id, as returned by the list endpoint. |
MCP tool: get_ad_set
/api/v1/adsread scopeList 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
platform | string | no | Only this platform: facebook, google_ads, hyros or demo (sample data). One of: facebook, google_ads, hyros, demo. |
account_id | string | no | Only this ad account (the `id` from list_ad_accounts, for example `act_123` or `gads:1234567890`). |
status | string | no | Only this status. Status values are the platform's (for example ACTIVE, PAUSED, ARCHIVED, DELETED); matching is case-insensitive. |
campaign_id | string | no | Only ads of this campaign. |
ad_set_id | string | no | Only ads of this ad set. |
search | string | no | Only ads whose name contains this text (case-insensitive). |
updated_since | string (date-time) | no | Only rows changed at or after this ISO 8601 time. Store the latest `updated_at` you saw and pass it back for incremental sync. |
limit | integer | no | Page size (1-500, default 100). Default: 100. |
cursor | string | no | Opaque `next_cursor` from the previous page. Omit for the first page. |
MCP tool: list_ads
/api/v1/ads/{id}read scopeGet an ad
Returns one ad by its platform id with status, parent ids and creative details. Use list_ads to discover ids.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The ad's platform id, as returned by the list endpoint. |
MCP tool: get_ad
/api/v1/ads/duplicatewrite scopeDuplicate 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
level | string | yes | What the ids are. One of: campaign, ad_set, ad. |
ids | string[] | yes | Provider ids from the list endpoints (up to 50). |
paused | boolean | no | Create the copies paused (default true). false copies go live like the originals. Default: true. |
intent_id | string | no | Optional idempotency key. Re-sending the same key after a timeout will not repeat a write that already went through. |
MCP tool: duplicate_ads
/api/v1/ads/deletewrite scopeDelete 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
level | string | yes | What the ids are. One of: campaign, ad_set, ad. |
ids | string[] | yes | Provider ids from the list endpoints (up to 50). |
intent_id | string | no | Optional idempotency key. Re-sending the same key after a timeout will not repeat a write that already went through. |
MCP tool: delete_ads
/api/v1/ads/trackingwrite scopeAdd 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
ids | string[] | yes | Provider ids from the list endpoints (up to 50). |
intent_id | string | no | Optional idempotency key. Re-sending the same key after a timeout will not repeat a write that already went through. |
MCP tool: add_ad_tracking
/api/v1/ads/destinationwrite scopeChange 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
ids | string[] | yes | Provider ids from the list endpoints (up to 50). |
link | string | yes | New destination URL (https://...). |
display_link | string | no | Optional display link shown on the ad. |
intent_id | string | no | Optional idempotency key. Re-sending the same key after a timeout will not repeat a write that already went through. |
MCP tool: change_ad_destination
/api/v1/ads/write-intentsread scopeAd 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
/api/v1/ads/write-intents/{id}/acknowledgewrite scopeAcknowledge 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Write intent id from list_asset_write_intents. |
MCP tool: acknowledge_asset_write_intent
/api/v1/ads/write-intents/{id}/inspectionread scopeRe-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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Write intent id from list_asset_write_intents. |
version | string | yes | `version` of the intent from list_asset_write_intents (confirmed_partial). |
MCP tool: inspect_partial_write_intent
/api/v1/ads/write-intents/{id}/reconcilewrite scopeAcknowledge 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Write intent id from list_asset_write_intents. |
version | string | yes | `version` of the intent from list_asset_write_intents (confirmed_partial). |
inspection_version | string | yes | `inspectionVersion` returned by inspect_partial_write_intent. |
confirmed | boolean | yes | Must be true: the user reviewed the latest Meta state. |
MCP tool: reconcile_partial_write_intent
/api/v1/campaigns/{id}write scopePause, 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Campaign id (the provider's id, as returned by the list endpoints). |
status | string | no | Resume (ACTIVE) or pause (PAUSED) delivery. One of: ACTIVE, PAUSED. |
name | string | no | New name (max 200 characters). |
daily_budget | number | no | New 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
/api/v1/ad-sets/{id}write scopePause, 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Ad set id (the provider's id, as returned by the list endpoints). |
status | string | no | Resume (ACTIVE) or pause (PAUSED) delivery. One of: ACTIVE, PAUSED. |
name | string | no | New name (max 200 characters). |
daily_budget | number | no | New 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
/api/v1/ads/{id}write scopePause, 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Ad id (the provider's id, as returned by the list endpoints). |
status | string | no | Resume (ACTIVE) or pause (PAUSED) delivery. One of: ACTIVE, PAUSED. |
name | string | no | New name (max 200 characters). |
MCP tool: update_ad
Insights
/api/v1/insightsread scopeAd 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
level | string | no | Entity level to report on (default campaign). One of: account, campaign, ad_set, ad. Default: campaign. |
since | string (date) | no | First day (YYYY-MM-DD, inclusive) in the workspace reporting timezone. Defaults to 6 days before `until`. |
until | string (date) | no | Last day (YYYY-MM-DD, inclusive). Defaults to today. |
time_increment | string | no | day: one row per entity per day. total: one row per entity for the whole range. One of: day, total. Default: day. |
ids | string[] | no | Only these entity ids at the chosen level (for level=account use ids from list_ad_accounts). Up to 100. |
platform | string | no | Only this platform: facebook, google_ads, hyros or demo (sample data). One of: facebook, google_ads, hyros, demo. |
limit | integer | no | Page size (1-500, default 100). Default: 100. |
cursor | string | no | Opaque `next_cursor` from the previous page. Omit for the first page. |
MCP tool: get_insights
/api/v1/metrics/summaryread scopeWorkspace 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
since | string (date) | no | First day (YYYY-MM-DD, inclusive) in the workspace reporting timezone. Defaults to 6 days before `until`. |
until | string (date) | no | Last day (YYYY-MM-DD, inclusive). Defaults to today. |
account_id | string | no | Only this ad account's spend and ad metrics (the `id` from list_ad_accounts). Commerce totals stay workspace-wide. |
MCP tool: get_performance_summary
/api/v1/revenueread scopeFront-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.
| Parameter | Type | Required | Description |
|---|---|---|---|
since | string (date) | no | First day (YYYY-MM-DD, inclusive) in the workspace reporting timezone. Defaults to 6 days before `until`. |
until | string (date) | no | Last day (YYYY-MM-DD, inclusive). Defaults to today. |
basis | string | no | sale: group by when the sale happened. acquisition: group by when the customer was acquired. One of: sale, acquisition. Default: sale. |
MCP tool: get_revenue
/api/v1/insights/breakdownsread scopePerformance 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
dimension | string | yes | What to split by. One of: placement, device, age, gender, age_gender, country, page, instagram. |
since | string (date) | no | First day (YYYY-MM-DD, inclusive) in the workspace reporting timezone. Defaults to 6 days before `until`. |
until | string (date) | no | Last day (YYYY-MM-DD, inclusive). Defaults to today. |
account_id | string | no | Only this ad account (id from list_ad_accounts). |
entity_level | string | no | With entity_id, scope to one campaign, ad set or ad. One of: campaign, ad_set, ad. |
entity_id | string | no | The campaign / ad set / ad id for entity_level. |
MCP tool: get_insight_breakdowns
/api/v1/insights/funnel-assetsread scopeFront-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.
| Parameter | Type | Required | Description |
|---|---|---|---|
level | string | yes | Entity level of `ids`. One of: campaign, ad_set, ad. |
ids | string[] | yes | Campaign / ad set / ad ids (up to 100). |
since | string (date) | no | First day (YYYY-MM-DD, inclusive) in the workspace reporting timezone. Defaults to 6 days before `until`. |
until | string (date) | no | Last day (YYYY-MM-DD, inclusive). Defaults to today. |
basis | string | no | sale: group by the day of each sale. acquisition: group by the day the customer was acquired. One of: sale, acquisition. Default: sale. |
ltv_horizon_days | integer | no | Also return LTV over this window: 30, 90 or 365. |
MCP tool: get_funnel_asset_metrics
/api/v1/creatives/{id}read scopeDaily 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Ad id (the creative is the ad; ids come from list_ads). |
since | string (date) | no | First day (YYYY-MM-DD, inclusive) in the workspace reporting timezone. Defaults to 6 days before `until`. |
until | string (date) | no | Last day (YYYY-MM-DD, inclusive). Defaults to today. |
MCP tool: get_creative_detail
/api/v1/creatives/{id}/breakdownsread scopePlacement, 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Ad id (the creative is the ad; ids come from list_ads). |
since | string (date) | no | First day (YYYY-MM-DD, inclusive) in the workspace reporting timezone. Defaults to 6 days before `until`. |
until | string (date) | no | Last day (YYYY-MM-DD, inclusive). Defaults to today. |
MCP tool: get_creative_breakdowns
/api/v1/creatives/{id}/previewread scopePreview 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).
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Ad id (the creative is the ad; ids come from list_ads). |
MCP tool: get_ad_preview
Dashboard
/api/v1/dashboard/catalogread scopeCards, 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
/api/v1/dashboard/preferencesread scopeThe 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
/api/v1/dashboard/preferenceswrite scopeChange 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
preferences | object | yes | Fields to change: cards, secondaryCards, chartSeries, campaignColumns, sourceColumns, sourceSort, sourceFilters, chartType, chartPalette, chartShowValues, chartShowGrid, chartSmooth, abbreviations, stageMarks, roasBaselines, ltvHorizon. |
expected_updated_at | integer | no | `updated_at` you last read; omit to overwrite the current layout. |
MCP tool: update_dashboard_preferences
/api/v1/dashboard/trendread scopeDaily 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
since | string (date) | no | First day (YYYY-MM-DD, inclusive) in the workspace reporting timezone. Defaults to 6 days before `until`. |
until | string (date) | no | Last day (YYYY-MM-DD, inclusive). Defaults to today. |
account_id | string | no | Only this ad account (id from list_ad_accounts). |
MCP tool: get_dashboard_trend
/api/v1/dashboard/revenueread scopeStripe 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
since | string (date) | no | First day (YYYY-MM-DD, inclusive) in the workspace reporting timezone. Defaults to 6 days before `until`. |
until | string (date) | no | Last day (YYYY-MM-DD, inclusive). Defaults to today. |
MCP tool: get_dashboard_revenue
/api/v1/customers/groupsread scopeCustomers 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
by | string | no | Grouping. One of: source, campaign, ad, first_seen_month. Default: source. |
search | string | no | Name, email or phone contains. |
sources | string[] | no | Only customers seen in these sources. |
attribution | string | no | Only customers with / without an ad attribution. One of: attributed, unattributed. |
details | string | no | Contact details filter. One of: has_email, has_phone, has_name, missing. |
revenue | string | no | Only paying / non-paying customers. One of: paying, none. |
active_days | integer | no | Seen in the last N days. |
sort | string | no | Sort used by the filter query. One of: last_seen, first_seen, name, email, acquired, revenue. |
MCP tool: list_customer_groups
Views
/api/v1/manager-viewsread scopeSaved Ads Manager views
Lists the workspace's saved Ads Manager filter views (up to 100, newest first).
MCP tool: list_manager_views
/api/v1/manager-viewswrite scopeSave 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"]}.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | no | View name. |
filters | object[] | no | Saved filters as the Ads Manager stores them (array of filter objects). |
hidden_columns | string[] | no | Column keys hidden in this view. |
MCP tool: create_manager_view
/api/v1/manager-views/{id}write scopeChange a saved Ads Manager view
Renames a saved view or replaces its filters / hidden columns; omitted fields keep their value.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | View id. |
name | string | no | View name. |
filters | object[] | no | Saved filters as the Ads Manager stores them (array of filter objects). |
hidden_columns | string[] | no | Column keys hidden in this view. |
MCP tool: update_manager_view
/api/v1/manager-views/{id}write scopeDelete a saved Ads Manager view
Permanently deletes a saved view for the whole workspace. Confirm with the user.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | View id. |
MCP tool: delete_manager_view
/api/v1/table-viewsread scopeAds 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
/api/v1/table-viewswrite scopeSave 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
preferences | object | yes | { selectedId, views: [{ id, name, favorite, columns, widths, sort: {key, dir}, pinned }] } |
MCP tool: update_table_views
Embeds
/api/v1/dashboard-embedsread scopeThe 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
/api/v1/dashboard-embedswrite scopeCreate 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
/api/v1/dashboard-embedswrite scopeChange 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
config | object | yes | Embed 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
/api/v1/dashboard-embedswrite scopeRevoke 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
/api/v1/dashboard-embeds/passwordwrite scopeSet 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
password | string | yes | New embed password. |
MCP tool: set_dashboard_embed_password
/api/v1/dashboard-embeds/passwordwrite scopeRemove 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
/api/v1/dashboard-embeds/accountsread scopeAd 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
/api/v1/dashboard-embeds/previewread scopePreview what the embed shows
Renders the embed with live workspace data for a draft config (or the saved config when omitted) without saving anything.
| Parameter | Type | Required | Description |
|---|---|---|---|
config | object | no | Embed 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
/api/v1/dashboard-embeds/widget-previewread scopePreview 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
config | object | no | Embed 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
/api/v1/report-metricsread scopeKPI 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
/api/v1/reportsread scopeSaved reports
Lists the workspace's saved report definitions (newest first, up to 500). Archived reports are hidden unless status=archived or all.
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string | no | Which reports to return (default active). One of: active, archived, all. Default: active. |
MCP tool: list_reports
/api/v1/reports/{id}read scopeOne saved report
Returns a saved report definition (name, template, KPI metrics, rows, saved date range).
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Id. |
MCP tool: get_report
/api/v1/reportswrite scopeSave 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"}}.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | yes | Report name. |
description | string | no | Short description. |
template | string | no | Report template. One of: executive, efficiency, creative, pacing, attribution. |
config | object | yes | Report 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
/api/v1/reports/{id}write scopeChange 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).
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Id. |
name | string | no | Report name. |
description | string | no | Short description. |
template | string | no | Report template. One of: executive, efficiency, creative, pacing, attribution. |
config | object | no | Report 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
/api/v1/reports/{id}/duplicatewrite scopeDuplicate a saved report
Saves a copy of a report named "<name> copy" and returns it.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Id. |
MCP tool: duplicate_report
/api/v1/reports/{id}write scopeArchive a saved report
Archives a report (hidden from the default list; its schedules stay saved). Confirm with the user.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Id. |
MCP tool: archive_report
/api/v1/report-schedulesread scopeReport email schedules
Lists the workspace's saved report delivery schedules (recipients, cadence, format, enabled), as on the Reports page.
MCP tool: list_report_schedules
/api/v1/report-scheduleswrite scopeSchedule 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
report_id | string | yes | Saved report id. |
recipients | string[] | yes | Email addresses for the report (1-25). |
timezone | string | no | IANA timezone of the schedule, e.g. America/New_York (default UTC). |
cadence | string | no | How often (default weekly). One of: daily, weekly, monthly. |
format | string | no | Delivery format (default pdf). One of: pdf, csv. |
enabled | boolean | no | false pauses the schedule. |
MCP tool: create_report_schedule
/api/v1/report-schedules/{id}write scopeChange a report schedule
Changes recipients, cadence, format, timezone or enabled; omitted fields keep their value. Confirm recipient changes with the user.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Id. |
recipients | string[] | no | Email addresses for the report (1-25). |
timezone | string | no | IANA timezone of the schedule, e.g. America/New_York (default UTC). |
cadence | string | no | How often (default weekly). One of: daily, weekly, monthly. |
format | string | no | Delivery format (default pdf). One of: pdf, csv. |
enabled | boolean | no | false pauses the schedule. |
MCP tool: update_report_schedule
/api/v1/report-viewsread scopeSaved report views
Lists saved views (named page settings per route, private or shared) used by the reports pages.
MCP tool: list_report_views
/api/v1/report-viewswrite scopeSave 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"}.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | yes | View name. |
route | string | no | App route the view belongs to, e.g. /dashboard. |
config | object | no | View settings object (filters, columns, date range...) as the page saves them. |
visibility | string | no | shared makes it visible to the workspace. One of: private, shared. |
is_default | boolean | no | Make this the default view for its route. |
MCP tool: create_report_view
/api/v1/report-views/{id}write scopeChange a saved report view
Changes a saved view; omitted fields keep their value.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Id. |
name | string | no | View name. |
route | string | no | App route the view belongs to, e.g. /dashboard. |
config | object | no | View settings object (filters, columns, date range...) as the page saves them. |
visibility | string | no | shared makes it visible to the workspace. One of: private, shared. |
is_default | boolean | no | Make this the default view for its route. |
MCP tool: update_report_view
/api/v1/attribution-reportread scopeMeta 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
account_id | string | yes | Numeric Meta ad account id (without act_). |
ad_set_ids | string[] | yes | Numeric Meta ad set ids. |
since | string (date) | yes | First day (YYYY-MM-DD). |
until | string (date) | yes | Last day (YYYY-MM-DD). |
time_zone | string | no | Report timezone (default: the key owner's timezone). |
mode | string | no | configured: the account's window. compare: add one comparison window. One of: configured, compare. Default: configured. |
windows | string[] | no | With mode=compare, the single comparison window (e.g. 7d_click). |
MCP tool: get_attribution_report
Automation
/api/v1/automation-rulesread scopeList 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string | no | Only rules with this status. One of: ON, OFF. |
folder_id | string | no | Only rules in this folder (from list_automation_folders); "root" for rules outside any folder. |
MCP tool: list_automation_rules
/api/v1/automation-rules/schemaread scopeGet 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
/api/v1/automation-rules/{id}read scopeGet 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Rule id from list_automation_rules. |
MCP tool: get_automation_rule
/api/v1/automation-runsread scopeList 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
limit | integer | no | Page size (1-100, default 50). Default: 50. |
cursor | string | no | Opaque `next_cursor` from the previous page. Omit for the first page. |
MCP tool: list_automation_runs
/api/v1/automation-runs/policyread scopeGet 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
/api/v1/automation-foldersread scopeList 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
/api/v1/automation-priorityread scopeList 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
/api/v1/automation-ruleswrite scopeCreate 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | yes | Rule name (overrides config.rule.name). |
config | object | yes | The rule config document { rule, filter, schedule }, exactly as get_automation_rule returns it. Structure, metric keys and examples: get_automation_rule_schema. |
folder_id | string | no | Folder to put the rule in (from list_automation_folders). Omit or "root" for no folder. |
status | string | no | ON enables the rule immediately (default OFF). One of: ON, OFF. Default: OFF. |
icon | string | no | Lucide icon name, lowercase with dashes (default zap). |
color | string | no | Six-digit hex color such as #6366f1. |
emoji | string | no | A single emoji shown with the rule; "none" removes it. |
MCP tool: create_automation_rule
/api/v1/automation-rules/{id}write scopeUpdate 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Automation rule id. |
name | string | no | New name (overrides config.rule.name). |
config | object | no | The rule config document { rule, filter, schedule }, exactly as get_automation_rule returns it. Structure, metric keys and examples: get_automation_rule_schema. |
folder_id | string | no | Move the rule to this folder; "root" for no folder. |
status | string | no | Set ON or OFF while saving. One of: ON, OFF. |
icon | string | no | Lucide icon name, lowercase with dashes (default zap). |
color | string | no | Six-digit hex color such as #6366f1. |
emoji | string | no | A single emoji shown with the rule; "none" removes it. |
MCP tool: update_automation_rule
/api/v1/automation-rules/{id}write scopeDelete 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Automation rule id. |
MCP tool: delete_automation_rule
/api/v1/automation-rules/{id}/duplicatewrite scopeDuplicate an automation rule
Copies a rule (same folder and appearance) as "<name> Copy", always saved OFF. Returns the new rule.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Automation rule id to copy. |
MCP tool: duplicate_automation_rule
/api/v1/automation-rules/{id}/statuswrite scopeTurn 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Automation rule id. |
status | string | yes | ON enables the rule, OFF disables it. One of: ON, OFF. |
MCP tool: set_automation_rule_status
/api/v1/automation-rules/previewwrite scopePreview 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
config | object | yes | The rule config document { rule, filter, schedule }, exactly as get_automation_rule returns it. Structure, metric keys and examples: get_automation_rule_schema. |
dry_run | boolean | no | Also require a rule name, as saving does. |
MCP tool: preview_automation_rule
/api/v1/automation-rules/{id}/runwrite scopeRun 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Automation rule id. |
MCP tool: run_automation_rule
/api/v1/automation-rules/movewrite scopeMove 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).
| Parameter | Type | Required | Description |
|---|---|---|---|
rule_ids | string[] | yes | Rule ids to move (1-100). |
folder_id | string | yes | Target folder id from list_automation_folders, or "root" for no folder. |
MCP tool: move_automation_rules
/api/v1/automation-folderswrite scopeCreate 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | yes | Folder name. |
MCP tool: create_automation_folder
/api/v1/automation-folders/{id}write scopeRename an automation folder
Renames a folder (unique name, up to 80 characters). Its rules stay in it.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Folder id. |
name | string | yes | New folder name. |
MCP tool: rename_automation_folder
/api/v1/automation-folders/{id}write scopeDelete 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Folder id. |
MCP tool: delete_automation_folder
/api/v1/automation-priority/{id}/reconcilewrite scopeReconcile 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Priority item id from list_automation_priority (state uncertain). |
confirm_provider_settled | boolean | yes | Must be true: the user verified in Ads Manager that the earlier provider request has finished. |
MCP tool: reconcile_automation_priority
Split tests
/api/v1/split-testsread scopeList 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string | no | Only tests with this status. One of: draft, running, paused, completed. |
MCP tool: list_split_tests
/api/v1/split-tests/{id}read scopeGet 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`.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Split test id from list_split_tests. |
MCP tool: get_split_test_report
/api/v1/split-tests/{id}/definitionread scopeGet 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Split test id from list_split_tests. |
MCP tool: get_split_test
/api/v1/split-testswrite scopeCreate 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | yes | Test name. |
primary_metric | string | yes | Metric that decides the winner. One of: lead, appointment, show, sale, revenue. |
variants | object[] | yes | 2 to 5 landing pages. The first is the control. Weights are relative. |
slug | string | no | Link name for /go/<slug>: lowercase letters, numbers, dashes. Random if omitted. |
domain_id | string | no | Connected custom domain id (list_split_domains). Omit for the workspace default domain (or the shared host if none). |
assignment_mode | string | no | sticky: 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_hours | integer | no | Rotate mode only: hours before a returning visitor is moved to another variant (0 = every visit). |
pass_query_params | boolean | no | Forward the visitor's query string (UTMs, fbclid) to the landing page. Default true. |
auto_stop | object | no | Automatic stop rules; the first met wins. Replaces all existing rules; send {} to remove them. |
MCP tool: create_split_test
/api/v1/split-tests/{id}write scopeUpdate 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).
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Split test id from list_split_tests. |
name | string | no | Test name. |
primary_metric | string | no | Metric that decides the winner. One of: lead, appointment, show, sale, revenue. |
variants | object[] | no | 2 to 5 landing pages. The first is the control. Weights are relative. |
slug | string | no | Link name for /go/<slug>: lowercase letters, numbers, dashes. Random if omitted. |
domain_id | string | no | Connected custom domain id (list_split_domains). Omit for the workspace default domain (or the shared host if none). |
assignment_mode | string | no | sticky: 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_hours | integer | no | Rotate mode only: hours before a returning visitor is moved to another variant (0 = every visit). |
pass_query_params | boolean | no | Forward the visitor's query string (UTMs, fbclid) to the landing page. Default true. |
auto_stop | object | no | Automatic stop rules; the first met wins. Replaces all existing rules; send {} to remove them. |
MCP tool: update_split_test
/api/v1/split-tests/{id}write scopeDelete 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Split test id from list_split_tests. |
MCP tool: delete_split_test
/api/v1/split-tests/{id}/duplicatewrite scopeDuplicate 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Split test id from list_split_tests. |
MCP tool: duplicate_split_test
/api/v1/split-tests/{id}/startwrite scopeStart 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Split test id from list_split_tests. |
MCP tool: start_split_test
/api/v1/split-tests/{id}/pausewrite scopePause 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Split test id from list_split_tests. |
MCP tool: pause_split_test
/api/v1/split-tests/{id}/declare-winnerwrite scopeDeclare 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Split test id from list_split_tests. |
variant_id | string | yes | Winning variant id (from the test's variants). |
MCP tool: declare_split_test_winner
Split domains
/api/v1/split-domainsread scopeList 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
/api/v1/split-domainswrite scopeConnect 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
hostname | string | yes | Subdomain to serve split links on, e.g. go.brand.com. |
label | string | no | Optional friendly name. |
MCP tool: connect_split_domain
/api/v1/split-domains/{id}write scopeUpdate a split link domain
Renames a domain and/or makes it the workspace default (preselected for new split tests). Admin only.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Split domain id from list_split_domains. |
label | string | no | New friendly name (empty clears it). |
is_default | boolean | no | true makes this the default domain. |
MCP tool: update_split_domain
/api/v1/split-domains/{id}write scopeRemove 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Split domain id from list_split_domains. |
MCP tool: remove_split_domain
/api/v1/split-domains/{id}/refreshwrite scopeRe-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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Split domain id from list_split_domains. |
MCP tool: refresh_split_domain_verification
/api/v1/split-domains/{id}/dns-providerread scopeDetect 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Split domain id from list_split_domains. |
MCP tool: detect_split_domain_dns
/api/v1/split-domains/{id}/apply-cloudflarewrite scopeCreate 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Split domain id from list_split_domains. |
cloudflare_api_token | string | yes | Cloudflare API token with DNS edit permission on the domain's zone. |
MCP tool: apply_split_domain_cloudflare
Conversions
/api/v1/conversionsread scopeList 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
type | string | no | Only this event type. One of: lead, appointment, show, sale. |
source | string | no | Only events from this integration (webhook covers custom, Cortana, Calendly and Whop webhooks). One of: ghl, hubspot, webhook. |
since | string (date-time) | no | Only events that occurred at or after this ISO 8601 time. |
until | string (date-time) | no | Only events that occurred before this ISO 8601 time. |
created_since | string (date-time) | no | Only events recorded by Tracebird at or after this time (for incremental sync). |
campaign_id | string | no | Only events attributed to this campaign id. |
ad_set_id | string | no | Only events attributed to this ad set id. |
ad_id | string | no | Only events attributed to this ad id. |
include_voided | boolean | no | Include voided sales (default true; they carry `voided_at`). Set false to hide them. Default: true. |
limit | integer | no | Page size (1-500, default 100). Default: 100. |
cursor | string | no | Opaque `next_cursor` from the previous page. Omit for the first page. |
MCP tool: list_conversions
/api/v1/conversionswrite scopeRecord 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
type | string | yes | lead, appointment, show (the person attended) or sale. One of: lead, appointment, show, sale. |
external_id | string | yes | Your unique id for this event (lead id, booking id, order id). Idempotency key per type: resending it never duplicates. |
occurred_at | string (date-time) | no | When it happened, ISO 8601. Defaults to now; must not be in the future. |
value | number | no | Sale amount in major currency units (required > 0 for sales). |
currency | string | no | ISO 4217 code for value; defaults to the workspace currency. |
label | string | no | Optional name for the event, e.g. the product or call type. |
email | string | no | Contact email; used to match the person to an ad click and to link their lead, appointment and sale. |
phone | string | no | Contact phone, same use as email. |
name | string | no | Contact full name shown on the Contacts page. |
ad_id | string | no | Meta ad id this conversion should be credited to. |
ad_set_id | string | no | Meta ad set id. |
campaign_id | string | no | Meta campaign id. |
lead_id | string | no | For appointment/show/sale: the external_id of the lead this belongs to, to inherit its ad attribution. |
utm_campaign | string | no | Campaign name or id from the landing URL (utm_campaign). |
utm_content | string | no | Ad name or id from the landing URL (utm_content). |
utm_term | string | no | Ad set name or id from the landing URL (utm_term). |
tracebird_visitor_id | string | no | Visitor (tracking) id captured by the Tracebird pixel on your site; the most reliable way to attribute. |
MCP tool: record_conversion
Customers
/api/v1/customersread scopeList 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
search | string | no | Match name, email or phone (case-insensitive contains). |
source | string | no | Only customers seen in this source. One of: pixel, ghl, hubspot, webhook, cortana, calendly, whop, stripe. |
attribution | string | no | attributed: acquired through a known ad. One of: attributed, unattributed. |
details | string | no | Contact-detail filter. One of: has_email, has_phone, has_name, missing. |
revenue | string | no | paying: net revenue above zero. none: no revenue. One of: paying, none. |
active_days | integer | no | Only customers with activity in the last N days. |
sort | string | no | Sort field (default last_seen). One of: last_seen, first_seen, name, email, acquired, revenue. Default: last_seen. |
dir | string | no | Sort direction (default desc). One of: asc, desc. Default: desc. |
cursor | string | no | Opaque `next_cursor` from the previous page. Omit for the first page. |
MCP tool: list_customers
/api/v1/customers/{id}read scopeGet 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Customer id from list_customers. |
MCP tool: get_customer
Tracking
/api/v1/conversion-sourcesread scopeConversions 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
/api/v1/conversion-sources/webhookswrite scopeCreate 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | no | Display name (default 'Custom webhook'). |
provider | string | no | custom (default) or cortana. One of: custom, cortana. |
default_event_type | string | no | Event type recorded when the payload does not say (default lead). One of: lead, appointment, show, sale. |
MCP tool: create_inbound_webhook
/api/v1/conversion-sources/webhooks/{id}write scopeChange 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`.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Webhook id from get_conversions_overview. |
slug | string | yes | 3-64 letters, numbers, - or _, starting with a letter or number. |
MCP tool: rename_inbound_webhook_slug
/api/v1/conversion-sources/webhooks/{id}write scopeDelete 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Webhook id from get_conversions_overview. |
MCP tool: delete_inbound_webhook
/api/v1/conversion-sources/{provider}/connect-urlread scopeGet 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
provider | string | yes | Which CRM. One of: ghl, hubspot, whop. |
MCP tool: get_conversion_source_connect_url
/api/v1/conversion-sources/ghl/connections/{id}write scopeDisconnect 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).
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | GoHighLevel connection id from get_conversions_overview. |
MCP tool: disconnect_ghl
/api/v1/conversion-sources/ghl/connections/{id}/importwrite scopeChoose 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | GoHighLevel connection id. |
days | integer | yes | 0 to skip, or 30, 90 or 365 days of history. |
MCP tool: choose_ghl_import
/api/v1/conversion-sources/ghl/connections/{id}/import/resumewrite scopeResume 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | GoHighLevel connection id. |
MCP tool: resume_ghl_import
/api/v1/conversion-sources/ghl/import/stepwrite scopeAdvance 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
/api/v1/conversion-sources/hubspot/connections/{id}write scopeDisconnect 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).
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | HubSpot connection id from get_conversions_overview. |
MCP tool: disconnect_hubspot
/api/v1/conversion-sources/hubspot/connections/{id}/importwrite scopeChoose 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | HubSpot connection id. |
days | integer | yes | 0 to skip, or 30, 90 or 365 days of history. |
MCP tool: choose_hubspot_import
/api/v1/conversion-sources/hubspot/connections/{id}/import/resumewrite scopeResume 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | HubSpot connection id. |
MCP tool: resume_hubspot_import
/api/v1/conversion-sources/hubspot/import/stepwrite scopeAdvance 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
/api/v1/conversion-sources/whop/connectionswrite scopeConnect 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
api_key | string | yes | Whop API key (never echoed back). |
company_id | string | yes | Whop company id like biz_XXXXXXXX. |
MCP tool: connect_whop_with_api_key
/api/v1/conversion-sources/whop/connections/{id}/syncwrite scopeSync 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Whop connection id from get_conversions_overview. |
MCP tool: sync_whop
/api/v1/conversion-sources/whop/connections/{id}write scopeDisconnect 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Whop connection id from get_conversions_overview. |
MCP tool: disconnect_whop
/api/v1/conversion-sources/cortana/apiwrite scopeSave 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
api_key | string | yes | Cortana API key (never echoed back). |
business_id | string | yes | Business id from the Cortana dashboard URL (app.usecortana.ai/business/<id>). |
MCP tool: connect_cortana_api
/api/v1/conversion-sources/cortana/apiwrite scopeRemove 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
/api/v1/conversion-sources/cortana/importwrite scopeImport 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
days | integer | yes | 7, 30 or 90 to start a new import; 0 continues the running one. |
MCP tool: import_cortana_history
/api/v1/conversion-sources/calendly/connectionwrite scopeConnect 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
token | string | yes | Calendly Personal Access Token (never echoed back). |
MCP tool: connect_calendly
/api/v1/conversion-sources/calendly/connectionwrite scopeDisconnect 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
/api/v1/attribution-modelread scopeGet 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
/api/v1/attribution-modelwrite scopeSet 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
model | string | yes | first_click or last_click. One of: first_click, last_click. |
MCP tool: set_attribution_model
/api/v1/pixelread scopeGet 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
/api/v1/pixelwrite scopeSave 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
domains | string[] | yes | Website domains, e.g. ["example.com"]. |
MCP tool: update_pixel_domains
/api/v1/pixel/install-testwrite scopeStart 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
/api/v1/conversion-definitionsread scopeList 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
/api/v1/conversion-definitions/sourcesread scopeList 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
/api/v1/conversion-definitions/feedread scopeConversion activity feed with Meta delivery status
Recent conversion events with which named conversions matched and the Meta delivery status of each. Offset paged.
| Parameter | Type | Required | Description |
|---|---|---|---|
days | integer | no | Window: 1, 7, 14, 30 or 90 days (other values fall back to 14). Default: 14. |
definition_id | string | no | Only events matching this conversion. |
source | string | no | Only this source key. |
offset | integer | no | Rows to skip (up to 10,000; for a full export page list_conversions instead). Default: 0. |
limit | integer | no | Page size (1-100). Default: 25. |
MCP tool: get_conversion_activity_feed
/api/v1/conversion-definitionswrite scopeCreate 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | yes | Conversion name. |
description | string | no | Optional note. |
event_types | string[] | yes | Event types it matches (at least one): lead, appointment, show, sale. |
sources | string[] | no | Source keys '<source>:<connection id>' from list_conversion_sources_for_definitions; empty matches any source. |
labels | string[] | no | Exact form, calendar or product names; empty matches any. |
meta_event_name | string | no | Meta standard event (e.g. Lead, Purchase) or a custom event name to send; omit to send nothing. |
MCP tool: create_conversion_definition
/api/v1/conversion-definitions/{id}write scopeUpdate 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Conversion definition id. |
name | string | yes | Conversion name. |
description | string | no | Optional note. |
event_types | string[] | yes | Event types it matches (at least one): lead, appointment, show, sale. |
sources | string[] | no | Source keys '<source>:<connection id>' from list_conversion_sources_for_definitions; empty matches any source. |
labels | string[] | no | Exact form, calendar or product names; empty matches any. |
meta_event_name | string | no | Meta standard event (e.g. Lead, Purchase) or a custom event name to send; omit to send nothing. |
MCP tool: update_conversion_definition
/api/v1/conversion-definitions/{id}/enabledwrite scopeEnable 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Conversion definition id. |
enabled | boolean | yes | true to enable, false to disable. |
MCP tool: set_conversion_definition_enabled
/api/v1/conversion-definitions/{id}/duplicatewrite scopeDuplicate 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Conversion definition id. |
MCP tool: duplicate_conversion_definition
/api/v1/conversion-definitions/{id}write scopeDelete 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Conversion definition id. |
MCP tool: delete_conversion_definition
/api/v1/conversion-definitions/retry-deliverywrite scopeRetry 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
ref | string | yes | The event's `ref` from get_conversion_activity_feed. |
MCP tool: retry_meta_delivery
Revenue settings
/api/v1/offersread scopeList 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
/api/v1/offers/stagewrite scopeTag 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
offer_key | string | yes | Offer `key` from list_offers. |
stage | string | yes | front_end, back_end, or auto. One of: front_end, back_end, auto. |
MCP tool: set_offer_stage
/api/v1/revenue-streamsread scopeList 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
/api/v1/revenue-streams/rolewrite scopeSet 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
stream_id | string | yes | Stream `id` from list_revenue_streams. |
role | string | yes | Role, or auto for the automatic choice. One of: split, threshold, front_end, back_end, none, auto. |
threshold | number | no | Back-end threshold for role threshold. |
MCP tool: set_revenue_stream_role
/api/v1/revenue-settingsread scopeGet 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
/api/v1/revenue-settingswrite scopeUpdate 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
backend_threshold | number | no | Back-end threshold. |
attribution_model | string | no | last_click (default, matches Cortana), first_click or smart. One of: last_click, first_click, smart. |
revenue_source_preference | string | no | auto, stripe, crm or facebook. One of: auto, stripe, crm, facebook. |
MCP tool: update_revenue_settings
Integrations
/api/v1/integrationsread scopeCatalog 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
/api/v1/integrations/{provider}read scopeDetails 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
provider | string | yes | Integration id as listed by list_integrations (for example facebook, google_ads, hyros, stripe, google_analytics, microsoft_clarity, meta_capi). |
MCP tool: get_integration
/api/v1/integration-syncs/recentread scopeLast 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
/api/v1/integration-syncs/historyread scopeFilterable 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
provider | string | no | Only this integration's runs. One of: facebook, hyros, stripe, ghl, hubspot, google_sheets, webhook, cortana, google_ads, calendly, whop, supabase, bigquery, bigquery_export. |
status | string | no | Only runs with this outcome. One of: success, partial, error. |
sync_type | string | no | Only this kind of run: manual, scheduled, backfill, on_demand, webhook_event or unknown. One of: unknown, manual, scheduled, backfill, on_demand, webhook_event. |
since | string (date-time) | no | Only runs started at or after this ISO 8601 time. |
until | string (date-time) | no | Only runs started at or before this ISO 8601 time. |
limit | integer | no | Page size (1-100, default 25). Default: 25. |
cursor | string | no | Opaque `next_cursor` from the previous page. |
MCP tool: list_sync_history
/api/v1/integrations/{provider}/syncwrite scopeSync 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
provider | string | yes | Integration id as listed by list_integrations (for example facebook, google_ads, hyros, stripe, google_analytics, microsoft_clarity, meta_capi). |
connection_id | string | no | Stripe only: sync just this connected Stripe account (see get_integration for stripe). |
sync_type | string | no | Stripe only: manual (default) or backfill. One of: manual, backfill. |
MCP tool: sync_integration
/api/v1/integrations/{provider}/cancel-syncwrite scopeStop 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
provider | string | yes | Integration id as listed by list_integrations (for example facebook, google_ads, hyros, stripe, google_analytics, microsoft_clarity, meta_capi). |
MCP tool: cancel_integration_sync
/api/v1/integrations/{provider}/pausewrite scopeTurn 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
provider | string | yes | Integration id as listed by list_integrations (for example facebook, google_ads, hyros, stripe, google_analytics, microsoft_clarity, meta_capi). |
mode | string | no | all (default) or sync; sync is only valid for ghl, hubspot, whop and stripe. One of: sync, all. |
MCP tool: pause_integration
/api/v1/integrations/{provider}/resumewrite scopeTurn 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
provider | string | yes | Integration id as listed by list_integrations (for example facebook, google_ads, hyros, stripe, google_analytics, microsoft_clarity, meta_capi). |
MCP tool: resume_integration
/api/v1/integrations/{provider}/connectwrite scopeGet 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
provider | string | yes | Integration 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
/api/v1/integrations/{provider}/ad-account-choicesread scopeAd 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).
| Parameter | Type | Required | Description |
|---|---|---|---|
provider | string | yes | Integration 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
/api/v1/integrations/{provider}/ad-accountswrite scopeStart 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
provider | string | yes | Integration id as listed by list_integrations (for example facebook, google_ads, hyros, stripe, google_analytics, microsoft_clarity, meta_capi). |
account_ids | string[] | yes | Ad account ids from list_ad_account_choices. |
MCP tool: select_ad_accounts
/api/v1/integrations/{provider}/ad-accounts/{account_id}write scopeStop 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
provider | string | yes | Integration id as listed by list_integrations (for example facebook, google_ads, hyros, stripe, google_analytics, microsoft_clarity, meta_capi). |
account_id | string | yes | Ad account id as listed by get_integration / list_ad_accounts (for example act_123 or gads:1234567890). |
MCP tool: remove_ad_account
/api/v1/integrations/{provider}/ad-accounts/{account_id}write scopeEnable 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).
| Parameter | Type | Required | Description |
|---|---|---|---|
provider | string | yes | Integration id as listed by list_integrations (for example facebook, google_ads, hyros, stripe, google_analytics, microsoft_clarity, meta_capi). |
account_id | string | yes | Ad account id as listed by get_integration / list_ad_accounts (for example act_123 or gads:1234567890). |
enabled | boolean | yes | true to enable, false to disable. |
MCP tool: set_ad_account_enabled
/api/v1/integrations/hyros/api-keywrite scopeConnect 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
api_key | string | yes | The HYROS API key. |
MCP tool: save_hyros_api_key
/api/v1/integrations/{provider}write scopeDisconnect 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
provider | string | yes | Integration id as listed by list_integrations (for example facebook, google_ads, hyros, stripe, google_analytics, microsoft_clarity, meta_capi). |
MCP tool: disconnect_integration
/api/v1/integrations/google_analytics/propertiesread scopeGoogle 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
/api/v1/integrations/google_analytics/propertywrite scopeAdd 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
property_id | string | yes | Numeric GA4 property id. |
MCP tool: select_google_analytics_property
/api/v1/integrations/microsoft_clarity/tokenwrite scopeConnect 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
token | string | yes | Clarity Data Export API token (no whitespace). |
name | string | no | Label for the project, e.g. the site name. |
project_id | string | no | Existing project id (from get_microsoft_clarity_snapshot) whose token to replace. |
MCP tool: connect_microsoft_clarity
/api/v1/integrations/microsoft_clarity/snapshotread scopeCached 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
/api/v1/integrations/stripe/connectionsread scopeConnected 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
/api/v1/integrations/stripe/connections/{connection_id}write scopeDisconnect 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
connection_id | string | yes | Stripe connection id from list_stripe_connections. |
MCP tool: disconnect_stripe_connection
/api/v1/integrations/meta_capi/settingsread scopeMeta 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
/api/v1/integrations/meta_capi/datasetsread scopeMeta 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
/api/v1/integrations/meta_capi/settingswrite scopeTurn 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
dataset_id | string | yes | Meta dataset (pixel) id, digits only. |
token | string | no | Optional dataset access token (no whitespace); write-only. |
clear_token | boolean | no | true removes a stored token so the Facebook connection is used instead. |
test_event_code | string | no | Optional Meta test event code. |
send_leads | boolean | no | Forward leads (default true). Default: true. |
send_purchases | boolean | no | Forward purchases (default true). Default: true. |
MCP tool: save_meta_capi_settings
/api/v1/integrations/meta_capi/deliveriesread scopeRecent 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string | no | Only deliveries with this status. One of: sent, failed, skipped. |
limit | integer | no | How many (1-200, default 50). Default: 50. |
MCP tool: list_meta_capi_deliveries
/api/v1/integrations/meta_capi/retrywrite scopeRetry 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
source_ref | string | yes | source_ref of a failed delivery from list_meta_capi_deliveries. |
MCP tool: retry_meta_capi_delivery
Google Sheets
/api/v1/data-sourcesread scopeList 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
/api/v1/data-sources/fieldsread scopeList 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
/api/v1/data-sources/issuesread scopeList 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
/api/v1/data-sources/{id}read scopeGet a connected Google Sheet
One connected Google Sheet with its columns, mode, match column, status and last error.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Data source id, as returned by list_data_sources. |
MCP tool: get_data_source
/api/v1/data-sources/{id}/rowsread scopePreview rows of a Google Sheet
The first rows of the synced copy of a sheet (default 25, max 100), as column to value maps.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Data source id, as returned by list_data_sources. |
limit | integer | no | Rows to return (default 25). |
MCP tool: preview_data_source_rows
/api/v1/data-sourceswrite scopeConnect 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | yes | Google Sheets link, e.g. https://docs.google.com/spreadsheets/d/<id>/edit?gid=0 (the gid selects the tab). |
name | string | no | Display name (default 'Google Sheet N'). |
mode | string | no | lookup: rows describe ads/campaigns and are matched by id or name. global: the first row applies to every asset. One of: lookup, global. |
match_column | string | no | Column whose values identify the asset (id or name) in lookup mode. Defaults to the first column. |
MCP tool: connect_data_source
/api/v1/data-sources/{id}write scopeUpdate 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Data source id, as returned by list_data_sources. |
name | string | no | New display name. |
mode | string | no | lookup: rows describe ads/campaigns and are matched by id or name. global: the first row applies to every asset. One of: lookup, global. |
match_column | string | no | Existing column to match rows on. |
MCP tool: update_data_source
/api/v1/data-sources/{id}/refreshwrite scopeRefresh 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Data source id, as returned by list_data_sources. |
MCP tool: refresh_data_source
/api/v1/data-sources/{id}write scopeRemove 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | Data source id, as returned by list_data_sources. |
MCP tool: delete_data_source
Supabase
/api/v1/supabaseread scopeSupabase 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
/api/v1/supabase/connect-urlread scopeGet 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
/api/v1/supabase/connectwrite scopeConnect 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
project_url | string | yes | Supabase project URL, e.g. https://abcdefgh.supabase.co. |
api_key | string | yes | Supabase anon, publishable or read-only service key. Stored encrypted, never returned. |
schema | string | no | Postgres schema to read (default public). |
MCP tool: connect_supabase_with_key
/api/v1/supabase/projectsread scopeList 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
/api/v1/supabase/select-projectwrite scopePick 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
ref | string | yes | Project ref from list_supabase_projects. |
schema | string | no | Postgres schema to read (default public). |
MCP tool: select_supabase_project
/api/v1/supabase/tablesread scopeDiscover 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
schema | string | no | Postgres schema to read (default public). |
MCP tool: list_supabase_tables
/api/v1/supabase/columnsread scopeList the columns of a Supabase table
Columns of one table, read from a sample row; for projects that do not expose their schema description.
| Parameter | Type | Required | Description |
|---|---|---|---|
table | string | yes | Table name. |
schema | string | no | Postgres schema to read (default public). |
MCP tool: get_supabase_table_columns
/api/v1/supabase/mappingwrite scopeSave 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
mapping | object | yes | Table 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
/api/v1/supabase/syncwrite scopeSync 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
/api/v1/supabasewrite scopeDisconnect 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
/api/v1/bigqueryread scopeBigQuery 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
/api/v1/bigquery/connect-urlread scopeGet 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
/api/v1/bigquery/connectwrite scopeConnect 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
key_json | string | yes | Contents of the service-account JSON key file. Stored encrypted, never returned. |
MCP tool: connect_bigquery_with_service_account
/api/v1/bigquery/projectsread scopeList BigQuery projects
Google Cloud projects the connected credentials can read.
MCP tool: list_bigquery_projects
/api/v1/bigquery/datasetsread scopeList datasets of a BigQuery project
Lists the BigQuery datasets in one Google Cloud project that the connected credentials can read.
| Parameter | Type | Required | Description |
|---|---|---|---|
project | string | yes | Project id from list_bigquery_projects. |
MCP tool: list_bigquery_datasets
/api/v1/bigquery/select-datasetwrite scopePick 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
project | string | yes | Project id. |
dataset | string | yes | Dataset id. |
location | string | no | Dataset location, e.g. US or EU (optional). |
MCP tool: select_bigquery_dataset
/api/v1/bigquery/mappingwrite scopeSave 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
mapping | object | yes | Table 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
/api/v1/bigquery/syncwrite scopeSync 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
/api/v1/bigquerywrite scopeDisconnect BigQuery
Removes the stored BigQuery credentials and stops syncing. Already imported ad data stays. Confirm with the user before calling.
MCP tool: disconnect_bigquery