{"openapi":"3.1.0","info":{"title":"Plunk (BYOK) API","version":"0.1.0","description":"Plunk (BYOK) lets an AI assistant read your own Plunk data through the Plunk API with a key you supply (secret API key (starts with sk_)). Read-only: 5 tools (list_contacts, get_contact, list_segments, list_templates, list_campaigns). The BYOK key travels with each request, is used for that one call only and is never stored, logged or cached; it is only ever sent to next-api.useplunk.com....\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-plunk.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-plunk/docs"},"termsOfService":"https://connectorbay.com/byok-plunk/terms"},"servers":[{"url":"https://byok-plunk.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-plunk/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_contacts":{"post":{"operationId":"list_contacts","summary":"List contacts with email, subscribed flag, snooze date and timestamps (custom data fields are left out). Uses a cursor: ","description":"List contacts with email, subscribed flag, snooze date and timestamps (custom data fields are left out). Uses a cursor: pass the returned cursor to get the next page. Use for \"Which Plunk contacts are unsubscribed\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"search":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Case-insensitive text to find in the email address.","title":"Search"},"subscribed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for subscribed contacts only, false for unsubscribed only.","title":"Subscribed"},"sort":{"anyOf":[{"enum":["email","createdAt"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort by email or createdAt.","title":"Sort"},"dir":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort direction.","title":"Dir"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"Items per page (1 to 100).","title":"Limit"},"cursor":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor from the previous page's answer.","title":"Cursor"}},"title":"list_contactsArguments","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_contact":{"post":{"operationId":"get_contact","summary":"Get one contact by id: email, subscribed flag, snooze date and timestamps. Use for \"Show Plunk contact c_1\".","description":"Get one contact by id: email, subscribed flag, snooze date and timestamps. Use for \"Show Plunk contact c_1\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"description":"Contact id from list_contacts.","maxLength":100,"title":"Id","type":"string"}},"required":["id"],"title":"get_contactArguments","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 segments with name, type (dynamic or static), member count and timestamps. Use for \"What Plunk segments do I have a","description":"List segments with name, type (dynamic or static), member count and timestamps. Use for \"What Plunk segments do I have and how many contacts are in each\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"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_templates":{"post":{"operationId":"list_templates","summary":"List email templates with name, subject, sender, type (transactional, marketing or headless) and timestamps. Template bo","description":"List email templates with name, subject, sender, type (transactional, marketing or headless) and timestamps. Template bodies are left out. Use for \"Which Plunk email templates do I have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"type":{"anyOf":[{"enum":["TRANSACTIONAL","MARKETING","HEADLESS"],"type":"string"},{"type":"null"}],"default":null,"description":"Only this template type.","title":"Type"},"search":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Text to find in name, description or subject.","title":"Search"},"sort":{"anyOf":[{"enum":["name","createdAt","updatedAt"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort by name, createdAt or updatedAt.","title":"Sort"},"dir":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort direction.","title":"Dir"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"page_size":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"Items per page.","title":"Page Size"}},"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_campaigns":{"post":{"operationId":"list_campaigns","summary":"List campaigns with status, audience type, schedule and send counts (recipients, delivered, opened, clicked, bounced). B","description":"List campaigns with status, audience type, schedule and send counts (recipients, delivered, opened, clicked, bounced). Bodies are left out. Use for \"How did my last Plunk campaigns perform (opens, clicks, bounces)\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"status":{"anyOf":[{"enum":["DRAFT","SCHEDULED","SENDING","SENT","CANCELLED"],"type":"string"},{"type":"null"}],"default":null,"description":"Only campaigns in this status.","title":"Status"},"search":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Text to find in name, subject or sender address.","title":"Search"},"sort":{"anyOf":[{"enum":["name","createdAt","updatedAt"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort by name, createdAt or updatedAt.","title":"Sort"},"dir":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort direction.","title":"Dir"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"page_size":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"Items per page.","title":"Page Size"}},"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}}}}