Error Codes
This page documents all error codes returned by IdentityScribe. Each code includes the message shown to clients and protocol-specific status codes.
HTTP error response format
Section titled “HTTP error response format”When an error occurs on HTTP-based channels (REST, GraphQL), clients receive:
Response headers
Section titled “Response headers”| Header | Description | Example |
|---|---|---|
Error-Id | Unique error identifier (UUID) | a1b2c3d4-e5f6-7890-abcd-ef1234567890 |
Error-Code | Machine-readable error code | DIRECTORY_BUSY |
Error-Kind | Error classification | UNAVAILABLE |
Correlation-Id | Request correlation ID (if provided) | req-12345 |
Trace-Id | OpenTelemetry trace ID | abc123def456... |
Span-Id | OpenTelemetry span ID | abc123def456 |
Retry-After | Retry hint (for retryable errors) | 5 or Mon, 13 Jan 2026 12:00:00 GMT |
The Retry-After header uses either:
- Seconds: delay before retrying (e.g.,
5) - HTTP-date: specific time to retry (RFC 1123 format)
JSON body
Section titled “JSON body”{ "error": { "status": 503, "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "timestamp": "2026-01-13T10:30:00.123Z", "code": "DIRECTORY_BUSY", "kind": "UNAVAILABLE", "message": "Service temporarily unavailable. Please try again.", "correlation": "req-12345", "trace_id": "abc123def456...", "span_id": "abc123def456", "details": { "pending_operations": 5 }, "retry": { "after": "PT5S" } }}Field Notes:
message— Client-safe, always presentdetails— Optional structured diagnostics, may be omittedcorrelation,trace_id,span_id— Present only if set on the requestretry— Present only for retryable errors, containsafter(ISO 8601 duration) orat(ISO 8601 instant)
Wide log failure format
Section titled “Wide log failure format”When errors are logged to wide logs (JSON format), the failure block contains:
{ "trace_id": "abc123def456...", "span_id": "abc123def456", "duration_seconds": 0.234, "result": "unavailable", "failure": { "kind": "UNAVAILABLE", "code": "DIRECTORY_BUSY", "trace_id": "abc123def456...", "span_id": "abc123def456", "message": "Directory is busy processing another request", "details": { "pending_operations": 5 } }, "scribe.operation": "LDAP.Search", "scribe.channel": "ldap"}Categories
Section titled “Categories”- Default codes
- Argument validation
- Filter parsing
- Directory operations
- REST channel
- Asset serving
- GraphQL channel
Default codes
Section titled “Default codes”General error codes returned when no more specific code applies.
CANCELLED
Section titled “CANCELLED”Operation was cancelled, typically by the caller.
Message: Request cancelled.
| Protocol | Status |
|---|---|
| HTTP | 499 Client Closed Request |
| gRPC | CANCELLED |
| LDAP | 118 (cancelled) |
INVALID_ARGUMENT
Section titled “INVALID_ARGUMENT”Client specified an invalid argument.
Message: Some inputs are invalid.
| Protocol | Status |
|---|---|
| HTTP | 400 Bad Request |
| gRPC | INVALID_ARGUMENT |
| LDAP | 2 (protocolError) |
OUT_OF_RANGE
Section titled “OUT_OF_RANGE”Client specified an argument that is outside allowed range.
Message: That value is out of range.
| Protocol | Status |
|---|---|
| HTTP | 400 Bad Request |
| gRPC | OUT_OF_RANGE |
| LDAP | 19 (constraintViolation) |
FAILED_PRECONDITION
Section titled “FAILED_PRECONDITION”Operation was rejected because the system is not in a state required for execution.
Message: Can’t do that right now.
| Protocol | Status |
|---|---|
| HTTP | 409 Conflict |
| gRPC | FAILED_PRECONDITION |
| LDAP | 19 (constraintViolation) |
UNAUTHENTICATED
Section titled “UNAUTHENTICATED”Request does not have valid authentication credentials.
Message: Please sign in and try again.
| Protocol | Status |
|---|---|
| HTTP | 401 Unauthorized |
| gRPC | UNAUTHENTICATED |
| LDAP | 49 (invalidCredentials) |
PERMISSION_DENIED
Section titled “PERMISSION_DENIED”Caller does not have permission to execute the operation.
Message: You don’t have access to do that.
| Protocol | Status |
|---|---|
| HTTP | 403 Forbidden |
| gRPC | PERMISSION_DENIED |
| LDAP | 50 (insufficientAccessRights) |
NOT_FOUND
Section titled “NOT_FOUND”Requested entity was not found.
Message: Not found.
| Protocol | Status |
|---|---|
| HTTP | 404 Not Found |
| gRPC | NOT_FOUND |
| LDAP | 32 (noSuchObject) |
ALREADY_EXISTS
Section titled “ALREADY_EXISTS”Entity that a client attempted to create already exists.
Message: That already exists.
| Protocol | Status |
|---|---|
| HTTP | 409 Conflict |
| gRPC | ALREADY_EXISTS |
| LDAP | 68 (entryAlreadyExists) |
CONFLICT
Section titled “CONFLICT”Concurrency conflict, such as read-modify-write conflict.
Message: That conflicts with an existing value.
| Protocol | Status |
|---|---|
| HTTP | 409 Conflict |
| gRPC | ABORTED |
| LDAP | 51 (busy) |
RESOURCE_EXHAUSTED
Section titled “RESOURCE_EXHAUSTED”Resource has been exhausted (e.g., quota, rate limit).
Message: Too many requests. Try again in a bit.
Retry: Recommended after 2s
| Protocol | Status |
|---|---|
| HTTP | 429 Too Many Requests |
| gRPC | RESOURCE_EXHAUSTED |
| LDAP | 51 (busy) |
DEADLINE_EXCEEDED
Section titled “DEADLINE_EXCEEDED”Deadline expired before operation could complete.
Message: Timed out. Please try again.
Retry: Recommended after 1s
| Protocol | Status |
|---|---|
| HTTP | 504 Gateway Timeout |
| gRPC | DEADLINE_EXCEEDED |
| LDAP | 3 (timeLimitExceeded) |
UNAVAILABLE
Section titled “UNAVAILABLE”Service is currently unavailable.
Message: Service temporarily unavailable. Please try again.
Retry: Recommended after 5s
| Protocol | Status |
|---|---|
| HTTP | 503 Service Unavailable |
| gRPC | UNAVAILABLE |
| LDAP | 52 (unavailable) |
UNIMPLEMENTED
Section titled “UNIMPLEMENTED”Operation is not implemented or not supported.
Message: That isn’t supported.
| Protocol | Status |
|---|---|
| HTTP | 501 Not Implemented |
| gRPC | UNIMPLEMENTED |
| LDAP | 53 (unwillingToPerform) |
INTERNAL
Section titled “INTERNAL”Internal errors (unexpected).
Message: Something went wrong.
| Protocol | Status |
|---|---|
| HTTP | 500 Internal Server Error |
| gRPC | INTERNAL |
| LDAP | 80 (other) |
DATA_LOSS
Section titled “DATA_LOSS”Unrecoverable data loss or corruption.
Message: A data error occurred.
| Protocol | Status |
|---|---|
| HTTP | 500 Internal Server Error |
| gRPC | DATA_LOSS |
| LDAP | 80 (other) |
UNKNOWN
Section titled “UNKNOWN”Unknown error.
Message: Something went wrong.
| Protocol | Status |
|---|---|
| HTTP | 500 Internal Server Error |
| gRPC | UNKNOWN |
| LDAP | 80 (other) |
Argument validation
Section titled “Argument validation”Errors returned for malformed or invalid request parameters.
ARGUMENT_INVALID_JSON
Section titled “ARGUMENT_INVALID_JSON”Invalid JSON syntax in request parameter.
Message: Some inputs are invalid.
| Protocol | Status |
|---|---|
| HTTP | 400 Bad Request |
| gRPC | INVALID_ARGUMENT |
| LDAP | 2 (protocolError) |
ARGUMENT_INVALID_TYPE
Section titled “ARGUMENT_INVALID_TYPE”Wrong JSON value type (e.g., expected ARRAY, got OBJECT).
Message: Some inputs are invalid.
| Protocol | Status |
|---|---|
| HTTP | 400 Bad Request |
| gRPC | INVALID_ARGUMENT |
| LDAP | 2 (protocolError) |
ARGUMENT_INVALID_ELEMENT
Section titled “ARGUMENT_INVALID_ELEMENT”Invalid element type in array (e.g., expected STRING, got NUMBER).
Message: Some inputs are invalid.
| Protocol | Status |
|---|---|
| HTTP | 400 Bad Request |
| gRPC | INVALID_ARGUMENT |
| LDAP | 2 (protocolError) |
ARGUMENT_MISSING_FIELD
Section titled “ARGUMENT_MISSING_FIELD”Required field missing in JSON object.
Message: Some inputs are invalid.
| Protocol | Status |
|---|---|
| HTTP | 400 Bad Request |
| gRPC | INVALID_ARGUMENT |
| LDAP | 2 (protocolError) |
ARGUMENT_MUTUALLY_EXCLUSIVE
Section titled “ARGUMENT_MUTUALLY_EXCLUSIVE”Mutually exclusive parameters specified together.
Message: Some inputs are invalid.
| Protocol | Status |
|---|---|
| HTTP | 400 Bad Request |
| gRPC | INVALID_ARGUMENT |
| LDAP | 2 (protocolError) |
ARGUMENT_INVALID_VALUE
Section titled “ARGUMENT_INVALID_VALUE”Invalid value format (not a JSON syntax error, but value doesn’t match expected format).
Message: Some inputs are invalid.
| Protocol | Status |
|---|---|
| HTTP | 400 Bad Request |
| gRPC | INVALID_ARGUMENT |
| LDAP | 2 (protocolError) |
Filter parsing
Section titled “Filter parsing”Errors returned when parsing filter expressions.
FILTER_INVALID_SYNTAX
Section titled “FILTER_INVALID_SYNTAX”General filter parse failure.
Message: Invalid filter syntax.
| Protocol | Status |
|---|---|
| HTTP | 400 Bad Request |
| gRPC | INVALID_ARGUMENT |
| LDAP | 2 (protocolError) |
FILTER_UNSUPPORTED_PATH
Section titled “FILTER_UNSUPPORTED_PATH”SCIM attribute path not supported (e.g., dotted paths like name.familyName).
Message: Unsupported attribute path in filter.
| Protocol | Status |
|---|---|
| HTTP | 400 Bad Request |
| gRPC | INVALID_ARGUMENT |
| LDAP | 2 (protocolError) |
FILTER_UNSUPPORTED_FEATURE
Section titled “FILTER_UNSUPPORTED_FEATURE”Unsupported filter feature (e.g., ComplexValueFilter).
Message: Unsupported filter feature.
| Protocol | Status |
|---|---|
| HTTP | 400 Bad Request |
| gRPC | INVALID_ARGUMENT |
| LDAP | 2 (protocolError) |
FILTER_NESTING_EXCEEDED
Section titled “FILTER_NESTING_EXCEEDED”Filter nesting depth exceeds limit.
Message: Filter nesting depth exceeded.
| Protocol | Status |
|---|---|
| HTTP | 400 Bad Request |
| gRPC | INVALID_ARGUMENT |
| LDAP | 2 (protocolError) |
FILTER_TOO_LARGE
Section titled “FILTER_TOO_LARGE”Filter string exceeds maximum length.
Message: Filter too large.
| Protocol | Status |
|---|---|
| HTTP | 400 Bad Request |
| gRPC | INVALID_ARGUMENT |
| LDAP | 2 (protocolError) |
Directory operations
Section titled “Directory operations”Errors related to directory query execution and resource limits.
DIRECTORY_BUSY
Section titled “DIRECTORY_BUSY”Directory connection permits exhausted
Message: Directory service is busy. Please retry later.
Retry: Recommended after 2s
| Protocol | Status |
|---|---|
| HTTP | 503 Service Unavailable |
| gRPC | UNAVAILABLE |
| LDAP | 51 (busy) |
DIRECTORY_SIZE_LIMIT_EXCEEDED
Section titled “DIRECTORY_SIZE_LIMIT_EXCEEDED”Result set exceeded size limit
Message: Size limit exceeded.
Retry: Not recommended
| Protocol | Status |
|---|---|
| HTTP | 429 Too Many Requests |
| gRPC | RESOURCE_EXHAUSTED |
| LDAP | 4 (sizeLimitExceeded) |
DIRECTORY_TIME_LIMIT_EXCEEDED
Section titled “DIRECTORY_TIME_LIMIT_EXCEEDED”Query exceeded time limit
Message: Timed out. Please try again.
Retry: Recommended after 1s
| Protocol | Status |
|---|---|
| HTTP | 504 Gateway Timeout |
| gRPC | DEADLINE_EXCEEDED |
| LDAP | 3 (timeLimitExceeded) |
DIRECTORY_UNSUPPORTED_ATTRIBUTE_OP
Section titled “DIRECTORY_UNSUPPORTED_ATTRIBUTE_OP”Unsupported attribute operation in filter/sort
Message: Some inputs are invalid.
| Protocol | Status |
|---|---|
| HTTP | 400 Bad Request |
| gRPC | INVALID_ARGUMENT |
| LDAP | 2 (protocolError) |
DIRECTORY_OUTSIDE_ALL_BASES
Section titled “DIRECTORY_OUTSIDE_ALL_BASES”Base DN outside configured scopes
Message: That value is out of range.
| Protocol | Status |
|---|---|
| HTTP | 400 Bad Request |
| gRPC | OUT_OF_RANGE |
| LDAP | 19 (constraintViolation) |
DIRECTORY_MISSING_TYPE_CONSTRAINT
Section titled “DIRECTORY_MISSING_TYPE_CONSTRAINT”Query requires but lacks type constraint
Message: Some inputs are invalid.
| Protocol | Status |
|---|---|
| HTTP | 400 Bad Request |
| gRPC | INVALID_ARGUMENT |
| LDAP | 2 (protocolError) |
DIRECTORY_INCONSISTENT_TYPE_CONSTRAINT
Section titled “DIRECTORY_INCONSISTENT_TYPE_CONSTRAINT”Inconsistent type constraints in query
Message: Some inputs are invalid.
| Protocol | Status |
|---|---|
| HTTP | 400 Bad Request |
| gRPC | INVALID_ARGUMENT |
| LDAP | 2 (protocolError) |
REST channel
Section titled “REST channel”Errors specific to REST API endpoints.
REST_MISSING_PATH_PARAM
Section titled “REST_MISSING_PATH_PARAM”Missing required path parameter
Message: Some inputs are invalid.
| Protocol | Status |
|---|---|
| HTTP | 400 Bad Request |
| gRPC | INVALID_ARGUMENT |
| LDAP | 2 (protocolError) |
REST_INVALID_PATH_PARAM
Section titled “REST_INVALID_PATH_PARAM”Invalid/blank path parameter
Message: Some inputs are invalid.
| Protocol | Status |
|---|---|
| HTTP | 400 Bad Request |
| gRPC | INVALID_ARGUMENT |
| LDAP | 2 (protocolError) |
REST_UNKNOWN_ENTRY_TYPE
Section titled “REST_UNKNOWN_ENTRY_TYPE”Unknown entry type requested
Message: Not found.
| Protocol | Status |
|---|---|
| HTTP | 404 Not Found |
| gRPC | NOT_FOUND |
| LDAP | 32 (noSuchObject) |
REST_INVALID_IDENTIFIER_FORMAT
Section titled “REST_INVALID_IDENTIFIER_FORMAT”Invalid identifier format - not a valid UUID, UOID, or DN
Message: Some inputs are invalid.
| Protocol | Status |
|---|---|
| HTTP | 400 Bad Request |
| gRPC | INVALID_ARGUMENT |
| LDAP | 2 (protocolError) |
Asset serving
Section titled “Asset serving”Errors returned when serving static assets.
ASSET_MISSING_PATH
Section titled “ASSET_MISSING_PATH”Asset path is missing or blank
Message: Not found.
| Protocol | Status |
|---|---|
| HTTP | 404 Not Found |
| gRPC | NOT_FOUND |
| LDAP | 32 (noSuchObject) |
ASSET_INVALID_PATH
Section titled “ASSET_INVALID_PATH”Invalid path characters or traversal attempt
Message: Some inputs are invalid.
| Protocol | Status |
|---|---|
| HTTP | 400 Bad Request |
| gRPC | INVALID_ARGUMENT |
| LDAP | 2 (protocolError) |
ASSET_UNSUPPORTED_EXTENSION
Section titled “ASSET_UNSUPPORTED_EXTENSION”Unsupported file extension
Message: Not found.
| Protocol | Status |
|---|---|
| HTTP | 404 Not Found |
| gRPC | NOT_FOUND |
| LDAP | 32 (noSuchObject) |
ASSET_NOT_FOUND
Section titled “ASSET_NOT_FOUND”Asset not found at path
Message: Not found.
| Protocol | Status |
|---|---|
| HTTP | 404 Not Found |
| gRPC | NOT_FOUND |
| LDAP | 32 (noSuchObject) |
ASSET_IO_ERROR
Section titled “ASSET_IO_ERROR”IO error reading asset content
Message: Something went wrong.
| Protocol | Status |
|---|---|
| HTTP | 500 Internal Server Error |
| gRPC | INTERNAL |
| LDAP | 80 (other) |
GraphQL channel
Section titled “GraphQL channel”GRAPHQL_QUERY_DEPTH_EXCEEDED
Section titled “GRAPHQL_QUERY_DEPTH_EXCEEDED”Query depth exceeds configured max-depth limit.
Message: Something went wrong.
| Protocol | Status |
|---|---|
| HTTP | 500 Internal Server Error |
| gRPC | UNKNOWN |
| LDAP | 80 (other) |
GRAPHQL_QUERY_COMPLEXITY_EXCEEDED
Section titled “GRAPHQL_QUERY_COMPLEXITY_EXCEEDED”Query complexity exceeds configured max-complexity limit.
Message: Something went wrong.
| Protocol | Status |
|---|---|
| HTTP | 500 Internal Server Error |
| gRPC | UNKNOWN |
| LDAP | 80 (other) |
GRAPHQL_QUERY_TOO_LARGE
Section titled “GRAPHQL_QUERY_TOO_LARGE”Query string exceeds parser max-characters limit.
Message: Something went wrong.
| Protocol | Status |
|---|---|
| HTTP | 500 Internal Server Error |
| gRPC | UNKNOWN |
| LDAP | 80 (other) |
GRAPHQL_TOO_MANY_TOKENS
Section titled “GRAPHQL_TOO_MANY_TOKENS”Query has too many tokens (exceeds parser max-tokens limit).
Message: Something went wrong.
| Protocol | Status |
|---|---|
| HTTP | 500 Internal Server Error |
| gRPC | UNKNOWN |
| LDAP | 80 (other) |