API reference
Read-only REST endpoints for pulling a project's public feedback into your own changelog, status page or roadmap. No authentication required.
Base URL
https://api.roastnest.com/api/publicAll responses are JSON. These endpoints are unauthenticated and return only data a project has chosen to make public — for anything private, use the dashboard.
Rate limits
The project endpoints allow 100 requests per 15 minutes per client, reported through standard RateLimit-* headers. The health endpoint is not rate limited. Cache responses if you are rendering them on a high-traffic page.
Path parameters
Three parameters recur across the endpoints below.
| Prop | Type | Description |
|---|---|---|
slugrequired | string | Your organization's slug, as it appears in dashboard URLs. |
idfrequired | string | The project identifier within that organization. |
idxrequired | string | A feedback item's per-project index — the feedback_index field, not the feedback_id. |
Health
GET /api/public/v1/healthReturns 200 while the API is serving. Useful as an uptime probe; it touches no project data.
{
"status": "healthy",
"timestamp": "2026-01-14T09:22:31.004Z"
}Project details
GET /api/public/v1/org/:slug/project/:idfReturns the public metadata for one project.
{
"name": "Acme Web App",
"project_id": "prj_8f21c4",
"project_url": "https://acme.example.com",
"description": "Customer-facing dashboard",
"created_at": "2025-11-02T11:40:18.221Z"
}List feedback
GET /api/public/v1/org/:slug/project/:idf/feedbacks?page=0&sort_order=newReturns the project alongside a page of its feedback, 50 items per page. Pages are zero-indexed, so page=1 is the second page.
Query parameters
| Prop | Type | Default | Description |
|---|---|---|---|
page | number | 0 | Zero-indexed page number. Negative values clamp to 0. |
sort_order | "new" | "old" | "new" | Newest or oldest first, by creation time. Any other value is rejected. |
{
"project": {
"name": "Acme Web App",
"project_id": "prj_8f21c4",
"project_url": "https://acme.example.com",
"description": "Customer-facing dashboard",
"created_at": "2025-11-02T11:40:18.221Z"
},
"feedbacks": [
{
"project_id": "prj_8f21c4",
"feedback_id": "fb_5a19d0",
"feedback_index": 42,
"category": "bug",
"status": "open",
"priority": "high",
"is_public": true,
"message": "The export button does nothing on Safari.",
"created_at": "2026-01-12T14:05:02.881Z",
"updated_at": "2026-01-12T16:31:44.107Z"
}
]
}Feedback fields
| Prop | Type | Description |
|---|---|---|
feedback_id | string | Globally unique identifier for the report. |
feedback_index | number | Sequential number within the project — this is the value the single-feedback endpoint takes. |
message | string | What the reporter wrote. |
category | string | Classification assigned during triage. |
status | string | Where the report sits in your workflow. |
priority | string | Priority assigned during triage. |
is_public | boolean | Whether the report is visible outside the dashboard. |
created_at | string | ISO 8601 timestamp of submission. |
updated_at | string | ISO 8601 timestamp of the last change. |
Single feedback
GET /api/public/v1/org/:slug/project/:idf/feedback/:idxReturns one report by its feedback_index, including the detail fields omitted from the list response. Responds 404 if either the project or the index does not resolve.
Errors
Errors carry the HTTP status plus a machine-readable type and a human-readable message. Branch on type — the message text is not a stable contract.
{
"type": "CONTENT_NOT_FOUND",
"message": "Project is not found"
}| Prop | Type | Description |
|---|---|---|
400 | CONTENT_NOT_FOUND | A required path parameter was missing or malformed. |
404 | CONTENT_NOT_FOUND | No project or feedback matched the identifiers given. |
429 | — | Rate limit exceeded. Back off until the RateLimit-Reset window passes. |
500 | INTERNAL_ERROR | Something failed server-side. Safe to retry. |
Example
const res = await fetch(
"https://api.roastnest.com/api/public/v1/org/acme/project/web/feedbacks?sort_order=new"
);
if (!res.ok) {
const { type, message } = await res.json();
throw new Error(`${type}: ${message}`);
}
const { project, feedbacks } = await res.json();Building a public roadmap?
Combine the list endpoint with is_public and status to render a live changelog straight from your triage queue — no separate content pipeline to keep in sync. Collect the reports with the feedback widget and publish them from the same data.