{"openapi":"3.1.0","info":{"title":"Sapo Web (BYOK) API","version":"0.1.0","description":"Sapo Web (BYOK) lets an AI assistant read your own Sapo Web data through the Sapo Web API with a key you supply (Sapo private app API key). Read-only: 9 tools (get_store, list_custom_collections, list_smart_collections, list_product_variants, list_price_rules, list_discount_codes, list_redirects, list_carrier_services, list_blogs). The BYOK key travels with each request, is used for that one call...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-sapo-web.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-sapo-web/docs"},"termsOfService":"https://connectorbay.com/byok-sapo-web/terms"},"servers":[{"url":"https://byok-sapo-web.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-sapo-web/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_store":{"post":{"operationId":"get_store","summary":"Show the Sapo Web store settings: shop id, name, main domain, currency, country, timezone, plan and whether it has a sto","description":"Show the Sapo Web store settings: shop id, name, main domain, currency, country, timezone, plan and whether it has a storefront. Owner name and contact details are left out. Use for \"Which Sapo store is my key connected to and what plan is it on\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"store":{"description":"Your Sapo Web store subdomain: the part before .mysapo.net in your store's admin address, for example 'mystore'.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Store","type":"string"}},"required":["store"],"title":"get_storeArguments","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_custom_collections":{"post":{"operationId":"list_custom_collections","summary":"List manually curated product collections with alias, name, description, publication state and sort order. Filter by nam","description":"List manually curated product collections with alias, name, description, publication state and sort order. Filter by name, alias, product or date. Use for \"Which product collections does my Sapo store have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"store":{"description":"Your Sapo Web store subdomain: the part before .mysapo.net in your store's admin address, for example 'mystore'.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Store","type":"string"},"limit":{"anyOf":[{"maximum":250,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 250; the store default is 50).","title":"Limit"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"since_id":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Only records with an id greater than this.","title":"Since Id"},"name":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"default":null,"description":"Only collections with exactly this title.","title":"Name"},"alias":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"default":null,"description":"Only the collection with this alias.","title":"Alias"},"product_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only collections that contain this product id.","title":"Product Id"},"modified_on_min":{"anyOf":[{"maxLength":16,"type":"string"},{"type":"null"}],"default":null,"description":"Only records modified after this time, format YYYY-MM-DD HH:MM (for example 2026-01-31 03:00).","title":"Modified On Min"},"modified_on_max":{"anyOf":[{"maxLength":16,"type":"string"},{"type":"null"}],"default":null,"description":"Only records modified before this time, format YYYY-MM-DD HH:MM.","title":"Modified On Max"},"published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for published collections only, false for unpublished only.","title":"Published"}},"required":["store"],"title":"list_custom_collectionsArguments","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_smart_collections":{"post":{"operationId":"list_smart_collections","summary":"List rule-based product collections with alias, name, publication state, sort order and the rules that decide which prod","description":"List rule-based product collections with alias, name, publication state, sort order and the rules that decide which products belong. Use for \"Which automatic collections and rules are set up in my Sapo store\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"store":{"description":"Your Sapo Web store subdomain: the part before .mysapo.net in your store's admin address, for example 'mystore'.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Store","type":"string"},"limit":{"anyOf":[{"maximum":250,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 250; the store default is 50).","title":"Limit"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"since_id":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Only records with an id greater than this.","title":"Since Id"},"name":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"default":null,"description":"Only collections with exactly this title.","title":"Name"},"alias":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"default":null,"description":"Only the collection with this alias.","title":"Alias"},"product_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only collections that contain this product id.","title":"Product Id"},"modified_on_min":{"anyOf":[{"maxLength":16,"type":"string"},{"type":"null"}],"default":null,"description":"Only records modified after this time, format YYYY-MM-DD HH:MM (for example 2026-01-31 03:00).","title":"Modified On Min"},"modified_on_max":{"anyOf":[{"maxLength":16,"type":"string"},{"type":"null"}],"default":null,"description":"Only records modified before this time, format YYYY-MM-DD HH:MM.","title":"Modified On Max"},"published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for published collections only, false for unpublished only.","title":"Published"}},"required":["store"],"title":"list_smart_collectionsArguments","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_product_variants":{"post":{"operationId":"list_product_variants","summary":"List the variants of one product with title, SKU, barcode, price, compare-at price, weight and stock quantity. Use for \"","description":"List the variants of one product with title, SKU, barcode, price, compare-at price, weight and stock quantity. Use for \"What variants, prices and stock does Sapo product 632910392 have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"store":{"description":"Your Sapo Web store subdomain: the part before .mysapo.net in your store's admin address, for example 'mystore'.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Store","type":"string"},"product_id":{"description":"Sapo product id.","minimum":1,"title":"Product Id","type":"integer"},"limit":{"anyOf":[{"maximum":250,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 250; the store default is 50).","title":"Limit"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"since_id":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Only records with an id greater than this.","title":"Since Id"}},"required":["store","product_id"],"title":"list_product_variantsArguments","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_price_rules":{"post":{"operationId":"list_price_rules","summary":"List discount rules (price rules) with value type and amount, target, usage limit, validity dates and title. Use for \"Wh","description":"List discount rules (price rules) with value type and amount, target, usage limit, validity dates and title. Use for \"Which discount rules are active in my Sapo store\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"store":{"description":"Your Sapo Web store subdomain: the part before .mysapo.net in your store's admin address, for example 'mystore'.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Store","type":"string"},"limit":{"anyOf":[{"maximum":250,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 250; the store default is 50).","title":"Limit"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"starts_on_min":{"anyOf":[{"maxLength":16,"type":"string"},{"type":"null"}],"default":null,"description":"Only rules that start after this time, format YYYY-MM-DD HH:MM.","title":"Starts On Min"},"ends_on_max":{"anyOf":[{"maxLength":16,"type":"string"},{"type":"null"}],"default":null,"description":"Only rules that end before this time, format YYYY-MM-DD HH:MM.","title":"Ends On Max"},"times_used":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Only rules used this many times.","title":"Times Used"}},"required":["store"],"title":"list_price_rulesArguments","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_discount_codes":{"post":{"operationId":"list_discount_codes","summary":"List the discount codes that belong to one price rule with how many times each was used. Use for \"Which discount codes e","description":"List the discount codes that belong to one price rule with how many times each was used. Use for \"Which discount codes exist for Sapo price rule 507328175\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"store":{"description":"Your Sapo Web store subdomain: the part before .mysapo.net in your store's admin address, for example 'mystore'.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Store","type":"string"},"price_rule_id":{"description":"Id of the price rule (from list_price_rules).","minimum":1,"title":"Price Rule Id","type":"integer"}},"required":["store","price_rule_id"],"title":"list_discount_codesArguments","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_redirects":{"post":{"operationId":"list_redirects","summary":"List URL redirects of the storefront with source path and target path; filter by path or target. Use for \"Which URL redi","description":"List URL redirects of the storefront with source path and target path; filter by path or target. Use for \"Which URL redirects are set up in my Sapo store\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"store":{"description":"Your Sapo Web store subdomain: the part before .mysapo.net in your store's admin address, for example 'mystore'.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Store","type":"string"},"limit":{"anyOf":[{"maximum":250,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 250; the store default is 50).","title":"Limit"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"since_id":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Only records with an id greater than this.","title":"Since Id"},"path":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"default":null,"description":"Only redirects with exactly this source path.","title":"Path"},"target":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"default":null,"description":"Only redirects pointing to exactly this target.","title":"Target"}},"required":["store"],"title":"list_redirectsArguments","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_carrier_services":{"post":{"operationId":"list_carrier_services","summary":"List the external shipping rate providers (carrier services) registered in the store with name, type and whether they ar","description":"List the external shipping rate providers (carrier services) registered in the store with name, type and whether they are active. The callback URL is left out. Use for \"Which carrier services are connected to my Sapo store\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"store":{"description":"Your Sapo Web store subdomain: the part before .mysapo.net in your store's admin address, for example 'mystore'.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Store","type":"string"}},"required":["store"],"title":"list_carrier_servicesArguments","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_blogs":{"post":{"operationId":"list_blogs","summary":"List the blogs of the storefront with alias, name, comment setting and SEO title and description. Use for \"Which blogs d","description":"List the blogs of the storefront with alias, name, comment setting and SEO title and description. Use for \"Which blogs does my Sapo store have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"store":{"description":"Your Sapo Web store subdomain: the part before .mysapo.net in your store's admin address, for example 'mystore'.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Store","type":"string"},"since_id":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Only records with an id greater than this.","title":"Since Id"}},"required":["store"],"title":"list_blogsArguments","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}}}}