Constraint-based assignment API

Feasible shift schedules, from one API call.

Send a complete problem under your rules — get a feasible assignment back. Shift scheduling is live today; more presets as the engine grows.

How it works

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.

  1. 1

    Issue an API key

    Authorization header

    Sign in, subscribe, and create a key from your account. Keys authenticate the solve API only.

    Shell
    # Authenticate every solve request
    -H "Authorization: Bearer $API_KEY"
    
    # Authenticate every solve request
    • -H "Authorization: Bearer $API_KEY"
    
  2. 2

    POST a problem

    POST/v1/schedules

    Queue a shift-scheduling solve. The API returns 202 with a schedule_id. Quotas and size caps are checked before the solver runs.

    Shell
    # 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":"…"}
    
    schedule_request.json
    {
      "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
        }
      }
    
  3. 3

    Poll the schedule

    GET/v1/schedules/{id}

    Repeat until status is SUCCESS, FAILURE, or CANCELLED. While waiting you will see QUEUED then RUNNING. Map worker IDs back in your system.

    Shell
    # 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":{…}}
    
    200
    {
      "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
        }
      }
    

Plans

Per-solve size and burst concurrency, with extra concurrency when you need it.

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

Coming soon

Pro

Larger rosters, more concurrency, and longer planning horizons.

  • Up to 100 workers × 90 days per solve
  • Burst of 6 concurrent solves, queue of 10
  • Up to 120 solves / hour
  • Extra concurrency slots available

Coming soon

Platform

Even larger sites.

Capacity-based fair use — embed it, resell it, run several companies on it. Terms.