{"openapi":"3.1.0","info":{"title":"Productive Finance (BYOK) API","version":"0.1.0","description":"Productive Finance (BYOK) lets an AI assistant read your own Productive Finance data through the Productive Finance API with a key you supply (API token). Read-only: 6 tools (list_expenses, list_payments, list_purchase_orders, list_tax_rates, list_subsidiaries, list_services). The BYOK key travels with each request, is used for that one call only and is never stored, logged or cached; it is only...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-productive-finance.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-productive-finance/docs"},"termsOfService":"https://connectorbay.com/byok-productive-finance/terms"},"servers":[{"url":"https://byok-productive-finance.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-productive-finance/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 name, date, amount, currency, billable amount, invoiced, draft and reimbursable flags and payment dat","description":"List expenses with name, date, amount, currency, billable amount, invoiced, draft and reimbursable flags and payment dates; filter by date range, company, service or deal. Money amounts are integers as returned by Productive. Use for \"What expenses were booked in Productive last month\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"date_after":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Only expenses dated on or after this day, YYYY-MM-DD.","title":"Date After"},"date_before":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Only expenses dated on or before this day, YYYY-MM-DD.","title":"Date Before"},"company_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only expenses of this company id.","title":"Company Id"},"service_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only expenses of this service (budget line) id.","title":"Service Id"},"deal_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only expenses of this deal or budget id.","title":"Deal Id"},"invoiced":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for invoiced expenses only, false for not yet invoiced.","title":"Invoiced"},"sort":{"anyOf":[{"enum":["date","-date","amount","-amount","name","-name","created_at","-created_at","paid_on","-paid_on","pay_on","-pay_on"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort order; prefix '-' for descending. One of: date, -date, amount, -amount, name, -name, created_at, -created_at, paid_on, -paid_on, pay_on, -pay_on.","title":"Sort"},"page_size":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":30,"description":"How many records per page (1 to 200, default 30).","title":"Page Size"},"page_number":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. The answer's meta gives total_count and total_pages.","title":"Page Number"}},"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/list_payments":{"post":{"operationId":"list_payments","summary":"List invoice payments with amount, currency and date paid; filter by date range, invoice, project, company or subsidiary","description":"List invoice payments with amount, currency and date paid; filter by date range, invoice, project, company or subsidiary. Money amounts are integers as returned by Productive. Use for \"Which customer payments came in during September in Productive\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"paid_after":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Only payments made on or after this day, YYYY-MM-DD.","title":"Paid After"},"paid_before":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Only payments made on or before this day, YYYY-MM-DD.","title":"Paid Before"},"invoice_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only payments of this invoice id.","title":"Invoice Id"},"project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only payments for this project id.","title":"Project Id"},"company_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only payments from this company id.","title":"Company Id"},"subsidiary_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only payments to this subsidiary id.","title":"Subsidiary Id"},"sort":{"anyOf":[{"enum":["amount","-amount","date","-date","paid_on","-paid_on","invoice_number","-invoice_number"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort order; prefix '-' for descending. One of: amount, -amount, date, -date, paid_on, -paid_on, invoice_number, -invoice_number.","title":"Sort"},"page_size":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":30,"description":"How many records per page (1 to 200, default 30).","title":"Page Size"},"page_number":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. The answer's meta gives total_count and total_pages.","title":"Page Number"}},"title":"list_paymentsArguments","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, subject, currency, total cost, status ids and issue, delivery and receipt dates; filte","description":"List purchase orders with number, subject, currency, total cost, status ids and issue, delivery and receipt dates; filter by project, deal or text. Money amounts are integers as returned by Productive. Use for \"Which purchase orders are open in Productive\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only purchase orders of this project id.","title":"Project Id"},"deal_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only purchase orders of this deal or budget id.","title":"Deal Id"},"query":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only purchase orders matching this text.","title":"Query"},"page_size":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":30,"description":"How many records per page (1 to 200, default 30).","title":"Page Size"},"page_number":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. The answer's meta gives total_count and total_pages.","title":"Page Number"}},"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/list_tax_rates":{"post":{"operationId":"list_tax_rates","summary":"List the organization's tax rates with name, components and archive time. Money amounts are integers as returned by Prod","description":"List the organization's tax rates with name, components and archive time. Money amounts are integers as returned by Productive. Use for \"What tax rates are set up in Productive\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"page_size":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":30,"description":"How many records per page (1 to 200, default 30).","title":"Page Size"},"page_number":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. The answer's meta gives total_count and total_pages.","title":"Page Number"}},"title":"list_tax_ratesArguments","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_subsidiaries":{"post":{"operationId":"list_subsidiaries","summary":"List subsidiaries (legal entities) with name, invoice numbering format and archive time. Money amounts are integers as r","description":"List subsidiaries (legal entities) with name, invoice numbering format and archive time. Money amounts are integers as returned by Productive. Use for \"Which subsidiaries does our Productive account have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"page_size":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":30,"description":"How many records per page (1 to 200, default 30).","title":"Page Size"},"page_number":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. The answer's meta gives total_count and total_pages.","title":"Page Number"}},"title":"list_subsidiariesArguments","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_services":{"post":{"operationId":"list_services","summary":"List services (budget lines) with name, billable flag, estimated, worked and booked time in minutes, price, revenue, bud","description":"List services (budget lines) with name, billable flag, estimated, worked and booked time in minutes, price, revenue, budget total and budget used. Money amounts are integers as returned by Productive. Use for \"How much of each service budget has been used in Productive\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"query":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only services matching this text.","title":"Query"},"budget_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only services of this budget (deal) id.","title":"Budget Id"},"billable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for billable services only, false for non-billable.","title":"Billable"},"sort":{"anyOf":[{"enum":["name","-name","budget","-budget","project_name","-project_name","company","-company"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort order; prefix '-' for descending. One of: name, -name, budget, -budget, project_name, -project_name, company, -company.","title":"Sort"},"page_size":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":30,"description":"How many records per page (1 to 200, default 30).","title":"Page Size"},"page_number":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. The answer's meta gives total_count and total_pages.","title":"Page Number"}},"title":"list_servicesArguments","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}}}}