Hourtick Catalog API
Clients, projects and task types (admins).
Clients, projects and task types (admins).
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
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.curl "https://apis.io/api/v1/apis/hourtick:hourtick-catalog-api"
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.
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: 3.2.0
info:
title: Hourtick Catalog 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: Catalog
description: Clients, projects and task types (admins).
paths:
/api/v1/clients:
get:
tags:
- Catalog
summary: Clients with VAT numbers and active project counts
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
operationId: getApiV1Clients
x-operation-id-source: derived
post:
tags:
- Catalog
summary: Create a client (admins, or an agent an admin allowed), optionally with a VAT…
requestBody:
required: true
content:
application/json:
schema:
$schema: https://json-schema.org/draft/2020-12/schema
type: object
properties:
name:
type: string
minLength: 1
maxLength: 200
vatNumber:
type: string
maxLength: 40
required:
- name
responses:
'201':
description: OK
content:
application/json:
schema:
type: object
operationId: postApiV1Clients
x-operation-id-source: derived
/api/v1/clients/{id}:
patch:
tags:
- Catalog
summary: Rename a client, set or clear its VAT number, set its billing details for…
parameters:
- name: id
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$schema: https://json-schema.org/draft/2020-12/schema
type: object
properties:
name:
type: string
minLength: 1
maxLength: 200
vatNumber:
anyOf:
- type: string
maxLength: 40
- type: 'null'
archived:
type: boolean
billingEmail:
anyOf:
- type: string
maxLength: 200
format: email
pattern: ^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
- type: 'null'
billingAddress:
anyOf:
- type: object
properties:
line1:
type: string
maxLength: 200
line2:
type: string
maxLength: 200
postalCode:
type: string
maxLength: 20
city:
type: string
maxLength: 100
- type: 'null'
country:
anyOf:
- type: string
pattern: ^[A-Z]{2}$
- type: 'null'
invoiceLanguage:
anyOf:
- type: string
enum:
- en
- da
- de
- sv
- nb
- nl
- fr
- es
- fi
- it
- type: 'null'
vatTreatment:
type: string
enum:
- auto
- standard
- reverse_charge
- none
additionalProperties: false
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
'409':
description: Name already used
operationId: patchApiV1ClientsById
x-operation-id-source: derived
/api/v1/projects:
post:
tags:
- Catalog
summary: Create a project (admins, or an agent an admin allowed). Records who added it
requestBody:
required: true
content:
application/json:
schema:
$schema: https://json-schema.org/draft/2020-12/schema
type: object
properties:
name:
type: string
minLength: 1
maxLength: 200
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)$
code:
type: string
maxLength: 50
color:
type: string
pattern: ^#[0-9a-f]{6}$
billingType:
type: string
enum:
- time_materials
- fixed_fee
- non_billable
budgetHours:
anyOf:
- type: number
minimum: 0
maximum: 1000000
- type: 'null'
hourlyRate:
anyOf:
- type: number
minimum: 0
maximum: 1000000
- type: 'null'
required:
- name
- clientId
- color
- billingType
responses:
'201':
description: OK
content:
application/json:
schema:
type: object
operationId: postApiV1Projects
x-operation-id-source: derived
/api/v1/projects/{id}:
patch:
tags:
- Catalog
summary: 'Update a project (admins): billing, budget, rate, task types, archive, and…'
parameters:
- name: id
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$schema: https://json-schema.org/draft/2020-12/schema
type: object
properties:
name:
type: string
minLength: 1
maxLength: 200
color:
type: string
pattern: ^#[0-9a-f]{6}$
billingType:
type: string
enum:
- time_materials
- fixed_fee
- non_billable
budgetHours:
anyOf:
- type: number
minimum: 0
maximum: 1000000
- type: 'null'
hourlyRate:
anyOf:
- type: number
minimum: 0
maximum: 1000000
- type: 'null'
repriceUninvoiced:
type: boolean
archived:
type: boolean
taskIds:
type: array
items:
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)$
memberIds:
maxItems: 1000
type: array
items:
type: string
minLength: 1
maxLength: 100
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
operationId: patchApiV1ProjectsById
x-operation-id-source: derived
/api/v1/tasks:
post:
tags:
- Catalog
summary: Create a task type (admins)
requestBody:
required: true
content:
application/json:
schema:
$schema: https://json-schema.org/draft/2020-12/schema
type: object
properties:
name:
type: string
minLength: 1
maxLength: 200
billable:
type: boolean
required:
- name
responses:
'201':
description: OK
content:
application/json:
schema:
type: object
operationId: postApiV1Tasks
x-operation-id-source: derived
/api/v1/tasks/{id}:
patch:
tags:
- Catalog
summary: Update a task type (admins)
parameters:
- name: id
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$schema: https://json-schema.org/draft/2020-12/schema
type: object
properties:
name:
type: string
minLength: 1
maxLength: 200
billable:
type: boolean
archived:
type: boolean
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
operationId: patchApiV1TasksById
x-operation-id-source: derived
components:
securitySchemes:
bearer:
type: http
scheme: bearer
bearerFormat: ht_… personal API token