Skip to content
Registry StackDocsDevelopment (unreleased)

Cancel an owned appointment

POST
/v1/appointments/{appointment_id}/cancel
curl --request POST \
--url https://scheduling.example.test/v1/appointments/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/cancel \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: example' \
--data '{ "observedRevision": 1, "reason": "example" }'

Releases the appointment’s capacity and records the reason, under the task grant that names appointment.cancel. It is guarded by observedRevision and the offering’s cancellation cutoff, never by the policy revision, so an appointment is always cancellable under the policy that currently governs its offering.

appointment_id
required
string format: uuid

The appointment’s identifier.

traceparent
string

Optional W3C trace context continued in the response.

Idempotency-Key
required
string
>= 1 characters <= 128 characters /^[!-~]+$/

Caller-selected ASCII graphic key bound to this exact request. An exact retry replays the first answer, a changed request is idempotency.key-reused, and a receipt retained past its window is idempotency.expired.

Media typeapplication/json
object
observedRevision
required
integer format: int64
reason
Any of:
string
Examplegenerated
{
"observedRevision": 1,
"reason": "example"
}

Success

Media typeapplication/json
object
appointmentId
required
string
cancelledAt
Any of:
string format: date-time
channel
Any of:
string
createdAt
required
string format: date-time
end
required
string format: date-time
offering
required
string
policyRevision
required
integer format: int64
resource
Any of:
string
revision
required
integer format: int64
start
required
string format: date-time
state
required
string
Allowed values: confirmed cancelled
units
required
integer
key
additional properties
any
Example
{
"state": "confirmed"
}
cache-control
Allowed value: no-store

Every answer is marked no-store, so a booking view is never served from a cache.

traceparent
string

W3C trace context for the request and response.

Problem response: request.invalid

Media typeapplication/problem+json
object
code
required
string
Allowed values: authentication.refused booking.duplicate-active cancellation.cutoff-passed capability.unmatched capacity.exhausted cursor.expired cursor.invalid eligibility.unavailable hold.expired hold.released hook.unavailable horizon.outside idempotency.expired idempotency.key-reused location.closed operation.not-authorized party.capacity-inadequate policy.changed precondition.failed precondition.required prerequisite.missing profile.not-authorized request.body-too-large request.invalid request.method-not-allowed request.not-found request.unprocessable request.unsupported-media-type resource.unavailable revision.mismatch schedule.unpublished service.unavailable
detail
required
string
status
required
integer
title
required
string
traceId
required
string
type
required
string format: uri
code
required
Allowed value: request.invalid
detail
required
Allowed value: The request could not be read as a Scheduling request.
status
required
Allowed value: 400
title
required
Allowed value: Request invalid
type
required
Allowed value: https://id.registrystack.org/problems/registry-scheduling/request/invalid
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"
}
cache-control
Allowed value: no-store

Every answer is marked no-store, so a booking view is never served from a cache.

traceparent
string

W3C trace context for the request and response.

Problem response: authentication.refused

Media typeapplication/problem+json
object
code
required
string
Allowed values: authentication.refused booking.duplicate-active cancellation.cutoff-passed capability.unmatched capacity.exhausted cursor.expired cursor.invalid eligibility.unavailable hold.expired hold.released hook.unavailable horizon.outside idempotency.expired idempotency.key-reused location.closed operation.not-authorized party.capacity-inadequate policy.changed precondition.failed precondition.required prerequisite.missing profile.not-authorized request.body-too-large request.invalid request.method-not-allowed request.not-found request.unprocessable request.unsupported-media-type resource.unavailable revision.mismatch schedule.unpublished service.unavailable
detail
required
string
status
required
integer
title
required
string
traceId
required
string
type
required
string format: uri
code
required
Allowed value: authentication.refused
detail
required
Allowed value: The bearer credential is missing, invalid, or expired. Sign in again.
status
required
Allowed value: 401
title
required
Allowed value: Authentication refused
type
required
Allowed value: https://id.registrystack.org/problems/registry-scheduling/authentication/refused
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"
}
WWW-Authenticate
Allowed value: Bearer

