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:
# 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(newdefault, orarchived),app,project,tag,limit(1–100, default 25), andcursor.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 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:
{
"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:
{
"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, elsenull.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 itsstatusand anexternal_urlwhen 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.