Concepts
Key concepts for working with the Keito API.
Time Entries
A time entry records work done by a human or agent. Key fields:
| Field | Type | Description |
|---|---|---|
id |
string | Unique identifier |
project_id |
string | The project this work is for |
task_id |
string | The task within the project (optional) |
user_id |
string | The human or agent user |
spent_date |
string | Date the work was performed (YYYY-MM-DD) |
hours |
number | Duration in decimal hours |
notes |
string | Description of work done |
is_running |
boolean | Whether a timer is currently active |
is_billable |
boolean | Whether this entry is billable |
source |
string | Origin: web, cli, api, agent, calendar, desktop |
metadata |
object | Agent context (JSON, max 4KB) |
Expenses
An expense records a cost against a project. For agent work, this is typically LLM token usage.
| Field | Type | Description |
|---|---|---|
id |
string | Unique identifier |
project_id |
string | The project this cost is for |
expense_category_id |
string | Category (e.g., “LLM Usage”) |
spent_date |
string | Date of the expense (YYYY-MM-DD) |
units |
number | Quantity (e.g., tokens in thousands) |
unit_price |
number | Price per unit |
total_cost |
number | Calculated total |
notes |
string | Description |
source |
string | Origin: web, cli, api, agent |
metadata |
object | Agent context (JSON, max 4KB) |
Users
| Field | Type | Description |
|---|---|---|
id |
string | Unique identifier |
name |
string | Display name |
email |
string | Email (agents may use placeholder) |
user_type |
string | human or agent |
is_active |
boolean | Whether the user is active |
Source Values
| Source | Created By | Badge Colour |
|---|---|---|
web |
Keito web app | None |
cli |
Keito CLI | Amber |
api |
Direct REST API call | None |
agent |
AI agent via API or SDK | Violet |
calendar |
Calendar import | Indigo |
desktop |
Keito desktop app | Emerald |
Time entries support all source values above. Expenses currently support web, cli, api, and agent.
Metadata Schema
The metadata field is a freeform JSON object (max 4KB). Recommended fields for agent entries:
{
"agent_id": "string — unique identifier for this agent",
"agent_type": "string — platform: claude-code, codex, cursor, etc.",
"session_id": "string — UUID grouping related entries",
"model": "string — LLM model used",
"input_tokens": "number — input tokens consumed (expenses only)",
"output_tokens": "number — output tokens consumed (expenses only)"
}
Use session_id to correlate a time entry with its corresponding LLM expense.