{"openapi":"3.1.0","info":{"title":"FORTVISION Platform API","version":"1.0.0","description":"Read access to one FORTVISION workspace: leads, contacts, eCommerce customers, CRM tasks,\nad campaigns, conversations, automations and reports.\n\n**Authentication** — a bearer token created in the app under Integrations → Programmatic access.\nSend it as `Authorization: Bearer fvmcp_…`. Tokens carry scopes, expire, and can be revoked or\nrotated at any time. The token acts as the user who created it: it can never see more than they can.\n\n**Tenancy** — a token is bound to one workspace. Ids from another workspace return 404, never data.\nThe workspace is resolved from the token; it can never be supplied by the client.\n\n**Pagination** — every list takes `page` and `pageSize` (max 100) and returns a `pagination` object.\nThere is no way to request an unbounded result set.\n\n**Rate limits** — per token and per workspace, per minute. Exceeding either returns 429.\n\n**Errors** — `{ \"ok\": false, \"error\": { \"code\": \"...\", \"message\": \"...\" } }` with an HTTP status to match.\nCodes: invalid_input, unauthorized, forbidden, not_found, rate_limited, unavailable, timeout, internal.\n\n**Idempotency** — every operation here is a read and therefore idempotent. Write operations, when they\nship, will require an `Idempotency-Key` header and an explicit confirmation step.\n\nThe same capabilities are available to LLM clients over the Model Context Protocol at `/mcp`."},"servers":[{"url":"https://www.4-v.co/api/v1"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"fvmcp token","description":"Workspace access token created in FORTVISION → Integrations."}},"responses":{"Error":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","unauthorized","forbidden","not_found","conflict","rate_limited","unavailable","timeout","internal"]},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}},"requestId":{"type":"string"}}},"example":{"ok":false,"error":{"code":"not_found","message":"No lead with that id is visible to this token."},"requestId":"req_2f1c9a4b7d0e5a86"}}}}}},"x-scopes":[{"name":"leads.read","risk":"read","stage":1,"description":"Read leads, their statuses, owners and sources.","grantable":true},{"name":"contacts.read","risk":"read","stage":1,"description":"Read contacts and their activity timeline.","grantable":true},{"name":"customers.read","risk":"read","stage":1,"description":"Read eCommerce customers, orders and store list.","grantable":true},{"name":"tasks.read","risk":"read","stage":1,"description":"Read CRM tasks.","grantable":true},{"name":"campaigns.read","risk":"read","stage":1,"description":"Read ad campaigns and their performance metrics.","grantable":true},{"name":"conversations.read","risk":"read","stage":1,"description":"Read WhatsApp / SMS / social conversations.","grantable":true},{"name":"agents.read","risk":"read","stage":1,"description":"Read automations (journeys) and their run stats.","grantable":true},{"name":"reports.read","risk":"read","stage":1,"description":"Read aggregate reports (lead sources, conversions, customer summary).","grantable":true},{"name":"linkedin.read","risk":"read","stage":1,"description":"Read LinkedIn outreach: senders, prospect lists, sequences and their stats, inbox conversations.","grantable":true},{"name":"wallet.read","risk":"read","stage":1,"description":"Read the Wallet loyalty module: cards, member counts and funnel, member search, recent club activity.","grantable":true},{"name":"projects.read","risk":"read","stage":1,"description":"Read Projects boards: groups, columns, items and their status, owners and column values.","grantable":true},{"name":"pages.read","risk":"read","stage":1,"description":"Read landing pages and their performance (views, leads, conversion rate).","grantable":true},{"name":"social.read","risk":"read","stage":1,"description":"Read the social content calendar: posts, statuses, schedule and performance.","grantable":true},{"name":"coupons.read","risk":"read","stage":1,"description":"Read coupons and their issue/redemption/revenue stats.","grantable":true},{"name":"meetings.read","risk":"read","stage":1,"description":"Read booking pages and booked meetings.","grantable":true},{"name":"leads.write","risk":"write","stage":2,"description":"Create and update leads, statuses and owners.","grantable":true},{"name":"contacts.write","risk":"write","stage":2,"description":"Update contact fields.","grantable":true},{"name":"customers.write","risk":"write","stage":2,"description":"Update customer records.","grantable":true},{"name":"tasks.write","risk":"write","stage":2,"description":"Create, update and complete tasks.","grantable":true},{"name":"notes.write","risk":"write","stage":2,"description":"Add notes to leads, contacts, companies and deals.","grantable":true},{"name":"messages.draft","risk":"write","stage":2,"description":"Create email / SMS / WhatsApp drafts (never sends).","grantable":true},{"name":"linkedin.write","risk":"write","stage":2,"description":"Create and edit LinkedIn sequences (as drafts), import prospects into lists, pause sequences. Never launches or sends.","grantable":true},{"name":"projects.write","risk":"write","stage":2,"description":"Create Projects boards and items; update item status, owners, dates, column values and comments.","grantable":true},{"name":"agents.write","risk":"write","stage":2,"description":"Enable or pause automations (journeys). Reversible; never edits the flow.","grantable":true},{"name":"pages.write","risk":"write","stage":2,"description":"Create landing pages (AI-generated), edit their content and settings, manage landing-page lists.","grantable":true},{"name":"social.write","risk":"write","stage":2,"description":"Create and edit social posts as drafts, generate post ideas. Never schedules or publishes.","grantable":true},{"name":"coupons.write","risk":"write","stage":2,"description":"Create coupons, pause/resume them, issue a code to a contact.","grantable":true},{"name":"meetings.write","risk":"write","stage":2,"description":"Create and edit booking pages.","grantable":true},{"name":"messages.send","risk":"high","stage":3,"description":"Send email / SMS / WhatsApp. Requires explicit confirmation per send.","grantable":true},{"name":"linkedin.send","risk":"high","stage":3,"description":"Launch or resume LinkedIn sequences and send LinkedIn messages. Requires explicit confirmation per action.","grantable":true},{"name":"campaigns.write","risk":"high","stage":3,"description":"Activate, pause or modify ad campaigns.","grantable":true},{"name":"budgets.write","risk":"high","stage":3,"description":"Change campaign budgets and bids.","grantable":true},{"name":"social.publish","risk":"high","stage":3,"description":"Schedule or publish social posts to connected pages. Requires explicit confirmation per action.","grantable":true},{"name":"records.delete","risk":"high","stage":3,"description":"Delete records. Irreversible.","grantable":true},{"name":"admin.integrations","risk":"high","stage":3,"description":"Manage integrations and access tokens.","grantable":true}],"paths":{"/workspace":{"get":{"operationId":"get_workspace_info","summary":"Identify the workspace this token acts in, the scopes it holds, the lead statuses this account uses, and which data sources (Facebook, Google Ads, DV360, email, WhatsApp, stores) are actually connected","description":"Identify the workspace this token acts in, the scopes it holds, the lead statuses this account uses, and which data sources (Facebook, Google Ads, DV360, email, WhatsApp, stores) are actually connected. Call this FIRST in a session: it tells you which of the other tools can return anything, so you do not guess.\n\nRequired scope: `leads.read`. Risk level: `read`.","tags":["leads"],"security":[{"bearerAuth":["leads.read"]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/leads":{"get":{"operationId":"search_leads","summary":"Search leads across every source in this workspace (Facebook lead forms, manual/CSV imports, landing pages)","description":"Search leads across every source in this workspace (Facebook lead forms, manual/CSV imports, landing pages). Matches `query` against name, email, phone and campaign name. Use it to answer \"who came in\", \"find the lead called X\", \"leads from campaign Y last week\". Returns a page of summary records — call get_lead for the full form answers.\n\nRequired scope: `leads.read`. Risk level: `read`.","tags":["leads"],"security":[{"bearerAuth":["leads.read"]}],"parameters":[{"name":"query","in":"query","required":false,"description":"Free text: name, email, phone (4+ digits), lead id, or campaign name.","schema":{"type":"string","maxLength":120}},{"name":"status","in":"query","required":false,"description":"Exact pipeline status.","schema":{"type":"string","enum":["New","Contacted","Qualified","Scheduled a Meeting","Proposal","Negotiation","Won","Lost","Unresponsive"]}},{"name":"source","in":"query","required":false,"description":"Which system the lead came from.","schema":{"type":"string","enum":["facebook","manual","landing_page"]}},{"name":"owner","in":"query","required":false,"description":"Assigned owner (email or name), exact match.","schema":{"type":"string","maxLength":120}},{"name":"campaignId","in":"query","required":false,"description":"Restrict to one ad campaign id.","schema":{"type":"string","maxLength":60}},{"name":"sort","in":"query","required":false,"description":"Result order. Default newest first.","schema":{"type":"string","enum":["created_desc","created_asc","name_asc","rating_desc"],"default":"created_desc"}},{"name":"dateFrom","in":"query","required":false,"description":"Only records at or after this ISO 8601 date/datetime (e.g. 2026-07-01).","schema":{"type":"string","maxLength":40}},{"name":"dateTo","in":"query","required":false,"description":"Only records at or before this ISO 8601 date/datetime.","schema":{"type":"string","maxLength":40}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"create_lead","summary":"Add a contact to the Leads board","description":"Add a contact to the Leads board. Needs at least an email or a phone number. If someone with that email or phone already exists, nothing is created and the existing lead is returned — so calling this twice is safe. Ad-platform leads arrive on their own; this is for contacts you are adding by hand.\n\nRequired scope: `leads.write`. Risk level: `write`.","tags":["leads"],"security":[{"bearerAuth":["leads.write"]}],"parameters":[{"name":"name","in":"query","required":false,"description":"Full name.","schema":{"type":"string","maxLength":160}},{"name":"email","in":"query","required":false,"description":"Email address.","schema":{"type":"string","maxLength":160}},{"name":"phone","in":"query","required":false,"description":"Phone number, ideally in +country format.","schema":{"type":"string","maxLength":60}},{"name":"status","in":"query","required":false,"description":"Starting pipeline status. Defaults to New.","schema":{"type":"string","enum":["New","Contacted","Qualified","Scheduled a Meeting","Proposal","Negotiation","Won","Lost","Unresponsive"]}},{"name":"owner","in":"query","required":false,"description":"Assign to this user (their email).","schema":{"type":"string","maxLength":120}},{"name":"campaign","in":"query","required":false,"description":"Campaign or source name to record against the lead.","schema":{"type":"string","maxLength":160}},{"name":"sourceLabel","in":"query","required":false,"description":"Where this contact came from, shown in the Form/Page column. Defaults to \"API\".","schema":{"type":"string","maxLength":120}},{"name":"utmSource","in":"query","required":false,"description":"utm_source to record.","schema":{"type":"string","maxLength":80}},{"name":"utmMedium","in":"query","required":false,"description":"utm_medium to record.","schema":{"type":"string","maxLength":80}},{"name":"utmCampaign","in":"query","required":false,"description":"utm_campaign to record.","schema":{"type":"string","maxLength":120}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/leads/{id}":{"get":{"operationId":"get_lead","summary":"Full detail for one lead: every form answer, custom board fields, the note a human left, the campaign/ad set/ad it came from, and any CRM tasks attached to it","description":"Full detail for one lead: every form answer, custom board fields, the note a human left, the campaign/ad set/ad it came from, and any CRM tasks attached to it. Use the id returned by search_leads.\n\nRequired scope: `leads.read`. Risk level: `read`.","tags":["leads"],"security":[{"bearerAuth":["leads.read"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Lead id from search_leads.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/leads/stale":{"get":{"operationId":"list_stale_leads","summary":"Open leads nobody has touched in `days` (default 14), oldest first, with how long each has been idle","description":"Open leads nobody has touched in `days` (default 14), oldest first, with how long each has been idle. \"Touched\" means created, edited or noted in the app. Won/Lost/Unresponsive leads are excluded. Use it for pipeline hygiene questions (\"what is going cold?\").\n\nRequired scope: `leads.read`. Risk level: `read`.","tags":["leads"],"security":[{"bearerAuth":["leads.read"]}],"parameters":[{"name":"days","in":"query","required":false,"description":"Idle threshold in days.","schema":{"type":"integer","minimum":1,"maximum":365,"default":14}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/leads/followup":{"get":{"operationId":"list_leads_requiring_followup","summary":"Open leads with a concrete reason to act right now: an overdue CRM task, or a New lead that has sat uncontacted longer than `newLeadHours` (default 24)","description":"Open leads with a concrete reason to act right now: an overdue CRM task, or a New lead that has sat uncontacted longer than `newLeadHours` (default 24). Each row says which reason applies. This reflects what humans recorded — it does not invent a scoring model.\n\nRequired scope: `leads.read`. Risk level: `read`.","tags":["leads"],"security":[{"bearerAuth":["leads.read"]}],"parameters":[{"name":"newLeadHours","in":"query","required":false,"description":"How long a New lead may sit before it counts as needing contact.","schema":{"type":"integer","minimum":1,"maximum":720,"default":24}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/contacts":{"get":{"operationId":"search_contacts","summary":"Search PEOPLE rather than submissions: lead records are merged by email (then phone), so someone who filled in three forms is one contact with three leads","description":"Search PEOPLE rather than submissions: lead records are merged by email (then phone), so someone who filled in three forms is one contact with three leads. Returns first/last seen, how many leads they account for and which sources they came through. Use search_leads instead when you care about individual submissions.\n\nRequired scope: `contacts.read`. Risk level: `read`.","tags":["contacts"],"security":[{"bearerAuth":["contacts.read"]}],"parameters":[{"name":"query","in":"query","required":false,"description":"Free text: name, email or phone.","schema":{"type":"string","maxLength":120}},{"name":"status","in":"query","required":false,"description":"Status of their most recent lead.","schema":{"type":"string","enum":["New","Contacted","Qualified","Scheduled a Meeting","Proposal","Negotiation","Won","Lost","Unresponsive"]}},{"name":"owner","in":"query","required":false,"description":"Assigned owner, exact match.","schema":{"type":"string","maxLength":120}},{"name":"dateFrom","in":"query","required":false,"description":"Only records at or after this ISO 8601 date/datetime (e.g. 2026-07-01).","schema":{"type":"string","maxLength":40}},{"name":"dateTo","in":"query","required":false,"description":"Only records at or before this ISO 8601 date/datetime.","schema":{"type":"string","maxLength":40}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/contacts/lookup":{"get":{"operationId":"get_contact","summary":"Resolve one contact by id, email or phone, with their merged lead history","description":"Resolve one contact by id, email or phone, with their merged lead history.\n\nRequired scope: `contacts.read`. Risk level: `read`.","tags":["contacts"],"security":[{"bearerAuth":["contacts.read"]}],"parameters":[{"name":"id","in":"query","required":false,"description":"Contact id from search_contacts.","schema":{"type":"string","maxLength":200}},{"name":"email","in":"query","required":false,"description":"Email address.","schema":{"type":"string","maxLength":160}},{"name":"phone","in":"query","required":false,"description":"Phone number in any format.","schema":{"type":"string","maxLength":60}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/contacts/activity":{"get":{"operationId":"get_contact_activity","summary":"Behavioural timeline for one person: site page views, cart events and purchases, plus channel touches (email opens/clicks, SMS clicks, landing-page and on-site interactions), with the engagement score and order totals the platform already computes","description":"Behavioural timeline for one person: site page views, cart events and purchases, plus channel touches (email opens/clicks, SMS clicks, landing-page and on-site interactions), with the engagement score and order totals the platform already computes. Identify them by email or phone. Use it to answer \"what has this person actually done?\".\n\nRequired scope: `contacts.read`. Risk level: `read`.","tags":["contacts"],"security":[{"bearerAuth":["contacts.read"]}],"parameters":[{"name":"email","in":"query","required":false,"description":"Email address.","schema":{"type":"string","maxLength":160}},{"name":"phone","in":"query","required":false,"description":"Phone number in any format.","schema":{"type":"string","maxLength":60}},{"name":"limit","in":"query","required":false,"description":"Maximum events to return.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/stores":{"get":{"operationId":"list_stores","summary":"The connected eCommerce stores/websites in this workspace (Shopify, WooCommerce, Wix, or GTM-connected sites)","description":"The connected eCommerce stores/websites in this workspace (Shopify, WooCommerce, Wix, or GTM-connected sites). Every customer tool needs a storeId from here.\n\nRequired scope: `customers.read`. Risk level: `read`.","tags":["customers"],"security":[{"bearerAuth":["customers.read"]}],"parameters":[{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/stores/{storeId}/customers":{"get":{"operationId":"search_customers","summary":"Customers of one store, aggregated from its orders: order count, lifetime spend, average order value, first and last order","description":"Customers of one store, aggregated from its orders: order count, lifetime spend, average order value, first and last order. Filter by minimum orders or a last-order date range; sort by recency (default) or spend.\n\nRequired scope: `customers.read`. Risk level: `read`.","tags":["customers"],"security":[{"bearerAuth":["customers.read"]}],"parameters":[{"name":"storeId","in":"path","required":true,"description":"Store id from list_stores.","schema":{"type":"string","maxLength":80}},{"name":"query","in":"query","required":false,"description":"Free text: email, name or phone.","schema":{"type":"string","maxLength":120}},{"name":"minOrders","in":"query","required":false,"description":"Only customers with at least this many orders.","schema":{"type":"integer","minimum":1,"maximum":1000}},{"name":"sort","in":"query","required":false,"description":"Result order.","schema":{"type":"string","enum":["recent_desc","spend_desc"],"default":"recent_desc"}},{"name":"dateFrom","in":"query","required":false,"description":"Only records at or after this ISO 8601 date/datetime (e.g. 2026-07-01).","schema":{"type":"string","maxLength":40}},{"name":"dateTo","in":"query","required":false,"description":"Only records at or before this ISO 8601 date/datetime.","schema":{"type":"string","maxLength":40}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/stores/{storeId}/customers/lookup":{"get":{"operationId":"get_customer","summary":"One customer of one store by email (or the id from search_customers), with their order totals and dates","description":"One customer of one store by email (or the id from search_customers), with their order totals and dates.\n\nRequired scope: `customers.read`. Risk level: `read`.","tags":["customers"],"security":[{"bearerAuth":["customers.read"]}],"parameters":[{"name":"storeId","in":"path","required":true,"description":"Store id from list_stores.","schema":{"type":"string","maxLength":80}},{"name":"email","in":"query","required":false,"description":"Customer email.","schema":{"type":"string","maxLength":160}},{"name":"id","in":"query","required":false,"description":"Customer id from search_customers.","schema":{"type":"string","maxLength":200}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/stores/{storeId}/summary":{"get":{"operationId":"get_customer_summary","summary":"Store-level customer economics: customer count, orders, revenue, average order value, repeat-purchase rate and the ten highest-spending customers","description":"Store-level customer economics: customer count, orders, revenue, average order value, repeat-purchase rate and the ten highest-spending customers. Use it for \"how is this store doing?\" before drilling into individuals.\n\nRequired scope: `reports.read`. Risk level: `read`.","tags":["reports"],"security":[{"bearerAuth":["reports.read"]}],"parameters":[{"name":"storeId","in":"path","required":true,"description":"Store id from list_stores.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/tasks":{"get":{"operationId":"list_tasks","summary":"CRM tasks in this workspace, soonest due first","description":"CRM tasks in this workspace, soonest due first. Open tasks only unless includeDone is true. Filter by owner, by due-date window, or by the record a task hangs off (relatedType contact/company/deal + relatedId).\n\nRequired scope: `tasks.read`. Risk level: `read`.","tags":["tasks"],"security":[{"bearerAuth":["tasks.read"]}],"parameters":[{"name":"query","in":"query","required":false,"description":"Substring of the task title.","schema":{"type":"string","maxLength":120}},{"name":"owner","in":"query","required":false,"description":"Assignee, exact match.","schema":{"type":"string","maxLength":120}},{"name":"includeDone","in":"query","required":false,"description":"Include completed tasks.","schema":{"type":"boolean","default":false}},{"name":"relatedType","in":"query","required":false,"description":"Only tasks attached to this record type.","schema":{"type":"string","enum":["contact","company","deal"]}},{"name":"relatedId","in":"query","required":false,"description":"Only tasks attached to this record id.","schema":{"type":"string","maxLength":80}},{"name":"dueFrom","in":"query","required":false,"description":"Only tasks due at or after this ISO 8601 date.","schema":{"type":"string","maxLength":40}},{"name":"dueTo","in":"query","required":false,"description":"Only tasks due at or before this ISO 8601 date.","schema":{"type":"string","maxLength":40}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"create_task","summary":"Create a CRM task","description":"Create a CRM task. Attach it to a lead by passing relatedType \"contact\" and the lead id, and it will show on that lead and in list_leads_requiring_followup once overdue.\n\nRequired scope: `tasks.write`. Risk level: `write`.","tags":["tasks"],"security":[{"bearerAuth":["tasks.write"]}],"parameters":[{"name":"title","in":"query","required":true,"description":"What needs doing.","schema":{"type":"string","maxLength":200}},{"name":"dueDate","in":"query","required":false,"description":"ISO 8601 date, or date-time to set a time of day.","schema":{"type":"string","maxLength":40}},{"name":"owner","in":"query","required":false,"description":"Assign to this user (their email).","schema":{"type":"string","maxLength":120}},{"name":"priority","in":"query","required":false,"description":"Task priority.","schema":{"type":"string","enum":["low","normal","high"]}},{"name":"relatedType","in":"query","required":false,"description":"Attach the task to this record type.","schema":{"type":"string","enum":["contact","company","deal"]}},{"name":"relatedId","in":"query","required":false,"description":"Id of the record to attach to. Required with relatedType.","schema":{"type":"string","maxLength":80}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/tasks/{id}":{"get":{"operationId":"get_task","summary":"One CRM task by id: title, due date, assignee, priority, whether it is done, and the contact/company/deal it hangs off","description":"One CRM task by id: title, due date, assignee, priority, whether it is done, and the contact/company/deal it hangs off.\n\nRequired scope: `tasks.read`. Risk level: `read`.","tags":["tasks"],"security":[{"bearerAuth":["tasks.read"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Task id from list_tasks.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/tasks/overdue":{"get":{"operationId":"list_overdue_tasks","summary":"Open tasks past their due date, most overdue first, each with how many days late it is","description":"Open tasks past their due date, most overdue first, each with how many days late it is. Optionally scoped to one owner.\n\nRequired scope: `tasks.read`. Risk level: `read`.","tags":["tasks"],"security":[{"bearerAuth":["tasks.read"]}],"parameters":[{"name":"owner","in":"query","required":false,"description":"Assignee, exact match.","schema":{"type":"string","maxLength":120}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/ad-accounts":{"get":{"operationId":"list_ad_accounts","summary":"Ad accounts this token may see, across Meta, Google Ads and DV360, with currency","description":"Ad accounts this token may see, across Meta, Google Ads and DV360, with currency. Campaign ids are only unique within a platform, so start here and pass accountId + platform downstream.\n\nRequired scope: `campaigns.read`. Risk level: `read`.","tags":["campaigns"],"security":[{"bearerAuth":["campaigns.read"]}],"parameters":[{"name":"platform","in":"query","required":false,"description":"Restrict to one platform.","schema":{"type":"string","enum":["meta","google","dv360"]}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/campaigns":{"get":{"operationId":"list_campaigns","summary":"Ad campaigns with their performance for a date preset (default last_30d): spend, impressions, clicks, results, CTR, CPC and cost per result, highest spend first","description":"Ad campaigns with their performance for a date preset (default last_30d): spend, impressions, clicks, results, CTR, CPC and cost per result, highest spend first. Reads the platform's synced cache, so figures are as fresh as the last sync, not live. Without accountId it reads the first few accounts and says so in `notes` — pass accountId for a complete, cheap answer.\n\nRequired scope: `campaigns.read`. Risk level: `read`.","tags":["campaigns"],"security":[{"bearerAuth":["campaigns.read"]}],"parameters":[{"name":"platform","in":"query","required":false,"description":"Restrict to one platform.","schema":{"type":"string","enum":["meta","google","dv360"]}},{"name":"accountId","in":"query","required":false,"description":"Ad account id from list_ad_accounts.","schema":{"type":"string","maxLength":60}},{"name":"status","in":"query","required":false,"description":"Campaign status, e.g. ACTIVE or PAUSED.","schema":{"type":"string","maxLength":30}},{"name":"query","in":"query","required":false,"description":"Substring of the campaign name, or an exact campaign id.","schema":{"type":"string","maxLength":120}},{"name":"datePreset","in":"query","required":false,"description":"Reporting window.","schema":{"type":"string","enum":["today","yesterday","last_7d","last_14d","last_30d","this_month","last_month","maximum"],"default":"last_30d"}},{"name":"sort","in":"query","required":false,"description":"Result order.","schema":{"type":"string","enum":["spend_desc","name_asc"],"default":"spend_desc"}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/campaigns/{id}":{"get":{"operationId":"get_campaign","summary":"One campaign with its settings and headline metrics","description":"One campaign with its settings and headline metrics. Ids are platform-scoped — pass the platform and accountId you got from list_campaigns.\n\nRequired scope: `campaigns.read`. Risk level: `read`.","tags":["campaigns"],"security":[{"bearerAuth":["campaigns.read"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Campaign id from list_campaigns.","schema":{"type":"string","maxLength":60}},{"name":"platform","in":"query","required":false,"description":"Platform the id belongs to.","schema":{"type":"string","enum":["meta","google","dv360"]}},{"name":"accountId","in":"query","required":false,"description":"Ad account id, to avoid scanning every account.","schema":{"type":"string","maxLength":60}},{"name":"datePreset","in":"query","required":false,"description":"Reporting window.","schema":{"type":"string","enum":["today","yesterday","last_7d","last_14d","last_30d","this_month","last_month","maximum"],"default":"last_30d"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/campaigns/{id}/performance":{"get":{"operationId":"get_campaign_performance","summary":"Just the metrics for one campaign over a date preset — spend, impressions, clicks, results, CTR, CPC, cost per result","description":"Just the metrics for one campaign over a date preset — spend, impressions, clicks, results, CTR, CPC, cost per result. Use it when you only need the numbers.\n\nRequired scope: `campaigns.read`. Risk level: `read`.","tags":["campaigns"],"security":[{"bearerAuth":["campaigns.read"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Campaign id from list_campaigns.","schema":{"type":"string","maxLength":60}},{"name":"platform","in":"query","required":false,"description":"Platform the id belongs to.","schema":{"type":"string","enum":["meta","google","dv360"]}},{"name":"accountId","in":"query","required":false,"description":"Ad account id.","schema":{"type":"string","maxLength":60}},{"name":"datePreset","in":"query","required":false,"description":"Reporting window.","schema":{"type":"string","enum":["today","yesterday","last_7d","last_14d","last_30d","this_month","last_month","maximum"],"default":"last_30d"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/reports/lead-sources":{"get":{"operationId":"get_lead_source_report","summary":"Lead volume and outcome grouped by source, campaign, form, page or status, over an optional date range: leads, won, lost, still open and win rate per group","description":"Lead volume and outcome grouped by source, campaign, form, page or status, over an optional date range: leads, won, lost, still open and win rate per group. Use it for \"where are our leads coming from and which convert?\".\n\nRequired scope: `reports.read`. Risk level: `read`.","tags":["reports"],"security":[{"bearerAuth":["reports.read"]}],"parameters":[{"name":"groupBy","in":"query","required":false,"description":"Grouping dimension.","schema":{"type":"string","enum":["source","campaign","form","page","status"],"default":"source"}},{"name":"status","in":"query","required":false,"description":"Restrict to one status before grouping.","schema":{"type":"string","enum":["New","Contacted","Qualified","Scheduled a Meeting","Proposal","Negotiation","Won","Lost","Unresponsive"]}},{"name":"dateFrom","in":"query","required":false,"description":"Only records at or after this ISO 8601 date/datetime (e.g. 2026-07-01).","schema":{"type":"string","maxLength":40}},{"name":"dateTo","in":"query","required":false,"description":"Only records at or before this ISO 8601 date/datetime.","schema":{"type":"string","maxLength":40}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/reports/conversions":{"get":{"operationId":"get_conversion_report","summary":"Revenue attribution over the last N days: orders and revenue credited back to the ad, email or SMS touch that produced them, using the platform's own attribution model","description":"Revenue attribution over the last N days: orders and revenue credited back to the ad, email or SMS touch that produced them, using the platform's own attribution model. Not recomputed here, so it agrees with what the app shows.\n\nRequired scope: `reports.read`. Risk level: `read`.","tags":["reports"],"security":[{"bearerAuth":["reports.read"]}],"parameters":[{"name":"days","in":"query","required":false,"description":"Look-back window in days.","schema":{"type":"integer","minimum":1,"maximum":365,"default":30}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/conversations":{"get":{"operationId":"list_conversations","summary":"Open message threads across WhatsApp, SMS, Facebook Messenger and Instagram DMs, newest first, with the last message, its time and the unread count","description":"Open message threads across WhatsApp, SMS, Facebook Messenger and Instagram DMs, newest first, with the last message, its time and the unread count. Reading never marks anything read. Channels that are not connected are skipped and listed in `notes`.\n\nRequired scope: `conversations.read`. Risk level: `read`.","tags":["conversations"],"security":[{"bearerAuth":["conversations.read"]}],"parameters":[{"name":"channel","in":"query","required":false,"description":"Restrict to one channel.","schema":{"type":"string","enum":["whatsapp","sms","facebook","instagram"]}},{"name":"unreadOnly","in":"query","required":false,"description":"Only threads with unread inbound messages.","schema":{"type":"boolean","default":false}},{"name":"query","in":"query","required":false,"description":"Substring of the contact name, or a phone number.","schema":{"type":"string","maxLength":120}},{"name":"dateFrom","in":"query","required":false,"description":"Only records at or after this ISO 8601 date/datetime (e.g. 2026-07-01).","schema":{"type":"string","maxLength":40}},{"name":"dateTo","in":"query","required":false,"description":"Only records at or before this ISO 8601 date/datetime.","schema":{"type":"string","maxLength":40}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/conversations/{id}":{"get":{"operationId":"get_conversation","summary":"The messages of one thread, oldest to newest, each marked inbound or outbound","description":"The messages of one thread, oldest to newest, each marked inbound or outbound. Use the composite id from list_conversations (for example \"whatsapp:+972…\"). Reading does not mark the thread read and does not send anything.\n\nRequired scope: `conversations.read`. Risk level: `read`.","tags":["conversations"],"security":[{"bearerAuth":["conversations.read"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Composite conversation id from list_conversations.","schema":{"type":"string","maxLength":200}},{"name":"limit","in":"query","required":false,"description":"Maximum messages to return (most recent).","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/automations":{"get":{"operationId":"list_automations","summary":"Marketing automations (journeys) in this workspace: name, whether enabled, what triggers entry and which step types it runs (email, SMS, WhatsApp, wait, filter, ad audience)","description":"Marketing automations (journeys) in this workspace: name, whether enabled, what triggers entry and which step types it runs (email, SMS, WhatsApp, wait, filter, ad audience). These are this platform's automated agents — it has no separate \"AI agent\" object.\n\nRequired scope: `agents.read`. Risk level: `read`.","tags":["agents"],"security":[{"bearerAuth":["agents.read"]}],"parameters":[{"name":"enabledOnly","in":"query","required":false,"description":"Only automations currently enabled.","schema":{"type":"boolean","default":false}},{"name":"query","in":"query","required":false,"description":"Substring of the automation name.","schema":{"type":"string","maxLength":120}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/automations/{id}":{"get":{"operationId":"get_automation","summary":"One automation with its run statistics: contacts entered and completed, emails and SMS sent, conversions, orders, opens and unsubscribes","description":"One automation with its run statistics: contacts entered and completed, emails and SMS sent, conversions, orders, opens and unsubscribes.\n\nRequired scope: `agents.read`. Risk level: `read`.","tags":["agents"],"security":[{"bearerAuth":["agents.read"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Automation id from list_automations.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/leads/{id}/update":{"post":{"operationId":"update_lead","summary":"Change a lead's pipeline status, owner or rating","description":"Change a lead's pipeline status, owner or rating. Supply only the fields you want to change; the rest are left alone. Returns before and after so the change is auditable. Works for leads from any source — the update is routed to the store that source uses, so it shows up in the app.\n\nRequired scope: `leads.write`. Risk level: `write`.","tags":["leads"],"security":[{"bearerAuth":["leads.write"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Lead id from search_leads.","schema":{"type":"string","maxLength":80}},{"name":"status","in":"query","required":false,"description":"New pipeline status.","schema":{"type":"string","enum":["New","Contacted","Qualified","Scheduled a Meeting","Proposal","Negotiation","Won","Lost","Unresponsive"]}},{"name":"owner","in":"query","required":false,"description":"New owner (their email). Pass an empty string to unassign.","schema":{"type":"string","maxLength":120}},{"name":"rating","in":"query","required":false,"description":"Star rating, 0-5.","schema":{"type":"integer","minimum":0,"maximum":5}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/leads/{id}/status":{"post":{"operationId":"update_lead_status","summary":"Move one lead to a different pipeline status","description":"Move one lead to a different pipeline status. A focused alias for update_lead when status is all you are changing.\n\nRequired scope: `leads.write`. Risk level: `write`.","tags":["leads"],"security":[{"bearerAuth":["leads.write"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Lead id from search_leads.","schema":{"type":"string","maxLength":80}},{"name":"status","in":"query","required":true,"description":"New pipeline status.","schema":{"type":"string","enum":["New","Contacted","Qualified","Scheduled a Meeting","Proposal","Negotiation","Won","Lost","Unresponsive"]}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/leads/{id}/owner":{"post":{"operationId":"assign_lead_owner","summary":"Assign a lead to a team member by their email address, or unassign it with an empty string","description":"Assign a lead to a team member by their email address, or unassign it with an empty string.\n\nRequired scope: `leads.write`. Risk level: `write`.","tags":["leads"],"security":[{"bearerAuth":["leads.write"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Lead id from search_leads.","schema":{"type":"string","maxLength":80}},{"name":"owner","in":"query","required":true,"description":"Owner email, or \"\" to unassign.","schema":{"type":"string","maxLength":120}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/leads/{id}/notes":{"post":{"operationId":"add_lead_note","summary":"Add a note to a lead's timeline","description":"Add a note to a lead's timeline. Set kind to log something that happened — a call, an email, a meeting — so it appears as that activity rather than a plain note, and set occurredAt to back-date it.\n\nRequired scope: `notes.write`. Risk level: `write`.","tags":["notes"],"security":[{"bearerAuth":["notes.write"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Lead id from search_leads.","schema":{"type":"string","maxLength":80}},{"name":"text","in":"query","required":true,"description":"The note body.","schema":{"type":"string","maxLength":5000}},{"name":"kind","in":"query","required":false,"description":"What this records. Defaults to note.","schema":{"type":"string","enum":["note","call","email","meeting","linkedin","sms","other"]}},{"name":"occurredAt","in":"query","required":false,"description":"ISO 8601 time it actually happened, if not now.","schema":{"type":"string","maxLength":40}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/tasks/{id}/update":{"post":{"operationId":"update_task","summary":"Change a task's title, due date, owner, priority or done state","description":"Change a task's title, due date, owner, priority or done state. Only the fields you supply change.\n\nRequired scope: `tasks.write`. Risk level: `write`.","tags":["tasks"],"security":[{"bearerAuth":["tasks.write"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Task id from list_tasks.","schema":{"type":"string","maxLength":80}},{"name":"title","in":"query","required":false,"description":"New title.","schema":{"type":"string","maxLength":200}},{"name":"dueDate","in":"query","required":false,"description":"New ISO 8601 due date, or \"\" to clear it.","schema":{"type":"string","maxLength":40}},{"name":"owner","in":"query","required":false,"description":"New owner email, or \"\" to unassign.","schema":{"type":"string","maxLength":120}},{"name":"priority","in":"query","required":false,"description":"New priority.","schema":{"type":"string","enum":["low","normal","high"]}},{"name":"done","in":"query","required":false,"description":"Mark done or not done.","schema":{"type":"boolean"}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/tasks/{id}/complete":{"post":{"operationId":"complete_task","summary":"Mark a task done","description":"Mark a task done. Calling it on an already-completed task changes nothing and says so.\n\nRequired scope: `tasks.write`. Risk level: `write`.","tags":["tasks"],"security":[{"bearerAuth":["tasks.write"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Task id from list_tasks.","schema":{"type":"string","maxLength":80}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/drafts/email":{"post":{"operationId":"create_email_draft","summary":"Write an email DRAFT into FORTVISION","description":"Write an email DRAFT into FORTVISION. It appears under Email → Drafts for a human to review, style and send — this tool never sends anything and never picks recipients. Give it plain content (subject, headline, body paragraphs separated by blank lines, an optional button) and it builds a valid email in the editor's format. Use direction \"rtl\" for Hebrew or Arabic.\n\nRequired scope: `messages.draft`. Risk level: `write`.","tags":["messages"],"security":[{"bearerAuth":["messages.draft"]}],"parameters":[{"name":"subject","in":"query","required":true,"description":"Subject line.","schema":{"type":"string","maxLength":200}},{"name":"name","in":"query","required":false,"description":"Internal name for the draft. Defaults to the subject.","schema":{"type":"string","maxLength":120}},{"name":"preheader","in":"query","required":false,"description":"Preview text shown after the subject in most inboxes.","schema":{"type":"string","maxLength":200}},{"name":"headline","in":"query","required":false,"description":"Large headline at the top of the email.","schema":{"type":"string","maxLength":200}},{"name":"body","in":"query","required":false,"description":"Body copy. Separate paragraphs with a blank line; each becomes its own block.","schema":{"type":"string","maxLength":20000}},{"name":"buttonLabel","in":"query","required":false,"description":"Call-to-action button text.","schema":{"type":"string","maxLength":60}},{"name":"buttonUrl","in":"query","required":false,"description":"Where the button links (http/https).","schema":{"type":"string","maxLength":600}},{"name":"direction","in":"query","required":false,"description":"Text direction. Use rtl for Hebrew/Arabic.","schema":{"type":"string","enum":["ltr","rtl"],"default":"ltr"}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/drafts/sms":{"post":{"operationId":"create_sms_draft","summary":"Save an SMS DRAFT the SMS composer can pick up","description":"Save an SMS DRAFT the SMS composer can pick up. Never sends and never selects recipients. The response reports the character count and how many 160-character segments the message will cost.\n\nRequired scope: `messages.draft`. Risk level: `write`.","tags":["messages"],"security":[{"bearerAuth":["messages.draft"]}],"parameters":[{"name":"message","in":"query","required":true,"description":"The SMS body.","schema":{"type":"string","maxLength":1600}},{"name":"name","in":"query","required":false,"description":"Internal name for the draft.","schema":{"type":"string","maxLength":120}},{"name":"senderProfileId","in":"query","required":false,"description":"Sender profile to use, from the SMS senders list.","schema":{"type":"string","maxLength":60}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/drafts/whatsapp":{"post":{"operationId":"create_whatsapp_draft","summary":"Save a WhatsApp DRAFT into the WhatsApp composer, where it appears under Drafts for a human to finish and send","description":"Save a WhatsApp DRAFT into the WhatsApp composer, where it appears under Drafts for a human to finish and send. Never sends. WhatsApp delivers only approved templates outside a 24-hour service window, so a draft names a template rather than free text — call list_whatsapp_templates first — and templateVariables fill its placeholders in order.\n\nRequired scope: `messages.draft`. Risk level: `write`.","tags":["messages"],"security":[{"bearerAuth":["messages.draft"]}],"parameters":[{"name":"templateName","in":"query","required":true,"description":"Approved template name (or id) from list_whatsapp_templates.","schema":{"type":"string","maxLength":120}},{"name":"templateVariables","in":"query","required":false,"description":"Values for the template placeholders, in order.","schema":{"type":"array","maxItems":10,"items":{"type":"string"}}},{"name":"name","in":"query","required":false,"description":"Ignored — the draft is named after its template, matching the composer.","schema":{"type":"string","maxLength":120}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/drafts":{"get":{"operationId":"list_message_drafts","summary":"List saved email, SMS and WhatsApp drafts, newest first, marking which were created through this API","description":"List saved email, SMS and WhatsApp drafts, newest first, marking which were created through this API. Use it to find a draft id before reading it or sending it.\n\nRequired scope: `messages.draft`. Risk level: `read`.","tags":["messages"],"security":[{"bearerAuth":["messages.draft"]}],"parameters":[{"name":"channel","in":"query","required":false,"description":"Restrict to one channel.","schema":{"type":"string","enum":["email","sms","whatsapp"]}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/drafts/{id}":{"get":{"operationId":"get_message_draft","summary":"Read one draft in full — for email, its subject and every content block; for SMS and WhatsApp, the message body","description":"Read one draft in full — for email, its subject and every content block; for SMS and WhatsApp, the message body.\n\nRequired scope: `messages.draft`. Risk level: `read`.","tags":["messages"],"security":[{"bearerAuth":["messages.draft"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Draft id from list_message_drafts.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/campaigns/email/send":{"post":{"operationId":"send_email_campaign","summary":"Send an existing email draft to an audience","description":"Send an existing email draft to an audience. PREVIEW FIRST: called without confirm it changes nothing and reports exactly who would receive it, how many were removed as unsubscribed or bounced, and the sending address. Unsubscribed, bounced and complained addresses are always excluded and an unsubscribe link is always added. Create the draft with create_email_draft first; this tool never writes content.\n\nRequired scope: `messages.send`. Risk level: `high`.","tags":["messages"],"security":[{"bearerAuth":["messages.send"]}],"parameters":[{"name":"draftId","in":"query","required":true,"description":"Email draft id from list_message_drafts.","schema":{"type":"string","maxLength":80}},{"name":"leadIds","in":"query","required":false,"description":"Exact leads to send to. Most precise option.","schema":{"type":"array","maxItems":500,"items":{"type":"string"}}},{"name":"status","in":"query","required":false,"description":"Send to every lead currently in this pipeline status.","schema":{"type":"string","enum":["New","Contacted","Qualified","Scheduled a Meeting","Proposal","Negotiation","Won","Lost","Unresponsive"]}},{"name":"audience","in":"query","required":false,"description":"Set to \"all_leads\" to reach every lead with a usable email address. Still capped and still previewed.","schema":{"type":"string","enum":["all_leads"]}},{"name":"fromEmail","in":"query","required":false,"description":"Verified sending address. Defaults to the workspace's first verified identity.","schema":{"type":"string","maxLength":160}},{"name":"fromName","in":"query","required":false,"description":"Display name shown as the sender.","schema":{"type":"string","maxLength":80}},{"name":"replyTo","in":"query","required":false,"description":"Reply-to address.","schema":{"type":"string","maxLength":160}},{"name":"sendAt","in":"query","required":false,"description":"ISO 8601 time to send. Defaults to about a minute from now.","schema":{"type":"string","maxLength":40}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/outreach/sequences":{"get":{"operationId":"list_email_sequences","summary":"List the outreach email sequences (multi-step cadences sent from the connected Gmail/Outlook mailboxes by the platform's sequence engine): id, name, status (running/paused), step subjects and day offsets, recipient/pending/replied counts, sending mailbox and daily cap","description":"List the outreach email sequences (multi-step cadences sent from the connected Gmail/Outlook mailboxes by the platform's sequence engine): id, name, status (running/paused), step subjects and day offsets, recipient/pending/replied counts, sending mailbox and daily cap.\n\nRequired scope: `campaigns.read`. Risk level: `read`.","tags":["campaigns"],"security":[{"bearerAuth":["campaigns.read"]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/outreach/sequences/create":{"post":{"operationId":"create_email_sequence","summary":"Create an outreach email SEQUENCE — a multi-step cadence sent from a connected mailbox over days","description":"Create an outreach email SEQUENCE — a multi-step cadence sent from a connected mailbox over days. It is created PAUSED: nothing sends until start_email_sequence is confirmed (or Start in the Sequences tab), so creating it is reversible. steps: up to 8 of {subject, body (plain text ok), delayDays — days AFTER the previous step, first step usually 0}. recipients: up to 500 of {email, name?}. from: a connected mailbox address or \"__rotate__\" (default) to rotate across all connected mailboxes by remaining warm-up budget. Replies and bounces automatically stop the cadence for that recipient (stopOnReply defaults true).\n\nRequired scope: `messages.draft`. Risk level: `write`.","tags":["messages"],"security":[{"bearerAuth":["messages.draft"]}],"parameters":[{"name":"name","in":"query","required":true,"description":"Sequence name.","schema":{"type":"string","maxLength":120}},{"name":"steps","in":"query","required":true,"description":"Cadence steps in order. Each: { subject (required on first step), body (plain text or simple HTML), delayDays (0-60, days after the PREVIOUS step) }.","schema":{"type":"array","maxItems":8,"items":{"type":"object"}}},{"name":"recipients","in":"query","required":true,"description":"Who to enroll. Each: { email (required), name }.","schema":{"type":"array","maxItems":500,"items":{"type":"object"}}},{"name":"from","in":"query","required":false,"description":"Sending mailbox address, or \"__rotate__\" (default) to rotate across connected mailboxes.","schema":{"type":"string","maxLength":160}},{"name":"dailyCap","in":"query","required":false,"description":"Max sequence emails per day (1-100, default 20). Per-mailbox warm-up caps still apply on top.","schema":{"type":"number"}},{"name":"stopOnReply","in":"query","required":false,"description":"Stop the cadence for a recipient when they reply. Default true.","schema":{"type":"boolean"}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/outreach/sequences/start":{"post":{"operationId":"start_email_sequence","summary":"Start (activate) a paused outreach sequence so the platform cron begins sending it","description":"Start (activate) a paused outreach sequence so the platform cron begins sending it. PREVIEW FIRST: called without confirm it changes nothing and reports the pending recipient count, the step cadence, the sending mailbox and every mailbox's warm-up budget. Only after confirm does the sequence switch to running — first sends go out within ~10 minutes, throttled by the sequence daily cap and per-mailbox warm-up caps.\n\nRequired scope: `messages.send`. Risk level: `high`.","tags":["messages"],"security":[{"bearerAuth":["messages.send"]}],"parameters":[{"name":"id","in":"query","required":true,"description":"Sequence id from list_email_sequences or create_email_sequence.","schema":{"type":"string","maxLength":60}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/outreach/email/send":{"post":{"operationId":"send_outreach_email","summary":"Send ONE email from a mailbox connected to this workspace (the Gmail/Outlook inboxes under Sequences → Email accounts), e","description":"Send ONE email from a mailbox connected to this workspace (the Gmail/Outlook inboxes under Sequences → Email accounts), e.g. for cold outreach from warmed-up addresses. NOT the campaign engine: use this — not send_email_campaign — whenever the mail should leave a real connected inbox. Content is either subject+body inline, or draftId of an email draft (rendered as a personal email: text only, no campaign wrapper, no unsubscribe footer). PREVIEW FIRST: called without confirm it changes nothing and reports which mailbox will send, its warm-up budget used today, and every connected mailbox's remaining budget. Sends count against the SAME per-mailbox daily warm-up cap the sequence engine uses, and a mailbox at its cap is refused — one recipient per call, so sending N emails is N previewed calls.\n\nRequired scope: `messages.send`. Risk level: `high`.","tags":["messages"],"security":[{"bearerAuth":["messages.send"]}],"parameters":[{"name":"to","in":"query","required":true,"description":"Recipient email address.","schema":{"type":"string","maxLength":160}},{"name":"subject","in":"query","required":false,"description":"Subject line. Required unless draftId is given (then defaults to the draft's subject).","schema":{"type":"string","maxLength":300}},{"name":"body","in":"query","required":false,"description":"Email body — plain text is fine (line breaks preserved); simple HTML accepted. Required unless draftId is given.","schema":{"type":"string","maxLength":20000}},{"name":"draftId","in":"query","required":false,"description":"Alternatively: an email draft id from list_message_drafts; its text content is sent as a personal email.","schema":{"type":"string","maxLength":80}},{"name":"from","in":"query","required":false,"description":"Sending mailbox address from the connected list, or \"__rotate__\" (default) to auto-pick the mailbox with the most warm-up budget left today.","schema":{"type":"string","maxLength":160}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/campaigns/sms/send":{"post":{"operationId":"send_sms_campaign","summary":"Send an existing SMS draft to an audience","description":"Send an existing SMS draft to an audience. PREVIEW FIRST: without confirm it reports the recipient count, the total SMS segments it will cost, and who was excluded for opting out. Numbers that replied STOP are always excluded. Create the draft with create_sms_draft first.\n\nRequired scope: `messages.send`. Risk level: `high`.","tags":["messages"],"security":[{"bearerAuth":["messages.send"]}],"parameters":[{"name":"draftId","in":"query","required":true,"description":"SMS draft id from list_message_drafts.","schema":{"type":"string","maxLength":80}},{"name":"leadIds","in":"query","required":false,"description":"Exact leads to send to.","schema":{"type":"array","maxItems":500,"items":{"type":"string"}}},{"name":"status","in":"query","required":false,"description":"Send to every lead currently in this pipeline status.","schema":{"type":"string","enum":["New","Contacted","Qualified","Scheduled a Meeting","Proposal","Negotiation","Won","Lost","Unresponsive"]}},{"name":"audience","in":"query","required":false,"description":"Set to \"all_leads\" to reach every lead with a usable phone number.","schema":{"type":"string","enum":["all_leads"]}},{"name":"senderProfileId","in":"query","required":false,"description":"Verified sender profile id. Defaults to the draft's, then the first verified profile.","schema":{"type":"string","maxLength":60}},{"name":"sendAt","in":"query","required":false,"description":"ISO 8601 time to send. Defaults to about a minute from now.","schema":{"type":"string","maxLength":40}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/leads/bulk-update":{"post":{"operationId":"bulk_update_leads","summary":"Change the status and/or owner of many leads at once","description":"Change the status and/or owner of many leads at once. PREVIEW FIRST: without confirm it reports how many records match, how many would actually change, and a sample. Capped per call — a larger reassignment belongs in the app where the selection is visible.\n\nRequired scope: `leads.write`. Risk level: `high`.","tags":["leads"],"security":[{"bearerAuth":["leads.write"]}],"parameters":[{"name":"leadIds","in":"query","required":false,"description":"Exact leads to update.","schema":{"type":"array","maxItems":500,"items":{"type":"string"}}},{"name":"fromStatus","in":"query","required":false,"description":"Alternatively, update every lead currently in this status.","schema":{"type":"string","enum":["New","Contacted","Qualified","Scheduled a Meeting","Proposal","Negotiation","Won","Lost","Unresponsive"]}},{"name":"status","in":"query","required":false,"description":"New status to set.","schema":{"type":"string","enum":["New","Contacted","Qualified","Scheduled a Meeting","Proposal","Negotiation","Won","Lost","Unresponsive"]}},{"name":"owner","in":"query","required":false,"description":"New owner email, or \"\" to unassign.","schema":{"type":"string","maxLength":120}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/contacts/import":{"post":{"operationId":"import_contacts","summary":"Bulk-import or migrate contacts into a Leads list (e","description":"Bulk-import or migrate contacts into a Leads list (e.g. from HubSpot) with upsert semantics: an existing contact — matched by externalId, else by email within the list — is UPDATED, never duplicated, and each record may carry a linked task (with a due date) and notes that land on the contact timeline. Re-running the same import changes nothing. PREVIEW FIRST: without confirm it reports how many records would create vs update and which are invalid, writing nothing.\n\nRequired scope: `leads.write`. Risk level: `high`.","tags":["leads"],"security":[{"bearerAuth":["leads.write"]}],"parameters":[{"name":"listId","in":"query","required":true,"description":"Target Leads list name, e.g. \"FORTVISION Sales CRM\".","schema":{"type":"string","maxLength":120}},{"name":"source","in":"query","required":false,"description":"Migration source label recorded on each contact, e.g. \"HubSpot\".","schema":{"type":"string","maxLength":80}},{"name":"records","in":"query","required":true,"description":"Contact records. Each: { email (required), name, firstName, lastName, phone, company, website, status, owner, tags, externalId, hubspotContactId, hubspotTaskId, lastContactedAt, dueDate, task:{title,description,type,status,dueDate,assignedTo}, notes:[{body,createdAt,author,source}] }.","schema":{"type":"array","maxItems":500,"items":{"type":"object"}}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/campaigns/{id}/status":{"post":{"operationId":"update_campaign_status","summary":"Pause or activate an ad campaign on Meta, Google Ads or DV360","description":"Pause or activate an ad campaign on Meta, Google Ads or DV360. PREVIEW FIRST: without confirm it reports the current state, the intended state and recent spend. The change is applied through the platform's own change pipeline, read back from the ad platform to verify, and recorded so it can be rolled back from the AI Assistant's change history.\n\nRequired scope: `campaigns.write`. Risk level: `high`.","tags":["campaigns"],"security":[{"bearerAuth":["campaigns.write"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Campaign id from list_campaigns.","schema":{"type":"string","maxLength":60}},{"name":"status","in":"query","required":true,"description":"Target state.","schema":{"type":"string","enum":["ACTIVE","PAUSED"]}},{"name":"platform","in":"query","required":false,"description":"Platform the id belongs to.","schema":{"type":"string","enum":["meta","google","dv360"]}},{"name":"accountId","in":"query","required":false,"description":"Ad account id, so the campaign is found without scanning every account.","schema":{"type":"string","maxLength":60}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/campaigns/{id}/budget":{"post":{"operationId":"update_campaign_budget","summary":"Change an ad campaign's daily budget, in the ACCOUNT CURRENCY (not cents or micros)","description":"Change an ad campaign's daily budget, in the ACCOUNT CURRENCY (not cents or micros). PREVIEW FIRST: without confirm it reports the current budget, the new one, the percentage change and recent spend, and warns if the change looks like a unit mistake. Applied, verified against the ad platform and rollbackable.\n\nRequired scope: `budgets.write`. Risk level: `high`.","tags":["budgets"],"security":[{"bearerAuth":["budgets.write"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Campaign id from list_campaigns.","schema":{"type":"string","maxLength":60}},{"name":"dailyBudget","in":"query","required":true,"description":"New daily budget in the account currency, e.g. 250 for ₪250/day.","schema":{"type":"number","minimum":0.01}},{"name":"platform","in":"query","required":false,"description":"Platform the id belongs to.","schema":{"type":"string","enum":["meta","google","dv360"]}},{"name":"accountId","in":"query","required":false,"description":"Ad account id.","schema":{"type":"string","maxLength":60}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/tasks/{id}/delete":{"post":{"operationId":"delete_task","summary":"Permanently delete a CRM task","description":"Permanently delete a CRM task. PREVIEW FIRST: without confirm it shows the task that would be destroyed. There is no undo and no trash — prefer complete_task unless the task should never have existed.\n\nRequired scope: `records.delete`. Risk level: `high`.","tags":["records"],"security":[{"bearerAuth":["records.delete"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Task id from list_tasks.","schema":{"type":"string","maxLength":80}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/campaign-drafts":{"get":{"operationId":"list_campaign_drafts","summary":"Campaign drafts saved in the Meta, Google Ads and DV360 publish wizards but not yet published: name, type, ad account, and how many ad groups / ad sets / creatives each has","description":"Campaign drafts saved in the Meta, Google Ads and DV360 publish wizards but not yet published: name, type, ad account, and how many ad groups / ad sets / creatives each has. These are what publish_campaign_draft can put live.\n\nRequired scope: `campaigns.read`. Risk level: `read`.","tags":["campaigns"],"security":[{"bearerAuth":["campaigns.read"]}],"parameters":[{"name":"platform","in":"query","required":false,"description":"Restrict to one platform.","schema":{"type":"string","enum":["meta","google","dv360"]}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/campaign-drafts/{draftId}/publish":{"post":{"operationId":"publish_campaign_draft","summary":"Publish a saved campaign draft to the ad platform, creating a real campaign","description":"Publish a saved campaign draft to the ad platform, creating a real campaign. PREVIEW FIRST: without confirm it summarises the campaign in plain language — name, type, budget, countries, how many ad sets and creatives — and warns about anything missing. Meta campaigns are created PAUSED so they can be reviewed before spending. This tool cannot invent a campaign: build or edit the draft in the publish wizard first, then publish it here.\n\nRequired scope: `campaigns.write`. Risk level: `high`.","tags":["campaigns"],"security":[{"bearerAuth":["campaigns.write"]}],"parameters":[{"name":"platform","in":"query","required":true,"description":"Which wizard the draft belongs to.","schema":{"type":"string","enum":["meta","google","dv360"]}},{"name":"draftId","in":"path","required":true,"description":"Draft id from list_campaign_drafts.","schema":{"type":"string","maxLength":80}},{"name":"accountId","in":"query","required":false,"description":"Ad account / customer / advertiser id, if the draft does not carry one.","schema":{"type":"string","maxLength":60}},{"name":"pageId","in":"query","required":false,"description":"Meta only: the Facebook Page ads run from, if the draft does not carry one.","schema":{"type":"string","maxLength":60}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/whatsapp/templates":{"get":{"operationId":"list_whatsapp_templates","summary":"WhatsApp message templates on this workspace's Business account, with their approval status, language, category, body text and how many variables each takes — plus the sender numbers available","description":"WhatsApp message templates on this workspace's Business account, with their approval status, language, category, body text and how many variables each takes — plus the sender numbers available. Outside a 24-hour service window Meta only delivers approved templates, so start here before sending.\n\nRequired scope: `conversations.read`. Risk level: `read`.","tags":["conversations"],"security":[{"bearerAuth":["conversations.read"]}],"parameters":[{"name":"approvedOnly","in":"query","required":false,"description":"Only templates Meta has approved. Default true.","schema":{"type":"boolean","default":true}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/whatsapp/send":{"post":{"operationId":"send_whatsapp_message","summary":"Send an approved WhatsApp template to an audience","description":"Send an approved WhatsApp template to an audience. PREVIEW FIRST: without confirm it shows the template body that will actually arrive, the recipient count, and who was excluded for opting out. Numbers that opted out are always removed. Capped at 500 recipients per call. Unapproved templates are refused — Meta would not deliver them.\n\nRequired scope: `messages.send`. Risk level: `high`.","tags":["messages"],"security":[{"bearerAuth":["messages.send"]}],"parameters":[{"name":"templateName","in":"query","required":true,"description":"Template name or id from list_whatsapp_templates.","schema":{"type":"string","maxLength":120}},{"name":"templateVariables","in":"query","required":false,"description":"Values for the template placeholders, in order.","schema":{"type":"array","maxItems":10,"items":{"type":"string"}}},{"name":"leadIds","in":"query","required":false,"description":"Exact leads to message.","schema":{"type":"array","maxItems":500,"items":{"type":"string"}}},{"name":"status","in":"query","required":false,"description":"Message every lead currently in this pipeline status.","schema":{"type":"string","enum":["New","Contacted","Qualified","Scheduled a Meeting","Proposal","Negotiation","Won","Lost","Unresponsive"]}},{"name":"audience","in":"query","required":false,"description":"Set to \"all_leads\" to reach every lead with a usable phone number.","schema":{"type":"string","enum":["all_leads"]}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/webhooks/events":{"get":{"operationId":"list_webhook_events","summary":"The event types a webhook subscription can listen for, with what each one means","description":"The event types a webhook subscription can listen for, with what each one means. Call this before creating a subscription so you use real event names.\n\nRequired scope: `admin.integrations`. Risk level: `read`.","tags":["admin"],"security":[{"bearerAuth":["admin.integrations"]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/webhooks":{"get":{"operationId":"list_webhooks","summary":"The webhook endpoints registered for this workspace, with their events, whether they are active, their last delivery result and how many consecutive failures they have","description":"The webhook endpoints registered for this workspace, with their events, whether they are active, their last delivery result and how many consecutive failures they have. Secrets are never returned — only a hint of the first and last characters.\n\nRequired scope: `admin.integrations`. Risk level: `read`.","tags":["admin"],"security":[{"bearerAuth":["admin.integrations"]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"create_webhook","summary":"Register an https endpoint to receive signed event deliveries","description":"Register an https endpoint to receive signed event deliveries. The signing secret is returned ONCE — store it, because it is the only thing that proves a delivery came from FORTVISION. Verify each request by recomputing HMAC-SHA256 over `${timestamp}.${rawBody}` using the RAW body, and reject deliveries whose timestamp is more than a few minutes old.\n\nRequired scope: `admin.integrations`. Risk level: `write`.","tags":["admin"],"security":[{"bearerAuth":["admin.integrations"]}],"parameters":[{"name":"url","in":"query","required":true,"description":"https endpoint to POST to. Must be a public host.","schema":{"type":"string","maxLength":500}},{"name":"events","in":"query","required":true,"description":"Event types to subscribe to — see list_webhook_events.","schema":{"type":"array","maxItems":20,"items":{"type":"string"}}},{"name":"description","in":"query","required":false,"description":"What this endpoint is for.","schema":{"type":"string","maxLength":200}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/webhooks/{id}/update":{"post":{"operationId":"update_webhook","summary":"Change a webhook endpoint's URL, event list or description, or re-enable one that was auto-disabled after repeated failures","description":"Change a webhook endpoint's URL, event list or description, or re-enable one that was auto-disabled after repeated failures.\n\nRequired scope: `admin.integrations`. Risk level: `write`.","tags":["admin"],"security":[{"bearerAuth":["admin.integrations"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Subscription id from list_webhooks.","schema":{"type":"string","maxLength":60}},{"name":"url","in":"query","required":false,"description":"New https endpoint.","schema":{"type":"string","maxLength":500}},{"name":"events","in":"query","required":false,"description":"Replacement event list.","schema":{"type":"array","maxItems":20,"items":{"type":"string"}}},{"name":"description","in":"query","required":false,"description":"New description.","schema":{"type":"string","maxLength":200}},{"name":"active","in":"query","required":false,"description":"Enable or disable deliveries. Enabling also clears the failure counter.","schema":{"type":"boolean"}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/webhooks/{id}/rotate":{"post":{"operationId":"rotate_webhook_secret","summary":"Issue a new signing secret for an endpoint","description":"Issue a new signing secret for an endpoint. The old secret keeps signing alongside the new one for 24 hours, so you can deploy the new value without dropping deliveries in between. The new secret is returned once.\n\nRequired scope: `admin.integrations`. Risk level: `write`.","tags":["admin"],"security":[{"bearerAuth":["admin.integrations"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Subscription id from list_webhooks.","schema":{"type":"string","maxLength":60}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/webhooks/{id}/test":{"post":{"operationId":"test_webhook","summary":"Send a synthetic webhook","description":"Send a synthetic webhook.test delivery to one endpoint right now and report the HTTP status it returned. Use it to prove signature verification works before relying on real events.\n\nRequired scope: `admin.integrations`. Risk level: `write`.","tags":["admin"],"security":[{"bearerAuth":["admin.integrations"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Subscription id from list_webhooks.","schema":{"type":"string","maxLength":60}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/webhooks/deliveries":{"get":{"operationId":"list_webhook_deliveries","summary":"Recent delivery attempts for this workspace: which event, which endpoint, which attempt number, the HTTP status or error, and how long it took","description":"Recent delivery attempts for this workspace: which event, which endpoint, which attempt number, the HTTP status or error, and how long it took. Use it to debug an endpoint that is not receiving.\n\nRequired scope: `admin.integrations`. Risk level: `read`.","tags":["admin"],"security":[{"bearerAuth":["admin.integrations"]}],"parameters":[{"name":"limit","in":"query","required":false,"description":"How many attempts to return.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/webhooks/{id}/delete":{"post":{"operationId":"delete_webhook","summary":"Permanently remove a webhook endpoint","description":"Permanently remove a webhook endpoint. PREVIEW FIRST: without confirm it shows which endpoint and events would stop. Any integration relying on those deliveries stops receiving them immediately.\n\nRequired scope: `admin.integrations`. Risk level: `high`.","tags":["admin"],"security":[{"bearerAuth":["admin.integrations"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Subscription id from list_webhooks.","schema":{"type":"string","maxLength":60}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/linkedin/senders":{"get":{"operationId":"list_linkedin_senders","summary":"The LinkedIn accounts (senders) connected to this workspace: status (available / cooling-down / disconnected), daily action limits and how much of each was used today","description":"The LinkedIn accounts (senders) connected to this workspace: status (available / cooling-down / disconnected), daily action limits and how much of each was used today. Call this before creating a sequence — senderIds come from here. Senders are connected in the app only; this API never handles LinkedIn credentials.\n\nRequired scope: `linkedin.read`. Risk level: `read`.","tags":["linkedin"],"security":[{"bearerAuth":["linkedin.read"]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/linkedin/lists":{"get":{"operationId":"list_linkedin_lists","summary":"Prospect lists for LinkedIn outreach: how each was built (search / post engagers / URLs / CSV), its import status and prospect count","description":"Prospect lists for LinkedIn outreach: how each was built (search / post engagers / URLs / CSV), its import status and prospect count. A sequence targets one of these lists.\n\nRequired scope: `linkedin.read`. Risk level: `read`.","tags":["linkedin"],"security":[{"bearerAuth":["linkedin.read"]}],"parameters":[{"name":"query","in":"query","required":false,"description":"Substring of the list name.","schema":{"type":"string","maxLength":120}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"create_linkedin_list","summary":"Create a prospect list from a LinkedIn SEARCH (people search / event attendees / Sales Navigator URL) or from a POST's engagers (everyone who reacted to or commented on it — preview first with preview_linkedin_post_engagers)","description":"Create a prospect list from a LinkedIn SEARCH (people search / event attendees / Sales Navigator URL) or from a POST's engagers (everyone who reacted to or commented on it — preview first with preview_linkedin_post_engagers). The import runs in the background over minutes; poll get_linkedin_list until status \"ready\". Creating a list sends nothing.\n\nRequired scope: `linkedin.write`. Risk level: `write`.","tags":["linkedin"],"security":[{"bearerAuth":["linkedin.write"]}],"parameters":[{"name":"name","in":"query","required":false,"description":"List name (required for searchUrl; defaults for postUrl).","schema":{"type":"string","maxLength":140}},{"name":"searchUrl","in":"query","required":false,"description":"A linkedin.com search URL to import from. Pass this OR postUrl.","schema":{"type":"string","maxLength":1500}},{"name":"postUrl","in":"query","required":false,"description":"A LinkedIn post URL whose engagers to import. Pass this OR searchUrl.","schema":{"type":"string","maxLength":500}},{"name":"includeReactions","in":"query","required":false,"description":"postUrl only: import people who reacted. Default true.","schema":{"type":"boolean"}},{"name":"includeComments","in":"query","required":false,"description":"postUrl only: import people who commented. Default true.","schema":{"type":"boolean"}},{"name":"senderId","in":"query","required":false,"description":"Sender whose LinkedIn session performs the import. Defaults to the first available sender.","schema":{"type":"string","maxLength":60}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/linkedin/lists/{listId}":{"get":{"operationId":"get_linkedin_list","summary":"One prospect list with its prospects (name, title, company, profile URL)","description":"One prospect list with its prospects (name, title, company, profile URL). While an import is running the list's status is \"importing\" and the count grows — poll until \"ready\".\n\nRequired scope: `linkedin.read`. Risk level: `read`.","tags":["linkedin"],"security":[{"bearerAuth":["linkedin.read"]}],"parameters":[{"name":"listId","in":"path","required":true,"description":"List id from list_linkedin_lists.","schema":{"type":"string","maxLength":60}},{"name":"query","in":"query","required":false,"description":"Filter prospects by name, company or email.","schema":{"type":"string","maxLength":120}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/linkedin/sequences":{"get":{"operationId":"list_linkedin_sequences","summary":"LinkedIn outreach sequences (campaigns): status (draft/running/paused/finished), target list, senders, step count, enrollment counts and headline stats (invites, accepted, messages, replies)","description":"LinkedIn outreach sequences (campaigns): status (draft/running/paused/finished), target list, senders, step count, enrollment counts and headline stats (invites, accepted, messages, replies).\n\nRequired scope: `linkedin.read`. Risk level: `read`.","tags":["linkedin"],"security":[{"bearerAuth":["linkedin.read"]}],"parameters":[{"name":"status","in":"query","required":false,"description":"Only sequences in this state.","schema":{"type":"string","enum":["draft","running","paused","finished"]}},{"name":"query","in":"query","required":false,"description":"Substring of the sequence name.","schema":{"type":"string","maxLength":120}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"create_linkedin_sequence","summary":"Create a LinkedIn outreach sequence as a DRAFT — nothing sends until launch_linkedin_sequence is confirmed, so creating is reversible","description":"Create a LinkedIn outreach sequence as a DRAFT — nothing sends until launch_linkedin_sequence is confirmed, so creating is reversible. steps: ordered actions, each {type, delayDays, delayHours, message, messageB (A/B variant), subject (inmail/email), withdrawAfterDays (connect)}. Types: view_profile, like_post, endorse, connect, message, inmail, send_email, and branch nodes if_connected/{connected,notConnected}, if_replied/{replied,notReplied}, if_open/{open,notOpen} whose branch keys hold sub-step arrays. Personalization tokens like {firstName} {company} work in messages. Attach a prospect list (listId from list_linkedin_lists) and senders (senderIds from list_linkedin_senders) here or later with update_linkedin_sequence.\n\nRequired scope: `linkedin.write`. Risk level: `write`.","tags":["linkedin"],"security":[{"bearerAuth":["linkedin.write"]}],"parameters":[{"name":"name","in":"query","required":true,"description":"Sequence name.","schema":{"type":"string","maxLength":140}},{"name":"steps","in":"query","required":true,"description":"Ordered steps — see the tool description for the shape.","schema":{"type":"array","maxItems":40,"items":{"type":"object"}}},{"name":"listId","in":"query","required":false,"description":"Prospect list to target (from list_linkedin_lists).","schema":{"type":"string","maxLength":60}},{"name":"excludeListId","in":"query","required":false,"description":"List whose members are excluded.","schema":{"type":"string","maxLength":60}},{"name":"senderIds","in":"query","required":false,"description":"Sender account ids to rotate across.","schema":{"type":"array","maxItems":20,"items":{"type":"string"}}},{"name":"scheduleDays","in":"query","required":false,"description":"Sending days, 0=Sunday … 6=Saturday. Default Mon-Fri.","schema":{"type":"array","maxItems":7,"items":{"type":"string"}}},{"name":"scheduleFrom","in":"query","required":false,"description":"Daily window start, HH:MM (default 09:00).","schema":{"type":"string","maxLength":5}},{"name":"scheduleTo","in":"query","required":false,"description":"Daily window end, HH:MM (default 19:00).","schema":{"type":"string","maxLength":5}},{"name":"tzOffset","in":"query","required":false,"description":"Timezone offset in hours for the window, e.g. 3 for Israel summer.","schema":{"type":"integer","minimum":-12,"maximum":14}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/linkedin/sequences/{id}":{"get":{"operationId":"get_linkedin_sequence","summary":"One sequence in full: every step with its message text (including A/B variant B and branch sub-flows), schedule window, live per-prospect breakdown (pending / in progress / replied / failed), per-sender stats, A/B variant results and a 30-day daily series","description":"One sequence in full: every step with its message text (including A/B variant B and branch sub-flows), schedule window, live per-prospect breakdown (pending / in progress / replied / failed), per-sender stats, A/B variant results and a 30-day daily series.\n\nRequired scope: `linkedin.read`. Risk level: `read`.","tags":["linkedin"],"security":[{"bearerAuth":["linkedin.read"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Sequence id from list_linkedin_sequences.","schema":{"type":"string","maxLength":60}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/linkedin/post-engagers":{"get":{"operationId":"preview_linkedin_post_engagers","summary":"Who engaged with a LinkedIn post (reactions and comments) — counts and a sample of names, WITHOUT creating anything","description":"Who engaged with a LinkedIn post (reactions and comments) — counts and a sample of names, WITHOUT creating anything. Use before create_linkedin_list with postUrl to see who you would import.\n\nRequired scope: `linkedin.read`. Risk level: `read`.","tags":["linkedin"],"security":[{"bearerAuth":["linkedin.read"]}],"parameters":[{"name":"postUrl","in":"query","required":true,"description":"LinkedIn post URL (feed/update/… or /posts/…-activity-…).","schema":{"type":"string","maxLength":500}},{"name":"senderId","in":"query","required":false,"description":"Sender whose LinkedIn session reads the post. Defaults to the first available sender.","schema":{"type":"string","maxLength":60}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/linkedin/inbox":{"get":{"operationId":"list_linkedin_inbox","summary":"The unified LinkedIn inbox across every connected sender: conversation threads with the counterpart's name/company, last-message time, unread state, tags and assignee","description":"The unified LinkedIn inbox across every connected sender: conversation threads with the counterpart's name/company, last-message time, unread state, tags and assignee. Reading the LIST marks nothing read.\n\nRequired scope: `linkedin.read`. Risk level: `read`.","tags":["linkedin"],"security":[{"bearerAuth":["linkedin.read"]}],"parameters":[{"name":"unreadOnly","in":"query","required":false,"description":"Only unread threads.","schema":{"type":"boolean","default":false}},{"name":"query","in":"query","required":false,"description":"Filter by counterpart name, company or snippet.","schema":{"type":"string","maxLength":120}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/linkedin/inbox/messages":{"get":{"operationId":"get_linkedin_conversation","summary":"The messages of one LinkedIn conversation (newest 100), plus the counterpart's profile when resolvable","description":"The messages of one LinkedIn conversation (newest 100), plus the counterpart's profile when resolvable. NOTE: opening a conversation marks it READ on LinkedIn itself, exactly as in the app.\n\nRequired scope: `linkedin.read`. Risk level: `read`.","tags":["linkedin"],"security":[{"bearerAuth":["linkedin.read"]}],"parameters":[{"name":"senderId","in":"query","required":true,"description":"The sender the thread belongs to (from list_linkedin_inbox).","schema":{"type":"string","maxLength":60}},{"name":"chatId","in":"query","required":true,"description":"Thread id from list_linkedin_inbox.","schema":{"type":"string","maxLength":120}},{"name":"providerId","in":"query","required":false,"description":"Counterpart provider id from the thread, to resolve their profile.","schema":{"type":"string","maxLength":120}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/linkedin/overview":{"get":{"operationId":"get_linkedin_overview","summary":"The LinkedIn dashboard in one call: total invites / accepted / messages / replies, a 30-day daily series, every sequence's headline numbers and per-sender totals","description":"The LinkedIn dashboard in one call: total invites / accepted / messages / replies, a 30-day daily series, every sequence's headline numbers and per-sender totals.\n\nRequired scope: `linkedin.read`. Risk level: `read`.","tags":["linkedin"],"security":[{"bearerAuth":["linkedin.read"]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/linkedin/send-health":{"get":{"operationId":"get_linkedin_send_health","summary":"Detects stalled outreach: running sequences whose every sender is cooling down or disconnected (with how many actions are due), and which senders are free","description":"Detects stalled outreach: running sequences whose every sender is cooling down or disconnected (with how many actions are due), and which senders are free. If canFix is true, fix_linkedin_send_health adds the free senders to the blocked sequences.\n\nRequired scope: `linkedin.read`. Risk level: `read`.","tags":["linkedin"],"security":[{"bearerAuth":["linkedin.read"]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/linkedin/sequences/{id}/update":{"post":{"operationId":"update_linkedin_sequence","summary":"Edit a sequence: name, steps, target list, senders or schedule","description":"Edit a sequence: name, steps, target list, senders or schedule. Only the fields you pass change; the run status is kept. Editing the steps of a RUNNING sequence affects prospects that have not reached those steps yet.\n\nRequired scope: `linkedin.write`. Risk level: `write`.","tags":["linkedin"],"security":[{"bearerAuth":["linkedin.write"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Sequence id.","schema":{"type":"string","maxLength":60}},{"name":"name","in":"query","required":false,"description":"New name.","schema":{"type":"string","maxLength":140}},{"name":"steps","in":"query","required":false,"description":"FULL replacement step array (same shape as create_linkedin_sequence).","schema":{"type":"array","maxItems":40,"items":{"type":"object"}}},{"name":"listId","in":"query","required":false,"description":"New target list id.","schema":{"type":"string","maxLength":60}},{"name":"excludeListId","in":"query","required":false,"description":"New exclusion list id, or \"\" to clear.","schema":{"type":"string","maxLength":60}},{"name":"senderIds","in":"query","required":false,"description":"FULL replacement sender id list.","schema":{"type":"array","maxItems":20,"items":{"type":"string"}}},{"name":"scheduleDays","in":"query","required":false,"description":"Sending days, 0=Sunday … 6=Saturday.","schema":{"type":"array","maxItems":7,"items":{"type":"string"}}},{"name":"scheduleFrom","in":"query","required":false,"description":"Daily window start HH:MM.","schema":{"type":"string","maxLength":5}},{"name":"scheduleTo","in":"query","required":false,"description":"Daily window end HH:MM.","schema":{"type":"string","maxLength":5}},{"name":"tzOffset","in":"query","required":false,"description":"Timezone offset in hours.","schema":{"type":"integer","minimum":-12,"maximum":14}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/linkedin/sequences/{id}/pause":{"post":{"operationId":"pause_linkedin_sequence","summary":"Pause a running sequence — the cron stops processing its prospects until it is resumed","description":"Pause a running sequence — the cron stops processing its prospects until it is resumed. Safe and instant; resume_linkedin_sequence continues from where it stopped.\n\nRequired scope: `linkedin.write`. Risk level: `write`.","tags":["linkedin"],"security":[{"bearerAuth":["linkedin.write"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Sequence id.","schema":{"type":"string","maxLength":60}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/linkedin/sequences/{id}/duplicate":{"post":{"operationId":"duplicate_linkedin_sequence","summary":"Copy a sequence into a new DRAFT (same steps, list and senders, no progress)","description":"Copy a sequence into a new DRAFT (same steps, list and senders, no progress). Useful for A/B testing a variation without touching the original.\n\nRequired scope: `linkedin.write`. Risk level: `write`.","tags":["linkedin"],"security":[{"bearerAuth":["linkedin.write"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Sequence id to copy.","schema":{"type":"string","maxLength":60}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/linkedin/sequences/{id}/lead":{"post":{"operationId":"set_linkedin_lead_state","summary":"Manage ONE prospect inside a sequence: pause them, resume them, or stop their cadence for good (op \"stop\" is how you exclude someone who asked to be left alone)","description":"Manage ONE prospect inside a sequence: pause them, resume them, or stop their cadence for good (op \"stop\" is how you exclude someone who asked to be left alone).\n\nRequired scope: `linkedin.write`. Risk level: `write`.","tags":["linkedin"],"security":[{"bearerAuth":["linkedin.write"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Sequence id.","schema":{"type":"string","maxLength":60}},{"name":"leadId","in":"query","required":true,"description":"Prospect id from get_linkedin_list.","schema":{"type":"string","maxLength":60}},{"name":"op","in":"query","required":true,"description":"What to do.","schema":{"type":"string","enum":["pause","resume","stop"]}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/linkedin/send-health/fix":{"post":{"operationId":"fix_linkedin_send_health","summary":"One-click fix for a stalled queue: adds every currently-usable sender to the running sequences whose own senders are all cooling down, so the cron's rebalance has somewhere to move waiting prospects","description":"One-click fix for a stalled queue: adds every currently-usable sender to the running sequences whose own senders are all cooling down, so the cron's rebalance has somewhere to move waiting prospects. Run get_linkedin_send_health first; only acts on sequences it reported as blocked.\n\nRequired scope: `linkedin.write`. Risk level: `write`.","tags":["linkedin"],"security":[{"bearerAuth":["linkedin.write"]}],"parameters":[{"name":"sequenceIds","in":"query","required":false,"description":"Limit the fix to these sequences. Default: every blocked one.","schema":{"type":"array","maxItems":50,"items":{"type":"string"}}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/linkedin/sequences/{id}/launch":{"post":{"operationId":"launch_linkedin_sequence","summary":"Launch a sequence: enrolls the target list's prospects and real LinkedIn outreach begins within minutes (staggered, inside the schedule window, under per-sender daily caps)","description":"Launch a sequence: enrolls the target list's prospects and real LinkedIn outreach begins within minutes (staggered, inside the schedule window, under per-sender daily caps). PREVIEW FIRST: called without confirm it changes nothing and reports how many prospects would enroll, the senders, the steps and any blockers (no list / no sender / empty list). People who already replied are never re-enrolled. Relaunching an already-run sequence re-enrolls unfinished prospects from step 0.\n\nRequired scope: `linkedin.send`. Risk level: `high`.","tags":["linkedin"],"security":[{"bearerAuth":["linkedin.send"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Sequence id.","schema":{"type":"string","maxLength":60}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/linkedin/sequences/{id}/resume":{"post":{"operationId":"resume_linkedin_sequence","summary":"Resume a paused sequence — the cron continues each unfinished prospect from exactly where they stopped (no re-enrollment, no restart from step 0; that is what launch does)","description":"Resume a paused sequence — the cron continues each unfinished prospect from exactly where they stopped (no re-enrollment, no restart from step 0; that is what launch does). PREVIEW FIRST: without confirm it reports how many prospects are pending / mid-cadence.\n\nRequired scope: `linkedin.send`. Risk level: `high`.","tags":["linkedin"],"security":[{"bearerAuth":["linkedin.send"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Sequence id.","schema":{"type":"string","maxLength":60}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/linkedin/inbox/send":{"post":{"operationId":"send_linkedin_message","summary":"Reply in an existing LinkedIn conversation as one of the connected senders","description":"Reply in an existing LinkedIn conversation as one of the connected senders. PREVIEW FIRST: without confirm it changes nothing and echoes exactly which sender says what in which thread. A sent LinkedIn message cannot be unsent.\n\nRequired scope: `linkedin.send`. Risk level: `high`.","tags":["linkedin"],"security":[{"bearerAuth":["linkedin.send"]}],"parameters":[{"name":"senderId","in":"query","required":true,"description":"Sender the thread belongs to.","schema":{"type":"string","maxLength":60}},{"name":"chatId","in":"query","required":true,"description":"Thread id from list_linkedin_inbox.","schema":{"type":"string","maxLength":120}},{"name":"text","in":"query","required":true,"description":"The message text.","schema":{"type":"string","maxLength":8000}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/linkedin/lists/import-urls":{"post":{"operationId":"import_linkedin_leads","summary":"Add specific LinkedIn profiles (by URL, max 40) to a prospect list — a new one or an existing one","description":"Add specific LinkedIn profiles (by URL, max 40) to a prospect list — a new one or an existing one. HIGH IMPACT because adding to a list a RUNNING sequence targets enrolls the new prospects immediately and outreach to them starts within minutes. PREVIEW FIRST: without confirm it reports the target list, how many URLs are valid, and exactly which running sequences would start contacting them.\n\nRequired scope: `linkedin.write`. Risk level: `high`.","tags":["linkedin"],"security":[{"bearerAuth":["linkedin.write"]}],"parameters":[{"name":"urls","in":"query","required":true,"description":"linkedin.com/in/… profile URLs.","schema":{"type":"array","maxItems":40,"items":{"type":"string"}}},{"name":"listId","in":"query","required":false,"description":"Existing list to add to. Omit to create a new list.","schema":{"type":"string","maxLength":60}},{"name":"name","in":"query","required":false,"description":"Name for the new list when listId is omitted.","schema":{"type":"string","maxLength":140}},{"name":"senderId","in":"query","required":false,"description":"Sender whose session resolves the profiles. Defaults to the first available.","schema":{"type":"string","maxLength":60}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/linkedin/sequences/{id}/delete":{"post":{"operationId":"delete_linkedin_sequence","summary":"Delete a sequence and all its per-prospect progress and stats","description":"Delete a sequence and all its per-prospect progress and stats. IRREVERSIBLE — pause_linkedin_sequence is almost always the better choice. The prospect list is kept. PREVIEW FIRST.\n\nRequired scope: `records.delete`. Risk level: `high`.","tags":["records"],"security":[{"bearerAuth":["records.delete"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Sequence id.","schema":{"type":"string","maxLength":60}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/linkedin/lists/{listId}/delete":{"post":{"operationId":"delete_linkedin_list","summary":"Delete a prospect list and its prospects","description":"Delete a prospect list and its prospects. IRREVERSIBLE. PREVIEW FIRST: without confirm it reports the prospect count and warns if any sequence still targets the list.\n\nRequired scope: `records.delete`. Risk level: `high`.","tags":["records"],"security":[{"bearerAuth":["records.delete"]}],"parameters":[{"name":"listId","in":"path","required":true,"description":"List id.","schema":{"type":"string","maxLength":60}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/wallet":{"get":{"operationId":"get_wallet_overview","summary":"Overview of the Wallet loyalty module: every club card (loyalty / stamps / coupon / gift / membership) with its exact funnel — members, installed in Apple/Google Wallet, visited, redeemed, open points — plus recent club activity (joins, scans, redemptions, pushes)","description":"Overview of the Wallet loyalty module: every club card (loyalty / stamps / coupon / gift / membership) with its exact funnel — members, installed in Apple/Google Wallet, visited, redeemed, open points — plus recent club activity (joins, scans, redemptions, pushes). Use it for \"how is the club doing\", \"how many joined\", \"which card performs best\". Numbers are exact, derived from the passes themselves.\n\nRequired scope: `wallet.read`. Risk level: `read`.","tags":["wallet"],"security":[{"bearerAuth":["wallet.read"]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/wallet/members":{"get":{"operationId":"search_wallet_members","summary":"Search club members by name, email, phone or member id, optionally within one card","description":"Search club members by name, email, phone or member id, optionally within one card. Returns per member: tier, points/stamps/balance, how many devices installed the pass, join source (utm), join date and last visit. Use get_wallet_overview first to learn the card ids.\n\nRequired scope: `wallet.read`. Risk level: `read`.","tags":["wallet"],"security":[{"bearerAuth":["wallet.read"]}],"parameters":[{"name":"query","in":"query","required":false,"description":"Free text: name, email, phone or member id. Empty = newest members.","schema":{"type":"string","maxLength":120}},{"name":"cardId","in":"query","required":false,"description":"Restrict to one club card (id from get_wallet_overview).","schema":{"type":"string","maxLength":40}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/projects":{"get":{"operationId":"list_projects","summary":"The Projects boards visible to this user: name, key, item count, groups, columns and the status labels each board uses","description":"The Projects boards visible to this user: name, key, item count, groups, columns and the status labels each board uses. Call this first — create/update tools need a projectId, valid status names and group/column ids from here.\n\nRequired scope: `projects.read`. Risk level: `read`.","tags":["projects"],"security":[{"bearerAuth":["projects.read"]}],"parameters":[{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"create_project","summary":"Create a new board with a People column, a Status column (default labels Backlog / Todo / In Progress / Done, or your own), a Due date column and groups (default To-Do / Completed)","description":"Create a new board with a People column, a Status column (default labels Backlog / Todo / In Progress / Done, or your own), a Due date column and groups (default To-Do / Completed). Reversible — a board can be deleted in the app.\n\nRequired scope: `projects.write`. Risk level: `write`.","tags":["projects"],"security":[{"bearerAuth":["projects.write"]}],"parameters":[{"name":"name","in":"query","required":true,"description":"Board name.","schema":{"type":"string","maxLength":120}},{"name":"key","in":"query","required":false,"description":"Short prefix for item refs, e.g. CAMP. Default: derived from the name.","schema":{"type":"string","maxLength":6}},{"name":"statuses","in":"query","required":false,"description":"Status labels in order (first = default for new items; a label named \"Done\" counts as done).","schema":{"type":"array","maxItems":12,"items":{"type":"string"}}},{"name":"groups","in":"query","required":false,"description":"Group names in order.","schema":{"type":"array","maxItems":12,"items":{"type":"string"}}},{"name":"color","in":"query","required":false,"description":"Hex color for the board.","schema":{"type":"string","maxLength":9}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/projects/{id}":{"get":{"operationId":"get_project","summary":"One board with its items: each item has a ref (KEY-number), title, status, priority, assignees, due date, group, and the values of the board's custom columns keyed by column title","description":"One board with its items: each item has a ref (KEY-number), title, status, priority, assignees, due date, group, and the values of the board's custom columns keyed by column title. Filter by status or group; paged.\n\nRequired scope: `projects.read`. Risk level: `read`.","tags":["projects"],"security":[{"bearerAuth":["projects.read"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Project (board) id from list_projects.","schema":{"type":"string","maxLength":60}},{"name":"status","in":"query","required":false,"description":"Only items in this status (exact label).","schema":{"type":"string","maxLength":60}},{"name":"groupId","in":"query","required":false,"description":"Only items in this group id.","schema":{"type":"string","maxLength":60}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/projects/items":{"get":{"operationId":"search_project_items","summary":"Search items across every visible board by text (title, ref like CAMP-12, or any column value), status or assignee","description":"Search items across every visible board by text (title, ref like CAMP-12, or any column value), status or assignee. Use it for \"what is Dana working on\", \"everything still In Progress\", \"find the item about X\".\n\nRequired scope: `projects.read`. Risk level: `read`.","tags":["projects"],"security":[{"bearerAuth":["projects.read"]}],"parameters":[{"name":"query","in":"query","required":false,"description":"Free text or an item ref (KEY-number).","schema":{"type":"string","maxLength":120}},{"name":"projectId","in":"query","required":false,"description":"Restrict to one board.","schema":{"type":"string","maxLength":60}},{"name":"status","in":"query","required":false,"description":"Exact status label.","schema":{"type":"string","maxLength":60}},{"name":"assignee","in":"query","required":false,"description":"Assignee email or name (substring).","schema":{"type":"string","maxLength":120}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/projects/{projectId}/items":{"post":{"operationId":"create_project_item","summary":"Add an item to a board","description":"Add an item to a board. status must be one of the board's labels (see list_projects); group accepts a group id or name; values is an object keyed by column id or title (numbers, text, dropdown arrays, ratings…). Unknown statuses, groups or columns are rejected with the valid options — nothing is silently dropped.\n\nRequired scope: `projects.write`. Risk level: `write`.","tags":["projects"],"security":[{"bearerAuth":["projects.write"]}],"parameters":[{"name":"projectId","in":"path","required":true,"description":"Board id.","schema":{"type":"string","maxLength":60}},{"name":"title","in":"query","required":true,"description":"Item title.","schema":{"type":"string","maxLength":300}},{"name":"description","in":"query","required":false,"description":"Longer description.","schema":{"type":"string","maxLength":5000}},{"name":"status","in":"query","required":false,"description":"Status label. Default: the board's first open status.","schema":{"type":"string","maxLength":60}},{"name":"priority","in":"query","required":false,"description":"Priority.","schema":{"type":"string","enum":["Urgent","High","Medium","Low","None"]}},{"name":"assignees","in":"query","required":false,"description":"Assignee emails.","schema":{"type":"array","maxItems":10,"items":{"type":"string"}}},{"name":"dueDate","in":"query","required":false,"description":"YYYY-MM-DD.","schema":{"type":"string","maxLength":10}},{"name":"group","in":"query","required":false,"description":"Group id or name. Default: the first group.","schema":{"type":"string","maxLength":60}},{"name":"values","in":"query","required":false,"description":"Custom column values keyed by column id or title.","schema":{"type":"string"}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/projects/{projectId}/items/{itemId}/update":{"post":{"operationId":"update_project_item","summary":"Change an item: title, status, priority, assignees (full replacement), due date, group, column values (merged), or add a comment","description":"Change an item: title, status, priority, assignees (full replacement), due date, group, column values (merged), or add a comment. Only the fields you pass change; each change is logged in the item's activity. itemId accepts the item id or its ref (KEY-number).\n\nRequired scope: `projects.write`. Risk level: `write`.","tags":["projects"],"security":[{"bearerAuth":["projects.write"]}],"parameters":[{"name":"projectId","in":"path","required":true,"description":"Board id.","schema":{"type":"string","maxLength":60}},{"name":"itemId","in":"path","required":true,"description":"Item id or ref.","schema":{"type":"string","maxLength":60}},{"name":"title","in":"query","required":false,"description":"New title.","schema":{"type":"string","maxLength":300}},{"name":"status","in":"query","required":false,"description":"New status label.","schema":{"type":"string","maxLength":60}},{"name":"priority","in":"query","required":false,"description":"New priority.","schema":{"type":"string","enum":["Urgent","High","Medium","Low","None"]}},{"name":"assignees","in":"query","required":false,"description":"FULL replacement assignee list ([] to unassign).","schema":{"type":"array","maxItems":10,"items":{"type":"string"}}},{"name":"dueDate","in":"query","required":false,"description":"YYYY-MM-DD, or \"\" to clear.","schema":{"type":"string","maxLength":10}},{"name":"group","in":"query","required":false,"description":"Move to this group (id or name).","schema":{"type":"string","maxLength":60}},{"name":"values","in":"query","required":false,"description":"Column values to merge, keyed by column id or title.","schema":{"type":"string"}},{"name":"comment","in":"query","required":false,"description":"Append a comment.","schema":{"type":"string","maxLength":4000}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/projects/{projectId}/items/{itemId}/delete":{"post":{"operationId":"delete_project_item","summary":"Remove an item from a board (with its comments and sub-items)","description":"Remove an item from a board (with its comments and sub-items). PREVIEW FIRST: without confirm it shows the item that would be removed. The board keeps a restorable version snapshot in the app, but the item is gone from the board immediately.\n\nRequired scope: `records.delete`. Risk level: `high`.","tags":["records"],"security":[{"bearerAuth":["records.delete"]}],"parameters":[{"name":"projectId","in":"path","required":true,"description":"Board id.","schema":{"type":"string","maxLength":60}},{"name":"itemId","in":"path","required":true,"description":"Item id.","schema":{"type":"string","maxLength":60}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/landing-pages":{"get":{"operationId":"list_landing_pages","summary":"The workspace's landing pages with performance: views, clicks, leads captured, conversion rate, average time on page and 14-day daily views","description":"The workspace's landing pages with performance: views, clicks, leads captured, conversion rate, average time on page and 14-day daily views. Leads captured by a page are also searchable with search_leads (source landing_page).\n\nRequired scope: `pages.read`. Risk level: `read`.","tags":["pages"],"security":[{"bearerAuth":["pages.read"]}],"parameters":[{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/email-campaigns":{"get":{"operationId":"list_email_campaigns","summary":"Sent email campaigns with results: sent, unique opens and open rate, unique clicks and click rate, unsubscribes, bounces, complaints, attributed orders/revenue, A/B winner","description":"Sent email campaigns with results: sent, unique opens and open rate, unique clicks and click rate, unsubscribes, bounces, complaints, attributed orders/revenue, A/B winner. Newest first. Use it for \"how did last week's newsletter do\".\n\nRequired scope: `reports.read`. Risk level: `read`.","tags":["reports"],"security":[{"bearerAuth":["reports.read"]}],"parameters":[{"name":"query","in":"query","required":false,"description":"Filter by campaign name or subject.","schema":{"type":"string","maxLength":120}},{"name":"includeArchived","in":"query","required":false,"description":"Include archived campaigns.","schema":{"type":"boolean","default":false}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/sms-campaigns":{"get":{"operationId":"list_sms_campaigns","summary":"Sent SMS campaigns with results: sent, delivered and delivery rate, failed, link clicks and click rate, unsubscribes, attributed orders/revenue","description":"Sent SMS campaigns with results: sent, delivered and delivery rate, failed, link clicks and click rate, unsubscribes, attributed orders/revenue. Newest first.\n\nRequired scope: `reports.read`. Risk level: `read`.","tags":["reports"],"security":[{"bearerAuth":["reports.read"]}],"parameters":[{"name":"query","in":"query","required":false,"description":"Filter by campaign name or message text.","schema":{"type":"string","maxLength":120}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/landing-pages/{id}":{"get":{"operationId":"get_landing_page","summary":"One landing page with its settings (URL, list, SEO, expiry) and its HTML (capped; pass maxHtmlChars for more)","description":"One landing page with its settings (URL, list, SEO, expiry) and its HTML (capped; pass maxHtmlChars for more). Read it before editing so replaceText edits match the real markup.\n\nRequired scope: `pages.read`. Risk level: `read`.","tags":["pages"],"security":[{"bearerAuth":["pages.read"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Page id from list_landing_pages.","schema":{"type":"string","maxLength":60}},{"name":"maxHtmlChars","in":"query","required":false,"description":"How much HTML to return (1000-60000, default 20000).","schema":{"type":"integer","minimum":1000,"maximum":60000}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/landing-pages/generate":{"post":{"operationId":"generate_landing_page","summary":"Create a new landing page with the platform's AI page generator from a brief (prompt and/or title, description, paragraphs, image URLs), save it and return its URL","description":"Create a new landing page with the platform's AI page generator from a brief (prompt and/or title, description, paragraphs, image URLs), save it and return its URL. Takes 30-90 seconds. The page is live at its URL immediately but nothing is promoted; it can be edited with update_landing_page or removed with delete_landing_page. Leads submitted on it land in the CRM (and in listId if given).\n\nRequired scope: `pages.write`. Risk level: `write`.","tags":["pages"],"security":[{"bearerAuth":["pages.write"]}],"parameters":[{"name":"name","in":"query","required":true,"description":"Internal page name.","schema":{"type":"string","maxLength":120}},{"name":"prompt","in":"query","required":false,"description":"Brief for the generator: business, offer, audience, tone, sections wanted.","schema":{"type":"string","maxLength":8000}},{"name":"title","in":"query","required":false,"description":"Hero title.","schema":{"type":"string","maxLength":300}},{"name":"description","in":"query","required":false,"description":"Sub-headline / summary.","schema":{"type":"string","maxLength":2000}},{"name":"paragraphs","in":"query","required":false,"description":"Body paragraphs to include.","schema":{"type":"array","maxItems":40,"items":{"type":"string"}}},{"name":"imageUrls","in":"query","required":false,"description":"Image URLs the page may use.","schema":{"type":"array","maxItems":24,"items":{"type":"string"}}},{"name":"pageType","in":"query","required":false,"description":"Layout family.","schema":{"type":"string","enum":["minisite","landing","form"]}},{"name":"listId","in":"query","required":false,"description":"Landing-page list to route leads into (from list_landing_page_lists).","schema":{"type":"string","maxLength":60}},{"name":"listName","in":"query","required":false,"description":"Display name of that list.","schema":{"type":"string","maxLength":80}},{"name":"slug","in":"query","required":false,"description":"Custom URL slug (a-z, 0-9, dashes; must be free).","schema":{"type":"string","maxLength":60}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/landing-pages/{id}/update":{"post":{"operationId":"update_landing_page","summary":"Edit a landing page: settings (name, slug, list, SEO title/og image, noindex, redirect, expiry) and/or content","description":"Edit a landing page: settings (name, slug, list, SEO title/og image, noindex, redirect, expiry) and/or content. Content edits: replaceText = exact find→replace pairs applied to the page HTML (a find string that matches nowhere is rejected, so a typo cannot silently do nothing), or html = full replacement. Read the page first with get_landing_page.\n\nRequired scope: `pages.write`. Risk level: `write`.","tags":["pages"],"security":[{"bearerAuth":["pages.write"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Page id.","schema":{"type":"string","maxLength":60}},{"name":"name","in":"query","required":false,"description":"Internal name.","schema":{"type":"string","maxLength":120}},{"name":"title","in":"query","required":false,"description":"SEO/hero title.","schema":{"type":"string","maxLength":300}},{"name":"description","in":"query","required":false,"description":"Meta description.","schema":{"type":"string","maxLength":2000}},{"name":"slug","in":"query","required":false,"description":"Custom URL slug, or \"\" to clear.","schema":{"type":"string","maxLength":60}},{"name":"listId","in":"query","required":false,"description":"Landing-page list id for new leads, or \"\" to clear.","schema":{"type":"string","maxLength":60}},{"name":"listName","in":"query","required":false,"description":"Display name of that list.","schema":{"type":"string","maxLength":80}},{"name":"ogTitle","in":"query","required":false,"description":"Open Graph title.","schema":{"type":"string","maxLength":200}},{"name":"ogImage","in":"query","required":false,"description":"Open Graph image URL.","schema":{"type":"string","maxLength":600}},{"name":"noindex","in":"query","required":false,"description":"Hide from search engines.","schema":{"type":"boolean"}},{"name":"redirectUrl","in":"query","required":false,"description":"Redirect after form submit.","schema":{"type":"string","maxLength":600}},{"name":"expiresAt","in":"query","required":false,"description":"ISO date-time after which the page shows expiredMsg.","schema":{"type":"string","maxLength":40}},{"name":"expiredMsg","in":"query","required":false,"description":"Message shown after expiry.","schema":{"type":"string","maxLength":400}},{"name":"replaceText","in":"query","required":false,"description":"Exact text edits: [{find, replace}] applied to the HTML in order.","schema":{"type":"array","maxItems":40,"items":{"type":"object"}}},{"name":"html","in":"query","required":false,"description":"FULL replacement HTML (use only when replaceText is not enough).","schema":{"type":"string","maxLength":400000}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/landing-pages/{id}/delete":{"post":{"operationId":"delete_landing_page","summary":"Take a landing page down (its URL stops serving)","description":"Take a landing page down (its URL stops serving). PREVIEW FIRST: without confirm it shows the page and how many leads it captured (they stay in the CRM).\n\nRequired scope: `records.delete`. Risk level: `high`.","tags":["records"],"security":[{"bearerAuth":["records.delete"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Page id.","schema":{"type":"string","maxLength":60}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/landing-pages/lists":{"get":{"operationId":"list_landing_page_lists","summary":"The landing-page lead lists (a page routes its leads into one), with lead counts","description":"The landing-page lead lists (a page routes its leads into one), with lead counts.\n\nRequired scope: `pages.read`. Risk level: `read`.","tags":["pages"],"security":[{"bearerAuth":["pages.read"]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"create_landing_page_list","summary":"Create a landing-page lead list (returns the existing one if the name already exists)","description":"Create a landing-page lead list (returns the existing one if the name already exists).\n\nRequired scope: `pages.write`. Risk level: `write`.","tags":["pages"],"security":[{"bearerAuth":["pages.write"]}],"parameters":[{"name":"name","in":"query","required":true,"description":"List name.","schema":{"type":"string","maxLength":80}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/social/posts":{"get":{"operationId":"list_social_posts","summary":"Posts in the social calendar (the currently focused page/client): status (draft / pending / scheduled / published / rejected), copy, channels, schedule time, image, and real stats for published ones","description":"Posts in the social calendar (the currently focused page/client): status (draft / pending / scheduled / published / rejected), copy, channels, schedule time, image, and real stats for published ones.\n\nRequired scope: `social.read`. Risk level: `read`.","tags":["social"],"security":[{"bearerAuth":["social.read"]}],"parameters":[{"name":"status","in":"query","required":false,"description":"Filter by status.","schema":{"type":"string","enum":["draft","pending","scheduled","published","rejected"]}},{"name":"query","in":"query","required":false,"description":"Text in title, headline or copy.","schema":{"type":"string","maxLength":120}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"create_social_post","summary":"Save a post to the calendar as a DRAFT (or pending client approval)","description":"Save a post to the calendar as a DRAFT (or pending client approval). Never publishes: scheduling and publishing are separate confirm-gated tools.\n\nRequired scope: `social.write`. Risk level: `write`.","tags":["social"],"security":[{"bearerAuth":["social.write"]}],"parameters":[{"name":"copy","in":"query","required":true,"description":"Post text.","schema":{"type":"string","maxLength":2200}},{"name":"title","in":"query","required":false,"description":"Internal title.","schema":{"type":"string","maxLength":200}},{"name":"headline","in":"query","required":false,"description":"Headline / first line.","schema":{"type":"string","maxLength":200}},{"name":"cta","in":"query","required":false,"description":"Call to action.","schema":{"type":"string","maxLength":60}},{"name":"hashtags","in":"query","required":false,"description":"Up to 8 hashtags.","schema":{"type":"array","maxItems":8,"items":{"type":"string"}}},{"name":"channels","in":"query","required":false,"description":"facebook / instagram / linkedin / groups / tiktok.","schema":{"type":"array","maxItems":5,"items":{"type":"string"}}},{"name":"lang","in":"query","required":false,"description":"Language code (default en).","schema":{"type":"string","maxLength":5}},{"name":"format","in":"query","required":false,"description":"image / video / carousel / text.","schema":{"type":"string","maxLength":20}},{"name":"ptype","in":"query","required":false,"description":"Post type.","schema":{"type":"string","enum":["post","story","reel"]}},{"name":"label","in":"query","required":false,"description":"Content label.","schema":{"type":"string","enum":["promo","edu","engage","bts","seasonal","other"]}},{"name":"image","in":"query","required":false,"description":"Hosted image URL.","schema":{"type":"string","maxLength":500}},{"name":"video","in":"query","required":false,"description":"Hosted video URL (reels).","schema":{"type":"string","maxLength":500}},{"name":"link","in":"query","required":false,"description":"Link to include.","schema":{"type":"string","maxLength":500}},{"name":"scheduledAt","in":"query","required":false,"description":"Intended time (ISO 8601) — stored only; schedule_social_post arms it.","schema":{"type":"string","maxLength":40}},{"name":"status","in":"query","required":false,"description":"draft (default) or pending (awaiting client approval).","schema":{"type":"string","enum":["draft","pending"]}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/social/performance":{"get":{"operationId":"get_social_performance","summary":"Aggregate social performance of published posts (reach, impressions, engagement, clicks, leads) with the best channel / format / language and top posts","description":"Aggregate social performance of published posts (reach, impressions, engagement, clicks, leads) with the best channel / format / language and top posts. Refreshes stale insights first, so it can take ~10s.\n\nRequired scope: `social.read`. Risk level: `read`.","tags":["social"],"security":[{"bearerAuth":["social.read"]}],"parameters":[{"name":"lang","in":"query","required":false,"description":"Language for the narrative fields.","schema":{"type":"string","enum":["en","he"]}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/social/generate":{"post":{"operationId":"generate_social_posts","summary":"Ask the platform's social AI (brand-aware) for post ideas: topic/source, angle, audience, objective, tone, channels, format, languages","description":"Ask the platform's social AI (brand-aware) for post ideas: topic/source, angle, audience, objective, tone, channels, format, languages. Returns generated variants — nothing is saved until you call create_social_post with the one you want. Takes 20-60s.\n\nRequired scope: `social.write`. Risk level: `write`.","tags":["social"],"security":[{"bearerAuth":["social.write"]}],"parameters":[{"name":"topic","in":"query","required":false,"description":"What the post is about (a news item, product, event…).","schema":{"type":"string","maxLength":300}},{"name":"angle","in":"query","required":false,"description":"Angle or hook.","schema":{"type":"string","maxLength":300}},{"name":"audience","in":"query","required":false,"description":"Who it is for.","schema":{"type":"string","maxLength":300}},{"name":"focus","in":"query","required":false,"description":"Product/service to focus on.","schema":{"type":"string","maxLength":300}},{"name":"objective","in":"query","required":false,"description":"awareness / leads / engagement / sales.","schema":{"type":"string","maxLength":60}},{"name":"tone","in":"query","required":false,"description":"Tone of voice.","schema":{"type":"string","maxLength":60}},{"name":"channels","in":"query","required":false,"description":"Target channels.","schema":{"type":"array","maxItems":5,"items":{"type":"string"}}},{"name":"format","in":"query","required":false,"description":"image / video / carousel / text.","schema":{"type":"string","maxLength":20}},{"name":"langs","in":"query","required":false,"description":"Languages, e.g. [\"he\",\"en\"].","schema":{"type":"array","maxItems":4,"items":{"type":"string"}}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/social/posts/{id}/update":{"post":{"operationId":"update_social_post","summary":"Edit a draft/pending/scheduled post (copy, headline, hashtags, channels, image, link, intended time…)","description":"Edit a draft/pending/scheduled post (copy, headline, hashtags, channels, image, link, intended time…). Only passed fields change; the previous content is kept as a version. Published posts cannot be edited.\n\nRequired scope: `social.write`. Risk level: `write`.","tags":["social"],"security":[{"bearerAuth":["social.write"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Post id.","schema":{"type":"string","maxLength":60}},{"name":"copy","in":"query","required":false,"description":"New text.","schema":{"type":"string","maxLength":2200}},{"name":"title","in":"query","required":false,"description":"New internal title.","schema":{"type":"string","maxLength":200}},{"name":"headline","in":"query","required":false,"description":"New headline.","schema":{"type":"string","maxLength":200}},{"name":"cta","in":"query","required":false,"description":"New call to action.","schema":{"type":"string","maxLength":60}},{"name":"hashtags","in":"query","required":false,"description":"FULL replacement hashtag list.","schema":{"type":"array","maxItems":8,"items":{"type":"string"}}},{"name":"channels","in":"query","required":false,"description":"FULL replacement channel list.","schema":{"type":"array","maxItems":5,"items":{"type":"string"}}},{"name":"lang","in":"query","required":false,"description":"Language code.","schema":{"type":"string","maxLength":5}},{"name":"format","in":"query","required":false,"description":"image / video / carousel / text.","schema":{"type":"string","maxLength":20}},{"name":"ptype","in":"query","required":false,"description":"Post type.","schema":{"type":"string","enum":["post","story","reel"]}},{"name":"label","in":"query","required":false,"description":"Content label.","schema":{"type":"string","enum":["promo","edu","engage","bts","seasonal","other"]}},{"name":"image","in":"query","required":false,"description":"Hosted image URL.","schema":{"type":"string","maxLength":500}},{"name":"video","in":"query","required":false,"description":"Hosted video URL.","schema":{"type":"string","maxLength":500}},{"name":"link","in":"query","required":false,"description":"Link.","schema":{"type":"string","maxLength":500}},{"name":"scheduledAt","in":"query","required":false,"description":"Intended time (ISO 8601), stored only.","schema":{"type":"string","maxLength":40}},{"name":"status","in":"query","required":false,"description":"draft or pending.","schema":{"type":"string","enum":["draft","pending"]}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/social/posts/{id}/status":{"post":{"operationId":"set_social_post_status","summary":"Move a post between draft, pending (client approval) and rejected","description":"Move a post between draft, pending (client approval) and rejected. Setting draft also un-schedules it. Use schedule_social_post / publish_social_post to go live.\n\nRequired scope: `social.write`. Risk level: `write`.","tags":["social"],"security":[{"bearerAuth":["social.write"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Post id.","schema":{"type":"string","maxLength":60}},{"name":"status","in":"query","required":true,"description":"Target status.","schema":{"type":"string","enum":["draft","pending","rejected"]}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/social/posts/{id}/schedule":{"post":{"operationId":"schedule_social_post","summary":"Arm a post to publish automatically at scheduledAt on its channels","description":"Arm a post to publish automatically at scheduledAt on its channels. PREVIEW FIRST: without confirm it shows the post, channels and time. If the workspace requires client approval, the post goes to pending instead.\n\nRequired scope: `social.publish`. Risk level: `high`.","tags":["social"],"security":[{"bearerAuth":["social.publish"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Post id.","schema":{"type":"string","maxLength":60}},{"name":"scheduledAt","in":"query","required":true,"description":"ISO 8601 date-time in the future.","schema":{"type":"string","maxLength":40}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/social/posts/{id}/publish":{"post":{"operationId":"publish_social_post","summary":"Publish a post NOW to the connected Facebook Page / Instagram / LinkedIn / Groups / TikTok","description":"Publish a post NOW to the connected Facebook Page / Instagram / LinkedIn / Groups / TikTok. PREVIEW FIRST: without confirm it shows exactly what goes where. Cannot be recalled by this tool.\n\nRequired scope: `social.publish`. Risk level: `high`.","tags":["social"],"security":[{"bearerAuth":["social.publish"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Post id.","schema":{"type":"string","maxLength":60}},{"name":"channels","in":"query","required":false,"description":"Override the post's channels.","schema":{"type":"array","maxItems":5,"items":{"type":"string"}}},{"name":"pageId","in":"query","required":false,"description":"Facebook Page id to publish from (default: the focused/first page).","schema":{"type":"string","maxLength":40}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/social/posts/{id}/delete":{"post":{"operationId":"delete_social_post","summary":"Remove a post from the calendar","description":"Remove a post from the calendar. PREVIEW FIRST. For a published post only the calendar record is removed — the live post stays on the network.\n\nRequired scope: `records.delete`. Risk level: `high`.","tags":["records"],"security":[{"bearerAuth":["records.delete"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Post id.","schema":{"type":"string","maxLength":60}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/coupons":{"get":{"operationId":"list_coupons","summary":"Coupons defined for the connected stores with their stats: codes issued, redeemed, attributed revenue, unused pool size (unique-code coupons), status and expiry","description":"Coupons defined for the connected stores with their stats: codes issued, redeemed, attributed revenue, unused pool size (unique-code coupons), status and expiry.\n\nRequired scope: `coupons.read`. Risk level: `read`.","tags":["coupons"],"security":[{"bearerAuth":["coupons.read"]}],"parameters":[{"name":"siteId","in":"query","required":false,"description":"Only coupons of this store (from list_stores).","schema":{"type":"string","maxLength":80}},{"name":"status","in":"query","required":false,"description":"active or paused.","schema":{"type":"string","enum":["active","paused"]}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"create_coupon","summary":"Create a coupon on a connected store (WooCommerce/Shopify): shared (one code for everyone) or unique (a pool of one-per-contact codes, usable as {{coupon","description":"Create a coupon on a connected store (WooCommerce/Shopify): shared (one code for everyone) or unique (a pool of one-per-contact codes, usable as {{coupon.NAME}} in emails/SMS). Registers the code(s) in the store. The store must already be connected for coupons in the app.\n\nRequired scope: `coupons.write`. Risk level: `write`.","tags":["coupons"],"security":[{"bearerAuth":["coupons.write"]}],"parameters":[{"name":"name","in":"query","required":true,"description":"Token name (letters/numbers/underscore), e.g. SPRING20.","schema":{"type":"string","maxLength":40}},{"name":"siteId","in":"query","required":true,"description":"Store id from list_stores.","schema":{"type":"string","maxLength":80}},{"name":"mode","in":"query","required":false,"description":"shared (default) or unique.","schema":{"type":"string","enum":["shared","unique"]}},{"name":"type","in":"query","required":false,"description":"percent (default) or fixed amount.","schema":{"type":"string","enum":["percent","fixed"]}},{"name":"value","in":"query","required":true,"description":"Discount value.","schema":{"type":"number","minimum":0.01,"maximum":100000}},{"name":"minOrder","in":"query","required":false,"description":"Minimum order total.","schema":{"type":"number","minimum":0,"maximum":1000000}},{"name":"expiresOn","in":"query","required":false,"description":"Fixed expiry date YYYY-MM-DD.","schema":{"type":"string","maxLength":10}},{"name":"validDays","in":"query","required":false,"description":"Alternatively: valid this many days after issue.","schema":{"type":"integer","minimum":1,"maximum":365}},{"name":"code","in":"query","required":false,"description":"Shared mode: the exact code (default = name).","schema":{"type":"string","maxLength":30}},{"name":"prefix","in":"query","required":false,"description":"Unique mode: code prefix.","schema":{"type":"string","maxLength":12}},{"name":"usageLimit","in":"query","required":false,"description":"Max uses per code (0 = unlimited).","schema":{"type":"integer","minimum":0,"maximum":100000}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/coupons/{id}/status":{"post":{"operationId":"set_coupon_status","summary":"Pause a coupon (stops issuing new codes; existing codes keep working in the store) or re-activate it","description":"Pause a coupon (stops issuing new codes; existing codes keep working in the store) or re-activate it.\n\nRequired scope: `coupons.write`. Risk level: `write`.","tags":["coupons"],"security":[{"bearerAuth":["coupons.write"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Coupon id.","schema":{"type":"string","maxLength":60}},{"name":"status","in":"query","required":true,"description":"active or paused.","schema":{"type":"string","enum":["active","paused"]}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/coupons/{id}/issue":{"post":{"operationId":"issue_coupon_code","summary":"Get the code for one contact: shared coupons return the shared code; unique coupons reserve a code for that email (idempotent — the same contact always gets the same code)","description":"Get the code for one contact: shared coupons return the shared code; unique coupons reserve a code for that email (idempotent — the same contact always gets the same code).\n\nRequired scope: `coupons.write`. Risk level: `write`.","tags":["coupons"],"security":[{"bearerAuth":["coupons.write"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Coupon id.","schema":{"type":"string","maxLength":60}},{"name":"email","in":"query","required":true,"description":"Contact email the code is for.","schema":{"type":"string","maxLength":160}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/coupons/{id}/delete":{"post":{"operationId":"delete_coupon","summary":"Delete a coupon definition and its unused code pool","description":"Delete a coupon definition and its unused code pool. PREVIEW FIRST. Codes already registered in the store are left untouched (so codes already in inboxes keep working).\n\nRequired scope: `records.delete`. Risk level: `high`.","tags":["records"],"security":[{"bearerAuth":["records.delete"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Coupon id.","schema":{"type":"string","maxLength":60}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/meetings/pages":{"get":{"operationId":"list_booking_pages","summary":"The user's public booking pages (/book/{slug}): title, duration, buffer, availability windows per weekday (0=Sunday), horizon and public URL","description":"The user's public booking pages (/book/{slug}): title, duration, buffer, availability windows per weekday (0=Sunday), horizon and public URL.\n\nRequired scope: `meetings.read`. Risk level: `read`.","tags":["meetings"],"security":[{"bearerAuth":["meetings.read"]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"save_booking_page","summary":"Create or update a booking page (pass an existing slug to update)","description":"Create or update a booking page (pass an existing slug to update). availability maps weekday (0=Sunday…6=Saturday) to up to 3 [from, to] windows in HH:MM, Israel time; default Sun-Thu 09:00-17:00. Returns the public /book/ URL.\n\nRequired scope: `meetings.write`. Risk level: `write`.","tags":["meetings"],"security":[{"bearerAuth":["meetings.write"]}],"parameters":[{"name":"title","in":"query","required":true,"description":"Page title, e.g. \"Intro call\".","schema":{"type":"string","maxLength":120}},{"name":"slug","in":"query","required":false,"description":"URL slug (a-z, 0-9, dashes). Default: derived from the title.","schema":{"type":"string","maxLength":60}},{"name":"description","in":"query","required":false,"description":"Shown to invitees.","schema":{"type":"string","maxLength":300}},{"name":"durationMin","in":"query","required":false,"description":"Meeting length in minutes (10-240, default 30).","schema":{"type":"integer","minimum":10,"maximum":240}},{"name":"bufferMin","in":"query","required":false,"description":"Gap after each meeting (0-120).","schema":{"type":"integer","minimum":0,"maximum":120}},{"name":"daysAhead","in":"query","required":false,"description":"How far ahead invitees may book (1-60, default 30).","schema":{"type":"integer","minimum":1,"maximum":60}},{"name":"availability","in":"query","required":false,"description":"e.g. {\"0\":[[\"09:00\",\"13:00\"]],\"1\":[[\"09:00\",\"17:00\"]]}","schema":{"type":"string"}},{"name":"active","in":"query","required":false,"description":"false hides the page without deleting it.","schema":{"type":"boolean"}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/meetings/bookings":{"get":{"operationId":"list_bookings","summary":"Meetings booked through the booking pages: who, when, for which page, status (confirmed / cancelled)","description":"Meetings booked through the booking pages: who, when, for which page, status (confirmed / cancelled). Soonest first; upcomingOnly hides past meetings.\n\nRequired scope: `meetings.read`. Risk level: `read`.","tags":["meetings"],"security":[{"bearerAuth":["meetings.read"]}],"parameters":[{"name":"status","in":"query","required":false,"description":"confirmed or cancelled.","schema":{"type":"string","enum":["confirmed","cancelled"]}},{"name":"upcomingOnly","in":"query","required":false,"description":"Only meetings in the future.","schema":{"type":"boolean","default":false}},{"name":"page","in":"query","required":false,"description":"1-based page number.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page (max 100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/meetings/bookings/{id}/cancel":{"post":{"operationId":"cancel_booking","summary":"Cancel a booked meeting and free its slot","description":"Cancel a booked meeting and free its slot. PREVIEW FIRST. The invitee is not notified automatically.\n\nRequired scope: `records.delete`. Risk level: `high`.","tags":["records"],"security":[{"bearerAuth":["records.delete"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Booking id from list_bookings.","schema":{"type":"string","maxLength":60}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/meetings/pages/{slug}/delete":{"post":{"operationId":"delete_booking_page","summary":"Delete a booking page (its public link stops working)","description":"Delete a booking page (its public link stops working). PREVIEW FIRST. Existing bookings are kept.\n\nRequired scope: `records.delete`. Risk level: `high`.","tags":["records"],"security":[{"bearerAuth":["records.delete"]}],"parameters":[{"name":"slug","in":"path","required":true,"description":"Page slug.","schema":{"type":"string","maxLength":60}},{"name":"idempotencyKey","in":"query","required":true,"description":"A unique id for THIS action (required). Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}},{"name":"confirm","in":"query","required":false,"description":"Leave false (the default) to PREVIEW: nothing changes and you get a summary plus a confirmationToken. Set true and pass that token to actually perform the action.","schema":{"type":"boolean","default":false}},{"name":"confirmationToken","in":"query","required":false,"description":"The token returned by the preview call. Required when confirm is true. It is tied to the exact arguments you previewed, is single-use, and expires after 15 minutes.","schema":{"type":"string","maxLength":80}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/automations/{id}/enabled":{"post":{"operationId":"set_automation_enabled","summary":"Enable or pause an automation (journey)","description":"Enable or pause an automation (journey). Pausing stops the live run too — no new contacts enter and in-flight steps hold — and is fully reversible by enabling again. Does not edit the flow itself; use list_automations / get_automation to pick the id.\n\nRequired scope: `agents.write`. Risk level: `write`.","tags":["agents"],"security":[{"bearerAuth":["agents.write"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Automation id.","schema":{"type":"string","maxLength":60}},{"name":"enabled","in":"query","required":true,"description":"true to enable, false to pause.","schema":{"type":"boolean"}},{"name":"idempotencyKey","in":"query","required":false,"description":"A unique id for THIS action. Repeating a call with the same key returns the original result instead of acting twice — use it so a timeout or retry cannot duplicate the write.","schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requestId":{"type":"string"}},"additionalProperties":true}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}}}}