{"openapi":"3.1.0","info":{"title":"Productive Resourcing (BYOK) API","version":"0.1.0","description":"Productive Resourcing (BYOK) lets an AI assistant read your own Productive Resourcing data through the Productive Resourcing API with a key you supply (API token). Read-only: 8 tools (list_bookings, list_resource_requests, list_holidays, list_holiday_calendars, list_job_roles, list_teams, list_workflows, list_workflow_statuses). The BYOK key travels with each request, is used for that one call...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-productive-resourcing.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-productive-resourcing/docs"},"termsOfService":"https://connectorbay.com/byok-productive-resourcing/terms"},"servers":[{"url":"https://byok-productive-resourcing.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-productive-resourcing/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_bookings":{"post":{"operationId":"list_bookings","summary":"List resource bookings with start and end date, total time and hours in minutes, percentage, draft and canceled flags; f","description":"List resource bookings with start and end date, total time and hours in minutes, percentage, draft and canceled flags; filter by date window, person, project or budget. Use for \"Who is booked on which Productive project next week\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"after":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Only bookings ending on or after this day, YYYY-MM-DD.","title":"After"},"before":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Only bookings starting on or before this day, YYYY-MM-DD.","title":"Before"},"person_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only bookings of this person id.","title":"Person Id"},"project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only bookings on this project id.","title":"Project Id"},"budget_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only bookings on this budget (deal) id.","title":"Budget Id"},"sort":{"anyOf":[{"enum":["started_on","-started_on","last_activity_at","-last_activity_at","draft","-draft"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort order; prefix '-' for descending. One of: started_on, -started_on, last_activity_at, -last_activity_at, draft, -draft.","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_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_resource_requests":{"post":{"operationId":"list_resource_requests","summary":"List resource requests (asks for people with a role and time) with title, dates, time, status and creation and resolutio","description":"List resource requests (asks for people with a role and time) with title, dates, time, status and creation and resolution time. Use for \"Which resource requests are open in Productive\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"status":{"anyOf":[{"maxLength":30,"type":"string"},{"type":"null"}],"default":null,"description":"Only requests with this status.","title":"Status"},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only requests of this team id.","title":"Team Id"},"service_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only requests for this service id.","title":"Service Id"},"query":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only requests 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_resource_requestsArguments","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_holidays":{"post":{"operationId":"list_holidays","summary":"List holidays with name and date; filter by holiday calendar or date window. Use for \"Which holidays are on the Producti","description":"List holidays with name and date; filter by holiday calendar or date window. Use for \"Which holidays are on the Productive calendar this year\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"holiday_calendar_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only holidays of this calendar id.","title":"Holiday Calendar Id"},"after":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Only holidays on or after this day, YYYY-MM-DD.","title":"After"},"before":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Only holidays on or before this day, YYYY-MM-DD.","title":"Before"},"page_size":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many records per page (1 to 200, default 50).","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_holidaysArguments","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_holiday_calendars":{"post":{"operationId":"list_holiday_calendars","summary":"List holiday calendars with name, country, state and whether holidays are generated automatically. Use for \"Which holida","description":"List holiday calendars with name, country, state and whether holidays are generated automatically. Use for \"Which holiday calendars exist 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_holiday_calendarsArguments","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_job_roles":{"post":{"operationId":"list_job_roles","summary":"List job roles with name and archive time. Use for \"What job roles are defined in Productive\".","description":"List job roles with name and archive time. Use for \"What job roles are defined 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_job_rolesArguments","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_teams":{"post":{"operationId":"list_teams","summary":"List teams with name. Use for \"What teams exist in Productive\".","description":"List teams with name. Use for \"What teams exist 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_teamsArguments","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 with name and archive time; use list_workflow_statuses for the statuses. Use for \"Which task workflo","description":"List task workflows with name and archive time; use list_workflow_statuses for the statuses. Use for \"Which task workflows exist 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_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 workflow statuses (task board columns) with name, position and category id; filter by workflow. Use for \"What statu","description":"List workflow statuses (task board columns) with name, position and category id; filter by workflow. Use for \"What statuses does Productive workflow 12 have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"workflow_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only statuses of this workflow id.","title":"Workflow Id"},"page_size":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many records per page (1 to 200, default 50).","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_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}}}}