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

Base URL
https://api.roastnest.com/api/public

All 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.

PropTypeDescription
slugrequiredstringYour organization's slug, as it appears in dashboard URLs.
idfrequiredstringThe project identifier within that organization.
idxrequiredstringA feedback item's per-project index — the feedback_index field, not the feedback_id.

Health

Request
GET /api/public/v1/health

Returns 200 while the API is serving. Useful as an uptime probe; it touches no project data.

200 Response
{
  "status": "healthy",
  "timestamp": "2026-01-14T09:22:31.004Z"
}

Project details

Request
GET /api/public/v1/org/:slug/project/:idf

Returns the public metadata for one project.

200 Response
{
  "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

Request
GET /api/public/v1/org/:slug/project/:idf/feedbacks?page=0&sort_order=new

Returns 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

PropTypeDefaultDescription
pagenumber0Zero-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.
200 Response
{
  "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

PropTypeDescription
feedback_idstringGlobally unique identifier for the report.
feedback_indexnumberSequential number within the project — this is the value the single-feedback endpoint takes.
messagestringWhat the reporter wrote.
categorystringClassification assigned during triage.
statusstringWhere the report sits in your workflow.
prioritystringPriority assigned during triage.
is_publicbooleanWhether the report is visible outside the dashboard.
created_atstringISO 8601 timestamp of submission.
updated_atstringISO 8601 timestamp of the last change.

Single feedback

Request
GET /api/public/v1/org/:slug/project/:idf/feedback/:idx

Returns 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.

404 Response
{
  "type": "CONTENT_NOT_FOUND",
  "message": "Project is not found"
}
PropTypeDescription
400CONTENT_NOT_FOUNDA required path parameter was missing or malformed.
404CONTENT_NOT_FOUNDNo project or feedback matched the identifiers given.
429Rate limit exceeded. Back off until the RateLimit-Reset window passes.
500INTERNAL_ERRORSomething failed server-side. Safe to retry.

Example

Fetching a feedback page
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.