Skip to content
Feedi

Docs

Feedi docs

Install the headless SDK, submit feedback, and wire signed webhook automation without extra platform surface.

Read your feedback

REST API

Read your feedback back out over a small, read-only REST API — from scripts, dashboards, or agentic coding tools like Claude Code and Codex. It's available on the Indie plan and authenticated with an account-wide secret key. Everything here is also described by an OpenAPI 3.1 spec your tools can read directly.

Base URL & authentication

The API is served at https://api.feedi.dev and is read-only. Authenticate every request with an account-wide secret key in the Authorization header:

List recent feedback · curl
# Create a key at /account/api-keys, then:
export FEEDI_API_KEY="feedi_eu_sk_…"

curl -H "Authorization: Bearer $FEEDI_API_KEY" \
  "https://api.feedi.dev/v1/feedback?status=new&limit=25"

Create and revoke keys under Account → API keys (Indie plan). A key looks like feedi_eu_sk_… (or feedi_us_sk_… for US accounts) and reads across all of your projects and apps. Treat it like a password: it’s a server-side credential, so keep it out of browsers, mobile apps, and public repos. A missing or invalid key returns 401; a key on a plan without API access returns 403.

Endpoints

  • GET /v1/feedback — list feedback, newest first. Query params: status (new default, or archived), app, project, tag, limit (1–100, default 25), and cursor.
  • GET /v1/feedback/{id} — one item by its short id, including built-in and custom metadata and per-channel delivery status.
  • GET /v1/projects — your projects.
  • GET /v1/apps — your apps, optionally scoped with ?project=.
  • GET /v1/tags — distinct tags with feedback counts, optionally scoped with ?app= or ?project=.

Pagination

Lists are keyset-paginated. Each response carries a next_cursor; pass it back as the cursor query param to fetch the next page, and stop when next_cursor is null. limit caps at 100.

Filter and paginate · curl
# Filter by app, then walk pages with the cursor from the previous response.
curl -H "Authorization: Bearer $FEEDI_API_KEY" \
  "https://api.feedi.dev/v1/feedback?app=APP_ID&cursor=NEXT_CURSOR"

# Discover the app, project, and tag ids you can filter by.
curl -H "Authorization: Bearer $FEEDI_API_KEY" "https://api.feedi.dev/v1/apps"

Response shape

List endpoints return { "data": [...], "next_cursor": … }; single items and discovery endpoints return { "data": … }. Field names are snake_case. A feedback item:

GET /v1/feedback · response
{
  "data": [
    {
      "id": "fbk_a1b2c3",
      "message": "I couldn't finish onboarding.",
      "reporter_email": "user@example.com",
      "status": "new",
      "received_at": "2026-06-19T21:58:30.000Z",
      "tags": ["onboarding", "bug"],
      "app": { "id": "8f3a…", "name": "Dogfood App", "platform": "ios" },
      "project": { "id": "2a17…", "name": "Dogfood" }
    }
  ],
  "next_cursor": "eyJyIjoxNz…"
}

The detail endpoint adds a feedback item’s metadata and delivery status:

GET /v1/feedback/{id} · response
{
  "data": {
    "id": "fbk_a1b2c3",
    "message": "I couldn't finish onboarding.",
    "reporter_email": "user@example.com",
    "status": "new",
    "received_at": "2026-06-19T21:58:30.000Z",
    "tags": ["onboarding", "bug"],
    "app": { "id": "8f3a…", "name": "Dogfood App", "platform": "ios" },
    "project": { "id": "2a17…", "name": "Dogfood" },
    "metadata": {
      "built_in": { "appVersion": "2.4.0", "buildNumber": "1180", "iOSVersion": "18.5", "locale": "en-US" },
      "custom": { "screen": "onboarding" }
    },
    "delivery": [
      { "channel": "email",  "status": "sent", "external_url": null },
      { "channel": "github", "status": "sent", "external_url": "https://github.com/acme/app/issues/42" }
    ]
  }
}
  • id — the submission’s short id, the same one shown in your inbox.
  • reporter_email — the reporter’s email if your app collected one, else null.
  • received_at — ISO-8601 timestamp of when Feedi accepted the submission.
  • metadata.built_in / metadata.custom — the SDK-provided and custom fields attached at submit time (detail only).
  • delivery — one entry per channel (email, webhook, github) with its status and an external_url when there is one, such as a created GitHub issue (detail only).

Rate limits

Each key is limited per minute and per day. Every response includes X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset (Unix seconds). When you exceed the limit the API returns 429 with a Retry-After header — wait for the reset and retry.

Errors

Errors are JSON: { "error": "code", "message"?: "…" }. Common codes: 400 invalid_query / invalid_cursor, 401 unauthorized, 403 api_access_requires_indie, 404 not_found, and 429 rate_limited.

Use it from Claude Code, Codex & agents

The API is described by an OpenAPI 3.1 spec at api.feedi.dev/v1/openapi.json, with a short summary at api.feedi.dev/llms.txt. Point any agent, the Claude Agent SDK, or Codex at the spec and it can call the endpoints directly. For Claude Code, install the Feedi plugin with /plugin marketplace add getfeedi/feedi-claude-plugin — it ships a skill and a /feedback command. Export your key as FEEDI_API_KEY first.