Unreleased documentation. These pages follow the main branch and can change before the next release. For supported guidance, use v0.46.0.
Reserve an admission
const url = 'https://scheduling.example.test/v1/holds';const options = { method: 'POST', headers: { 'Idempotency-Key': 'example', Authorization: 'Bearer <token>', 'Content-Type': 'application/json' }, body: '{"additionalAllocations":[{"offering":"example","resource":"example","units":1}],"capabilities":["example"],"channel":"example","duplicateKey":"example","durationMinutes":1,"externalReferences":[{"identifier":"example","product":"example","recordType":"example"}],"manager":"schedulingManager","offering":"example","party":{"attendees":1,"recipients":1},"partyReferences":[{"reference":{"identifier":"example","product":"example","recordType":"example"},"role":"beneficiary"}],"policyRevision":1,"prerequisites":["example"],"resource":"example","resourceUnits":1,"start":"2026-04-15T12:00:00Z","windowRevision":1}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://scheduling.example.test/v1/holds \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --header 'Idempotency-Key: example' \ --data '{ "additionalAllocations": [ { "offering": "example", "resource": "example", "units": 1 } ], "capabilities": [ "example" ], "channel": "example", "duplicateKey": "example", "durationMinutes": 1, "externalReferences": [ { "identifier": "example", "product": "example", "recordType": "example" } ], "manager": "schedulingManager", "offering": "example", "party": { "attendees": 1, "recipients": 1 }, "partyReferences": [ { "reference": { "identifier": "example", "product": "example", "recordType": "example" }, "role": "beneficiary" } ], "policyRevision": 1, "prerequisites": [ "example" ], "resource": "example", "resourceUnits": 1, "start": "2026-04-15T12:00:00Z", "windowRevision": 1 }'Reserves supply instead of committing it and answers the hold with its expiry. The caller must carry a complete task grant whose scheduling permission names the offering’s service, its location, and hold.create; readable availability is not authority to book. Explicit manager selection instead requires hold.create-for, a verified source-manager binding and fresh online grant status. The hold expires on its own, so its capacity returns without a release.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Header Parameters
Section titled “Header Parameters”Optional W3C trace context continued in the response.
Caller-selected ASCII graphic key bound to this exact request. An exact retry replays the first answer while its claim remains owned by the caller, a changed request is idempotency.key-reused, and a receipt retained past its window is idempotency.expired.
Request Bodyrequired
Section titled “Request Bodyrequired”object
object
object
object
object
object
Responses
Section titled “Responses”Success
object
object
object
object
object
Example
{ "allocations": [ { "requirement": { "kind": "primary" } } ], "manager": "schedulingManager", "partyReferences": [ { "role": "beneficiary" } ]}Headers
Section titled “Headers”Every answer is marked no-store, so a booking view is never served from a cache.
W3C trace context for the request and response.
Problem response: request.invalid
object
Example
{ "code": "request.invalid", "detail": "The request could not be read as a Scheduling request.", "status": 400, "title": "Request invalid", "type": "https://id.registrystack.org/problems/registry-scheduling/request/invalid"}Headers
Section titled “Headers”Every answer is marked no-store, so a booking view is never served from a cache.
W3C trace context for the request and response.
Problem response: authentication.refused
object
Example
{ "code": "authentication.refused", "detail": "The bearer credential is missing, invalid, or expired. Sign in again.", "status": 401, "title": "Authentication refused", "type": "https://id.registrystack.org/problems/registry-scheduling/authentication/refused"}Headers
Section titled “Headers”Bearer authentication challenge.
Every answer is marked no-store, so a booking view is never served from a cache.
W3C trace context for the request and response.
Problem response: profile.not-authorized, operation.not-authorized
object
object
Example
{ "code": "profile.not-authorized", "detail": "The selected Scheduling profile does not authorize this request.", "status": 403, "title": "Profile not authorized", "type": "https://id.registrystack.org/problems/registry-scheduling/profile/not-authorized"}Headers
Section titled “Headers”Every answer is marked no-store, so a booking view is never served from a cache.
W3C trace context for the request and response.
Problem response: request.not-found
object
Example
{ "code": "request.not-found", "detail": "The requested route does not exist.", "status": 404, "title": "Route not found", "type": "https://id.registrystack.org/problems/registry-scheduling/request/not-found"}Headers
Section titled “Headers”Every answer is marked no-store, so a booking view is never served from a cache.
W3C trace context for the request and response.
Problem response: request.method-not-allowed
object
Example
{ "code": "request.method-not-allowed", "detail": "The route exists but not for this method.", "status": 405, "title": "Method not allowed", "type": "https://id.registrystack.org/problems/registry-scheduling/request/method-not-allowed"}Headers
Section titled “Headers”Every answer is marked no-store, so a booking view is never served from a cache.
W3C trace context for the request and response.
Problem response: booking.duplicate-active, capacity.exhausted, location.closed, idempotency.key-reused
object
object
object
object
Example
{ "code": "booking.duplicate-active", "detail": "An active booking already holds this party's duplicate key. Cancel it, or wait until it has passed, before booking again.", "status": 409, "title": "Duplicate active booking", "type": "https://id.registrystack.org/problems/registry-scheduling/booking/duplicate-active"}Headers
Section titled “Headers”Every answer is marked no-store, so a booking view is never served from a cache.
W3C trace context for the request and response.
Problem response: idempotency.expired
object
Example
{ "code": "idempotency.expired", "detail": "The stored response for this idempotency key has expired. For an appointment command, read the appointment by its external reference or its identifier to learn the original outcome before choosing a new key. A hold cannot be read and expires on its own, so start a new request.", "status": 410, "title": "Idempotency window expired", "type": "https://id.registrystack.org/problems/registry-scheduling/idempotency/expired"}Headers
Section titled “Headers”Every answer is marked no-store, so a booking view is never served from a cache.
W3C trace context for the request and response.
Problem response: policy.changed, revision.mismatch
object
object
Example
{ "code": "policy.changed", "detail": "The policy revision changed before the request committed. Reload the catalogue and try again with the current revision.", "status": 412, "title": "Policy changed", "type": "https://id.registrystack.org/problems/registry-scheduling/policy/changed"}Headers
Section titled “Headers”Every answer is marked no-store, so a booking view is never served from a cache.
W3C trace context for the request and response.
Problem response: request.body-too-large
object
Example
{ "code": "request.body-too-large", "detail": "The request body exceeds the accepted size.", "status": 413, "title": "Payload too large", "type": "https://id.registrystack.org/problems/registry-scheduling/request/body-too-large"}Headers
Section titled “Headers”Every answer is marked no-store, so a booking view is never served from a cache.
W3C trace context for the request and response.
Problem response: request.unsupported-media-type
object
Example
{ "code": "request.unsupported-media-type", "detail": "The request body is not JSON.", "status": 415, "title": "Unsupported media type", "type": "https://id.registrystack.org/problems/registry-scheduling/request/unsupported-media-type"}Headers
Section titled “Headers”Every answer is marked no-store, so a booking view is never served from a cache.
W3C trace context for the request and response.
Problem response: request.unprocessable, capability.unmatched, horizon.outside, party.capacity-inadequate, prerequisite.missing, schedule.unpublished
object
object
object
object
object
object
Example
{ "code": "request.unprocessable", "detail": "The request body could not be processed.", "status": 422, "title": "Request unprocessable", "type": "https://id.registrystack.org/problems/registry-scheduling/request/unprocessable"}Headers
Section titled “Headers”Every answer is marked no-store, so a booking view is never served from a cache.
W3C trace context for the request and response.
Problem response: precondition.required
object
Example
{ "code": "precondition.required", "detail": "This mutation requires the revision you loaded, or the duplicate key this offering keys on.", "status": 428, "title": "Precondition required", "type": "https://id.registrystack.org/problems/registry-scheduling/precondition/required"}Headers
Section titled “Headers”Every answer is marked no-store, so a booking view is never served from a cache.
W3C trace context for the request and response.
Problem response: service.unavailable
object
Example
{ "code": "service.unavailable", "detail": "Scheduling storage is unavailable. Try again after the service recovers.", "status": 503, "title": "Scheduling service unavailable", "type": "https://id.registrystack.org/problems/registry-scheduling/service/unavailable"}Headers
Section titled “Headers”Seconds before retrying the unavailable dependency; the runtime answers 5.
Every answer is marked no-store, so a booking view is never served from a cache.
W3C trace context for the request and response.
Cookies on Registry Stack
We use optional cookies to understand how you use the main Registry Stack website and this documentation. If you contact us, we may link this activity to your enquiry. You can change your choice at any time. Read the privacy policy.
Your browser asks sites not to track you, so optional tracking stays off.
We could not use or save that choice. Optional tracking remains off.