Error Reference
Every error from the Pre-Submission and Submission APIs is returned in a single envelope shape. This page enumerates the error codes and how to resolve each.
A rejected serviceability call is not a 200 with status: "Rejected". Rejections are returned as an HTTP 4xx/5xx with the error envelope below, and an audit record is still written server-side against a preSubmissionRequestUid.
Error envelope
{
"error": {
"type": "bad_request",
"code": "missing_required_field",
"title": "Missing Required Field",
"message": "Required field 'brokerEmail' is missing from the request.",
"resolution": "Include the 'brokerEmail' field in your request.",
"documentation_url": "https://docs.slateos.ai/errors#missing_required_field",
"request_uid": "req_01ARZ3NDEKTSV4RRFFQ69G5FAV",
"timestamp": "2026-06-24T03:30:00Z",
"details": { "field": "brokerEmail" }
}
}
| Field | Notes |
|---|---|
code | Stable machine-readable code. Branch on this, not the HTTP status or message. |
type | Coarse category derived from the HTTP status (bad_request, forbidden, ...). |
title | Short human-readable summary. |
message | Human-readable detail. Wording may change; do not match on it. |
resolution | Suggested fix. |
documentation_url | Reference link for the code (see the beta note below). |
request_uid | Identifier for this HTTP request (a req_ id, or the X-Request-ID you sent). Quote it to support. |
details | Optional, code-specific. Validation failures carry details.field or details.errors[]. |
The request_uid above is the per-HTTP-request identifier. It is distinct from the preSubmissionRequestUid (psr_) audit key returned on an accepted serviceability call; the psr_ uid is the authoritative key for disputes.
During beta, the documentation_url the live API emits uses a https://docs.slateos.ai/errors#<code> base that may not yet resolve to this portal (the Error Reference is served under /guides/errors). Until that alignment lands, match the code to the relevant section on this page rather than following the embedded link.
Serviceability codes
| Code | HTTP | When it happens |
|---|---|---|
missing_required_field | 400 | Required block or field absent |
validation_failed | 400 | A field is present but invalid |
scenario_matches_no_product | 422 | Scenario does not resolve to an available product |
invalid_configuration | 400 | Routed product has no resolvable config |
permission_denied | 403 | Credential lacks the pre-submission permission |
rate_limited | 429 | Too many requests |
internal_server_error | 500 | Unexpected server error |
Authentication failures (missing, invalid, or expired token) are returned as a bare 401 by the authentication layer and do not carry this envelope. See Unauthorized.
missing_required_field
HTTP 400. A required block (brokerDetails, scenario), a required scenario field (applicants, loan and its amount / termYears / purpose), or a required broker identity field (brokerName, brokerId, aclNumber, acrNumber, brokerEmail) is missing or blank. details.field names the first offending field.
Resolution: include the named field in your request.
validation_failed
HTTP 400. A field is present but invalid. details.errors[] lists each { field, code, message }. Cases on this endpoint:
loan.purposeis not one ofOwnerOccupiedorInvestment.partnerScenarioReferenceexceeds 255 characters.- The request body is not valid JSON (nested code
malformed_payload).
Resolution: correct the fields named in details.errors[].
scenario_matches_no_product
HTTP 422. The declared scenario does not resolve to a product available to your credential. Triggers: a loan.purpose with no matching product on your allowlist, or a scenario the routing rules cannot place. The detail names the routing reason only and never echoes scenario financials.
Resolution: confirm loan.purpose is correct and that the corresponding product is on your allowlist. List your products with GET /api/v1/pre-submission/products.
invalid_configuration
HTTP 400. The scenario routed to a product, but no published configuration could be resolved for it. In practice this usually means the product is not yet published for your partner credential.
Resolution: if the product should be available to you, contact your Slate integration manager to confirm it is published.
permission_denied
HTTP 403. The credential authenticated, but it lacks the pre-submission permission.
Resolution: confirm you are using a Client ID and secret scoped to the PreSubmissionPartner credential. If the problem persists, contact your Slate integration manager.
rate_limited
HTTP 429. Too many requests in the current window. The response carries a Retry-After header.
Resolution: back off until the Retry-After interval elapses, then retry.
internal_server_error
HTTP 500. An unexpected server error. No result is returned.
Resolution: retry after a short delay. If it persists, contact support and quote the request_uid.
Unauthorized
HTTP 401. The access token is missing, invalid, or expired. This is returned by the authentication layer before the request reaches the API, so it does not carry the error envelope above.
Resolution: re-run the token exchange and retry with a fresh Bearer token.
Document codes
The document upload endpoint returns the same envelope. The file is sent in the upload request itself, so the document type and file are validated synchronously.
| Code | HTTP | When it happens |
|---|---|---|
unknown_document_type | 400 | type is not a recognised Slate document-type code |
unsupported_content_type | 400 | The uploaded file's type is not accepted |
file_too_large | 413 | The file exceeds the maximum upload size |
unknown_document_type
HTTP 400. The type in the upload request is not a recognised Slate document-type code. details.field is type.
Resolution: use a type from the required documents response, or another recognised document-type code.
unsupported_content_type
HTTP 400. The uploaded file's MIME type is not accepted. details.field is file.
Resolution: upload one of the accepted types (PDF, JPEG, PNG, TIFF).
file_too_large
HTTP 413. The uploaded file exceeds the maximum size.
Resolution: upload a smaller file, or split the evidence across multiple documents of the same type.
Submission codes
The submission endpoints return the same error envelope. The synchronous response covers request-shape problems; a payload that parses but fails downstream surfaces asynchronously as a Failed or Rejected submission status (see Submission), not as a synchronous error.
The codes below are defined on the submission responses in the API Reference as the proposed submission contract, published for review ahead of final confirmation.
| Code | HTTP | When it happens |
|---|---|---|
missing_required_header | 400 | A required X-Channel / X-External-Ref header is missing, or the request is malformed |
channel_not_permitted | 403 | The credential may not submit on this channel |
application_not_amendable | 409 | Resubmission against a non-amendable application (settled, withdrawn) |
submission_validation_failed | 422 | The payload failed validation |
Resolution: branch on code. Corrections are accepted by resubmitting under the same X-External-Ref; the existing application is reprocessed. An application_not_amendable (409) means the application can no longer be amended. Contact your Slate integration manager if you believe it should still be open.