{"openapi":"3.1.0","info":{"title":"Holded Invoicing Setup (BYOK) API","version":"0.1.0","description":"Holded Invoicing Setup (BYOK) lets an AI assistant read your own Holded Invoicing Setup data through the Holded Invoicing Setup API with a key you supply (Holded API key). Read-only: 10 tools (list_payment_methods, list_numbering_series, list_sales_channels, list_expenses_accounts, list_price_lists, list_tags, list_warehouses, get_warehouse_stock, list_tax_keys_by_country, list_crm_funnels). The...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-holded-invoicing-setup.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-holded-invoicing-setup/docs"},"termsOfService":"https://connectorbay.com/byok-holded-invoicing-setup/terms"},"servers":[{"url":"https://byok-holded-invoicing-setup.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-holded-invoicing-setup/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_payment_methods":{"post":{"operationId":"list_payment_methods","summary":"List the configured payment methods (manual ones and connected online providers) with type, connection status, default f","description":"List the configured payment methods (manual ones and connected online providers) with type, connection status, default flag, linked banking account id and due days. Use for \"Which payment methods are set up in my Holded account\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 200, default 50).","title":"Limit"},"cursor":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass the cursor value from the previous answer while has_more is true.","title":"Cursor"}},"title":"list_payment_methodsArguments","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_numbering_series":{"post":{"operationId":"list_numbering_series","summary":"List the numbering series configured for one document type, with name, number format, last number used and the linked re","description":"List the numbering series configured for one document type, with name, number format, last number used and the linked refund series. Use for \"What invoice numbering series does Holded have and what was the last number used\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"type":{"description":"Document type: invoice, salesreceipt, creditnote, estimate, proform, waybill, salesorder, purchase, purchaserefund, order, purchaseshipment, receiptnote or productionorder.","enum":["invoice","salesreceipt","creditnote","estimate","proform","waybill","salesorder","purchase","purchaserefund","order","purchaseshipment","receiptnote","productionorder"],"title":"Type","type":"string"}},"required":["type"],"title":"list_numbering_seriesArguments","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_sales_channels":{"post":{"operationId":"list_sales_channels","summary":"List all sales channels, active and archived, with name, color, chart-of-accounts number and description. Use for \"Which","description":"List all sales channels, active and archived, with name, color, chart-of-accounts number and description. Use for \"Which sales channels exist in Holded\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_sales_channelsArguments","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_expenses_accounts":{"post":{"operationId":"list_expenses_accounts","summary":"List all expense accounts, active and archived, with name, color, chart-of-accounts number and description. Use for \"Whi","description":"List all expense accounts, active and archived, with name, color, chart-of-accounts number and description. Use for \"Which expense accounts can I assign to purchase lines in Holded\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_expenses_accountsArguments","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_lists":{"post":{"operationId":"list_price_lists","summary":"List the price lists (rates) with name and description. Use for \"What price lists do I have in Holded\".","description":"List the price lists (rates) with name and description. Use for \"What price lists do I have in Holded\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_price_listsArguments","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_tags":{"post":{"operationId":"list_tags","summary":"List every tag defined in the account (names only). Use for \"Which tags are defined in Holded\".","description":"List every tag defined in the account (names only). Use for \"Which tags are defined in Holded\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_tagsArguments","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 all warehouses with name, default flag, color and the city, province and country code of the address. Not paginated","description":"List all warehouses with name, default flag, color and the city, province and country code of the address. Not paginated. Use for \"What warehouses do I have in Holded and which is the default\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"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/get_warehouse_stock":{"post":{"operationId":"get_warehouse_stock","summary":"List the stock quantity of every product stored in one warehouse (product id, variant id and a decimal string quantity).","description":"List the stock quantity of every product stored in one warehouse (product id, variant id and a decimal string quantity). Use for \"How much stock does each product have in Holded warehouse 507f1f77bcf86cd799439011\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"warehouse_id":{"description":"Warehouse id (24-character hex id from list_warehouses).","maxLength":200,"title":"Warehouse Id","type":"string"},"limit":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 200, default 50).","title":"Limit"},"cursor":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass the cursor value from the previous answer while has_more is true.","title":"Cursor"}},"required":["warehouse_id"],"title":"get_warehouse_stockArguments","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_tax_keys_by_country":{"post":{"operationId":"list_tax_keys_by_country","summary":"List the tax keys that apply in one country, in order, optionally for an ecommerce section such as shopify or amazon. Us","description":"List the tax keys that apply in one country, in order, optionally for an ecommerce section such as shopify or amazon. Use for \"Which Holded tax keys apply in Spain\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"country":{"description":"Two-letter ISO 3166-1 country code, for example ES, FR or DE.","maxLength":2,"title":"Country","type":"string"},"section":{"anyOf":[{"enum":["all","shopify","prestashop","woocommerce","amazon","wix","stripe"],"type":"string"},{"type":"null"}],"default":null,"description":"Ecommerce section: all (default), shopify, prestashop, woocommerce, amazon, wix or stripe.","title":"Section"}},"required":["country"],"title":"list_tax_keys_by_countryArguments","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_crm_funnels":{"post":{"operationId":"list_crm_funnels","summary":"List CRM funnels with their stages (name, key, deal probability, days before a deal rots) and labels. Use for \"What CRM ","description":"List CRM funnels with their stages (name, key, deal probability, days before a deal rots) and labels. Use for \"What CRM funnels and stages does Holded have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 200, default 50).","title":"Limit"},"cursor":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass the cursor value from the previous answer while has_more is true.","title":"Cursor"}},"title":"list_crm_funnelsArguments","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}}}}