---
title: "Submit durable feedback for an app"
method: POST
path: "/app/{id}/feedback"
---

# Submit durable feedback for an app

`POST /app/{id}/feedback`

## Request

- Base URL: `https://charm.ing`
- URL: `https://charm.ing/app/{id}/feedback`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer
  - HTTP bearer

Owner-only durable feedback ingest. Auth posture matches `GET /app/{id}/diag` (`requireAppAccess`): app token, user token, render token, or claim cookie. Body is capped at 96 KiB wire / 16 KiB text / 64 KiB serialized `structuredData`. The MCP `submit_feedback` tool forces `source="agent"` server-side; direct REST callers may set `source` to `user` or `auto-crash`.

## Request body

- FeedbackSubmitBody
  - `category` 'bug' | 'crash' | 'enhancement' | 'praise' | 'other', required: Feedback category. `crash` requires `crashData` (or its snake_case alias) carrying at least `message`.
  - `source` 'user' | 'agent' | 'auto-crash': Optional origin tag. Defaults to `user`. The MCP `submit_feedback` tool forces `agent` server-side; direct REST callers may pass `user` / `auto-crash` explicitly.
  - `text` string: Free-form feedback body. 16384-character cap; oversize bodies return `text_too_large` (413).
  - `structuredData` object: Caller-supplied JSON payload (e.g. route, repro inputs). Serialized payload is capped at 65536 bytes; oversize payloads return `structured_data_too_large` (413). Snake_case alias `structured_data` is also accepted.
  - `crashData` object: Crash details. Required when `category=crash`; optional otherwise. Snake_case alias `crash_data` is also accepted.
    - `message` string, required
    - `stack` string
    - `url` string
    - `userAgent` string
    - `traceId` string

## Response `201`

Feedback recorded.

- FeedbackSubmitResponse
  - `ok` true, required
  - `value` object, required
    - `id` string, uuid, required
    - `createdAt` string, date-time, required

## Other responses

- `400`: Invalid app id, malformed body, or category=crash without crashData.
- `401`: Authentication required.
- `403`: Token does not authorize this app.
- `404`: App not found.
- `413`: Body exceeds the 96 KiB wire cap, `text` exceeds 16 KiB, or `structuredData` exceeds 64 KiB serialized. Error kinds: `payload_too_large`, `text_too_large`, `structured_data_too_large`.
- `429`: Rate limit exceeded (30/min/app/ip, 200/min/app).

---

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