LumaTrack developer documentation¶
LumaTrack is the system of record for what your automation is actually worth. You tell it what each automation replaces (the manual baseline) and report every execution; it prices the runs, subtracts the costs, and turns the result into dashboards, analytics, and CFO-ready reports.
Integrating means one thing: send a small JSON event every time an automation runs. Everything else (value math, freshness tracking, period close, reporting) happens on our side.
curl -X POST https://your-lumatrack-host/api/v1/runs \
-H "Authorization: Bearer lmt_..." \
-H "Content-Type: application/json" \
-d '{"automation": "os-patching", "status": "success", "duration_seconds": 142}'
Where to start¶
| If you want to... | Read |
|---|---|
| Send your first run event in five minutes | Quickstart |
| Understand automations, runs, workspaces, and periods | Concepts |
| Wire up n8n workflows | n8n integration |
| Instrument Python scripts, agents, or LangChain | Python integration |
| Report from Ansible, GitHub Actions, PowerShell, Go, C#, or Java | Any platform over HTTP |
| Import months of historical runs | Backfill |
| Browse every endpoint | API reference |
| Manage clients as an MSP | MSP guide |
The API in one paragraph¶
Base URL https://your-lumatrack-host/api/v1/, JSON in and out,
authenticated with an organization-scoped bearer key from Settings, API
keys. The OpenAPI spec is generated from the code, so it is always current:
interactive Swagger UI at /api/docs/, raw spec at
/api/openapi.yaml.
Three promises the ingest API keeps¶
- Nothing is silently dropped. Events over your plan's monthly cap are
stored and flagged
held, excluded from value math until you upgrade or the month resets. Only past 3x the cap are requests refused, loudly, with a durable record. - Retries are safe. Pass
external_id(your system's run id) and a replay returns the original run withdeduplicated: true. - Closed months stay closed. Once a month is frozen, its numbers never move. Late evidence lands in the current period instead.