{"openapi":"3.1.0","info":{"title":"Timecamp Expenses and Admin (BYOK) API","version":"0.1.0","description":"Timecamp Expenses and Admin (BYOK) lets an AI assistant read your own Timecamp Expenses and Admin data through the Timecamp Expenses and Admin API with a key you supply (TimeCamp API token). Read-only: 6 tools (list_expense_categories, list_expenses, list_custom_field_templates, get_project_time_summary, get_groups_tree, get_logged_time_in_week). The BYOK key travels with each request, is used...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-timecamp-expenses-admin.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-timecamp-expenses-admin/docs"},"termsOfService":"https://connectorbay.com/byok-timecamp-expenses-admin/terms"},"servers":[{"url":"https://byok-timecamp-expenses-admin.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-timecamp-expenses-admin/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_expense_categories":{"post":{"operationId":"list_expense_categories","summary":"List expense categories with colour, unit name, unit price and dates. Needs a token with the expense scope. Use for \"Wha","description":"List expense categories with colour, unit name, unit price and dates. Needs a token with the expense scope. Use for \"What expense categories does TimeCamp have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"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_expenses":{"post":{"operationId":"list_expenses","summary":"List expenses with category, task, amount, billable flag, invoice id and date made, plus the total amount of the whole r","description":"List expenses with category, task, amount, billable flag, invoice id and date made, plus the total amount of the whole result. Paged by limit and page. Use for \"What billable expenses are not yet invoiced in TimeCamp\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"billable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for billable expenses only, false for non-billable only.","title":"Billable"},"invoiced":{"anyOf":[{"maximum":1,"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Invoiced filter as an integer flag (the API documents no values; leave out for all).","title":"Invoiced"},"invoice_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only expenses on this invoice id.","title":"Invoice Id"},"sort_by":{"anyOf":[{"maxLength":30,"type":"string"},{"type":"null"}],"default":"made_at","description":"Field to sort by (default made_at).","title":"Sort By"},"sort_order":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":"desc","description":"Sort order, asc or desc (default desc).","title":"Sort Order"},"limit":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many expenses per page (default 25).","title":"Limit"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"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}},"/v1/tools/list_custom_field_templates":{"post":{"operationId":"list_custom_field_templates","summary":"List custom field templates with name, resource type, field type, required flag and default value. Use for \"Which custom","description":"List custom field templates with name, resource type, field type, required flag and default value. Use for \"Which custom fields are defined in TimeCamp\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_custom_field_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_project_time_summary":{"post":{"operationId":"get_project_time_summary","summary":"Total time tracked on a project task and its subtasks, with first and last entry date (seconds). Use for \"How much time ","description":"Total time tracked on a project task and its subtasks, with first and last entry date (seconds). Use for \"How much time was tracked on TimeCamp project 123456\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_id":{"description":"Numeric id of the project task (from the TimeCamp connector's list_projects_and_tasks).","minimum":1,"title":"Project Id","type":"integer"},"only_accessible_users":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to count only time of users you can access.","title":"Only Accessible Users"}},"required":["project_id"],"title":"get_project_time_summaryArguments","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_groups_tree":{"post":{"operationId":"get_groups_tree","summary":"Show the user group tree visible to you with user counts per group and in its subgroups. Use for \"How is our TimeCamp te","description":"Show the user group tree visible to you with user counts per group and in its subgroups. Use for \"How is our TimeCamp team structured into groups\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_groups_treeArguments","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_logged_time_in_week":{"post":{"operationId":"get_logged_time_in_week","summary":"Seconds logged on each day of the week that contains the given day, for the key's user. Use for \"How much time did I log","description":"Seconds logged on each day of the week that contains the given day, for the key's user. Use for \"How much time did I log in TimeCamp during the week of 2026-10-05\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"day":{"description":"Any day of the week to read, YYYY-MM-DD.","maxLength":10,"title":"Day","type":"string"}},"required":["day"],"title":"get_logged_time_in_weekArguments","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}}}}