Skip to main content
Every error is application/json with one object, error:
Every response, error or not, carries a Request-Id header with the same ID. A message never repeats a value you sent: a 400 names the field, not its content.

Codes

invalid_request

400. The body doesn’t match the schema, for example a missing answer or a field we don’t know. Fix the request; errors lists every field at fault. Retrying it unchanged gets the same 400.

unauthenticated

401. The key is missing, unknown or revoked. See Authentication.

forbidden

403. The key is valid, but it isn’t a key that can use this route. A task is never 403: a task you can’t see is 404.

not_found

404. The resource doesn’t exist, or your lab can’t see it. The response is the same either way. That covers a task your lab isn’t granted, a version that isn’t published, and another lab’s reward. An ID that isn’t well formed is 404 too, never 400: IDs are opaque.

version_retired

410. The task version, or the judge version, is past its sunset. Move to the current version. Once a newer version is published, downloading the older one’s package returns Deprecation and Sunset headers (RFC 9745, RFC 8594), so you can move in time.

request_too_large

413. The request body is over 512 KB. Nothing was created. The package’s verifier never sends one; see Limits.

rate_limited

429. Your lab already has 2,000 rewards pending, its limit. Nothing was created. The response has a Retry-After header, in seconds: post again after it, as your pending rewards finish. Posting an answer whose reward is pending or scored still returns that reward; an answer whose reward failed is scored again, as a new pending reward. See Limits.

internal

500. Our fault. The body says nothing more than that, and gives the request_id: send it to us. A package whose bytes fail our check is never served: you get this instead.

service_unavailable

503. Something we depend on is down. The response has a Retry-After header, in seconds. The request may or may not have taken effect. Retrying is safe: posting the same answer again returns the same reward rather than scoring it twice. Wait for Retry-After, and back off exponentially with jitter, up to 60 seconds, if it repeats.

Retrying

A reward with status: failed isn’t an error response. See A failed reward.