# Error codes

URL: https://submitator.com/docs/errors

> Every error code the API returns, with its HTTP status, what happened and how to fix it.

Each code below is the `error.code` of a response, and each error's `doc_url` links to its section here. The list is closed: the API returns no other code. [Error format](https://submitator.com/docs/error-format) shows the shape of the body.

## invalid_json

Status: 400

**What happened.** The body is not valid JSON.

**How to fix.** Send a JSON object with `Content-Type: application/json`.

## invalid_query

Status: 400

**What happened.** The query string cannot be read: a `%` is not followed by two hex digits.

**How to fix.** Percent-encode the values, for example with `encodeURIComponent`.

## unknown_parameter

Status: 400

**What happened.** A body field or query parameter is not part of this operation; `param` names it.

**How to fix.** Remove it. The key sets the mode, so `livemode` is never a parameter.

## invalid_cursor

Status: 400

**What happened.** The cursor was not issued for this list, or it was changed.

**How to fix.** Send `next_cursor` exactly as you received it, to the same list.

## api_key_missing

Status: 401

**What happened.** The request has no key.

**How to fix.** Send `Authorization: Bearer` and your key.

## api_key_invalid

Status: 401

**What happened.** The key is unknown, revoked or expired.

**How to fix.** Use an active key from the console.

## no_launches_left

Status: 402

**What happened.** The launch needs 1 launch and you have 0. Nothing was spent.

**How to fix.** Buy launches in the console, then send the same request again.

## account_suspended

Status: 403

**What happened.** Your account is suspended: it can read but not write.

**How to fix.** Contact support.

## permission_denied

Status: 403

**What happened.** A read-only key tried to write, or to read logins.

**How to fix.** Use a key with full permissions.

## test_mode_only

Status: 403

**What happened.** A live key called a test helper.

**How to fix.** Call test helpers with a `sbm_test_` key.

## not_found

Status: 404

**What happened.** Nothing with this id in the key's mode.

**How to fix.** Check the id, and that the key's mode matches the object's.

## route_not_found

Status: 404

**What happened.** No operation at this path.

**How to fix.** Check the path against the reference.

## method_not_allowed

Status: 405

**What happened.** The path exists, but not with this HTTP method.

**How to fix.** Use a method the reference lists for the path.

## already_launched

Status: 409

**What happened.** The project has launched, so it cannot launch again or be deleted; `existing` holds it.

**How to fix.** Add directories with `POST /projects/{project_id}/listings` instead.

## project_exists

Status: 409

**What happened.** Another project has the same `url`, `contact_email` or `external_id`; `param` names the field and `existing` holds that project.

**How to fix.** Use `existing`, or change the field.

## idempotency_key_in_use

Status: 409

**What happened.** A request with this `Idempotency-Key` is still running.

**How to fix.** Retry in 1 second with the same key.

## gone

Status: 410

**What happened.** The report file expired after 7 days, or the path belongs to a retired API.

**How to fix.** Build a new report, or follow `doc_url` to the path that replaced it.

## cursor_expired

Status: 410

**What happened.** The cursor points to events older than 90 days.

**How to fix.** Read the objects you track again, then read the feed without a cursor.

## unsupported_media_type

Status: 415

**What happened.** The body is not `application/json`, or for images not `multipart/form-data`.

**How to fix.** Set `Content-Type` to match the body.

## validation_failed

Status: 422

**What happened.** Fields are invalid; `errors` lists each one with its `param` and `code`.

**How to fix.** Fix each field in `errors` and send the request again.

## not_ready

Status: 422

**What happened.** The project misses something a launch needs; `errors` lists it. Nothing was spent.

**How to fix.** Add what is missing. `readiness.missing` shows the same list.

## nothing_to_submit

Status: 422

**What happened.** No directory in the catalog fits the project now. Nothing was spent.

**How to fix.** Check `unlocks` and `not_matching` in the readiness preview, change the project, and try again.

## invalid_directories

Status: 422

**What happened.** Some directory ids are unknown, outside the catalog, not open to the project or already used; `errors` lists them. Nothing was spent.

**How to fix.** Remove them and send the request again.

## allowance_exhausted

Status: 422

**What happened.** The project has no free allowance: listings use or reserve all of it, or it has not launched.

**How to fix.** Wait for listings to end; `not_accepted` and `cancelled` listings give theirs back.

## badge_not_found

Status: 422

**What happened.** We read the site and did not find the badge.

**How to fix.** Run `check_command`, fix the install, and verify again.

## image_unreachable

Status: 422

**What happened.** We could not download an image from the URL.

**How to fix.** Check that the URL is public and returns an image, or upload the file instead.

## endpoint_url_invalid

Status: 422

**What happened.** The webhook URL is not a public `https` URL.

**How to fix.** Use `https`, a public host, and no user name or password in the URL.

## idempotency_key_reused

Status: 422

**What happened.** This `Idempotency-Key` came with a different request before.

**How to fix.** Use a new key for each new request.

## quota_exceeded

Status: 422

**What happened.** Before your first purchase, test mode allows 25 projects, 100 new projects a day and 3 webhook endpoints.

**How to fix.** Delete test data in the console, wait for the next day, or buy launches.

## rate_limited

Status: 429

**What happened.** Too many requests this hour, or too many calls to an operation with its own limit.

**How to fix.** Wait the seconds in `Retry-After`.

## internal_error

Status: 500

**What happened.** Something failed on our side.

**How to fix.** Retry with backoff; quote `request_id` if it repeats.

## unavailable

Status: 503

**What happened.** The API is down for a short time.

**How to fix.** Retry after the seconds in `Retry-After`.
