API Documentation

Latinum REST API

Build integrations with Latinum. Authenticate with API keys and interact with time entries, invoices, projects, and more.

Authentication

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
Your API key is secret — treat it like a password. Never expose it in client-side code or public repositories.

Base URL

https://app.mylatinum.com/api/v1

All endpoints are relative to this base URL. Responses are JSON.

Rate Limits

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."}

Time Entries

List time entries

GET/time-entries

Returns a paginated list of time entries for the authenticated tenant.

ParameterTypeDescription
project_idintFilter by project
user_idintFilter by team member
billableboolFilter billable/non-billable
start_datedateEntries on or after this date (ISO 8601)
end_datedateEntries on or before this date
limitintPage size (default 50, max 200)
offsetintPagination 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
}

Create a time entry

POST/time-entries
ParameterTypeRequiredDescription
project_idintYesProject to log against
task_idintNoTask category
start_timedatetimeYesStart (ISO 8601)
duration_secondsintYesDuration in seconds
billableboolNoDefault: project's default
notestringNoDescription of work
ticket_idstringNoZendesk 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"

Projects

List projects

GET/projects
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
    }
  ]
}

Invoices

List invoices

GET/invoices
ParameterTypeDescription
statusstringFilter: draft, sent, paid, overdue, void
client_idintFilter by client
start_datedateIssue date on or after
end_datedateIssue date on or before

Get invoice

GET/invoices/{id}

Returns a single invoice with line items, tax breakdown, and payment status.

Clients

List clients

GET/clients
curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://app.mylatinum.com/api/v1/clients"

Create a client

POST/clients
ParameterTypeRequiredDescription
namestringYesClient name
emailstringNoContact email
billing_addressstringNoBilling address
rate_centsintNoDefault hourly rate

Expenses

List expenses

GET/expenses
ParameterTypeDescription
project_idintFilter by project
billableboolFilter billable/non-billable
categorystringFilter by category name
start_datedateExpense date on or after
end_datedateExpense date on or before

Create an expense

POST/expenses
ParameterTypeRequiredDescription
amount_centsintYesAmount in cents
categorystringYesExpense category
project_idintNoLinked project
billableboolNoDefault: false
notestringNoDescription
expense_datedateNoDefault: today
Need an endpoint that's not listed here? Email hello@mylatinum.com and we'll help you out.