{"openapi":"3.1.0","info":{"title":"Kit Insights (BYOK) API","version":"0.1.0","description":"Kit Insights (BYOK) lets an AI assistant read your own Kit Insights data through the Kit Insights API with a key you supply (v4 API key). Read-only: 10 tools (get_growth_stats, get_email_stats, list_broadcast_stats, get_broadcast_stats, list_broadcast_link_clicks, list_segments, list_email_templates, list_snippets, list_posts, list_webhook_endpoints). The BYOK key travels with each request, is...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-kit-insights.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-kit-insights/docs"},"termsOfService":"https://connectorbay.com/byok-kit-insights/terms"},"servers":[{"url":"https://byok-kit-insights.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-kit-insights/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/get_growth_stats":{"post":{"operationId":"get_growth_stats","summary":"Get subscriber growth for a period: total subscribers, new subscribers, cancellations and net new. Defaults to the last ","description":"Get subscriber growth for a period: total subscribers, new subscribers, cancellations and net new. Defaults to the last 90 days. Use for \"How many net new subscribers did my Kit account gain in the last 90 days\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"starting":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Start of the period, yyyy-mm-dd (default 90 days ago).","title":"Starting"},"ending":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"End of the period, yyyy-mm-dd (default today).","title":"Ending"}},"title":"get_growth_statsArguments","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/get_email_stats":{"post":{"operationId":"get_email_stats","summary":"Get account-level email performance for the last 90 days: emails sent, opened and clicked with open, click, unsubscribe ","description":"Get account-level email performance for the last 90 days: emails sent, opened and clicked with open, click, unsubscribe and bounce rates. Use for \"What are my Kit open and click rates over the last 90 days\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_email_statsArguments","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/list_broadcast_stats":{"post":{"operationId":"list_broadcast_stats","summary":"List delivery and engagement statistics for many broadcasts at once (recipients, opens, clicks, unsubscribes, status, pr","description":"List delivery and engagement statistics for many broadcasts at once (recipients, opens, clicks, unsubscribes, status, progress) with subject and send time. Use for \"How did my latest Kit broadcasts perform\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"per_page":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 100).","title":"Per Page"},"after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: pass pagination.end_cursor from the previous answer to get the next page (leave empty for the first page).","title":"After"},"status":{"anyOf":[{"enum":["draft","scheduled","sending","completed","aborted"],"type":"string"},{"type":"null"}],"default":null,"description":"Only broadcasts in this state: draft, scheduled, sending, completed or aborted.","title":"Status"},"sent_after":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only broadcasts sent after this ISO 8601 time.","title":"Sent After"},"sent_before":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only broadcasts sent before this ISO 8601 time.","title":"Sent Before"}},"title":"list_broadcast_statsArguments","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/get_broadcast_stats":{"post":{"operationId":"get_broadcast_stats","summary":"Get delivery and engagement statistics for one broadcast. Use for \"How did Kit broadcast 9 do\".","description":"Get delivery and engagement statistics for one broadcast. Use for \"How did Kit broadcast 9 do\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"broadcast_id":{"description":"The broadcast id.","minimum":1,"title":"Broadcast Id","type":"integer"}},"required":["broadcast_id"],"title":"get_broadcast_statsArguments","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/list_broadcast_link_clicks":{"post":{"operationId":"list_broadcast_link_clicks","summary":"List the links clicked in one broadcast with unique clicks and click-to-delivery and click-to-open rates. Use for \"Which","description":"List the links clicked in one broadcast with unique clicks and click-to-delivery and click-to-open rates. Use for \"Which links were clicked most in Kit broadcast 9\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"broadcast_id":{"description":"The broadcast id.","minimum":1,"title":"Broadcast Id","type":"integer"},"per_page":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 100).","title":"Per Page"},"after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: pass pagination.end_cursor from the previous answer to get the next page (leave empty for the first page).","title":"After"}},"required":["broadcast_id"],"title":"list_broadcast_link_clicksArguments","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/list_segments":{"post":{"operationId":"list_segments","summary":"List saved segments with id, name and creation date (members are not returned). Use for \"Which segments do I have in Kit","description":"List saved segments with id, name and creation date (members are not returned). Use for \"Which segments do I have in Kit\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"per_page":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 100).","title":"Per Page"},"after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: pass pagination.end_cursor from the previous answer to get the next page (leave empty for the first page).","title":"After"}},"title":"list_segmentsArguments","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/list_email_templates":{"post":{"operationId":"list_email_templates","summary":"List email templates with id, name, category and default flag. Use for \"Which email templates does my Kit account have\".","description":"List email templates with id, name, category and default flag. Use for \"Which email templates does my Kit account have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"per_page":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 100).","title":"Per Page"},"after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: pass pagination.end_cursor from the previous answer to get the next page (leave empty for the first page).","title":"After"}},"title":"list_email_templatesArguments","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/list_snippets":{"post":{"operationId":"list_snippets","summary":"List reusable snippets with id, name, type (inline or block), key and archived flag. Snippet content is not requested. U","description":"List reusable snippets with id, name, type (inline or block), key and archived flag. Snippet content is not requested. Use for \"Which reusable snippets are defined in Kit\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"per_page":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 100).","title":"Per Page"},"after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: pass pagination.end_cursor from the previous answer to get the next page (leave empty for the first page).","title":"After"},"snippet_type":{"anyOf":[{"enum":["inline","block"],"type":"string"},{"type":"null"}],"default":null,"description":"Only snippets of this type: inline or block.","title":"Snippet Type"},"archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to list only archived snippets.","title":"Archived"}},"title":"list_snippetsArguments","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/list_posts":{"post":{"operationId":"list_posts","summary":"List posts published from the account with title, slug, status, publish and send dates, paid flag and public URL. Post c","description":"List posts published from the account with title, slug, status, publish and send dates, paid flag and public URL. Post content is not requested. Use for \"Which posts have I published in Kit\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"per_page":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 100).","title":"Per Page"},"after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: pass pagination.end_cursor from the previous answer to get the next page (leave empty for the first page).","title":"After"}},"title":"list_postsArguments","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/list_webhook_endpoints":{"post":{"operationId":"list_webhook_endpoints","summary":"List webhook endpoints with name, subscribed events, status (active or disabled), source and creation date. Target URLs ","description":"List webhook endpoints with name, subscribed events, status (active or disabled), source and creation date. Target URLs and signing secrets are not returned. Use for \"Which Kit webhook endpoints are active\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"per_page":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 100).","title":"Per Page"},"after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: pass pagination.end_cursor from the previous answer to get the next page (leave empty for the first page).","title":"After"},"status":{"anyOf":[{"enum":["active","disabled"],"type":"string"},{"type":"null"}],"default":null,"description":"Only endpoints with this status: active or disabled.","title":"Status"}},"title":"list_webhook_endpointsArguments","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}}}}