{"openapi":"3.1.0","info":{"title":"Paymo (BYOK) API","version":"0.1.0","description":"Paymo (BYOK) lets an AI assistant read your own Paymo data through the Paymo API with a key you supply (API key). Read-only: 9 tools (list_projects, list_tasks, list_task_lists, list_milestones, list_clients, list_users, list_time_entries, list_invoices, list_expenses). The BYOK key travels with each request, is used for that one call only and is never stored, logged or cached; it is only ever...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-paymo.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-paymo/docs"},"termsOfService":"https://connectorbay.com/byok-paymo/terms"},"servers":[{"url":"https://byok-paymo.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-paymo/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_projects":{"post":{"operationId":"list_projects","summary":"List projects with code, client id, status id, active and billable flags, budget hours, hourly price and assigned user i","description":"List projects with code, client id, status id, active and billable flags, budget hours, hourly price and assigned user ids. Use for \"Which Paymo projects are active\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"where":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Optional filter on active, client_id, billable, users or managers, for example 'active=true and billable=true'. Combine conditions with 'and'. Leave out for no filter.","title":"Where"}},"title":"list_projectsArguments","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_tasks":{"post":{"operationId":"list_tasks","summary":"List tasks with project, task list, assigned users, completion, due date, billable flag and budget hours. Use for \"Which","description":"List tasks with project, task list, assigned users, completion, due date, billable flag and budget hours. Use for \"Which Paymo tasks assigned to me are not complete\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"where":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Optional filter on project_id, tasklist_id, complete, users or mytasks=true, for example 'complete=false and project_id=123'. Combine conditions with 'and'. Leave out for no filter.","title":"Where"}},"title":"list_tasksArguments","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_task_lists":{"post":{"operationId":"list_task_lists","summary":"List task lists (the groups tasks sit in) with project and milestone ids. Use for \"What task lists does Paymo project 12","description":"List task lists (the groups tasks sit in) with project and milestone ids. Use for \"What task lists does Paymo project 123 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 project_id or milestone_id, for example 'project_id=123'. Combine conditions with 'and'. Leave out for no filter.","title":"Where"}},"title":"list_task_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_milestones":{"post":{"operationId":"list_milestones","summary":"List milestones with project, owner, due date and completion. Use for \"Which Paymo milestones are not complete yet\".","description":"List milestones with project, owner, due date and completion. Use for \"Which Paymo milestones are not complete yet\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"where":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Optional filter on due_date, complete or user_id, for example 'complete=false'. Combine conditions with 'and'. Leave out for no filter.","title":"Where"}},"title":"list_milestonesArguments","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_clients":{"post":{"operationId":"list_clients","summary":"List clients with name, city, country, website and active flag. Use for \"Who are my Paymo clients\".","description":"List clients with name, city, country, website and active flag. Use for \"Who are my Paymo clients\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"where":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Optional filter on active, for example 'active=true'. Combine conditions with 'and'. Leave out for no filter.","title":"Where"}},"title":"list_clientsArguments","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_users":{"post":{"operationId":"list_users","summary":"List the company's users with name, type (Admin, Employee, Project Manager, Guest), position, active flag and assigned p","description":"List the company's users with name, type (Admin, Employee, Project Manager, Guest), position, active flag and assigned project ids. Use for \"Who is on my Paymo team\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"where":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Optional filter on active or type, for example 'active=true and type=Employee'. Combine conditions with 'and'. Leave out for no filter.","title":"Where"}},"title":"list_usersArguments","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_time_entries":{"post":{"operationId":"list_time_entries","summary":"List time entries with project, task, user, start and end times, duration in seconds and billed flag.  Always filter by ","description":"List time entries with project, task, user, start and end times, duration in seconds and billed flag.  Always filter by project, task, user, client or time interval. Use for \"How much time was logged on Paymo project 123\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"where":{"description":"Filter, for example 'project_id=123', 'user_id=45' or 'time_interval in (\"2026-09-01T00:00:00Z\",\"2026-10-01T00:00:00Z\")'.","maxLength":300,"title":"Where","type":"string"}},"required":["where"],"title":"list_time_entriesArguments","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_invoices":{"post":{"operationId":"list_invoices","summary":"List invoices with number, client, status, currency, dates, total and outstanding amount. Use for \"Which of my Paymo inv","description":"List invoices with number, client, status, currency, dates, total and outstanding amount. Use for \"Which of my Paymo invoices are drafts\".","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 'status=draft'. Combine conditions with 'and'. Leave out for no filter.","title":"Where"}},"title":"list_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_expenses":{"post":{"operationId":"list_expenses","summary":"List expenses with client, project, user, amount, currency, date, notes, invoiced flag and tags. Use for \"What expenses ","description":"List expenses with client, project, user, amount, currency, date, notes, invoiced flag and tags. Use for \"What expenses are not yet invoiced 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, project_id, date or invoiced, for example 'invoiced=false'. Combine conditions with 'and'. Leave out for no filter.","title":"Where"}},"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}}}}