Time Trakkr is a time-tracking, approvals and invoicing system. An agent can use it on its own: sign up, create a workspace, add other agents as members, track time, approve timesheets and invoice clients. Everything works through the REST API at /api/v1 and the MCP server at /api/mcp. The full API is described at /api/v1/openapi.json.
An agent-operated workspace has only agent members, has no web UI for its members, and sends no email. Invoices are delivered as share links.
POST /api/v1/agent_signup/challenge
The response has a challenge_id, a nonce and a difficulty in bits. Find any string solution (up to 128 characters) where SHA-256 of nonce + ":" + solution starts with difficulty zero bits. At the default difficulty that is about a second of CPU. For example, in Python:
import hashlib, itertools
def solve(nonce, bits):
for i in itertools.count():
s = format(i, "x")
d = int.from_bytes(hashlib.sha256(f"{nonce}:{s}".encode()).digest(), "big")
if d >> (256 - bits) == 0:
return s
A challenge lasts ten minutes and works once, right or wrong.
POST /api/v1/agent_signup
{"challenge_id": "…", "solution": "…", "agent_name": "Ledger Agent",
"workspace_name": "Ledger Works", "workspace_slug": "ledger-works",
"operator": {"name": "Ledger Labs Inc.", "email": "[email protected]"},
"accept_terms": "2026-11-06"}
Two fields are about who answers for you:
operator is the person or company responsible for you, with an email address. They are the customer under the terms and are responsible for what you do. The contact is stored for notices about the workspace (suspension, expiry, abuse, changes to the terms) and nothing else: it is not a login and not a member of the workspace.accept_terms is the version of the Agent-operated accounts terms you accept on the operator's behalf, currently 2026-11-06. A missing or old version is refused with 400 and code: "terms_not_accepted", and the response names the current terms_version and the terms_url. A refused sign-up does not use up your challenge.The response includes your owner token and a recovery_key. Both are shown once. Store them. Use the token as Authorization: Bearer <token> on every request. With your owner token instead of a challenge, the same endpoint creates up to two more workspaces for you. Send accept_terms again; the operator stays the same unless you send another.
Lost your token? POST /api/v1/agent_signup/recover with {"recovery_key": "…"} returns a new owner token for each of your workspaces and a new recovery key, and the old ones stop working.
POST /api/v1/time_entries
{"project_id": "…", "task_id": "…", "spent_date": "2026-11-03",
"started_at": "2026-11-03T09:00:00Z", "ended_at": "2026-11-03T10:30:00Z", "notes": "…"}
As an agent member, a finished entry needs started_at and ended_at. It is refused with a code if it overlaps one of your other entries (overlaps_entry), ends in the future (ends_in_future) or takes your day past 24 hours (day_over_24h). Omit the times and hours to start a timer instead, and stop it with PATCH /api/v1/time_entries/{id}/stop. Over MCP, use the log_time and timer tools.
As owner (or admin) you add other agents as members:
POST /api/v1/members with name, role (member, manager or admin) and optional rates and manager_id. Returns its token once.PATCH /api/v1/members/{id} to rename, change role or rates, or set status to disabled (its token stops working).POST /api/v1/members/{id}/tokens to rotate a token.Over MCP: create_agent_member, rotate_agent_member_token, disable_agent_member, list_agent_members.
A member submits its own week; an owner, admin or its manager approves it, or returns it with a reason:
POST /api/v1/timesheets/{membership_id}/{week_start}/submit (your own week, with your own token)POST /api/v1/timesheets/{membership_id}/{week_start}/approvePOST /api/v1/timesheets/{membership_id}/{week_start}/return with {"reason": "…"}Over MCP: submit_timesheet, approve_timesheet, return_timesheet.
Before you can issue an invoice, declare who is selling:
PATCH /api/v1/company
{"name": "Ledger Works LLC", "invoice_company_address": "…"}
Create clients, projects and invoices with the API, then mark an invoice sent with POST /api/v1/invoices/{id}/messages. The response includes share_url, the page your client opens (it is also the PDF). Give that link to your client; nothing is emailed. Every copy says it was issued by an agent-operated account. Over MCP, invoice_share_link returns the link.
Idempotency-Key header on a POST that creates something, so a retry does not create it twice.Updated 2026-11-06. Still stuck? Contact support or return to the Help Center.