Bearer authentication challenge.

cache-control
Allowed value: no-store

Every answer is marked no-store, so a booking view is never served from a cache.

traceparent
string

W3C trace context for the request and response.

Problem response: profile.not-authorized, operation.not-authorized

Media typeapplication/problem+json
One of:
object
code
required
string
Allowed values: authentication.refused booking.duplicate-active cancellation.cutoff-passed capability.unmatched capacity.exhausted cursor.expired cursor.invalid eligibility.unavailable hold.expired hold.released hook.unavailable horizon.outside idempotency.expired idempotency.key-reused location.closed operation.not-authorized party.capacity-inadequate policy.changed precondition.failed precondition.required prerequisite.missing profile.not-authorized request.body-too-large request.invalid request.method-not-allowed request.not-found request.unprocessable request.unsupported-media-type resource.unavailable revision.mismatch schedule.unpublished service.unavailable
detail
required
string
status
required
integer
title
required
string
traceId
required
string
type
required
string format: uri
code
required
Allowed value: profile.not-authorized
detail
required
Allowed value: The selected Scheduling profile does not authorize this request.
status
required
Allowed value: 403
title
required
Allowed value: Profile not authorized
type
required
Allowed value: https://id.registrystack.org/problems/registry-scheduling/profile/not-authorized
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"
}
cache-control
Allowed value: no-store

Every answer is marked no-store, so a booking view is never served from a cache.

traceparent
string

W3C trace context for the request and response.

Problem response: request.method-not-allowed

Media typeapplication/problem+json
object
code
required
string
Allowed values: authentication.refused booking.duplicate-active cancellation.cutoff-passed capability.unmatched capacity.exhausted cursor.expired cursor.invalid eligibility.unavailable hold.expired hold.released hook.unavailable horizon.outside idempotency.expired idempotency.key-reused location.closed operation.not-authorized party.capacity-inadequate policy.changed precondition.failed precondition.required prerequisite.missing profile.not-authorized request.body-too-large request.invalid request.method-not-allowed request.not-found request.unprocessable request.unsupported-media-type resource.unavailable revision.mismatch schedule.unpublished service.unavailable
detail
required
string
status
required
integer
title
required
string
traceId
required
string
type
required
string format: uri
code
required
Allowed value: request.method-not-allowed
detail
required
Allowed value: The route exists but not for this method.
status
required
Allowed value: 405
title
required
Allowed value: Method not allowed
type
required
Allowed value: https://id.registrystack.org/problems/registry-scheduling/request/method-not-allowed
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"
}
cache-control
Allowed value: no-store

Every answer is marked no-store, so a booking view is never served from a cache.

traceparent
string

W3C trace context for the request and response.

Problem response: idempotency.key-reused, cancellation.cutoff-passed, hold.released

Media typeapplication/problem+json
One of:
object
code
required
string
Allowed values: authentication.refused booking.duplicate-active cancellation.cutoff-passed capability.unmatched capacity.exhausted cursor.expired cursor.invalid eligibility.unavailable hold.expired hold.released hook.unavailable horizon.outside idempotency.expired idempotency.key-reused location.closed operation.not-authorized party.capacity-inadequate policy.changed precondition.failed precondition.required prerequisite.missing profile.not-authorized request.body-too-large request.invalid request.method-not-allowed request.not-found request.unprocessable request.unsupported-media-type resource.unavailable revision.mismatch schedule.unpublished service.unavailable
detail
required
string
status
required
integer
title
required
string
traceId
required
string
type
required
string format: uri
code
required
Allowed value: idempotency.key-reused
detail
required
Allowed value: This idempotency key was used for a different request.
status
required
Allowed value: 409
title
required
Allowed value: Idempotency key reused
type
required
Allowed value: https://id.registrystack.org/problems/registry-scheduling/idempotency/key-reused
Example
{
"code": "idempotency.key-reused",
"detail": "This idempotency key was used for a different request.",
"status": 409,
"title": "Idempotency key reused",
"type": "https://id.registrystack.org/problems/registry-scheduling/idempotency/key-reused"
}
cache-control
Allowed value: no-store

