---
title: "Send product feedback to the Shardflux team"
method: POST
path: "/v1/feedback"
tags: ["Feedback"]
---

# Send product feedback to the Shardflux team

`POST /v1/feedback`

## Request

- Base URL: `https://api.shardflux.dev`
- URL: `https://api.shardflux.dev/v1/feedback`
- Auth: HTTP bearer

Delivered by email to the Shardflux team. Any valid project API key may send (no tool permission needed); the key's organization and project are recorded, so `organization_id` is rejected (422). A CLI session (`sfu_`) may send too, with an optional `organization_id` of the user's. Coding agents: send only when the user asks to report feedback, show the exact message and context first, obtain explicit authorization, and include `context` (`agent`, `client`, `workspace`, `request_id` and `error_code` of the error response, `command`). Rate limited per sender (10 per 10 minutes, 50 per day) and per organization (200 per day): 429 `rate_limited` with a `retry-after` header and `details.retry_after_seconds`. The same message from the same sender within 24 hours is a duplicate: 200 with the original `id` and `duplicate: true` (it still counts against the rate limits). The body is limited to 32 KiB (413).

## Request body

- object
  - `message` string, required: The feedback, 1-8000 characters after trimming surrounding whitespace (must contain a non-whitespace character). Control characters other than newline and tab are stripped; API keys, bearer tokens, JWTs, AWS access key ids and private key blocks are redacted before it is stored or emailed.
  - `category` 'bug' | 'confusing' | 'missing' | 'idea' | 'praise' | 'other': Default `other`. `bug`: something failed or behaved wrongly; `confusing`: an error, doc, name or output was unclear or misleading; `missing`: a capability, option or template you needed does not exist; `idea`: a suggestion or improvement; `praise`: something worked well; `other`: anything else.
  - `organization_id` string, uuid: Sessions (browser, or a CLI session on /v1): the organization the user is looking at, one they belong to (404 otherwise). Refused (422) with a project API key, whose organization is used.
  - `context` object: Optional, every field optional. Control characters are stripped and anything shaped like a secret is redacted before storing.
    - `agent` string: Who is reporting, e.g. `claude-code`, `codex`, `cursor`, or a human. At most 100 characters.
    - `client` string: Client and version, e.g. `shard-cli/0.5.0`, `shardflux-sdk-ts/0.9.0`, `shardflux-py/0.5.0`, `shardflux-mcp/0.4.0`, `dashboard`. At most 200 characters.
    - `workspace` string: Workspace id or key the feedback is about. At most 200 characters.
    - `request_id` string: `request_id` of an error response, so the logs can be found. At most 200 characters.
    - `error_code` string: API error code seen, e.g. `capacity_unavailable`. At most 100 characters.
    - `command` string: The command, SDK call or tool call that led to it. At most 2000 characters.
    - `page` string: Dashboard route path (browser). At most 300 characters.

## Response `200`

Default Response

- object
  - `id` string, uuid, required: UUIDv7, lowercase canonical form.
  - `received_at` string, date-time, required: RFC 3339 UTC timestamp with Z.
  - `duplicate` boolean, required: true when the same sender sent the same message within 24 hours: the original feedback is returned and nothing new is stored or emailed.

## Other responses

- `201`: Default Response
- `4XX`: Default Response
- `5XX`: Default Response

---

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