{"openapi":"3.1.0","info":{"title":"TimeCamp (BYOK) API","version":"0.1.0","description":"TimeCamp (BYOK) lets an AI assistant read your own TimeCamp data through the TimeCamp API with a key you supply (TimeCamp API token). Read-only: 7 tools (get_me, list_time_entries, list_projects_and_tasks, list_users, get_running_timers, list_groups, list_tag_lists). 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 sent...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-timecamp.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-timecamp/docs"},"termsOfService":"https://connectorbay.com/byok-timecamp/terms"},"servers":[{"url":"https://byok-timecamp.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-timecamp/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/get_me":{"post":{"operationId":"get_me","summary":"Show the TimeCamp user the token belongs to: id, email, display name, registration time, root group and a few permission","description":"Show the TimeCamp user the token belongs to: id, email, display name, registration time, root group and a few permission flags. Use for \"Which TimeCamp user am I connected as\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_meArguments","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 between two dates with user, project/task name, date, start and end time, duration in seconds, billabl","description":"List time entries between two dates with user, project/task name, date, start and end time, duration in seconds, billable flag and description. Both date_from and date_to are required. Use for \"What time did I track in TimeCamp last week\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"date_from":{"description":"First day, YYYY-MM-DD.","maxLength":10,"title":"Date From","type":"string"},"date_to":{"description":"Last day, YYYY-MM-DD.","maxLength":10,"title":"Date To","type":"string"},"user_ids":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Comma-separated user ids, or 'me' for your own entries.","title":"User Ids"},"billable":{"anyOf":[{"enum":["true","false"],"type":"string"},{"type":"null"}],"default":null,"description":"'true' for billable entries only, 'false' for non-billable only.","title":"Billable"}},"required":["date_from","date_to"],"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_projects_and_tasks":{"post":{"operationId":"list_projects_and_tasks","summary":"List projects and tasks (TimeCamp stores both as tasks in a tree) as an object keyed by task id, with name, parent, arch","description":"List projects and tasks (TimeCamp stores both as tasks in a tree) as an object keyed by task id, with name, parent, archived flag, billable flag, budget, assigned users and dates. Filter by status. Use for \"Which active projects exist in TimeCamp\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"status":{"anyOf":[{"enum":["active","archived","all"],"type":"string"},{"type":"null"}],"default":null,"description":"Which tasks: active (default), archived or all.","title":"Status"},"minimal":{"anyOf":[{"enum":["0","1"],"type":"string"},{"type":"null"}],"default":null,"description":"'1' for a smaller answer without permissions and user lists.","title":"Minimal"}},"title":"list_projects_and_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_users":{"post":{"operationId":"list_users","summary":"List the users of the account with email, display name, group, login count and last login time. Optionally only active u","description":"List the users of the account with email, display name, group, login count and last login time. Optionally only active users. Use for \"Who has a TimeCamp login in our account\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"active_only":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True to list only active users.","title":"Active Only"}},"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/get_running_timers":{"post":{"operationId":"get_running_timers","summary":"Show timers that are currently running in the account with user id, task id, name and start time. Use for \"Who has a Tim","description":"Show timers that are currently running in the account with user id, task id, name and start time. Use for \"Who has a TimeCamp timer running right now\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_running_timersArguments","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_groups":{"post":{"operationId":"list_groups","summary":"List the account's user groups with id, name and parent group id. Use for \"What groups exist in TimeCamp\".","description":"List the account's user groups with id, name and parent group id. Use for \"What groups exist in TimeCamp\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_groupsArguments","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_tag_lists":{"post":{"operationId":"list_tag_lists","summary":"List tag lists (and optionally their tags) used to label time entries. Filter by project task or archived state. Use for","description":"List tag lists (and optionally their tags) used to label time entries. Filter by project task or archived state. Use for \"Which tag lists are set up in TimeCamp\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"task_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Only tag lists available for this project/task id.","title":"Task Id"},"archived":{"anyOf":[{"enum":[0,1],"type":"integer"},{"type":"null"}],"default":null,"description":"1 to include archived tag lists, 0 for active only.","title":"Archived"},"tags":{"anyOf":[{"enum":[0,1],"type":"integer"},{"type":"null"}],"default":null,"description":"1 to include the tags inside each list.","title":"Tags"}},"title":"list_tag_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}}}}