Every answer is marked no-store, so a booking view is never served from a cache.

traceparent
string

W3C trace context for the request and response.

Problem response: idempotency.expired

Media typeapplication/problem+json
object
code
required
string
Allowed values: authentication.refused booking.duplicate-active cancellation.cutoff-passed capability.unmatched capacity.exhausted cursor.expired cursor.invalid eligibility.unavailable hold.expired hold.released hook.unavailable horizon.outside idempotency.expired idempotency.key-reused location.closed operation.not-authorized party.capacity-inadequate policy.changed precondition.failed precondition.required prerequisite.missing profile.not-authorized request.body-too-large request.invalid request.method-not-allowed request.not-found request.unprocessable request.unsupported-media-type resource.unavailable revision.mismatch schedule.unpublished service.unavailable
detail
required
string
status
required
integer
title
required
string
traceId
required
string
type
required
string format: uri
code
required
Allowed value: idempotency.expired
detail
required
Allowed value: The stored response for this idempotency key has expired. Reconcile the original operation before choosing a new key.
status
required
Allowed value: 410
title
required
Allowed value: Idempotency window expired
type
required
Allowed value: https://id.registrystack.org/problems/registry-scheduling/idempotency/expired
Example
{
"code": "idempotency.expired",
"detail": "The stored response for this idempotency key has expired. Reconcile the original operation before choosing a new key.",
"status": 410,
"title": "Idempotency window expired",
"type": "https://id.registrystack.org/problems/registry-scheduling/idempotency/expired"
}
cache-control
Allowed value: no-store

Every answer is marked no-store, so a booking view is never served from a cache.

traceparent
string

W3C trace context for the request and response.

Problem response: revision.mismatch

Media typeapplication/problem+json
object
code
required
string
Allowed values: authentication.refused booking.duplicate-active cancellation.cutoff-passed capability.unmatched capacity.exhausted cursor.expired cursor.invalid eligibility.unavailable hold.expired hold.released hook.unavailable horizon.outside idempotency.expired idempotency.key-reused location.closed operation.not-authorized party.capacity-inadequate policy.changed precondition.failed precondition.required prerequisite.missing profile.not-authorized request.body-too-large request.invalid request.method-not-allowed request.not-found request.unprocessable request.unsupported-media-type resource.unavailable revision.mismatch schedule.unpublished service.unavailable
detail
required
string
status
required
integer
title
required
string
traceId
required
string
type
required
string format: uri
code
required
Allowed value: revision.mismatch
detail
required
Allowed value: The window revision changed before the request committed. Reload the catalogue and try again.
status
required
Allowed value: 412
title
required
Allowed value: Revision mismatch
type
required
Allowed value: https://id.registrystack.org/problems/registry-scheduling/revision/mismatch
Example
{
"code": "revision.mismatch",
"detail": "The window revision changed before the request committed. Reload the catalogue and try again.",
"status": 412,
"title": "Revision mismatch",
"type": "https://id.registrystack.org/problems/registry-scheduling/revision/mismatch"
}
cache-control
Allowed value: no-store

Every answer is marked no-store, so a booking view is never served from a cache.

traceparent
string

W3C trace context for the request and response.

Problem response: request.body-too-large

Media typeapplication/problem+json
object
code
required
string
Allowed values: authentication.refused booking.duplicate-active cancellation.cutoff-passed capability.unmatched capacity.exhausted cursor.expired cursor.invalid eligibility.unavailable hold.expired hold.released hook.unavailable horizon.outside idempotency.expired idempotency.key-reused location.closed operation.not-authorized party.capacity-inadequate policy.changed precondition.failed precondition.required prerequisite.missing profile.not-authorized request.body-too-large request.invalid request.method-not-allowed request.not-found request.unprocessable request.unsupported-media-type resource.unavailable revision.mismatch schedule.unpublished service.unavailable
detail
required
string
status
required
integer
title
required
string
traceId
required
string
type
required
string format: uri
code
required
Allowed value: request.body-too-large
detail
required
Allowed value: The request body exceeds the accepted size.
status
required
Allowed value: 413
title
required
Allowed value: Payload too large
type
required
Allowed value: https://id.registrystack.org/problems/registry-scheduling/request/body-too-large
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"
}
cache-control
Allowed value: no-store

