Skip to content

← All API operations

Reactivate an operator profile ​

Restores the profile's prior windows, skills and acceptance state and answers 200 with the updated entry. The request carries no body. A profile that was deactivated before accepting its invite returns to INVITED, never to ACTIVE — reactivation restores exactly the state the deactivate captured, not a fixed one.

Behavior and permissions

Reactivating a profile that is not INACTIVE is 409 operator_not_inactive, evaluated FIRST. Only once that guard passes is the backing user account checked: a profile whose User is DISABLED is refused 409 user_not_assignable.

The two 404 causes are exactly the single read's own.

Authorization · Example request · Parameters · Request body · Responses

POST/api/integration/v1/locations/{locationId}/operators/{operatorId}/reactivate

Authorization

  • apiKeyAuth — apiKey sent in the Authorization header

Use Authorization: Api-Key <secret>. Get a credential and check the scopes and issuer authority required for this operation.

Example request

Set QMS_BASE_URL to your workspace URL and QMS_API_KEY to your secret. Replace example identifiers with your own.

cURL
curl --request POST "$QMS_BASE_URL/api/integration/v1/locations/22222222-2222-4222-8222-222222222222/operators/66666666-6666-4666-8666-666666666666/reactivate" \
  --header "Authorization: Api-Key $QMS_API_KEY"

Parameters

NameInRequiredSchema
locationIdpathyes{"type":"string"}
operatorIdpathyes{"type":"string"}

locationId: The location's opaque identifier.

operatorId: The operator profile's opaque identifier.

Request body

None. This operation carries no request body.

Responses

200 — The operator profile, now ACTIVE (or INVITED — see above).

200 · Example
{
  "id": "66666666-6666-4666-8666-666666666666",
  "userId": "44444444-4444-4444-8444-444444444444",
  "email": "operator.one@example.test",
  "name": "Operator One",
  "employeeId": "EMP042",
  "status": "ACTIVE",
  "languages": [
    "EN",
    "LT"
  ],
  "serviceIds": [
    "77777777-7777-4777-8777-777777777777"
  ],
  "windowIds": [
    "A1"
  ],
  "presence": "OFFLINE"
}
200 response schema

One operator profile at one location — the resource this surface addresses, never the person behind it. Every member is always present; while `status` is `INVITED`, `name` and `employeeId` are null and the three arrays are empty.

id · string · required

The profile's own opaque identifier.

userId · string · required

The backing user, stable across every profile the same person holds at other locations. Never a path member — correlate on this instead.

email · string · required

name · string | null · required

employeeId · string | null · required

status · string · required

The profile's enablement, derived the way the console derives it.

Allowed values: "ACTIVE", "INACTIVE", "INVITED"

languages · array · required

ISO 639-1 codes, upper-cased, active in the tenant's language catalogue.

Show nested fields

serviceIds · array · required

Opaque service identifiers, active at this location. Read a service's own name and duration from the service resource; no second copy is published here.

Show nested fields

windowIds · array · required

The business window ids of this location's windows — the `windows[].id` values of the location configuration document (`GET …/locations/{locationId}/configuration`). Read a window's own floor and status there; no second copy is published here.

Show nested fields

presence · string · required

The profile's live status, evaluated at the instant of the read. Read-only: no operation this document describes ever writes it.

Allowed values: "AVAILABLE", "BUSY", "BREAK", "BACK_OFFICE", "OFFLINE"

Raw JSON Schema

application/json

{
  "type": "object",
  "description": "One operator profile at one location — the resource this surface addresses, never the person behind it. Every member is always present; while `status` is `INVITED`, `name` and `employeeId` are null and the three arrays are empty.",
  "properties": {
    "id": {
      "type": "string",
      "description": "The profile's own opaque identifier.",
      "example": "66666666-6666-4666-8666-666666666666"
    },
    "userId": {
      "type": "string",
      "description": "The backing user, stable across every profile the same person holds at other locations. Never a path member — correlate on this instead.",
      "example": "44444444-4444-4444-8444-444444444444"
    },
    "email": {
      "type": "string",
      "example": "operator.one@example.test"
    },
    "name": {
      "type": [
        "string",
        "null"
      ],
      "example": "Operator One"
    },
    "employeeId": {
      "type": [
        "string",
        "null"
      ],
      "pattern": "^[A-Za-z0-9]{1,50}$",
      "maxLength": 50,
      "example": "EMP042"
    },
    "status": {
      "type": "string",
      "description": "The profile's enablement, derived the way the console derives it.",
      "enum": [
        "ACTIVE",
        "INACTIVE",
        "INVITED"
      ],
      "example": "ACTIVE"
    },
    "languages": {
      "type": "array",
      "description": "ISO 639-1 codes, upper-cased, active in the tenant's language catalogue.",
      "items": {
        "type": "string"
      },
      "example": [
        "EN",
        "LT"
      ]
    },
    "serviceIds": {
      "type": "array",
      "description": "Opaque service identifiers, active at this location. Read a service's own name and duration from the service resource; no second copy is published here.",
      "items": {
        "type": "string"
      },
      "example": [
        "77777777-7777-4777-8777-777777777777"
      ]
    },
    "windowIds": {
      "type": "array",
      "description": "The business window ids of this location's windows — the `windows[].id` values of the location configuration document (`GET …/locations/{locationId}/configuration`). Read a window's own floor and status there; no second copy is published here.",
      "items": {
        "type": "string"
      },
      "example": [
        "A1"
      ]
    },
    "presence": {
      "type": "string",
      "description": "The profile's live status, evaluated at the instant of the read. Read-only: no operation this document describes ever writes it.",
      "enum": [
        "AVAILABLE",
        "BUSY",
        "BREAK",
        "BACK_OFFICE",
        "OFFLINE"
      ],
      "example": "AVAILABLE"
    }
  },
  "required": [
    "id",
    "userId",
    "email",
    "name",
    "employeeId",
    "status",
    "languages",
    "serviceIds",
    "windowIds",
    "presence"
  ]
}

401 — No valid API credential was presented. Every refusal cause — absent, malformed, unknown, expired, revoked, or belonging to another tenant — answers with this one document, and no `WWW-Authenticate` header is returned.

401 · Example
{
  "type": "urn:qms:problem:unauthenticated",
  "title": "Unauthenticated",
  "status": 401,
  "code": "unauthenticated",
  "detail": "The request presented no valid API credential."
}
401 response schema

An RFC 9457 problem document: `type`, `title`, `status`, `code` and `detail`, every one of those five always present. `errors`, `blockers`, `checkCode` and `planLimit` are the exceptions — each is scoped to one family of refusal and is ABSENT on every other document, which is why none is required below. `code` is the stable, machine-readable member; branch on it rather than on `title` or `detail`, which are English prose meant for a developer reading a log.

type · string · required

A URN identifying the problem kind, one per `code`.

title · string · required

A fixed English summary of the problem kind.

status · integer · required

The HTTP status code, repeated in the body.

code · string · required

The published slug this surface's error vocabulary uses.

detail · string · required

An English explanation of this occurrence.

errors · array · optional

One entry per offending field of a 400 field-validation refusal. Present on those alone, and ABSENT — not null, not an empty array — on every other problem document, including a field-validation refusal that can name no single field. Sorted by `field`, so two refusals over the same body produce the same document.

Show nested fields

One offending field of a 400 field-validation refusal.

field · string · required

The member as THIS document spells it, which is not always what the same field is called inside the system.

code · string · required

The published reason slug. Typed as a plain string rather than an enumeration, because the set is not closed — an integrity backstop can report a slug outside the published list. The values in use today are `required`, `too_long`, `invalid_format`, `invalid_timezone`, `invalid_locale`, `invalid_country`, `name_taken`, `code_taken`, `display_prefix_taken`, `out_of_range`, `not_in_catalogue`, `archived`, `duplicate`, `not_found`, `not_linked_to_location`, `inactive`, `language_not_in_catalogue`, `not_writable`, `password_too_short` and `password_breached`. Three of them are worth a sentence. `invalid_format` covers a value whose SHAPE is wrong — a window code that is not alphanumeric, a time that is not `HH:MM` — and, on the operating hours, the one fault that is a relation rather than a shape: a `closesAt` that is not after its `opensAt`, where both values are well formed and it is their ORDER that is refused. It also covers a member whose JSON type cannot be read — a string where a boolean belongs — reported under its path, e.g. `operatingHours[0].closed`. `not_found` means the member names something this tenant does not hold; it is the same word as the document-level `code` that answers an unserved path, at a different level and never with that status. `not_writable` is the operator invite, the operator profile edit and the visit-reason replace's own: a body member the request type declares no slot for, refused by NAME whether or not its value would have changed anything. `password_too_short` and `password_breached` are the operator create's own, under `initialPassword`.

blockers · array · optional

