{"openapi":"3.1.0","info":{"title":"Invoice Ninja Expenses (BYOK) API","version":"0.1.0","description":"Invoice Ninja Expenses (BYOK) lets an AI assistant read your own Invoice Ninja Expenses data through the Invoice Ninja Expenses API with a key you supply (Invoice Ninja API token (hosted plan at invoicing.co)). Read-only: 6 tools (list_expenses, get_expense, list_recurring_expenses, get_recurring_expense, list_purchase_orders, get_purchase_order). 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-invoiceninja-expenses.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-invoiceninja-expenses/docs"},"termsOfService":"https://connectorbay.com/byok-invoiceninja-expenses/terms"},"servers":[{"url":"https://byok-invoiceninja-expenses.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-invoiceninja-expenses/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_expenses":{"post":{"operationId":"list_expenses","summary":"List expenses with number, date, payment date, amount, tax, category, vendor and client ids and the should-be-invoiced f","description":"List expenses with number, date, payment date, amount, tax, category, vendor and client ids and the should-be-invoiced flag. Notes and custom fields are not returned. Use for \"What expenses did I record in Invoice Ninja recently\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"per_page":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"Records per page (default 20).","title":"Per Page"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"title":"list_expensesArguments","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_expense":{"post":{"operationId":"get_expense","summary":"Get one expense by its id with date, amount, tax, category, vendor and client ids. Use for \"Show Invoice Ninja expense O","description":"Get one expense by its id with date, amount, tax, category, vendor and client ids. Use for \"Show Invoice Ninja expense Opnel5aKBz\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"description":"Expense id (hashed string such as Opnel5aKBz).","maxLength":200,"title":"Id","type":"string"}},"required":["id"],"title":"get_expenseArguments","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_recurring_expenses":{"post":{"operationId":"list_recurring_expenses","summary":"List recurring expenses with amount, frequency id, remaining cycles, last and next send dates, category, vendor and clie","description":"List recurring expenses with amount, frequency id, remaining cycles, last and next send dates, category, vendor and client ids. Use for \"Which recurring expenses are scheduled in Invoice Ninja\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"per_page":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"Records per page (default 20).","title":"Per Page"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"title":"list_recurring_expensesArguments","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_recurring_expense":{"post":{"operationId":"get_recurring_expense","summary":"Get one recurring expense by its id with amount, frequency and next send date. Use for \"Show Invoice Ninja recurring exp","description":"Get one recurring expense by its id with amount, frequency and next send date. Use for \"Show Invoice Ninja recurring expense Opnel5aKBz\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"description":"Recurring expense id (hashed string).","maxLength":200,"title":"Id","type":"string"}},"required":["id"],"title":"get_recurring_expenseArguments","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_purchase_orders":{"post":{"operationId":"list_purchase_orders","summary":"List purchase orders with number, status id, dates, amount, balance, paid to date, taxes and the vendor id. Line items a","description":"List purchase orders with number, status id, dates, amount, balance, paid to date, taxes and the vendor id. Line items and notes are not returned. Use for \"What purchase orders are open in Invoice Ninja\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"per_page":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"Records per page (default 20).","title":"Per Page"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"title":"list_purchase_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_purchase_order":{"post":{"operationId":"get_purchase_order","summary":"Get one purchase order by its id with dates, amount, balance, paid to date, taxes and the vendor id. Use for \"Show Invoi","description":"Get one purchase order by its id with dates, amount, balance, paid to date, taxes and the vendor id. Use for \"Show Invoice Ninja purchase order Opnel5aKBz\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"description":"Purchase order id (hashed string).","maxLength":200,"title":"Id","type":"string"}},"required":["id"],"title":"get_purchase_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}}}}