Skip to main content

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" }
}
}
FieldNotes
codeStable machine-readable code. Branch on this, not the HTTP status or message.
typeCoarse category derived from the HTTP status (bad_request, forbidden, ...).
titleShort human-readable summary.
messageHuman-readable detail. Wording may change; do not match on it.
resolutionSuggested fix.
documentation_urlReference link for the code (see the beta note below).
request_uidIdentifier for this HTTP request (a req_ id, or the X-Request-ID you sent). Quote it to support.
detailsOptional, 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

CodeHTTPWhen it happens
missing_required_field400Required block or field absent
validation_failed400A field is present but invalid
scenario_matches_no_product422Scenario does not resolve to an available product
invalid_configuration400Routed product has no resolvable config
permission_denied403Credential lacks the pre-submission permission
rate_limited429Too many requests
internal_server_error500Unexpected 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.purpose is not one of OwnerOccupied or Investment.
  • partnerScenarioReference exceeds 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.

CodeHTTPWhen it happens
unknown_document_type400type is not a recognised Slate document-type code
unsupported_content_type400The uploaded file's type is not accepted
file_too_large413The 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.

CodeHTTPWhen it happens
missing_required_header400A required X-Channel / X-External-Ref header is missing, or the request is malformed
channel_not_permitted403The credential may not submit on this channel
application_not_amendable409Resubmission against a non-amendable application (settled, withdrawn)
submission_validation_failed422The 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.