One entry per non-zero blocking category of a 409 refusal that names what blocks it. Present on those alone, and ABSENT on every other problem document. A category with nothing to report is absent rather than present with a count of 0.

Show nested fields

One non-zero blocking category of a 409 refusal, and how many things it counted.

kind · string · required

What kind of thing still depends on the entry — or, on a configuration refusal, on what the write would take away.

Allowed values: "LOCATION", "TICKET", "APPOINTMENT", "TEMPLATE", "OPERATOR"

count · integer · required

How many of them there are. Always greater than zero.

checkCode · string · optional

The discovery-failure code of a `connection_check_failed` refusal: `unreachable`, `timeout`, `not_https`, `private_address`, `issuer_mismatch`, `missing_endpoint` or `invalid_document`. Present on that refusal alone, and ABSENT on every other problem document.

planLimit · object · optional

What a `plan_location_limit_reached` refusal reports. Present on that refusal alone, and ABSENT on every other problem document. Exactly one of `nextPlan` and `enterpriseOffer` is present: `nextPlan` when an active plan above the active location count exists, `enterpriseOffer` when none does. `contactEmail` is absent when no contact address is configured.

Show nested fields

What a `plan_location_limit_reached` refusal reports. Present on that refusal alone, and ABSENT on every other problem document. Exactly one of `nextPlan` and `enterpriseOffer` is present: `nextPlan` when an active plan above the active location count exists, `enterpriseOffer` when none does. `contactEmail` is absent when no contact address is configured.

currentPlan · object · required

A plan named by a `plan_location_limit_reached` refusal.

Show nested fields

A plan named by a `plan_location_limit_reached` refusal.

planId · string · required

The plan's stable identifier.

displayName · string · required

The plan's name, not translated.

maxLocations · integer · required

The most ACTIVE locations the plan covers.

activeLocations · integer · required

The number of ACTIVE locations the tenant holds.

nextPlan · object · optional

A plan named by a `plan_location_limit_reached` refusal.

Show nested fields

A plan named by a `plan_location_limit_reached` refusal.

planId · string · required

The plan's stable identifier.

displayName · string · required

The plan's name, not translated.

maxLocations · integer · required

The most ACTIVE locations the plan covers.

enterpriseOffer · object · optional

The published Enterprise offer, named when no active plan covers the tenant's active location count.

Show nested fields

The published Enterprise offer, named when no active plan covers the tenant's active location count.

minLocations · integer · required

The smallest number of locations the offer covers.

fromMonthlyPriceCents · integer · int64 · required

The monthly price from which the offer starts, in euro cents.

extraLocationPriceCents · integer · int64 · required

The monthly price of each location beyond `minLocations`, in euro cents.

contactEmail · string · optional

The address to write to about a larger plan or an individual contract.

Raw JSON Schema

application/problem+json

{
  "type": "object",
  "description": "An RFC 9457 problem document: `type`, `title`, `status`, `code` and `detail`, every one of those five always present. `errors`, `blockers`, `checkCode` and `planLimit` are the exceptions — each is scoped to one family of refusal and is ABSENT on every other document, which is why none is required below. `code` is the stable, machine-readable member; branch on it rather than on `title` or `detail`, which are English prose meant for a developer reading a log.",
  "properties": {
    "type": {
      "type": "string",
      "description": "A URN identifying the problem kind, one per `code`.",
      "example": "urn:qms:problem:location_not_found"
    },
    "title": {
      "type": "string",
      "description": "A fixed English summary of the problem kind.",
      "example": "Location Not Found"
    },
    "status": {
      "type": "integer",
      "description": "The HTTP status code, repeated in the body.",
      "example": 404
    },
    "code": {
      "type": "string",
      "description": "The published slug this surface's error vocabulary uses.",
      "example": "location_not_found"
    },
    "detail": {
      "type": "string",
      "description": "An English explanation of this occurrence.",
      "example": "No location was found for this identifier."
    },
    "errors": {
      "type": "array",
      "description": "One entry per offending field of a 400 field-validation refusal. Present on those alone, and ABSENT — not null, not an empty array — on every other problem document, including a field-validation refusal that can name no single field. Sorted by `field`, so two refusals over the same body produce the same document.",
      "items": {
        "type": "object",
        "description": "One offending field of a 400 field-validation refusal.",
        "properties": {
          "field": {
            "type": "string",
            "description": "The member as THIS document spells it, which is not always what the same field is called inside the system.",
            "example": "defaultLocale"
          },
          "code": {
            "type": "string",
            "description": "The published reason slug. Typed as a plain string rather than an enumeration, because the set is not closed — an integrity backstop can report a slug outside the published list. The values in use today are `required`, `too_long`, `invalid_format`, `invalid_timezone`, `invalid_locale`, `invalid_country`, `name_taken`, `code_taken`, `display_prefix_taken`, `out_of_range`, `not_in_catalogue`, `archived`, `duplicate`, `not_found`, `not_linked_to_location`, `inactive`, `language_not_in_catalogue`, `not_writable`, `password_too_short` and `password_breached`.\n\nThree of them are worth a sentence. `invalid_format` covers a value whose SHAPE is wrong — a window code that is not alphanumeric, a time that is not `HH:MM` — and, on the operating hours, the one fault that is a relation rather than a shape: a `closesAt` that is not after its `opensAt`, where both values are well formed and it is their ORDER that is refused. It also covers a member whose JSON type cannot be read — a string where a boolean belongs — reported under its path, e.g. `operatingHours[0].closed`. `not_found` means the member names something this tenant does not hold; it is the same word as the document-level `code` that answers an unserved path, at a different level and never with that status. `not_writable` is the operator invite, the operator profile edit and the visit-reason replace's own: a body member the request type declares no slot for, refused by NAME whether or not its value would have changed anything. `password_too_short` and `password_breached` are the operator create's own, under `initialPassword`.",
            "example": "invalid_locale"
          }
        },
        "required": [
          "field",
          "code"
        ]
      }
    },
    "blockers": {
      "type": "array",
      "description": "One entry per non-zero blocking category of a 409 refusal that names what blocks it. Present on those alone, and ABSENT on every other problem document. A category with nothing to report is absent rather than present with a count of 0.",
      "items": {
        "type": "object",
        "description": "One non-zero blocking category of a 409 refusal, and how many things it counted.",
        "properties": {
          "kind": {
            "type": "string",
            "description": "What kind of thing still depends on the entry — or, on a configuration refusal, on what the write would take away.",
            "enum": [
              "LOCATION",
              "TICKET",
              "APPOINTMENT",
              "TEMPLATE",
              "OPERATOR"
            ],
            "example": "TICKET"
          },
          "count": {
            "type": "integer",
            "description": "How many of them there are. Always greater than zero.",
            "example": 3
          }
        },
        "required": [
          "kind",
          "count"
        ]
      }
    },
    "checkCode": {
      "type": "string",
      "description": "The discovery-failure code of a `connection_check_failed` refusal: `unreachable`, `timeout`, `not_https`, `private_address`, `issuer_mismatch`, `missing_endpoint` or `invalid_document`. Present on that refusal alone, and ABSENT on every other problem document.",
      "example": "unreachable"
    },
    "planLimit": {
      "type": "object",
      "description": "What a `plan_location_limit_reached` refusal reports. Present on that refusal alone, and ABSENT on every other problem document. Exactly one of `nextPlan` and `enterpriseOffer` is present: `nextPlan` when an active plan above the active location count exists, `enterpriseOffer` when none does. `contactEmail` is absent when no contact address is configured.",
      "properties": {
        "currentPlan": {
          "type": "object",
          "description": "A plan named by a `plan_location_limit_reached` refusal.",
          "properties": {
            "planId": {
              "type": "string",
              "description": "The plan's stable identifier.",
              "example": "business"
            },
            "displayName": {
              "type": "string",
              "description": "The plan's name, not translated.",
              "example": "Business"
            },
            "maxLocations": {
              "type": "integer",
              "description": "The most ACTIVE locations the plan covers.",
              "example": 5
            }
          },
          "required": [
            "planId",
            "displayName",
            "maxLocations"
          ]
        },
        "activeLocations": {
          "type": "integer",
          "description": "The number of ACTIVE locations the tenant holds.",
          "example": 3
        },
        "nextPlan": {
          "type": "object",
          "description": "A plan named by a `plan_location_limit_reached` refusal.",
          "properties": {
            "planId": {
              "type": "string",
              "description": "The plan's stable identifier.",
              "example": "business"
            },
            "displayName": {
              "type": "string",
              "description": "The plan's name, not translated.",
              "example": "Business"
            },
            "maxLocations": {
              "type": "integer",
              "description": "The most ACTIVE locations the plan covers.",
              "example": 5
            }
          },
          "required": [
            "planId",
            "displayName",
            "maxLocations"
          ]
        },
        "enterpriseOffer": {
          "type": "object",
          "description": "The published Enterprise offer, named when no active plan covers the tenant's active location count.",
          "properties": {
            "minLocations": {
              "type": "integer",
              "description": "The smallest number of locations the offer covers.",
              "example": 8
            },
            "fromMonthlyPriceCents": {
              "type": "integer",
              "format": "int64",
              "description": "The monthly price from which the offer starts, in euro cents.",
              "example": 27900
            },
            "extraLocationPriceCents": {
              "type": "integer",
              "format": "int64",
              "description": "The monthly price of each location beyond `minLocations`, in euro cents.",
              "example": 2900
            }
          },
          "required": [
            "minLocations",
            "fromMonthlyPriceCents",
            "extraLocationPriceCents"
          ]
        },
        "contactEmail": {
          "type": "string",
          "description": "The address to write to about a larger plan or an individual contract.",
          "example": "sales@example.com"
        }
      },
      "required": [
        "currentPlan",
        "activeLocations"
      ]
    }
  },
  "required": [
    "type",
    "title",
    "status",
    "code",
    "detail"
  ],
  "additionalProperties": false
}

