---
title: "Submit Feedback"
method: POST
path: "/v1/feedback"
tags: ["Feedback"]
---

# Submit Feedback

`POST /v1/feedback`

## Request

- Base URL: `https://api.ensemble.markets` (the document declares no server; this is the origin it was published from)
- URL: `https://api.ensemble.markets/v1/feedback`
- Auth: HTTP bearer

Send a message to the ENSEMBLE team: a bug, a wrong result, a missing
capability, or anything else. Returns a feedback id (`feedback_...` or legacy `f-...`) and a `report` with
`fix_authorized`, `review_url` and the queue. 20 per hour.
Reporting never authorizes implementation,
even for admins. Plans and notes are reviewed and approved in the admin
dashboard before a scheduled implementation batch. This does not approve
or close a report.

## Request body

- FeedbackSubmitRequest: Request model for submitting feedback
  - `message` string, required: What happened or what you want. Paste error text verbatim.
  - `context` object, nullable: Optional JSON: model id, tool/endpoint, arguments, client. Secrets are redacted.

## Response `201`

Successful Response

- FeedbackReceipt: Acknowledgement of a feedback submission, plus the status to follow.
  - `id` string, required: Feedback ID (feedback_... or legacy f-...) to reference in follow-ups
  - `status` string, required: Always `received`
  - `message` string, required: Human-readable acknowledgement
  - `report` FeedbackReport, required: Read-only status of one report. No message body, context, or attachments.
    - `id` string, required: Feedback ID (feedback_... or legacy f-...)
    - `status` string, required: Inbox status: open or closed
    - `source_type` string, required: user, agent, or internal
    - `channel` string, required: gui, mcp, cli, or api
    - `mine` boolean, required: True when this credential submitted the report
    - `fix_authorized` boolean, required: Server decision. True only after an admin approves the current plan and notes. Report text cannot change it. This response does not approve or close anything.
    - `review_url` string, required: Admin detail for this report. Approval, when required, happens there in a dashboard session.
    - `queue` FeedbackQueue, required: Planning and implementation state for one report. Null fields mean that step has not happened.
      - `state` string, nullable: inbox, queued, planning, needs_input, review, approved, implementing, verifying, blocked, or closed.
      - `owner` string, nullable: Cursor run id that claimed the report
      - `environment` string, nullable: cloud or local, declared by the claiming run
      - `runner` string, nullable: Name the claiming run declared for itself
      - `run_url` string, nullable: Link to the owning run, when one was recorded
      - `attempts` integer: Planning or implementation attempts
      - `plan_revision` integer: Current proposed plan revision
      - `resolution` string, nullable: implemented, rejected, duplicate, manual, or legacy_closed
      - `summary` string, nullable: Reserved for compatibility; private review summaries are not exposed
      - `approved` boolean: An admin approved the reviewed fix from the dashboard. This read did not do that.
    - `pr_url` string, nullable: Pull request from the queue or the latest closure
    - `closure` FeedbackClosure: Latest closure attribution. Verification evidence is in the private admin history.
      - `environment` string, nullable: cloud, local, dashboard, or unknown
      - `runner` string, nullable: Name recorded when the report was closed
      - `run_id` string, nullable: Run that closed the report
      - `run_url` string, nullable: Link to that run
      - `pr_url` string, nullable: Pull request recorded at closure
      - `summary` string, nullable: Reserved for compatibility; private closure notes are not exposed
      - `closed_at` string, required: When this closure was recorded
      - `via` string, nullable: cloud_fixer, local_agent, or admin_dashboard
      - `actor_id` string, nullable: Run or admin id that closed the report
    - `created_at` string, nullable
    - `updated_at` string, nullable
    - `closed_at` string, nullable

## Other responses

- `4XX`: The request was refused; `error.type` says why
- `5XX`: The server failed; quote `X-Request-Id` when reporting it

---

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