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

# Responses & Errors

Every Experro API call returns JSON. This page covers the response shapes you can expect, the error format, and how to report a failing call.

## Responses

Most endpoints wrap their result in a consistent envelope:

```json theme={null}
{
  "Status": "success",
  "Data": { }
}
```

The Discovery APIs are the exception — they return their payload at the top level, with no envelope:

```json theme={null}
{
  "records": [],
  "facets": [],
  "banners": null,
  "meta": {
    "total_count": 206
  }
}
```

## Errors

Failures use a single error shape:

```json theme={null}
{
  "Status": "failure",
  "Error": {
    "code": 400,
    "message": "Invalid Input",
    "name": "ValidationError"
  }
}
```

Validation failures may include an additional `Details` field alongside `Error`, describing which field failed and why.

| Status | `name`                | When it happens                                                                                               |
| ------ | --------------------- | ------------------------------------------------------------------------------------------------------------- |
| 400    | `ValidationError`     | The request body is missing, is not valid JSON, or a field has the wrong type or a blank value.               |
| 400    | `QueryParseError`     | A query parameter is missing or malformed — for example a `catalog_id` that is not a valid UUID.              |
| 401    | `Unauthorized`        | Your access token is missing, invalid, or expired.                                                            |
| 403    | `Forbidden`           | The request is not permitted for the given scope.                                                             |
| 404    | `NotFound`            | The resource does not exist in your tenant, workspace, and environment.                                       |
| 409    | `Conflict`            | The request conflicts with existing state — for example a duplicate identifier or an already-active resource. |
| 500    | `InternalServerError` | An unexpected error occurred.                                                                                 |

<Tip>The two `400` variants are worth telling apart: `ValidationError` points at the request body, `QueryParseError` at the query string.</Tip>

### Common Causes of `ValidationError`

A `400 Invalid Input` almost always means the request body could not be read, rather than a bad field value. Check for:

* A missing `Content-Type` header, or one that is not `application/json`.
* A body sent as form data instead of raw JSON.
* An empty body. Endpoints that take a body require one — send `{}` if you have no fields to set.
* An optional field sent **blank rather than omitted**, such as `"sort_order": ""` or `"filters": [{}]`. Omit the field, or send `null` or `[]`.
* A numeric field sent as a string, such as `"limit": "24"` instead of `"limit": 24`.
