{"openapi":"3.1.0","info":{"title":"Omnisend (BYOK) API","version":"0.1.0","description":"Omnisend (BYOK) lets an AI assistant read your own Omnisend data through the Omnisend API with a key you supply (API key (read scopes needed)). Read-only: 9 tools (get_brand, list_contacts, get_contact, list_campaigns, get_campaign, list_automations, list_segments, get_segment_statistics, list_products). The BYOK key travels with each request, is used for that one call only and is never stored,...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-omnisend.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-omnisend/docs"},"termsOfService":"https://connectorbay.com/byok-omnisend/terms"},"servers":[{"url":"https://byok-omnisend.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-omnisend/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_brand":{"post":{"operationId":"get_brand","summary":"Show the Omnisend brand (store) the key belongs to: name, website, platform, currency and timezone. Use for \"Which Omnis","description":"Show the Omnisend brand (store) the key belongs to: name, website, platform, currency and timezone. Use for \"Which Omnisend store is my key connected to\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_brandArguments","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_contacts":{"post":{"operationId":"list_contacts","summary":"List contacts with email, name, location, subscription status and dates; filter by email, phone, status, segment or tag.","description":"List contacts with email, name, location, subscription status and dates; filter by email, phone, status, segment or tag. Pages by cursor. Use for \"Who are the newest subscribed contacts in Omnisend\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":250,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"Items per page (1 to 250, default 100).","title":"Limit"},"after":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor from the previous answer's paging.cursors.after to get the next page.","title":"After"},"sort":{"anyOf":[{"enum":["createdAt","updatedAt"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort field: createdAt (default) or updatedAt.","title":"Sort"},"direction":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort direction: asc or desc (default desc).","title":"Direction"},"email":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only the contact with this email address.","title":"Email"},"phone":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only the contact with this phone number.","title":"Phone"},"status":{"anyOf":[{"enum":["subscribed","unsubscribed","nonSubscribed"],"type":"string"},{"type":"null"}],"default":null,"description":"Only contacts with this status (cannot be combined with tag).","title":"Status"},"segment_id":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Only contacts in this segment id.","title":"Segment Id"},"tag":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only contacts with this tag (cannot be combined with status).","title":"Tag"}},"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 Omnisend id with email, name, status, location and dates. Use for \"Show Omnisend contact 65a1b2c3d4e5","description":"Get one contact by Omnisend id with email, name, status, location and dates. Use for \"Show Omnisend contact 65a1b2c3d4e5f6a7b8c9d0e1\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"contact_id":{"description":"Contact id as returned by list_contacts.","maxLength":200,"title":"Contact Id","type":"string"}},"required":["contact_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_campaigns":{"post":{"operationId":"list_campaigns","summary":"List email, SMS and push campaigns with name, channel, status, type and start and end times. Heavy content sections are ","description":"List email, SMS and push campaigns with name, channel, status, type and start and end times. Heavy content sections are left out. Pages by cursor. Use for \"Which Omnisend campaigns were sent recently\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":250,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"Items per page (1 to 250, default 100).","title":"Limit"},"after":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor from the previous answer's paging.cursors.after to get the next page.","title":"After"},"sort":{"anyOf":[{"enum":["createdAt","updatedAt","name"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort field: createdAt (default), updatedAt or name.","title":"Sort"},"direction":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort direction: asc or desc (default desc).","title":"Direction"},"name_contains":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only campaigns whose name contains this text.","title":"Name Contains"},"type":{"anyOf":[{"enum":["regular","booster","abTest"],"type":"string"},{"type":"null"}],"default":null,"description":"Only campaigns of this type.","title":"Type"},"view":{"anyOf":[{"const":"summary","type":"string"},{"type":"null"}],"default":"summary","description":"Response shape; summary (default here) omits heavy content.","title":"View"}},"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 campaign by id with name, channel, status, type, language and dates. Use for \"Show Omnisend campaign cm1\".","description":"Get one campaign by id with name, channel, status, type, language and dates. Use for \"Show Omnisend campaign cm1\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"campaign_id":{"description":"Campaign id as returned by list_campaigns.","maxLength":200,"title":"Campaign Id","type":"string"}},"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_automations":{"post":{"operationId":"list_automations","summary":"List automation workflows with name, enabled flag and dates; the block tree is left out. Pages by cursor. Use for \"Which","description":"List automation workflows with name, enabled flag and dates; the block tree is left out. Pages by cursor. Use for \"Which Omnisend automations are enabled\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":250,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"Items per page (1 to 250, default 100).","title":"Limit"},"after":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor from the previous answer's paging.cursors.after to get the next page.","title":"After"},"is_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for only enabled, false for only disabled automations.","title":"Is Enabled"},"name_contains":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only automations whose name contains this text.","title":"Name Contains"},"view":{"anyOf":[{"const":"summary","type":"string"},{"type":"null"}],"default":"summary","description":"Response shape; summary (default here) omits the block tree.","title":"View"}},"title":"list_automationsArguments","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, status and dates (1 to 50 per page, default 10). Pages by cursor. Use for \"What segments do I h","description":"List segments with name, status and dates (1 to 50 per page, default 10). Pages by cursor. Use for \"What segments do I have in Omnisend\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":50,"minimum":1,"type":"integer"},{"type":"null"}],"default":10,"description":"Segments per page (1 to 50, default 10).","title":"Limit"},"after":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor from the previous answer's paging.cursors.after to get the next page.","title":"After"},"sort":{"anyOf":[{"enum":["createdAt","name"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort field: createdAt (default) or name.","title":"Sort"},"direction":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort direction: asc or desc (default desc).","title":"Direction"}},"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/get_segment_statistics":{"post":{"operationId":"get_segment_statistics","summary":"Get the number of contacts that currently match a segment. Use for \"How many contacts are in Omnisend segment 65a1b2c3d4","description":"Get the number of contacts that currently match a segment. Use for \"How many contacts are in Omnisend segment 65a1b2c3d4e5f6a7b8c9d0e1\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"segment_id":{"description":"Segment id (24 hexadecimal characters) as returned by list_segments.","maxLength":200,"title":"Segment Id","type":"string"}},"required":["segment_id"],"title":"get_segment_statisticsArguments","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_products":{"post":{"operationId":"list_products","summary":"List catalog products with title, status, type, currency, URL and variants; filter by title. Pages by offset. Use for \"W","description":"List catalog products with title, status, type, currency, URL and variants; filter by title. Pages by offset. Use for \"Which products are in my Omnisend catalog\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"Products per page (1 to 100, default 25).","title":"Limit"},"offset":{"anyOf":[{"maximum":1000000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many products to skip.","title":"Offset"},"sort":{"anyOf":[{"enum":["date","updatedAt","createdAt"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort by date, updatedAt or createdAt.","title":"Sort"},"title_contains":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only products whose title contains this text (case-insensitive).","title":"Title Contains"}},"title":"list_productsArguments","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}}}}