Tenant API

Errors

Every error response documented across the Tenant API, grouped by status code. 100 documented failure modes in total.

Error envelope

Failures return a JSON body with the HTTP status repeated in statusCode, a short error label, and a message describing what went wrong. Validation failures may return several messages at once.

application/json
{
  "statusCode": 400,
  "message": [
    "pageSize must not be greater than 50"
  ],
  "error": "Bad Request"
}

Status codes

400 Bad Request

The request was rejected before it reached your data — a missing field, a value out of range, or a reference that could not be resolved.

CodeWhen it happensEndpoints
dateAssignment is missing or malformed (type not one of the accepted values, timeRange without type or numeric value).
A referenced entity could not be resolved: service variant, product (by sku), product unit (by serial), or providerReference not found. Also when productUnits length exceeds quantity.
id is not a positive integer, or serialNumber is empty.
Missing or invalid fields, an invalid/unknown dynamic form, or an item that cannot be resolved (e.g. product, product unit, or warranty not found).
A pagination parameter has the wrong type or is out of range (for example pageSize above 50).
The referenced product is not a component, the component lookup type is not supported, an area id is not numeric, an area reference is ambiguous, an area appears in more than one group, or a group mixes areas of different currencies.
BOOKING_CANNOT_BE_RESCHEDULED: status {status}The booking is in execution, done or cancelled.
BOOKING_NOT_FOUND_FOR_IDNo booking found for the given entity ID.
BOOKING_NOT_FOUND_FOR_REFERENCENo booking found for the given entity reference.
Date is required when type is DIRECTdateAssignment.date is missing.
ENTITY_IDENTIFIER_REQUIREDentity.value is missing or empty.
ENTITY_TYPE_NOT_SUPPORTEDentityType is not supported for creation. Only booking, lead, and work_order are supported.
Exactly one of id or sku must be providedNeither or both identifiers were sent.
FIELD_REFERENCE_IS_REQUIREDA qualifying question entry is missing fieldReference.
id must be an integer number / id must not be less than 1id is not a positive integer.
INCIDENT_NOT_FOUNDNo incident found for the given ID or reference.
INCIDENT_REASON_NOT_FOUNDThe incident reason ID does not exist in Sodtrack.
INCIDENT_REASON_REFERENCE_NOT_SUPPORTEDResolution by reasonReference is not yet supported. Use reasonId.
INCIDENT_STATUS_NOT_FOUNDThe incident status ID does not exist in Sodtrack.
INCIDENT_STATUS_REFERENCE_NOT_SUPPORTEDResolution by statusReference is not yet supported. Use statusId.
INVALID_ACCOUNTABLE_USERaccountableUser was provided but could not be resolved to an existing user.
INVALID_CREATOR_USERcreatorUser was provided but could not be resolved.
INVALID_DATE: expected ISO 8601dateAssignment.date is not a valid ISO 8601 date.
INVALID_INCIDENT_REASON_IDReason id must be a number.
INVALID_INCIDENT_REASON_TYPEInvalid incident reason identifier type.
INVALID_INCIDENT_STATUS_IDStatus id must be a number.
INVALID_INCIDENT_STATUS_TYPEInvalid incident status identifier type.
INVALID_INCIDENT_TYPEInvalid incident identifier type (must be incidentId or incidentReference).
INVALID_LATITUDE_OR_LONGITUDEaddress.coordinate was sent with lat/lng outside valid ranges (lat -90–90, lng -180–180).
INVALID_QUALIFYING_QUESTION_WITH_ID_REFERENCE: {fieldReference}A qualifying question fieldReference does not match any dynamic field for the service’s lead form.
INVALID_REPORTER_USERreporterUser was provided but could not be resolved.
INVALID_SALES_CHANNELThe given saleChannel was not found (in strict mode).
INVALID_SALES_CHANNELThe given salesChannelId does not exist or is invalid.
INVALID_SALES_CHANNELsaleChannel.value is not a valid sales channel reference, or is not a positive integer when type is "id".
INVALID_SALES_CHANNELThe sale channel could not be resolved from saleChannel.
INVALID_SERVICEThe given serviceId does not exist or has no associated lead form.
INVALID_STATUS_TO_RESOLVE_APPROVALThe budget execution is not in a status that accepts an approval decision, typically because it was already approved.
INVALID_USER_TYPEInvalid user identifier type.
INVALID_WORK_ORDER_IDentity.value is not a number when resolving a work order by ID.
InvalidParametersOne or more required fields are missing or invalid.
InvalidParametersOne or more required fields are missing or invalid (e.g. validation pipeline).
InvalidParametersA required field is missing or invalid (e.g. quantity < 1, or type not in the allowed values for variant / product / product units).
InvalidParametersA required field (sku, name) is missing or a field has an invalid value (e.g. unsupported type).
InvalidParametersThe product selector is missing/invalid, or product.type is not "productId" / "productSku".
InvalidParametersMissing or invalid request parameters.
LEAD_NOT_FOUNDThe lead could not be found for the given leadId or leadReference.
LEAD_NOT_FOUND_FOR_IDNo lead found for the given entity ID.
LEAD_NOT_FOUND_FOR_REFERENCENo lead found for the given entity reference.
MULTIPLE_BOOKINGS_FOUND_FOR_REFERENCEMore than one booking shares the given reference.
MULTIPLE_CUSTOMERS_FOUND_FOR_REFERENCEMore than one customer matches the provided reference/email; resolution is ambiguous. Use a unique reference or contact.
MULTIPLE_INCIDENTS_FOUND_FOR_REFERENCEMore than one incident matches the given reference.
One or more required fields are missing or invalid.
pageNumber must not be less than 1pageNumber out of range.
pageSize must not be greater than 50 / pageSize must not be less than 1pageSize out of range.
PROJECT_REFERENCE_ALREADY_USED: {reference}A project with the given reference already exists. The reference must be unique.
Provide exactly one of \id\ or \serialNumber\\Neither identifier was sent, or both were.
REQUIRES_ADDRESS_OR_ZIP_CODEThe service is not an in-store service and the request did not include coordinates, address text, or zip code.
TIME_RANGE_NOT_FOUND: {type} {value}No time range matches the id or index sent.
Validation errorA query parameter has an invalid value: id or customerId is not a positive integer, pageSize is outside 1–50, or pageNumber is below 1. The response body lists the offending parameters.
Validation errorA query parameter has an invalid value: id or bookingId is not a positive integer, pageSize is outside 1–50, or pageNumber is below 1. The response body lists the offending parameters.
Validation failed (numeric string is expected)bookingId is not an integer.
Validation failed (numeric string is expected)customerId is not an integer.
WORK_ORDER_NOT_FOUND_FOR_IDNo work order found for the given entity ID.
WORK_ORDER_NOT_FOUND_FOR_REFERENCENo work order found for the given entity reference.

