Work with this as data
Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/hourtick:hourtick-reports-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
OpenAPI Specification
openapi: 3.2.0
info:
title: Hourtick Reports API
version: 1.0.0
description: 'The Hourtick REST API. Authenticate with a personal API token: create one in **Settings → API tokens**, then send `Authorization: Bearer ht_…`.
All timer changes go through **POST /api/v1/commands**, the same endpoint the web and Mac apps use. Commands are idempotent per `commandId` (use a new UUID per action, reuse it to retry safely).
Every response carries a `Server-Time` header (epoch ms). Errors use RFC 9457 problem details.'
servers:
- url: https://hourtick.com
security:
- bearer: []
tags:
- name: Reports
description: Aggregated time and CSV.
paths:
/api/v1/reports:
get:
tags:
- Reports
summary: Totals, groups and entries for a period (team scope for managers).
parameters:
- name: from
in: query
required: true
schema:
type: string
format: date
- name: to
in: query
required: true
schema:
type: string
format: date
- name: groupBy
in: query
schema:
type: string
enum:
- client
- project
- task
- user
- work_item
default: project
description: '`task` groups by task type, `work_item` by task'
- name: userId
in: query
schema:
type: string
- name: clientId
in: query
schema:
type: string
format: uuid
- name: projectId
in: query
schema:
type: string
format: uuid
- name: taskId
in: query
schema:
type: string
format: uuid
description: Task type
- name: workItemId
in: query
schema:
type: string
description: Task id, or `none` for time without a task
- name: billable
in: query
schema:
type: string
enum:
- 'true'
- 'false'
- name: invoiced
in: query
schema:
type: string
enum:
- 'true'
- 'false'
- name: format
in: query
schema:
type: string
enum:
- csv
description: Return CSV instead of JSON
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
description: scope, totals, groups, entries, truncated
'401':
description: Missing or invalid token
content:
application/problem+json:
schema:
$ref: '#/components/schemas/Problem'
'422':
description: Invalid request
content:
application/problem+json:
schema:
$ref: '#/components/schemas/Problem'
operationId: getApiV1Reports
x-operation-id-source: derived
/api/v1/reports/cost-reconciliation:
get:
tags:
- Reports
summary: Agent cost as reported vs as billed by the providers, per agent and UTC month…
parameters:
- name: from
in: query
required: true
schema:
type: string
format: date
- name: to
in: query
required: true
schema:
type: string
format: date
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
operationId: getApiV1ReportsCostReconciliation
x-operation-id-source: derived
/api/v1/reports/agent-outcomes:
get:
tags:
- Reports
summary: 'Agent outcomes: tasks with agent work done in the period, with the agent''s time…'
parameters:
- name: from
in: query
required: true
schema:
type: string
format: date
- name: to
in: query
required: true
schema:
type: string
format: date
- name: agentId
in: query
schema:
type: string
format: uuid
- name: projectId
in: query
schema:
type: string
format: uuid
- name: clientId
in: query
schema:
type: string
format: uuid
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
description: '{ currency, from, to, totals, agents[], tasks[] }'
'403':
description: Managers, admins and agents
operationId: getApiV1ReportsAgentOutcomes
x-operation-id-source: derived
/api/v1/client-ai-reports/preview:
get:
tags:
- Reports
summary: 'Client AI work report without sharing it: people''s and agents'' hours, agents…'
parameters:
- name: clientId
in: query
required: true
schema:
type: string
format: uuid
- name: projectId
in: query
schema:
type: string
format: uuid
- name: from
in: query
required: true
schema:
type: string
format: date
- name: to
in: query
required: true
schema:
type: string
format: date
- name: namePeople
in: query
schema:
type: boolean
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
description: '{ report }'
operationId: getApiV1ClientAiReportsPreview
x-operation-id-source: derived
/api/v1/client-ai-reports:
get:
tags:
- Reports
summary: Shared client AI work reports, newest first (managers). Links are not listed
parameters:
- name: clientId
in: query
schema:
type: string
format: uuid
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
operationId: getApiV1ClientAiReports
x-operation-id-source: derived
post:
tags:
- Reports
summary: Freeze a client AI work report and get a share link (admins).
requestBody:
required: true
content:
application/json:
schema:
$schema: https://json-schema.org/draft/2020-12/schema
type: object
properties:
clientId:
type: string
format: uuid
pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
projectId:
type: string
format: uuid
pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
from:
type: string
to:
type: string
namePeople:
description: Show people's names (who worked, who approved). Off by default
type: boolean
required:
- clientId
- from
- to
responses:
'201':
description: OK
content:
application/json:
schema:
type: object
description: '{ link, report }'
'403':
description: Admins only
operationId: postApiV1ClientAiReports
x-operation-id-source: derived
/api/v1/client-ai-reports/{id}:
delete:
tags:
- Reports
summary: 'Revoke a shared report: its link stops working at once (admins)'
parameters:
- name: id
in: path
required: true
schema:
type: string
format: uuid
responses:
'204':
description: Revoked
operationId: deleteApiV1ClientAiReportsById
x-operation-id-source: derived
/api/ai-reports/{token}:
get:
tags:
- Reports
summary: A shared client AI work report as JSON, no account needed (the link is the…
security: []
parameters:
- name: token
in: path
required: true
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
description: '{ report, fingerprint, createdAt, fingerprintMethod }'
'404':
description: Unknown or revoked
operationId: getApiAiReportsByToken
x-operation-id-source: derived
/api/v1/reports/agents:
get:
tags:
- Reports
summary: Agent session time (how long agents worked on requests), tokens and reported…
parameters:
- name: from
in: query
required: true
schema:
type: string
format: date
- name: to
in: query
required: true
schema:
type: string
format: date
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
operationId: getApiV1ReportsAgents
x-operation-id-source: derived
components:
schemas:
Problem:
type: object
properties:
type:
type: string
title:
type: string
status:
type: integer
detail:
type: string
entry:
$ref: '#/components/schemas/TimeEntry'
conflicts:
type: array
description: 'Bulk edits: entries that blocked the change.'
items:
type: object
properties:
id:
type: string
reason:
type: string
TimeEntry:
type: object
properties:
id:
type: string
format: uuid
workspaceId:
type: string
format: uuid
userId:
type: string
projectId:
type: string
format: uuid
taskId:
type: string
format: uuid
description: Task type
workItemId:
type:
- string
- 'null'
format: uuid
description: The task this time is for, if any
notes:
type: string
spentDate:
type: string
format: date
description: The day the time belongs to (user's time zone).
timezone:
type: string
examples:
- Europe/Copenhagen
accumulatedSeconds:
type: integer
description: Seconds banked from completed runs.
timerStartedAt:
type:
- integer
- 'null'
description: Epoch ms when the current run started; null when stopped.
billable:
type: boolean
lockedReason:
type:
- string
- 'null'
enum:
- null
- invoiced
- approved
- submitted
version:
type: integer
deletedAt:
type:
- integer
- 'null'
createdAt:
type: integer
updatedAt:
type: integer
description: Live duration = accumulatedSeconds + (now − timerStartedAt)/1000 while running.
securitySchemes:
bearer:
type: http
scheme: bearer
bearerFormat: ht_… personal API token