{"openapi":"3.1.0","info":{"title":"SuprSend (BYOK) API","version":"0.1.0","description":"SuprSend (BYOK) lets an AI assistant read your own SuprSend data through the SuprSend API with a key you supply (SuprSend workspace API key). Read-only: 11 tools (list_users, get_user, list_messages, get_message_content, list_workflows, list_templates, list_events, list_tenants, list_subscriber_lists, get_subscriber_list, list_objects). The BYOK key travels with each request, is used for that one...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-suprsend.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-suprsend/docs"},"termsOfService":"https://connectorbay.com/byok-suprsend/terms"},"servers":[{"url":"https://byok-suprsend.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-suprsend/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/list_users":{"post":{"operationId":"list_users","summary":"List users (recipients) in the workspace by creation order, with ID and created and updated times; cursor-paginated. Use","description":"List users (recipients) in the workspace by creation order, with ID and created and updated times; cursor-paginated. Use for \"Which users exist in my SuprSend workspace\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":10,"description":"How many results to return (1 to 100).","title":"Limit"},"after":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor for the next page: the meta.after value of the previous answer.","title":"After"},"tenant_id":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only users associated with this tenant ID.","title":"Tenant Id"}},"title":"list_usersArguments","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_user":{"post":{"operationId":"get_user","summary":"Get one user by distinct ID: created and updated times and the custom properties stored on the profile. Use for \"What pr","description":"Get one user by distinct ID: created and updated times and the custom properties stored on the profile. Use for \"What properties are stored for user ada-42 in SuprSend\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"distinct_id":{"description":"Unique ID of the user in your system.","maxLength":200,"title":"Distinct Id","type":"string"}},"required":["distinct_id"],"title":"get_userArguments","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_messages":{"post":{"operationId":"list_messages","summary":"List messages sent through the workspace, newest first, with channel, delivery status, timestamps and failure reason; fi","description":"List messages sent through the workspace, newest first, with channel, delivery status, timestamps and failure reason; filter by channel, workflow, recipient or date. Use for \"Did any SuprSend email messages fail yesterday\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":10,"description":"How many results to return (1 to 1000, default 10).","title":"Limit"},"after":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor for the next page: the meta.after value of the previous answer.","title":"After"},"channel":{"anyOf":[{"enum":["sms","email","androidpush","iospush","webpush","inbox","whatsapp","slack","ms_teams"],"type":"string"},{"type":"null"}],"default":null,"description":"Only this delivery channel.","title":"Channel"},"workflow_slug":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only messages triggered from this workflow slug.","title":"Workflow Slug"},"created_at_gte":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only messages created at or after this RFC 3339 time, for example 2026-10-01T00:00:00Z.","title":"Created At Gte"},"created_at_lte":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only messages created at or before this RFC 3339 time.","title":"Created At Lte"},"tenant_id":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only messages of this tenant.","title":"Tenant Id"},"message_id":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only the message with this ID.","title":"Message Id"}},"title":"list_messagesArguments","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_message_content":{"post":{"operationId":"get_message_content","summary":"Get the rendered content of one sent message (channel and content body). Use for \"What did message abc123 actually say\".","description":"Get the rendered content of one sent message (channel and content body). Use for \"What did message abc123 actually say\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"message_id":{"description":"ID of the message.","maxLength":200,"title":"Message Id","type":"string"}},"required":["message_id"],"title":"get_message_contentArguments","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_workflows":{"post":{"operationId":"list_workflows","summary":"List notification workflows in a workspace with name, slug, status, category, trigger type and last execution time. Use ","description":"List notification workflows in a workspace with name, slug, status, category, trigger type and last execution time. Use for \"Which workflows are live in my SuprSend production workspace\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"workspace":{"description":"Workspace slug, for example 'production' or 'staging'.","maxLength":200,"title":"Workspace","type":"string"},"mode":{"anyOf":[{"enum":["draft","live"],"type":"string"},{"type":"null"}],"default":"draft","description":"Which version to read: draft or live.","title":"Mode"},"slugs":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Comma-separated workflow slugs to return.","title":"Slugs"},"limit":{"anyOf":[{"maximum":50,"minimum":1,"type":"integer"},{"type":"null"}],"default":10,"description":"How many results to return (1 to 50).","title":"Limit"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many results to skip before the first one.","title":"Offset"}},"required":["workspace"],"title":"list_workflowsArguments","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_templates":{"post":{"operationId":"list_templates","summary":"List notification templates in a workspace with name, slug, enabled channels, status and last triggered time. Use for \"W","description":"List notification templates in a workspace with name, slug, enabled channels, status and last triggered time. Use for \"Which notification templates do I have and on which channels\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"workspace":{"description":"Workspace slug, for example 'production' or 'staging'.","maxLength":200,"title":"Workspace","type":"string"},"mode":{"anyOf":[{"enum":["draft","live"],"type":"string"},{"type":"null"}],"default":"draft","description":"Which version to read: draft or live.","title":"Mode"},"search":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Search by template name, slug or description.","title":"Search"},"slugs":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Comma-separated template slugs to return.","title":"Slugs"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":10,"description":"How many results to return.","title":"Limit"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many results to skip before the first one.","title":"Offset"}},"required":["workspace"],"title":"list_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_events":{"post":{"operationId":"list_events","summary":"List the events that can trigger workflows, with name, description and creation time. Use for \"Which events can trigger ","description":"List the events that can trigger workflows, with name, description and creation time. Use for \"Which events can trigger notifications in SuprSend\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"workspace":{"description":"Workspace slug, for example 'production' or 'staging'.","maxLength":200,"title":"Workspace","type":"string"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":10,"description":"How many results to return.","title":"Limit"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many results to skip before the first one.","title":"Offset"}},"required":["workspace"],"title":"list_eventsArguments","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_tenants":{"post":{"operationId":"list_tenants","summary":"List tenants (brands or customer accounts) with name, timezone, blocked channels and hierarchy level. Use for \"Which ten","description":"List tenants (brands or customer accounts) with name, timezone, blocked channels and hierarchy level. Use for \"Which tenants are set up in SuprSend\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":10,"description":"How many results to return.","title":"Limit"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many tenants to skip.","title":"Offset"},"parent_id":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only direct children of this tenant ID.","title":"Parent Id"}},"title":"list_tenantsArguments","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_subscriber_lists":{"post":{"operationId":"list_subscriber_lists","summary":"List subscriber lists in the workspace (use get_subscriber_list for one list's configuration). Use for \"What subscriber ","description":"List subscriber lists in the workspace (use get_subscriber_list for one list's configuration). Use for \"What subscriber lists exist in SuprSend\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many results to return.","title":"Limit"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Start position in the list of lists.","title":"Offset"}},"title":"list_subscriber_listsArguments","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_subscriber_list":{"post":{"operationId":"get_subscriber_list","summary":"Get one subscriber list's configuration: name, type, subscriber count, source, status and sync settings. Use for \"How ma","description":"Get one subscriber list's configuration: name, type, subscriber count, source, status and sync settings. Use for \"How many subscribers are on the 'newsletter' list\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"list_id":{"description":"Unique identifier of the list.","maxLength":200,"title":"List Id","type":"string"}},"required":["list_id"],"title":"get_subscriber_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/list_objects":{"post":{"operationId":"list_objects","summary":"List objects of one type (such as teams or organizations) that users can subscribe to, with subscription counts; cursor-","description":"List objects of one type (such as teams or organizations) that users can subscribe to, with subscription counts; cursor-paginated. Use for \"Which 'teams' objects exist in SuprSend\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"object_type":{"description":"Plural object type name such as teams, organizations or roles.","maxLength":200,"title":"Object Type","type":"string"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":10,"description":"How many results to return.","title":"Limit"},"after":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor for the next page: the meta.after value of the previous answer.","title":"After"}},"required":["object_type"],"title":"list_objectsArguments","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}}}}