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.