403 — The authenticated credential does not carry a scope that admits this operation. The scope check runs before every other admission check, so this refusal displaces `insufficient_authority` on an operation that requires both.

403 · Example
{
  "type": "urn:qms:problem:insufficient_scope",
  "title": "Insufficient Scope",
  "status": 403,
  "code": "insufficient_scope",
  "detail": "The API credential does not reach this operation."
}
403 response schema

An RFC 9457 problem document: `type`, `title`, `status`, `code` and `detail`, every one of those five always present. `errors`, `blockers`, `checkCode` and `planLimit` are the exceptions — each is scoped to one family of refusal and is ABSENT on every other document, which is why none is required below. `code` is the stable, machine-readable member; branch on it rather than on `title` or `detail`, which are English prose meant for a developer reading a log.

type · string · required

A URN identifying the problem kind, one per `code`.

title · string · required

A fixed English summary of the problem kind.

status · integer · required

The HTTP status code, repeated in the body.

code · string · required

The published slug this surface's error vocabulary uses.

detail · string · required

An English explanation of this occurrence.

errors · array · optional

One entry per offending field of a 400 field-validation refusal. Present on those alone, and ABSENT — not null, not an empty array — on every other problem document, including a field-validation refusal that can name no single field. Sorted by `field`, so two refusals over the same body produce the same document.

Show nested fields

One offending field of a 400 field-validation refusal.

field · string · required

The member as THIS document spells it, which is not always what the same field is called inside the system.

code · string · required

The published reason slug. Typed as a plain string rather than an enumeration, because the set is not closed — an integrity backstop can report a slug outside the published list. The values in use today are `required`, `too_long`, `invalid_format`, `invalid_timezone`, `invalid_locale`, `invalid_country`, `name_taken`, `code_taken`, `display_prefix_taken`, `out_of_range`, `not_in_catalogue`, `archived`, `duplicate`, `not_found`, `not_linked_to_location`, `inactive`, `language_not_in_catalogue`, `not_writable`, `password_too_short` and `password_breached`. Three of them are worth a sentence. `invalid_format` covers a value whose SHAPE is wrong — a window code that is not alphanumeric, a time that is not `HH:MM` — and, on the operating hours, the one fault that is a relation rather than a shape: a `closesAt` that is not after its `opensAt`, where both values are well formed and it is their ORDER that is refused. It also covers a member whose JSON type cannot be read — a string where a boolean belongs — reported under its path, e.g. `operatingHours[0].closed`. `not_found` means the member names something this tenant does not hold; it is the same word as the document-level `code` that answers an unserved path, at a different level and never with that status. `not_writable` is the operator invite, the operator profile edit and the visit-reason replace's own: a body member the request type declares no slot for, refused by NAME whether or not its value would have changed anything. `password_too_short` and `password_breached` are the operator create's own, under `initialPassword`.

blockers · array · optional

One entry per non-zero blocking category of a 409 refusal that names what blocks it. Present on those alone, and ABSENT on every other problem document. A category with nothing to report is absent rather than present with a count of 0.

Show nested fields

One non-zero blocking category of a 409 refusal, and how many things it counted.

kind · string · required

What kind of thing still depends on the entry — or, on a configuration refusal, on what the write would take away.

Allowed values: "LOCATION", "TICKET", "APPOINTMENT", "TEMPLATE", "OPERATOR"

count · integer · required

How many of them there are. Always greater than zero.

checkCode · string · optional

The discovery-failure code of a `connection_check_failed` refusal: `unreachable`, `timeout`, `not_https`, `private_address`, `issuer_mismatch`, `missing_endpoint` or `invalid_document`. Present on that refusal alone, and ABSENT on every other problem document.

planLimit · object · optional

What a `plan_location_limit_reached` refusal reports. Present on that refusal alone, and ABSENT on every other problem document. Exactly one of `nextPlan` and `enterpriseOffer` is present: `nextPlan` when an active plan above the active location count exists, `enterpriseOffer` when none does. `contactEmail` is absent when no contact address is configured.

Show nested fields

What a `plan_location_limit_reached` refusal reports. Present on that refusal alone, and ABSENT on every other problem document. Exactly one of `nextPlan` and `enterpriseOffer` is present: `nextPlan` when an active plan above the active location count exists, `enterpriseOffer` when none does. `contactEmail` is absent when no contact address is configured.

currentPlan · object · required

A plan named by a `plan_location_limit_reached` refusal.

Show nested fields

A plan named by a `plan_location_limit_reached` refusal.

planId · string · required

The plan's stable identifier.

displayName · string · required

The plan's name, not translated.

maxLocations · integer · required

The most ACTIVE locations the plan covers.

activeLocations · integer · required

The number of ACTIVE locations the tenant holds.

nextPlan · object · optional

A plan named by a `plan_location_limit_reached` refusal.

Show nested fields

A plan named by a `plan_location_limit_reached` refusal.

planId · string · required

The plan's stable identifier.

displayName · string · required

The plan's name, not translated.

maxLocations · integer · required

The most ACTIVE locations the plan covers.

enterpriseOffer · object · optional

The published Enterprise offer, named when no active plan covers the tenant's active location count.

Show nested fields

The published Enterprise offer, named when no active plan covers the tenant's active location count.

minLocations · integer · required

The smallest number of locations the offer covers.

fromMonthlyPriceCents · integer · int64 · required

The monthly price from which the offer starts, in euro cents.

extraLocationPriceCents · integer · int64 · required

The monthly price of each location beyond `minLocations`, in euro cents.

contactEmail · string · optional

The address to write to about a larger plan or an individual contract.

Raw JSON Schema

application/problem+json

