{"openapi":"3.1.0","info":{"title":"Mailshake (BYOK) API","version":"0.1.0","description":"Mailshake (BYOK) lets an AI assistant read your own Mailshake data through the Mailshake API with a key you supply (Mailshake API key). Read-only: 11 tools (get_me, list_campaigns, get_campaign, list_recipients, get_recipient, list_leads, get_lead, list_replies, list_sent_messages, list_senders, list_team_members). The BYOK key travels with each request, is used for that one call only and is...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-mailshake.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-mailshake/docs"},"termsOfService":"https://connectorbay.com/byok-mailshake/terms"},"servers":[{"url":"https://byok-mailshake.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-mailshake/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_me":{"post":{"operationId":"get_me","summary":"Show the Mailshake user the key belongs to: name, email, team name and whether the user is a team admin. Use for \"Which ","description":"Show the Mailshake user the key belongs to: name, email, team name and whether the user is a team admin. Use for \"Which Mailshake user is my API key for\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_meArguments","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_campaigns":{"post":{"operationId":"list_campaigns","summary":"List Mailshake campaigns with title, creation date and paused or archived flags. 10 quota units per call. Use for \"What ","description":"List Mailshake campaigns with title, creation date and paused or archived flags. 10 quota units per call. Use for \"What Mailshake campaigns do I have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"search":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only campaigns matching this text.","title":"Search"},"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"},"next_token":{"anyOf":[{"maxLength":2000,"type":"string"},{"type":"null"}],"default":null,"description":"The nextToken from the previous answer, to fetch the following page (null means the last page).","title":"Next Token"}},"title":"list_campaignsArguments","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_campaign":{"post":{"operationId":"get_campaign","summary":"Get one Mailshake campaign with its message sequence (initial, follow-up, drip), sender and link. Use for \"Show Mailshak","description":"Get one Mailshake campaign with its message sequence (initial, follow-up, drip), sender and link. Use for \"Show Mailshake campaign 1\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"campaign_id":{"description":"Numeric Mailshake campaign id, from list_campaigns.","maximum":999999999999,"minimum":1,"title":"Campaign Id","type":"integer"}},"required":["campaign_id"],"title":"get_campaignArguments","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_recipients":{"post":{"operationId":"list_recipients","summary":"List the recipients of a Mailshake campaign with name, email and paused flag. Filter by search text. Use for \"Who is in ","description":"List the recipients of a Mailshake campaign with name, email and paused flag. Filter by search text. Use for \"Who is in Mailshake campaign 1\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"campaign_id":{"description":"Numeric Mailshake campaign id, from list_campaigns.","maximum":999999999999,"minimum":1,"title":"Campaign Id","type":"integer"},"search":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only recipients matching this text.","title":"Search"},"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"},"next_token":{"anyOf":[{"maxLength":2000,"type":"string"},{"type":"null"}],"default":null,"description":"The nextToken from the previous answer, to fetch the following page (null means the last page).","title":"Next Token"}},"required":["campaign_id"],"title":"list_recipientsArguments","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_recipient":{"post":{"operationId":"get_recipient","summary":"Get one Mailshake recipient by recipient id, or by campaign id plus email address. Use for \"Show Mailshake recipient joh","description":"Get one Mailshake recipient by recipient id, or by campaign id plus email address. Use for \"Show Mailshake recipient john@doe.com in campaign 1\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"recipient_id":{"anyOf":[{"maximum":999999999999,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Numeric recipient id.","title":"Recipient Id"},"campaign_id":{"anyOf":[{"maximum":999999999999,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Campaign id; required when you look up by email address.","title":"Campaign Id"},"email_address":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Recipient email address (also needs campaign_id).","title":"Email Address"}},"title":"get_recipientArguments","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_leads":{"post":{"operationId":"list_leads","summary":"List Mailshake leads (recipients worth following up) with status, campaign and assignee. Filter by status, campaign, ass","description":"List Mailshake leads (recipients worth following up) with status, campaign and assignee. Filter by status, campaign, assignee or text. Use for \"Which Mailshake leads are open\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"campaign_id":{"anyOf":[{"maximum":999999999999,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only leads of this campaign id.","title":"Campaign Id"},"status":{"anyOf":[{"enum":["open","ignored","closed","lost"],"type":"string"},{"type":"null"}],"default":null,"description":"Lead status: open, ignored, closed or lost.","title":"Status"},"assigned_to_email_address":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only leads assigned to this teammate's email address.","title":"Assigned To Email Address"},"search":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only leads matching this text.","title":"Search"},"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"},"next_token":{"anyOf":[{"maxLength":2000,"type":"string"},{"type":"null"}],"default":null,"description":"The nextToken from the previous answer, to fetch the following page (null means the last page).","title":"Next Token"}},"title":"list_leadsArguments","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_lead":{"post":{"operationId":"get_lead","summary":"Get one Mailshake lead by lead id, recipient id, or campaign id plus email address. Use for \"Show the Mailshake lead joh","description":"Get one Mailshake lead by lead id, recipient id, or campaign id plus email address. Use for \"Show the Mailshake lead john@doe.com in campaign 1\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"lead_id":{"anyOf":[{"maximum":999999999999,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Numeric lead id.","title":"Lead Id"},"recipient_id":{"anyOf":[{"maximum":999999999999,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Numeric recipient id.","title":"Recipient Id"},"campaign_id":{"anyOf":[{"maximum":999999999999,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Campaign id; required when you look up by email address.","title":"Campaign Id"},"email_address":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Recipient email address (also needs campaign_id).","title":"Email Address"}},"title":"get_leadArguments","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_replies":{"post":{"operationId":"list_replies","summary":"List the most recent replies to your Mailshake emails (also bounces, out-of-office and unsubscribe notices) with recipie","description":"List the most recent replies to your Mailshake emails (also bounces, out-of-office and unsubscribe notices) with recipient, campaign, subject and plain-text body. Up to 25 per call. Use for \"What replies did my Mailshake campaigns get\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"reply_type":{"anyOf":[{"enum":["reply","bounce","out-of-office","unsubscribe","delay-notification"],"type":"string"},{"type":"null"}],"default":null,"description":"Only this kind: reply, bounce, out-of-office, unsubscribe or delay-notification.","title":"Reply Type"},"campaign_id":{"anyOf":[{"maximum":999999999999,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only replies for this campaign id.","title":"Campaign Id"},"recipient_email_address":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only this recipient (an email address, or a fragment like a domain for a fuzzy match).","title":"Recipient Email Address"},"per_page":{"anyOf":[{"maximum":25,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many replies to return (1 to 25).","title":"Per Page"},"next_token":{"anyOf":[{"maxLength":2000,"type":"string"},{"type":"null"}],"default":null,"description":"The nextToken from the previous answer, to fetch the following page (null means the last page).","title":"Next Token"}},"title":"list_repliesArguments","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_sent_messages":{"post":{"operationId":"list_sent_messages","summary":"List the most recently sent Mailshake emails with recipient, campaign, subject and send time (bodies are left out). Up t","description":"List the most recently sent Mailshake emails with recipient, campaign, subject and send time (bodies are left out). Up to 25 per call. Use for \"What emails did Mailshake send recently\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"campaign_id":{"anyOf":[{"maximum":999999999999,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only emails of this campaign id.","title":"Campaign Id"},"recipient_email_address":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only this recipient (an email address, or a fragment like a domain for a fuzzy match).","title":"Recipient Email Address"},"exclude_body":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":true,"description":"True to omit email bodies.","title":"Exclude Body"},"per_page":{"anyOf":[{"maximum":25,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many emails to return (1 to 25).","title":"Per Page"},"next_token":{"anyOf":[{"maxLength":2000,"type":"string"},{"type":"null"}],"default":null,"description":"The nextToken from the previous answer, to fetch the following page (null means the last page).","title":"Next Token"}},"title":"list_sent_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/list_senders":{"post":{"operationId":"list_senders","summary":"List the connected sender email addresses of your Mailshake team. Use for \"Which sender addresses does Mailshake use\".","description":"List the connected sender email addresses of your Mailshake team. Use for \"Which sender addresses does Mailshake use\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"search":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only senders matching this text, for example '@gmail.com'.","title":"Search"},"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"},"next_token":{"anyOf":[{"maxLength":2000,"type":"string"},{"type":"null"}],"default":null,"description":"The nextToken from the previous answer, to fetch the following page (null means the last page).","title":"Next Token"}},"title":"list_sendersArguments","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_team_members":{"post":{"operationId":"list_team_members","summary":"List the users of your Mailshake team with name, email and admin flag. Use for \"Who is on my Mailshake team\".","description":"List the users of your Mailshake team with name, email and admin flag. Use for \"Who is on my Mailshake team\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"search":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only users matching this text.","title":"Search"},"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"},"next_token":{"anyOf":[{"maxLength":2000,"type":"string"},{"type":"null"}],"default":null,"description":"The nextToken from the previous answer, to fetch the following page (null means the last page).","title":"Next Token"}},"title":"list_team_membersArguments","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}}}}