# Hourtick API V1 API

**Canonical:** https://apis.io/apis/hourtick/hourtick-api-v1-api/  
**Provider:** Hourtick — https://apis.io/providers/hourtick/  
**Base URL:** https://hourtick.com  
**Documentation:** https://hourtick.com/announcements

Hourtick API V1 API is one of 2 APIs that [Hourtick](https://apis.io/providers/hourtick/) publishes on the [APIs.io](https://apis.io/) network, described by a machine-readable OpenAPI specification. This API exposes 2 JSON Schema definitions. The published artifact set on APIs.io includes an OpenAPI specification and 2 JSON Schemas.

The Hourtick REST API. Authenticate with a personal API token: create one in **Settings → API tokens**, then send `Authorization: Bearer ht_…`.

## Operations (60 of 134)

| Method | Path | Summary |
|---|---|---|
| GET | `/api/v1/bootstrap` | Current user, workspace, projects and task types |
| GET | `/api/v1/time-entries` | Your time entries in a date range, plus the running entry |
| PATCH | `/api/v1/time-entries` | Edit one or many entries (managers and up) |
| POST | `/api/v1/commands` | Start, stop, continue, create, edit, delete or restore time |
| GET | `/api/v1/reports` | Totals, groups and entries for a period (team scope for managers). For admins, totals and groups also carry the P&L: `peopleCostMinor` (hours × each person's... |
| GET | `/api/v1/stream` | Server-Sent Events: live entry changes for your account and task changes in the workspace |
| GET | `/api/v1/timesheets` | Your status for a week |
| POST | `/api/v1/timesheets` | Submit or withdraw your week |
| GET | `/api/v1/approvals` | Weeks waiting for approval (managers) |
| POST | `/api/v1/approvals` | Approve, send back or reopen a week (managers) |
| POST | `/api/v1/invoicing` | Mark entries as invoiced or not (admins; locks entries) |
| GET | `/api/v1/members` | Workspace members (managers) |
| GET | `/api/v1/cost-rates` | Every member's hourly cost rates, newest first (admins) |
| PUT | `/api/v1/members/{userId}/cost-rate` | Set what an hour of a member costs, from a day on (admins). Effective-dated: time is costed at the rate valid on its day |
| GET | `/api/v1/agent-costs` | Agent cost ledger for a period: an agent's own rows, or all for admins (`agentId` narrows it) |
| POST | `/api/v1/agent-costs` | Report what a piece of work cost (agent token: its own; admins: give agentId). Counts toward the agent's budget and the P&L. Report each cost once (here, MCP... |
| GET | `/api/v1/ai-providers` | AI provider connections for verified agent cost (admins). Keys are never returned, only their last 4 characters |
| POST | `/api/v1/ai-providers` | Connect Anthropic (Admin API key), OpenAI (admin key) or OpenRouter (management key) to read what they billed (admins). The key is checked against the provid... |
| PATCH | `/api/v1/ai-providers/{id}` | Rename, or turn filling in from bills on or off (admins) |
| DELETE | `/api/v1/ai-providers/{id}` | Remove the key, its synced bills and the cost it filled in (admins) |
| GET | `/api/v1/ai-providers/{id}/scopes` | What the key can see (Anthropic workspaces, OpenAI projects and API keys, OpenRouter keys) and which agent each is mapped to (admins) |
| PUT | `/api/v1/ai-providers/{id}/scopes` | Map a scope to an agent, or clear it with agentId null. A scope belongs to one agent (admins) |
| POST | `/api/v1/ai-providers/{id}/sync` | Read the last 30 days of bills now and reconcile (admins). Runs every 6 hours on its own |
| GET | `/api/v1/reports/cost-reconciliation` | Agent cost as reported vs as billed by the providers, per agent and UTC month, with what was filled in (source `provider` in the cost ledger) (admins) |
| GET | `/api/v1/reports/agent-outcomes` | Agent outcomes: tasks with agent work done in the period, with the agent's time and cost plus people's time before (briefing) and after (review and rework) t... |
| GET | `/api/v1/client-ai-reports/preview` | Client AI work report without sharing it: people's and agents' hours, agents and models, and whether a person reviewed each piece of agent work. No rates, co... |
| GET | `/api/v1/client-ai-reports` | Shared client AI work reports, newest first (managers). Links are not listed |
| POST | `/api/v1/client-ai-reports` | Freeze a client AI work report and get a share link (admins). The link (`link.url`) is only in this response; the page is /ai-report/{token} and its JSON /ap... |
| DELETE | `/api/v1/client-ai-reports/{id}` | Revoke a shared report: its link stops working at once (admins) |
| GET | `/api/ai-reports/{token}` | A shared client AI work report as JSON, no account needed (the link is the credential). CORS open |
| DELETE | `/api/v1/agent-costs/{id}` | Remove a wrong cost row (admins) |
| GET | `/api/v1/integrations` | Linear, Notion, Teamwork and Asana: whether each is available and whether you are connected |
| POST | `/api/v1/integrations/{provider}` | Start connecting: returns the vendor's approval address to open in a browser |
| DELETE | `/api/v1/integrations/{provider}` | Disconnect: forgets the tokens and asks the vendor to revoke them where it supports that |
| GET | `/api/v1/work-items/{id}/links` | Items linked to a task, with their current title and status (re-read when older than 5 minutes) |
| POST | `/api/v1/work-items/{id}/links` | Link a Linear issue, Notion page, Teamwork task or Asana task by its address |
| DELETE | `/api/v1/work-items/{id}/links/{linkId}` | Remove a link. Time already sent to Teamwork stays there |
| GET | `/api/v1/notes` | Notes on a project (`projectId`) or client (`clientId`): titles and previews, newest edit first |
| POST | `/api/v1/notes` | Create a note on a project or client |
| GET | `/api/v1/notes/{id}` | One note: title, Tiptap `content`, `markdown`, plain `text` and `version` |
| PATCH | `/api/v1/notes/{id}` | Save a note |
| DELETE | `/api/v1/notes/{id}` | Delete a note (its creator or a manager) |
| GET | `/api/v1/files` | Files on a project (`projectId`) or client (`clientId`), newest first |
| POST | `/api/v1/files` | Upload a file to a project or client (multipart: file, projectId or clientId; up to 25 MB; counts toward usage) |
| GET | `/api/v1/files/{id}` | Open a file: redirects to a short-lived signed URL (`?download=1` to download, `?format=json` for `{ url }`) |
| DELETE | `/api/v1/files/{id}` | Delete a file (its uploader or a manager) |
| GET | `/api/v1/records/counts` | Notes and files per project and client |
| GET | `/api/v1/clients` | Clients with VAT numbers and active project counts |
| POST | `/api/v1/clients` | Create a client (admins, or an agent an admin allowed), optionally with a VAT number. Records who added it |
| GET | `/api/v1/payments` | The workspace's Stripe connection: connected, ready to send invoices, and (admins) account, VAT and payment-term settings |
| PATCH | `/api/v1/payments` | VAT rate (basis points) and label, and default days until due (admins) |
| DELETE | `/api/v1/payments` | Stop sending invoices through the account (admins). The Stripe account, its money and sent invoices stay the business's |
| POST | `/api/v1/payments/connect` | Start or resume Stripe-hosted onboarding and get its one-time URL (admins, people only). The first time it needs `country`, where the business is registered |
| POST | `/api/v1/invoices/preview` | What an invoice would contain: lines, VAT, total, and anything that stops sending (admins; agents for their clients). Changes nothing |
| GET | `/api/v1/invoices` | Invoices, newest first (admins; agents see their clients') |
| POST | `/api/v1/invoices` | Create an invoice from a client's billable time not invoiced yet and send it through Stripe. The time is locked as invoiced. An agent outside its mandate get... |
| GET | `/api/v1/invoices/{id}` | One invoice with its lines, payment page and timesheet link |
| POST | `/api/v1/invoices/{id}/approve` | Approve an agent's invoice waiting outside its mandate, and send it (admins) |
| POST | `/api/v1/invoices/{id}/retry` | Send an invoice again that didn't reach Stripe (admins). Nothing is created twice |
| POST | `/api/v1/invoices/{id}/void` | Void an invoice (or discard one not sent); its time becomes billable again (admins). A paid invoice is refunded in Stripe instead |

…and 74 more operations. They are listed in full on the page.

## Machine-readable artifacts (3)

- **OpenAPI** — https://raw.githubusercontent.com/api-evangelist/hourtick/refs/heads/main/openapi/_original/hourtick-v1-openapi.json
- **JSONSchema** — https://raw.githubusercontent.com/api-evangelist/hourtick/refs/heads/main/json-schema/hourtick-time-entry-schema.json
- **JSONSchema** — https://raw.githubusercontent.com/api-evangelist/hourtick/refs/heads/main/json-schema/hourtick-work-item-schema.json

## Other Hourtick APIs (1)

- [Hourtick API](https://apis.io/apis/hourtick/hourtick-api/)

---

Profiled by [API Evangelist](https://apievangelist.com) and published on [APIs.io](https://apis.io/apis/hourtick/hourtick-api-v1-api/). The API's provider profile, Kin Score and agent-readiness rating are at https://apis.io/providers/hourtick/.
