{"openapi":"3.1.0","info":{"title":"SIGNL Developer API","version":"1.0.0","summary":"Server-side conversion ingestion and workflow events for SIGNL.","description":"The stable SIGNL integration surface for sending first-party events and leads. All money values are integer pence. API keys are minted under the client's Integrations page (API keys), or organisation Settings → API Keys. Call GET /api/keys/me first: it returns the key's scopes, its workspace and the surfaces it can reach. A 401 means the key is missing, unknown or revoked. A valid key that lacks a scope gets 403 insufficient_scope, naming what it has and what was needed. Scopes: ingest:write — Send events and leads in (/api/ingest/server, /api/webhooks/inbound). Grants no read access. read — Read workspace data over MCP and the Zapier app. write — Change workspace-internal records: leads, deals, calls, tasks. write:sensitive — Actions that reach a real person: cadence enrolment, activating an automation. write:builder — Author forms and booking calendars, in draft only. Publishing stays a human action. write:ads — Pause, resume an ad campaign and change its daily budget. Real ad spend — kept separate from write:sensitive. write:agency — Run the agency: create, edit, archive and restore clients. Organisation-wide keys only. New clients count against your plan. write:finance — Generate the agency’s statement drafts and add adjustments to a draft. Organisation-wide keys only. Off by default and not part of Full access; issuing, voiding and recording payment stay in SIGNL. recordings:write — Reserve and finalise screen recordings from the recorder extension. Dashboard-internal endpoints are intentionally excluded from this contract."},"servers":[{"url":"https://www.trysignl.app"}],"tags":[{"name":"Events","description":"First-party server event ingestion."},{"name":"Webhooks","description":"Generic workflow events for Zapier, Make, n8n, and custom systems."},{"name":"MCP","description":"Model Context Protocol. Requires the read scope. Organisation-wide keys name a workspace on each call."},{"name":"Keys","description":"Introspect the API key you are holding."},{"name":"Tools","description":"Every SIGNL tool over REST: the same definitions and scopes as MCP."},{"name":"Builder","description":"Forms and booking pages, as drafts. Reads need read; writes need write:builder. Live forms and pages are refused."}],"paths":{"/api/ingest/server":{"post":{"operationId":"ingestServerEvent","x-required-scope":"ingest:write","summary":"Ingest a server-side event","description":"Records an identified visitor event, attributes optional revenue, and runs matching automations. Use idempotency_key for safe retries.","tags":["Events"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerIngestRequest"}}}},"responses":{"200":{"description":"Event accepted or deduplicated.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"deduped":{"type":"boolean"},"visitorId":{"type":["string","null"],"format":"uuid"}},"required":["ok","visitorId"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"},"503":{"$ref":"#/components/responses/Unavailable"}}}},"/api/webhooks/inbound":{"post":{"operationId":"receiveInboundWebhook","x-required-scope":"ingest:write","summary":"Send a workflow event","description":"Creates or updates a lead, records the event, and runs automations. Client-scoped API keys need no query parameter; organisation keys require clientId.","tags":["Webhooks"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"clientId","in":"query","required":false,"description":"Client UUID for organisation-scoped API keys or legacy webhook secrets.","schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Stable retry key. Reusing it prevents a duplicate visitor event.","schema":{"type":"string","maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundWebhookRequest"}}}},"responses":{"200":{"description":"Event accepted.","content":{"application/json":{"schema":{"type":"object","properties":{"received":{"type":"boolean","const":true},"visitor_id":{"type":["string","null"],"format":"uuid"},"event_type":{"type":"string"}},"required":["received","visitor_id","event_type"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"},"503":{"$ref":"#/components/responses/Unavailable"}}}},"/api/mcp":{"post":{"operationId":"mcpStreamableHttp","x-required-scope":"read","summary":"Use the SIGNL MCP server","description":"Stateless Streamable HTTP MCP endpoint. Requires the read scope. Tool schemas are discovered through the MCP protocol. write, write:sensitive, write:builder, write:ads, write:agency and write:finance (the last two organisation-wide keys only) each register their own tools, independently; a key never sees a tool it cannot call in tools/list, and every write is audit-logged against the key. A client-scoped key is pinned to its workspace and no tool accepts a workspace argument. An organisation-wide key spans every workspace in its organisation: call list_workspaces first, then pass workspace (a slug) to every other tool. Slugs resolve inside the key's own organisation only.","tags":["MCP"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"MCP JSON-RPC 2.0 request.","additionalProperties":true}}}},"responses":{"200":{"description":"MCP Streamable HTTP response."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/builder/forms":{"get":{"operationId":"listforms","x-required-scope":"read","summary":"List forms, or read one in full with ?id=","tags":["Builder"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"workspace","in":"query","required":false,"schema":{"type":"string"},"description":"Workspace slug. Required for an organisation-wide key."}],"responses":{"200":{"description":"The forms, or one form."},"400":{"description":"Invalid body, or a definition that does not validate. Unknown fields, status included, are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the scope; the body names both."},"404":{"description":"Not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}},"post":{"operationId":"createform","x-required-scope":"write:builder","summary":"Create a draft form","description":"Always a draft. A person publishes it in SIGNL.","tags":["Builder"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"additionalProperties":true}}}},"responses":{"201":{"description":"The draft form, with its id and slug."},"400":{"description":"Invalid body, or a definition that does not validate. Unknown fields, status included, are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the scope; the body names both."},"429":{"$ref":"#/components/responses/RateLimited"}}},"patch":{"operationId":"updateform","x-required-scope":"write:builder","summary":"Edit a draft form","description":"Refuses anything that is not a draft with 409, so a live form is never edited through the API.","tags":["Builder"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["form_id"],"additionalProperties":true}}}},"responses":{"200":{"description":"The fields changed."},"400":{"description":"Invalid body, or a definition that does not validate. Unknown fields, status included, are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the scope; the body names both."},"404":{"description":"Not found in this workspace."},"409":{"description":"The form is not a draft."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/builder/booking-pages":{"get":{"operationId":"listbookingpages","x-required-scope":"read","summary":"List booking pages, or read one in full with ?id=","tags":["Builder"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"workspace","in":"query","required":false,"schema":{"type":"string"},"description":"Workspace slug. Required for an organisation-wide key."}],"responses":{"200":{"description":"The booking pages, or one booking page."},"400":{"description":"Invalid body, or a definition that does not validate. Unknown fields, status included, are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the scope; the body names both."},"404":{"description":"Not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}},"post":{"operationId":"createbookingpage","x-required-scope":"write:builder","summary":"Create a draft booking page","description":"Always a draft. A person publishes it in SIGNL.","tags":["Builder"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"additionalProperties":true}}}},"responses":{"201":{"description":"The draft booking page, with its id and slug."},"400":{"description":"Invalid body, or a definition that does not validate. Unknown fields, status included, are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the scope; the body names both."},"429":{"$ref":"#/components/responses/RateLimited"}}},"patch":{"operationId":"updatebookingpage","x-required-scope":"write:builder","summary":"Edit a draft booking page","description":"Refuses anything that is not a draft with 409, so a live booking page is never edited through the API.","tags":["Builder"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["page_id"],"additionalProperties":true}}}},"responses":{"200":{"description":"The fields changed."},"400":{"description":"Invalid body, or a definition that does not validate. Unknown fields, status included, are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the scope; the body names both."},"404":{"description":"Not found in this workspace."},"409":{"description":"The booking page is not a draft."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/builder/forms/import":{"post":{"operationId":"importForm","x-required-scope":"write:builder","summary":"Import a Typeform from its public link, as a draft","description":"Fetches the public form page and converts its definition. The response lists `unmapped`: what could not come across (score or variable logic, dropped screens).","tags":["Builder"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"additionalProperties":false,"properties":{"url":{"type":"string","description":"https://<account>.typeform.com/to/<id>"},"name":{"type":"string"},"workspace":{"type":"string","description":"Required for an organisation-wide key."}}}}}},"responses":{"201":{"description":"The draft form, its field ids, and the unmapped list."},"400":{"description":"Not a Typeform link, or the page carried no form."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write:builder."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools":{"get":{"operationId":"listTools","summary":"List the tools the calling key can use","description":"Any valid key may call this. Each tool comes with its path, required scope, MCP annotations and input JSON Schema; tools the key cannot use are listed with the scope they need.","tags":["Tools"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Available and unavailable tools."},"401":{"$ref":"#/components/responses/Unauthorised"}}}},"/api/v1/tools/get_client_snapshot":{"post":{"operationId":"get_client_snapshot","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Get client snapshot","description":"Compact 30-day KPI snapshot for this client: leads, calls, deals, pipeline, top leads, cadences. Start here for open-ended questions.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_leads":{"post":{"operationId":"list_leads","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List leads","description":"Leads (visitors) for this client, most recently seen first. Each lead has name (full) plus firstName and lastName, which are null when unknown (never guessed from the full name). Filter by free-text search, tag, minimum intent score, or customer status.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"search":{"description":"Match against name, email, or phone.","type":"string"},"tag":{"description":"Only leads carrying this tag.","type":"string"},"min_intent_score":{"description":"Only leads at or above this intent score.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"is_customer":{"description":"Filter to customers (true) or non-customers (false).","type":"boolean"},"limit":{"description":"Max results, default 25, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_lead":{"post":{"operationId":"get_lead","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Get lead detail","description":"Full detail for one lead plus their recent journey events, notes, and calls.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"lead_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Lead id from list_leads."}},"required":["lead_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_calls":{"post":{"operationId":"list_calls","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List calls","description":"Calls for this client, most recent first. Filter by lead, closer, outcome, type or a date window. Each call carries leadId, callType, repId and setterId so it can be joined to a lead or rep without a get_call per row.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"status":{"description":"Filter by call status.","type":"string","enum":["booked","showed","no_show","cancelled","completed"]},"when":{"description":"\"past\": calls already due, newest first (use this to find calls needing an outcome). \"upcoming\": still to come, soonest first. Omit for both, newest first.","type":"string","enum":["past","upcoming"]},"lead_id":{"description":"Only this lead's calls. The `leadId` on each call; also the id from list_leads.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"talent_id":{"description":"Only calls assigned to this closer. From list_talent.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"outcome":{"type":"string","enum":["won","lost","follow_up","no_decision","pending","disqualified","no_pitch_dq"]},"call_type":{"type":"string","enum":["discovery","closing","consult","follow_up"]},"since":{"description":"Scheduled at or after this ISO 8601 date or timestamp.","type":"string"},"until":{"description":"Scheduled on or before this ISO 8601 date or timestamp.","type":"string"},"limit":{"description":"Max results, default 25, capped at 50.","type":"integer","minimum":1,"maximum":50},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_pipelines":{"post":{"operationId":"list_pipelines","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List pipelines and stages","description":"CRM pipelines with their ordered stages. Call this to get stage ids before creating or moving a deal.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_deals":{"post":{"operationId":"list_deals","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List deals","description":"CRM deals for this client, most recently updated first.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"status":{"description":"Filter by deal status.","type":"string","enum":["open","won","lost"]},"pipeline_id":{"description":"Restrict to one pipeline.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"limit":{"description":"Max results, default 25, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_tasks":{"post":{"operationId":"list_tasks","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List tasks","description":"Tasks for this client, soonest due first, or newest first with sort \"newest\".","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"status":{"description":"Filter by task status.","type":"string","enum":["open","done"]},"sort":{"description":"\"due\" (default) or \"newest\" by creation time.","type":"string","enum":["due","newest"]},"lead_id":{"description":"Only tasks about this lead.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"assignee_member_id":{"description":"Only tasks assigned to this team member. The `member_id` on a list_talent row, or `assigneeMemberId` on a task.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"overdue":{"description":"Only open tasks already past their due date.","type":"boolean"},"limit":{"description":"Max results, default 25, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_commissions_summary":{"post":{"operationId":"get_commissions_summary","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Get commissions summary","description":"Pending, approved, and paid commission totals (integer pence) for this client.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_affiliate_summary":{"post":{"operationId":"get_affiliate_summary","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Get affiliate summary","description":"Affiliate/JV partner totals for this client: active partners, verified postback conversions, and outstanding payout (integer pence).","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_leaderboard":{"post":{"operationId":"get_leaderboard","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Get leaderboard","description":"Rep leaderboard for this client: paid commission, total calls and close rate (won over calls with a recorded outcome), ranked. Includes every rep with a call or a paid commission.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_attribution_summary":{"post":{"operationId":"get_attribution_summary","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Get attribution summary","description":"Multi-touch revenue attribution by source/medium for this client.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"model":{"description":"Attribution model, default first_touch.","type":"string","enum":["first_touch","last_touch","linear","u_shaped","time_decay"]},"days":{"description":"Lookback window in days, default 30.","type":"integer","minimum":1,"maximum":365}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_funnel_summary":{"post":{"operationId":"get_funnel_summary","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Get funnel summary","description":"Funnel for this client over a window: page views, leads captured, applied and qualified (only when the client has a form with qualification rules; `applicationForms` counts them), booked, showed, won, with stage-to-stage conversion, booked/showed/won by source, and the worst leak priced in money. Use it for \"where am I losing people\".","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"days":{"description":"Lookback window in days, default 30.","type":"integer","minimum":1,"maximum":365}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_metric_figures":{"post":{"operationId":"get_metric_figures","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Get metric figures","description":"Named figures SIGNL has already worked out for this client, the same ones the dashboards show (collected revenue, show rate, close rate and the rest), each with its value as displayed, the period before it, the change and how it was reached. Call it with no `metrics` to list the keys and what each counts, then with up to 12 keys to read them. Quote these figures in an answer; do not state a number that none of them gives.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"metrics":{"description":"Metric keys from the catalogue. Leave out to list the catalogue.","maxItems":40,"type":"array","items":{"type":"string","minLength":1,"maxLength":80}},"range":{"description":"today, 7d, 30d, 90d, mtd, qtd, ytd or all. Default 30d. Days follow the client time zone.","type":"string","enum":["today","7d","30d","90d","mtd","qtd","ytd","all"]},"compare":{"description":"Also read the period before, for the change. Not for all time.","type":"boolean"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_vsl_summary":{"post":{"operationId":"get_vsl_summary","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Get VSL summary","description":"Every VSL video with views, completed views, average watch time and the 15-second stretch where the most viewers stop watching (needs 50 views). All-time; up to 20 videos.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_tracking_summary":{"post":{"operationId":"get_tracking_summary","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Get tracking summary","description":"Visitor behaviour over a window (page views by hour and weekday in UTC, device, browser, country, median time on page, scroll depth, returning visitors) and, per tracking source (see list_sources), visitors, net revenue, revenue per visitor and share of revenue over the same window, by first or last touch.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"days":{"description":"Lookback window in days, default 30, max 90.","type":"integer","minimum":1,"maximum":90},"model":{"description":"Which touch gets the revenue, default first_touch.","type":"string","enum":["first_touch","last_touch"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/check_tracking_install":{"post":{"operationId":"check_tracking_install","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"summary":"Check tracking install","description":"Fetch one page of the client's site and check the SIGNL tag on it: present, this workspace's id, loaded from SIGNL, async, not doubled, held by a consent tool, plus events from that host in the last 24 hours and 14 days. Reads the HTML only (no JavaScript on the page is run), so a page built in the browser answers status unknown. Returns status (ok, degraded, broken, not_installed, unknown) and findings, each with an explanation and a fix. Ten checks a minute per workspace.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"url":{"type":"string","minLength":1,"maxLength":2000,"description":"The page to check, e.g. https://yoursite.com/apply. Public http(s) addresses only."}},"required":["url"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_email_stats":{"post":{"operationId":"get_email_stats","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Get email stats","description":"Email performance from the client's connected Kit account: sent, opened and clicked with open and click rates over Kit's last 90 days, subscriber growth, and per-broadcast stats for recent broadcasts. Says so when Kit is not connected.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_ad_campaigns":{"post":{"operationId":"list_ad_campaigns","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List ad campaigns","description":"Ad campaigns SIGNL has seen for this client, newest first: platform, status, objective and currency, and whether pause, resume and budget can act on it (`controllable`: Meta and Whop today). The ids are what pause_ad_campaign, resume_ad_campaign and update_ad_campaign_budget take.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"platform":{"description":"Only campaigns on this platform.","type":"string","enum":["meta","google","tiktok","youtube","linkedin","whop","other"]},"limit":{"description":"Max results, default 50, capped at 100.","type":"integer","minimum":1,"maximum":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_talent":{"post":{"operationId":"list_talent","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List talent","description":"Sales roster (closers, setters, managers) for this client. Use these ids to assign calls.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_automations":{"post":{"operationId":"list_automations","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List automations","description":"Automations for this client with trigger type, active state, and run counts.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"limit":{"description":"Max results, default 100, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_cadences":{"post":{"operationId":"list_cadences","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List cadences","description":"Outbound follow-up cadences for this client. Use these ids with enroll_lead_in_cadence.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"limit":{"description":"Max results, default 100, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_tracked_links":{"post":{"operationId":"list_tracked_links","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List tracked links","description":"Tracked links with clicks, conversions, and attributed revenue (integer pence), each with its five UTMs, its source key (see list_sources) and the content item it sits under.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"limit":{"description":"Max results, default 100, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_sources":{"post":{"operationId":"list_sources","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List traffic sources","description":"Every traffic source a tracked link can sit under: the built-in ones (YouTube, Instagram, Kit, Email…) and this client’s own, with each one’s key, default utm_source and utm_medium, whether it is hidden in the Source tab, and how many content items it has. Pass a key as create_tracked_link’s `source`.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_content_performance":{"post":{"operationId":"get_content_performance","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Get content performance","description":"One row per content item in the Source tab (a video, a post, a broadcast or a campaign filed under a source such as YouTube, Instagram, Email or your own), with the numbers that tab shows: the item's links, their clicks, and the forms, calls booked and revenue (integer pence) of people whose first tracked link was one of them, plus their calls that showed (shows), calls won (wins) and ledger cash by currency in minor units (cash). All time by default; days counts one window, with clicks and revenue from the dated click ledger (ledgerCovers.note says when the window starts before it). A YouTube video is one item however many links it has. Pass a source key from list_sources to see one source.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"source":{"description":"Only items under this source key (see list_sources): youtube, instagram, tiktok, email, x, or one of your own.","type":"string","pattern":"^[a-z][a-z0-9_-]{0,31}$"},"sort":{"description":"Order: revenue (default), bookings, forms, clicks, newest or name.","type":"string","enum":["newest","revenue","bookings","forms","clicks","name"]},"days":{"description":"Count only the last N days (1 to 365). Leave out for all time.","type":"integer","minimum":1,"maximum":365},"limit":{"description":"Max results, default 50, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_forms":{"post":{"operationId":"list_forms","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List forms","description":"Forms for this client with view, start, submission counts and completion rate.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"limit":{"description":"Max results, default 100, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_form_submissions":{"post":{"operationId":"list_form_submissions","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List form submissions","description":"Recent form submissions with answers, most recent first.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"form_id":{"description":"Restrict to one form.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"limit":{"description":"Max results, default 25, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_form":{"post":{"operationId":"get_form","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Get form","description":"One form in full: fields with their stable ids, pages, endings, qualification rules and settings. Read this before update_form, and send the ids back, so rules keep matching.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"form_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["form_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_booking_pages":{"post":{"operationId":"list_booking_pages","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List booking pages","description":"Booking pages (calendars) for this client with status, duration and booking count.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"limit":{"description":"Max results, default 100, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_booking_page":{"post":{"operationId":"get_booking_page","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Get booking page","description":"One booking page with every setting that changes how it behaves: duration, buffer, notice, window, weekly hours, intake questions, location, hosts and endings.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"page_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["page_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_availability_schedules":{"post":{"operationId":"list_availability_schedules","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List availability schedules","description":"Shared weekly-hours schedules a booking page can use instead of its own hours, with their time zones.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_call":{"post":{"operationId":"get_call","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Get call detail","description":"One call in full: lead, rep, status, outcome, objection, notes, recording summary and the post-call record.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"call_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"From list_calls."}},"required":["call_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_deal":{"post":{"operationId":"get_deal","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Get deal detail","description":"One deal in full, including notes and custom fields.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"deal_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"From list_deals."}},"required":["deal_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_call_transcript":{"post":{"operationId":"get_call_transcript","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Get call transcript","description":"The recording transcript of one call, up to 20,000 characters per response. Check `hasMore` and send `nextOffset` back as `offset` to read the rest. Personal data: read it to answer a question about a call, not to copy it elsewhere. Empty until transcription has run (see `transcriptionStatus`).","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"call_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"From list_calls."},"offset":{"description":"Character offset; `nextOffset` from the previous slice.","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["call_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_tags":{"post":{"operationId":"list_tags","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List tags","description":"Every tag in use on this client’s leads with how many leads carry it, most used first. Use it to pick a tag for list_leads or update_lead instead of guessing spelling.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_ad_performance":{"post":{"operationId":"get_ad_performance","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Get ad performance","description":"Ad campaigns over the last N days (default 30, at most 90): spend (integer pence, `null` when no spend row exists, which is unmeasured and not free), impressions, clicks, CTR and CPC, highest spend first. Same numbers as the Ads page.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"days":{"description":"Lookback window in days, default 30, max 90.","type":"integer","minimum":1,"maximum":90}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_offers":{"post":{"operationId":"list_offers","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List offers","description":"What this client sells: name, description, price (integer minor units in `currency`) and whether it is active. Offer ids link calls and deals to what was sold.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"active":{"description":"Only active (true) or inactive (false) offers.","type":"boolean"},"limit":{"description":"Max results, default 25, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_contracts":{"post":{"operationId":"list_contracts","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List contracts","description":"Agreements sent for e-signature, newest first: status, signed total (integer minor units), the lead it is for (`leadId`, null for someone kept out of the CRM), the linked deal (often null: a contract need not have one) and dates. `get_contract` has the text and each signer.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"lead_id":{"description":"Only this lead’s contracts (a lead id from list_leads).","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"description":"Only contracts in this status: draft, sent, viewed, signed, declined, expired or voided. A fully signed contract is \"signed\".","type":"string","enum":["draft","sent","viewed","signed","declined","expired","voided"]},"limit":{"description":"Max results, default 25, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_contract":{"post":{"operationId":"get_contract","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Get contract","description":"One contract with its text (first 20,000 characters), its sections, the template version it was drafted from, the fields the signer fills in (key, type, label, required) with the values they entered once signed, and each signer’s name, email, role and status. Signing links and drawn signatures are never returned.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"contract_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"From list_contracts."}},"required":["contract_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_contract_templates":{"post":{"operationId":"list_contract_templates","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List contract templates","description":"This workspace’s active contract templates, newest edit first: id, name, current version, whether it is a copy of an agency template and when it last changed. `get_contract_template` has the sections.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"limit":{"description":"Max results, default 25, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_contract_template":{"post":{"operationId":"get_contract_template","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Get contract template","description":"One contract template at its current version: its sections (key, heading, text, whether locked) and line items. Templates are written in the app.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"From list_contract_templates."}},"required":["id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_webinars":{"post":{"operationId":"list_webinars","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List webinars","description":"Webinars for this client, newest first (deleted ones excluded): title, slug, mode, status and timezone.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"status":{"description":"Only webinars in this status.","type":"string"},"limit":{"description":"Max results, default 25, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_webinar_registrations":{"post":{"operationId":"list_webinar_registrations","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List webinar registrations","description":"Who registered for one webinar, newest first: name, email, status, session time, how much they watched and whether they clicked the call to action.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"webinar_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"From list_webinars."},"status":{"description":"Only registrations in this status.","type":"string"},"limit":{"description":"Max results, default 25, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["webinar_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_custom_fields":{"post":{"operationId":"list_custom_fields","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List custom fields","description":"The custom fields this client added, with key, label, type, choices and what they attach to (leads, calls or deals).","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"target":{"description":"Only fields on this object, e.g. \"lead\" or \"deal\".","type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_dni_numbers":{"post":{"operationId":"list_dni_numbers","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List tracking numbers","description":"The client’s call-tracking phone numbers: number, name, where it forwards, country and status.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_data_tables":{"post":{"operationId":"list_data_tables","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List data tables","description":"The client’s own tables (the Data page): name, description, field definitions and whether the rows come from a form, booking page or report or are entered by hand. Use the ids with list_data_records.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_data_records":{"post":{"operationId":"list_data_records","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List data records","description":"Rows of one data table, newest first. `values` is keyed by the table’s field ids from list_data_tables.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"table_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"From list_data_tables."},"limit":{"description":"Max results, default 25, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["table_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_dashboards":{"post":{"operationId":"list_dashboards","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List dashboards","description":"The client’s custom dashboards: name, description, which is the default, whether the client portal shows it, and how many widgets it has.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_import_runs":{"post":{"operationId":"list_import_runs","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List import runs","description":"Imports and syncs, newest first: mode, status, file name, rows total, processed and failed, per-kind counts, any error, and whether it was undone.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"status":{"description":"Only runs in this status, e.g. \"failed\" or \"completed\".","type":"string"},"limit":{"description":"Max results, default 25, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_training_assignments":{"post":{"operationId":"list_training_assignments","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List training assignments","description":"Role-play practice assigned to reps, newest first: who, against which persona, status, due date and note.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"status":{"description":"Only assignments in this status.","type":"string"},"talent_id":{"description":"Only this rep, from list_talent.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"limit":{"description":"Max results, default 25, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_task":{"post":{"operationId":"get_task","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Get task detail","description":"One task by id.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"task_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"From list_tasks."}},"required":["task_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_payments":{"post":{"operationId":"list_payments","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List payments","description":"Payments received from connected providers (Stripe, Whop and others), newest first. Amounts are integer minor units in the currency returned beside them; refunds point at the payment they reverse.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"since":{"description":"ISO 8601 timestamp; only payments on or after it.","type":"string"},"kind":{"description":"Filter by kind, e.g. \"charge\" or \"refund\".","type":"string"},"limit":{"description":"Max results, default 25, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_payment_plans":{"post":{"operationId":"list_payment_plans","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List payment plans","description":"Payment plans with every instalment, what is paid, and what is due. Use for \"who is behind on their plan\".","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"status":{"type":"string","enum":["active","completed","defaulted"]},"limit":{"description":"Max results, default 25, capped at 100.","type":"integer","minimum":1,"maximum":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_eod_reports":{"post":{"operationId":"list_eod_reports","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List EOD reports","description":"End-of-day reports from the sales team, newest first: calls taken, shows, offers, closes, cash collected and the template answers.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"talent_id":{"description":"From list_talent.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"since":{"description":"ISO 8601 date; only reports submitted on or after it.","type":"string"},"limit":{"description":"Max results, default 25, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_commission_entries":{"post":{"operationId":"list_commission_entries","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List commission entries","description":"The individual commission rows behind get_commissions_summary, with the call or deal each came from.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"status":{"type":"string","enum":["pending","approved","paid","disputed"]},"talent_id":{"description":"From list_talent.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"limit":{"description":"Max results, default 25, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_recordings":{"post":{"operationId":"list_recordings","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List recordings","description":"Screen and video recordings in this workspace. Share links are not returned.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"limit":{"description":"Max results, default 25, capped at 100.","type":"integer","minimum":1,"maximum":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_sops":{"post":{"operationId":"list_sops","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List SOPs","description":"Standard operating procedures, with their section and a short excerpt of each. Use get_sop for the full text.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"limit":{"description":"Max results, default 25, capped at 100.","type":"integer","minimum":1,"maximum":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_sop":{"post":{"operationId":"get_sop","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Get SOP","description":"One SOP with its full body.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"sop_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"From list_sops."}},"required":["sop_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_cadence_enrollments":{"post":{"operationId":"list_cadence_enrollments","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List cadence enrolments","description":"Leads enrolled in cadences: which step they are on, when the next action runs, and whether they replied or failed.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"cadence_id":{"description":"From list_cadences.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"type":"string","enum":["active","paused","completed","replied","failed"]},"limit":{"description":"Max results, default 25, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_messages":{"post":{"operationId":"list_messages","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List a lead's messages","description":"One lead's texts, WhatsApp messages and emails, newest first: what SIGNL sent (a subject or the first 80 characters, with delivery status) and what the lead replied by text or WhatsApp. Inbound email is not recorded yet.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"lead_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"From list_leads."},"channel":{"type":"string","enum":["sms","whatsapp","email"]},"direction":{"description":"in = the lead wrote, out = SIGNL sent.","type":"string","enum":["in","out"]},"limit":{"description":"Max results, default 25, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["lead_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_usage":{"post":{"operationId":"get_usage","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Get credit usage","description":"What this workspace has spent in credits, and what the caller has left: credits used in a window (default this month, UTC), split by vendor (AI, texts and calls, transcription, email, Meeting Bots) and by feature, optionally by day, plus the caller's own balance (credits belong to each person). Use it for \"what have I spent on texts this month?\". The balance is null when no person is calling.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"from":{"description":"Start of the window, ISO date. Default: the first of this month (UTC).","type":"string"},"to":{"description":"End of the window, ISO date, exclusive. Default: now. At most 366 days from `from`.","type":"string"},"vendor":{"description":"anthropic = AI, twilio = texts and calls, deepgram = transcription, resend = email, recall = Meeting Bots.","type":"string","enum":["anthropic","twilio","deepgram","resend","recall"]},"by_day":{"description":"Add a per-day breakdown.","type":"boolean"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_lead_history":{"post":{"operationId":"list_lead_history","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List a lead's owner history","description":"The recorded changes to one lead's owner, newest first: who it was, who it became, who changed it (a member, the Agent with the member who approved it, an API key) and when. History starts on 5 Oct 2026; earlier changes are not reconstructed.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"lead_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"From list_leads."},"limit":{"description":"Max results, default 25, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["lead_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_deal_history":{"post":{"operationId":"list_deal_history","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List a deal's stage history","description":"The recorded stage moves of one deal, newest first: from, to, who moved it (a member, the Agent with the member who approved it, an automation, an API key) and when, plus the time spent in each stage. History starts on 5 Oct 2026; earlier moves are not reconstructed.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"deal_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"From list_deals."},"limit":{"description":"Max results, default 25, capped at 100.","type":"integer","minimum":1,"maximum":100},"offset":{"description":"Skip this many results. Pass `nextOffset` from the previous page; the response says `hasMore`.","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["deal_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/whoami":{"post":{"operationId":"whoami","x-required-scope":"read","x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Who am I","description":"Which workspace this connection is working in and who it is acting as: the workspace name and slug, whether it acts as a team member or an API key or connector (and its name), and the time zone dates are read in. Call it first when you start a task with no context. It returns no ids, keys or permissions.","tags":["Tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/create_lead":{"post":{"operationId":"create_lead","x-required-scope":"write","x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"summary":"Create lead","description":"Create a lead for this client. Deduplicates on email then phone — if a matching lead exists it is returned instead of creating a duplicate.","tags":["Tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"name":{"description":"Full name. Kept as sent; never split into first and last.","type":"string"},"first_name":{"description":"Given name, when known. Stored as an explicit value.","type":"string","maxLength":200},"last_name":{"description":"Family name, when known. Stored as an explicit value.","type":"string","maxLength":200},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"phone":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"intent_score":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"source":{"description":"First-touch source, default \"mcp\".","type":"string"},"medium":{"description":"First-touch medium, default \"api\".","type":"string"},"campaign":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"Created."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/update_lead":{"post":{"operationId":"update_lead","x-required-scope":"write","x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"summary":"Update lead","description":"Update a lead. Tag changes are additive/subtractive via add_tags and remove_tags — existing tags are never blindly overwritten.","tags":["Tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"lead_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"description":"Full name. Changing it alone clears first_name and last_name when they no longer match it.","type":"string"},"first_name":{"description":"Given name. Omit to keep; null or empty clears. The full name follows first and last unless name is also sent.","anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"last_name":{"description":"Family name. Omit to keep; null or empty clears.","anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"phone":{"type":"string"},"intent_score":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"is_customer":{"type":"boolean"},"add_tags":{"type":"array","items":{"type":"string"}},"remove_tags":{"type":"array","items":{"type":"string"}}},"required":["lead_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"Created."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/add_lead_note":{"post":{"operationId":"add_lead_note","x-required-scope":"write","x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"summary":"Add lead note","description":"Append a timestamped note to a lead. Attributed to the API key that wrote it.","tags":["Tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"lead_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"body":{"type":"string","minLength":1,"maxLength":5000}},"required":["lead_id","body"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"Created."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/create_call":{"post":{"operationId":"create_call","x-required-scope":"write","x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"summary":"Create call","description":"Log a booked call for this client.","tags":["Tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"lead_name":{"type":"string","minLength":1},"scheduled_at":{"type":"string","description":"ISO 8601 timestamp."},"lead_email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"lead_phone":{"type":"string"},"call_type":{"type":"string","enum":["discovery","closing","consult","follow_up"]},"talent_id":{"description":"Rep to assign, from list_talent. Must be active.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"setter_talent_id":{"description":"The active setter who booked it, from list_talent. Setter commission reads this.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"offer_id":{"description":"What the call is selling, from list_offers.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"lead_id":{"description":"Link to an existing lead.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"duration_minutes":{"type":"integer","minimum":1,"maximum":600},"notes":{"type":"string"}},"required":["lead_name","scheduled_at"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"Created."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/update_call":{"post":{"operationId":"update_call","x-required-scope":"write","x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"summary":"Update call","description":"Update a call — typically logging the outcome after it happened, or pushing its transcript or recording link from any call recorder. Money is integer pence. Does not create commission entries; the commissions engine derives those from rules.","tags":["Tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"call_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"type":"string","enum":["booked","showed","no_show","cancelled","completed"]},"outcome":{"type":"string","enum":["won","lost","follow_up","no_decision","pending","disqualified","no_pitch_dq"]},"deal_value_pence":{"description":"Integer pence, never a decimal amount.","type":"integer","minimum":0,"maximum":9007199254740991},"objection":{"type":"string"},"notes":{"type":"string"},"talent_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"setter_talent_id":{"description":"The active setter who booked it, from list_talent.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"offer_id":{"description":"What was sold, from list_offers.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"cancel_reason":{"description":"Why it was cancelled; use with status \"cancelled\".","type":"string","maxLength":1000},"recording_transcript":{"description":"The call transcript as plain text, from any recorder. Feeds call scoring. Refused if the call already has one, unless replace_transcript is true.","type":"string","maxLength":100000},"replace_transcript":{"description":"Set true to replace a transcript the call already has.","type":"boolean"},"recording_url":{"description":"The recording link, stored on the call. A Fathom, Fireflies or Zoom link also imports the transcript from that tool when it is connected.","type":"string","format":"uri"}},"required":["call_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"Created."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/create_deal":{"post":{"operationId":"create_deal","x-required-scope":"write","x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"summary":"Create deal","description":"Create a CRM deal. Call list_pipelines first to get a valid stage_id.","tags":["Tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"title":{"type":"string","minLength":1},"contact_name":{"type":"string","minLength":1},"stage_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Stage id from list_pipelines."},"contact_email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"value_pence":{"description":"Integer pence.","type":"integer","minimum":0,"maximum":9007199254740991},"probability":{"type":"integer","minimum":0,"maximum":100},"expected_close_date":{"description":"ISO date, e.g. 2026-09-01.","type":"string"},"lead_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"offer_id":{"description":"What the deal is for. Offer id from list_offers.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"notes":{"type":"string"}},"required":["title","contact_name","stage_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"Created."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/update_deal":{"post":{"operationId":"update_deal","x-required-scope":"write","x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"summary":"Update deal","description":"Update a deal — move stage, change value, or mark won/lost (with a loss_reason when lost). Moving stage keeps the pipeline consistent automatically. A stage can require fields before a deal enters it (value, close date, offer, custom fields): a move that leaves any empty is refused and names them, so set them in the same call or first.","tags":["Tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"deal_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"stage_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"type":"string","enum":["open","won","lost"]},"title":{"type":"string"},"value_pence":{"description":"Integer pence.","type":"integer","minimum":0,"maximum":9007199254740991},"probability":{"type":"integer","minimum":0,"maximum":100},"expected_close_date":{"type":"string"},"offer_id":{"description":"Offer id from list_offers, or null to clear it.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"notes":{"type":"string"},"loss_reason":{"description":"Why a lost deal was lost: price, timing, no_budget, competitor, not_a_fit, no_response or other. Needs the deal to be lost (set status to lost in the same call). null clears it. Reopening or winning a deal clears it automatically.","anyOf":[{"type":"string","enum":["price","timing","no_budget","competitor","not_a_fit","no_response","other"]},{"type":"null"}]}},"required":["deal_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"Created."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/create_task":{"post":{"operationId":"create_task","x-required-scope":"write","x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"summary":"Create task","description":"Create a task, optionally linked to a lead.","tags":["Tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"title":{"type":"string","minLength":1},"description":{"type":"string"},"due_at":{"description":"ISO 8601 timestamp, or a date. Stored as that instant in UTC; include an offset if the time matters.","type":"string"},"lead_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"assignee_member_id":{"description":"Who does it: the `member_id` on a list_talent row. Must be a team member of this workspace.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["title"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"Created."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/update_task":{"post":{"operationId":"update_task","x-required-scope":"write","x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"summary":"Update task","description":"Update or complete a task. Setting status to done stamps the completion time.","tags":["Tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"task_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"type":"string","enum":["open","done"]},"title":{"type":"string"},"description":{"type":"string"},"due_at":{"type":"string"},"assignee_member_id":{"description":"A team member (list_talent `member_id`), or null to unassign.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"lead_id":{"description":"Link the task to a lead, or null to unlink.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["task_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"Created."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/create_tracked_link":{"post":{"operationId":"create_tracked_link","x-required-scope":"write","x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"summary":"Create tracked link","description":"Create a tracked link, optionally under a traffic source and content item (list_sources). Returns the code, the short URL (`short_url`) and the native URL (`native_url`: the destination with `sg=<code>` and the UTMs). With a source, a UTM you leave out takes its default: source and medium from the source, campaign from the content item’s name, content from the link’s name.","tags":["Tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"name":{"type":"string","minLength":1},"destination_url":{"type":"string","format":"uri","description":"Absolute http(s) URL."},"source":{"description":"A source key from list_sources.","type":"string"},"content_item_id":{"description":"An existing content item. Its own source is used.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"content_item_name":{"description":"A content item under `source`: the live one with this name, else a new one.","type":"string","minLength":1,"maxLength":200},"code":{"description":"A custom code: 3 to 64 letters, numbers, dashes or underscores, unique across SIGNL. Omit for a generated one.","type":"string"},"utm_source":{"type":"string"},"utm_medium":{"type":"string"},"utm_campaign":{"type":"string"},"utm_content":{"type":"string"},"utm_term":{"type":"string"}},"required":["name","destination_url"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"Created."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/create_source":{"post":{"operationId":"create_source","x-required-scope":"write","x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"summary":"Create traffic source","description":"Add a traffic source of this client’s own (up to 40). Its key is its name as a slug; a built-in source’s name is refused. Links and content items go under it with create_tracked_link.","tags":["Tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"name":{"type":"string","minLength":1,"maxLength":40},"utm_source":{"description":"Default utm_source for its links. Defaults to the key.","type":"string","maxLength":64},"utm_medium":{"description":"Default utm_medium, e.g. bio, story, email, dm.","type":"string","maxLength":64},"icon":{"description":"brand:<id> for a logo or lucide:<Name> for an icon. Defaults to lucide:Link.","type":"string"},"default_destination_url":{"description":"Where its new links point by default.","type":"string","format":"uri"}},"required":["name"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"Created."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/create_sop":{"post":{"operationId":"create_sop","x-required-scope":"write","x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"summary":"Create SOP","description":"Write a new standard operating procedure. role_scope labels who it is for, e.g. [\"closer\"]; it does not restrict who can read it.","tags":["Tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"title":{"type":"string","minLength":1,"maxLength":200},"body":{"description":"Markdown.","type":"string","maxLength":50000},"role_scope":{"maxItems":20,"type":"array","items":{"type":"string","maxLength":50}},"section":{"description":"Group label such as \"Sales\"; blank or null leaves it unsectioned.","anyOf":[{"type":"string","maxLength":80},{"type":"null"}]}},"required":["title"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"Created."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/update_sop":{"post":{"operationId":"update_sop","x-required-scope":"write","x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"summary":"Update SOP","description":"Change an SOP. Only the fields you send change; body replaces the whole text.","tags":["Tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"sop_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"From list_sops."},"title":{"type":"string","minLength":1,"maxLength":200},"body":{"type":"string","maxLength":50000},"role_scope":{"maxItems":20,"type":"array","items":{"type":"string","maxLength":50}},"section":{"description":"Group label such as \"Sales\"; blank or null removes it from its section.","anyOf":[{"type":"string","maxLength":80},{"type":"null"}]}},"required":["sop_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"Created."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/enroll_lead_in_cadence":{"post":{"operationId":"enroll_lead_in_cadence","x-required-scope":"write:sensitive","x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"summary":"Enrol a lead in a cadence","description":"Start an outbound follow-up cadence for a lead. This sends real messages to a real person — requires the write:sensitive scope. Refuses a lead who has bounced, complained or unsubscribed when the cadence sends email.","tags":["Tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"lead_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Lead id from list_leads."},"cadence_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Cadence id from list_cadences."}},"required":["lead_id","cadence_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"Created."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write:sensitive; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/set_automation_status":{"post":{"operationId":"set_automation_status","x-required-scope":"write:sensitive","x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"summary":"Activate or pause an automation","description":"Turn an automation on or off. An active automation can contact leads, so this requires the write:sensitive scope. Switching on is refused when the published version cannot do anything (the same check as the Active toggle in SIGNL), and steps that will skip are returned as warnings. Editing the automation node graph is intentionally not exposed here.","tags":["Tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"automation_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"is_active":{"type":"boolean"}},"required":["automation_id","is_active"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"Created."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write:sensitive; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/pause_ad_campaign":{"post":{"operationId":"pause_ad_campaign","x-required-scope":"write:ads","x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":true},"summary":"Pause ad campaign","description":"Pause a running ad campaign on the platform it is connected to. Spends real money if left running, so requires the write:ads scope. Meta and Whop today — a Google or TikTok campaign, or one only ever seen as a UTM string, is refused with the reason (roadmap E2).","tags":["Tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"campaign_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"ad_campaigns id from list_ad_campaigns, not the platform’s own campaign id."}},"required":["campaign_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"Created."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write:ads; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/resume_ad_campaign":{"post":{"operationId":"resume_ad_campaign","x-required-scope":"write:ads","x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":true},"summary":"Resume ad campaign","description":"Resume a paused ad campaign on the platform it is connected to. This starts real spend again, so requires the write:ads scope. Meta and Whop today (roadmap E2).","tags":["Tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"campaign_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"ad_campaigns id from list_ad_campaigns."}},"required":["campaign_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"Created."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write:ads; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/update_ad_campaign_budget":{"post":{"operationId":"update_ad_campaign_budget","x-required-scope":"write:ads","x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":true},"summary":"Change ad campaign daily budget","description":"Change a running ad campaign’s daily budget on the platform it is connected to. Changes real spend, so requires the write:ads scope. Meta and Whop today; refused when the campaign’s currency is unset or is not what SIGNL displays, the same guard ad-spend import uses. Capped at 10000 USD/day — a higher figure is refused rather than sent, to catch a fat-fingered amount (e.g. typing pounds where pence, or dollars where cents, were meant) before it reaches the platform.","tags":["Tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"campaign_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"ad_campaigns id from list_ad_campaigns."},"daily_budget_pence":{"type":"integer","minimum":1,"maximum":1000000,"description":"Integer pence, SIGNL’s convention everywhere — converted to the account’s own currency before it reaches the platform. Hard-capped at 1000000 (10000 USD/day); a larger value is refused, not clamped."}},"required":["campaign_id","daily_budget_pence"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"Created."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write:ads; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/create_form":{"post":{"operationId":"create_form","x-required-scope":"write:builder","x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"summary":"Create form (draft)","description":"Create a form as a DRAFT: fields, pages, endings and qualification rules. Nothing goes live; a person publishes it in SIGNL. Give an id to any field or option a rule refers to. Branching logic from another platform is never imported automatically; if you are migrating a form, list the rules you could not express and tell the operator.","tags":["Tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"name":{"type":"string","minLength":1,"maxLength":200},"description":{"description":"Shown in link previews, under the name on a classic form, and as the start screen of a one-question-at-a-time form (a blank line splits its heading from its text).","type":"string","maxLength":2000},"mode":{"description":"classic: every question on one page. paged: one page per screen, with Next and Back (use pages and each field's pageId). typeform: one question at a time.","type":"string","enum":["classic","paged","typeform"]},"fields":{"description":"The questions, in order. On update this REPLACES the list — read get_form first and send every field you want to keep, with its id.","maxItems":200,"type":"array","items":{"type":"object","properties":{"id":{"description":"Stable field id. Give one to any field a qualification rule refers to. Omit to generate; when editing, pass back the id from get_form.","type":"string","minLength":1,"maxLength":100},"type":{"type":"string","enum":["short_text","long_text","email","phone","number","dropdown","multi_select","date","file_upload","rating","yes_no","address","statement","picture_choice","ranking","social_handle","calculation"]},"label":{"type":"string","minLength":1,"maxLength":1000},"placeholder":{"type":"string","maxLength":300},"helpText":{"type":"string","maxLength":2000},"required":{"type":"boolean"},"options":{"description":"Required for dropdown, multi_select, picture_choice and ranking.","maxItems":200,"type":"array","items":{"type":"object","properties":{"id":{"description":"Stable option id. Omit to generate one; when editing, pass back the id from get_form so rules that match on it keep working.","type":"string","minLength":1,"maxLength":100},"label":{"type":"string","minLength":1,"maxLength":300},"isOther":{"description":"This choice opens a free-text box; the answer is what they type. At most one per field.","type":"boolean"},"score":{"description":"Points toward the form score that qualification rules can compare (field_id \"__form_score\").","type":"number","minimum":-1000,"maximum":1000},"tags":{"description":"Tags added to the lead when this choice is picked.","maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":60}},"imageUrl":{"description":"picture_choice only: the picture shown for this choice (an http or https address).","type":"string","maxLength":2000,"pattern":"^https?:\\/\\/"}},"required":["label"],"additionalProperties":false}},"ratingMin":{"type":"integer","minimum":0,"maximum":10},"ratingMax":{"type":"integer","minimum":1,"maximum":10},"minSelections":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxSelections":{"type":"integer","minimum":1,"maximum":9007199254740991},"minLength":{"description":"short_text / long_text only.","type":"integer","minimum":0,"maximum":100000},"maxLength":{"description":"short_text / long_text only.","type":"integer","minimum":1,"maximum":100000},"minValue":{"description":"number only.","type":"number"},"maxValue":{"description":"number only.","type":"number"},"shuffleOptions":{"description":"dropdown / multi_select: show choices in a per-visitor order.","type":"boolean"},"allowMultiple":{"description":"picture_choice only: let the visitor pick more than one picture (the answer is then a list).","type":"boolean"},"socialPlatform":{"description":"social_handle only: which platform the handle is on. Defaults to instagram.","type":"string","enum":["instagram","tiktok","youtube","x"]},"calculation":{"description":"calculation only: the figure the form works out and shows. Asks nothing.","type":"object","properties":{"expression":{"description":"Formula over the other questions, with a question written as {fieldId}.","type":"string","maxLength":2000},"decimals":{"type":"integer","minimum":0,"maximum":6},"prefix":{"type":"string","maxLength":20},"suffix":{"type":"string","maxLength":20}},"additionalProperties":false},"display":{"description":"dropdown only: \"list\" shows every choice as a button instead of a select.","type":"string","enum":["dropdown","list"]},"showIf":{"description":"Ask this only if EARLIER fields match: one condition, or { match: \"all\" | \"any\", conditions: [...] }. For a choice field, value is the option id.","anyOf":[{"type":"object","properties":{"fieldId":{"type":"string","minLength":1,"maxLength":100},"condition":{"type":"string","enum":["equals","not_equals","contains","is_not_empty"]},"value":{"default":"","type":"string","maxLength":300}},"required":["fieldId","condition","value"],"additionalProperties":false},{"type":"object","properties":{"match":{"type":"string","enum":["all","any"]},"conditions":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"object","properties":{"fieldId":{"type":"string","minLength":1,"maxLength":100},"condition":{"type":"string","enum":["equals","not_equals","contains","is_not_empty"]},"value":{"default":"","type":"string","maxLength":300}},"required":["fieldId","condition","value"],"additionalProperties":false}}},"required":["match","conditions"],"additionalProperties":false}]},"logic":{"description":"Jump rules: when this answer matches, skip ahead to jumpTo, the id of a LATER field. For a choice field, value is the option id.","maxItems":20,"type":"array","items":{"type":"object","properties":{"condition":{"type":"string","enum":["equals","not_equals","contains"]},"value":{"default":"","type":"string","maxLength":300},"jumpTo":{"type":"string","minLength":1,"maxLength":100}},"required":["condition","value","jumpTo"],"additionalProperties":false}},"pageId":{"description":"Which page the field sits on, by id from `pages`.","type":"string","minLength":1,"maxLength":100},"group":{"description":"One-question mode: adjacent fields with the same group id are asked on one screen, under its title. Set by imports (a Typeform contact block); send it back unchanged.","type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":100},"title":{"type":"string","maxLength":500}},"required":["id","title"],"additionalProperties":false},"defaultCountry":{"description":"phone only: the country the number starts in, ISO alpha-2 (\"US\").","type":"string","pattern":"^[A-Z]{2}$"}},"required":["type","label"],"additionalProperties":false}},"pages":{"maxItems":50,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":100},"title":{"type":"string","maxLength":300}},"required":["id","title"],"additionalProperties":false}},"endings":{"description":"Screens a lead lands on: { id, kind: \"thank_you\" | \"redirect\" | \"calendar\", title?, body?, redirect_url?, booking_page_id? }. Defaults to one thank-you ending.","maxItems":20,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"qualification_rules":{"description":"{ id, match: \"all\" | \"any\", conditions: [{ field_id, operator, value }], outcome: \"qualified\" | \"disqualified\", ending_id }. Operators: equals, not_equals, contains, not_contains, greater_than, less_than, is_empty, is_not_empty.","maxItems":50,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"default_ending_id":{"type":"string","maxLength":100},"redirect_url":{"type":"string","maxLength":2000,"format":"uri"},"notification_email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"theme":{"type":"string","enum":["dark","light"]}},"required":["name"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"Created."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write:builder; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/update_form":{"post":{"operationId":"update_form","x-required-scope":"write:builder","x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"summary":"Update draft form","description":"Edit a form. A draft is edited directly. A published form keeps its live version: the edit goes to its working copy and reaches visitors only when a person presses Publish changes in SIGNL. Refuses an archived form. `fields` replaces the whole list, so call get_form first and send every field you want to keep, with its id.","tags":["Tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"form_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":1,"maxLength":200},"description":{"description":"Shown in link previews, under the name on a classic form, and as the start screen of a one-question-at-a-time form (a blank line splits its heading from its text).","type":"string","maxLength":2000},"mode":{"description":"classic: every question on one page. paged: one page per screen, with Next and Back (use pages and each field's pageId). typeform: one question at a time.","type":"string","enum":["classic","paged","typeform"]},"fields":{"description":"The questions, in order. On update this REPLACES the list — read get_form first and send every field you want to keep, with its id.","maxItems":200,"type":"array","items":{"type":"object","properties":{"id":{"description":"Stable field id. Give one to any field a qualification rule refers to. Omit to generate; when editing, pass back the id from get_form.","type":"string","minLength":1,"maxLength":100},"type":{"type":"string","enum":["short_text","long_text","email","phone","number","dropdown","multi_select","date","file_upload","rating","yes_no","address","statement","picture_choice","ranking","social_handle","calculation"]},"label":{"type":"string","minLength":1,"maxLength":1000},"placeholder":{"type":"string","maxLength":300},"helpText":{"type":"string","maxLength":2000},"required":{"type":"boolean"},"options":{"description":"Required for dropdown, multi_select, picture_choice and ranking.","maxItems":200,"type":"array","items":{"type":"object","properties":{"id":{"description":"Stable option id. Omit to generate one; when editing, pass back the id from get_form so rules that match on it keep working.","type":"string","minLength":1,"maxLength":100},"label":{"type":"string","minLength":1,"maxLength":300},"isOther":{"description":"This choice opens a free-text box; the answer is what they type. At most one per field.","type":"boolean"},"score":{"description":"Points toward the form score that qualification rules can compare (field_id \"__form_score\").","type":"number","minimum":-1000,"maximum":1000},"tags":{"description":"Tags added to the lead when this choice is picked.","maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":60}},"imageUrl":{"description":"picture_choice only: the picture shown for this choice (an http or https address).","type":"string","maxLength":2000,"pattern":"^https?:\\/\\/"}},"required":["label"],"additionalProperties":false}},"ratingMin":{"type":"integer","minimum":0,"maximum":10},"ratingMax":{"type":"integer","minimum":1,"maximum":10},"minSelections":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxSelections":{"type":"integer","minimum":1,"maximum":9007199254740991},"minLength":{"description":"short_text / long_text only.","type":"integer","minimum":0,"maximum":100000},"maxLength":{"description":"short_text / long_text only.","type":"integer","minimum":1,"maximum":100000},"minValue":{"description":"number only.","type":"number"},"maxValue":{"description":"number only.","type":"number"},"shuffleOptions":{"description":"dropdown / multi_select: show choices in a per-visitor order.","type":"boolean"},"allowMultiple":{"description":"picture_choice only: let the visitor pick more than one picture (the answer is then a list).","type":"boolean"},"socialPlatform":{"description":"social_handle only: which platform the handle is on. Defaults to instagram.","type":"string","enum":["instagram","tiktok","youtube","x"]},"calculation":{"description":"calculation only: the figure the form works out and shows. Asks nothing.","type":"object","properties":{"expression":{"description":"Formula over the other questions, with a question written as {fieldId}.","type":"string","maxLength":2000},"decimals":{"type":"integer","minimum":0,"maximum":6},"prefix":{"type":"string","maxLength":20},"suffix":{"type":"string","maxLength":20}},"additionalProperties":false},"display":{"description":"dropdown only: \"list\" shows every choice as a button instead of a select.","type":"string","enum":["dropdown","list"]},"showIf":{"description":"Ask this only if EARLIER fields match: one condition, or { match: \"all\" | \"any\", conditions: [...] }. For a choice field, value is the option id.","anyOf":[{"type":"object","properties":{"fieldId":{"type":"string","minLength":1,"maxLength":100},"condition":{"type":"string","enum":["equals","not_equals","contains","is_not_empty"]},"value":{"default":"","type":"string","maxLength":300}},"required":["fieldId","condition","value"],"additionalProperties":false},{"type":"object","properties":{"match":{"type":"string","enum":["all","any"]},"conditions":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"object","properties":{"fieldId":{"type":"string","minLength":1,"maxLength":100},"condition":{"type":"string","enum":["equals","not_equals","contains","is_not_empty"]},"value":{"default":"","type":"string","maxLength":300}},"required":["fieldId","condition","value"],"additionalProperties":false}}},"required":["match","conditions"],"additionalProperties":false}]},"logic":{"description":"Jump rules: when this answer matches, skip ahead to jumpTo, the id of a LATER field. For a choice field, value is the option id.","maxItems":20,"type":"array","items":{"type":"object","properties":{"condition":{"type":"string","enum":["equals","not_equals","contains"]},"value":{"default":"","type":"string","maxLength":300},"jumpTo":{"type":"string","minLength":1,"maxLength":100}},"required":["condition","value","jumpTo"],"additionalProperties":false}},"pageId":{"description":"Which page the field sits on, by id from `pages`.","type":"string","minLength":1,"maxLength":100},"group":{"description":"One-question mode: adjacent fields with the same group id are asked on one screen, under its title. Set by imports (a Typeform contact block); send it back unchanged.","type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":100},"title":{"type":"string","maxLength":500}},"required":["id","title"],"additionalProperties":false},"defaultCountry":{"description":"phone only: the country the number starts in, ISO alpha-2 (\"US\").","type":"string","pattern":"^[A-Z]{2}$"}},"required":["type","label"],"additionalProperties":false}},"pages":{"maxItems":50,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":100},"title":{"type":"string","maxLength":300}},"required":["id","title"],"additionalProperties":false}},"endings":{"description":"Screens a lead lands on: { id, kind: \"thank_you\" | \"redirect\" | \"calendar\", title?, body?, redirect_url?, booking_page_id? }. Defaults to one thank-you ending.","maxItems":20,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"qualification_rules":{"description":"{ id, match: \"all\" | \"any\", conditions: [{ field_id, operator, value }], outcome: \"qualified\" | \"disqualified\", ending_id }. Operators: equals, not_equals, contains, not_contains, greater_than, less_than, is_empty, is_not_empty.","maxItems":50,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"default_ending_id":{"type":"string","maxLength":100},"redirect_url":{"type":"string","maxLength":2000,"format":"uri"},"notification_email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"theme":{"type":"string","enum":["dark","light"]},"paginate":{"description":"\"one_per_page\" re-pages the form so each screen is its own page: one question each, a contact block or question group kept together, a statement on its own. It replaces `pages` and every field's pageId.","type":"string","const":"one_per_page"}},"required":["form_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"Created."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write:builder; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/import_form":{"post":{"operationId":"import_form","x-required-scope":"write:builder","x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"summary":"Import form from Typeform (draft)","description":"Import a Typeform from its public link as a DRAFT: questions, choices, endings and jumps. Returns `unmapped`, the list of what could not come across (score or variable logic, dropped screens). Always tell the operator what is in `unmapped` before they publish; never imply the logic came across when it did not.","tags":["Tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"url":{"type":"string","minLength":1,"maxLength":500,"description":"The public Typeform link, e.g. https://yourname.typeform.com/to/AbC123."},"name":{"description":"Defaults to the Typeform title.","type":"string","maxLength":200}},"required":["url"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"Created."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write:builder; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/create_booking_page":{"post":{"operationId":"create_booking_page","x-required-scope":"write:builder","x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"summary":"Create booking page (draft)","description":"Create a booking page (calendar) as a DRAFT: duration, buffer, notice, booking window, weekly hours and time zone (or a shared schedule), hosts (one, or a round-robin pool from list_talent), intake questions, location and look. It takes no bookings until a person activates it in SIGNL.","tags":["Tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"name":{"type":"string","minLength":1,"maxLength":200},"duration_minutes":{"type":"integer","minimum":5,"maximum":480},"description":{"type":"string","maxLength":2000},"buffer_minutes":{"description":"Gap kept free after each call. Default 10.","type":"integer","minimum":0,"maximum":240},"min_notice_minutes":{"description":"How soon ahead a lead can book.","type":"integer","minimum":0,"maximum":43200},"booking_window_days":{"description":"How far ahead a lead can book. Default 90.","type":"integer","minimum":1,"maximum":365},"weekly_hours":{"type":"object","properties":{"mon":{"maxItems":10,"type":"array","items":{"type":"object","properties":{"start":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM."},"end":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM, after start."}},"required":["start","end"],"additionalProperties":false}},"tue":{"maxItems":10,"type":"array","items":{"type":"object","properties":{"start":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM."},"end":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM, after start."}},"required":["start","end"],"additionalProperties":false}},"wed":{"maxItems":10,"type":"array","items":{"type":"object","properties":{"start":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM."},"end":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM, after start."}},"required":["start","end"],"additionalProperties":false}},"thu":{"maxItems":10,"type":"array","items":{"type":"object","properties":{"start":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM."},"end":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM, after start."}},"required":["start","end"],"additionalProperties":false}},"fri":{"maxItems":10,"type":"array","items":{"type":"object","properties":{"start":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM."},"end":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM, after start."}},"required":["start","end"],"additionalProperties":false}},"sat":{"maxItems":10,"type":"array","items":{"type":"object","properties":{"start":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM."},"end":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM, after start."}},"required":["start","end"],"additionalProperties":false}},"sun":{"maxItems":10,"type":"array","items":{"type":"object","properties":{"start":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM."},"end":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM, after start."}},"required":["start","end"],"additionalProperties":false}}},"additionalProperties":false,"description":"Bookable hours per day, e.g. { \"mon\": [{ \"start\": \"09:00\", \"end\": \"17:00\" }] }. Replaces the whole week: a day left out is closed."},"time_zone":{"description":"IANA zone the weekly hours are in, e.g. Europe/London. Gives the page its own zone, which stays put when the workspace timezone changes.","type":"string","minLength":1,"maxLength":64},"follow_account_timezone":{"description":"true: the page follows the workspace timezone and moves when it changes (not with time_zone). false: keep the zone it has as its own. A new page follows the workspace by default.","type":"boolean"},"availability_schedule_id":{"description":"Use a shared schedule (list_availability_schedules) for the hours instead of weekly_hours. null clears it.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"send_confirmation_email":{"type":"boolean"},"max_attendees":{"description":"Seats per slot: how many people can book the same time. 1 (the default) is one-to-one; more makes a group event and the page shows \"N seats left\".","type":"integer","minimum":1,"maximum":200},"first_slot_only":{"description":"true: the page offers only its earliest open time, and the confirm step refuses any other. false: the whole calendar.","type":"boolean"},"assignment_mode":{"description":"single: one host. round_robin: rotate across talent_pool.","type":"string","enum":["single","round_robin"]},"host_talent_id":{"description":"The host for single mode, from list_talent.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"talent_pool":{"description":"Hosts to rotate across in round_robin mode, from list_talent.","maxItems":50,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"questions":{"description":"Intake questions. Defaults to name, email and phone. On update this REPLACES the list.","maxItems":50,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":100},"label":{"type":"string","minLength":1,"maxLength":500},"type":{"type":"string","enum":["text","email","phone","select","textarea","checkbox","number","url","date","radio","multi_select"],"description":"text, email, phone, select (dropdown), textarea, checkbox, number, url, date, radio (one choice as buttons), multi_select (several choices, stored as a list). select, radio and multi_select need options."},"required":{"type":"boolean"},"options":{"maxItems":100,"type":"array","items":{"type":"string","maxLength":300}},"placeholder":{"type":"string","maxLength":300},"helpText":{"description":"One line under the label that explains the question.","type":"string","maxLength":300},"identifier":{"description":"Marks the question whose answer fills that part of the booking. Keep one \"email\" and one \"name\".","type":"string","enum":["name","first_name","last_name","email","phone","meeting_reason","notes","sms_consent"]},"hidden":{"type":"boolean"},"locked":{"description":"Name and email stay required and cannot be removed. Keep the flag as it was read.","type":"boolean"}},"required":["id","label","type","required"],"additionalProperties":false}},"name_format":{"description":"\"full\": one name box. \"split\": first name and last name boxes, both required. Switches which of the name questions shows and keeps the wording of each; applies to questions when sent too.","type":"string","enum":["full","split"]},"bullet_points":{"description":"What the call covers, shown beside the calendar.","maxItems":20,"type":"array","items":{"type":"string","maxLength":300}},"consent_text":{"type":"string","maxLength":2000},"location":{"type":"object","properties":{"kind":{"type":"string","minLength":1,"maxLength":50,"description":"e.g. \"zoom\", \"google_meet\", \"phone\", \"in_person\", \"custom\"."},"details":{"type":"string","maxLength":500}},"required":["kind"],"additionalProperties":false},"theme":{"type":"string","enum":["dark","light"]},"accent_color":{"description":"Hex, e.g. #2334d1.","type":"string","pattern":"^#[0-9a-fA-F]{6}$"}},"required":["name","duration_minutes"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"Created."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write:builder; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/update_booking_page":{"post":{"operationId":"update_booking_page","x-required-scope":"write:builder","x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"summary":"Update draft booking page","description":"Edit a DRAFT booking page. Refuses an active or inactive page. `questions` replaces the whole list.","tags":["Tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string"},"page_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":1,"maxLength":200},"duration_minutes":{"type":"integer","minimum":5,"maximum":480},"description":{"type":"string","maxLength":2000},"buffer_minutes":{"description":"Gap kept free after each call. Default 10.","type":"integer","minimum":0,"maximum":240},"min_notice_minutes":{"description":"How soon ahead a lead can book.","type":"integer","minimum":0,"maximum":43200},"booking_window_days":{"description":"How far ahead a lead can book. Default 90.","type":"integer","minimum":1,"maximum":365},"weekly_hours":{"type":"object","properties":{"mon":{"maxItems":10,"type":"array","items":{"type":"object","properties":{"start":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM."},"end":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM, after start."}},"required":["start","end"],"additionalProperties":false}},"tue":{"maxItems":10,"type":"array","items":{"type":"object","properties":{"start":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM."},"end":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM, after start."}},"required":["start","end"],"additionalProperties":false}},"wed":{"maxItems":10,"type":"array","items":{"type":"object","properties":{"start":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM."},"end":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM, after start."}},"required":["start","end"],"additionalProperties":false}},"thu":{"maxItems":10,"type":"array","items":{"type":"object","properties":{"start":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM."},"end":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM, after start."}},"required":["start","end"],"additionalProperties":false}},"fri":{"maxItems":10,"type":"array","items":{"type":"object","properties":{"start":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM."},"end":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM, after start."}},"required":["start","end"],"additionalProperties":false}},"sat":{"maxItems":10,"type":"array","items":{"type":"object","properties":{"start":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM."},"end":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM, after start."}},"required":["start","end"],"additionalProperties":false}},"sun":{"maxItems":10,"type":"array","items":{"type":"object","properties":{"start":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM."},"end":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"24-hour HH:MM, after start."}},"required":["start","end"],"additionalProperties":false}}},"additionalProperties":false,"description":"Bookable hours per day, e.g. { \"mon\": [{ \"start\": \"09:00\", \"end\": \"17:00\" }] }. Replaces the whole week: a day left out is closed."},"time_zone":{"description":"IANA zone the weekly hours are in, e.g. Europe/London. Gives the page its own zone, which stays put when the workspace timezone changes.","type":"string","minLength":1,"maxLength":64},"follow_account_timezone":{"description":"true: the page follows the workspace timezone and moves when it changes (not with time_zone). false: keep the zone it has as its own. A new page follows the workspace by default.","type":"boolean"},"availability_schedule_id":{"description":"Use a shared schedule (list_availability_schedules) for the hours instead of weekly_hours. null clears it.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"send_confirmation_email":{"type":"boolean"},"max_attendees":{"description":"Seats per slot: how many people can book the same time. 1 (the default) is one-to-one; more makes a group event and the page shows \"N seats left\".","type":"integer","minimum":1,"maximum":200},"first_slot_only":{"description":"true: the page offers only its earliest open time, and the confirm step refuses any other. false: the whole calendar.","type":"boolean"},"assignment_mode":{"description":"single: one host. round_robin: rotate across talent_pool.","type":"string","enum":["single","round_robin"]},"host_talent_id":{"description":"The host for single mode, from list_talent.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"talent_pool":{"description":"Hosts to rotate across in round_robin mode, from list_talent.","maxItems":50,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"questions":{"description":"Intake questions. Defaults to name, email and phone. On update this REPLACES the list.","maxItems":50,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":100},"label":{"type":"string","minLength":1,"maxLength":500},"type":{"type":"string","enum":["text","email","phone","select","textarea","checkbox","number","url","date","radio","multi_select"],"description":"text, email, phone, select (dropdown), textarea, checkbox, number, url, date, radio (one choice as buttons), multi_select (several choices, stored as a list). select, radio and multi_select need options."},"required":{"type":"boolean"},"options":{"maxItems":100,"type":"array","items":{"type":"string","maxLength":300}},"placeholder":{"type":"string","maxLength":300},"helpText":{"description":"One line under the label that explains the question.","type":"string","maxLength":300},"identifier":{"description":"Marks the question whose answer fills that part of the booking. Keep one \"email\" and one \"name\".","type":"string","enum":["name","first_name","last_name","email","phone","meeting_reason","notes","sms_consent"]},"hidden":{"type":"boolean"},"locked":{"description":"Name and email stay required and cannot be removed. Keep the flag as it was read.","type":"boolean"}},"required":["id","label","type","required"],"additionalProperties":false}},"name_format":{"description":"\"full\": one name box. \"split\": first name and last name boxes, both required. Switches which of the name questions shows and keeps the wording of each; applies to questions when sent too.","type":"string","enum":["full","split"]},"bullet_points":{"description":"What the call covers, shown beside the calendar.","maxItems":20,"type":"array","items":{"type":"string","maxLength":300}},"consent_text":{"type":"string","maxLength":2000},"location":{"type":"object","properties":{"kind":{"type":"string","minLength":1,"maxLength":50,"description":"e.g. \"zoom\", \"google_meet\", \"phone\", \"in_person\", \"custom\"."},"details":{"type":"string","maxLength":500}},"required":["kind"],"additionalProperties":false},"theme":{"type":"string","enum":["dark","light"]},"accent_color":{"description":"Hex, e.g. #2334d1.","type":"string","pattern":"^#[0-9a-fA-F]{6}$"}},"required":["page_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"Created."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks write:builder; the body names both."},"404":{"description":"A referenced record was not found in this workspace."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_clients":{"post":{"operationId":"list_clients","x-required-scope":"read","x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List clients","description":"Every client workspace in the organisation: id, slug, name, status, type and the name of its current package (null when it has none). Use the slug as the `workspace` argument of client tools.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"status":{"description":"Only clients with this status.","type":"string","enum":["active","inactive","prospect","churned"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read, or is pinned to one workspace and so has no portfolio."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_portfolio_overview":{"post":{"operationId":"get_portfolio_overview","x-required-scope":"read","x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Portfolio overview","description":"The whole agency at a glance, over the last 30 days: totals across active clients, clients by status, average measured close and show rates, clients below their ROAS target, top performers, daily revenue trend and the team leaderboard. The same figures the agency dashboard shows. Package retainers are per client, each in its own currency — never totalled across clients. Start portfolio questions here.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read, or is pinned to one workspace and so has no portfolio."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/compare_clients":{"post":{"operationId":"compare_clients","x-required-scope":"read","x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Compare clients","description":"Side-by-side performance for several clients over the last 30 days, sorted. Omit `workspaces` to compare every active client. Rates are null when no calls were measured. Each client carries its current package (name, currency, monthly value) as /clients shows it.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspaces":{"description":"Client slugs to compare. Omit for every active client.","maxItems":25,"type":"array","items":{"type":"string"}},"sort_by":{"description":"Default collected_revenue, highest first.","type":"string","enum":["collected_revenue","contracted_value","roas","close_rate","show_rate"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read, or is pinned to one workspace and so has no portfolio."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/get_client_health":{"post":{"operationId":"get_client_health","x-required-scope":"read","x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Client health","description":"One client's performance over the last 30 days with plain flags for what deserves a look (below ROAS target, no calls, cash collected far below contracted), and its current package in its own currency. For detail inside the client, follow up with its client tools.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string","description":"The client slug (from list_clients)."}},"required":["workspace"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read, or is pinned to one workspace and so has no portfolio."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_packages":{"post":{"operationId":"list_packages","x-required-scope":"read","x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List packages","description":"The packages this agency sells its clients: name, kind (core or add-on), status, terms in their own currency (retainer, setup fee and instalments, revenue share) and how many clients are on each today.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"status":{"description":"Only packages with this status.","type":"string","enum":["draft","active","archived"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read, or is pinned to one workspace and so has no portfolio."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_statements":{"post":{"operationId":"list_statements","x-required-scope":"read","x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List agency statements","description":"What each client owes the agency, month by month, newest first: client, period, status, total and paid (integer minor units in the statement’s currency) and the engine’s warnings. Read only: issuing, voiding and recording payment stay in SIGNL.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"description":"Only this client (slug).","type":"string"},"status":{"description":"Only statements in this status, e.g. \"draft\", \"issued\" or \"paid\".","type":"string"},"limit":{"description":"Max results, default 50, capped at 100.","type":"integer","minimum":1,"maximum":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read, or is pinned to one workspace and so has no portfolio."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_event_templates":{"post":{"operationId":"list_event_templates","x-required-scope":"read","x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List event templates","description":"Managed booking-page templates defined once and pushed to clients: name, duration, how many fields are locked and how many client pages are linked. Owners and admins only.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read, or is pinned to one workspace and so has no portfolio."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_agency_skills":{"post":{"operationId":"list_agency_skills","x-required-scope":"read","x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List agency skills","description":"Agent skills the agency wrote once and pushed to clients: title, version, the tools each names, and for every client carrying a still-linked copy whether it is locked and whether it has the latest version. Owners and admins only.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read, or is pinned to one workspace and so has no portfolio."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_org_members":{"post":{"operationId":"list_org_members","x-required-scope":"read","x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List team members","description":"Everyone with a SIGNL login in the organisation: name, email, role, the one client they are pinned to (if any) and when they were last active.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read, or is pinned to one workspace and so has no portfolio."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/list_agency_talent":{"post":{"operationId":"list_agency_talent","x-required-scope":"read","x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"List talent across clients","description":"Setters, closers and other talent across every client, with the client each works in and their paid commission, total calls and close rate from the agency leaderboard. Filter by workspace or role.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"description":"Only talent in this client (slug).","type":"string"},"role":{"description":"Only this role, e.g. closer or setter.","type":"string"},"include_inactive":{"description":"Include deactivated talent. Default false.","type":"boolean"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"400":{"description":"Invalid input, named field by field. Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks read, or is pinned to one workspace and so has no portfolio."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/create_client":{"post":{"operationId":"create_client","x-required-scope":"write:agency","x-also-requires-scopes":[],"x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"summary":"Create a client","description":"Create a new client workspace in the organisation, with the starter pipeline and report templates for its type. Counts against the plan’s client limit, and is refused at the limit exactly as Add Client is. Commercial terms are not set here: assign a package in SIGNL. Returns the new client’s id and slug, the workspace to use in every other tool.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120,"description":"The client’s name. The URL slug is derived from it."},"type":{"description":"coaching (default), agency, saas, ecom or info. Picks the starter pipeline.","type":"string","enum":["coaching","agency","saas","ecom","info"]},"primary_contact":{"description":"Who you deal with at the client.","type":"string","maxLength":120},"primary_email":{"description":"Their email address.","type":"string","maxLength":254}},"required":["name"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"A client was created."},"400":{"description":"Invalid input, or the request was refused (plan limit, unknown client). Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the tool’s scope (write:agency, or write:finance for statements; some also need write:sensitive), or is pinned to one workspace and so has no agency to run."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/update_client":{"post":{"operationId":"update_client","x-required-scope":"write:agency","x-also-requires-scopes":[],"x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Edit a client","description":"Change a client’s name, contact, type, status or target ROAS. Send only the fields to change. Retainer and rev share belong to the client’s package and cannot be set here.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string","description":"The client to edit: slug, id or exact name (list_clients)."},"name":{"type":"string","minLength":1,"maxLength":120},"primary_contact":{"type":"string","maxLength":120},"primary_email":{"description":"An empty string clears it.","type":"string","maxLength":254},"type":{"type":"string","enum":["coaching","agency","saas","ecom","info"]},"status":{"type":"string","enum":["active","inactive","prospect","churned"]},"target_roas":{"type":"number","minimum":0,"maximum":100}},"required":["workspace"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"A client was created."},"400":{"description":"Invalid input, or the request was refused (plan limit, unknown client). Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the tool’s scope (write:agency, or write:finance for statements; some also need write:sensitive), or is pinned to one workspace and so has no agency to run."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/archive_client":{"post":{"operationId":"archive_client","x-required-scope":"write:agency","x-also-requires-scopes":[],"x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"summary":"Archive a client","description":"Archive a client: it leaves every agency list, aggregate and Login As, and its workspace becomes read-only. Reversible with restore_client. Its package assignment is left alone, so restoring brings it back on the terms it left with. Archiving again is a no-op.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string","description":"The client to archive: slug, id or exact name."}},"required":["workspace"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"A client was created."},"400":{"description":"Invalid input, or the request was refused (plan limit, unknown client). Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the tool’s scope (write:agency, or write:finance for statements; some also need write:sensitive), or is pinned to one workspace and so has no agency to run."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/restore_client":{"post":{"operationId":"restore_client","x-required-scope":"write:agency","x-also-requires-scopes":[],"x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Restore an archived client","description":"Bring an archived client back. Counts against the plan’s client limit again, and is refused at the limit. Takes the client’s id or slug as shown when it was archived.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"client":{"type":"string","description":"The archived client’s slug or id."}},"required":["client"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"A client was created."},"400":{"description":"Invalid input, or the request was refused (plan limit, unknown client). Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the tool’s scope (write:agency, or write:finance for statements; some also need write:sensitive), or is pinned to one workspace and so has no agency to run."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/create_package":{"post":{"operationId":"create_package","x-required-scope":"write:agency","x-also-requires-scopes":[],"x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"summary":"Create a package","description":"Add a package to the catalogue: a core offer (or an add-on) with its setup fee, retainer and/or rev share. Created as a draft unless `status` says otherwise; only an active package can be assigned to a client. Money is integer pence of the stated currency.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"kind":{"type":"string","enum":["core","add_on"],"description":"core is what a client is on; add_on rides under a core package."},"group_key":{"description":"Groups alternative packages together in the catalogue.","anyOf":[{"type":"string","maxLength":60},{"type":"null"}]},"sort_order":{"type":"integer","minimum":0,"maximum":1000},"status":{"description":"Default draft. Only an active package can be assigned.","type":"string","enum":["draft","active","archived"]},"deliverables":{"maxItems":50,"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":200},"detail":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}]}},"required":["label"],"additionalProperties":false}},"internal_notes":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}]},"terms":{"type":"object","properties":{"currency":{"type":"string","description":"Three-letter currency code, e.g. GBP."},"setup_fee_pence":{"description":"One-off setup fee in pence. Null or omitted for none.","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"setup_instalments":{"description":"How many instalments the setup fee is split into. Default 1.","type":"integer","minimum":1,"maximum":24},"retainer_pence":{"description":"Monthly retainer in pence.","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"rev_share_bps":{"description":"Revenue share in basis points (1000 = 10%).","anyOf":[{"type":"integer","minimum":1,"maximum":10000},{"type":"null"}]},"rev_share_basis":{"description":"What the rev share is a percentage of. Required with rev_share_bps.","anyOf":[{"type":"string","enum":["all_cash","above_baseline"]},{"type":"null"}]},"rev_share_baseline_pence":{"description":"Monthly baseline in pence, for above_baseline only.","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"min_term_months":{"anyOf":[{"type":"integer","minimum":1,"maximum":120},{"type":"null"}]}},"required":["currency"],"additionalProperties":false,"description":"Commercial terms. At least one of a setup fee, a retainer or a rev share is required."}},"required":["name","kind","terms"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"A client was created."},"400":{"description":"Invalid input, or the request was refused (plan limit, unknown client). Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the tool’s scope (write:agency, or write:finance for statements; some also need write:sensitive), or is pinned to one workspace and so has no agency to run."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/update_package":{"post":{"operationId":"update_package","x-required-scope":"write:agency","x-also-requires-scopes":[],"x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Edit a package","description":"Replace a package’s details and terms (send the whole package, as the edit form does; list_packages shows the current one). Clients already assigned keep the terms they were assigned on.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"package_id":{"type":"string","description":"The package id (list_packages)."},"name":{"type":"string","minLength":1,"maxLength":120},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"kind":{"type":"string","enum":["core","add_on"],"description":"core is what a client is on; add_on rides under a core package."},"group_key":{"description":"Groups alternative packages together in the catalogue.","anyOf":[{"type":"string","maxLength":60},{"type":"null"}]},"sort_order":{"type":"integer","minimum":0,"maximum":1000},"status":{"description":"Default draft. Only an active package can be assigned.","type":"string","enum":["draft","active","archived"]},"deliverables":{"maxItems":50,"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":200},"detail":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}]}},"required":["label"],"additionalProperties":false}},"internal_notes":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}]},"terms":{"type":"object","properties":{"currency":{"type":"string","description":"Three-letter currency code, e.g. GBP."},"setup_fee_pence":{"description":"One-off setup fee in pence. Null or omitted for none.","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"setup_instalments":{"description":"How many instalments the setup fee is split into. Default 1.","type":"integer","minimum":1,"maximum":24},"retainer_pence":{"description":"Monthly retainer in pence.","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"rev_share_bps":{"description":"Revenue share in basis points (1000 = 10%).","anyOf":[{"type":"integer","minimum":1,"maximum":10000},{"type":"null"}]},"rev_share_basis":{"description":"What the rev share is a percentage of. Required with rev_share_bps.","anyOf":[{"type":"string","enum":["all_cash","above_baseline"]},{"type":"null"}]},"rev_share_baseline_pence":{"description":"Monthly baseline in pence, for above_baseline only.","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"min_term_months":{"anyOf":[{"type":"integer","minimum":1,"maximum":120},{"type":"null"}]}},"required":["currency"],"additionalProperties":false,"description":"Commercial terms. At least one of a setup fee, a retainer or a rev share is required."}},"required":["package_id","name","kind","terms"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"A client was created."},"400":{"description":"Invalid input, or the request was refused (plan limit, unknown client). Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the tool’s scope (write:agency, or write:finance for statements; some also need write:sensitive), or is pinned to one workspace and so has no agency to run."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/set_package_status":{"post":{"operationId":"set_package_status","x-required-scope":"write:agency","x-also-requires-scopes":[],"x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Activate, draft or archive a package","description":"Move a package between draft, active and archived. Archiving hides it from new assignments; existing assignments are untouched.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"package_id":{"type":"string"},"status":{"type":"string","enum":["draft","active","archived"]}},"required":["package_id","status"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"A client was created."},"400":{"description":"Invalid input, or the request was refused (plan limit, unknown client). Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the tool’s scope (write:agency, or write:finance for statements; some also need write:sensitive), or is pinned to one workspace and so has no agency to run."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/duplicate_package":{"post":{"operationId":"duplicate_package","x-required-scope":"write:agency","x-also-requires-scopes":[],"x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"summary":"Duplicate a package","description":"Copy a package as a new draft named “… (copy)”.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"package_id":{"type":"string"}},"required":["package_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"A client was created."},"400":{"description":"Invalid input, or the request was refused (plan limit, unknown client). Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the tool’s scope (write:agency, or write:finance for statements; some also need write:sensitive), or is pinned to one workspace and so has no agency to run."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/delete_package":{"post":{"operationId":"delete_package","x-required-scope":"write:agency","x-also-requires-scopes":[],"x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"summary":"Delete a draft package","description":"Permanently delete a package. Only a draft that has never been assigned can be deleted; anything else is refused (archive it instead).","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"package_id":{"type":"string"}},"required":["package_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"A client was created."},"400":{"description":"Invalid input, or the request was refused (plan limit, unknown client). Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the tool’s scope (write:agency, or write:finance for statements; some also need write:sensitive), or is pinned to one workspace and so has no agency to run."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/assign_package":{"post":{"operationId":"assign_package","x-required-scope":"write:agency","x-also-requires-scopes":[],"x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"summary":"Put a client on a package","description":"Assign an active core package (and optional add-ons) to a client from a date, with the terms that apply to that client. This sets what the client will be billed from `effective_from`. Refused if the client already has a current package (use switch_package) or the date falls inside a period with an issued statement.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string","description":"The client: slug, id or exact name."},"package_id":{"type":"string"},"effective_from":{"type":"string","description":"YYYY-MM-DD."},"terms":{"type":"object","properties":{"currency":{"type":"string","description":"Three-letter currency code, e.g. GBP."},"setup_fee_pence":{"description":"One-off setup fee in pence. Null or omitted for none.","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"setup_instalments":{"description":"How many instalments the setup fee is split into. Default 1.","type":"integer","minimum":1,"maximum":24},"retainer_pence":{"description":"Monthly retainer in pence.","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"rev_share_bps":{"description":"Revenue share in basis points (1000 = 10%).","anyOf":[{"type":"integer","minimum":1,"maximum":10000},{"type":"null"}]},"rev_share_basis":{"description":"What the rev share is a percentage of. Required with rev_share_bps.","anyOf":[{"type":"string","enum":["all_cash","above_baseline"]},{"type":"null"}]},"rev_share_baseline_pence":{"description":"Monthly baseline in pence, for above_baseline only.","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"min_term_months":{"anyOf":[{"type":"integer","minimum":1,"maximum":120},{"type":"null"}]}},"required":["currency"],"additionalProperties":false,"description":"Commercial terms. At least one of a setup fee, a retainer or a rev share is required."},"add_ons":{"maxItems":10,"type":"array","items":{"type":"object","properties":{"package_id":{"type":"string"},"terms":{"type":"object","properties":{"currency":{"type":"string","description":"Three-letter currency code, e.g. GBP."},"setup_fee_pence":{"description":"One-off setup fee in pence. Null or omitted for none.","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"setup_instalments":{"description":"How many instalments the setup fee is split into. Default 1.","type":"integer","minimum":1,"maximum":24},"retainer_pence":{"description":"Monthly retainer in pence.","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"rev_share_bps":{"description":"Revenue share in basis points (1000 = 10%).","anyOf":[{"type":"integer","minimum":1,"maximum":10000},{"type":"null"}]},"rev_share_basis":{"description":"What the rev share is a percentage of. Required with rev_share_bps.","anyOf":[{"type":"string","enum":["all_cash","above_baseline"]},{"type":"null"}]},"rev_share_baseline_pence":{"description":"Monthly baseline in pence, for above_baseline only.","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"min_term_months":{"anyOf":[{"type":"integer","minimum":1,"maximum":120},{"type":"null"}]}},"required":["currency"],"additionalProperties":false,"description":"Commercial terms. At least one of a setup fee, a retainer or a rev share is required."}},"required":["package_id","terms"],"additionalProperties":false}},"notes":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]}},"required":["workspace","package_id","effective_from","terms"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"A client was created."},"400":{"description":"Invalid input, or the request was refused (plan limit, unknown client). Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the tool’s scope (write:agency, or write:finance for statements; some also need write:sensitive), or is pinned to one workspace and so has no agency to run."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/switch_package":{"post":{"operationId":"switch_package","x-required-scope":"write:agency","x-also-requires-scopes":[],"x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"summary":"Switch a client to another package","description":"Move a client from its current core package to another from a date: the current package (and its add-ons) ends the day before and the new one starts, in one step that is rolled back if it cannot complete. Switching to the same package is a re-price and does not charge the setup fee again. Refused inside a period with an issued statement.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string","description":"The client: slug, id or exact name."},"package_id":{"type":"string"},"effective_from":{"type":"string","description":"YYYY-MM-DD."},"terms":{"type":"object","properties":{"currency":{"type":"string","description":"Three-letter currency code, e.g. GBP."},"setup_fee_pence":{"description":"One-off setup fee in pence. Null or omitted for none.","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"setup_instalments":{"description":"How many instalments the setup fee is split into. Default 1.","type":"integer","minimum":1,"maximum":24},"retainer_pence":{"description":"Monthly retainer in pence.","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"rev_share_bps":{"description":"Revenue share in basis points (1000 = 10%).","anyOf":[{"type":"integer","minimum":1,"maximum":10000},{"type":"null"}]},"rev_share_basis":{"description":"What the rev share is a percentage of. Required with rev_share_bps.","anyOf":[{"type":"string","enum":["all_cash","above_baseline"]},{"type":"null"}]},"rev_share_baseline_pence":{"description":"Monthly baseline in pence, for above_baseline only.","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"min_term_months":{"anyOf":[{"type":"integer","minimum":1,"maximum":120},{"type":"null"}]}},"required":["currency"],"additionalProperties":false,"description":"Commercial terms. At least one of a setup fee, a retainer or a rev share is required."},"add_ons":{"maxItems":10,"type":"array","items":{"type":"object","properties":{"package_id":{"type":"string"},"terms":{"type":"object","properties":{"currency":{"type":"string","description":"Three-letter currency code, e.g. GBP."},"setup_fee_pence":{"description":"One-off setup fee in pence. Null or omitted for none.","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"setup_instalments":{"description":"How many instalments the setup fee is split into. Default 1.","type":"integer","minimum":1,"maximum":24},"retainer_pence":{"description":"Monthly retainer in pence.","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"rev_share_bps":{"description":"Revenue share in basis points (1000 = 10%).","anyOf":[{"type":"integer","minimum":1,"maximum":10000},{"type":"null"}]},"rev_share_basis":{"description":"What the rev share is a percentage of. Required with rev_share_bps.","anyOf":[{"type":"string","enum":["all_cash","above_baseline"]},{"type":"null"}]},"rev_share_baseline_pence":{"description":"Monthly baseline in pence, for above_baseline only.","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"min_term_months":{"anyOf":[{"type":"integer","minimum":1,"maximum":120},{"type":"null"}]}},"required":["currency"],"additionalProperties":false,"description":"Commercial terms. At least one of a setup fee, a retainer or a rev share is required."}},"required":["package_id","terms"],"additionalProperties":false}},"notes":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]}},"required":["workspace","package_id","effective_from","terms"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"A client was created."},"400":{"description":"Invalid input, or the request was refused (plan limit, unknown client). Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the tool’s scope (write:agency, or write:finance for statements; some also need write:sensitive), or is pinned to one workspace and so has no agency to run."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/end_package_assignment":{"post":{"operationId":"end_package_assignment","x-required-scope":"write:agency","x-also-requires-scopes":[],"x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"summary":"End a client’s package","description":"End an assignment (and its add-ons) on a date. Cannot end before it started, or before the period covered by an issued statement.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"assignment_id":{"type":"string"},"effective_to":{"type":"string","description":"YYYY-MM-DD."}},"required":["assignment_id","effective_to"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"A client was created."},"400":{"description":"Invalid input, or the request was refused (plan limit, unknown client). Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the tool’s scope (write:agency, or write:finance for statements; some also need write:sensitive), or is pinned to one workspace and so has no agency to run."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/create_event_template":{"post":{"operationId":"create_event_template","x-required-scope":"write:agency","x-also-requires-scopes":[],"x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"summary":"Create an event template","description":"Define booking-page settings once for the agency: duration, buffer, questions, location, branding and rules. `locked_fields` names what clients cannot change on pages made from it. Nothing reaches a client until push_event_template.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"duration_minutes":{"type":"integer","minimum":1,"maximum":1440},"description":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}]},"buffer_minutes":{"type":"integer","minimum":0,"maximum":1440},"questions":{"maxItems":50,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Stable id, unique within the template."},"label":{"type":"string"},"type":{"type":"string","enum":["text","email","phone","select","textarea","checkbox"]},"required":{"type":"boolean"},"options":{"description":"Choices, for a select.","type":"array","items":{"type":"string"}},"placeholder":{"type":"string"},"identifier":{"type":"string","enum":["name","email","phone","meeting_reason","notes","sms_consent"]},"hidden":{"type":"boolean"},"locked":{"type":"boolean"}},"required":["id","label","type","required"],"additionalProperties":false}},"question_flow":{"type":"string","enum":["inline","grouped","single"]},"bullet_points":{"maxItems":20,"type":"array","items":{"type":"string"}},"consent_text":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}]},"location":{"anyOf":[{"type":"string","enum":["google_meet","zoom","phone"]},{"type":"null"}],"description":"google_meet, zoom or phone."},"min_notice_minutes":{"anyOf":[{"type":"integer","minimum":0,"maximum":43200},{"type":"null"}]},"booking_horizon_days":{"anyOf":[{"type":"integer","minimum":1,"maximum":365},{"type":"null"}]},"send_confirmation_email":{"type":"boolean"},"reminder_1h_enabled":{"type":"boolean"},"theme":{"type":"string","enum":["dark","light"]},"accent_color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Hex like #2334d1."},"accent_color_secondary":{"anyOf":[{"type":"string"},{"type":"null"}]},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Absolute http(s) URL."},"prevent_duplicate_bookings":{"type":"boolean"},"reschedule_with_same_host":{"type":"boolean"},"locked_fields":{"type":"array","items":{"type":"string","enum":["name","description","duration","buffer","questions","highlights","consent","location","booking_window","notifications","branding","booking_rules"]},"description":"Which groups of settings clients cannot change on pages from this template."}},"required":["name","duration_minutes"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"A client was created."},"400":{"description":"Invalid input, or the request was refused (plan limit, unknown client). Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the tool’s scope (write:agency, or write:finance for statements; some also need write:sensitive), or is pinned to one workspace and so has no agency to run."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/update_event_template":{"post":{"operationId":"update_event_template","x-required-scope":"write:agency","x-also-requires-scopes":[],"x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Edit an event template","description":"Change an event template; send only the fields to change. Saving propagates its LOCKED fields to every booking page already made from it, so this can change live client pages. The result says how many pages were updated.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"template_id":{"type":"string","description":"The template id (list_event_templates)."},"name":{"type":"string","minLength":1,"maxLength":120},"duration_minutes":{"type":"integer","minimum":1,"maximum":1440},"description":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}]},"buffer_minutes":{"type":"integer","minimum":0,"maximum":1440},"questions":{"maxItems":50,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Stable id, unique within the template."},"label":{"type":"string"},"type":{"type":"string","enum":["text","email","phone","select","textarea","checkbox"]},"required":{"type":"boolean"},"options":{"description":"Choices, for a select.","type":"array","items":{"type":"string"}},"placeholder":{"type":"string"},"identifier":{"type":"string","enum":["name","email","phone","meeting_reason","notes","sms_consent"]},"hidden":{"type":"boolean"},"locked":{"type":"boolean"}},"required":["id","label","type","required"],"additionalProperties":false}},"question_flow":{"type":"string","enum":["inline","grouped","single"]},"bullet_points":{"maxItems":20,"type":"array","items":{"type":"string"}},"consent_text":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}]},"location":{"anyOf":[{"type":"string","enum":["google_meet","zoom","phone"]},{"type":"null"}],"description":"google_meet, zoom or phone."},"min_notice_minutes":{"anyOf":[{"type":"integer","minimum":0,"maximum":43200},{"type":"null"}]},"booking_horizon_days":{"anyOf":[{"type":"integer","minimum":1,"maximum":365},{"type":"null"}]},"send_confirmation_email":{"type":"boolean"},"reminder_1h_enabled":{"type":"boolean"},"theme":{"type":"string","enum":["dark","light"]},"accent_color":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Hex like #2334d1."},"accent_color_secondary":{"anyOf":[{"type":"string"},{"type":"null"}]},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Absolute http(s) URL."},"prevent_duplicate_bookings":{"type":"boolean"},"reschedule_with_same_host":{"type":"boolean"},"locked_fields":{"type":"array","items":{"type":"string","enum":["name","description","duration","buffer","questions","highlights","consent","location","booking_window","notifications","branding","booking_rules"]},"description":"Which groups of settings clients cannot change on pages from this template."}},"required":["template_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"A client was created."},"400":{"description":"Invalid input, or the request was refused (plan limit, unknown client). Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the tool’s scope (write:agency, or write:finance for statements; some also need write:sensitive), or is pinned to one workspace and so has no agency to run."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/push_event_template":{"post":{"operationId":"push_event_template","x-required-scope":"write:agency","x-also-requires-scopes":[],"x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Push an event template to clients","description":"Create a draft booking page from the template in each named client (slug, id or exact name). Clients that already have a page from it are skipped. Pages start as drafts; publishing stays a human action in SIGNL.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"template_id":{"type":"string"},"workspaces":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"string"},"description":"Clients to push to."}},"required":["template_id","workspaces"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"A client was created."},"400":{"description":"Invalid input, or the request was refused (plan limit, unknown client). Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the tool’s scope (write:agency, or write:finance for statements; some also need write:sensitive), or is pinned to one workspace and so has no agency to run."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/detach_event_template_page":{"post":{"operationId":"detach_event_template_page","x-required-scope":"write:agency","x-also-requires-scopes":[],"x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Unlink a booking page from its template","description":"Stop a booking page following its template. It keeps its current values and becomes fully editable by the client.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"page_id":{"type":"string","description":"The booking page id."}},"required":["page_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"A client was created."},"400":{"description":"Invalid input, or the request was refused (plan limit, unknown client). Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the tool’s scope (write:agency, or write:finance for statements; some also need write:sensitive), or is pinned to one workspace and so has no agency to run."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/delete_event_template":{"post":{"operationId":"delete_event_template","x-required-scope":"write:agency","x-also-requires-scopes":[],"x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"summary":"Delete an event template","description":"Delete a template. Pages already made from it stay as they are, with their current values, and become fully editable.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"template_id":{"type":"string"}},"required":["template_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"A client was created."},"400":{"description":"Invalid input, or the request was refused (plan limit, unknown client). Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the tool’s scope (write:agency, or write:finance for statements; some also need write:sensitive), or is pinned to one workspace and so has no agency to run."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/set_client_setup_brief":{"post":{"operationId":"set_client_setup_brief","x-required-scope":"write:agency","x-also-requires-scopes":[],"x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Set a client’s setup brief","description":"Shape the AI setup chat a client sees at their first login (replaces the brief; send all of it). `enabled: false` turns the chat off for that client. `notes` is private to the agency (server-only, never shown to the client) but the setup guide reads it and may act on it, so write nothing you would regret the client hearing paraphrased. `prefill` answers questions the agency already knows, in the setup profile’s own values; these ARE shown to the client, because the chat confirms each in one line instead of asking: business_model (one_to_one, group, course, agency, community, other), offers ([{ name, price_band: under_1k | 1k_3k | 3k_10k | 10k_plus, delivery }]), sales_motion (application_call, direct_booking, webinar, vsl, dm_setting, checkout, referrals), team_shape (solo, with_setter, setters_closers, sales_team), stack ([{ category, provider }]), alert_channel, alert_events, automations_before, notes. `allowed` names the kinds the chat may propose (pipeline, form, event, automation, integration; any left out stay allowed). `include_event_template_ids` puts up to 20 of the agency’s event templates on the client’s plan as draft booking pages. Refused once the client’s setup has been planned, built or skipped. A client with no setup yet gets one, opened at their next login.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string","description":"The client: slug, id or exact name."},"enabled":{"type":"boolean","description":"False turns the setup chat off for this client."},"notes":{"type":"string","maxLength":2000},"prefill":{"description":"Setup profile answers the agency already knows (see the description for the keys and values).","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"allowed":{"type":"object","properties":{"pipeline":{"type":"boolean"},"form":{"type":"boolean"},"event":{"type":"boolean"},"automation":{"type":"boolean"},"integration":{"type":"boolean"}},"additionalProperties":false},"include_event_template_ids":{"description":"Event template ids (list_event_templates).","maxItems":20,"type":"array","items":{"type":"string"}}},"required":["workspace","enabled"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"A client was created."},"400":{"description":"Invalid input, or the request was refused (plan limit, unknown client). Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the tool’s scope (write:agency, or write:finance for statements; some also need write:sensitive), or is pinned to one workspace and so has no agency to run."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/generate_statement_drafts":{"post":{"operationId":"generate_statement_drafts","x-required-scope":"write:finance","x-also-requires-scopes":[],"x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"summary":"Generate the month’s statement drafts","description":"Compute what each client owes the agency for a month from its packages and collected cash, and create or refresh the DRAFT statements. Drafts are working copies: nothing is issued to a client. Issuing, voiding and recording payment stay in SIGNL. Returns how many drafts were created, refreshed and skipped (already issued).","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"period_start":{"type":"string","description":"The first day of the month, YYYY-MM-DD."}},"required":["period_start"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"A client was created."},"400":{"description":"Invalid input, or the request was refused (plan limit, unknown client). Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the tool’s scope (write:agency, or write:finance for statements; some also need write:sensitive), or is pinned to one workspace and so has no agency to run."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/add_statement_adjustment":{"post":{"operationId":"add_statement_adjustment","x-required-scope":"write:finance","x-also-requires-scopes":[],"x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"summary":"Add an adjustment to a draft statement","description":"Add a manual line to a DRAFT statement: a positive amount adds to what the client owes, a negative one is a credit. Amount is integer pence of the statement’s currency. Refused once the statement is issued: put it on next month’s draft instead.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"statement_id":{"type":"string","description":"The draft statement id (list_statements)."},"label":{"type":"string","minLength":1,"maxLength":200,"description":"What the adjustment is for; shown on the statement."},"amount_pence":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Non-zero. Negative for a credit."}},"required":["statement_id","label","amount_pence"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"A client was created."},"400":{"description":"Invalid input, or the request was refused (plan limit, unknown client). Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the tool’s scope (write:agency, or write:finance for statements; some also need write:sensitive), or is pinned to one workspace and so has no agency to run."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/tools/invite_client_member":{"post":{"operationId":"invite_client_member","x-required-scope":"write:agency","x-also-requires-scopes":["write:sensitive"],"x-organisation-wide-key-only":true,"x-mcp-annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"summary":"Invite someone to one client’s workspace","description":"Email an invitation to join ONE client’s workspace as a member. Always the member role, pinned to that client: inviting an admin, someone with the whole organisation or a custom role is done in SIGNL. Emails a real person, so the key needs write:sensitive as well as write:agency. Resending to a pending address replaces its earlier link.","tags":["Agency tools"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Up to 255 visible ASCII characters (a UUID is ideal). Completed JSON responses, including errors, are replayed for 24 hours with `Idempotent-Replayed: true`. Unfinished requests are never automatically rerun. A 409 `idempotency_outcome_unknown` requires outcome reconciliation; do not retry the write with a new key.","schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workspace":{"type":"string","description":"The client they will work in: slug, id or exact name."},"email":{"type":"string","maxLength":254},"name":{"description":"Who they are; used in confirmations.","type":"string","maxLength":120}},"required":["workspace","email"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool result."},"201":{"description":"A client was created."},"400":{"description":"Invalid input, or the request was refused (plan limit, unknown client). Unknown fields are refused."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"description":"The key lacks the tool’s scope (write:agency, or write:finance for statements; some also need write:sensitive), or is pinned to one workspace and so has no agency to run."},"409":{"description":"The request is still running (honour Retry-After), or its outcome is unknown and requires reconciliation before another write."},"422":{"description":"This Idempotency-Key was already used with a different tool or body."},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/keys/me":{"get":{"operationId":"getCurrentKey","summary":"Describe the key you are holding","description":"Authenticated by the key itself; any valid key may call it. Returns only facts about that credential. Call this first when a key does not work: it answers what the key can reach in one request, instead of probing endpoints and comparing error codes.","tags":["Keys"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"The key's identity, scopes and reach.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyIntrospection"}}}},"401":{"$ref":"#/components/responses/Unauthorised"},"429":{"$ref":"#/components/responses/RateLimited"},"503":{"$ref":"#/components/responses/Unavailable"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"SIGNL API key","description":"Use Authorization: Bearer sk_live_…"}},"schemas":{"ServerIngestRequest":{"type":"object","properties":{"event":{"type":"string","minLength":1,"maxLength":100,"description":"Canonical event type or a custom event name."},"event_name":{"description":"Human-readable name for a custom event.","type":"string","maxLength":200},"client_id":{"description":"Required only when the API key is organisation-scoped.","type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"},"email":{"type":"string","maxLength":200,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"phone":{"type":"string","maxLength":30},"fingerprint":{"type":"string","maxLength":80},"name":{"description":"Full name, kept as sent. Never split into first and last.","type":"string","maxLength":200},"first_name":{"description":"Given name, when you have it separately. Stored as an explicit value.","type":"string","maxLength":200},"last_name":{"description":"Family name, when you have it separately. Stored as an explicit value.","type":"string","maxLength":200},"revenue_pence":{"description":"Revenue in the smallest currency unit. SIGNL currently stores GBP pence internally.","type":"integer","minimum":0,"maximum":1000000000},"metadata":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"idempotency_key":{"description":"Stable unique key used to deduplicate retries.","type":"string","maxLength":200},"url":{"type":"string","maxLength":2000},"utm_source":{"type":"string","maxLength":200},"utm_medium":{"type":"string","maxLength":200},"utm_campaign":{"type":"string","maxLength":200}},"required":["event"],"additionalProperties":false,"anyOf":[{"required":["email"]},{"required":["phone"]},{"required":["fingerprint"]}]},"InboundWebhookRequest":{"type":"object","properties":{"event":{"type":"string","minLength":1,"maxLength":100},"name":{"type":"string","minLength":1,"maxLength":500},"external_id":{"type":"string","maxLength":500},"fingerprint_id":{"type":"string","maxLength":255},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"phone":{"type":"string","maxLength":30},"contact":{"type":"string","maxLength":255},"first_name":{"type":"string","maxLength":200},"last_name":{"type":"string","maxLength":200},"score_delta":{"default":0,"type":"integer","minimum":-1000,"maximum":1000},"metadata":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"tags":{"maxItems":50,"type":"array","items":{"type":"string","maxLength":100}},"utm":{"type":"object","properties":{"source":{"type":"string","maxLength":255},"medium":{"type":"string","maxLength":255},"campaign":{"type":"string","maxLength":255},"content":{"type":"string","maxLength":255},"term":{"type":"string","maxLength":255}},"additionalProperties":false}},"required":["event","name","score_delta"],"additionalProperties":false,"anyOf":[{"required":["fingerprint_id"]},{"required":["email"]},{"required":["phone"]}]},"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":true},"InsufficientScope":{"type":"object","description":"A valid key that lacks the scope this surface requires.","properties":{"error":{"type":"string","const":"insufficient_scope"},"message":{"type":"string"},"key_scopes":{"type":"array","items":{"type":"string","enum":["ingest:write","read","write","write:sensitive","write:builder","write:ads","write:agency","write:finance","recordings:write"]}},"required":{"type":"array","items":{"type":"string","enum":["ingest:write","read","write","write:sensitive","write:builder","write:ads","write:agency","write:finance","recordings:write"]}},"fix":{"type":"string"}},"required":["error","message","key_scopes","required","fix"]},"KeyIntrospection":{"type":"object","properties":{"key_id":{"type":"string","format":"uuid"},"name":{"type":"string"},"scopes":{"type":"array","items":{"type":"string","enum":["ingest:write","read","write","write:sensitive","write:builder","write:ads","write:agency","write:finance","recordings:write"]}},"workspace":{"type":["object","null"],"properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"}}},"organisation_id":{"type":"string","format":"uuid"},"organisation_scoped":{"type":"boolean"},"reachable_surfaces":{"type":"array","items":{"type":"string"}},"unreachable_surfaces":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"requires":{"type":"string"}}}},"created_at":{"type":["string","null"],"format":"date-time"},"last_used_at":{"type":["string","null"],"format":"date-time"},"kind":{"type":"string","deprecated":true,"description":"Informational only since migration 160. Read scopes."}},"required":["key_id","scopes","organisation_scoped","reachable_surfaces"]}},"responses":{"BadRequest":{"description":"Invalid JSON, request shape, or tenant scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorised":{"description":"Missing, malformed, unknown or revoked API key. A valid key never gets 401 — a missing scope is 403.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Forbidden":{"description":"A valid key that is not allowed here: either it lacks the scope this surface requires (insufficient_scope, naming what it has and what was needed), or it cannot access the requested client.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/InsufficientScope"},{"$ref":"#/components/schemas/Error"}]}}}},"RateLimited":{"description":"Request limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ServerError":{"description":"Unexpected server failure. Retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unavailable":{"description":"Temporary database or dependency failure. Retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}