{
  "type": "object",
  "description": "An RFC 9457 problem document: `type`, `title`, `status`, `code` and `detail`, every one of those five always present. `errors`, `blockers`, `checkCode` and `planLimit` are the exceptions — each is scoped to one family of refusal and is ABSENT on every other document, which is why none is required below. `code` is the stable, machine-readable member; branch on it rather than on `title` or `detail`, which are English prose meant for a developer reading a log.",
  "properties": {
    "type": {
      "type": "string",
      "description": "A URN identifying the problem kind, one per `code`.",
      "example": "urn:qms:problem:location_not_found"
    },
    "title": {
      "type": "string",
      "description": "A fixed English summary of the problem kind.",
      "example": "Location Not Found"
    },
    "status": {
      "type": "integer",
      "description": "The HTTP status code, repeated in the body.",
      "example": 404
    },
    "code": {
      "type": "string",
      "description": "The published slug this surface's error vocabulary uses.",
      "example": "location_not_found"
    },
    "detail": {
      "type": "string",
      "description": "An English explanation of this occurrence.",
      "example": "No location was found for this identifier."
    },
    "errors": {
      "type": "array",
      "description": "One entry per offending field of a 400 field-validation refusal. Present on those alone, and ABSENT — not null, not an empty array — on every other problem document, including a field-validation refusal that can name no single field. Sorted by `field`, so two refusals over the same body produce the same document.",
      "items": {
        "type": "object",
        "description": "One offending field of a 400 field-validation refusal.",
        "properties": {
          "field": {
            "type": "string",
            "description": "The member as THIS document spells it, which is not always what the same field is called inside the system.",
            "example": "defaultLocale"
          },
          "code": {
            "type": "string",
            "description": "The published reason slug. Typed as a plain string rather than an enumeration, because the set is not closed — an integrity backstop can report a slug outside the published list. The values in use today are `required`, `too_long`, `invalid_format`, `invalid_timezone`, `invalid_locale`, `invalid_country`, `name_taken`, `code_taken`, `display_prefix_taken`, `out_of_range`, `not_in_catalogue`, `archived`, `duplicate`, `not_found`, `not_linked_to_location`, `inactive`, `language_not_in_catalogue`, `not_writable`, `password_too_short` and `password_breached`.\n\nThree of them are worth a sentence. `invalid_format` covers a value whose SHAPE is wrong — a window code that is not alphanumeric, a time that is not `HH:MM` — and, on the operating hours, the one fault that is a relation rather than a shape: a `closesAt` that is not after its `opensAt`, where both values are well formed and it is their ORDER that is refused. It also covers a member whose JSON type cannot be read — a string where a boolean belongs — reported under its path, e.g. `operatingHours[0].closed`. `not_found` means the member names something this tenant does not hold; it is the same word as the document-level `code` that answers an unserved path, at a different level and never with that status. `not_writable` is the operator invite, the operator profile edit and the visit-reason replace's own: a body member the request type declares no slot for, refused by NAME whether or not its value would have changed anything. `password_too_short` and `password_breached` are the operator create's own, under `initialPassword`.",
            "example": "invalid_locale"
          }
        },
        "required": [
          "field",
          "code"
        ]
      }
    },
    "blockers": {
      "type": "array",
      "description": "One entry per non-zero blocking category of a 409 refusal that names what blocks it. Present on those alone, and ABSENT on every other problem document. A category with nothing to report is absent rather than present with a count of 0.",
      "items": {
        "type": "object",
        "description": "One non-zero blocking category of a 409 refusal, and how many things it counted.",
        "properties": {
          "kind": {
            "type": "string",
            "description": "What kind of thing still depends on the entry — or, on a configuration refusal, on what the write would take away.",
            "enum": [
              "LOCATION",
              "TICKET",
              "APPOINTMENT",
              "TEMPLATE",
              "OPERATOR"
            ],
            "example": "TICKET"
          },
          "count": {
            "type": "integer",
            "description": "How many of them there are. Always greater than zero.",
            "example": 3
          }
        },
        "required": [
          "kind",
          "count"
        ]
      }
    },
    "checkCode": {
      "type": "string",
      "description": "The discovery-failure code of a `connection_check_failed` refusal: `unreachable`, `timeout`, `not_https`, `private_address`, `issuer_mismatch`, `missing_endpoint` or `invalid_document`. Present on that refusal alone, and ABSENT on every other problem document.",
      "example": "unreachable"
    },
    "planLimit": {
      "type": "object",
      "description": "What a `plan_location_limit_reached` refusal reports. Present on that refusal alone, and ABSENT on every other problem document. Exactly one of `nextPlan` and `enterpriseOffer` is present: `nextPlan` when an active plan above the active location count exists, `enterpriseOffer` when none does. `contactEmail` is absent when no contact address is configured.",
      "properties": {
        "currentPlan": {
          "type": "object",
          "description": "A plan named by a `plan_location_limit_reached` refusal.",
          "properties": {
            "planId": {
              "type": "string",
              "description": "The plan's stable identifier.",
              "example": "business"
            },
            "displayName": {
              "type": "string",
              "description": "The plan's name, not translated.",
              "example": "Business"
            },
            "maxLocations": {
              "type": "integer",
              "description": "The most ACTIVE locations the plan covers.",
              "example": 5
            }
          },
          "required": [
            "planId",
            "displayName",
            "maxLocations"
          ]
        },
        "activeLocations": {
          "type": "integer",
          "description": "The number of ACTIVE locations the tenant holds.",
          "example": 3
        },
        "nextPlan": {
          "type": "object",
          "description": "A plan named by a `plan_location_limit_reached` refusal.",
          "properties": {
            "planId": {
              "type": "string",
              "description": "The plan's stable identifier.",
              "example": "business"
            },
            "displayName": {
              "type": "string",
              "description": "The plan's name, not translated.",
              "example": "Business"
            },
            "maxLocations": {
              "type": "integer",
              "description": "The most ACTIVE locations the plan covers.",
              "example": 5
            }
          },
          "required": [
            "planId",
            "displayName",
            "maxLocations"
          ]
        },
        "enterpriseOffer": {
          "type": "object",
          "description": "The published Enterprise offer, named when no active plan covers the tenant's active location count.",
          "properties": {
            "minLocations": {
              "type": "integer",
              "description": "The smallest number of locations the offer covers.",
              "example": 8
            },
            "fromMonthlyPriceCents": {
              "type": "integer",
              "format": "int64",
              "description": "The monthly price from which the offer starts, in euro cents.",
              "example": 27900
            },
            "extraLocationPriceCents": {
              "type": "integer",
              "format": "int64",
              "description": "The monthly price of each location beyond `minLocations`, in euro cents.",
              "example": 2900
            }
          },
          "required": [
            "minLocations",
            "fromMonthlyPriceCents",
            "extraLocationPriceCents"
          ]
        },
        "contactEmail": {
          "type": "string",
          "description": "The address to write to about a larger plan or an individual contract.",
          "example": "sales@example.com"
        }
      },
      "required": [
        "currentPlan",
        "activeLocations"
      ]
    }
  },
  "required": [
    "type",
    "title",
    "status",
    "code",
    "detail"
  ],
  "additionalProperties": false
}

404 — No operator profile answered the request. Two codes share this status: `location_not_found` when the location itself is outside the credential's reach, in another tenant or nonexistent, and `operator_not_found` for every other invisibility cause — an ARCHIVED location included, because the profile lookup cannot tell an archived, reachable location apart from an absent profile, so the two collapse onto the same code a profile lookup already uses. Shared by the single read, the edit, the removal, the deactivate and the reactivate. Branch on `code`.

404 · locationNotFound
{
  "type": "urn:qms:problem:location_not_found",
  "title": "Location Not Found",
  "status": 404,
  "code": "location_not_found",
  "detail": "No location was found for this identifier."
}
404 · operatorNotFound
{
  "type": "urn:qms:problem:operator_not_found",
  "title": "Operator Not Found",
  "status": 404,
  "code": "operator_not_found",
  "detail": "No operator profile was found for this identifier at this location."
}
404 response schema

An RFC 9457 problem document: `type`, `title`, `status`, `code` and `detail`, every one of those five always present. `errors`, `blockers`, `checkCode` and `planLimit` are the exceptions — each is scoped to one family of refusal and is ABSENT on every other document, which is why none is required below. `code` is the stable, machine-readable member; branch on it rather than on `title` or `detail`, which are English prose meant for a developer reading a log.

type · string · required

A URN identifying the problem kind, one per `code`.

title · string · required

A fixed English summary of the problem kind.

status · integer · required

The HTTP status code, repeated in the body.

code · string · required

The published slug this surface's error vocabulary uses.

detail · string · required

An English explanation of this occurrence.

errors · array · optional

One entry per offending field of a 400 field-validation refusal. Present on those alone, and ABSENT — not null, not an empty array — on every other problem document, including a field-validation refusal that can name no single field. Sorted by `field`, so two refusals over the same body produce the same document.

Show nested fields

One offending field of a 400 field-validation refusal.

field · string · required

The member as THIS document spells it, which is not always what the same field is called inside the system.

code · string · required

The published reason slug. Typed as a plain string rather than an enumeration, because the set is not closed — an integrity backstop can report a slug outside the published list. The values in use today are `required`, `too_long`, `invalid_format`, `invalid_timezone`, `invalid_locale`, `invalid_country`, `name_taken`, `code_taken`, `display_prefix_taken`, `out_of_range`, `not_in_catalogue`, `archived`, `duplicate`, `not_found`, `not_linked_to_location`, `inactive`, `language_not_in_catalogue`, `not_writable`, `password_too_short` and `password_breached`. Three of them are worth a sentence. `invalid_format` covers a value whose SHAPE is wrong — a window code that is not alphanumeric, a time that is not `HH:MM` — and, on the operating hours, the one fault that is a relation rather than a shape: a `closesAt` that is not after its `opensAt`, where both values are well formed and it is their ORDER that is refused. It also covers a member whose JSON type cannot be read — a string where a boolean belongs — reported under its path, e.g. `operatingHours[0].closed`. `not_found` means the member names something this tenant does not hold; it is the same word as the document-level `code` that answers an unserved path, at a different level and never with that status. `not_writable` is the operator invite, the operator profile edit and the visit-reason replace's own: a body member the request type declares no slot for, refused by NAME whether or not its value would have changed anything. `password_too_short` and `password_breached` are the operator create's own, under `initialPassword`.

blockers · array · optional

One entry per non-zero blocking category of a 409 refusal that names what blocks it. Present on those alone, and ABSENT on every other problem document. A category with nothing to report is absent rather than present with a count of 0.

Show nested fields

One non-zero blocking category of a 409 refusal, and how many things it counted.

kind · string · required

What kind of thing still depends on the entry — or, on a configuration refusal, on what the write would take away.

Allowed values: "LOCATION", "TICKET", "APPOINTMENT", "TEMPLATE", "OPERATOR"

count · integer · required

