The Incode Omni API uses standard HTTP status codes to indicate whether a request succeeded or failed. For certain errors, the response body also contains an Incode-specific status code that provides more precise information about what went wrong.
This page covers API error codes. SDK error handling and Dashboard error messages are documented separately.
Info
Looking for SDK errors?
SDK error handling documentation is coming soon. In the meantime, refer to the error handling section in each platform's integration guide.
Error Response Format
All error responses from the Omni API return a JSON object with the following structure:
{
"timestamp": 1722948860110,
"status": 4004,
"error": "Bad Request",
"message": "Could not find user",
"path": "/omni/add/front-id/v2"
}
| Field | Type | Description |
|---|---|---|
timestamp |
integer | UTC timestamp of the error, in milliseconds |
status |
integer | HTTP status code, or an Incode custom error code for 400 responses |
error |
string | HTTP status text (e.g., "Bad Request", "Forbidden") |
message |
string | Human-readable description of the error |
path |
string | The endpoint path that returned the error |
details |
object | Additional error context, when present |
Info
Custom error codes and HTTP status
When an Incode custom error code is returned, the status field in the response body will contain the custom code (e.g., 4004) rather than the HTTP status code. The HTTP status of the response itself will still be 400.
HTTP Status Codes
The following standard HTTP status codes are used across the Omni API.
{/* REVIEW: Verify whether 401 Unauthorized should be added to this table. See review note 4. */}
| Code | Name | Description |
|---|---|---|
200 |
OK | The request succeeded. |
400 |
Bad Request | The request was invalid. This may be due to missing or malformed parameters, or an Incode-specific condition described by a custom error code in the response body. |
403 |
Forbidden | The request is not permitted. This can occur when a feature is disabled for your organization (for example, score retrieval). |
429 |
Too Many Requests | The request was rate-limited. A cooldown period must complete before retrying. This applies to OTP send operations. |
500 |
Internal Server Error | An unexpected error occurred on Incode's servers. |
504 |
Gateway Timeout | The request exceeded the allowed time limit. This can occur during external validation operations such as CURP validation. |
Incode Custom Error Codes
When a request fails with a 400 response, the status field in the response body may contain an Incode-specific error code. These codes provide more precise information than the HTTP status alone.
Custom error codes are grouped below by functional area.
Session Initialization
These errors are returned by POST /omni/start when a session cannot be created due to configuration or parameter issues.
| Code | Message | Description |
|---|---|---|
4026 |
Invalid uuid parameter | The uuid parameter provided is not valid. |
4027 |
Invalid configurationId | The configurationId does not correspond to a valid configuration. |
4028 |
Flow is not activated | The specified Flow or Workflow has not been activated. Activate it in the Dashboard before use. |
4081 |
Invalid parameters for validation | One or more parameters failed validation on session start. |
4082 |
Start endpoint version forbidden in flow/workflow | The version of the /omni/start endpoint used is not permitted by the configured Flow or Workflow. |
User and Identity
These errors indicate that a required user record could not be found or that a conflict exists with existing user data.
| Code | Message | Returned by |
|---|---|---|
4004 |
Could not find user | POST /omni/external/send-sms, POST /omni/add/front-id/v2, POST /omni/add/back-id/v2 |
4006 |
User with given phone already exists | POST /omni/process/approve |
Face and Selfie Processing
These errors are returned when a face or selfie image cannot be processed successfully. They are most commonly returned by ID upload and face capture endpoints.
| Code | Message | Description |
|---|---|---|
1003 |
Face cropping failure | A face was detected in the image but could not be cropped successfully. |
4010 |
More than one face detected | The image contains multiple faces. Only a single face is expected. |
4019 |
Face not found | No face was detected in the submitted image. |
4077 |
Selfie image has low quality | The selfie image does not meet minimum quality requirements. |
4078 |
Selfie face is occluded or partially covered | The face in the selfie is obscured. Prompt the user to remove obstructions (glasses, masks, hands) and retry. |
Affected endpoints: POST /omni/add/front-id/v2, POST /omni/add/front-second-id/v2, POST /omni/add/face/third-party
Image Quality
{/* REVIEW: Consider merging this section into "Face and Selfie Processing" if no additional image quality codes are expected. See review note 3. */}
These errors indicate that a submitted image does not meet technical requirements.
| Code | Message | Description |
|---|---|---|
5003 |
Unsatisfied image size | The image does not meet the minimum size requirements. |
Affected endpoints: POST /omni/add/back-id/v2
B2B Integration
These errors are specific to B2B onboarding flows (POST /omni/b2b/onboarding/request-new).
| Code | Message | Description |
|---|---|---|
4300 |
Integration not found by id | The integration ID provided does not match a known integration. |
4301 |
Employee by login factor cannot be found | An employee record matching the provided login factor could not be located. |
OTP and Contact Verification
{/* REVIEW: Verify the HTTP method for /omni/send/otp. The spec lists it as GET but send operations are typically POST. Correct the method below if needed. See review note 2. */}
These errors are returned by GET /omni/send/otp.
| HTTP Code | Message | Description |
|---|---|---|
400 |
Contact Already Verified | The phone number or email address is already verified for this session. |
429 |
Cooldown period not completed | An OTP was recently sent to this contact. Wait for the cooldown period to expire before requesting a new one. |
Government Validation (Mexico)
These errors apply to Mexican tax ID and identity validation endpoints.
| HTTP Code | Endpoint | Description |
|---|---|---|
400 |
POST /api/validate/rfc |
Invalid RFC format. |
400 |
POST /api/calculate/rfc |
Invalid input data provided for RFC calculation. |
500 |
POST /api/validate/rfc |
Internal server error during RFC validation. |
500 |
POST /api/calculate/rfc |
Internal server error during RFC calculation. |
500 |
CURP validation endpoints | Internal error during CURP validation. |
504 |
CURP validation endpoints | The CURP validation request exceeded the allowed time limit. |
Score Retrieval
| HTTP Code | Endpoint | Description |
|---|---|---|
403 |
GET /omni/get/score |
Score retrieval is disabled for this organization for session users. Contact your Incode account team to enable this feature. |
Known Gaps
The API specification documents custom error codes for a subset of endpoints. Many endpoints that return 400 Bad Request do not currently have custom error codes defined in the API spec. If you encounter a 400 response without a custom code from an endpoint not listed above, the message field in the response body is the best available source of information about the specific failure.
Warning
Content in progress
This reference will be updated as custom error codes are confirmed for additional endpoints. If you encounter an undocumented error code, contact Incode Support or your customer success manager.
{/* REVIEW: Replace the two placeholder links (#) above and in "Handling Errors" below with the correct URLs before publishing. See review note 5. */}
Handling Errors
A few general practices for handling Omni API errors:
For 400 errors: Check the status field in the response body first. If it contains a value from the custom error code tables above, use that to determine the specific failure. If status is 400, fall back to the message field.
For 429 errors: Implement a retry with a backoff delay. Do not retry immediately — the response indicates a cooldown period is required.
For 500 and 504 errors: These indicate a server-side or timeout condition. Retry with exponential backoff. If errors persist, check the Incode Status Page for any ongoing incidents.
For 403 errors: These are typically configuration issues, not transient failures. Retrying will not resolve them — contact your Incode account team.