{"openapi":"3.1.0","info":{"title":"Cancelcraft API","version":"0.1.0","description":"A fully local, hand-curated general playbook for cancelling recurring subscriptions: tactics, per-category difficulty patterns and obstacles, a step-by-step checklist, notice-period and renewal-date math, an original cancellation-email generator, retention-agent tactics and responses, a chargeback last-resort guide, a documentation checklist and a glossary.\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://cancelcraft.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/cancelcraft/docs"},"termsOfService":"https://connectorbay.com/cancelcraft/terms"},"servers":[{"url":"https://cancelcraft.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/cancelcraft/docs"},"security":[{},{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/cancellation_tactics":{"post":{"operationId":"cancellation_tactics","summary":"The general tactics that apply to cancelling any recurring subscription — reading terms before you sign up,","description":"The general tactics that apply to cancelling any recurring subscription — reading terms before you sign up,\n    cancelling through the required channel, tracking notice-period deadlines, keeping documentation, handling\n    retention offers, and when a chargeback is appropriate. Pass a category for tips specific to it. Use for \"how\n    do I cancel a subscription without getting charged again\", \"tips for cancelling a gym membership\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"category":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional subscription category to sharpen the general tactics with category-specific tips.","examples":["gym_fitness","streaming_media"],"title":"Category"}},"title":"cancellation_tacticsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/category_difficulty":{"post":{"operationId":"category_difficulty","summary":"Why a category of subscription tends to be easy or hard to cancel, its typical difficulty rating, common","description":"Why a category of subscription tends to be easy or hard to cancel, its typical difficulty rating, common\n    obstacles, and category-specific tips. General patterns across the category, not any one real company. Use for\n    \"why is it so hard to cancel a gym\", \"how hard is it to cancel a timeshare\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"category":{"description":"A subscription category.","examples":["gym_fitness","timeshare_longterm","telecom_internet"],"minLength":1,"title":"Category","type":"string"}},"required":["category"],"title":"category_difficultyArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/categories_list":{"post":{"operationId":"categories_list","summary":"Every subscription category Cancelcraft covers, with its typical cancellation-difficulty rating. Use for","description":"Every subscription category Cancelcraft covers, with its typical cancellation-difficulty rating. Use for\n    \"what categories of subscriptions do you cover\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"categories_listArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/cancellation_checklist":{"post":{"operationId":"cancellation_checklist","summary":"An ordered, step-by-step checklist for cancelling a subscription cleanly — from finding the required method","description":"An ordered, step-by-step checklist for cancelling a subscription cleanly — from finding the required method\n    through confirming the charge actually stopped. Tailored with category-specific watch-outs if you give one. Use\n    for \"give me a checklist for cancelling my subscription\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"category":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional category to tailor the checklist.","title":"Category"}},"title":"cancellation_checklistArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/notice_deadline":{"post":{"operationId":"notice_deadline","summary":"The date by which you must cancel to avoid the next charge, given your next charge date and your terms'","description":"The date by which you must cancel to avoid the next charge, given your next charge date and your terms'\n    required notice period — plus how many days from today that is. Use for \"renewal is March 15 with a 30-day\n    notice period, when do I need to cancel by\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"next_charge_date":{"description":"Your next scheduled charge/renewal date, YYYY-MM-DD.","examples":["2026-03-15"],"title":"Next Charge Date","type":"string"},"notice_period_days":{"description":"The notice period your terms require, in days.","examples":[30],"maximum":365,"minimum":0,"title":"Notice Period Days","type":"integer"}},"required":["next_charge_date","notice_period_days"],"title":"notice_deadlineArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/renewal_date":{"post":{"operationId":"renewal_date","summary":"Estimates the next auto-renewal/charge date from your last charge date and billing cycle. Use for \"I was","description":"Estimates the next auto-renewal/charge date from your last charge date and billing cycle. Use for \"I was\n    last charged Jan 15 monthly, when's my next renewal\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"last_charge_date":{"description":"The date of your last charge, YYYY-MM-DD.","examples":["2026-01-15"],"title":"Last Charge Date","type":"string"},"cycle":{"description":"Billing cycle: weekly, biweekly, monthly, quarterly, semiannual, annual.","examples":["monthly"],"title":"Cycle","type":"string"}},"required":["last_charge_date","cycle"],"title":"renewal_dateArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/cancellation_script":{"post":{"operationId":"cancellation_script","summary":"Drafts an original, polite-but-firm cancellation email you can send or adapt — asking for written","description":"Drafts an original, polite-but-firm cancellation email you can send or adapt — asking for written\n    confirmation, an effective date and a confirmation number, with extra questions added for categories where\n    equipment returns or refunds are common. Use for \"write me a cancellation email for my gym\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"category":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional category, to add category-specific follow-up questions.","title":"Category"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional reason to include.","title":"Reason"},"service_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"The name of your own service/subscription to fill in.","title":"Service Name"}},"title":"cancellation_scriptArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/retention_tactics":{"post":{"operationId":"retention_tactics","summary":"Common tactics retention agents use to keep you subscribed (discount offers, downgrade pitches, pause","description":"Common tactics retention agents use to keep you subscribed (discount offers, downgrade pitches, pause\n    offers, repeated transfers, guilt or urgency appeals) and a suggested way to respond to each. Use for \"what\n    tricks might a retention agent try on me\", \"how do I handle a cancellation call\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"retention_tacticsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/chargeback_guide":{"post":{"operationId":"chargeback_guide","summary":"When a card chargeback is an appropriate last resort for a subscription dispute versus when to avoid one,","description":"When a card chargeback is an appropriate last resort for a subscription dispute versus when to avoid one,\n    and the typical dispute process and its cautions. Use for \"should I do a chargeback for this subscription\n    charge\", \"how does a chargeback work\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"chargeback_guideArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/documentation_checklist":{"post":{"operationId":"documentation_checklist","summary":"What to save every time you cancel a subscription — confirmation numbers, dates, screenshots, equipment","description":"What to save every time you cancel a subscription — confirmation numbers, dates, screenshots, equipment\n    return receipts — so you have proof if a charge shows up afterward. Use for \"what should I keep as proof when\n    I cancel something\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"documentation_checklistArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/glossary":{"post":{"operationId":"glossary","summary":"Definitions of common cancellation/billing terms — auto-renewal, negative option billing, notice period,","description":"Definitions of common cancellation/billing terms — auto-renewal, negative option billing, notice period,\n    grace period, evergreen clause, rescission period, chargeback, retention offer, short-rate cancellation,\n    click-to-cancel. Use for \"what does evergreen clause mean\", \"what's a rescission period\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"term":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"A specific term to look up; omit to list all.","title":"Term"}},"title":"glossaryArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}