> ## Documentation Index
> Fetch the complete documentation index at: https://geoptie.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Errors

> The error format, every code the API returns, and when to retry.

The API uses standard HTTP status codes, and every error returns the same JSON shape:

```json theme={null}
{
  "error": {
    "code": "not_found",
    "message": "No such brand in this workspace."
  }
}
```

Check `error.code` in your integration. The `message` is written for people reading logs and
may be reworded.

## Error codes

| Status | Code                    | Meaning                                                           |
| ------ | ----------------------- | ----------------------------------------------------------------- |
| 400    | `invalid_request`       | The request body or a parameter is malformed                      |
| 400    | `missing_parameter`     | A required parameter is missing                                   |
| 400    | `invalid_date`          | A date is not valid ISO 8601                                      |
| 400    | `invalid_engine`        | Unknown engine identifier                                         |
| 401    | `missing_api_key`       | No `Authorization` header                                         |
| 401    | `invalid_api_key`       | The key is unknown or has been revoked                            |
| 402    | `subscription_required` | Your subscription is inactive or past due                         |
| 403    | `plan_not_eligible`     | Your plan does not include API access                             |
| 403    | `brand_scope_forbidden` | This key is limited to specific brands and cannot create new ones |
| 404    | `not_found`             | The record does not exist, or is not accessible with this key     |
| 405    | `method_not_allowed`    | That method is not supported on this endpoint                     |
| 409    | `plan_limit_reached`    | Your plan's prompt allowance is full                              |
| 429    | `rate_limited`          | Too many requests for this key                                    |
| 429    | `endpoint_rate_limited` | Too many requests to this endpoint                                |
| 429    | `concurrency_limited`   | Too many generation requests running at once                      |
| 500    | `internal_error`        | Something went wrong on our side                                  |

## When to retry

| Situation       | Retry                                                                                 |
| --------------- | ------------------------------------------------------------------------------------- |
| `429`           | Yes, after the time in the matching `*-Reset` header. See [Rate limits](/docs/rate-limits) |
| `500`           | Yes, once or twice with an increasing delay                                           |
| Any other `4xx` | No. The request needs to change first                                                 |

Re-sending the same prompts to `POST /v1/brands/{id}/prompts` is safe. Prompts you already
track come back as `already_tracked` rather than being duplicated, so you do not need an
idempotency key.

## Reporting a problem

Email [support@geoptie.com](mailto:support@geoptie.com) with:

* The `X-Request-Id` from the failing response
* The endpoint you called
* Roughly when it happened
