Skip to main content
Stay updated with the latest enhancements, features, and improvements to the Solvice Fill API. Each release brings new capabilities to help you assign employees to shifts while respecting skills, availability, and labor rules.
June 2026
Declarative rule engine with per-rule weights

📋 Declarative Rule Engine

The Fill solver now ships a full declarative rule engine. Counter rules, sequence rules, rest rules, and shift patterns are all enforced together and can each be tuned independently through the top-level weights object.

New MAX_CONSECUTIVE_DAYS rule type

A new rule type bounds the longest run of consecutive working days directly. Pair it with a COUNTER constraint and a max: the solver finds the longest consecutive-day streak and penalizes anything above the limit.
{
  "rules": [
    {
      "constraint": "COUNTER",
      "type": "MAX_CONSECUTIVE_DAYS",
      "max": 5
    }
  ]
}
The full set of rule types is now: HOURS_WORKED, DAYS_WORKED, DAYS_IDLE, WEEKENDS_WORKED, WEEKENDS_IDLE, SHIFT_TYPES_WORKED, SHIFT_TYPES_HOURS_WORKED, and MAX_CONSECUTIVE_DAYS.

Per-rule-type weights

Every rule family now has its own weight, so you can decide exactly how hard the solver pushes on each one. Set them under the request’s top-level weights object, using the <weight><priority> format where priority is hard, medium, or soft.
Weights for COUNTER rules — how strongly to respect counts over a period.
{
  "weights": {
    "counterDaysWorked": "10medium",
    "counterDaysIdle": "10medium",
    "counterHoursWorked": "10medium",
    "counterShiftTypesWorked": "10medium",
    "counterShiftTypesHours": "10medium",
    "counterWeekendsWorked": "10medium",
    "counterWeekendsIdle": "10medium",
    "counterMaxConsecutiveDays": "10medium"
  }
}

Conditional rules and rolling windows

Rules can chain with then to trigger a follow-up rule when a threshold is crossed, and a period.duration turns any rule into a sliding window.
{
  "rules": [
    {
      "constraint": "COUNTER",
      "type": "HOURS_WORKED",
      "shifts": ["NIGHT"],
      "period": { "duration": "PT72H" },
      "max": 20,
      "then": {
        "constraint": "SEQUENCE",
        "type": "DAYS_IDLE",
        "min": 2
      }
    }
  ]
}
Learn more:
February 2026
Reliability and scoring fixes

🛡️ Employee Reference Validation

Requests that reference an employee that does not exist — in a shift’s employees list or its blocklist — are now validated up front instead of failing deep inside the solver. This produces clearer errors and prevents silent mis-assignments (PRD-1247).
Every name used in a shift’s employees list or blocklist must match a name declared in the top-level employees list. Unknown references are rejected during validation with a clear error message.

💶 Wage Costs Scoring Fix

The Wage Costs constraint could produce a negative match weight in some configurations, distorting the soft score. Match weights are now clamped so wage-based optimization behaves as expected (PRD-1243).
January 2026
Assignment control and API hardening

🎚️ Control Solve Time with millis

The solve endpoint accepts a new millis query parameter to cap how long the solver runs, giving you direct control over the latency/quality trade-off.
POST /v2/fill/solve?millis=5000

🔢 max Drives Shift Assignment Count

The number of assignments generated for a shift is now taken from the shift max field, falling back to the deprecated value field when max is absent.
{
  "shifts": [
    { "name": "morning", "from": "2026-01-05T09:00:00", "to": "2026-01-05T17:00:00", "min": 2, "max": 3 }
  ]
}
{
  "shifts": [
    { "name": "morning", "from": "2026-01-05T09:00:00", "to": "2026-01-05T17:00:00", "value": 3 }
  ]
}
value continues to work for backward compatibility but is deprecated. Use min and max to express an exact staffing range.

✅ Additional API Changes

  • Optional rule periodperiod on a period rule is now optional and defaults to the entire planning horizon when omitted.
  • Input hardening — null-byte sanitization and string-list validation were added across Fill request fields, including preference, employees, and blocklist.
December 2025
Fill API v2 launch

🎉 Fill API v2

Fill API v2 is a ground-up redesign of shift filling: assign employees to shifts while respecting skills, availability, labor rules, and preferences.

Endpoints

POST /v2/fill/solve
POST /v2/fill/evaluate
POST /v2/fill/suggest
Retrieve results asynchronously with GET /v2/fill/jobs/{id}/status, .../solution, and .../explanation.

Core capabilities

  • Multi-level skill matching (required skills as hard constraints, proficiency levels, soft-skill preferences)
  • Time-based availability windows and day-of-week restrictions
  • Locked (pre-assigned) and blocked employee–shift pairs

Migrating from v1

Several v1 fields were renamed or replaced for consistency and flexibility.
DeprecatedReplacement
contractsrules
blacklistblocklist
shift valueshift min / max

Fill Migration Guide

Full list of breaking changes and new features when moving to v2