{"openapi":"3.1.0","info":{"title":"e-conomic (BYOK) API","version":"0.1.0","description":"e-conomic (BYOK) lets an AI assistant read your own e-conomic data through the e-conomic API with a key you supply (app secret token). Read-only: 11 tools (list_customers, get_customer, list_suppliers, list_products, list_booked_invoices, list_unpaid_invoices, list_overdue_invoices, get_unpaid_invoice_totals, list_draft_invoices, list_chart_of_accounts, list_accounting_years). The BYOK key...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-e-conomic.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-e-conomic/docs"},"termsOfService":"https://connectorbay.com/byok-e-conomic/terms"},"servers":[{"url":"https://byok-e-conomic.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-e-conomic/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_customers":{"post":{"operationId":"list_customers","summary":"List customers with number, name, address, city, country, currency, email, tax id, balance, credit limit and barred flag","description":"List customers with number, name, address, city, country, currency, email, tax id, balance, credit limit and barred flag. Filter by name, number or country. Use for \"Which customers owe me money in e-conomic\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"filter":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Optional filter in the API syntax, for example 'name$like:*bakery' or 'customerNumber$gte:100$and:country$eq:Denmark' (only filterable properties work).","title":"Filter"},"sort":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Optional sort, for example 'name' or '-balance' (a leading minus sorts descending).","title":"Sort"},"page_size":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"Records per page (1 to 1000; the API default is 20).","title":"Page Size"},"skip_pages":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of pages to skip (0 for the first page).","title":"Skip Pages"}},"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}},"/v1/tools/get_customer":{"post":{"operationId":"get_customer","summary":"Get one customer by number with address, currency, tax id, balance, credit limit and barred flag. Use for \"Show e-conomi","description":"Get one customer by number with address, currency, tax id, balance, credit limit and barred flag. Use for \"Show e-conomic customer 7\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"customer_number":{"description":"Customer number from list_customers.","title":"Customer Number","type":"integer"}},"required":["customer_number"],"title":"get_customerArguments","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_suppliers":{"post":{"operationId":"list_suppliers","summary":"List suppliers with number, name, address, city, country, currency, tax id, email and barred flag. Use for \"Which suppli","description":"List suppliers with number, name, address, city, country, currency, tax id, email and barred flag. Use for \"Which suppliers are set up in e-conomic\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"filter":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Optional filter in the API syntax, for example 'name$like:*bakery' or 'customerNumber$gte:100$and:country$eq:Denmark' (only filterable properties work).","title":"Filter"},"sort":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Optional sort, for example 'name' or '-balance' (a leading minus sorts descending).","title":"Sort"},"page_size":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"Records per page (1 to 1000; the API default is 20).","title":"Page Size"},"skip_pages":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of pages to skip (0 for the first page).","title":"Skip Pages"}},"title":"list_suppliersArguments","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 and services with number, name, sales price, cost price, recommended price, description and barred flag. U","description":"List products and services with number, name, sales price, cost price, recommended price, description and barred flag. Use for \"What products and prices are in e-conomic\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"filter":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Optional filter in the API syntax, for example 'name$like:*bakery' or 'customerNumber$gte:100$and:country$eq:Denmark' (only filterable properties work).","title":"Filter"},"sort":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Optional sort, for example 'name' or '-balance' (a leading minus sorts descending).","title":"Sort"},"page_size":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"Records per page (1 to 1000; the API default is 20).","title":"Page Size"},"skip_pages":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of pages to skip (0 for the first page).","title":"Skip Pages"}},"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/list_booked_invoices":{"post":{"operationId":"list_booked_invoices","summary":"List booked (final) invoices with number, date, due date, currency, customer, recipient, net and gross amount and remain","description":"List booked (final) invoices with number, date, due date, currency, customer, recipient, net and gross amount and remaining amount to pay. Use for \"Show my latest booked invoices in e-conomic\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"filter":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Optional filter in the API syntax, for example 'name$like:*bakery' or 'customerNumber$gte:100$and:country$eq:Denmark' (only filterable properties work).","title":"Filter"},"sort":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Optional sort, for example 'name' or '-balance' (a leading minus sorts descending).","title":"Sort"},"page_size":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"Records per page (1 to 1000; the API default is 20).","title":"Page Size"},"skip_pages":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of pages to skip (0 for the first page).","title":"Skip Pages"}},"title":"list_booked_invoicesArguments","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_unpaid_invoices":{"post":{"operationId":"list_unpaid_invoices","summary":"List booked invoices that are not yet fully paid, with due date and remaining amount. Use filter on dueDate or customer ","description":"List booked invoices that are not yet fully paid, with due date and remaining amount. Use filter on dueDate or customer to narrow. Use for \"Which e-conomic invoices are unpaid\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"filter":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Optional filter in the API syntax, for example 'name$like:*bakery' or 'customerNumber$gte:100$and:country$eq:Denmark' (only filterable properties work).","title":"Filter"},"sort":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Optional sort, for example 'name' or '-balance' (a leading minus sorts descending).","title":"Sort"},"page_size":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"Records per page (1 to 1000; the API default is 20).","title":"Page Size"},"skip_pages":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of pages to skip (0 for the first page).","title":"Skip Pages"}},"title":"list_unpaid_invoicesArguments","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_overdue_invoices":{"post":{"operationId":"list_overdue_invoices","summary":"List booked invoices that are past their due date and unpaid, with remaining amount. Use for \"Which e-conomic invoices a","description":"List booked invoices that are past their due date and unpaid, with remaining amount. Use for \"Which e-conomic invoices are overdue\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"filter":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Optional filter in the API syntax, for example 'name$like:*bakery' or 'customerNumber$gte:100$and:country$eq:Denmark' (only filterable properties work).","title":"Filter"},"sort":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Optional sort, for example 'name' or '-balance' (a leading minus sorts descending).","title":"Sort"},"page_size":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"Records per page (1 to 1000; the API default is 20).","title":"Page Size"},"skip_pages":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of pages to skip (0 for the first page).","title":"Skip Pages"}},"title":"list_overdue_invoicesArguments","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_unpaid_invoice_totals":{"post":{"operationId":"get_unpaid_invoice_totals","summary":"Get the totals of unpaid booked invoices: count, net amount, gross remainder in base currency and earliest and latest in","description":"Get the totals of unpaid booked invoices: count, net amount, gross remainder in base currency and earliest and latest invoice dates. Use for \"How much is outstanding on my e-conomic invoices in total\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_unpaid_invoice_totalsArguments","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_draft_invoices":{"post":{"operationId":"list_draft_invoices","summary":"List draft (not yet booked) invoices. The API documents the draft fields separately from booked invoices; amounts and cu","description":"List draft (not yet booked) invoices. The API documents the draft fields separately from booked invoices; amounts and customer are included. Use for \"Which draft invoices are waiting to be booked in e-conomic\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"filter":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Optional filter in the API syntax, for example 'name$like:*bakery' or 'customerNumber$gte:100$and:country$eq:Denmark' (only filterable properties work).","title":"Filter"},"sort":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Optional sort, for example 'name' or '-balance' (a leading minus sorts descending).","title":"Sort"},"page_size":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"Records per page (1 to 1000; the API default is 20).","title":"Page Size"},"skip_pages":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of pages to skip (0 for the first page).","title":"Skip Pages"}},"title":"list_draft_invoicesArguments","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_chart_of_accounts":{"post":{"operationId":"list_chart_of_accounts","summary":"List the chart of accounts with account number, name, type, balance, debit or credit nature and barred flag. Use for \"Sh","description":"List the chart of accounts with account number, name, type, balance, debit or credit nature and barred flag. Use for \"Show my e-conomic chart of accounts with balances\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"filter":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Optional filter in the API syntax, for example 'name$like:*bakery' or 'customerNumber$gte:100$and:country$eq:Denmark' (only filterable properties work).","title":"Filter"},"sort":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Optional sort, for example 'name' or '-balance' (a leading minus sorts descending).","title":"Sort"},"page_size":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"Records per page (1 to 1000; the API default is 20).","title":"Page Size"},"skip_pages":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of pages to skip (0 for the first page).","title":"Skip Pages"}},"title":"list_chart_of_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_accounting_years":{"post":{"operationId":"list_accounting_years","summary":"List accounting years with year label, first and last date and whether the year is closed. Use for \"Which accounting yea","description":"List accounting years with year label, first and last date and whether the year is closed. Use for \"Which accounting years exist in e-conomic and are they closed\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"filter":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Optional filter in the API syntax, for example 'name$like:*bakery' or 'customerNumber$gte:100$and:country$eq:Denmark' (only filterable properties work).","title":"Filter"},"sort":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Optional sort, for example 'name' or '-balance' (a leading minus sorts descending).","title":"Sort"},"page_size":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"Records per page (1 to 1000; the API default is 20).","title":"Page Size"},"skip_pages":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of pages to skip (0 for the first page).","title":"Skip Pages"}},"title":"list_accounting_yearsArguments","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}}}}