REST API Reference

Base URL:

https://app.keito.ai/api/v2

API v2 is Harvest-compatible: request and response fields use snake_case, dates use YYYY-MM-DD, and paginated collections include entity-specific array keys such as time_entries, projects, tasks, and expenses.

Authentication

API key requests require both headers:

Authorization: Bearer kto_xxxxx
Keito-Account-Id: your_company_id

Find the Company ID in Keito under Settings -> API & Developers -> Company ID.

WorkOS Connect JWT requests do not need Keito-Account-Id; the company is resolved from token claims.

Conventions

  • Dates: YYYY-MM-DD for dates. Report endpoints also accept Harvest-style YYYYMMDD.
  • IDs: Keito returns database IDs such as cm...; do not assume IDs use short prefixes like prj_ or co_.
  • Pagination: collection endpoints use page and per_page. Responses include page, per_page, total_pages, total_entries, and links.
  • Source: source can be web, cli, api, or agent.
  • Metadata: metadata must be a JSON object and is limited to 4KB.

Endpoints

MethodEndpointDescription
GET/api/v2/users/meCurrent authenticated user and company
GET/api/v2/projectsList projects
GET/api/v2/tasksList tasks
GET/api/v2/time_entriesList time entries
POST/api/v2/time_entriesCreate a time entry
PATCH/api/v2/time_entries/:idUpdate a time entry
PATCH/api/v2/time_entries/:id/stopStop a running time entry
DELETE/api/v2/time_entries/:idDelete a time entry
GET/api/v2/expensesList expenses
POST/api/v2/expensesCreate an expense
GET/api/v2/clientsList clients
POST/api/v2/clientsCreate a client
GET/api/v2/contactsList contacts
POST/api/v2/contactsCreate a contact
GET/api/v2/invoicesList invoices
POST/api/v2/invoicesCreate an invoice
GET/api/v2/reports/time/teamTeam time report

Common Query Parameters

ParameterTypeDescription
pagenumberPage number, starting at 1
per_pagenumberResults per page, default 100, max 2000
sourcestringFilter by source: web, cli, api, agent
project_idstringFilter by project
task_idstringFilter by task
user_idstringFilter by user
client_idstringFilter by client
fromstringStart date
tostringEnd date
updated_sincestringISO timestamp lower bound

Example

curl "https://app.keito.ai/api/v2/time_entries?from=2026-05-01&to=2026-05-31" \
  -H "Authorization: Bearer kto_xxxxx" \
  -H "Keito-Account-Id: your_company_id"