Errors
The problem details body every failure returns, how to read it, and every error code.
Every failed request returns an RFC 9457 problem details body with Content-Type: application/problem+json:
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "this company needs its name and billing account before it can be invoiced",
"code": "BOOKING_EXTERNAL_INVOICING_DETAILS_REQUIRED"
}
statusrepeats the HTTP status.codenames the rule that refused the request. Match oncode, never ondetail. A code never changes its meaning or its name.detailexplains the failure to a person. Its wording can change.titleis the HTTP status phrase.
A failure without a specific rule, such as a token without the right role, has no code.
Validation failures
A body, query or path parameter that does not match its schema returns 400 with code VALIDATION_FAILED. issues lists each field that failed, with its path and message:
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Validation failed",
"code": "VALIDATION_FAILED",
"issues": [{ "code": "invalid_type", "path": ["fromDate"], "message": "Invalid input" }]
}
Status codes
| Status | Meaning | What to do |
|---|---|---|
400 |
The request is not valid, or the current state does not allow it. | Read code. Fix the request or wait for the state to change. |
401 |
The token is missing, expired or not valid. | Get a new token and retry once. |
403 |
The token does not allow this request. | Check the token’s roles. Do not retry. |
404 |
The resource does not exist, or the token cannot see it. | Do not retry. |
409 |
The request conflicts with the resource’s current state. | Read the resource again before you decide. |
429 |
Too many requests. | Wait and retry with backoff. |
5xx |
Hydda One failed. | Retry with backoff. |
The API host limits the requests from each IP address per minute: 600 under /v1/booking, 300 under /v1/billing and /v1/crm, and 60 under /v1/integrations. The identity host allows 60 a minute under /oauth. A request over a limit gets 429 from the gateway, and that body is not problem details.
The token endpoint uses its own error format. See Authentication.
Error codes
Validation
| Code | HTTP status | Meaning |
|---|---|---|
VALIDATION_FAILED |
400 | The request is not valid. |
Booking
| Code | HTTP status | Meaning |
|---|---|---|
BOOKING_SLOT_TAKEN |
409 | It conflicts with something that already exists. |
BOOKING_NO_COVERING_CONTRACT |
400 | The current state does not allow it. |
BOOKING_CONTRACT_ATTRIBUTION_AMBIGUOUS |
400 | The current state does not allow it. |
BOOKING_CONTRACT_NOT_A_CANDIDATE |
400 | The current state does not allow it. |
BOOKING_NO_SHARED_CONTRACT |
400 | The current state does not allow it. |
BOOKING_EXTERNAL_CONTRACT_NOT_BILLABLE |
400 | The current state does not allow it. |
BOOKING_EXTERNAL_CUSTOMER_NOT_FOUND |
404 | It does not exist, or the token cannot see it. |
BOOKING_EXTERNAL_CUSTOMER_BILLING_ACCOUNT_REQUIRED |
400 | The current state does not allow it. |
BOOKING_EXTERNAL_BILLING_ACCOUNT_INCOMPLETE |
400 | The request is not valid. |
BOOKING_EXTERNAL_INVOICING_DETAILS_REQUIRED |
400 | The request is not valid. |
BOOKING_EXTERNAL_REQUIRES_APPROVAL |
400 | The request is not valid. |
BOOKING_REQUEST_ID_ALREADY_USED |
409 | It conflicts with something that already exists. |
BOOKING_GUEST_LINK_INVALID |
404 | It does not exist, or the token cannot see it. |
BOOKING_GUEST_LINK_NOT_RESENDABLE |
400 | The current state does not allow it. |
BOOKING_NOT_EXTERNAL |
400 | The current state does not allow it. |
BOOKING_PRICE_RULE_AMBIGUOUS |
400 | The current state does not allow it. |
BOOKING_PRICE_RULE_NOT_APPLICABLE |
400 | The current state does not allow it. |
BOOKING_NOT_PENDING_APPROVAL |
400 | The current state does not allow it. |
BOOKING_APPROVAL_WINDOW_PASSED |
400 | The current state does not allow it. |
BOOKING_RESOURCE_IMAGE_REJECTED |
400 | The current state does not allow it. |
BOOKING_RESOURCE_PURCHASE_TERMS_REJECTED |
400 | The current state does not allow it. |
BOOKING_OUTSIDE_OPEN_HOURS |
400 | The current state does not allow it. |
BOOKING_DURATION_TOO_SHORT |
400 | The current state does not allow it. |
BOOKING_DURATION_TOO_LONG |
400 | The current state does not allow it. |
BOOKING_DURATION_NOT_ON_INCREMENT |
400 | The current state does not allow it. |
BOOKING_START_NOT_ON_INCREMENT |
400 | The current state does not allow it. |
BOOKING_WEEKLY_QUOTA_EXCEEDED |
400 | The current state does not allow it. |
BOOKING_BUFFER_CONFLICT |
409 | It conflicts with something that already exists. |
BOOKING_NOTICE_TOO_SHORT |
400 | The current state does not allow it. |
BOOKING_CANCELLATION_NOTICE_EXPIRED |
400 | The current state does not allow it. |
BOOKING_ALREADY_DELIVERED |
400 | The current state does not allow it. |
BOOKING_NOT_CHARGED |
400 | The current state does not allow it. |
BOOKING_ALREADY_STARTED |
400 | The current state does not allow it. |
BOOKING_ACCESS_ALREADY_OPEN |
400 | The current state does not allow it. |
BOOKING_NOT_RESCHEDULABLE |
400 | The current state does not allow it. |
BOOKING_TIME_SPEC_MODEL_MISMATCH |
400 | The current state does not allow it. |
BOOKING_SLOT_NOT_IN_SCHEDULE |
400 | The current state does not allow it. |
BOOKING_DATE_INTERVAL_EMPTY |
400 | The current state does not allow it. |
BOOKING_DATE_SPAN_EMPTY |
400 | The current state does not allow it. |
BOOKING_DATE_SPAN_REQUIRES_SESSION_PRICING |
400 | The current state does not allow it. |
BOOKING_DATE_INTERVAL_REQUIRES_NIGHT_PRICING |
400 | The current state does not allow it. |
BOOKING_NIGHT_PRICING_REQUIRES_DATE_INTERVAL |
400 | The current state does not allow it. |
BOOKING_RESOURCE_BUFFER_NOT_ON_INCREMENT |
400 | The current state does not allow it. |
BOOKING_STAY_TOO_SHORT |
400 | The current state does not allow it. |
BOOKING_STAY_TOO_LONG |
400 | The current state does not allow it. |
BOOKING_UPLOAD_PENDING_LIMIT_EXCEEDED |
429 | A limit was reached. |
BOOKING_IN_THE_PAST |
400 | The current state does not allow it. |
BOOKING_HORIZON_EXCEEDED |
400 | The current state does not allow it. |
BOOKING_DURATION_CEILING_EXCEEDED |
400 | The current state does not allow it. |
BOOKING_PARTICIPANTS_NOT_SUPPORTED |
400 | The current state does not allow it. |
BOOKING_PARTICIPANT_NOT_SEATED |
400 | The current state does not allow it. |
BOOKING_RESOURCE_PARTICIPANTS_GROUP_CONFLICT |
400 | The current state does not allow it. |
BOOKING_RESOURCE_CURRENCY_MISMATCH |
400 | The current state does not allow it. |
BOOKING_OPENING_HOURS_SCHEDULE_NOT_FOUND |
400 | The current state does not allow it. |
BOOKING_RESOURCE_GROUP_OUTSIDE_CONTEXT |
400 | The current state does not allow it. |
BOOKING_ADD_ON_PRODUCT_IMAGE_REJECTED |
400 | The current state does not allow it. |
BOOKING_ADD_ON_PRODUCT_RETIRED |
400 | The current state does not allow it. |
BOOKING_ADD_ON_PRODUCT_RESOURCE_OUTSIDE_CONTEXT |
400 | The request is not valid. |
BOOKING_ADD_ON_NOT_OFFERED |
400 | The current state does not allow it. |
BOOKING_ADD_ON_DELIVERY_OUTSIDE_BOOKING |
400 | The request is not valid. |
BOOKING_ADD_ON_DELIVERY_OUTSIDE_AVAILABILITY |
400 | The current state does not allow it. |
BOOKING_ADD_ON_ORDER_LEAD_TOO_SHORT |
400 | The current state does not allow it. |
BOOKING_ADD_ON_CUTOFF_PASSED |
400 | The current state does not allow it. |
BOOKING_ADD_ON_SPECIAL_PORTIONS_INVALID |
400 | The request is not valid. |
BOOKING_ADD_ON_LINE_LIMIT_EXCEEDED |
400 | The current state does not allow it. |
BOOKING_ADD_ON_ON_INTERNAL_BOOKING |
400 | The current state does not allow it. |
BOOKING_ADD_ON_LINE_NOT_FOUND |
404 | It does not exist, or the token cannot see it. |
BOOKING_ADD_ON_LINE_DELIVERED |
400 | The current state does not allow it. |
BOOKING_ADD_ON_LINE_NO_LONGER_FITS |
400 | The current state does not allow it. |
BOOKING_ROOM_LAYOUT_NOT_OFFERED |
400 | The current state does not allow it. |
BOOKING_ROOM_LAYOUT_CUTOFF_PASSED |
400 | The current state does not allow it. |
BOOKING_ROOM_LAYOUT_NOT_CHANGEABLE |
400 | The current state does not allow it. |
BOOKING_ROOM_SETUP_NOT_FOUND |
404 | It does not exist, or the token cannot see it. |
Billing
| Code | HTTP status | Meaning |
|---|---|---|
BILLING_INTEGRATION_NOT_CONFIGURED |
400 | The current state does not allow it. |
BILLING_INTEGRATION_GATE_NOT_DECLARED |
400 | The current state does not allow it. |
BILLING_EXTERNAL_REFERENCE_ALREADY_USED |
409 | It conflicts with something that already exists. |
BILLING_INVOICE_STATUS_INVALID |
400 | The current state does not allow it. |
BILLING_PAYMENT_REPLAY_MISMATCH |
409 | It conflicts with something that already exists. |
BILLING_PAYMENT_REVERSED |
409 | It conflicts with something that already exists. |
BILLING_PAYMENT_NOT_FOUND |
404 | It does not exist, or the token cannot see it. |
BILLING_PAYMENT_AMOUNT_INVALID |
400 | The request is not valid. |
BILLING_WRITE_OFF_REPLAY_MISMATCH |
409 | It conflicts with something that already exists. |
BILLING_WRITE_OFF_AMOUNT_INVALID |
400 | The request is not valid. |
BILLING_PROPOSAL_STATUS_INVALID |
400 | The current state does not allow it. |
BILLING_PROPOSAL_MATERIAL_ALREADY_INVOICED |
409 | It conflicts with something that already exists. |
BILLING_CREDIT_NOTE_INVOICE_NOT_CREDITABLE |
400 | The current state does not allow it. |
BILLING_CREDIT_NOTE_NO_PENDING_CORRECTIONS |
400 | The current state does not allow it. |
BILLING_INVOICE_RUN_NOT_CONTINUABLE |
400 | The current state does not allow it. |
BILLING_CREDIT_EXCEEDS_LINE |
400 | The current state does not allow it. |
BILLING_CREDIT_EXCEEDS_INVOICE |
400 | The current state does not allow it. |
BILLING_CREDIT_WITHHELD |
400 | The current state does not allow it. |
BILLING_CREDIT_ACT_REPLAY_MISMATCH |
400 | The request is not valid. |
BILLING_MANUAL_CREDIT_VAT_RATE_UNKNOWN |
400 | The request is not valid. |
BILLING_CORRECTION_NOT_WITHDRAWABLE |
400 | The current state does not allow it. |
Signing
| Code | HTTP status | Meaning |
|---|---|---|
CRM_CONTRACT_TEMPLATE_RETIRED |
400 | The current state does not allow it. |
CRM_PACKAGE_RETIRED |
400 | The current state does not allow it. |
CRM_PRODUCT_RETIRED |
400 | The current state does not allow it. |
CRM_PRODUCT_UNKNOWN |
400 | The current state does not allow it. |
CRM_AGENT_UNKNOWN |
400 | The current state does not allow it. |
CRM_CUSTOMER_CHOICE_INVALID |
400 | The request is not valid. |
CRM_PROSPECT_MATCHES_AGENT |
409 | It conflicts with something that already exists. |
CRM_CUSTOMER_IS_AGENT |
400 | The current state does not allow it. |
CRM_AGREEMENT_BILLING_DETAILS_REQUIRED |
400 | The current state does not allow it. |
CRM_AGREEMENT_BILLING_ACCOUNT_EXISTS |
400 | The current state does not allow it. |
CRM_AGREEMENT_BILLING_DETAILS_TYPE_MISMATCH |
400 | The current state does not allow it. |
CRM_AGREEMENT_BILLING_DETAILS_INCOMPLETE |
400 | The request is not valid. |
CRM_ROW_ACCESS_TERMS_INVALID |
400 | The request is not valid. |
CRM_DEAL_LOST |
400 | The current state does not allow it. |
CRM_DEAL_ACCEPTED |
400 | The current state does not allow it. |
CRM_DEAL_TRANSITION_INVALID |
400 | The current state does not allow it. |
CRM_DEAL_BUSINESS_CONTEXT_INVALID |
400 | The current state does not allow it. |
CRM_PACKAGE_BUSINESS_CONTEXT_INVALID |
400 | The current state does not allow it. |
CRM_PACKAGE_BUSINESS_CONTEXT_MISMATCH |
400 | The current state does not allow it. |
CRM_PACKAGE_PRODUCT_DUPLICATE |
400 | The request is not valid. |
CRM_PRODUCT_OUTSIDE_BUSINESS_CONTEXT |
400 | The current state does not allow it. |
CRM_ROWS_EMPTY |
400 | The current state does not allow it. |
CRM_ROWS_LIMIT |
400 | The current state does not allow it. |
CRM_ROW_QUANTITY_INVALID |
400 | The request is not valid. |
CRM_CURRENCY_MISMATCH |
400 | The current state does not allow it. |
CRM_OFFER_TOKEN_INVALID |
404 | It does not exist, or the token cannot see it. |
CRM_OFFER_EXPIRED |
400 | The current state does not allow it. |
CRM_OFFER_ALREADY_ANSWERED |
409 | It conflicts with something that already exists. |
CRM_OFFER_INVALIDATED |
400 | The current state does not allow it. |
CRM_AGREEMENT_TRANSITION_INVALID |
400 | The current state does not allow it. |
CRM_AGREEMENT_LOCKED |
400 | The current state does not allow it. |
CRM_AGREEMENT_CANCELLED |
400 | The current state does not allow it. |
CRM_AGREEMENT_START_DATE_MISSING |
400 | The current state does not allow it. |
CRM_LEASABLE_UNIT_OCCUPIED |
400 | The current state does not allow it. |
CRM_SIGNED_DOCUMENT_REJECTED |
400 | The request is not valid. |
CRM_SIGNING_NOT_AVAILABLE |
400 | The current state does not allow it. |
CRM_CONTRACT_BODY_MISSING |
400 | The current state does not allow it. |
CRM_CONTRACT_VALUES_MISSING |
400 | The current state does not allow it. |
CRM_CONTRACT_VARIABLE_UNKNOWN |
400 | The request is not valid. |
CRM_CONTRACT_PLACEHOLDERS_OPEN |
400 | The current state does not allow it. |
CRM_CONTRACT_RENDER_FAILED |
400 | The current state does not allow it. |
CRM_SIGNING_ATTEMPT_LIVE |
400 | The current state does not allow it. |
CRM_SIGNING_ATTEMPT_ENDED |
409 | It conflicts with something that already exists. |
CRM_SIGNER_BUSINESS_CONTEXT_INVALID |
400 | The current state does not allow it. |
CRM_SIGNER_NOT_ELIGIBLE |
400 | The current state does not allow it. |
CRM_SIGNER_ALREADY_ADDED |
409 | It conflicts with something that already exists. |
CRM_SIGNER_UNAVAILABLE |
400 | The current state does not allow it. |
CRM_SIGNING_PARTY_REPEATED |
400 | The request is not valid. |
Integrations
| Code | HTTP status | Meaning |
|---|---|---|
INTEGRATIONS_APP_INVALID |
400 | The request is not valid. |
INTEGRATIONS_APP_ALREADY_EXISTS |
409 | It conflicts with something that already exists. |
INTEGRATIONS_APP_INSTALLED |
400 | The current state does not allow it. |
INTEGRATIONS_APP_ALREADY_INSTALLED |
409 | It conflicts with something that already exists. |
INTEGRATIONS_CONSENT_MISMATCH |
400 | The current state does not allow it. |
INTEGRATIONS_ROLE_NOT_GRANTABLE |
400 | The current state does not allow it. |
INTEGRATIONS_CONTEXT_LEVEL_MISMATCH |
400 | The current state does not allow it. |
INTEGRATIONS_CONFIGURATION_INVALID |
400 | The request is not valid. |
INTEGRATIONS_POINT_ALREADY_FILLED |
409 | It conflicts with something that already exists. |
INTEGRATIONS_CONFIGURATION_NOT_FOUND |
404 | It does not exist, or the token cannot see it. |
INTEGRATIONS_CONNECTION_NOT_SUPPORTED |
400 | The current state does not allow it. |
INTEGRATIONS_CONNECTION_REFERENCE_INVALID |
400 | The request is not valid. |