Every source — web, mobile, or a backend service — sends the same JSON to one endpoint. Get a project key from your dashboard.
<script
src="https://feedback.sreternals.com/widget.js"
data-project-key="YOUR_PROJECT_KEY"></script>import { FeedbackWidget } from '@feedback-hub/react';
<FeedbackWidget projectKey="YOUR_PROJECT_KEY" user={{ id: 'u_123', plan: 'pro' }} />import { FeedbackModal, submitFeedback, isShake } from '@feedback-hub/react-native';
// drop-in sheet
<FeedbackModal visible={open} onClose={() => setOpen(false)} projectKey="YOUR_PROJECT_KEY" />
// or submit directly
await submitFeedback({ projectKey: 'YOUR_PROJECT_KEY', message: 'Great app!', rating: 5 });POST /api/ingest
{
"projectKey": "YOUR_PROJECT_KEY",
"type": "bug | idea | praise", // optional, default idea
"message": "required, <= 5000 chars",
"email": "optional",
"rating": 1-5, // optional
"source": "web | android | macos | service | ...",
"url": "optional",
"appVersion": "optional",
"screenshotUrl": "optional (R2 URL)",
"metadata": { "any": "json" }
}
=> 201 { "id": 123, "replyToken": "…" }GET /api/widget-config?key= — public widget appearance/behaviourPOST /api/upload-url — presigned R2 URL for a screenshotGET /api/thread?feedbackId=&token= — public reply thread (two-way inbox)Admin endpoints (feedback, stats, analytics, export, notes, notifications) require a signed-in session and are scoped to your organization.