How many of them there are. Always greater than zero.

checkCode · string · optional

The discovery-failure code of a `connection_check_failed` refusal: `unreachable`, `timeout`, `not_https`, `private_address`, `issuer_mismatch`, `missing_endpoint` or `invalid_document`. Present on that refusal alone, and ABSENT on every other problem document.

planLimit · object · optional

What a `plan_location_limit_reached` refusal reports. Present on that refusal alone, and ABSENT on every other problem document. Exactly one of `nextPlan` and `enterpriseOffer` is present: `nextPlan` when an active plan above the active location count exists, `enterpriseOffer` when none does. `contactEmail` is absent when no contact address is configured.

Show nested fields

What a `plan_location_limit_reached` refusal reports. Present on that refusal alone, and ABSENT on every other problem document. Exactly one of `nextPlan` and `enterpriseOffer` is present: `nextPlan` when an active plan above the active location count exists, `enterpriseOffer` when none does. `contactEmail` is absent when no contact address is configured.

currentPlan · object · required

A plan named by a `plan_location_limit_reached` refusal.

Show nested fields

A plan named by a `plan_location_limit_reached` refusal.

planId · string · required

The plan's stable identifier.

displayName · string · required

The plan's name, not translated.

maxLocations · integer · required

The most ACTIVE locations the plan covers.

activeLocations · integer · required

The number of ACTIVE locations the tenant holds.

nextPlan · object · optional

A plan named by a `plan_location_limit_reached` refusal.

Show nested fields

A plan named by a `plan_location_limit_reached` refusal.

planId · string · required

The plan's stable identifier.

displayName · string · required

The plan's name, not translated.

maxLocations · integer · required

The most ACTIVE locations the plan covers.

enterpriseOffer · object · optional

The published Enterprise offer, named when no active plan covers the tenant's active location count.

Show nested fields

The published Enterprise offer, named when no active plan covers the tenant's active location count.

minLocations · integer · required

The smallest number of locations the offer covers.

fromMonthlyPriceCents · integer · int64 · required

The monthly price from which the offer starts, in euro cents.

extraLocationPriceCents · integer · int64 · required

The monthly price of each location beyond `minLocations`, in euro cents.

contactEmail · string · optional

The address to write to about a larger plan or an individual contract.

Raw JSON Schema

application/problem+json

{
  "type": "object",
  "description": "An RFC 9457 problem document: `type`, `title`, `status`, `code` and `detail`, every one of those five always present. `errors`, `blockers`, `checkCode` and `planLimit` are the exceptions — each is scoped to one family of refusal and is ABSENT on every other document, which is why none is required below. `code` is the stable, machine-readable member; branch on it rather than on `title` or `detail`, which are English prose meant for a developer reading a log.",
  "properties": {
    "type": {
      "type": "string",
      "description": "A URN identifying the problem kind, one per `code`.",
      "example": "urn:qms:problem:location_not_found"
    },
    "title": {
      "type": "string",
      "description": "A fixed English summary of the problem kind.",
      "example": "Location Not Found"
    },
    "status": {
      "type": "integer",
      "description": "The HTTP status code, repeated in the body.",
      "example": 404
    },
    "code": {
      "type": "string",
      "description": "The published slug this surface's error vocabulary uses.",
      "example": "location_not_found"
    },
    "detail": {
      "type": "string",
      "description": "An English explanation of this occurrence.",
      "example": "No location was found for this identifier."
    },
    "errors": {
      "type": "array",
      "description": "One entry per offending field of a 400 field-validation refusal. Present on those alone, and ABSENT — not null, not an empty array — on every other problem document, including a field-validation refusal that can name no single field. Sorted by `field`, so two refusals over the same body produce the same document.",
      "items": {
        "type": "object",
        "description": "One offending field of a 400 field-validation refusal.",
        "properties": {
          "field": {
            "type": "string",
            "description": "The member as THIS document spells it, which is not always what the same field is called inside the system.",
            "example": "defaultLocale"
          },
          "code": {
            "type": "string",
            "description": "The published reason slug. Typed as a plain string rather than an enumeration, because the set is not closed — an integrity backstop can report a slug outside the published list. The values in use today are `required`, `too_long`, `invalid_format`, `invalid_timezone`, `invalid_locale`, `invalid_country`, `name_taken`, `code_taken`, `display_prefix_taken`, `out_of_range`, `not_in_catalogue`, `archived`, `duplicate`, `not_found`, `not_linked_to_location`, `inactive`, `language_not_in_catalogue`, `not_writable`, `password_too_short` and `password_breached`.\n\nThree of them are worth a sentence. `invalid_format` covers a value whose SHAPE is wrong — a window code that is not alphanumeric, a time that is not `HH:MM` — and, on the operating hours, the one fault that is a relation rather than a shape: a `closesAt` that is not after its `opensAt`, where both values are well formed and it is their ORDER that is refused. It also covers a member whose JSON type cannot be read — a string where a boolean belongs — reported under its path, e.g. `operatingHours[0].closed`. `not_found` means the member names something this tenant does not hold; it is the same word as the document-level `code` that answers an unserved path, at a different level and never with that status. `not_writable` is the operator invite, the operator profile edit and the visit-reason replace's own: a body member the request type declares no slot for, refused by NAME whether or not its value would have changed anything. `password_too_short` and `password_breached` are the operator create's own, under `initialPassword`.",
            "example": "invalid_locale"
          }
        },
        "required": [
          "field",
          "code"
        ]
      }
    },
    "blockers": {
      "type": "array",
      "description": "One entry per non-zero blocking category of a 409 refusal that names what blocks it. Present on those alone, and ABSENT on every other problem document. A category with nothing to report is absent rather than present with a count of 0.",
      "items": {
        "type": "object",
        "description": "One non-zero blocking category of a 409 refusal, and how many things it counted.",
        "properties": {
          "kind": {
            "type": "string",
            "description": "What kind of thing still depends on the entry — or, on a configuration refusal, on what the write would take away.",
            "enum": [
              "LOCATION",
              "TICKET",
              "APPOINTMENT",
              "TEMPLATE",
              "OPERATOR"
            ],
            "example": "TICKET"
          },
          "count": {
            "type": "integer",
            "description": "How many of them there are. Always greater than zero.",
            "example": 3
          }
        },
        "required": [
          "kind",
          "count"
        ]
      }
    },
    "checkCode": {
      "type": "string",
      "description": "The discovery-failure code of a `connection_check_failed` refusal: `unreachable`, `timeout`, `not_https`, `private_address`, `issuer_mismatch`, `missing_endpoint` or `invalid_document`. Present on that refusal alone, and ABSENT on every other problem document.",
      "example": "unreachable"
    },
    "planLimit": {
      "type": "object",
      "description": "What a `plan_location_limit_reached` refusal reports. Present on that refusal alone, and ABSENT on every other problem document. Exactly one of `nextPlan` and `enterpriseOffer` is present: `nextPlan` when an active plan above the active location count exists, `enterpriseOffer` when none does. `contactEmail` is absent when no contact address is configured.",
      "properties": {
        "currentPlan": {
          "type": "object",
          "description": "A plan named by a `plan_location_limit_reached` refusal.",
          "properties": {
            "planId": {
              "type": "string",
              "description": "The plan's stable identifier.",
              "example": "business"
            },
            "displayName": {
              "type": "string",
              "description": "The plan's name, not translated.",
              "example": "Business"
            },
            "maxLocations": {
              "type": "integer",
              "description": "The most ACTIVE locations the plan covers.",
              "example": 5
            }
          },
          "required": [
            "planId",
            "displayName",
            "maxLocations"
          ]
        },
        "activeLocations": {
          "type": "integer",
          "description": "The number of ACTIVE locations the tenant holds.",
          "example": 3
        },
        "nextPlan": {
          "type": "object",
          "description": "A plan named by a `plan_location_limit_reached` refusal.",
          "properties": {
            "planId": {
              "type": "string",
              "description": "The plan's stable identifier.",
              "example": "business"
            },
            "displayName": {
              "type": "string",
              "description": "The plan's name, not translated.",
              "example": "Business"
            },
            "maxLocations": {
              "type": "integer",
              "description": "The most ACTIVE locations the plan covers.",
              "example": 5
            }
          },
          "required": [
            "planId",
            "displayName",
            "maxLocations"
          ]
        },
        "enterpriseOffer": {
          "type": "object",
          "description": "The published Enterprise offer, named when no active plan covers the tenant's active location count.",
          "properties": {
            "minLocations": {
              "type": "integer",
              "description": "The smallest number of locations the offer covers.",
              "example": 8
            },
            "fromMonthlyPriceCents": {
              "type": "integer",
              "format": "int64",
              "description": "The monthly price from which the offer starts, in euro cents.",
              "example": 27900
            },
            "extraLocationPriceCents": {
              "type": "integer",
              "format": "int64",
              "description": "The monthly price of each location beyond `minLocations`, in euro cents.",
              "example": 2900
            }
          },
          "required": [
            "minLocations",
            "fromMonthlyPriceCents",
            "extraLocationPriceCents"
          ]
        },
        "contactEmail": {
          "type": "string",
          "description": "The address to write to about a larger plan or an individual contract.",
          "example": "sales@example.com"
        }
      },
      "required": [
        "currentPlan",
        "activeLocations"
      ]
    }
  },
  "required": [
    "type",
    "title",
    "status",
    "code",
    "detail"
  ],
  "additionalProperties": false
}

