{"openapi":"3.1.0","info":{"title":"Productive (BYOK) API","version":"0.1.0","description":"Productive (BYOK) lets an AI assistant read your own Productive data through the Productive API with a key you supply (API token). Read-only: 9 tools (list_projects, list_tasks, list_time_entries, list_people, list_companies, list_deals, list_invoices, list_pages, list_boards). 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.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-productive/docs"},"termsOfService":"https://connectorbay.com/byok-productive/terms"},"servers":[{"url":"https://byok-productive.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-productive/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 name, number, creation and last activity time and archive time; filter by status, name search or comp","description":"List projects with name, number, creation and last activity time and archive time; filter by status, name search or company. Status 1 is active, 2 is archived. Use for \"What active projects do we have in Productive\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"status":{"anyOf":[{"enum":[1,2],"type":"integer"},{"type":"null"}],"default":null,"description":"Project status: 1 active, 2 archived.","title":"Status"},"query":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only projects matching this text.","title":"Query"},"company_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only projects of this company id.","title":"Company Id"},"sort":{"anyOf":[{"enum":["created_at","-created_at","last_activity_at","-last_activity_at","name","-name","number","-number"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort order; prefix '-' for descending. One of: created_at, -created_at, last_activity_at, -last_activity_at, name, -name, number, -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_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 title, task number, due date, estimates and tracked time in minutes, and open or closed state; filter by","description":"List tasks with title, task number, due date, estimates and tracked time in minutes, and open or closed state; filter by project, assignee, status or text. Use for \"Which Productive tasks are open and assigned to person 123\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only tasks of this project id.","title":"Project Id"},"assignee_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only tasks assigned to this person id.","title":"Assignee Id"},"status":{"anyOf":[{"enum":[1,2],"type":"integer"},{"type":"null"}],"default":null,"description":"Task status: 1 open, 2 closed.","title":"Status"},"query":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only tasks matching this text (title and number).","title":"Query"},"task_list_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only tasks in this task list id.","title":"Task List Id"},"sort":{"anyOf":[{"enum":["created_at","-created_at","due_date","-due_date","last_activity_at","-last_activity_at","title","-title"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort order; prefix '-' for descending. One of: created_at, -created_at, due_date, -due_date, last_activity_at, -last_activity_at, title, -title.","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_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_time_entries":{"post":{"operationId":"list_time_entries","summary":"List time entries with date, minutes tracked, billable minutes, note and invoiced flag; filter by person, project, task ","description":"List time entries with date, minutes tracked, billable minutes, note and invoiced flag; filter by person, project, task or dates. Use for \"How much time did person 123 track in Productive last week\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"person_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only entries of this person id.","title":"Person Id"},"project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only entries for this project id.","title":"Project Id"},"task_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only entries for this task id.","title":"Task Id"},"after":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Only entries on or after this date (YYYY-MM-DD).","title":"After"},"before":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Only entries on or before this date (YYYY-MM-DD).","title":"Before"},"sort":{"anyOf":[{"enum":["date","-date"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort order; prefix '-' for descending. One of: date, -date.","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_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_people":{"post":{"operationId":"list_people","summary":"List people with name, job title, join date, last seen time and deactivation time. Status 1 is active, 2 is deactivated.","description":"List people with name, job title, join date, last seen time and deactivation time. Status 1 is active, 2 is deactivated. Use for \"Who is on my Productive team\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"status":{"anyOf":[{"enum":[1,2],"type":"integer"},{"type":"null"}],"default":null,"description":"Person status: 1 active, 2 deactivated.","title":"Status"},"query":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only people matching this text.","title":"Query"},"sort":{"anyOf":[{"enum":["name","-name","title","-title"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort order; prefix '-' for descending. One of: name, -name, title, -title.","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_peopleArguments","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_companies":{"post":{"operationId":"list_companies","summary":"List companies (clients) with name, domain, default currency, company code and archive time. Use for \"Who are my clients","description":"List companies (clients) with name, domain, default currency, company code and archive time. Use for \"Who are my clients in Productive\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"query":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only companies matching this text.","title":"Query"},"sort":{"anyOf":[{"enum":["created_at","-created_at","last_activity_at","-last_activity_at","name","-name"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort order; prefix '-' for descending. One of: created_at, -created_at, last_activity_at, -last_activity_at, name, -name.","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_companiesArguments","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_deals":{"post":{"operationId":"list_deals","summary":"List deals and budgets with name, number, date, probability, value, currency and close time; filter by company, project ","description":"List deals and budgets with name, number, date, probability, value, currency and close time; filter by company, project or text. Use for \"What deals are open in Productive\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"company_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only deals of this company id.","title":"Company Id"},"project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only deals linked to this project id.","title":"Project Id"},"query":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only deals matching this text.","title":"Query"},"sort":{"anyOf":[{"enum":["created_at","-created_at","date","-date","last_activity_at","-last_activity_at","name","-name","number","-number"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort order; prefix '-' for descending. One of: created_at, -created_at, date, -date, last_activity_at, -last_activity_at, name, -name, number, -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_dealsArguments","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, subject, amounts, unpaid amount, currency and key dates; filter by company, project or text. ","description":"List invoices with number, subject, amounts, unpaid amount, currency and key dates; filter by company, project or text. Use for \"Which Productive invoices are unpaid\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"company_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only invoices of this company id.","title":"Company Id"},"project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only invoices for this project id.","title":"Project Id"},"query":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only invoices matching this text.","title":"Query"},"sort":{"anyOf":[{"enum":["created_at","-created_at","invoiced_on","-invoiced_on","last_activity_at","-last_activity_at","number","-number"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort order; prefix '-' for descending. One of: created_at, -created_at, invoiced_on, -invoiced_on, last_activity_at, -last_activity_at, number, -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_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_pages":{"post":{"operationId":"list_pages","summary":"List docs pages with title, parent page, version number, public flag and times (the page body is not included). Use for ","description":"List docs pages with title, parent page, version number, public flag and times (the page body is not included). Use for \"What docs pages exist in Productive\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"sort":{"anyOf":[{"enum":["created_at","-created_at","last_activity_at","-last_activity_at","title","-title"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort order; prefix '-' for descending. One of: created_at, -created_at, last_activity_at, -last_activity_at, title, -title.","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_pagesArguments","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_boards":{"post":{"operationId":"list_boards","summary":"List task boards with name, position and archive time. Use for \"What task boards exist in Productive\".","description":"List task boards with name, position and archive time. Use for \"What task boards 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_boardsArguments","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}}}}