Every answer is marked no-store, so a booking view is never served from a cache.

traceparent
string

W3C trace context for the request and response.

Problem response: request.unsupported-media-type

Media typeapplication/problem+json
object
code
required
string
Allowed values: authentication.refused booking.duplicate-active cancellation.cutoff-passed capability.unmatched capacity.exhausted cursor.expired cursor.invalid eligibility.unavailable hold.expired hold.released hook.unavailable horizon.outside idempotency.expired idempotency.key-reused location.closed operation.not-authorized party.capacity-inadequate policy.changed precondition.failed precondition.required prerequisite.missing profile.not-authorized request.body-too-large request.invalid request.method-not-allowed request.not-found request.unprocessable request.unsupported-media-type resource.unavailable revision.mismatch schedule.unpublished service.unavailable
detail
required
string
status
required
integer
title
required
string
traceId
required
string
type
required
string format: uri
code
required
Allowed value: request.unsupported-media-type
detail
required
Allowed value: The request body is not JSON.
status
required
Allowed value: 415
title
required
Allowed value: Unsupported media type
type
required
Allowed value: https://id.registrystack.org/problems/registry-scheduling/request/unsupported-media-type
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"
}
cache-control
Allowed value: no-store

Every answer is marked no-store, so a booking view is never served from a cache.

traceparent
string

W3C trace context for the request and response.

Problem response: request.unprocessable

Media typeapplication/problem+json
object
code
required
string
Allowed values: authentication.refused booking.duplicate-active cancellation.cutoff-passed capability.unmatched capacity.exhausted cursor.expired cursor.invalid eligibility.unavailable hold.expired hold.released hook.unavailable horizon.outside idempotency.expired idempotency.key-reused location.closed operation.not-authorized party.capacity-inadequate policy.changed precondition.failed precondition.required prerequisite.missing profile.not-authorized request.body-too-large request.invalid request.method-not-allowed request.not-found request.unprocessable request.unsupported-media-type resource.unavailable revision.mismatch schedule.unpublished service.unavailable
detail
required
string
status
required
integer
title
required
string
traceId
required
string
type
required
string format: uri
code
required
Allowed value: request.unprocessable
detail
required
Allowed value: The request body could not be processed.
status
required
Allowed value: 422
title
required
Allowed value: Request unprocessable
type
required
Allowed value: https://id.registrystack.org/problems/registry-scheduling/request/unprocessable
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"
}
cache-control
Allowed value: no-store

Every answer is marked no-store, so a booking view is never served from a cache.

traceparent
string

W3C trace context for the request and response.

Problem response: service.unavailable

Media typeapplication/problem+json
object
code
required
string
Allowed values: authentication.refused booking.duplicate-active cancellation.cutoff-passed capability.unmatched capacity.exhausted cursor.expired cursor.invalid eligibility.unavailable hold.expired hold.released hook.unavailable horizon.outside idempotency.expired idempotency.key-reused location.closed operation.not-authorized party.capacity-inadequate policy.changed precondition.failed precondition.required prerequisite.missing profile.not-authorized request.body-too-large request.invalid request.method-not-allowed request.not-found request.unprocessable request.unsupported-media-type resource.unavailable revision.mismatch schedule.unpublished service.unavailable
detail
required
string
status
required
integer
title
required
string
traceId
required
string
type
required
string format: uri
code
required
Allowed value: service.unavailable
detail
required
Allowed value: Scheduling storage is unavailable. Try again after the service recovers.
status
required
Allowed value: 503
title
required
Allowed value: Scheduling service unavailable
type
required
Allowed value: https://id.registrystack.org/problems/registry-scheduling/service/unavailable
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"
}
Retry-After
integer

Seconds before retrying the unavailable dependency; the runtime answers 5.

cache-control
Allowed value: no-store

Every answer is marked no-store, so a booking view is never served from a cache.

traceparent
string

W3C trace context for the request and response.