Skip to main content

The error envelope

Every failure, from every endpoint, has the same shape.
details appears in two cases:
  • Validation failures carry an array of { "path": [...], "message": "..." }, one per problem. path locates the field in the body or query.
  • ER:LC failures carry { "availability": "unavailable" }.
Internal errors never expose stack traces or database messages.

Statuses

Each operation in the reference lists the codes it can return and when.

Validation: 400

Bodies and most query strings are validated strictly.
  • Unknown body properties are rejected. This is how the API refuses a client that tries to name an owner, issuer or actor: those always come from the session.
  • Unknown query parameters are rejected on most list endpoints. The CAD list endpoints ignore them instead.
  • Text is trimmed before length rules apply.
  • A body that is missing or is not JSON returns INVALID_JSON.

Authentication and permission: 401 and 403

Conflicts: 409

A 409 means the request was understood and allowed, but the record is not in a state that permits it. Nothing was changed.

Stale versions and concurrent changes

CAD incidents and units carry a version. Changes send back the version the client last read. For either one: read the record again, show the person the current state, and let them decide whether to retry. Argus never retries a conflicting write itself, and a client should not do so blindly. Optimistic concurrency covers this in full.

State conflicts elsewhere

Rate limits: 429

RATE_LIMITED comes with a Retry-After header in whole seconds. Wait that long before the next request. The budgets are listed under Authentication.

ER:LC unavailable: 503

Live server data and remote moderation depend on the ER:LC API. Argus caches a good snapshot for ten seconds and never serves expired data after a failure. Cooldown responses include Retry-After.

Moderation is different: read delivery

A kick or ban returns success as soon as the punishment record exists. Whether the game carried it out is in the record’s delivery field: SUCCEEDED, FAILED with an errorCode, or UNKNOWN when the outcome could not be confirmed. An UNKNOWN kick or ban may have happened. Argus never resends a command. These three endpoints also require an Idempotency-Key header. Repeating a request with the same key and body returns the original record; the same key with a different body returns 409 IDEMPOTENCY_CONFLICT.