409 — The reactivate was refused. Two codes share this status: `operator_not_inactive` when the profile cannot transition at all — evaluated FIRST — and `user_not_assignable` when the backing user account is DISABLED. Branch on `code`.

409 · operatorNotInactive
{
  "type": "urn:qms:problem:operator_not_inactive",
  "title": "Operator Not Inactive",
  "status": 409,
  "code": "operator_not_inactive",
  "detail": "The operator profile is not inactive."
}
409 · userNotAssignable
{
  "type": "urn:qms:problem:user_not_assignable",
  "title": "User Not Assignable",
  "status": 409,
  "code": "user_not_assignable",
  "detail": "The user account behind this operator profile is disabled."
}
409 response schema

An RFC 9457 problem document: `type`, `title`, `status`, `code` and `detail`, every one of those five always present. `errors`, `blockers`, `checkCode` and `planLimit` are the exceptions — each is scoped to one family of refusal and is ABSENT on every other document, which is why none is required below. `code` is the stable, machine-readable member; branch on it rather than on `title` or `detail`, which are English prose meant for a developer reading a log.

type · string · required

A URN identifying the problem kind, one per `code`.

title · string · required

A fixed English summary of the problem kind.

status · integer · required

The HTTP status code, repeated in the body.

code · string · required

The published slug this surface's error vocabulary uses.

detail · string · required

An English explanation of this occurrence.

errors · array · optional

One entry per offending field of a 400 field-validation refusal. Present on those alone, and ABSENT — not null, not an empty array — on every other problem document, including a field-validation refusal that can name no single field. Sorted by `field`, so two refusals over the same body produce the same document.

Show nested fields

One offending field of a 400 field-validation refusal.

field · string · required

The member as THIS document spells it, which is not always what the same field is called inside the system.

code · string · required

The published reason slug. Typed as a plain string rather than an enumeration, because the set is not closed — an integrity backstop can report a slug outside the published list. The values in use today are `required`, `too_long`, `invalid_format`, `invalid_timezone`, `invalid_locale`, `invalid_country`, `name_taken`, `code_taken`, `display_prefix_taken`, `out_of_range`, `not_in_catalogue`, `archived`, `duplicate`, `not_found`, `not_linked_to_location`, `inactive`, `language_not_in_catalogue`, `not_writable`, `password_too_short` and `password_breached`. Three of them are worth a sentence. `invalid_format` covers a value whose SHAPE is wrong — a window code that is not alphanumeric, a time that is not `HH:MM` — and, on the operating hours, the one fault that is a relation rather than a shape: a `closesAt` that is not after its `opensAt`, where both values are well formed and it is their ORDER that is refused. It also covers a member whose JSON type cannot be read — a string where a boolean belongs — reported under its path, e.g. `operatingHours[0].closed`. `not_found` means the member names something this tenant does not hold; it is the same word as the document-level `code` that answers an unserved path, at a different level and never with that status. `not_writable` is the operator invite, the operator profile edit and the visit-reason replace's own: a body member the request type declares no slot for, refused by NAME whether or not its value would have changed anything. `password_too_short` and `password_breached` are the operator create's own, under `initialPassword`.

blockers · array · optional

One entry per non-zero blocking category of a 409 refusal that names what blocks it. Present on those alone, and ABSENT on every other problem document. A category with nothing to report is absent rather than present with a count of 0.

Show nested fields

One non-zero blocking category of a 409 refusal, and how many things it counted.

kind · string · required

What kind of thing still depends on the entry — or, on a configuration refusal, on what the write would take away.

Allowed values: "LOCATION", "TICKET", "APPOINTMENT", "TEMPLATE", "OPERATOR"

count · integer · required

How many of them there are. Always greater than zero.

checkCode · string · optional

The discovery-failure code of a `connection_check_failed` refusal: `unreachable`, `timeout`, `not_https`, `private_address`, `issuer_mismatch`, `missing_endpoint` or `invalid_document`. Present on that refusal alone, and ABSENT on every other problem document.

planLimit · object · optional

What a `plan_location_limit_reached` refusal reports. Present on that refusal alone, and ABSENT on every other problem document. Exactly one of `nextPlan` and `enterpriseOffer` is present: `nextPlan` when an active plan above the active location count exists, `enterpriseOffer` when none does. `contactEmail` is absent when no contact address is configured.

Show nested fields

What a `plan_location_limit_reached` refusal reports. Present on that refusal alone, and ABSENT on every other problem document. Exactly one of `nextPlan` and `enterpriseOffer` is present: `nextPlan` when an active plan above the active location count exists, `enterpriseOffer` when none does. `contactEmail` is absent when no contact address is configured.

currentPlan · object · required

A plan named by a `plan_location_limit_reached` refusal.

Show nested fields

A plan named by a `plan_location_limit_reached` refusal.

planId · string · required

The plan's stable identifier.

displayName · string · required

The plan's name, not translated.

maxLocations · integer · required

The most ACTIVE locations the plan covers.

activeLocations · integer · required

The number of ACTIVE locations the tenant holds.

nextPlan · object · optional

A plan named by a `plan_location_limit_reached` refusal.

Show nested fields

A plan named by a `plan_location_limit_reached` refusal.

planId · string · required

The plan's stable identifier.

displayName · string · required

The plan's name, not translated.

maxLocations · integer · required

The most ACTIVE locations the plan covers.

enterpriseOffer · object · optional

The published Enterprise offer, named when no active plan covers the tenant's active location count.

Show nested fields

The published Enterprise offer, named when no active plan covers the tenant's active location count.

minLocations · integer · required

The smallest number of locations the offer covers.

fromMonthlyPriceCents · integer · int64 · required

The monthly price from which the offer starts, in euro cents.

extraLocationPriceCents · integer · int64 · required

The monthly price of each location beyond `minLocations`, in euro cents.

contactEmail · string · optional

The address to write to about a larger plan or an individual contract.

Raw JSON Schema

application/problem+json

