Skedulo Solve API
The Solve API from Skedulo — 3 operation(s) for solve.
The Solve API from Skedulo — 3 operation(s) for solve.
openapi: 3.0.0
info:
title: Authentication Admin Solve API
description: Skedulo Authentication API
version: 1.0.0
servers:
- url: https://api.skedulo.com/auth
- url: https://api.uk.skedulo.com/auth
- url: https://api.ca.skedulo.com/auth
- url: https://api.au.skedulo.com/auth
tags:
- name: Solve
paths:
/solve:
post:
summary: Start an optimization run for a model
description: This starts a one-off optimization run to solve the model given as an input.
operationId: Solve
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/FeatureModelShape'
examples:
PVRP:
value:
allocations:
- id: alloc-1
groupId: alloc-group-1
groupIds:
- alloc-group-1
start: '2022-01-26T09:00:00Z'
duration: 30
resourceId: res-1
locationId: loc-1
priority: 10
locked: true
attributeRequirements:
- id: attr-1
- id: attr-2
weighting: 10
resourceConstraints:
type: blocked
resources:
- res-2
scheduleConstraints:
- windowStart: '2022-01-26T10:00:00Z'
windowEnd: '2022-01-26T11:00:00Z'
resourceRatings:
- resourceId: res-1
rating: 75
urgency: 20
groups:
- id: gr-1
synchronizationMode: start_time
locked: true
enablePartialAllocation: false
resources:
- id: res-1
attributes:
- id: attr-1
locationId: loc-1
availability:
- from: '2022-01-26T09:00:00Z'
to: '2022-01-30T23:00:00Z'
attributes: []
maxDailyTravelTimeInMinutes: 180
maxTravelTimeBetweenLocations: 60
periodConstraints:
- start: '2022-01-26T09:00:00Z'
end: '2022-01-30T23:00:00Z'
maxServiceTimeInMinutes: 100
minServiceTimeInMinutes: 50
groupConstraints:
- groupId: group-1
maxAllocations: 5
breaks:
- breakTimeInMinutes: 30
minStartTime: '2022-01-26T12:00:00Z'
maxStartTime: '2022-01-26T13:00:00Z'
- startTime: '2022-01-26T15:00:00Z'
endTime: '2022-01-26T15:30:00Z'
locationId: loc-1
rating: 80
compatibleResources:
- res-2
allocationDependencies: []
resourceDependencies: []
locations:
- id: loc-1
latitude: 51.5072
longitude: 0.1276
schedulingPeriod:
start: '2022-01-26T09:00:00Z'
end: '2022-01-30T23:00:00Z'
timezone: UTC
meta:
key: value
options:
full: false
ignoreTravelTime: false
ignoreTravelTimeFirstJob: false
ignoreTravelTimeLastJob: false
minimizeResources: false
respectAllocationTimes: false
respectAllocationTimesOverTimeConstraints: false
balanceAbsoluteWorkload: false
enablePartiallyAllocatedGroups: true
enablePartiallyAllocatedAllocationDependencies: true
removeLockedJobsFromShifts: true
sharedGroupConstraints:
- groupId: group-1
resourceIds:
- res-1
- res-2
maxAllocations: 10
start: '2022-01-26T09:00:00Z'
end: '2022-01-30T23:00:00Z'
solver: pvrp
ARC:
value:
options:
locations: true
exceptionFilter:
blacklist: true
resourceAvailability: true
solviceWeights:
maxHours: 10hard
minHours: 10medium
minHoursUnassigned: 10medium
availability: 10hard
locked: 10hard
minRest: 10hard
requirements: 10hard
skills: 10hard
distance: 10hard
distanceAL: 10hard
priority: 10hard
pref: 10hard
unassigned: 10hard
softSkills: 10hard
criticalSkills: 10hard
blacklist: 10hard
efficiency: 10hard
softSkillsLevel: 10hard
maxWorkingDays: 10hard
shiftStart: 10hard
latestShiftStart: 10hard
shiftEnd: 10hard
minShift: 10hard
maxShift: 10hard
dayOfWeek: 10hard
sameDay: 10hard
sameDayMinRest: 10hard
maxConsecutive: 10hard
concurrent: 10hard
costs: 10hard
wages: 10hard
working: 10hard
minWorkingDaysUnassigned: 10medium
fairness: 10soft
allocations:
- locked: false
attributeRequirements:
- id: attr-1
- id: attr-2
weighting: 10
resourceConstraints:
type: blocked
resources:
- res-2
preferredResourceIds:
- res-1
- res-3
id: alloc-1
start: '2022-01-26T23:00:00Z'
duration: 30
resourceId: res-1
locationId: loc-1
priority: 10
resources:
- id: res-1
statuteId: st-1
attributes:
- id: attr-1
validFor:
- from: '2022-01-26'
to: '2022-01-02'
weighting: 10
locationId: loc-1
availability:
- from: '2022-01-26T09:00:00Z'
to: '2022-01-30T23:00:00Z'
fromLocation: loc-1
efficiency: 10
periodConstraints: []
statutes:
- id: st-1
minimumRestPeriodBetweenAllocations: 0
minimumRestPeriodBetweenAllocationsInHours: 0
minimumHoursForPlanningPeriod: 1
maximumHoursForPlanningPeriod: 1
maximumTravelTimeToAllocationsInMinutes: 30
locations:
- id: loc-1
latitude: 51.5072
longitude: 0.1276
sharedAttributes:
- id: sh-attr-1
allocations:
- alloc-1
attributeId: attr-1
minimumQuantity: 3
schedulingPeriod:
start: '2022-01-26T09:00:00Z'
end: '2022-01-30T23:00:00Z'
fairnessBuckets: []
timezone: UTC
meta:
key: value
solver: arc
required: true
responses:
'201':
description: ''
content:
application/json:
schema:
required:
- result
type: object
properties:
result:
$ref: '#/components/schemas/SolveResult'
'400':
description: 'Invalid value for: body'
content:
text/plain:
schema:
type: string
security:
- httpAuth: []
tags:
- Solve
/solve/evaluate:
post:
summary: Start an optimization run to evaluate the given model
description: Evaluation will not change the data that is being optimized. Instead it will evaluate the current allocation in comparison to the results the optimizer would produce.
operationId: Evaluate
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/FeatureModelShape'
examples:
PVRP:
value:
allocations:
- id: alloc-1
groupId: alloc-group-1
groupIds:
- alloc-group-1
start: '2022-01-26T09:00:00Z'
duration: 30
resourceId: res-1
locationId: loc-1
priority: 10
locked: true
attributeRequirements:
- id: attr-1
- id: attr-2
weighting: 10
resourceConstraints:
type: blocked
resources:
- res-2
scheduleConstraints:
- windowStart: '2022-01-26T10:00:00Z'
windowEnd: '2022-01-26T11:00:00Z'
resourceRatings:
- resourceId: res-1
rating: 75
urgency: 20
groups:
- id: gr-1
synchronizationMode: start_time
locked: true
enablePartialAllocation: false
resources:
- id: res-1
attributes:
- id: attr-1
locationId: loc-1
availability:
- from: '2022-01-26T09:00:00Z'
to: '2022-01-30T23:00:00Z'
attributes: []
maxDailyTravelTimeInMinutes: 180
maxTravelTimeBetweenLocations: 60
periodConstraints:
- start: '2022-01-26T09:00:00Z'
end: '2022-01-30T23:00:00Z'
maxServiceTimeInMinutes: 100
minServiceTimeInMinutes: 50
groupConstraints:
- groupId: group-1
maxAllocations: 5
breaks:
- breakTimeInMinutes: 30
minStartTime: '2022-01-26T12:00:00Z'
maxStartTime: '2022-01-26T13:00:00Z'
- startTime: '2022-01-26T15:00:00Z'
endTime: '2022-01-26T15:30:00Z'
locationId: loc-1
rating: 80
compatibleResources:
- res-2
allocationDependencies: []
resourceDependencies: []
locations:
- id: loc-1
latitude: 51.5072
longitude: 0.1276
schedulingPeriod:
start: '2022-01-26T09:00:00Z'
end: '2022-01-30T23:00:00Z'
timezone: UTC
meta:
key: value
options:
full: false
ignoreTravelTime: false
ignoreTravelTimeFirstJob: false
ignoreTravelTimeLastJob: false
minimizeResources: false
respectAllocationTimes: false
respectAllocationTimesOverTimeConstraints: false
balanceAbsoluteWorkload: false
enablePartiallyAllocatedGroups: true
enablePartiallyAllocatedAllocationDependencies: true
removeLockedJobsFromShifts: true
sharedGroupConstraints:
- groupId: group-1
resourceIds:
- res-1
- res-2
maxAllocations: 10
start: '2022-01-26T09:00:00Z'
end: '2022-01-30T23:00:00Z'
solver: pvrp
ARC:
value:
options:
locations: true
exceptionFilter:
blacklist: true
resourceAvailability: true
solviceWeights:
maxHours: 10hard
minHours: 10medium
minHoursUnassigned: 10medium
availability: 10hard
locked: 10hard
minRest: 10hard
requirements: 10hard
skills: 10hard
distance: 10hard
distanceAL: 10hard
priority: 10hard
pref: 10hard
unassigned: 10hard
softSkills: 10hard
criticalSkills: 10hard
blacklist: 10hard
efficiency: 10hard
softSkillsLevel: 10hard
maxWorkingDays: 10hard
shiftStart: 10hard
latestShiftStart: 10hard
shiftEnd: 10hard
minShift: 10hard
maxShift: 10hard
dayOfWeek: 10hard
sameDay: 10hard
sameDayMinRest: 10hard
maxConsecutive: 10hard
concurrent: 10hard
costs: 10hard
wages: 10hard
working: 10hard
minWorkingDaysUnassigned: 10medium
fairness: 10soft
allocations:
- locked: false
attributeRequirements:
- id: attr-1
- id: attr-2
weighting: 10
resourceConstraints:
type: blocked
resources:
- res-2
preferredResourceIds:
- res-1
- res-3
id: alloc-1
start: '2022-01-26T23:00:00Z'
duration: 30
resourceId: res-1
locationId: loc-1
priority: 10
resources:
- id: res-1
statuteId: st-1
attributes:
- id: attr-1
validFor:
- from: '2022-01-26'
to: '2022-01-02'
weighting: 10
locationId: loc-1
availability:
- from: '2022-01-26T09:00:00Z'
to: '2022-01-30T23:00:00Z'
fromLocation: loc-1
efficiency: 10
periodConstraints: []
statutes:
- id: st-1
minimumRestPeriodBetweenAllocations: 0
minimumRestPeriodBetweenAllocationsInHours: 0
minimumHoursForPlanningPeriod: 1
maximumHoursForPlanningPeriod: 1
maximumTravelTimeToAllocationsInMinutes: 30
locations:
- id: loc-1
latitude: 51.5072
longitude: 0.1276
sharedAttributes:
- id: sh-attr-1
allocations:
- alloc-1
attributeId: attr-1
minimumQuantity: 3
schedulingPeriod:
start: '2022-01-26T09:00:00Z'
end: '2022-01-30T23:00:00Z'
fairnessBuckets: []
timezone: UTC
meta:
key: value
solver: arc
required: true
responses:
'201':
description: ''
content:
application/json:
schema:
required:
- result
type: object
properties:
result:
$ref: '#/components/schemas/SolveResult'
'400':
description: 'Invalid value for: body'
content:
text/plain:
schema:
type: string
security:
- httpAuth: []
tags:
- Solve
/solve/planned:
post:
summary: Start an optimization run for the provided plan
description: This endpoint will start a one-off optimization run based on the provided plan. The plan can be generated using the GET /schedule/plan endpoint.
operationId: Solve planned
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/SchedulePlanShape'
example:
productData:
jobs:
- UID: job-1
Start: '2022-01-26T09:00:00Z'
Duration: 60
JobStatus: Ready
LocationId: loc-1
GeoLatitude: 53.4834
GeoLongitude: -2.2425
Quantity: 1
JobAllocations: []
JobTags: []
ResourceRequirements: []
JobTimeConstraints: []
JobDependenciesFrom: []
JobDependenciesTo: []
Locked: false
RegionId: region-1
Urgency: Normal
activities:
- UID: activity-1
Start: '2022-01-26T09:00:00Z'
End: '2022-01-26T10:00:00Z'
LocationId: loc-1
GeoLatitude: 53.4834
GeoLongitude: -2.2425
ResourceId: resource1
ActivityResources: []
resources:
- UID: resource1
GeoLatitude: 1
GeoLongitude: 1
ResourceTags: []
HomeAddress: test home address
WorkingHoursTimePeriod: Week
WorkingHoursStart: '2022-01-26'
WorkingHoursMin: 20
WorkingHoursMax: 40
ResourceOverrides: []
PrimaryRegion:
Timezone: UTC
locationResourceScores:
- LocationId: loc-1
ResourceId: resource1
Blacklisted: false
accountResourceScores:
- AccountId: account-1
ResourceId: resource1
Blacklisted: false
availability:
2bd0af54-377e-4960-8d4b-ba5272070830:
available:
- start: '2022-01-26T23:00:00Z'
end: '2022-01-29T23:00:00Z'
regions:
- start: '2022-01-26T23:00:00Z'
end: '2022-01-29T23:00:00Z'
regionIds:
- region-1
start: '2022-01-26T09:00:00Z'
end: '2022-01-30T23:00:00Z'
timeZone: UTC
region:
UID: region-1
Timezone: UTC
GeoLatitude: 53.4834
GeoLongitude: -2.2425
featureModel:
allocations:
- id: alloc-1
groupId: alloc-group-1
groupIds:
- alloc-group-1
start: '2022-01-26T09:00:00Z'
duration: 30
resourceId: res-1
locationId: loc-1
priority: 10
locked: true
attributeRequirements:
- id: attr-1
- id: attr-2
weighting: 10
resourceConstraints:
type: blocked
resources:
- res-2
scheduleConstraints:
- windowStart: '2022-01-26T10:00:00Z'
windowEnd: '2022-01-26T11:00:00Z'
resourceRatings:
- resourceId: res-1
rating: 75
urgency: 20
groups:
- id: gr-1
synchronizationMode: start_time
locked: true
enablePartialAllocation: false
resources:
- id: res-1
attributes:
- id: attr-1
locationId: loc-1
availability:
- from: '2022-01-26T09:00:00Z'
to: '2022-01-30T23:00:00Z'
attributes: []
maxDailyTravelTimeInMinutes: 180
maxTravelTimeBetweenLocations: 60
periodConstraints:
- start: '2022-01-26T09:00:00Z'
end: '2022-01-30T23:00:00Z'
maxServiceTimeInMinutes: 100
minServiceTimeInMinutes: 50
groupConstraints:
- groupId: group-1
maxAllocations: 5
breaks:
- breakTimeInMinutes: 30
minStartTime: '2022-01-26T12:00:00Z'
maxStartTime: '2022-01-26T13:00:00Z'
- startTime: '2022-01-26T15:00:00Z'
endTime: '2022-01-26T15:30:00Z'
locationId: loc-1
rating: 80
compatibleResources:
- res-2
allocationDependencies: []
resourceDependencies: []
locations:
- id: loc-1
latitude: 51.5072
longitude: 0.1276
schedulingPeriod:
start: '2022-01-26T09:00:00Z'
end: '2022-01-30T23:00:00Z'
timezone: UTC
meta:
key: value
options:
full: false
ignoreTravelTime: false
ignoreTravelTimeFirstJob: false
ignoreTravelTimeLastJob: false
minimizeResources: false
respectAllocationTimes: false
respectAllocationTimesOverTimeConstraints: false
balanceAbsoluteWorkload: false
enablePartiallyAllocatedGroups: true
enablePartiallyAllocatedAllocationDependencies: true
removeLockedJobsFromShifts: true
sharedGroupConstraints:
- groupId: group-1
resourceIds:
- res-1
- res-2
maxAllocations: 10
start: '2022-01-26T09:00:00Z'
end: '2022-01-30T23:00:00Z'
solver: pvrp
options:
respectSchedule: false
recipeId: 9dc75e35-f1cd-4303-97f3-3f7a6047d698
ids:
resourceIds:
- res-1
jobIds:
- job-1
required: true
responses:
'201':
description: ''
content:
application/json:
schema:
required:
- result
type: object
properties:
result:
$ref: '#/components/schemas/SolveResult'
'400':
description: 'Invalid value for: body'
content:
text/plain:
schema:
type: string
security:
- httpAuth: []
tags:
- Solve
components:
schemas:
SchedulePlanOptionsShape:
required:
- respectSchedule
type: object
properties:
recipeId:
type: string
respectSchedule:
type: boolean
persistenceStrategy:
type: string
enum:
- save
- optimize
label:
type: string
JobDependencyAnchor:
type: string
enum:
- End
- Start
ResourceConstraintsShape:
required:
- type
- resources
type: object
properties:
type:
type: string
description: The constraint type; currently only 'blocked' (exclude list) is supported
enum:
- blocked
resources:
type: array
items:
type: string
description: The resources to which this constraint applies
description: Restricts which resources may be assigned to this allocation
Availability:
required:
- start
- end
type: object
properties:
start:
type: string
format: date-time
end:
type: string
format: date-time
ARCShiftModelShape:
required:
- allocations
- resources
- statutes
- locations
- sharedAttributes
- fairnessBuckets
- schedulingPeriod
- timezone
- options
- solver
type: object
properties:
allocations:
type: array
items:
$ref: '#/components/schemas/AllocationShape'
description: Shifts to be optimally allocated to resources
resources:
type: array
items:
$ref: '#/components/schemas/ResourceShape'
description: Resources (workers) available for shift assignment
statutes:
type: array
items:
$ref: '#/components/schemas/ResourceStatuteShape'
description: Contractual constraint sets that can be applied to resources, defining limits on rest periods and working hours
locations:
type: array
items:
$ref: '#/components/schemas/LocationShape1'
description: Geographic coordinates for all locations referenced by allocations and resources
sharedAttributes:
type: array
items:
$ref: '#/components/schemas/SharedAttributesShape'
description: Cross-allocation skill requirements that enforce a minimum number of the listed allocations to be assigned to resources with the specified attribute
fairnessBuckets:
type: array
items:
$ref: '#/components/schemas/FairnessBucketShape'
description: Periods used to balance total working time fairly across a group of resources
schedulingPeriod:
$ref: '#/components/schemas/TimeBounds'
timezone:
type: string
description: The timezone used for period constraint and fairness bucket calculations
options:
$ref: '#/components/schemas/ShiftFeatureOptionsShape'
meta:
type: object
description: Additional arbitrary metadata associated with the model
additionalProperties:
description: Any JSON value (string, number, boolean, null, object, or array)
solver:
type: string
description: Identifies the solver type; always 'arc' for ARCShift models
enum:
- arc
GraphQLJob:
required:
- UID
- Duration
- JobStatus
- JobAllocations
- JobTags
- ResourceRequirements
- JobTimeConstraints
- JobDependenciesFrom
- JobDependenciesTo
- Locked
- RegionId
type: object
properties:
UID:
type: string
Start:
type: string
format: date-time
Duration:
type: integer
AccountId:
type: string
JobStatus:
$ref: '#/components/schemas/JobStatus'
LocationId:
type: string
GeoLatitude:
type: number
format: double
GeoLongitude:
type: number
format: double
Quantity:
type: integer
format: int32
JobAllocations:
type: array
items:
$ref: '#/components/schemas/GraphQLJobAllocation'
JobTags:
type: array
items:
$ref: '#/components/schemas/GraphQLJobTag'
ResourceRequirements:
type: array
items:
$ref: '#/components/schemas/GraphQLResourceRequirement'
JobTimeConstraints:
type: array
items:
$ref: '#/components/schemas/GraphQLJobTimeConstraint'
JobDependenciesFrom:
type: array
items:
$ref: '#/components/schemas/GraphQLJobDependencyFrom'
JobDependenciesTo:
type: array
items:
$ref: '#/components/schemas/GraphQLJobDependencyTo'
Locked:
type: boolean
RegionId:
type: string
Urgency:
$ref: '#/components/schemas/JobUrgency'
SharedAttributesShape:
required:
- id
- allocations
- attributeId
- minimumQuantity
type: object
properties:
id:
type: string
description: Unique identifier for this shared attribute requirement
allocations:
type: array
items:
type: string
description: The allocations that must collectively satisfy this attribute requirement
attributeId:
type: string
description: The attribute that the assigned resources must hold
minimumQuantity:
type: integer
description: Minimum number of the listed allocations that must be assigned to resources holding the specified attribute
format: int32
ResourceStatuteShape:
required:
- id
type: object
properties:
id:
type: string
description: Unique identifier for this statute
minimumRestPeriodBetweenAllocations:
type: integer
description: 'Deprecated: use minimumRestPeriodBetweenAllocationsInHours instead'
format: int64
minimumRestPeriodBetweenAllocationsInHours:
type: integer
description: Minimum number of hours of rest required between consecutive allocations for resources governed by this statute
format: int64
minimumHoursForPlanningPeriod:
type: integer
description: Minimum number of hours the resource must work within the planning period
format: int64
maximumHoursForPlanningPeriod:
type: integer
description: Maximum number of hours the resource may work within the planning period
format: int64
maximumTravelTimeToAllocationsInMinutes:
type: integer
description: Maximum travel time in minutes allowed for the resource to travel to any single allocation
format: int64
FixedTimeBreakShape:
required:
- startTime
- endTime
type: object
properties:
startTime:
type: string
description: The fixed start time of the break
format: date-time
endTime:
type: string
description: The fixe
# --- truncated at 32 KB (77 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/skedulo/refs/heads/main/openapi/skedulo-solve-api-openapi.yml