{"openapi":"3.1.0","info":{"title":"Odoo Product Catalog (BYOK) API","version":"0.1.0","description":"Odoo Product Catalog (BYOK) lets an AI assistant read your own Odoo Product Catalog data through the Odoo Product Catalog API with a key you supply (Odoo API key (Preferences, Account Security, New API Key); JSON-2 access needs a Custom plan). Read-only: 7 tools (list_products, search_products_by_name, list_product_categories, list_units_of_measure, list_pricelists, list_warehouses,...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-odoo-product-catalog.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-odoo-product-catalog/docs"},"termsOfService":"https://connectorbay.com/byok-odoo-product-catalog/terms"},"servers":[{"url":"https://byok-odoo-product-catalog.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-odoo-product-catalog/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_products":{"post":{"operationId":"list_products","summary":"List products (model product.template) with name, internal reference, barcode, type, category, sales price, cost, unit o","description":"List products (model product.template) with name, internal reference, barcode, type, category, sales price, cost, unit of measure and sale and purchase flags. Active products only. Use for \"Which products do I sell in Odoo and at what price\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"database":{"description":"Your Odoo Online database subdomain: the part before .odoo.com, for example 'mycompany' for mycompany.odoo.com.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Database","type":"string"},"order":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":"name asc","description":"Sort expression, for example 'name asc'.","title":"Order"},"limit":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many records to return (1 to 200).","title":"Limit"},"offset":{"anyOf":[{"maximum":1000000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many records to skip, for paging.","title":"Offset"}},"required":["database"],"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/search_products_by_name":{"post":{"operationId":"search_products_by_name","summary":"Find products whose name matches a text (case-insensitive contains). Returns pairs of [id, display name]. Use for \"What ","description":"Find products whose name matches a text (case-insensitive contains). Returns pairs of [id, display name]. Use for \"What is the Odoo id of the product called Desk\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"database":{"description":"Your Odoo Online database subdomain: the part before .odoo.com, for example 'mycompany' for mycompany.odoo.com.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Database","type":"string"},"name":{"description":"Text to look for in the product name.","maxLength":100,"title":"Name","type":"string"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":10,"description":"How many matches to return (1 to 100).","title":"Limit"}},"required":["database","name"],"title":"search_products_by_nameArguments","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_categories":{"post":{"operationId":"list_product_categories","summary":"List product categories (model product.category) with name, full path name and parent category. Use for \"How are my Odoo","description":"List product categories (model product.category) with name, full path name and parent category. Use for \"How are my Odoo products categorised\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"database":{"description":"Your Odoo Online database subdomain: the part before .odoo.com, for example 'mycompany' for mycompany.odoo.com.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Database","type":"string"},"order":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":"complete_name asc","description":"Sort expression, for example 'complete_name asc'.","title":"Order"},"limit":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many records to return (1 to 200).","title":"Limit"},"offset":{"anyOf":[{"maximum":1000000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many records to skip, for paging.","title":"Offset"}},"required":["database"],"title":"list_product_categoriesArguments","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_units_of_measure":{"post":{"operationId":"list_units_of_measure","summary":"List units of measure (model uom.uom) with name, reference unit, relative factor and rounding precision. Active units on","description":"List units of measure (model uom.uom) with name, reference unit, relative factor and rounding precision. Active units only. Use for \"Which units of measure exist in Odoo\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"database":{"description":"Your Odoo Online database subdomain: the part before .odoo.com, for example 'mycompany' for mycompany.odoo.com.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Database","type":"string"},"order":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":"name asc","description":"Sort expression, for example 'name asc'.","title":"Order"},"limit":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many records to return (1 to 200).","title":"Limit"},"offset":{"anyOf":[{"maximum":1000000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many records to skip, for paging.","title":"Offset"}},"required":["database"],"title":"list_units_of_measureArguments","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_pricelists":{"post":{"operationId":"list_pricelists","summary":"List sales pricelists (model product.pricelist) with name, currency and sequence. Active pricelists only. Use for \"What ","description":"List sales pricelists (model product.pricelist) with name, currency and sequence. Active pricelists only. Use for \"What pricelists are set up in Odoo\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"database":{"description":"Your Odoo Online database subdomain: the part before .odoo.com, for example 'mycompany' for mycompany.odoo.com.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Database","type":"string"},"order":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":"sequence asc","description":"Sort expression, for example 'sequence asc'.","title":"Order"},"limit":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many records to return (1 to 200).","title":"Limit"},"offset":{"anyOf":[{"maximum":1000000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many records to skip, for paging.","title":"Offset"}},"required":["database"],"title":"list_pricelistsArguments","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_warehouses":{"post":{"operationId":"list_warehouses","summary":"List warehouses (model stock.warehouse) with name, short code, reception and delivery steps and company. Active warehous","description":"List warehouses (model stock.warehouse) with name, short code, reception and delivery steps and company. Active warehouses only. Use for \"What warehouses does my Odoo have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"database":{"description":"Your Odoo Online database subdomain: the part before .odoo.com, for example 'mycompany' for mycompany.odoo.com.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Database","type":"string"},"order":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":"sequence asc","description":"Sort expression, for example 'sequence asc'.","title":"Order"},"limit":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many records to return (1 to 200).","title":"Limit"},"offset":{"anyOf":[{"maximum":1000000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many records to skip, for paging.","title":"Offset"}},"required":["database"],"title":"list_warehousesArguments","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_stock_locations":{"post":{"operationId":"list_stock_locations","summary":"List stock locations (model stock.location) with full name, usage (internal, view, supplier, customer, transit and other","description":"List stock locations (model stock.location) with full name, usage (internal, view, supplier, customer, transit and others), parent location and warehouse. Active locations only. Use for \"Which internal stock locations exist in Odoo\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"database":{"description":"Your Odoo Online database subdomain: the part before .odoo.com, for example 'mycompany' for mycompany.odoo.com.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Database","type":"string"},"order":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":"complete_name asc","description":"Sort expression, for example 'complete_name asc'.","title":"Order"},"limit":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many records to return (1 to 200).","title":"Limit"},"offset":{"anyOf":[{"maximum":1000000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many records to skip, for paging.","title":"Offset"}},"required":["database"],"title":"list_stock_locationsArguments","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}}}}