# Send feedback

Use this page to report a bug, a missing feature or confusing docs to the
Impello team, from your agent, the moment you hit it. You need no account and
no API key.

```bash
curl -X POST https://www.impello.ai/api/feedback \
  -H 'Content-Type: application/json' \
  -d '{"kind":"bug","message":"sandbox.kill() returns 500 on a paused sandbox","endpoint":"DELETE /sandboxes/{id}","sdk_version":"python 1.2.0","agent":"claude-code"}'
```

```json
{ "id": "3f1c2a9e-8b4d-4e2f-9a61-0c7d5e8b1f24", "status": "received" }
```

## The body

Send one JSON object with `Content-Type: application/json`.

<div className="docs-table-wrap">
<table>
  <thead>
    <tr><th>Field</th><th>Type</th><th>Notes</th></tr>
  </thead>
  <tbody>
    <tr><td>`kind`</td><td>string, required</td><td>One of `bug`, `missing_feature`, `docs`, `other`.</td></tr>
    <tr><td>`message`</td><td>string, required</td><td>What happened, or what you needed. 10 to 4000 characters.</td></tr>
    <tr><td>`endpoint`</td><td>string</td><td>The API path or SDK method involved, such as `POST /sandboxes` or `sandbox.files.write`.</td></tr>
    <tr><td>`sdk_version`</td><td>string</td><td>The SDK and its version, such as `python 1.2.0`.</td></tr>
    <tr><td>`sandbox_id`</td><td>string</td><td>The sandbox involved, so we can find its logs.</td></tr>
    <tr><td>`request_id`</td><td>string</td><td>The request involved, so we can find its logs.</td></tr>
    <tr><td>`agent`</td><td>string</td><td>Your agent's name, such as `claude-code`.</td></tr>
  </tbody>
</table>
</div>

The optional strings are at most 200 characters each. Any other top-level
field is kept as you sent it, so add whatever helps: a stack trace, the steps
to reproduce, the call you expected to exist.

To tag the report with your team, send your key as `X-API-Key`. The key is
optional and only adds the tag: a missing, wrong or expired key never refuses
the report.

## Responses

Every error has the same body, `{"error": "<field>: <reason>"}`, so you can
show the reason or fix the field and send again. An error that is not about a
field starts with `content-type`, `body`, `rate limit` or `server` instead.

<div className="docs-table-wrap">
<table>
  <thead>
    <tr><th>Status</th><th>When</th></tr>
  </thead>
  <tbody>
    <tr><td>`202`</td><td>Received. The body is `{"id": "<uuid>", "status": "received"}`.</td></tr>
    <tr><td>`400`</td><td>The body is not valid JSON, or a field is missing or wrong. The error names the field, for example `kind: must be one of bug, missing_feature, docs, other`. A string or key that holds a NUL character (`\u0000`) or half of a UTF-16 surrogate pair is refused too, because it cannot be stored.</td></tr>
    <tr><td>`413`</td><td>The body is over 8 KB.</td></tr>
    <tr><td>`415`</td><td>The `Content-Type` is not `application/json`.</td></tr>
    <tr><td>`429`</td><td>Over the limit, or too many reports in flight at once from your address. `Retry-After` gives the seconds until you can send again.</td></tr>
    <tr><td>`500`</td><td>We could not store the report. Send it again later; it did not count against your limit.</td></tr>
  </tbody>
</table>
</div>

There is no way to read a report back, and the `id` is for your own records.

## Limits

- 5 reports per hour from one IP address. A refused request does not count.
- 8 KB per body, including any extra fields.

## What happens to a report

We store the report and post it to the Impello team's channel, where a person
reads it. We store a hash of your IP, never the IP.

Next: [Errors](/docs/errors).
