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

# Submit Feedback

`POST /feedback`

## Request

- Base URL: `https://api.moda.app/v1`
- URL: `https://api.moda.app/v1/feedback`
- Auth: HTTP bearer

Submit feedback from Voyager. Accepted with a reference id; nothing is returned later.

## Headers

- `Idempotency-Key` string, nullable: Optional client-minted key, at most 128 printable ASCII characters (a UUID is ideal). Resending a submission with the same key from the same API key within 24 hours returns the original id without delivering the feedback again, whatever the body.
- `Moda-Version` '2026-04-12' | '2026-05-01'

## Request body

- FeedbackRequest
  - `source` 'voyager', required: Submitting application.
  - `kind` 'user' | 'agent', required: Who wrote the message: the person, or the agent reporting friction.
  - `category` string: Friction category: missing_tool, unclear_schema, confusing_docs, broken_behavior, repeated_failure, help or other. Anything else is recorded as other.
  - `message` string, required: The feedback, free text or markdown.
  - `user_quote` string, nullable: Optional short quote of what the user asked for, when the agent is reporting.
  - `context` FeedbackContext: Build and session details Voyager attaches; every field optional and bounded. Unknown fields are ignored (not forbidden) so a newer Voyager can attach a field this Studio does not know yet without the whole submission failing. The thread id is deliberately ``voyager_thread_id``: the fan-out resolves a ``thread_id`` key against LangSmith, and a Voyager thread is not a LangSmith trace.
    - `app_version` string, nullable: Voyager version, e.g. 1.4.2.
    - `build` 'production' | 'development', nullable: Build channel. Only production builds reach Slack.
    - `platform` string, nullable: Operating system, e.g. darwin.
    - `arch` string, nullable: CPU architecture, e.g. arm64.
    - `provider` string, nullable: Agent provider in the thread.
    - `model` string, nullable: Model in the thread.
    - `voyager_thread_id` string, nullable: Voyager's thread id.
    - `recent_errors` string[]: Redacted recent error messages from the thread, newest last.
    - `recent_error_details` RecentErrorDetail[]: The recent errors with their times, newest last; shown in Slack in place of recent_errors.
      - `occurred_at` string, required: When the error happened, ISO 8601 in UTC.
      - `turn` integer, nullable: The support bundle transcript's turn number.
      - `message` string, required: Redacted error message.
    - `older_error_count` integer, nullable: Errors in the thread that are not listed, mostly older than two hours.
    - `last_error_at` string, nullable: When the thread's last error happened, sent when none is recent.

## Response `202`

Successful Response

- FeedbackResponse
  - `id` string, uuid, required: Reference id for this submission; also stamped on the internal record.
  - `status` 'accepted', required

## Other responses

- `401`: Authentication required.
- `402`: Insufficient credits for a metered operation.
- `403`: Permission denied for this scope.
- `404`: Resource not found.
- `409`: Conflict (idempotency / resource state).
- `422`: Request validation failed.
- `429`: Rate limit exceeded.
- `500`: Internal error.

## Changes

- **2026-11-03** `9ac6a3abc0f8`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/moda/apis/moda-public-api/changes/feedback/post.md)

---

[API](https://skmtc.dev/moda/apis/moda-public-api.md) - [All operations](https://skmtc.dev/moda/apis/moda-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/moda/apis/moda-public-api/revisions/9ac6a3abc0f8?raw)
