{"openapi":"3.1.0","info":{"title":"Paymo Billing and Planning (BYOK) API","version":"0.1.0","description":"Paymo Billing and Planning (BYOK) lets an AI assistant read your own Paymo Billing and Planning data through the Paymo Billing and Planning API with a key you supply (API key). Read-only: 9 tools (list_estimates, list_invoice_payments, list_recurring_invoice_profiles, list_bookings, list_project_statuses, list_workflows, list_workflow_statuses, list_project_templates, get_company). The BYOK key...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-paymo-billing-planning.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-paymo-billing-planning/docs"},"termsOfService":"https://connectorbay.com/byok-paymo-billing-planning/terms"},"servers":[{"url":"https://byok-paymo-billing-planning.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-paymo-billing-planning/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_estimates":{"post":{"operationId":"list_estimates","summary":"List estimates with client id, number, status, currency, date, subtotal, tax and total. Use for \"Which Paymo estimates a","description":"List estimates with client id, number, status, currency, date, subtotal, tax and total. Use for \"Which Paymo estimates are still in draft\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"where":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Optional filter on client_id, status or total, for example 'client_id=123 and status=draft'. Combine conditions with 'and'. Leave out for no filter.","title":"Where"}},"title":"list_estimatesArguments","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_invoice_payments":{"post":{"operationId":"list_invoice_payments","summary":"List payments recorded against invoices with invoice id, amount and date. Use for \"What payments did we receive in Paymo","description":"List payments recorded against invoices with invoice id, amount and date. Use for \"What payments did we receive in Paymo\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"where":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Optional filter on invoice_id, for example 'invoice_id=9876'. Combine conditions with 'and'. Leave out for no filter.","title":"Where"}},"title":"list_invoice_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_recurring_invoice_profiles":{"post":{"operationId":"list_recurring_invoice_profiles","summary":"List recurring invoice profiles (schedules that create invoices) with client, currency, subtotal and total. Use for \"Whi","description":"List recurring invoice profiles (schedules that create invoices) with client, currency, subtotal and total. Use for \"Which recurring invoices are set up in Paymo\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"where":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Optional filter on client_id or total, for example 'client_id=319023 and total>100'. Combine conditions with 'and'. Leave out for no filter.","title":"Where"}},"title":"list_recurring_invoice_profilesArguments","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_bookings":{"post":{"operationId":"list_bookings","summary":"List resource bookings (planned hours per day for a person on a task) for a project, task, user or date interval. At lea","description":"List resource bookings (planned hours per day for a person on a task) for a project, task, user or date interval. At least one condition is required. Use for \"Who is booked on Paymo project 123 in December\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"where":{"description":"Required filter on project_id, task_id, user_id, user_task_id, or date_interval in (\"2026-12-01\",\"2027-01-01\"), for example 'project_id=123'. Combine conditions with 'and'.","maxLength":300,"title":"Where","type":"string"}},"required":["where"],"title":"list_bookingsArguments","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_project_statuses":{"post":{"operationId":"list_project_statuses","summary":"List project statuses (Active, On-hold, Cancelled ...) with active and read-only flags and order. Use for \"What project ","description":"List project statuses (Active, On-hold, Cancelled ...) with active and read-only flags and order. Use for \"What project statuses does Paymo have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_project_statusesArguments","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_workflows":{"post":{"operationId":"list_workflows","summary":"List task workflows (sets of task statuses) with default flag. Use for \"Which task workflows are defined in Paymo\".","description":"List task workflows (sets of task statuses) with default flag. Use for \"Which task workflows are defined in Paymo\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_workflowsArguments","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_workflow_statuses":{"post":{"operationId":"list_workflow_statuses","summary":"List the statuses of task workflows with colour and action, optionally of one workflow. Use for \"What statuses does Paym","description":"List the statuses of task workflows with colour and action, optionally of one workflow. Use for \"What statuses does Paymo workflow 1 have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"where":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Optional filter on workflow_id, for example 'workflow_id=1'. Combine conditions with 'and'. Leave out for no filter.","title":"Where"}},"title":"list_workflow_statusesArguments","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_project_templates":{"post":{"operationId":"list_project_templates","summary":"List project templates with name and dates. Use for \"Which project templates exist in Paymo\".","description":"List project templates with name and dates. Use for \"Which project templates exist in Paymo\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_project_templatesArguments","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_company":{"post":{"operationId":"get_company","summary":"Show the company account settings: name, country, account type, default currency, hourly price, tax, invoice due interva","description":"Show the company account settings: name, country, account type, default currency, hourly price, tax, invoice due interval, language and date format. Use for \"What are our Paymo company defaults\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_companyArguments","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}}}}