Errors
Every error response documented across the Tenant API, grouped by status code. 139 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.
{
"statusCode": 400,
"message": [
"pageSize must not be greater than 50"
],
"error": "Bad Request"
}Status codes
40094 documentedThe request was rejected before it reached your data — a missing field, a value out of range, or a reference that could not be resolved.
40114 documentedAuthentication failed. The bearer token is missing, malformed or expired.
4036 documentedAuthenticated, but not permitted. Usually the request origin is not on the allowlist for your integration.
40415 documentedA referenced entity does not exist, or is not visible to your tenant.
4062 documentedThe request could not be satisfied in the format requested.
4091 documentedThe request conflicts with the current state of the resource.
5004 documentedAn unexpected server error. Safe to retry with backoff; contact support if it persists.
5022 documentedSee the table below.
5031 documentedThe service is temporarily unavailable. Retry with backoff.
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.
| Code | When it happens | Endpoints |
|---|---|---|
| — | 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). | |
| — | Invalid extendedWarrantyStartMode, or extendedWarrantyStartDate missing or invalid when extendedWarrantyStartMode is "CUSTOM_DATE". | |
| — | 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. | |
_(validation messages)_ | One or more fields are missing or invalid. The body carries message as an **array of strings**, one per failed validation. | |
\NO\_ACTIVE\_ADDON\_OPERATION\_FOUND\_FOR: ADDON\_{ID | SKU}: {value} VARIANT\_ID: {variantId}\ | |
ADDON_ID_IS_NOT_A_VALID_POSITIVE_INTEGER | An "addonId" value is not a positive integer. | |
Address {id} has no customer associated | The address is a customer address but has no customer linked to it. | |
Address {id} is not a customer address | The address exists but is not associated to a customer entity. | |
Address {id} not found | No Sodtrack address exists with that ID. | |
ADDRESS_REFERENCE_NOT_SUPPORTED | address.type was sent as addressReference. Resolution by external address reference is not yet supported; use addressId. | |
BOOKING_CANNOT_BE_RESCHEDULED: status {status} | The booking is in execution, done or cancelled. | |
BOOKING_NOT_FOUND_FOR_ID | No booking found for the given entity ID. | |
BOOKING_NOT_FOUND_FOR_REFERENCE | No booking found for the given entity reference. | |
Date is required when type is DIRECT | dateAssignment.date is missing. | |
ENTITY_IDENTIFIER_REQUIRED | entity.value is missing or empty. | |
ENTITY_TYPE_NOT_SUPPORTED | entityType is not supported for creation. Only booking, lead, and work_order are supported. | |
Exactly one of id or sku must be provided | Neither or both identifiers were sent. | |
FIELD_REFERENCE_IS_REQUIRED | A qualifying question entry is missing fieldReference. | |
id must be an integer number / id must not be less than 1 | id is not a positive integer. | |
INCIDENT_NOT_FOUND | No incident found for the given ID or reference. | |
INCIDENT_REASON_NOT_FOUND | The incident reason ID does not exist in Sodtrack. | |
INCIDENT_REASON_REFERENCE_NOT_SUPPORTED | Resolution by reasonReference is not yet supported. Use reasonId. | |
INCIDENT_STATUS_NOT_FOUND | The incident status ID does not exist in Sodtrack. | |
INCIDENT_STATUS_REFERENCE_NOT_SUPPORTED | Resolution by statusReference is not yet supported. Use statusId. | |
Invalid addressId: {value} | address.value is not a positive integer. | |
Invalid productId: {value} | product.value is not a positive integer when product.type is productId. | |
INVALID_ACCOUNTABLE_USER | accountableUser was provided but could not be resolved to an existing user. | |
INVALID_CREATOR_USER | creatorUser was provided but could not be resolved. | |
INVALID_DATE: expected ISO 8601 | dateAssignment.date is not a valid ISO 8601 date. | |
INVALID_INCIDENT_REASON_ID | Reason id must be a number. | |
INVALID_INCIDENT_REASON_TYPE | Invalid incident reason identifier type. | |
INVALID_INCIDENT_STATUS_ID | Status id must be a number. | |
INVALID_INCIDENT_STATUS_TYPE | Invalid incident status identifier type. | |
INVALID_INCIDENT_TYPE | Invalid incident identifier type (must be incidentId or incidentReference). | |
INVALID_LATITUDE_OR_LONGITUDE | address.coordinate was sent with lat/lng outside valid ranges (lat -90–90, lng -180–180). | |
INVALID_PHONE_NUMBER | phoneNumber could not be parsed as a valid phone number. | |
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_USER | reporterUser was provided but could not be resolved. | |
INVALID_SALES_CHANNEL | The given saleChannel was not found (in strict mode). | |
INVALID_SALES_CHANNEL | The given salesChannelId does not exist or is invalid. | |
INVALID_SALES_CHANNEL | saleChannel.value is not a valid sales channel reference, or is not a positive integer when type is "id". | |
INVALID_SALES_CHANNEL | The sale channel could not be resolved from saleChannel. | |
INVALID_SERVICE | The given serviceId does not exist or has no associated lead form. | |
INVALID_STATUS_TO_RESOLVE_APPROVAL | The budget execution is not in a status that accepts an approval decision, typically because it was already approved. | |
INVALID_USER_TYPE | Invalid user identifier type. | |
INVALID_WORK_ORDER_ID | entity.value is not a number when resolving a work order by ID. | |
InvalidParameters | One or more required fields are missing or invalid. | |
InvalidParameters | One or more required fields are missing or invalid (e.g. validation pipeline). | |
InvalidParameters | A required field is missing or invalid (e.g. quantity < 1, or type not in the allowed values for variant / product / product units). | |
InvalidParameters | budgetExecutionId is not a number. | |
InvalidParameters | A required field (sku, name) is missing or a field has an invalid value (e.g. unsupported type). | |
InvalidParameters | The product selector is missing/invalid, or product.type is not "productId" / "productSku". | |
InvalidParameters | A query parameter is not an integer or falls outside its allowed range: id or bookingId below 1, pageNumber below 1, or pageSize outside 1–50. | |
InvalidParameters | customerId is not a valid integer. | |
InvalidParameters | customerId is not a number, or a pagination parameter is not an integer or falls outside its allowed range. | |
InvalidParameters | Missing or invalid request parameters. | |
LEAD_NOT_FOUND | The lead could not be found for the given leadId or leadReference. | |
LEAD_NOT_FOUND_FOR_ID | No lead found for the given entity ID. | |
LEAD_NOT_FOUND_FOR_REFERENCE | No lead found for the given entity reference. | |
MAINTENANCE_PLAN_EXECUTION_ALREADY_IN_PROGRESS | The unit already has an open cycle (PENDING or IN_PROGRESS) for this execution variant. | |
MAINTENANCE_PLAN_NOT_EXISTS | No maintenance plan covers the unit's product for the given execution variant. | |
MAINTENANCE_RULE_NOT_EXISTS | The plan exists but holds no rule for the given execution variant. | |
MULTIPLE_BOOKINGS_FOUND_FOR_REFERENCE | More than one booking shares the given reference. | |
MULTIPLE_CUSTOMERS_FOUND_FOR_REFERENCE | More than one customer matches the provided reference/email; resolution is ambiguous. Use a unique reference or contact. | |
MULTIPLE_INCIDENTS_FOUND_FOR_REFERENCE | More than one incident matches the given reference. | |
NO_ACTIVE_ADDON_OPERATION_FOUND_FOR: ADDON_{ID | SKU}: {value} VARIANT_ID: {variantId} | |
NO_COVERAGE_FOR_ADDON: {addonId} (Reference: {reference}) | The addon is not offered at the location. | |
NO_VARIANT_FOUND_FOR_ID / NO_VARIANT_FOUND_FOR_SKU | A variant could not be found by its id or SKU. | |
One or more required fields are missing or invalid. | — | |
pageNumber must not be less than 1 | pageNumber out of range. | |
pageSize must not be greater than 50 / pageSize must not be less than 1 | pageSize out of range. | |
Product not found in the product module: sku={value} | No catalog product matches the given SKU. | |
PRODUCT_NOT_EXISTS | The unit has no catalog product associated, so no plan can be matched. | |
PRODUCT_UNIT_NOT_EXISTS | No product unit matches the given ID or serial number. | |
PRODUCT_UNIT_SERIAL_NUMBER_AMBIGUOUS | The serial number matches units of more than one product. Use productUnitId. | |
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_CODE | The service is not an in-store service and the request did not include coordinates, address text, or zip code. | |
Service variant not found: type={type}, value={value} | No service variant matches the given ID or SKU. | |
TIME_RANGE_NOT_FOUND: {type} {value} | No time range matches the id or index sent. | |
Validation error | A 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 error | A 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. | |
Validation message, e.g. date must be a valid ISO 8601 date string | A field is missing, has an invalid value, or a variant or addon is repeated. | |
Validation message, e.g. variants should not be empty, quantityOfDays must not be greater than 31 | A field is missing, has an invalid value, or a variant or addon is repeated. | |
Validation message, e.g. variants should not be empty, startDate must be a valid ISO 8601 date string | A field is missing, has an invalid value, or a variant or addon is repeated. | |
VARIANT_ID_IS_NOT_A_VALID_POSITIVE_INTEGER | A "variantId" value is not a positive integer. | |
WORK_ORDER_NOT_FOUND_FOR_ID | No work order found for the given entity ID. | |
WORK_ORDER_NOT_FOUND_FOR_REFERENCE | No work order found for the given entity reference. |
401 Unauthorized
Authentication failed. The bearer token is missing, malformed or expired.
| Code | When it happens | Endpoints |
|---|---|---|
| — | 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. | |
| — | The API key is missing or invalid. | |
| — | x-api-key is missing or invalid, or the request does not originate from an authorized network. | |
| — | Missing or invalid x-api-key. | |
| — | x-api-key is missing or invalid. | |
| — | The API key is missing, invalid, or the request origin is not authorized. | |
| — | API key missing or invalid. | |
| — | x-api-key is missing or invalid, or the request does not reach Sodtrack through the authorized network. | |
| — | 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.
| Code | When it happens | Endpoints |
|---|---|---|
| — | 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.
| Code | When it happens | Endpoints |
|---|---|---|
| — | 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. | — | |
ADDRESS_NOT_FOUND | addressId does not match an existing address. | |
BOOKING_NOT_FOUND: {bookingId} | No booking exists with that id. | |
BUDGET_EXECUTION_NOT_FOUND | No budget execution exists for the given id. | |
BUDGET_EXECUTION_NOT_FOUND: {budgetExecutionId} | No budget exists with that id, or the id belongs to a budget template. | |
CUSTOMER_NOT_FOUND: {customerId} | No customer exists with that id, or the id belongs to a Sodtrack user that is not a customer. | |
CUSTOMER_NOT_FOUND: {customerId} | No customer exists with that id. | |
Product with id {id} not found / Product with sku '{sku}' not found | No 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.
| Code | When it happens | Endpoints |
|---|---|---|
PRODUCT_UNIT.SERIAL_NUMBER_ALREADY_IN_USE | The generated serial number collided with an existing one. Rare; retry the request. | |
PRODUCT.SKU_ALREADY_IN_USE | A product with the given sku already exists. |
409 Conflict
The request conflicts with the current state of the resource.
| Code | When it happens | Endpoints |
|---|---|---|
ACQUISITION_ALREADY_EXISTS | An 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.
| Code | When it happens | Endpoints |
|---|---|---|
| — | Unexpected server error. Contact Sodtrack support. | Get bookingsCreate bookingReschedule BookingCheck OptionsObtain DatesObtain TimesProjectsProject CreationCreate LeadCreate NoteCreate work orderGet Budget Execution DetailApprove budget executionReject budget executionCreate productUpdate productProductGet Full Product UnitAdd New Product UnitCreate acquisitionCreate TransactionSearch CustomersGet CustomerSearch customers (Deprecated)Get Product Units by CustomerGet Bookings by CustomerGet Budget Execution by CustomerCreate IncidentUpdate IncidentUpdate Component Price/CostStart Maintenance Plan |
| — | Unexpected server error. Contact support if the issue persists. | |
| — | Unexpected server-side error. Contact Sodtrack support. | |
Unexpected server error. Contact Sodtrack support. | — |
502 Bad Gateway
| Code | When it happens | Endpoints |
|---|---|---|
Error in createProductUnitForCustomer: {message} | The product module is unavailable or failed. Safe to retry. | |
Error in startMaintenancePlan: {message} | The product module is unavailable or failed. Safe to retry. |
503 Service Unavailable
The service is temporarily unavailable. Retry with backoff.
| Code | When it happens | Endpoints |
|---|---|---|
PRODUCT_MODULE_UNAVAILABLE | Sodtrack'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.