Platform
List roadmap
List public product roadmap items, optionally filtered by status.
GET /tmr/roadmap
Returns the public product roadmap as an array of items, ordered by upvotes (highest first), then by creation date (newest first). The hasUpvoted flag reflects whether the authenticated user has upvoted each item.
Authentication: Bearer token · Permission:
platform:read · Rate limit: default (120 / 60s)Query parameters
status
string
Filter by status. One of
open, planned, in_progress, done, not_planned, or all. Defaults to all (no filtering). See statuses.Request
curl "https://api.twominutereports.com/v1/tmr/roadmap?status=in_progress" \
-H "Authorization: Bearer tmrc_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Response
{
"success": true,
"data": [
{
"id": "0190f8a1-2b3c-7d4e-8f90-1a2b3c4d5e6f",
"title": "Slack delivery for scheduled reports",
"description": "Send report snapshots straight to a Slack channel.",
"category": {
"id": "0190f8b0-1a2b-7c3d-8e4f-5a6b7c8d9e0f",
"name": "Integrations",
"hexColor": "#4A90D9",
"icon": "plug"
},
"status": "in_progress",
"statusNote": "Targeting October.",
"statusChangedAt": "2026-09-03T10:00:00.000Z",
"changelog": null,
"upvotes": 128,
"hasUpvoted": true,
"commentCount": 14,
"createdBy": {
"id": "0190f8c1-2b3c-7d4e-8f90-1a2b3c4d5e6f",
"name": "Priya Raman",
"firstName": "Priya",
"lastName": "Raman",
"avatarUrl": null
},
"updatedBy": null,
"createdAt": "2026-02-10T08:15:00.000Z",
"completedAt": null
},
{
"id": "0190f8a1-9c8b-7a6d-8e5f-4a3b2c1d0e9f",
"title": "GoHighLevel",
"description": null,
"category": {
"id": "0190f8b0-1a2b-7c3d-8e4f-5a6b7c8d9e0f",
"name": "Integrations",
"hexColor": "#4A90D9",
"icon": "plug"
},
"status": "done",
"statusNote": null,
"statusChangedAt": "2026-08-21T12:00:00.000Z",
"changelog": {
"slug": "gohighlevel-connector",
"title": "GoHighLevel Connector: CRM and Pipeline Reporting"
},
"upvotes": 10,
"hasUpvoted": false,
"commentCount": 0,
"createdBy": null,
"updatedBy": null,
"createdAt": "2026-05-10T11:07:00.000Z",
"completedAt": "2026-08-21T12:00:00.000Z"
}
]
}
Returned when status is not one of the allowed values.
{
"success": false,
"error": { "code": "BAD_REQUEST", "message": "status: Invalid enum value" }
}
{
"success": false,
"error": { "code": "UNAUTHORIZED", "message": "Authentication required" }
}
The roadmap item object
id
string
Roadmap item identifier.
title
string
Short title of the item.
description
string | null
Longer description, or
null if none.category
object | null
The item's category, or
null if uncategorized. Contains id, name, hexColor, and icon (string | null) — the name of a Lucide icon, such as plug.status
string
statusNote
string | null
Why the item has its current status, in our words — for example "Targeting October". Always set for
not_planned. Cleared whenever the status changes.statusChangedAt
string | null
When the status last changed. Editing the title or description does not move it.
changelog
object | null
For a shipped item, the What's New entry that announced it:
slug and title. The entry is at https://hub.twominutereports.com/changelog/{slug}. Only published entries appear here.upvotes
number
Total number of upvotes.
hasUpvoted
boolean
Whether the authenticated user has upvoted this item.
commentCount
number
Number of comments on the item.
createdBy
object | null
The user who submitted the item, or
null if unknown. Readable outside the owning team, so the object carries id, name, firstName, lastName and avatarUrl — neveremail.updatedBy
object | null
The user who last edited it, or
null if it has not been edited since. Readable outside the owning team, so id, name, firstName, lastName and avatarUrl only — never email.createdAt
string
When the item was created.
completedAt
string | null
When the item was completed, or
null if not completed.Statuses
| Value | Shown in the Hub as | Means |
|---|---|---|
open | Under review | Suggested; not decided yet |
planned | Planned | Committed, not started |
in_progress | In progress | Being built |
done | Shipped | Live. completedAt is set, and changelog links the announcement when there is one |
not_planned | Not planned | Decided against. statusNote says why |