API v1

API documentation

Manage people, projects and tasks, run the optimizer, and pull solve data programmatically. Every call is scoped to your organization and metered the same way in-app actions are.

Authentication

Create a key from the APIpage once you're logged in (account owner only). Send it as a bearer token on every request:

curl https://your-domain/api/v1/people \
  -H "Authorization: Bearer sk_live_..."

The full key is shown only once, at creation time — store it somewhere safe. Revoking a key from the API page takes effect immediately.

Branches

Every resource lives in a branch (branch). Requests default to your org's main branch; target a specific branch with ?scenario=<scenario_id>, using the branch's public id (visible in the app's Manage Branches page URL).

Endpoints

MethodPathDescription
GET/api/v1/peopleList people in a branch.
POST/api/v1/peopleCreate a person (defaults to Mon–Fri 09:00–17:00 GMT availability).
GET/api/v1/people/{id}Get one person.
PATCH/api/v1/people/{id}Update a person.
DELETE/api/v1/people/{id}Delete a person (sirat-scoped — never affects other branches).
GET/api/v1/projectsList projects in a branch.
POST/api/v1/projectsCreate a project.
GET/api/v1/projects/{id}Get one project.
PATCH/api/v1/projects/{id}Update a project.
DELETE/api/v1/projects/{id}Delete a project.
GET/api/v1/projects/{id}/tasksList tasks under a project.
POST/api/v1/projects/{id}/tasksCreate a task under a project.
GET/api/v1/tasks/{id}Get one task.
PATCH/api/v1/tasks/{id}Update a task.
DELETE/api/v1/tasks/{id}Delete a task.
GET/api/v1/solvesList solves run in a branch. Async — solves start 'queued', then 'solving', then a final status.
POST/api/v1/solvesQueue a solve over a date range; returns immediately, poll for the result.
GET/api/v1/solves/{id}Get a solve's status, totals and every assignment.
DELETE/api/v1/solves/{id}Delete a solve.
GET/api/v1/solves/batchesList batch solves for the org.
POST/api/v1/solves/batchesTrigger the same solve conditions across several branches (or all of them) at once.
GET/api/v1/solves/batches/{id}Get a batch's solves, with the best-scoring one flagged for comparison.
GET/api/v1/solves/scheduledList scheduled/recurring solves.
POST/api/v1/solves/scheduledCreate a scheduled/recurring solve with a relative start offset.
PATCH/api/v1/solves/scheduled/{id}Pause or resume a scheduled solve.
DELETE/api/v1/solves/scheduled/{id}Delete a scheduled solve.
GET/api/v1/changesRead the audit trail (add ?scope=org for every user's changes, admin keys only).

Requests and responses are JSON. Successful responses are shaped { data: ... }; errors are { error: "..." } with a non-2xx status.

Example: add a person, run a solve, get the data

# Add a person
curl -X POST https://your-domain/api/v1/people \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{"name": "Amara Okafor"}'

# Run the optimizer over a date range
curl -X POST https://your-domain/api/v1/solves \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{"start_date": "2026-08-01", "end_date": "2026-08-28"}'

# Pull the resulting assignments
curl https://your-domain/api/v1/solves/<solve_id> \
  -H "Authorization: Bearer sk_live_..."

API access by plan

PlanAPI access
ScientistNot included
ExplorerNot included
CrewIncluded, subject to your plan's call limit
SatelliteIncluded, subject to your plan's call limit
Custom OrderIncluded, subject to your plan's call limit

See pricingfor full plan details. Every call — API or in-app — counts against your plan's limits; see the API page once logged in.

Get an API key

Log in, open API, and create a key (account owner only).

Log in to create a key