This document is the canonical public source for HTTP examples against the current HelixScheduler Web API surface.
Examples use UTC dates and the default tenant unless an explicit tenant header is shown.
The API accepts either X-Tenant or X-Helix-Tenant. If no tenant header is provided, the Web API resolves or creates the default tenant.
POST /api/availability/computeis the full availability surface. It supports property filter groups, ancestor filters, slot chunking, explanation output, and resource OR groups.GET /api/availability/slotsis the minimal query-string adapter. It supports date range,resourceIds,orGroups,explain, and ancestor expansion only.GET /api/catalog/*exposes the canonical read-only catalog endpoints.GET /api/resourcesis a lightweight compatibility alias over the resource catalog. Prefer/api/catalog/resourcesin public integrations unless you explicitly want the summary-only projection.GET /healthis the monitoring and readiness endpoint.- Property filters are compute-only.
Use
propertyFilterGroupsin the POST body. The GET endpoint does not supportpropertyIdsorincludePropertyDescendants. /api/demo/*and/api/diag/*exist for demo and diagnostics support. They are not part of the main public HTTP surface described in this document.
curl -X POST http://localhost:5000/api/availability/compute \
-H "Content-Type: application/json" \
-d '{
"fromDate": "2026-03-09",
"toDate": "2026-03-09",
"requiredResourceIds": [5, 4]
}'curl -X POST http://localhost:5000/api/availability/compute \
-H "Content-Type: application/json" \
-d '{
"fromDate": "2026-03-09",
"toDate": "2026-03-09",
"requiredResourceIds": [5, 4],
"explain": true
}'curl -X POST http://localhost:5000/api/availability/compute \
-H "Content-Type: application/json" \
-d '{
"fromDate": "2026-03-09",
"toDate": "2026-03-09",
"requiredResourceIds": [5, 4],
"slotDurationMinutes": 60,
"includeRemainderSlot": false
}'curl -X POST http://localhost:5000/api/availability/compute \
-H "Content-Type: application/json" \
-d '{
"fromDate": "2026-03-12",
"toDate": "2026-03-12",
"requiredResourceIds": [4],
"slotDurationMinutes": 60,
"includeRemainderSlot": true
}'curl -X POST http://localhost:5000/api/availability/compute \
-H "Content-Type: application/json" \
-d '{
"fromDate": "2026-01-06",
"toDate": "2026-01-06",
"requiredResourceIds": [2, 3],
"includeResourceAncestors": true,
"ancestorRelationTypes": ["Contains"],
"ancestorMode": "perGroup"
}'matchMode: "or"means at least onepropertyIdmust match.matchMode: "and"means allpropertyIdsin the filter must match.scopecan beanyAncestor,directParent, ornearestOfType.matchAllAncestors: truerequires every eligible ancestor to satisfy the filter.
curl -X POST http://localhost:5000/api/availability/compute \
-H "Content-Type: application/json" \
-d '{
"fromDate": "2026-01-06",
"toDate": "2026-01-06",
"requiredResourceIds": [301],
"includeResourceAncestors": true,
"ancestorFilters": [
{
"resourceTypeId": 1,
"propertyIds": [101, 102],
"matchMode": "or",
"scope": "nearestOfType"
}
]
}'curl -X POST http://localhost:5000/api/availability/compute \
-H "Content-Type: application/json" \
-d '{
"fromDate": "2026-01-06",
"toDate": "2026-01-06",
"requiredResourceIds": [301],
"includeResourceAncestors": true,
"ancestorFilters": [
{
"resourceTypeId": 3,
"propertyIds": [201, 202],
"matchMode": "and",
"scope": "directParent",
"matchAllAncestors": true
}
]
}'- Use
propertyFilterGroupsonly withPOST /api/availability/compute. matchModeis evaluated inside each group.- Groups are combined with logical AND.
includePropertyDescendantsapplies per group.
curl -X POST http://localhost:5000/api/availability/compute \
-H "Content-Type: application/json" \
-d '{
"fromDate": "2026-01-06",
"toDate": "2026-01-06",
"requiredResourceIds": [2, 3],
"propertyFilterGroups": [
{
"propertyIds": [3],
"matchMode": "and"
}
]
}'curl -X POST http://localhost:5000/api/availability/compute \
-H "Content-Type: application/json" \
-d '{
"fromDate": "2026-01-06",
"toDate": "2026-01-06",
"requiredResourceIds": [2, 3],
"propertyFilterGroups": [
{
"propertyIds": [3],
"matchMode": "and",
"includePropertyDescendants": true
}
]
}'curl -X POST http://localhost:5000/api/availability/compute \
-H "Content-Type: application/json" \
-d '{
"fromDate": "2026-01-06",
"toDate": "2026-01-06",
"requiredResourceIds": [2, 3],
"propertyFilterGroups": [
{
"propertyIds": [3],
"matchMode": "and"
},
{
"propertyIds": [7, 8],
"matchMode": "or"
}
]
}'curl -X POST http://localhost:5000/api/availability/compute \
-H "Content-Type: application/json" \
-d '{
"fromDate": "2026-03-09",
"toDate": "2026-03-09",
"requiredResourceIds": [5],
"resourceOrGroups": [[4, 6], [7, 8]]
}'curl -X POST http://localhost:5000/api/availability/compute \
-H "Content-Type: application/json" \
-d '{
"fromDate": "2026-03-09",
"toDate": "2026-03-09",
"requiredResourceIds": [5],
"resourceOrGroups": [[4, 6]],
"propertyFilterGroups": [
{
"propertyIds": [3],
"matchMode": "and",
"includePropertyDescendants": true
}
]
}'curl -X POST http://localhost:5000/api/availability/compute \
-H "Content-Type: application/json" \
-H "X-Tenant: default" \
-d '{
"fromDate": "2026-03-09",
"toDate": "2026-03-09",
"requiredResourceIds": [5, 4]
}'curl "http://localhost:5000/api/availability/slots?fromDate=2026-01-06&toDate=2026-01-06&resourceIds=2,3"curl "http://localhost:5000/api/availability/slots?fromDate=2026-01-06&toDate=2026-01-06&resourceIds=2,3&explain=true"curl "http://localhost:5000/api/availability/slots?fromDate=2026-01-06&toDate=2026-01-06&resourceIds=2,3&includeResourceAncestors=true&ancestorMode=perGroup&ancestorRelationTypes=Contains"curl "http://localhost:5000/api/availability/slots?fromDate=2026-03-09&toDate=2026-03-09&resourceIds=5&orGroups=4,6|7,8"curl "http://localhost:5000/api/catalog/resource-types"
curl "http://localhost:5000/api/catalog/resources?onlySchedulable=true"
curl "http://localhost:5000/api/catalog/properties"