Coming soon
Lite
One small site — monthly rosters up to 30 workers.
- Up to 30 workers × 31 days per solve
- Burst of 3 concurrent solves, queue of 5
- Up to 60 solves / hour
- Extra concurrency slots available
- Self-serve API keys & usage dashboard
Constraint-based assignment API
Send a complete problem under your rules — get a feasible assignment back. Shift scheduling is live today; more presets as the engine grows.
You keep names, HR data, and UI. Each solve sends a full ScheduleRequest — period, shifts, constraints, and opaque worker IDs — then polls for an ID-only assignment.
Sign in, subscribe, and create a key from your account. Keys authenticate the solve API only.
# Authenticate every solve request -H "Authorization: Bearer $API_KEY"
# Authenticate every solve request • -H "Authorization: Bearer $API_KEY"
Queue a shift-scheduling solve. The API returns 202 with a schedule_id. Quotas and size caps are checked before the solver runs.
# Queue a solve (use the example ScheduleRequest) curl -sS -X POST "$API/v1/schedules" \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d @schedule_request.json # → {"schedule_id":"…"}
# Queue a solve (use the example ScheduleRequest) curl -sS -X POST "$API/v1/schedules" • -H "Authorization: Bearer $API_KEY" • -H "Content-Type: application/json" • -d @schedule_request.json # → {"schedule_id":"…"}
{ "schema_version": "1", "label": "small-team-two-weeks", "period": { "start_date": "2026-08-03", "end_date": "2026-08-16" }, "shifts": { "slots": { "M": { "minutes": 480, "action": "work", "triggers_rest_next_day": false, "staff_coverage": { "count": 2, "by_weekday": { "Mon": { "count": 3 }, "Tue": { "count": 3 }, "Wed": { "count": 3 }, "Thu": { "count": 3 }, "Fri": { "count": 3 } } } }, "N": { "minutes": 600, "action": "work", "triggers_rest_next_day": true, "staff_coverage": { "count": 1 } }, "R": { "minutes": 0, "action": "rest" }, "O": { "minutes": 0, "action": "off_day" }, "V": { "minutes": 0, "action": "vacation" } }, "combos": {} }, "rules": { "schedule_rules": { "spread_constraints": [ { "shift_type": "N", "window_days": 4, "max_shifts": 1 } ], "balance_shift_types": ["M", "N"] }, "max_consecutive_days_off": 3, "max_consecutive_work_days": 6 }, "workers": { "1": { "minutes_carried_over": 600 }, "2": { "minutes_carried_over": -300, "preferences": { "2026-08-10": "O" } }, "3": { "minutes_carried_over": 0, "shift_limits": { "max": { "N": 2 } } }, "4": { "minutes_carried_over": 480, "fixed_date_exceptions": { "2026-08-05": "O" } }, "5": { "minutes_carried_over": -120 }, "6": { "minutes_carried_over": 240 }, "7": { "minutes_carried_over": 0 }, "8": { "minutes_carried_over": 0 } } }
• "schema_version": "1" • "label": "small-team-two-weeks" • "period": { "start_date": "2026-08-03", "end_date": "2026-08-16" } • "shifts": { "slots": { "M": { "minutes": 480, "action": "work", "triggers_rest_next_day": false, "staff_coverage": { "count": 2, "by_weekday": { "Mon": { "count": 3 }, "Tue": { "count": 3 }, "Wed": { "count": 3 }, "Thu": { "count": 3 }, "Fri": { "count": 3 } } } }, "N": { "minutes": 600, "action": "work", "triggers_rest_next_day": true, "staff_coverage": { "count": 1 } }, "R": { "minutes": 0, "action": "rest" }, "O": { "minutes": 0, "action": "off_day" }, "V": { "minutes": 0, "action": "vacation" } }, "combos": {} } • "rules": { "schedule_rules": { "spread_constraints": [ { "shift_type": "N", "window_days": 4, "max_shifts": 1 } ], "balance_shift_types": [ "M", "N" ] }, "max_consecutive_days_off": 3, "max_consecutive_work_days": 6 } • "workers": { "1": { "minutes_carried_over": 600 }, "2": { "minutes_carried_over": -300, "preferences": { "2026-08-10": "O" } }, "3": { "minutes_carried_over": 0, "shift_limits": { "max": { "N": 2 } } }, "4": { "minutes_carried_over": 480, "fixed_date_exceptions": { "2026-08-05": "O" } }, "5": { "minutes_carried_over": -120 }, "6": { "minutes_carried_over": 240 }, "7": { "minutes_carried_over": 0 }, "8": { "minutes_carried_over": 0 } }
Repeat until status is SUCCESS, FAILURE, or CANCELLED. While waiting you will see QUEUED then RUNNING. Map worker IDs back in your system.
# Wait up to 30s per call; repeat until SUCCESS or FAILURE curl -sS "$API/v1/schedules/$SCHEDULE_ID?wait=30" \ -H "Authorization: Bearer $API_KEY" # → {"status":"SUCCESS","result":{…}}
# Wait up to 30s per call; repeat until SUCCESS or FAILURE curl -sS "$API/v1/schedules/$SCHEDULE_ID?wait=30" • -H "Authorization: Bearer $API_KEY" # → {"status":"SUCCESS","result":{…}}
{ "schedule_id": "f2e5516f-6e22-4b78-bcec-3f3028aa1620", "status": "SUCCESS", "result": { "schema_version": "1", "engine_version": "0.1.0", "preset_version": null, "valid": true, "status": "Optimal", "objective_value": 1575, "solver_elapsed_seconds": 0.54, "period": { "start_date": "2026-08-03", "end_date": "2026-08-16" }, "combos": [ "M", "N", "R", "O", "V" ], "schedule": { "1": [ { "date": "2026-08-03", "combo": "O" }, { "date": "2026-08-04", "combo": "O" }, { "date": "2026-08-05", "combo": "M" }, { "date": "2026-08-06", "combo": "O" }, { "date": "2026-08-07", "combo": "O" }, { "date": "2026-08-08", "combo": "M" }, { "date": "2026-08-09", "combo": "M" }, { "date": "2026-08-10", "combo": "M" }, { "date": "2026-08-11", "combo": "O" }, { "date": "2026-08-12", "combo": "M" }, { "date": "2026-08-13", "combo": "M" }, { "date": "2026-08-14", "combo": "O" }, { "date": "2026-08-15", "combo": "O" }, { "date": "2026-08-16", "combo": "O" } ], "2": [ { "date": "2026-08-03", "combo": "N" }, { "date": "2026-08-04", "combo": "R" }, { "date": "2026-08-05", "combo": "O" }, { "date": "2026-08-06", "combo": "M" }, { "date": "2026-08-07", "combo": "N" }, { "date": "2026-08-08", "combo": "R" }, { "date": "2026-08-09", "combo": "M" }, { "date": "2026-08-10", "combo": "O" }, { "date": "2026-08-11", "combo": "N" }, { "date": "2026-08-12", "combo": "R" }, { "date": "2026-08-13", "combo": "M" }, { "date": "2026-08-14", "combo": "M" }, { "date": "2026-08-15", "combo": "O" }, { "date": "2026-08-16", "combo": "O" } ], "3": [ { "date": "2026-08-03", "combo": "R" }, { "date": "2026-08-04", "combo": "N" }, { "date": "2026-08-05", "combo": "R" }, { "date": "2026-08-06", "combo": "O" }, { "date": "2026-08-07", "combo": "M" }, { "date": "2026-08-08", "combo": "O" }, { "date": "2026-08-09", "combo": "O" }, { "date": "2026-08-10", "combo": "M" }, { "date": "2026-08-11", "combo": "O" }, { "date": "2026-08-12", "combo": "M" }, { "date": "2026-08-13", "combo": "M" }, { "date": "2026-08-14", "combo": "M" }, { "date": "2026-08-15", "combo": "N" }, { "date": "2026-08-16", "combo": "R" } ], "4": [ { "date": "2026-08-03", "combo": "O" }, { "date": "2026-08-04", "combo": "M" }, { "date": "2026-08-05", "combo": "O" }, { "date": "2026-08-06", "combo": "M" }, { "date": "2026-08-07", "combo": "O" }, { "date": "2026-08-08", "combo": "O" }, { "date": "2026-08-09", "combo": "O" }, { "date": "2026-08-10", "combo": "M" }, { "date": "2026-08-11", "combo": "M" }, { "date": "2026-08-12", "combo": "O" }, { "date": "2026-08-13", "combo": "O" }, { "date": "2026-08-14", "combo": "O" }, { "date": "2026-08-15", "combo": "M" }, { "date": "2026-08-16", "combo": "M" } ], "5": [ { "date": "2026-08-03", "combo": "O" }, { "date": "2026-08-04", "combo": "M" }, { "date": "2026-08-05", "combo": "M" }, { "date": "2026-08-06", "combo": "M" }, { "date": "2026-08-07", "combo": "O" }, { "date": "2026-08-08", "combo": "N" }, { "date": "2026-08-09", "combo": "R" }, { "date": "2026-08-10", "combo": "O" }, { "date": "2026-08-11", "combo": "M" }, { "date": "2026-08-12", "combo": "N" }, { "date": "2026-08-13", "combo": "R" }, { "date": "2026-08-14", "combo": "M" }, { "date": "2026-08-15", "combo": "O" }, { "date": "2026-08-16", "combo": "O" } ], "6": [ { "date": "2026-08-03", "combo": "M" }, { "date": "2026-08-04", "combo": "O" }, { "date": "2026-08-05", "combo": "N" }, { "date": "2026-08-06", "combo": "R" }, { "date": "2026-08-07", "combo": "M" }, { "date": "2026-08-08", "combo": "O" }, { "date": "2026-08-09", "combo": "O" }, { "date": "2026-08-10", "combo": "O" }, { "date": "2026-08-11", "combo": "M" }, { "date": "2026-08-12", "combo": "O" }, { "date": "2026-08-13", "combo": "O" }, { "date": "2026-08-14", "combo": "O" }, { "date": "2026-08-15", "combo": "M" }, { "date": "2026-08-16", "combo": "N" } ], "7": [ { "date": "2026-08-03", "combo": "M" }, { "date": "2026-08-04", "combo": "O" }, { "date": "2026-08-05", "combo": "M" }, { "date": "2026-08-06", "combo": "N" }, { "date": "2026-08-07", "combo": "R" }, { "date": "2026-08-08", "combo": "O" }, { "date": "2026-08-09", "combo": "O" }, { "date": "2026-08-10", "combo": "N" }, { "date": "2026-08-11", "combo": "R" }, { "date": "2026-08-12", "combo": "O" }, { "date": "2026-08-13", "combo": "O" }, { "date": "2026-08-14", "combo": "N" }, { "date": "2026-08-15", "combo": "R" }, { "date": "2026-08-16", "combo": "M" } ], "8": [ { "date": "2026-08-03", "combo": "M" }, { "date": "2026-08-04", "combo": "M" }, { "date": "2026-08-05", "combo": "O" }, { "date": "2026-08-06", "combo": "O" }, { "date": "2026-08-07", "combo": "M" }, { "date": "2026-08-08", "combo": "M" }, { "date": "2026-08-09", "combo": "N" }, { "date": "2026-08-10", "combo": "R" }, { "date": "2026-08-11", "combo": "O" }, { "date": "2026-08-12", "combo": "M" }, { "date": "2026-08-13", "combo": "N" }, { "date": "2026-08-14", "combo": "R" }, { "date": "2026-08-15", "combo": "O" }, { "date": "2026-08-16", "combo": "O" } ] }, "worked_minutes": null, "labor_cost": null, "worker_minutes": { "1": 2880, "2": 3720, "3": 3600, "4": 2880, "5": 3600, "6": 3120, "7": 3240, "8": 3600 } } }
• "schedule_id": "f2e5516f-6e22-4b78-bcec-3f3028aa1620" • "status": "SUCCESS" • "result": { "schema_version": "1", "engine_version": "0.1.0", "preset_version": null, "valid": true, "status": "Optimal", "objective_value": 1575, "solver_elapsed_seconds": 0.54, "period": { "start_date": "2026-08-03", "end_date": "2026-08-16" }, "combos": [ "M", "N", "R", "O", "V" ], "schedule": { "1": [ { "date": "2026-08-03", "combo": "O" }, { "date": "2026-08-04", "combo": "O" }, { "date": "2026-08-05", "combo": "M" }, { "date": "2026-08-06", "combo": "O" }, { "date": "2026-08-07", "combo": "O" }, { "date": "2026-08-08", "combo": "M" }, { "date": "2026-08-09", "combo": "M" }, { "date": "2026-08-10", "combo": "M" }, { "date": "2026-08-11", "combo": "O" }, { "date": "2026-08-12", "combo": "M" }, { "date": "2026-08-13", "combo": "M" }, { "date": "2026-08-14", "combo": "O" }, { "date": "2026-08-15", "combo": "O" }, { "date": "2026-08-16", "combo": "O" } ], "2": [ { "date": "2026-08-03", "combo": "N" }, { "date": "2026-08-04", "combo": "R" }, { "date": "2026-08-05", "combo": "O" }, { "date": "2026-08-06", "combo": "M" }, { "date": "2026-08-07", "combo": "N" }, { "date": "2026-08-08", "combo": "R" }, { "date": "2026-08-09", "combo": "M" }, { "date": "2026-08-10", "combo": "O" }, { "date": "2026-08-11", "combo": "N" }, { "date": "2026-08-12", "combo": "R" }, { "date": "2026-08-13", "combo": "M" }, { "date": "2026-08-14", "combo": "M" }, { "date": "2026-08-15", "combo": "O" }, { "date": "2026-08-16", "combo": "O" } ], "3": [ { "date": "2026-08-03", "combo": "R" }, { "date": "2026-08-04", "combo": "N" }, { "date": "2026-08-05", "combo": "R" }, { "date": "2026-08-06", "combo": "O" }, { "date": "2026-08-07", "combo": "M" }, { "date": "2026-08-08", "combo": "O" }, { "date": "2026-08-09", "combo": "O" }, { "date": "2026-08-10", "combo": "M" }, { "date": "2026-08-11", "combo": "O" }, { "date": "2026-08-12", "combo": "M" }, { "date": "2026-08-13", "combo": "M" }, { "date": "2026-08-14", "combo": "M" }, { "date": "2026-08-15", "combo": "N" }, { "date": "2026-08-16", "combo": "R" } ], "4": [ { "date": "2026-08-03", "combo": "O" }, { "date": "2026-08-04", "combo": "M" }, { "date": "2026-08-05", "combo": "O" }, { "date": "2026-08-06", "combo": "M" }, { "date": "2026-08-07", "combo": "O" }, { "date": "2026-08-08", "combo": "O" }, { "date": "2026-08-09", "combo": "O" }, { "date": "2026-08-10", "combo": "M" }, { "date": "2026-08-11", "combo": "M" }, { "date": "2026-08-12", "combo": "O" }, { "date": "2026-08-13", "combo": "O" }, { "date": "2026-08-14", "combo": "O" }, { "date": "2026-08-15", "combo": "M" }, { "date": "2026-08-16", "combo": "M" } ], "5": [ { "date": "2026-08-03", "combo": "O" }, { "date": "2026-08-04", "combo": "M" }, { "date": "2026-08-05", "combo": "M" }, { "date": "2026-08-06", "combo": "M" }, { "date": "2026-08-07", "combo": "O" }, { "date": "2026-08-08", "combo": "N" }, { "date": "2026-08-09", "combo": "R" }, { "date": "2026-08-10", "combo": "O" }, { "date": "2026-08-11", "combo": "M" }, { "date": "2026-08-12", "combo": "N" }, { "date": "2026-08-13", "combo": "R" }, { "date": "2026-08-14", "combo": "M" }, { "date": "2026-08-15", "combo": "O" }, { "date": "2026-08-16", "combo": "O" } ], "6": [ { "date": "2026-08-03", "combo": "M" }, { "date": "2026-08-04", "combo": "O" }, { "date": "2026-08-05", "combo": "N" }, { "date": "2026-08-06", "combo": "R" }, { "date": "2026-08-07", "combo": "M" }, { "date": "2026-08-08", "combo": "O" }, { "date": "2026-08-09", "combo": "O" }, { "date": "2026-08-10", "combo": "O" }, { "date": "2026-08-11", "combo": "M" }, { "date": "2026-08-12", "combo": "O" }, { "date": "2026-08-13", "combo": "O" }, { "date": "2026-08-14", "combo": "O" }, { "date": "2026-08-15", "combo": "M" }, { "date": "2026-08-16", "combo": "N" } ], "7": [ { "date": "2026-08-03", "combo": "M" }, { "date": "2026-08-04", "combo": "O" }, { "date": "2026-08-05", "combo": "M" }, { "date": "2026-08-06", "combo": "N" }, { "date": "2026-08-07", "combo": "R" }, { "date": "2026-08-08", "combo": "O" }, { "date": "2026-08-09", "combo": "O" }, { "date": "2026-08-10", "combo": "N" }, { "date": "2026-08-11", "combo": "R" }, { "date": "2026-08-12", "combo": "O" }, { "date": "2026-08-13", "combo": "O" }, { "date": "2026-08-14", "combo": "N" }, { "date": "2026-08-15", "combo": "R" }, { "date": "2026-08-16", "combo": "M" } ], "8": [ { "date": "2026-08-03", "combo": "M" }, { "date": "2026-08-04", "combo": "M" }, { "date": "2026-08-05", "combo": "O" }, { "date": "2026-08-06", "combo": "O" }, { "date": "2026-08-07", "combo": "M" }, { "date": "2026-08-08", "combo": "M" }, { "date": "2026-08-09", "combo": "N" }, { "date": "2026-08-10", "combo": "R" }, { "date": "2026-08-11", "combo": "O" }, { "date": "2026-08-12", "combo": "M" }, { "date": "2026-08-13", "combo": "N" }, { "date": "2026-08-14", "combo": "R" }, { "date": "2026-08-15", "combo": "O" }, { "date": "2026-08-16", "combo": "O" } ] }, "worked_minutes": null, "labor_cost": null, "worker_minutes": { "1": 2880, "2": 3720, "3": 3600, "4": 2880, "5": 3600, "6": 3120, "7": 3240, "8": 3600 } }
Per-solve size and burst concurrency, with extra concurrency when you need it.
Coming soon
One small site — monthly rosters up to 30 workers.
Coming soon
Larger teams — monthly rosters up to 55 workers.
Coming soon
Larger rosters, more concurrency, and longer planning horizons.
Coming soon
Even larger sites.
Capacity-based fair use — embed it, resell it, run several companies on it. Terms.