401 Unauthorized

Authentication failed. The bearer token is missing, malformed or expired.

CodeWhen it happensEndpoints
API key missing or invalid, or the request does not come from an authorized network.
Authentication token missing or expired.
Missing or invalid x-api-key, or the request does not come from an authorized origin.
x-api-key is missing or invalid, or the request does not originate from an authorized network.
Missing or invalid x-api-key.
The API key is missing, invalid, or the request origin is not authorized.
API key missing or invalid.
API key missing/invalid, or request not from an authorized network.
Missing or expired authentication token.
Authentication failed or token expired.
Authentication token missing or expired.

403 Forbidden

Authenticated, but not permitted. Usually the request origin is not on the allowlist for your integration.

CodeWhen it happensEndpoints
The request origin is not allowed.
The API key or origin is not authorized.
Origin not authorized for the inbound integration network.
The API key or origin is not authorized to access this resource.
The API key or origin is not authorized to access this endpoint.
The API key or origin is not authorized.

404 Not Found

A referenced entity does not exist, or is not visible to your tenant.

CodeWhen it happensEndpoints
A referenced variant, provider, project, or channel could not be found.
saleChannel.type is "id" and no sales channel exists with that id.
No product exists for the given id or sku.
The component (by id/SKU) or a referenced area (by id/reference) was not found.
The specified variant or provider does not exist or is not linked to the given location.
No availability found for the given date or parameters.
A referenced variant, provider, or area could not be found.
BOOKING_NOT_FOUND: {bookingId}No booking exists with that id.
BUDGET_EXECUTION_NOT_FOUNDNo budget execution exists for the given id.
CUSTOMER_NOT_FOUND: {customerId}No customer exists with that id.
Product with id {id} not found / Product with sku '{sku}' not foundNo product matches the identifier.
PRODUCT_UNIT_NOT_FOUND: {identifier}No product unit exists with that id or serial number. The message echoes the identifier sent.

406 Not Acceptable

The request could not be satisfied in the format requested.

CodeWhen it happensEndpoints
PRODUCT.SKU_ALREADY_IN_USEA product with the given sku already exists.

409 Conflict

The request conflicts with the current state of the resource.

CodeWhen it happensEndpoints
ACQUISITION_ALREADY_EXISTSAn acquisition already exists for the given reference.

500 Internal Server Error

An unexpected server error. Safe to retry with backoff; contact support if it persists.

503 Service Unavailable

The service is temporarily unavailable. Retry with backoff.

CodeWhen it happensEndpoints
PRODUCT_MODULE_UNAVAILABLESodtrack's product inventory service could not be reached. Retry later.

Retries

Retry 500 and 503 with exponential backoff. Do not retry 400, 403 or 404 — the request will fail identically until the payload or configuration changes. For 401, request a fresh token and retry once.