{"openapi":"3.1.0","info":{"title":"Shopify (BYOK) API","version":"0.1.0","description":"Shopify (BYOK) lets an AI assistant read your own Shopify data through the Shopify API with a key you supply (Admin API access token (a custom app token with read scopes only, such as read_products, read_orders and read_customers)). Read-only: 7 tools (get_shop, get_store_counts, list_products, get_product, list_orders, get_order, list_customers). The BYOK key travels with each request, is used...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-shopify.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-shopify/docs"},"termsOfService":"https://connectorbay.com/byok-shopify/terms"},"servers":[{"url":"https://byok-shopify.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-shopify/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_shop":{"post":{"operationId":"get_shop","summary":"Show the store's name, owner email, myshopify domain, online store URL, currency, time zone, plan and creation date. Use","description":"Show the store's name, owner email, myshopify domain, online store URL, currency, time zone, plan and creation date. Use for \"What is my Shopify store's currency and plan\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"shop":{"description":"Your store's myshopify handle: the part before .myshopify.com, for example 'my-store' for my-store.myshopify.com.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Shop","type":"string"}},"required":["shop"],"title":"get_shopArguments","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_store_counts":{"post":{"operationId":"get_store_counts","summary":"Count the store's products, orders and customers (counts stop at 10000 and carry a precision flag). Use for \"How many pr","description":"Count the store's products, orders and customers (counts stop at 10000 and carry a precision flag). Use for \"How many products, orders and customers does my Shopify store have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"shop":{"description":"Your store's myshopify handle: the part before .myshopify.com, for example 'my-store' for my-store.myshopify.com.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Shop","type":"string"}},"required":["shop"],"title":"get_store_countsArguments","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 products with title, handle, status, vendor, type, tags, total inventory and price range; supports Shopify search f","description":"List products with title, handle, status, vendor, type, tags, total inventory and price range; supports Shopify search filters such as status:active or vendor:Acme. Use for \"Which of my Shopify products are out of stock\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"shop":{"description":"Your store's myshopify handle: the part before .myshopify.com, for example 'my-store' for my-store.myshopify.com.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Shop","type":"string"},"first":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many items to return (1 to 100).","title":"First"},"after":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor for the next page: pageInfo.endCursor from the previous answer. Leave out for the first page.","title":"After"},"query":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"default":null,"description":"Shopify search syntax to filter results, for example 'status:active vendor:Acme' or 'inventory_total:0'.","title":"Query"},"sort_key":{"anyOf":[{"enum":["CREATED_AT","ID","INVENTORY_TOTAL","PRODUCT_TYPE","PUBLISHED_AT","RELEVANCE","TITLE","UPDATED_AT","VENDOR"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort by CREATED_AT, ID, INVENTORY_TOTAL, PRODUCT_TYPE, PUBLISHED_AT, RELEVANCE (only with a query), TITLE, UPDATED_AT or VENDOR.","title":"Sort Key"},"reverse":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True to reverse the sort order.","title":"Reverse"}},"required":["shop"],"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}},"/v1/tools/get_product":{"post":{"operationId":"get_product","summary":"Get one product by id with description, status, tags, inventory and up to 50 variants (title, SKU, price, stock, availab","description":"Get one product by id with description, status, tags, inventory and up to 50 variants (title, SKU, price, stock, availability). Use for \"Show the variants and stock of one Shopify product\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"shop":{"description":"Your store's myshopify handle: the part before .myshopify.com, for example 'my-store' for my-store.myshopify.com.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Shop","type":"string"},"id":{"description":"The product's global id, for example gid://shopify/Product/1234567890 (the id field returned by list_products).","maxLength":200,"title":"Id","type":"string"}},"required":["shop","id"],"title":"get_productArguments","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_orders":{"post":{"operationId":"list_orders","summary":"List orders newest first with number, dates, payment and fulfillment status, total, item count and customer name; suppor","description":"List orders newest first with number, dates, payment and fulfillment status, total, item count and customer name; supports Shopify search filters such as financial_status:paid or fulfillment_status:unfulfilled. By default only recent orders are visible to the token. Use for \"Which Shopify orders are unfulfilled\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"shop":{"description":"Your store's myshopify handle: the part before .myshopify.com, for example 'my-store' for my-store.myshopify.com.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Shop","type":"string"},"first":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many items to return (1 to 100).","title":"First"},"after":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor for the next page: pageInfo.endCursor from the previous answer. Leave out for the first page.","title":"After"},"query":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"default":null,"description":"Shopify search syntax to filter results, for example 'fulfillment_status:unfulfilled financial_status:paid' or 'created_at:>=2026-01-01'.","title":"Query"},"sort_key":{"anyOf":[{"enum":["CREATED_AT","CURRENT_TOTAL_PRICE","CUSTOMER_NAME","FINANCIAL_STATUS","FULFILLMENT_STATUS","ID","ORDER_NUMBER","PROCESSED_AT","RELEVANCE","TOTAL_PRICE","UPDATED_AT"],"type":"string"},{"type":"null"}],"default":"PROCESSED_AT","description":"Sort by CREATED_AT, CURRENT_TOTAL_PRICE, CUSTOMER_NAME, FINANCIAL_STATUS, FULFILLMENT_STATUS, ID, ORDER_NUMBER, PROCESSED_AT (default), RELEVANCE (only with a query), TOTAL_PRICE or UPDATED_AT.","title":"Sort Key"},"reverse":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":true,"description":"True (the default here) lists newest first for date sorts; false lists oldest first.","title":"Reverse"}},"required":["shop"],"title":"list_ordersArguments","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_order":{"post":{"operationId":"get_order","summary":"Get one order by id with status, totals, customer name and email, note, tags and up to 50 line items (title, quantity, S","description":"Get one order by id with status, totals, customer name and email, note, tags and up to 50 line items (title, quantity, SKU, unit price). Use for \"What items were in Shopify order #1001\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"shop":{"description":"Your store's myshopify handle: the part before .myshopify.com, for example 'my-store' for my-store.myshopify.com.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Shop","type":"string"},"id":{"description":"The order's global id, for example gid://shopify/Order/1234567890 (the id field returned by list_orders).","maxLength":200,"title":"Id","type":"string"}},"required":["shop","id"],"title":"get_orderArguments","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_customers":{"post":{"operationId":"list_customers","summary":"List customers with name, email, order count, total spent, tags and state; supports Shopify search filters such as email","description":"List customers with name, email, order count, total spent, tags and state; supports Shopify search filters such as email:, country:, tag: or total_spent:>100. Use for \"Who are my top spending Shopify customers\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"shop":{"description":"Your store's myshopify handle: the part before .myshopify.com, for example 'my-store' for my-store.myshopify.com.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Shop","type":"string"},"first":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many items to return (1 to 100).","title":"First"},"after":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor for the next page: pageInfo.endCursor from the previous answer. Leave out for the first page.","title":"After"},"query":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"default":null,"description":"Shopify search syntax to filter results, for example 'total_spent:>100' or 'country:CA' or 'tag:vip'.","title":"Query"},"sort_key":{"anyOf":[{"enum":["CREATED_AT","ID","LOCATION","NAME","RELEVANCE","UPDATED_AT"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort by CREATED_AT, ID, LOCATION, NAME, RELEVANCE (only with a query) or UPDATED_AT.","title":"Sort Key"},"reverse":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True to reverse the sort order.","title":"Reverse"}},"required":["shop"],"title":"list_customersArguments","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}}}}