{"openapi":"3.1.0","info":{"title":"Harvest Estimates and Setup (BYOK) API","version":"0.1.0","description":"Harvest Estimates and Setup (BYOK) lets an AI assistant read your own Harvest Estimates and Setup data through the Harvest Estimates and Setup API with a key you supply (personal access token). Read-only: 9 tools (list_estimates, list_estimate_item_categories, list_invoice_item_categories, list_expense_categories, list_roles, list_project_user_assignments, list_project_task_assignments,...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-harvest-estimates-setup.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-harvest-estimates-setup/docs"},"termsOfService":"https://connectorbay.com/byok-harvest-estimates-setup/terms"},"servers":[{"url":"https://byok-harvest-estimates-setup.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-harvest-estimates-setup/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 (newest issue date first) with number, client, subject, amount, tax, discount, currency, state and sent, ","description":"List estimates (newest issue date first) with number, client, subject, amount, tax, discount, currency, state and sent, accepted and declined times. Needs Administrator or a Manager who can edit estimates. Use for \"Which Harvest estimates are still waiting for an answer\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"client_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only estimates of this client id.","title":"Client Id"},"state":{"anyOf":[{"enum":["draft","sent","accepted","declined"],"type":"string"},{"type":"null"}],"default":null,"description":"Only estimates in this state.","title":"State"},"from_date":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Only estimates issued on or after this date (YYYY-MM-DD).","title":"From Date"},"to_date":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Only estimates issued on or before this date (YYYY-MM-DD).","title":"To Date"},"updated_since":{"anyOf":[{"maxLength":30,"type":"string"},{"type":"null"}],"default":null,"description":"Only records updated on or after this ISO 8601 time, for example 2026-01-01T00:00:00Z.","title":"Updated Since"},"per_page":{"anyOf":[{"maximum":2000,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many records per page (1 to 2000, default 100).","title":"Per Page"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. The answer includes total_pages and next_page.","title":"Page"}},"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_estimate_item_categories":{"post":{"operationId":"list_estimate_item_categories","summary":"List the categories usable on estimate line items (such as Service or Product). Use for \"What estimate item categories d","description":"List the categories usable on estimate line items (such as Service or Product). Use for \"What estimate item categories does Harvest have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"updated_since":{"anyOf":[{"maxLength":30,"type":"string"},{"type":"null"}],"default":null,"description":"Only records updated on or after this ISO 8601 time, for example 2026-01-01T00:00:00Z.","title":"Updated Since"},"per_page":{"anyOf":[{"maximum":2000,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many records per page (1 to 2000, default 100).","title":"Per Page"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. The answer includes total_pages and next_page.","title":"Page"}},"title":"list_estimate_item_categoriesArguments","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_item_categories":{"post":{"operationId":"list_invoice_item_categories","summary":"List the categories usable on invoice line items, with whether each is used for billable hours or expenses. Needs Admini","description":"List the categories usable on invoice line items, with whether each is used for billable hours or expenses. Needs Administrator or Project Manager. Use for \"What invoice item categories does Harvest have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"updated_since":{"anyOf":[{"maxLength":30,"type":"string"},{"type":"null"}],"default":null,"description":"Only records updated on or after this ISO 8601 time, for example 2026-01-01T00:00:00Z.","title":"Updated Since"},"per_page":{"anyOf":[{"maximum":2000,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many records per page (1 to 2000, default 100).","title":"Per Page"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. The answer includes total_pages and next_page.","title":"Page"}},"title":"list_invoice_item_categoriesArguments","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_expense_categories":{"post":{"operationId":"list_expense_categories","summary":"List expense categories with unit name, unit price and active flag. Needs Administrator. Use for \"What expense categorie","description":"List expense categories with unit name, unit price and active flag. Needs Administrator. Use for \"What expense categories exist in Harvest\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for only active expense categories, false for only inactive ones. Leave out for all.","title":"Is Active"},"updated_since":{"anyOf":[{"maxLength":30,"type":"string"},{"type":"null"}],"default":null,"description":"Only records updated on or after this ISO 8601 time, for example 2026-01-01T00:00:00Z.","title":"Updated Since"},"per_page":{"anyOf":[{"maximum":2000,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many records per page (1 to 2000, default 100).","title":"Per Page"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. The answer includes total_pages and next_page.","title":"Page"}},"title":"list_expense_categoriesArguments","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_roles":{"post":{"operationId":"list_roles","summary":"List roles used to group people, with the ids of the users in each. Needs Administrator. Use for \"Which roles are define","description":"List roles used to group people, with the ids of the users in each. Needs Administrator. Use for \"Which roles are defined in Harvest\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"per_page":{"anyOf":[{"maximum":2000,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many records per page (1 to 2000, default 100).","title":"Per Page"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. The answer includes total_pages and next_page.","title":"Page"}},"title":"list_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_project_user_assignments":{"post":{"operationId":"list_project_user_assignments","summary":"List which users are assigned to which projects (active and archived) with project manager flag and per-person budget; c","description":"List which users are assigned to which projects (active and archived) with project manager flag and per-person budget; custom rates are not returned. Needs Administrator or a Manager with assigned teammates or managed projects. Use for \"Who is assigned to which Harvest project\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only assignments of this user id.","title":"User Id"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for only active assignments, false for only inactive ones. Leave out for all.","title":"Is Active"},"updated_since":{"anyOf":[{"maxLength":30,"type":"string"},{"type":"null"}],"default":null,"description":"Only records updated on or after this ISO 8601 time, for example 2026-01-01T00:00:00Z.","title":"Updated Since"},"per_page":{"anyOf":[{"maximum":2000,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many records per page (1 to 2000, default 100).","title":"Per Page"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. The answer includes total_pages and next_page.","title":"Page"}},"title":"list_project_user_assignmentsArguments","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_task_assignments":{"post":{"operationId":"list_project_task_assignments","summary":"List which tasks are enabled on which projects with billable and active flags and per-task budget; rates are not returne","description":"List which tasks are enabled on which projects with billable and active flags and per-task budget; rates are not returned. Needs Administrator or Project Manager. Use for \"Which tasks can be tracked on each Harvest project\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for only active assignments, false for only inactive ones. Leave out for all.","title":"Is Active"},"updated_since":{"anyOf":[{"maxLength":30,"type":"string"},{"type":"null"}],"default":null,"description":"Only records updated on or after this ISO 8601 time, for example 2026-01-01T00:00:00Z.","title":"Updated Since"},"per_page":{"anyOf":[{"maximum":2000,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many records per page (1 to 2000, default 100).","title":"Per Page"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. The answer includes total_pages and next_page.","title":"Page"}},"title":"list_project_task_assignmentsArguments","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_tags":{"post":{"operationId":"list_tags","summary":"List the account's project tag vocabulary (beta endpoint; needs project tags enabled in the account). Use for \"What proj","description":"List the account's project tag vocabulary (beta endpoint; needs project tags enabled in the account). Use for \"What project tags exist in Harvest\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"updated_since":{"anyOf":[{"maxLength":30,"type":"string"},{"type":"null"}],"default":null,"description":"Only records updated on or after this ISO 8601 time, for example 2026-01-01T00:00:00Z.","title":"Updated Since"},"per_page":{"anyOf":[{"maximum":2000,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many records per page (1 to 2000, default 100).","title":"Per Page"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. The answer includes total_pages and next_page.","title":"Page"}},"title":"list_tagsArguments","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 Harvest account's settings: name, plan, week start, time and date formats, weekly capacity in seconds, and whic","description":"Show the Harvest account's settings: name, plan, week start, time and date formats, weekly capacity in seconds, and which modules (expenses, invoices, estimates, approvals, teams) are on. Needs Administrator. Use for \"What plan and modules does our Harvest account have\".","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}}}}