Build integrations with Latinum. Authenticate with API keys and interact with time entries, invoices, projects, and more.
All API requests require a Bearer token in the Authorization header. Create an API key in the app under Settings → API.
Authorization: Bearer YOUR_API_KEY
https://app.mylatinum.com/api/v1
All endpoints are relative to this base URL. Responses are JSON.
API requests are limited to 100 requests per minute per API key. If you exceed the limit, you'll receive a 429 Too Many Requests response with a Retry-After header.
HTTP/1.1 429 Too Many Requests
Retry-After: 30
{"detail": "Rate limit exceeded. Try again in 30 seconds."}
Returns a paginated list of time entries for the authenticated tenant.
| Parameter | Type | Description |
|---|---|---|
| project_id | int | Filter by project |
| user_id | int | Filter by team member |
| billable | bool | Filter billable/non-billable |
| start_date | date | Entries on or after this date (ISO 8601) |
| end_date | date | Entries on or before this date |
| limit | int | Page size (default 50, max 200) |
| offset | int | Pagination offset |
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://app.mylatinum.com/api/v1/time-entries?project_id=10&limit=10"
{
"items": [
{
"id": 4521,
"user_id": 15,
"project_id": 10,
"task_id": 7,
"start_time": "2026-10-14T09:00:00",
"end_time": "2026-10-14T11:00:00",
"duration_seconds": 7200,
"billable": true,
"note": "Azure migration planning",
"ticket_id": null,
"ticket_subject": ""
}
],
"total": 1196,
"limit": 10,
"offset": 0
}
| Parameter | Type | Required | Description |
|---|---|---|---|
| project_id | int | Yes | Project to log against |
| task_id | int | No | Task category |
| start_time | datetime | Yes | Start (ISO 8601) |
| duration_seconds | int | Yes | Duration in seconds |
| billable | bool | No | Default: project's default |
| note | string | No | Description of work |
| ticket_id | string | No | Zendesk ticket ID |
curl -X POST -H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"project_id": 10, "start_time": "2026-10-14T09:00:00", "duration_seconds": 7200, "billable": true, "note": "Azure migration planning"}' \
"https://app.mylatinum.com/api/v1/time-entries"
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://app.mylatinum.com/api/v1/projects"
{
"items": [
{
"id": 10,
"code": "CLOUD",
"name": "Cloud Migration",
"client_id": 10,
"billing_type": "fixed_fee",
"budget_cents": 7500000,
"logged_hours": 38.52,
"active": true
}
]
}
| Parameter | Type | Description |
|---|---|---|
| status | string | Filter: draft, sent, paid, overdue, void |
| client_id | int | Filter by client |
| start_date | date | Issue date on or after |
| end_date | date | Issue date on or before |
Returns a single invoice with line items, tax breakdown, and payment status.
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://app.mylatinum.com/api/v1/clients"
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Client name |
| string | No | Contact email | |
| billing_address | string | No | Billing address |
| rate_cents | int | No | Default hourly rate |
| Parameter | Type | Description |
|---|---|---|
| project_id | int | Filter by project |
| billable | bool | Filter billable/non-billable |
| category | string | Filter by category name |
| start_date | date | Expense date on or after |
| end_date | date | Expense date on or before |
| Parameter | Type | Required | Description |
|---|---|---|---|
| amount_cents | int | Yes | Amount in cents |
| category | string | Yes | Expense category |
| project_id | int | No | Linked project |
| billable | bool | No | Default: false |
| note | string | No | Description |
| expense_date | date | No | Default: today |