{
  "type": "object",
  "description": "An RFC 9457 problem document: `type`, `title`, `status`, `code` and `detail`, every one of those five always present. `errors`, `blockers`, `checkCode` and `planLimit` are the exceptions — each is scoped to one family of refusal and is ABSENT on every other document, which is why none is required below. `code` is the stable, machine-readable member; branch on it rather than on `title` or `detail`, which are English prose meant for a developer reading a log.",
  "properties": {
    "type": {
      "type": "string",
      "description": "A URN identifying the problem kind, one per `code`.",
      "example": "urn:qms:problem:location_not_found"
    },
    "title": {
      "type": "string",
      "description": "A fixed English summary of the problem kind.",
      "example": "Location Not Found"
    },
    "status": {
      "type": "integer",
      "description": "The HTTP status code, repeated in the body.",
      "example": 404
    },
    "code": {
      "type": "string",
      "description": "The published slug this surface's error vocabulary uses.",
      "example": "location_not_found"
    },
    "detail": {
      "type": "string",
      "description": "An English explanation of this occurrence.",
      "example": "No location was found for this identifier."
    },
    "errors": {
      "type": "array",
      "description": "One entry per offending field of a 400 field-validation refusal. Present on those alone, and ABSENT — not null, not an empty array — on every other problem document, including a field-validation refusal that can name no single field. Sorted by `field`, so two refusals over the same body produce the same document.",
      "items": {
        "type": "object",
        "description": "One offending field of a 400 field-validation refusal.",
        "properties": {
          "field": {
            "type": "string",
            "description": "The member as THIS document spells it, which is not always what the same field is called inside the system.",
            "example": "defaultLocale"
          },
          "code": {
            "type": "string",
            "description": "The published reason slug. Typed as a plain string rather than an enumeration, because the set is not closed — an integrity backstop can report a slug outside the published list. The values in use today are `required`, `too_long`, `invalid_format`, `invalid_timezone`, `invalid_locale`, `invalid_country`, `name_taken`, `code_taken`, `display_prefix_taken`, `out_of_range`, `not_in_catalogue`, `archived`, `duplicate`, `not_found`, `not_linked_to_location`, `inactive`, `language_not_in_catalogue`, `not_writable`, `password_too_short` and `password_breached`.\n\nThree of them are worth a sentence. `invalid_format` covers a value whose SHAPE is wrong — a window code that is not alphanumeric, a time that is not `HH:MM` — and, on the operating hours, the one fault that is a relation rather than a shape: a `closesAt` that is not after its `opensAt`, where both values are well formed and it is their ORDER that is refused. It also covers a member whose JSON type cannot be read — a string where a boolean belongs — reported under its path, e.g. `operatingHours[0].closed`. `not_found` means the member names something this tenant does not hold; it is the same word as the document-level `code` that answers an unserved path, at a different level and never with that status. `not_writable` is the operator invite, the operator profile edit and the visit-reason replace's own: a body member the request type declares no slot for, refused by NAME whether or not its value would have changed anything. `password_too_short` and `password_breached` are the operator create's own, under `initialPassword`.",
            "example": "invalid_locale"
          }
        },
        "required": [
          "field",
          "code"
        ]
      }
    },
    "blockers": {
      "type": "array",
      "description": "One entry per non-zero blocking category of a 409 refusal that names what blocks it. Present on those alone, and ABSENT on every other problem document. A category with nothing to report is absent rather than present with a count of 0.",
      "items": {
        "type": "object",
        "description": "One non-zero blocking category of a 409 refusal, and how many things it counted.",
        "properties": {
          "kind": {
            "type": "string",
            "description": "What kind of thing still depends on the entry — or, on a configuration refusal, on what the write would take away.",
            "enum": [
              "LOCATION",
              "TICKET",
              "APPOINTMENT",
              "TEMPLATE",
              "OPERATOR"
            ],
            "example": "TICKET"
          },
          "count": {
            "type": "integer",
            "description": "How many of them there are. Always greater than zero.",
            "example": 3
          }
        },
        "required": [
          "kind",
          "count"
        ]
      }
    },
    "checkCode": {
      "type": "string",
      "description": "The discovery-failure code of a `connection_check_failed` refusal: `unreachable`, `timeout`, `not_https`, `private_address`, `issuer_mismatch`, `missing_endpoint` or `invalid_document`. Present on that refusal alone, and ABSENT on every other problem document.",
      "example": "unreachable"
    },
    "planLimit": {
      "type": "object",
      "description": "What a `plan_location_limit_reached` refusal reports. Present on that refusal alone, and ABSENT on every other problem document. Exactly one of `nextPlan` and `enterpriseOffer` is present: `nextPlan` when an active plan above the active location count exists, `enterpriseOffer` when none does. `contactEmail` is absent when no contact address is configured.",
      "properties": {
        "currentPlan": {
          "type": "object",
          "description": "A plan named by a `plan_location_limit_reached` refusal.",
          "properties": {
            "planId": {
              "type": "string",
              "description": "The plan's stable identifier.",
              "example": "business"
            },
            "displayName": {
              "type": "string",
              "description": "The plan's name, not translated.",
              "example": "Business"
            },
            "maxLocations": {
              "type": "integer",
              "description": "The most ACTIVE locations the plan covers.",
              "example": 5
            }
          },
          "required": [
            "planId",
            "displayName",
            "maxLocations"
          ]
        },
        "activeLocations": {
          "type": "integer",
          "description": "The number of ACTIVE locations the tenant holds.",
          "example": 3
        },
        "nextPlan": {
          "type": "object",
          "description": "A plan named by a `plan_location_limit_reached` refusal.",
          "properties": {
            "planId": {
              "type": "string",
              "description": "The plan's stable identifier.",
              "example": "business"
            },
            "displayName": {
              "type": "string",
              "description": "The plan's name, not translated.",
              "example": "Business"
            },
            "maxLocations": {
              "type": "integer",
              "description": "The most ACTIVE locations the plan covers.",
              "example": 5
            }
          },
          "required": [
            "planId",
            "displayName",
            "maxLocations"
          ]
        },
        "enterpriseOffer": {
          "type": "object",
          "description": "The published Enterprise offer, named when no active plan covers the tenant's active location count.",
          "properties": {
            "minLocations": {
              "type": "integer",
              "description": "The smallest number of locations the offer covers.",
              "example": 8
            },
            "fromMonthlyPriceCents": {
              "type": "integer",
              "format": "int64",
              "description": "The monthly price from which the offer starts, in euro cents.",
              "example": 27900
            },
            "extraLocationPriceCents": {
              "type": "integer",
              "format": "int64",
              "description": "The monthly price of each location beyond `minLocations`, in euro cents.",
              "example": 2900
            }
          },
          "required": [
            "minLocations",
            "fromMonthlyPriceCents",
            "extraLocationPriceCents"
          ]
        },
        "contactEmail": {
          "type": "string",
          "description": "The address to write to about a larger plan or an individual contract.",
          "example": "sales@example.com"
        }
      },
      "required": [
        "currentPlan",
        "activeLocations"
      ]
    }
  },
  "required": [
    "type",
    "title",
    "status",
    "code",
    "detail"
  ],
  "additionalProperties": false
}

500 — The request could not be processed. The body names no internal detail. A retry is safe on every read described here; on a create, an edit or a lifecycle transition a retry may or may not repeat a change that already committed, so read the resource back before retrying one of those.

500 · Example
{
  "type": "urn:qms:problem:internal_error",
  "title": "Internal Server Error",
  "status": 500,
  "code": "internal_error",
  "detail": "The request could not be processed."
}
500 response schema

An RFC 9457 problem document: `type`, `title`, `status`, `code` and `detail`, every one of those five always present. `errors`, `blockers`, `checkCode` and `planLimit` are the exceptions — each is scoped to one family of refusal and is ABSENT on every other document, which is why none is required below. `code` is the stable, machine-readable member; branch on it rather than on `title` or `detail`, which are English prose meant for a developer reading a log.

type · string · required

A URN identifying the problem kind, one per `code`.

title · string · required

A fixed English summary of the problem kind.

status · integer · required

The HTTP status code, repeated in the body.

code · string · required

The published slug this surface's error vocabulary uses.

detail · string · required

An English explanation of this occurrence.

errors · array · optional

One entry per offending field of a 400 field-validation refusal. Present on those alone, and ABSENT — not null, not an empty array — on every other problem document, including a field-validation refusal that can name no single field. Sorted by `field`, so two refusals over the same body produce the same document.

Show nested fields

One offending field of a 400 field-validation refusal.

field · string · required

The member as THIS document spells it, which is not always what the same field is called inside the system.

code · string · required

The published reason slug. Typed as a plain string rather than an enumeration, because the set is not closed — an integrity backstop can report a slug outside the published list. The values in use today are `required`, `too_long`, `invalid_format`, `invalid_timezone`, `invalid_locale`, `invalid_country`, `name_taken`, `code_taken`, `display_prefix_taken`, `out_of_range`, `not_in_catalogue`, `archived`, `duplicate`, `not_found`, `not_linked_to_location`, `inactive`, `language_not_in_catalogue`, `not_writable`, `password_too_short` and `password_breached`. Three of them are worth a sentence. `invalid_format` covers a value whose SHAPE is wrong — a window code that is not alphanumeric, a time that is not `HH:MM` — and, on the operating hours, the one fault that is a relation rather than a shape: a `closesAt` that is not after its `opensAt`, where both values are well formed and it is their ORDER that is refused. It also covers a member whose JSON type cannot be read — a string where a boolean belongs — reported under its path, e.g. `operatingHours[0].closed`. `not_found` means the member names something this tenant does not hold; it is the same word as the document-level `code` that answers an unserved path, at a different level and never with that status. `not_writable` is the operator invite, the operator profile edit and the visit-reason replace's own: a body member the request type declares no slot for, refused by NAME whether or not its value would have changed anything. `password_too_short` and `password_breached` are the operator create's own, under `initialPassword`.

blockers · array · optional

One entry per non-zero blocking category of a 409 refusal that names what blocks it. Present on those alone, and ABSENT on every other problem document. A category with nothing to report is absent rather than present with a count of 0.

Show nested fields

One non-zero blocking category of a 409 refusal, and how many things it counted.

kind · string · required

What kind of thing still depends on the entry — or, on a configuration refusal, on what the write would take away.

Allowed values: "LOCATION", "TICKET", "APPOINTMENT", "TEMPLATE", "OPERATOR"

count · integer · required

How many of them there are. Always greater than zero.

checkCode · string · optional

The discovery-failure code of a `connection_check_failed` refusal: `unreachable`, `timeout`, `not_https`, `private_address`, `issuer_mismatch`, `missing_endpoint` or `invalid_document`. Present on that refusal alone, and ABSENT on every other problem document.

planLimit · object · optional

What a `plan_location_limit_reached` refusal reports. Present on that refusal alone, and ABSENT on every other problem document. Exactly one of `nextPlan` and `enterpriseOffer` is present: `nextPlan` when an active plan above the active location count exists, `enterpriseOffer` when none does. `contactEmail` is absent when no contact address is configured.

