Skip to content

Error Catalog

The OJS SDK Error Catalog assigns every error a stable OJS-XXXX numeric identifier for use across all six SDKs (Go, JS/TS, Python, Java, Rust, Ruby). These codes supplement the canonical string error codes used on the wire.

OJS-XNNN
  • OJS- — Fixed prefix
  • X — Category digit (1–7)
  • NNN — Sequential number within category
RangeCategoryDefault Retryable
OJS-1xxxClient errors (validation, serialization, connection)No
OJS-2xxxServer / infrastructure errorsYes
OJS-3xxxJob lifecycle errorsVaries
OJS-4xxxWorkflow errorsVaries
OJS-5xxxAuthentication & authorizationNo
OJS-6xxxRate limiting & backpressureYes
OJS-7xxxExtension errorsVaries
CodeNameHTTPCanonical CodeRetryable
OJS-1000InvalidPayload400INVALID_PAYLOADNo
OJS-1001InvalidJobType400INVALID_JOB_TYPENo
OJS-1002InvalidQueue400INVALID_QUEUENo
OJS-1003InvalidArgs400INVALID_ARGSNo
OJS-1004InvalidMetadata400INVALID_METADATANo
OJS-1005InvalidStateTransition409INVALID_STATE_TRANSITIONNo
OJS-1006InvalidRetryPolicy400INVALID_RETRY_POLICYNo
OJS-1007InvalidCronExpression400INVALID_CRON_EXPRESSIONNo
OJS-1008SchemaValidationFailed422SCHEMA_VALIDATION_FAILEDNo
OJS-1009PayloadTooLarge413PAYLOAD_TOO_LARGENo
OJS-1010MetadataTooLarge413METADATA_TOO_LARGENo
OJS-1011ConnectionError(client-side)Yes
OJS-1012RequestTimeout(client-side)Yes
OJS-1013SerializationError(client-side)No
OJS-1014QueueNameTooLong400QUEUE_NAME_TOO_LONGNo
OJS-1015JobTypeTooLong400JOB_TYPE_TOO_LONGNo
OJS-1016ChecksumMismatch400CHECKSUM_MISMATCHNo
OJS-1017UnsupportedCompression400UNSUPPORTED_COMPRESSIONNo
CodeNameHTTPCanonical CodeRetryable
OJS-2000BackendError500BACKEND_ERRORYes
OJS-2001BackendUnavailable503BACKEND_UNAVAILABLEYes
OJS-2002BackendTimeout504BACKEND_TIMEOUTYes
OJS-2003ReplicationLag500REPLICATION_LAGYes
OJS-2004InternalServerError500(generic)Yes
CodeNameHTTPCanonical CodeRetryable
OJS-3000JobNotFound404NOT_FOUNDNo
OJS-3001DuplicateJob409DUPLICATE_JOBNo
OJS-3002JobAlreadyCompleted409JOB_ALREADY_COMPLETEDNo
OJS-3003JobAlreadyCancelled409JOB_ALREADY_CANCELLEDNo
OJS-3004QueuePaused422QUEUE_PAUSEDYes
OJS-3005HandlerErrorHANDLER_ERRORPer policy
OJS-3006HandlerTimeoutHANDLER_TIMEOUTPer policy
OJS-3007HandlerPanicHANDLER_PANICPer policy
OJS-3008NonRetryableErrorNON_RETRYABLE_ERRORNo
OJS-3009JobCancelledJOB_CANCELLEDNo
OJS-3010NoHandlerRegistered(client-side)No
CodeNameHTTPRetryable
OJS-4000WorkflowNotFound404No
OJS-4001ChainStepFailed422No
OJS-4002GroupTimeout504Yes
OJS-4003DependencyFailed422No
OJS-4004CyclicDependency400No
OJS-4005BatchCallbackFailed422Per policy
OJS-4006WorkflowCancelled409No

OJS-5xxx: Authentication & Authorization Errors

Section titled “OJS-5xxx: Authentication & Authorization Errors”
CodeNameHTTPCanonical CodeRetryable
OJS-5000Unauthenticated401UNAUTHENTICATEDNo
OJS-5001PermissionDenied403PERMISSION_DENIEDNo
OJS-5002TokenExpired401TOKEN_EXPIREDNo
OJS-5003TenantAccessDenied403TENANT_ACCESS_DENIEDNo

OJS-6xxx: Rate Limiting & Backpressure Errors

Section titled “OJS-6xxx: Rate Limiting & Backpressure Errors”
CodeNameHTTPCanonical CodeRetryable
OJS-6000RateLimited429RATE_LIMITEDYes
OJS-6001QueueFull429QUEUE_FULLYes
OJS-6002ConcurrencyLimited429Yes
OJS-6003BackpressureApplied429Yes
CodeNameHTTPCanonical CodeRetryable
OJS-7000UnsupportedFeature422UNSUPPORTED_FEATURENo
OJS-7001CronScheduleConflict409No
OJS-7002UniqueKeyInvalid400No
OJS-7003MiddlewareError500Yes
OJS-7004MiddlewareTimeout504Yes

Error code constants are available in all six SDKs:

SDKImport
Goojs.CodeDuplicateJob, ojs.LookupByCanonicalCode("DUPLICATE_JOB")
JS/TSimport { OJS_3001_DUPLICATE_JOB, lookupByCanonicalCode } from '@openjobspec/sdk'
Pythonfrom ojs.error_codes import DUPLICATE_JOB, lookup_by_canonical_code
JavaErrorCode.DUPLICATE_JOB, ErrorCode.fromCanonicalCode("DUPLICATE_JOB")
Rustojs::error_codes::OJS_3001_DUPLICATE_JOB, ojs::error_codes::lookup_by_canonical_code("DUPLICATE_JOB")
RubyOJS::ErrorCodes::DUPLICATE_JOB, OJS::ErrorCodes.lookup_by_canonical_code("DUPLICATE_JOB")

See the full specification at spec/ojs-error-catalog.md.