{"openapi":"3.1.0","info":{"title":"AffiliateSpy API","version":"1.1.0","description":"Creator and affiliate recruitment for apps and websites: find the creators and sites already selling your competitors, with receipts, then recruit them. This REST surface mirrors the MCP server one to one; the same API key works for both. Contact values are hidden until revealed (one monthly credit each). Nothing here can exceed what the account's dashboard allows: plan caps, the reveal meter and send guardrails are enforced server-side."},"servers":[{"url":"https://www.affiliatespy.io"}],"x-mcp":{"endpoint":"https://www.affiliatespy.io/api/mcp","transport":"streamable-http","auth":"Authorization: Bearer asp_live_…","docs":"https://www.affiliatespy.io/docs","llms":"https://www.affiliatespy.io/llms.txt"},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"asp_live_…","description":"Per-user API key from https://www.affiliatespy.io/dashboard/settings?tab=api. Included on every paid plan."}}},"tags":[{"name":"default","description":"Always available with a valid key."},{"name":"guarded","description":"Launch, send and scan verbs. Off by default; the account enables Unrestricted MCP to allow them."}],"paths":{"/api/v1/tools":{"get":{"operationId":"listTools","summary":"List every tool with its argument schema and whether it is guarded.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Tool catalog","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/v1/tools/get_account":{"post":{"operationId":"get_account","summary":"Get account","description":"Your AffiliateSpy plan and usage: plan name, caps, contact reveals used/left this month (resets on the 1st, UTC), and tracked apps used vs cap.","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/list_apps":{"post":{"operationId":"list_apps","summary":"List tracked apps","description":"Apps you track, with creator counts and the latest scan status per app. Use an app's id as app_id in other tools.","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/get_scan_status":{"post":{"operationId":"get_scan_status","summary":"Get scan status","description":"Latest scan run for an app (stages, status, creators found). Starting scans: start_quick_scan (free preview, no plan needed) or start_scan (guarded, plan required).","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"app_id":{"description":"Omit to use your most recently added app.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/list_creators":{"post":{"operationId":"list_creators","summary":"List creators","description":"Graded creators for an app, sanitized: contact VALUES are hidden until revealed with reveal_contact (revealed emails are included). Sorted by score descending unless `sort` is set. Paginate with limit/offset; response includes total after filters.","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"app_id":{"description":"App to list creators for. Omit to use your most recently added app (see list_apps).","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"platform":{"type":"string","enum":["tiktok","youtube","instagram"]},"min_score":{"description":"Minimum quality score, 0-100.","type":"number","minimum":0,"maximum":100},"proven_partner":{"description":"Only creators with proof of a paid competitor partnership.","type":"boolean"},"has_contact":{"description":"Only creators with an email on file (value hidden until revealed).","type":"boolean"},"saved":{"description":"Only creators you saved.","type":"boolean"},"search":{"description":"Substring match on handle, name, or bio.","type":"string","maxLength":100},"sort":{"description":"Default: score.","type":"string","enum":["score","followers","avg_views"]},"limit":{"description":"Default 50, max 100.","type":"integer","minimum":1,"maximum":100},"offset":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/get_creator":{"post":{"operationId":"get_creator","summary":"Get creator detail","description":"Full detail for one creator: grade reasoning, evidence receipts, recent posts metadata, cross-platform profiles, monetization signals. Contact value stays hidden unless already revealed.","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"creator_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"An id from list_creators."}},"required":["creator_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/reveal_contact":{"post":{"operationId":"reveal_contact","summary":"Reveal contact","description":"Spend ONE monthly reveal to get a creator's contact value (email / IG handle / bio link). Idempotent: re-revealing an already-revealed creator returns the same value without spending again. Errors: no_subscription, cap_reached, no_contact.","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"creator_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"An id from list_creators."}},"required":["creator_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/list_websites":{"post":{"operationId":"list_websites","summary":"List website placements","description":"Roundup articles and videos ranking for your keywords ('best X apps' style), with SERP position, competitors featured, and whether YOUR app is featured.","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"featuring_rival":{"description":"Only placements featuring at least one competitor.","type":"boolean"},"missing_you":{"description":"Only placements that do NOT feature your app (outreach targets).","type":"boolean"},"keyword":{"description":"Filter by the SERP keyword.","type":"string","maxLength":100},"limit":{"description":"Default 100.","type":"integer","minimum":1,"maximum":300}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/list_competitors":{"post":{"operationId":"list_competitors","summary":"List competitors","description":"Your competitors with roster counts: how many creators are proven paid partners of each, how many mention each, plus creators promoting 2+ brands in your niche.","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/list_keywords":{"post":{"operationId":"list_keywords","summary":"List tracked keywords","description":"Search keywords we track for your app, plus per-keyword roundup coverage (how many roundups, how many feature a competitor, whether any feature you).","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/save_creator":{"post":{"operationId":"save_creator","summary":"Save creator","description":"Add a creator to your saved list (the shortlist campaigns draw from).","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"creator_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["creator_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/unsave_creator":{"post":{"operationId":"unsave_creator","summary":"Unsave creator","description":"Remove a creator from your saved list.","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"creator_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["creator_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/set_creator_note":{"post":{"operationId":"set_creator_note","summary":"Set creator note","description":"Attach or replace your private note on a creator (max 4000 chars). Empty string clears it.","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"creator_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"note":{"type":"string","maxLength":4000}},"required":["creator_id","note"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/list_campaigns":{"post":{"operationId":"list_campaigns","summary":"List campaigns","description":"Your outreach campaigns with stats (sent, replies, queued, signed). v1 tools can only create DRAFTS, launching, pausing and sending happen in the dashboard at https://affiliatespy.io/dashboard/campaigns.","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/get_campaign":{"post":{"operationId":"get_campaign","summary":"Get campaign","description":"One campaign's settings, sequence templates, enrollment rows and latest reply previews.","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"campaign_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["campaign_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/create_campaign_draft":{"post":{"operationId":"create_campaign_draft","summary":"Create campaign draft","description":"Create a DRAFT outreach campaign from creator ids (or your saved list) with the default 4-step sequence. DRAFT ONLY, this tool cannot launch, enroll, or send. Review and launch in the dashboard at https://affiliatespy.io/dashboard/campaigns.","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"creator_ids":{"description":"Audience creator ids from list_creators. Omit with use_saved=true to use your saved list.","maxItems":500,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"use_saved":{"description":"Use your saved creators as the audience.","type":"boolean"},"offer":{"description":"The offer line, e.g. \"30% recurring\". Default empty.","type":"string","maxLength":120},"followup_gaps_days":{"description":"Follow-up day offsets, default [3,7,12].","maxItems":3,"type":"array","items":{"type":"integer","minimum":1,"maximum":60}}},"required":["name"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/list_inbox_threads":{"post":{"operationId":"list_inbox_threads","summary":"List inbox threads","description":"Outreach conversation threads (metadata + last activity; message bodies via get_thread). Replying happens in the dashboard, no tool can send email.","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"unread_only":{"type":"boolean"},"limit":{"description":"Default 50.","type":"integer","minimum":1,"maximum":200}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/get_thread":{"post":{"operationId":"get_thread","summary":"Get thread","description":"One inbox thread with full message bodies. To reply, use the dashboard inbox at https://affiliatespy.io/dashboard/inbox, no tool can send email.","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"enrollment_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"An enrollment_id from list_inbox_threads."}},"required":["enrollment_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/list_deals":{"post":{"operationId":"list_deals","summary":"List deals","description":"Your pipeline: deals by stage (contacted → negotiating → contract → live → paid) plus replied creators not yet in the pipeline.","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/move_deal_stage":{"post":{"operationId":"move_deal_stage","summary":"Move deal stage","description":"Move a pipeline deal to a new stage.","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"deal_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"A deal id from list_deals."},"stage":{"type":"string","enum":["contacted","negotiating","contract","live","paid"]}},"required":["deal_id","stage"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/export_creators_csv":{"post":{"operationId":"export_creators_csv","summary":"Export creators CSV","description":"CSV of your creator list (same filters as list_creators). Paid feature, requires an active subscription, same gate as the dashboard export. Emails appear ONLY for creators you have revealed.","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"app_id":{"description":"App to list creators for. Omit to use your most recently added app (see list_apps).","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"platform":{"type":"string","enum":["tiktok","youtube","instagram"]},"min_score":{"description":"Minimum quality score, 0-100.","type":"number","minimum":0,"maximum":100},"proven_partner":{"description":"Only creators with proof of a paid competitor partnership.","type":"boolean"},"has_contact":{"description":"Only creators with an email on file (value hidden until revealed).","type":"boolean"},"saved":{"description":"Only creators you saved.","type":"boolean"},"search":{"description":"Substring match on handle, name, or bio.","type":"string","maxLength":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/launch_campaign":{"post":{"operationId":"launch_campaign","summary":"Launch campaign","description":"Launch a DRAFT campaign: enrolls only creators with a REVEALED email (others reported as excluded) and sets it active, the engine then sends on its own schedule, window and daily cap. Guarded: without approval_token it returns {error:\"approval_required\", approval_token, summary} for the user to confirm; call again with the token. Every dashboard guardrail still applies: this is exactly what a user clicking the dashboard could do, no more. GUARDED: requires the account's Unrestricted MCP setting; returns 403 {error:'restricted'} otherwise.","tags":["guarded"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"campaign_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"approval_token":{"description":"Approval token from a previous approval_required response, after the user said yes.","type":"string"}},"required":["campaign_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/pause_campaign":{"post":{"operationId":"pause_campaign","summary":"Pause campaign","description":"Pause an active campaign (stops future sends; nothing is deleted). Guarded: without approval_token it returns {error:\"approval_required\", approval_token, summary} for the user to confirm; call again with the token. Every dashboard guardrail still applies: this is exactly what a user clicking the dashboard could do, no more. GUARDED: requires the account's Unrestricted MCP setting; returns 403 {error:'restricted'} otherwise.","tags":["guarded"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"campaign_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"approval_token":{"description":"Approval token from a previous approval_required response, after the user said yes.","type":"string"}},"required":["campaign_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/resume_campaign":{"post":{"operationId":"resume_campaign","summary":"Resume campaign","description":"Resume a paused campaign (sends continue under the engine's window and caps). Guarded: without approval_token it returns {error:\"approval_required\", approval_token, summary} for the user to confirm; call again with the token. Every dashboard guardrail still applies: this is exactly what a user clicking the dashboard could do, no more. GUARDED: requires the account's Unrestricted MCP setting; returns 403 {error:'restricted'} otherwise.","tags":["guarded"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"campaign_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"approval_token":{"description":"Approval token from a previous approval_required response, after the user said yes.","type":"string"}},"required":["campaign_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/send_reply":{"post":{"operationId":"send_reply","summary":"Send reply","description":"Send an email reply in an inbox thread, the SAME gated path as the dashboard composer: subscription, daily send cap, Gmail connection and the OUTREACH_TEST_MODE redirect are all enforced inside the send function. Guarded: without approval_token it returns {error:\"approval_required\", approval_token, summary} for the user to confirm; call again with the token. Every dashboard guardrail still applies: this is exactly what a user clicking the dashboard could do, no more. GUARDED: requires the account's Unrestricted MCP setting; returns 403 {error:'restricted'} otherwise.","tags":["guarded"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"enrollment_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"An enrollment_id from list_inbox_threads."},"body":{"type":"string","minLength":1,"maxLength":10000,"description":"Plain-text reply body."},"approval_token":{"description":"Approval token from a previous approval_required response, after the user said yes.","type":"string"}},"required":["enrollment_id","body"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/start_scan":{"post":{"operationId":"start_scan","summary":"Start scan","description":"Start a creator scan for an app (spends scan credits). Same gates as the dashboard: active subscription required, and a queued/running scan for the app refuses with scan_in_progress. Guarded: without approval_token it returns {error:\"approval_required\", approval_token, summary} for the user to confirm; call again with the token. Every dashboard guardrail still applies: this is exactly what a user clicking the dashboard could do, no more. GUARDED: requires the account's Unrestricted MCP setting; returns 403 {error:'restricted'} otherwise.","tags":["guarded"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"app_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"An app id from list_apps."},"type":{"type":"string","enum":["quick","full"],"description":"quick = fast pass; full = complete scan."},"approval_token":{"description":"Approval token from a previous approval_required response, after the user said yes.","type":"string"}},"required":["app_id","type"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/get_autopilot":{"post":{"operationId":"get_autopilot","summary":"Get autopilot state","description":"The Discovery Autopilot's state: on/off, the commission offer it may promise, today's send count vs cap, the approval queue (campaign launches and reply drafts waiting for a human), and recent approved/rejected activity. Read-only.","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/set_autopilot":{"post":{"operationId":"set_autopilot","summary":"Configure autopilot","description":"Turn the Discovery Autopilot on or off, and/or set the commission offer it may promise in drafts. Turning it on starts the hourly proposal loop; even then NOTHING sends without an approval. Guarded: without approval_token it returns {error:\"approval_required\", approval_token, summary} for the user to confirm; call again with the token. Every dashboard guardrail still applies: this is exactly what a user clicking the dashboard could do, no more. GUARDED: requires the account's Unrestricted MCP setting; returns 403 {error:'restricted'} otherwise.","tags":["guarded"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"description":"Omit to leave unchanged.","type":"string","enum":["on","off"]},"offer":{"description":"The commission offer drafts may promise, e.g. \"30% recurring\". Omit to leave unchanged.","type":"string","maxLength":120},"approval_token":{"description":"Approval token from a previous approval_required response, after the user said yes.","type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/approve_autopilot_action":{"post":{"operationId":"approve_autopilot_action","summary":"Approve autopilot action","description":"Approve a queued autopilot action and EXECUTE it: a reply draft is sent, a campaign proposal reveals missing contacts (metered) and launches. Same gated paths as the dashboard's approve button. Guarded: without approval_token it returns {error:\"approval_required\", approval_token, summary} for the user to confirm; call again with the token. Every dashboard guardrail still applies: this is exactly what a user clicking the dashboard could do, no more. GUARDED: requires the account's Unrestricted MCP setting; returns 403 {error:'restricted'} otherwise.","tags":["guarded"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"action_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"An id from get_autopilot's queue."},"approval_token":{"description":"Approval token from a previous approval_required response, after the user said yes.","type":"string"}},"required":["action_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/reject_autopilot_action":{"post":{"operationId":"reject_autopilot_action","summary":"Reject autopilot action","description":"Reject a queued autopilot action with a reason. The reason is fed back into the drafter's prompt, so a specific reason improves future drafts. Guarded: without approval_token it returns {error:\"approval_required\", approval_token, summary} for the user to confirm; call again with the token. Every dashboard guardrail still applies: this is exactly what a user clicking the dashboard could do, no more. GUARDED: requires the account's Unrestricted MCP setting; returns 403 {error:'restricted'} otherwise.","tags":["guarded"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"action_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"An id from get_autopilot's queue."},"reason":{"type":"string","maxLength":500,"description":"Why this draft is wrong, specific and actionable."},"approval_token":{"description":"Approval token from a previous approval_required response, after the user said yes.","type":"string"}},"required":["action_id","reason"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/start_quick_scan":{"post":{"operationId":"start_quick_scan","summary":"Start quick scan (free preview)","description":"Free ~30 second quick scan of an App Store, Google Play or website URL: creates the tracked app and queues the scan. No plan needed (one quick-scan app per unpaid account, 6 an hour). Then poll get_quick_scan_preview. Takes 20 to 60 seconds to return because the intake (competitors, search queries) runs first.","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","minLength":4,"maxLength":500,"description":"App Store URL, Google Play URL, app name, or website domain."},"kind":{"description":"Default app.","type":"string","enum":["app","website"]},"market":{"description":"Market label such as \"United States\"; defaults to US.","type":"string","maxLength":60}},"required":["url"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/get_quick_scan_preview":{"post":{"operationId":"get_quick_scan_preview","summary":"Get quick scan preview","description":"Progress and locked preview rows for a quick scan (platform, followers, a hint like '★ <competitor> partner', masked handle; no real handles or contacts). Use it to show the user what a paid plan unlocks, then get_checkout_link.","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"run_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"run_id from start_quick_scan or get_scan_status."}},"required":["run_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}},"/api/v1/tools/get_checkout_link":{"post":{"operationId":"get_checkout_link","summary":"Get checkout link","description":"Stripe Checkout URL for a plan (starter $99, growth $299, agency $799 a month; yearly = two months free). The USER opens it and pays in the browser; never enter payment details yourself. On an active Stripe subscription the plan is switched in place (prorated) and a settings URL is returned instead. Access is granted by the payment webhook, so call get_account afterwards.","tags":["default"],"security":[{"apiKey":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"plan":{"description":"Default starter.","type":"string","enum":["starter","growth","agency"]},"interval":{"description":"Default monthly.","type":"string","enum":["monthly","yearly"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"The tool's JSON result (same payload the MCP tool returns).","content":{"application/json":{"schema":{}}}},"400":{"description":"Arguments failed validation; body lists the issues."},"401":{"description":"Missing or invalid API key."},"403":{"description":"Guarded tool with Unrestricted MCP off."},"429":{"description":"Rate limited (60 requests per minute per key)."}}}}}}