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

# Submit Feedback

`POST /api/v1/feedback`

## Request

- Base URL: `https://statsmapped.com`
- URL: `https://statsmapped.com/api/v1/feedback`
- Auth: none declared

Capture one feedback submission and email a verification link.

Checks, in order: rate limit (429 past threshold, fail-open on limiter errors --
see databeat/rate_limit.py), comment length bounds (400 outside [10, 2000]
characters), basic email shape (400 if it doesn't look like an email at all).

A failed verification-email SEND (e.g. RESEND_API_KEY unset, or Resend itself
rejecting the request) does not fail the submission — the row is already
durably stored, which is the useful part (spec section 4: unverified
submissions are kept, not discarded). The failure is logged to stderr so it is
visible in server logs, and surfaced back to the caller via `email_sent: false`
rather than hidden, but the HTTP status stays 200: the reader's feedback was
captured either way.

## Request body

- FeedbackSubmission
  - `email` string, required
  - `comment` string, required
  - `page_hash` string, nullable

## Response `200`

Successful Response

- FeedbackResult
  - `country` string
  - `status` string, required
  - `email_sent` boolean, nullable

## Other responses

- `400`: Bad request
- `401`: Missing or invalid credentials
- `403`: Not authorized for this request
- `404`: Not found
- `422`: Validation error
- `429`: Rate limited

---

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