Show nested fields

What a `plan_location_limit_reached` refusal reports. Present on that refusal alone, and ABSENT on every other problem document. Exactly one of `nextPlan` and `enterpriseOffer` is present: `nextPlan` when an active plan above the active location count exists, `enterpriseOffer` when none does. `contactEmail` is absent when no contact address is configured.

currentPlan · object · required

A plan named by a `plan_location_limit_reached` refusal.

Show nested fields

A plan named by a `plan_location_limit_reached` refusal.

planId · string · required

The plan's stable identifier.

displayName · string · required

The plan's name, not translated.

maxLocations · integer · required

The most ACTIVE locations the plan covers.

activeLocations · integer · required

The number of ACTIVE locations the tenant holds.

nextPlan · object · optional

A plan named by a `plan_location_limit_reached` refusal.

Show nested fields

A plan named by a `plan_location_limit_reached` refusal.

planId · string · required

The plan's stable identifier.

displayName · string · required

The plan's name, not translated.

maxLocations · integer · required

The most ACTIVE locations the plan covers.

enterpriseOffer · object · optional

The published Enterprise offer, named when no active plan covers the tenant's active location count.

Show nested fields

The published Enterprise offer, named when no active plan covers the tenant's active location count.

minLocations · integer · required

The smallest number of locations the offer covers.

fromMonthlyPriceCents · integer · int64 · required

The monthly price from which the offer starts, in euro cents.

extraLocationPriceCents · integer · int64 · required

The monthly price of each location beyond `minLocations`, in euro cents.

contactEmail · string · optional

The address to write to about a larger plan or an individual contract.

Raw JSON Schema

application/problem+json

{
  "type": "object",
  "description": "An RFC 9457 problem document: `type`, `title`, `status`, `code` and `detail`, every one of those five always present. `errors`, `blockers`, `checkCode` and `planLimit` are the exceptions — each is scoped to one family of refusal and is ABSENT on every other document, which is why none is required below. `code` is the stable, machine-readable member; branch on it rather than on `title` or `detail`, which are English prose meant for a developer reading a log.",
  "properties": {
    "type": {
      "type": "string",
      "description": "A URN identifying the problem kind, one per `code`.",
      "example": "urn:qms:problem:location_not_found"
    },
    "title": {
      "type": "string",
      "description": "A fixed English summary of the problem kind.",
      "example": "Location Not Found"
    },
    "status": {
      "type": "integer",
      "description": "The HTTP status code, repeated in the body.",
      "example": 404
    },
    "code": {
      "type": "string",
      "description": "The published slug this surface's error vocabulary uses.",
      "example": "location_not_found"
    },
    "detail": {
      "type": "string",
      "description": "An English explanation of this occurrence.",
      "example": "No location was found for this identifier."
    },
    "errors": {
      "type": "array",
      "description": "One entry per offending field of a 400 field-validation refusal. Present on those alone, and ABSENT — not null, not an empty array — on every other problem document, including a field-validation refusal that can name no single field. Sorted by `field`, so two refusals over the same body produce the same document.",
      "items": {
        "type": "object",
        "description": "One offending field of a 400 field-validation refusal.",
        "properties": {
          "field": {
            "type": "string",
            "description": "The member as THIS document spells it, which is not always what the same field is called inside the system.",
            "example": "defaultLocale"
          },
          "code": {
            "type": "string",
            "description": "The published reason slug. Typed as a plain string rather than an enumeration, because the set is not closed — an integrity backstop can report a slug outside the published list. The values in use today are `required`, `too_long`, `invalid_format`, `invalid_timezone`, `invalid_locale`, `invalid_country`, `name_taken`, `code_taken`, `display_prefix_taken`, `out_of_range`, `not_in_catalogue`, `archived`, `duplicate`, `not_found`, `not_linked_to_location`, `inactive`, `language_not_in_catalogue`, `not_writable`, `password_too_short` and `password_breached`.\n\nThree of them are worth a sentence. `invalid_format` covers a value whose SHAPE is wrong — a window code that is not alphanumeric, a time that is not `HH:MM` — and, on the operating hours, the one fault that is a relation rather than a shape: a `closesAt` that is not after its `opensAt`, where both values are well formed and it is their ORDER that is refused. It also covers a member whose JSON type cannot be read — a string where a boolean belongs — reported under its path, e.g. `operatingHours[0].closed`. `not_found` means the member names something this tenant does not hold; it is the same word as the document-level `code` that answers an unserved path, at a different level and never with that status. `not_writable` is the operator invite, the operator profile edit and the visit-reason replace's own: a body member the request type declares no slot for, refused by NAME whether or not its value would have changed anything. `password_too_short` and `password_breached` are the operator create's own, under `initialPassword`.",
            "example": "invalid_locale"
          }
        },
        "required": [
          "field",
          "code"
        ]
      }
    },
    "blockers": {
      "type": "array",
      "description": "One entry per non-zero blocking category of a 409 refusal that names what blocks it. Present on those alone, and ABSENT on every other problem document. A category with nothing to report is absent rather than present with a count of 0.",
      "items": {
        "type": "object",
        "description": "One non-zero blocking category of a 409 refusal, and how many things it counted.",
        "properties": {
          "kind": {
            "type": "string",
            "description": "What kind of thing still depends on the entry — or, on a configuration refusal, on what the write would take away.",
            "enum": [
              "LOCATION",
              "TICKET",
              "APPOINTMENT",
              "TEMPLATE",
              "OPERATOR"
            ],
            "example": "TICKET"
          },
          "count": {
            "type": "integer",
            "description": "How many of them there are. Always greater than zero.",
            "example": 3
          }
        },
        "required": [
          "kind",
          "count"
        ]
      }
    },
    "checkCode": {
      "type": "string",
      "description": "The discovery-failure code of a `connection_check_failed` refusal: `unreachable`, `timeout`, `not_https`, `private_address`, `issuer_mismatch`, `missing_endpoint` or `invalid_document`. Present on that refusal alone, and ABSENT on every other problem document.",
      "example": "unreachable"
    },
    "planLimit": {
      "type": "object",
      "description": "What a `plan_location_limit_reached` refusal reports. Present on that refusal alone, and ABSENT on every other problem document. Exactly one of `nextPlan` and `enterpriseOffer` is present: `nextPlan` when an active plan above the active location count exists, `enterpriseOffer` when none does. `contactEmail` is absent when no contact address is configured.",
      "properties": {
        "currentPlan": {
          "type": "object",
          "description": "A plan named by a `plan_location_limit_reached` refusal.",
          "properties": {
            "planId": {
              "type": "string",
              "description": "The plan's stable identifier.",
              "example": "business"
            },
            "displayName": {
              "type": "string",
              "description": "The plan's name, not translated.",
              "example": "Business"
            },
            "maxLocations": {
              "type": "integer",
              "description": "The most ACTIVE locations the plan covers.",
              "example": 5
            }
          },
          "required": [
            "planId",
            "displayName",
            "maxLocations"
          ]
        },
        "activeLocations": {
          "type": "integer",
          "description": "The number of ACTIVE locations the tenant holds.",
          "example": 3
        },
        "nextPlan": {
          "type": "object",
          "description": "A plan named by a `plan_location_limit_reached` refusal.",
          "properties": {
            "planId": {
              "type": "string",
              "description": "The plan's stable identifier.",
              "example": "business"
            },
            "displayName": {
              "type": "string",
              "description": "The plan's name, not translated.",
              "example": "Business"
            },
            "maxLocations": {
              "type": "integer",
              "description": "The most ACTIVE locations the plan covers.",
              "example": 5
            }
          },
          "required": [
            "planId",
            "displayName",
            "maxLocations"
          ]
        },
        "enterpriseOffer": {
          "type": "object",
          "description": "The published Enterprise offer, named when no active plan covers the tenant's active location count.",
          "properties": {
            "minLocations": {
              "type": "integer",
              "description": "The smallest number of locations the offer covers.",
              "example": 8
            },
            "fromMonthlyPriceCents": {
              "type": "integer",
              "format": "int64",
              "description": "The monthly price from which the offer starts, in euro cents.",
              "example": 27900
            },
            "extraLocationPriceCents": {
              "type": "integer",
              "format": "int64",
              "description": "The monthly price of each location beyond `minLocations`, in euro cents.",
              "example": 2900
            }
          },
          "required": [
            "minLocations",
            "fromMonthlyPriceCents",
            "extraLocationPriceCents"
          ]
        },
        "contactEmail": {
          "type": "string",
          "description": "The address to write to about a larger plan or an individual contract.",
          "example": "sales@example.com"
        }
      },
      "required": [
        "currentPlan",
        "activeLocations"
      ]
    }
  },
  "required": [
    "type",
    "title",
    "status",
    "code",
    "detail"
  ],
  "additionalProperties": false
}