Ingest HTTP API
webflutter
The endpoint the SDK talks to. Use it directly to pipe feedback from a CLI, a game engine, or anything that isn't a browser.
POST /v1/ingest/feedback
Authenticated by project key + origin: the projectKey in the body must exist, and the request's Origin header must match the project's allowlist. Both failures return the same 403 — the endpoint cannot be used to enumerate keys.
request
curl -X POST https://api.tracebird.dev/v1/ingest/feedback \
-H "Content-Type: application/json" \
-H "Origin: https://app.acme.dev" \
-d '{
"projectKey": "pk_live_a1b2c3",
"type": "bug",
"comment": "checkout total shows NaN",
"tester": "karim@acme.dev",
"release": "1.4.2",
"environment": "staging",
"route": "/checkout",
"context": {
"viewport": "1440 × 900",
"browser": "Chrome",
"logs": [{ "level": "error", "text": "TypeError: …" }],
"network": [{ "method": "POST", "url": "/api/pay", "status": 500, "ms": 612 }]
}
}'202 Accepted
{ "id": "7cdcf106-eb36-453b-8065-c2c4b002c13b" }Body fields
| option | type | default | description |
|---|---|---|---|
| projectKey | string | — | Required. 8–64 chars. |
| type | enum | bug | bug · idea · question |
| comment | string | — | Required. 1–4000 chars. |
| tester | string | anonymous | ≤ 120 chars. |
| release / environment | string | — | ≤ 50 chars each. |
| route | string | — | ≤ 500 chars. |
| context | object | — | Validated field by field — see Captured context for every key and cap. Unknown keys are stripped. |
Responses
202— accepted; returns the feedback id.400— validation failed; the first offending field is named in the message.403— unknown key or origin not allowlisted (intentionally indistinguishable).413— body over 8 MB.429— rate limited (per-IP backstop).
⚠ heads upServer-to-server callers must still send an
Origin header matching the allowlist — add a dedicated origin like ci.acme.dev to the project for automated reporters.