---
title: "Report something ImageStep could not do"
method: POST
path: "/api/v1/feedback"
tags: ["Agent"]
---

# Report something ImageStep could not do

`POST /api/v1/feedback`

## Request

- Base URL: `https://api.imagestep.dev`
- URL: `https://api.imagestep.dev/api/v1/feedback`
- Auth: API key in header `Authorization`

USE THIS WHEN: an op you needed does not exist, a parameter did not behave the
way the contract describes, or you were about to work around ImageStep with
something local. Reporting the gap is the alternative to routing around it.

Free: no credit, no job, no rate-limit budget beyond the shared API one, and at most 200 reports per account per UTC day — past that, `429 rate_limited` until midnight UTC.
`kind` is `capability_gap` (ImageStep cannot do it at all), `bug` (it did not
behave the way the contract says) or `other`; `message` says what you were trying
to do. `op` names the operation when there is one and is **not** checked against
the catalogue — the most useful report is about an op that does not exist yet.
`context` is any JSON object worth keeping.

The report comes back (`201`) with the `apiKeyId` it was filed under, so an account
running one key per agent can tell whose report it is. It is your account's data:
exported with it, and deleted with it or 365 days after it was filed, whichever comes first.

## Headers

- `Idempotency-Key` string

## Request body

- FeedbackRequest: A report from an agent about something ImageStep could not do.
  - `kind` 'capability_gap' | 'bug' | 'other', required: What kind of report it is, matched case-insensitively
  - `op` string: The op this is about, when it is about one — any name up to 64 characters; not checked against the catalogue.
  - `message` string, required: What you were trying to do and what stopped you; at most 4000 characters.
  - `context` object: Anything structured worth keeping — the parameters tried, the client, the model; at most 4000 characters once encoded as JSON.

## Response `201`

Logged

## Other responses

- `400`: Nothing is stored when any of these is refused: - `invalid_param` on `kind` — missing, or not one of the three (matched case-insensitively) - `invalid_param` on `message` — missing, blank, or over 4000 characters once trimmed - `invalid_param` on `op` — over 64 characters - `invalid_param` on `context` — over 4000 characters once encoded as JSON
- `409`: Conflict — `error.code` is `idempotency_key_reuse` (the key already means a different request) or `request_in_progress` (the first request under this key has not settled yet; retryable).
- `429`: Rate limited — `error.code` is `rate_limited` and `retryable` is true. `Retry-After` says how many seconds to wait. Here also: `rate_limited` — this account filed 200 reports today (UTC). Retryable: `details.resetAt` is the next midnight UTC, `Retry-After` the seconds until it; nothing is stored

---

[API](https://skmtc.dev/imagestep/apis/imagestep-api.md) · [All operations](https://skmtc.dev/imagestep/apis/imagestep-api/llms.txt) · [OpenAPI document](https://skmtc.dev/imagestep/apis/imagestep-api/revisions/5e8e922a3085?raw)
