Read a site's feedback from your own code: build a custom ingestion pipeline, sync it into another tool, or hand the endpoint to an agent to poll. It's a single read-only REST endpoint with cursor pagination, so polling never misses or double-counts a row.
Generate a secret token in your site's Setup → Data API section. It looks like sk_… and is shown only once. Send it as a bearer token:
Authorization: Bearer sk_your_secret_tokenUnlike the publishable widget key, this token is a secret — keep it server-side, never in client JS. If it leaks, rotate it from the dashboard; the old token stops working immediately.
GET https://feedback.latentedge.io/api/v1/export/feedbacksince | Cursor from a previous response's nextCursor. Returns only rows after it. Omit on the first call. |
limit | Page size. Default 50, max 200. |
type | Filter by feedback, feature_request, or bug. |
status | Filter by new, triaged, or resolved. |
curl -s "https://feedback.latentedge.io/api/v1/export/feedback?limit=50" \
-H "Authorization: Bearer sk_your_secret_token"Every response is wrapped in { success, data }. For this endpoint data holds the page:
{
"success": true,
"data": {
"feedback": [
{
"id": "0f2c…",
"siteId": "c7b3…",
"type": "bug",
"message": "The export button 404s",
"rating": null,
"pageUrl": "https://yoursite.com/reports",
"status": "new",
"createdAt": "2026-06-27 19:04:11"
}
],
"nextCursor": "MjAyNi0wNi0yNyAxOTowNDoxMXww0f2c",
"hasMore": false
}
}nextCursor — pass it back as ?since= on your next call. It is always returned so you can keep polling for rows created after the latest one.hasMore — true when more rows are immediately available (keep paging right away); false when you've caught up.Store nextCursor between runs and pass it as since. You'll only ever receive rows you haven't seen, in stable order. Poll at whatever interval suits you — empty polls are cheap, so there's no need to hammer it. A minute is plenty for most workflows; if you need lower latency, ask us about webhooks.
// Poll for new feedback on an interval and persist the cursor to resume later.
const ENDPOINT = 'https://feedback.latentedge.io/api/v1/export/feedback';
const TOKEN = process.env.FEEDBACK_READ_TOKEN; // sk_...
let cursor = loadCursor(); // your own storage; null on first run
async function poll() {
const url = new URL(ENDPOINT);
if (cursor) url.searchParams.set('since', cursor);
url.searchParams.set('limit', '100');
const res = await fetch(url, { headers: { Authorization: 'Bearer ' + TOKEN } });
if (!res.ok) throw new Error('export failed: ' + res.status);
const { data } = await res.json();
for (const item of data.feedback) {
handleFeedback(item); // do your thing
}
if (data.nextCursor) {
cursor = data.nextCursor;
saveCursor(cursor); // resume from here next run
}
}
setInterval(poll, 60_000); // once a minute is plentyEach site's token is limited to 60 requests per minute. Over that you get a 429 response — back off and retry on your next interval. Polling once a minute uses one request, so you have plenty of headroom.
Prefer to let an AI agent work with your feedback directly? Connect our Model Context Protocol server. The REST endpoint above is perfect for pipelines and polling; MCP is the way to hand Claude (or any MCP client) live, tool-based access so it can list, search, and summarize feedback on demand.
It authenticates with the same sk_… read token and connects over the Streamable HTTP transport:
https://feedback.latentedge.io/api/v1/mcplist_feedback | List submissions newest-first, filterable by type/status, with cursor pagination. |
search_feedback | Full-text substring search over messages — "what are people saying about X". |
get_feedback_stats | Totals, last-7-days count, breakdowns by type and status, and average rating. |
claude mcp add --transport http feedback \
https://feedback.latentedge.io/api/v1/mcp \
--header "Authorization: Bearer sk_your_secret_token"Any MCP client that supports remote HTTP servers with a bearer header works. Drop this into your client's server config:
{
"mcpServers": {
"feedback": {
"type": "http",
"url": "https://feedback.latentedge.io/api/v1/mcp",
"headers": { "Authorization": "Bearer sk_your_secret_token" }
}
}
}The tools are read-only and rate-limited per site just like the REST endpoint. Your site's Setup tab has a one-click copy of this config with your token filled in.
Embedding the widget instead? See the install guide. Questions? Get in touch.