REST API Reference

Get Started

REST API Reference

Complete documentation of all REST API endpoints provided by Product Roadmap Pro. All endpoints use the roadmap/v1 namespace and follow WordPress REST API conventions.

Time to read: 15 minutes


Authentication

Some endpoints require authentication. The table below each endpoint shows the required capability.

  • Public — No authentication needed
  • edit_posts — Requires Editor role or higher
  • manage_options — Requires Administrator role

Authenticate using one of these methods:

MethodHow to Use
Cookie + NonceSend the X-WP-Nonce header with a valid nonce and include your wordpressloggedin_* cookie
Application PasswordUse HTTP Basic Auth with your WordPress username and an application password
OAuth / JWTIf you have an OAuth or JWT plugin installed, follow its authentication flow

Getting a Nonce

When logged into WordPress admin, use the browser console:

wpApiSettings.nonce

Or generate one in PHP:

wp_create_nonce( 'wp_rest' );

Products

List All Products

GET /wp-json/roadmap/v1/products

Auth: Public

Returns all registered roadmap products.

Response:

[
  {
    "id": 5,
    "name": "Mobile App",
    "slug": "mobile-app",
    "description": "iOS and Android application",
    "count": 24
  }
]

Get Single Product

GET /wp-json/roadmap/v1/products/{id}

Auth: Public

ParameterTypeDescription
idintProduct term ID

Items

List Items

GET /wp-json/roadmap/v1/items

Auth: Public

Retrieve a paginated list of roadmap items. This is the main endpoint used by the frontend app.

ParameterTypeDefaultDescription
productstringProduct slug to filter by (required)
statusstring(all)Status taxonomy slug
categorystring(all)Category taxonomy slug
pageint1Page number
per_pageint100Items per page

Response:

{
  "items": [
    {
      "id": 123,
      "title": "Dark Mode Support",
      "content": "<p>Full description...</p>",
      "excerpt": "Short summary...",
      "votes": 14,
      "comment_count": 3,
      "priority": "high",
      "progress": 60,
      "target_date": "2026-06-01",
      "status": [{ "id": 5, "name": "In Progress", "slug": "in-progress" }],
      "categories": [],
      "product": [{ "id": 3, "name": "Mobile App", "slug": "mobile-app" }],
      "user_voted": 1,
      "link": "https://yoursite.com/roadmap_item/dark-mode/"
    }
  ],
  "total": 42,
  "pages": 5,
  "current_page": 1
}

Each item includes: id, title, content, excerpt, author, date, modified, votes, commentcount, priority, progress, targetdate, completionnotes, externallink, startdate, enddate, effortestimate, githubissue, status, categories, product, user_voted, link.

Create Item

POST /wp-json/roadmap/v1/items

Auth: edit_posts

Create a new roadmap item.

Request body:

{
  "title": "New Feature Request",
  "content": "Detailed description of the feature",
  "status": "planned",
  "priority": "high",
  "product": "mobile-app"
}
FieldTypeRequiredDescription
titlestringYesItem title
contentstringYesFull description (HTML allowed)
statusstringNoStatus slug (default: planned)
categorystringNoCategory slug
prioritystringNolow, medium, high, or critical (default: medium)
target_datestringNoTarget date (YYYY-MM-DD)
progressintNoProgress percentage (0-100)
productstringNoProduct slug
start_datestringNoStart date for timeline
end_datestringNoEnd date for timeline
external_linkstringNoURL to external tracker
effort_estimatestringNoEffort estimate value
github_issuestringNoGitHub issue URL

Response: 201 with the full item object.

Update Item

PUT /wp-json/roadmap/v1/items/{id}

Auth: edit_posts

Update a roadmap item’s status, title, or meta fields. All fields are optional — only include what you want to change.

ParameterTypeDescription
idintRoadmap item post ID

Request body:

{
  "status": "in-progress",
  "title": "Updated title",
  "progress": 50
}

Accepts the same fields as Create Item, all optional.

Delete Item

DELETE /wp-json/roadmap/v1/items/{id}

Auth: edit_posts

Permanently delete a roadmap item.

ParameterTypeDescription
idintRoadmap item post ID

Response:

{
  "success": true
}

Reorder Items

POST /wp-json/roadmap/v1/items/reorder

Auth: edit_posts

Update an item’s status and position. Used by the drag-and-drop feature when moving items between columns.

Request body:

{
  "item_id": 123,
  "new_status": "in-progress",
  "new_position": 2
}

Merge Items

POST /wp-json/roadmap/v1/items/merge

Auth: edit_posts

Merge a duplicate item into a target item. Transfers votes (deduplicates votes from the same user or IP) and reassigns comments. The source item is trashed after merge.

Request body:

{
  "source_id": 456,
  "target_id": 123
}

Response:

{
  "success": true,
  "message": "Successfully merged \"Feature A\" into \"Feature B\".",
  "source_id": 456,
  "target_id": 123,
  "target": {
    "id": 123,
    "title": "Feature B",
    "vote_count": 22,
    "edit_link": "https://..."
  }
}

Voting

Submit Vote

POST /wp-json/roadmap/v1/vote

Auth: Voting must be enabled. Logged-in users can always vote. Guests can vote if guest voting is enabled in settings.

Submit or change a vote on a roadmap item. Each user (or guest IP) can have one vote per item.

Request body:

{
  "item_id": 123,
  "vote_value": 1
}
FieldTypeRequiredDescription
item_idintYesThe roadmap item to vote on
vote_valueintNo1 (upvote), -1 (downvote), or 0 (remove vote). Default: 1

Response:

{
  "success": true,
  "vote_count": 14
}

Comments

Post Comment

POST /wp-json/roadmap/v1/comment

Auth: Must be logged in. Comments must be enabled in settings.

Request body:

{
  "item_id": 123,
  "content": "This would be a great addition!"
}

Response: 201

{
  "success": true,
  "comment_id": 55,
  "message": "Comment added successfully"
}

List Comments

GET /wp-json/roadmap/v1/items/{id}/comments

Auth: Public

Retrieve all comments for a roadmap item.

ParameterTypeDescription
idintRoadmap item post ID

Response:

[
  {
    "id": 55,
    "content": "This would be a great addition!",
    "author": 1,
    "author_name": "Jane Doe",
    "author_avatar": "https://...",
    "date": "2026-03-01 14:30:00",
    "formatted_date": "March 1, 2026"
  }
]

Suggestions

Submit Suggestion

POST /wp-json/roadmap/v1/suggest

Auth: Suggestions must be enabled. User must be logged in (for guest suggestions, use the guest-suggest endpoint instead).

Submit a new feature suggestion. The suggestion is saved as a pending roadmap item unless auto-approve is enabled in settings.

Request body:

{
  "title": "Add dark mode",
  "description": "A dark theme option for nighttime use",
  "category": "ui-improvements"
}
FieldTypeRequiredDescription
titlestringYesSuggestion title
descriptionstringYesDetailed description
categorystringNoCategory taxonomy slug

Response:

{
  "success": true,
  "message": "Thank you for your suggestion!",
  "id": 101
}

Stats

Get Statistics

GET /wp-json/roadmap/v1/stats

Auth: Public

Retrieve aggregate statistics for the roadmap.

Response:

{
  "total_items": 87,
  "total_votes": 312,
  "total_comments": 54,
  "items_by_status": {
    "planned": { "name": "Planned", "count": 30 },
    "in-progress": { "name": "In Progress", "count": 12 },
    "completed": { "name": "Completed", "count": 45 }
  }
}

Settings

Get Settings

GET /wp-json/roadmap/v1/settings

Auth: Public

Retrieve public roadmap settings and the current user’s info (if logged in).

Response:

{
  "enable_voting": true,
  "allow_guest_voting": false,
  "enable_comments": true,
  "enable_suggestions": true,
  "items_per_page": 20,
  "statuses": [
    { "id": 5, "name": "Planned", "slug": "planned" }
  ],
  "categories": [],
  "products": [],
  "is_pro": true,
  "current_user": {
    "id": 1,
    "name": "Admin",
    "email": "admin@example.com",
    "capabilities": ["roadmap_vote", "roadmap_comment"]
  }
}

The current_user field is null when not logged in.

Update Settings

POST /wp-json/roadmap/v1/settings

Auth: manage_options

Update roadmap settings.

Request body:

{
  "enable_voting": true,
  "allow_guest_voting": true,
  "enable_comments": true,
  "enable_suggestions": true,
  "items_per_page": 20
}

All fields are optional — include only the settings you want to change.


Advanced Filtering

The Pro addon adds these filter parameters to the items endpoint. Append them as query strings to any items request.

ParameterTypeDescription
prioritystringFilter by priority level: critical, high, medium, low
assigneeintFilter by assigned user ID
min_progressintMinimum progress percentage (0-100)
max_progressintMaximum progress percentage (0-100)
date_fromstringTarget date on or after this date (YYYY-MM-DD)
date_tostringTarget date on or before this date (YYYY-MM-DD)
has_dependenciesboolean1 for items with dependencies, 0 for items without
productstringComma-separated product slugs for multi-product filtering

Sorting

orderby ValueDescription
votesSort by vote count
progressSort by progress percentage
prioritySort by priority (critical > high > medium > low)
target_dateSort by target date

All support order=ASC or order=DESC.

Example:

GET /wp-json/roadmap/v1/items?priority=high&min_progress=25&orderby=votes&order=DESC

Filter Presets

Save named filter combinations for quick reuse. Presets are stored per-user in a dedicated database table.

Saveable filter keys: status, category, product, priority, assignee, search. Date range and dependency filters cannot be saved in presets at this time.


Timeline

Get Timeline Data

GET /wp-json/roadmap/v1/timeline

Auth: Public

Returns roadmap items formatted for the Gantt chart timeline view.

ParameterTypeDefaultDescription
productstring(all)Filter by product slug
statusstring(all)Filter by status slug

Response:

[
  {
    "id": 123,
    "title": "Dark Mode Support",
    "status": "in-progress",
    "start_date": "2026-01-01",
    "end_date": "2026-03-15",
    "progress": 60,
    "assignee": {
      "id": 1,
      "name": "Jane Doe",
      "avatar": "https://..."
    },
    "dependencies": [456]
  }
]

Analytics

Get Analytics Data

GET /wp-json/roadmap/v1/analytics

Auth: edit_posts

Returns analytics data for a specified metric and time period.

ParameterTypeDefaultDescription
metricstringMetric type: votes, progress, or engagement
periodstringweekTime period: day, week, month, year
productstring(all)Filter by product slug
start_datestringCustom start date (YYYY-MM-DD)
end_datestringCustom end date (YYYY-MM-DD)

Get Analytics Overview

GET /wp-json/roadmap/v1/analytics/overview

Auth: edit_posts

Returns the analytics dashboard overview with summary statistics.

Get Trends

GET /wp-json/roadmap/v1/analytics/trends

Auth: edit_posts

Returns trend data over time.

ParameterTypeDefaultDescription
periodstring30daysTime period: 7days, 30days, 90days, 1year

Get Popular Items

GET /wp-json/roadmap/v1/analytics/popular-items

Auth: edit_posts

Returns the most popular roadmap items ranked by votes and engagement.

Get Recent Activity

GET /wp-json/roadmap/v1/analytics/recent-activity

Auth: edit_posts

Returns a feed of recent roadmap activity (votes, comments, status changes).

Get Charts Data

GET /wp-json/roadmap/v1/analytics/charts

Auth: edit_posts

Returns chart-ready data for the analytics dashboard visualizations.

Track Event

POST /wp-json/roadmap/v1/analytics/track

Auth: Public

Record a frontend analytics event (e.g., page view). This is the only public analytics endpoint — all other analytics endpoints require the edit_posts capability.

Request body:

{
  "event": "item_viewed",
  "item_id": 123,
  "metadata": {}
}

Custom Fields

List Field Definitions

GET /wp-json/roadmap/v1/custom-fields

Auth: Public

Returns all defined custom field configurations. Custom field values are also included in every item response under a custom_fields key.

Response:

[
  {
    "key": "effort",
    "label": "Effort Points",
    "type": "number",
    "required": false,
    "show_in_list": true
  }
]

Create Field

POST /wp-json/roadmap/v1/custom-fields

Auth: manage_options

Create a new custom field definition.

Request body:

{
  "key": "effort",
  "label": "Effort Points",
  "type": "number",
  "required": false,
  "show_in_list": true
}
FieldTypeRequiredDescription
keystringYesUnique identifier (letters, numbers, underscores)
labelstringYesDisplay label in the admin
typestringYesField type: text, textarea, select, number, date, url
optionsarrayFor selectDropdown choices as strings
requiredboolNoWhether the field must be filled
showinlistboolNoShow in admin list table column

Update Field

PUT /wp-json/roadmap/v1/custom-fields/{key}

Auth: manage_options

Update an existing field definition. The key in the URL identifies which field to update.

Delete Field

DELETE /wp-json/roadmap/v1/custom-fields/{key}

Auth: manage_options

Remove a field definition. Existing field values on posts are not deleted — they remain as post meta but are no longer displayed.


Guest Suggestions

Submit Guest Suggestion

POST /wp-json/roadmap/v1/guest-suggest

Auth: None (public)

Submit a suggestion without logging in. Only works if guest suggestions are enabled in settings.

Request body:

{
  "title": "Dark mode support",
  "description": "Add a dark theme option",
  "name": "Jane Doe",
  "email": "jane@example.com"
}

List Guest Suggestions

GET /wp-json/roadmap/v1/guest-suggestions

Auth: edit_posts

Returns pending guest suggestions for admin review.

Approve Guest Suggestion

POST /wp-json/roadmap/v1/guest-suggestions/{id}/approve

Auth: edit_posts

Converts the guest suggestion into a published roadmap item.

Reject Guest Suggestion

POST /wp-json/roadmap/v1/guest-suggestions/{id}/reject

Auth: edit_posts

Rejects and trashes the guest suggestion.


Webhooks

List Webhooks

GET /wp-json/roadmap/v1/webhooks

Auth: manage_options

Returns all configured webhooks (secrets are masked) and the last 20 delivery log entries.

Create Webhook

POST /wp-json/roadmap/v1/webhooks

Auth: manage_options

Request body:

{
  "url": "https://example.com/webhook-receiver",
  "secret": "my-secure-secret",
  "events": ["status_changed", "vote_submitted"]
}
FieldTypeRequiredDescription
urlstringYesThe endpoint URL to receive events
secretstringYesShared secret for HMAC-SHA256 signature verification
eventsarrayYesEvent types to subscribe to

Available events: statuschanged, votesubmitted, commentsubmitted, suggestionsubmitted, guestsuggestionsubmitted

Delete Webhook

DELETE /wp-json/roadmap/v1/webhooks/{index}

Auth: manage_options

Remove the webhook at the specified array index.

Test Webhook

POST /wp-json/roadmap/v1/webhooks/test

Auth: manage_options

Send a test ping event to verify your endpoint.

Request body:

{
  "url": "https://example.com/webhook-receiver",
  "secret": "my-secure-secret"
}

Changelog

List Changelog Entries

GET /wp-json/roadmap/v1/changelog

Auth: Public

ParameterTypeDefaultDescription
productstring(all)Filter by product slug
per_pageint10Entries per page
pageint1Page number

Response:

{
  "entries": [
    {
      "id": 123,
      "version": "2.0.0",
      "date": "2026-01-15",
      "product": "mobile-app",
      "items": [
        { "type": "new-feature", "description": "Added dark mode" },
        { "type": "fix", "description": "Fixed login redirect" }
      ]
    }
  ],
  "total": 12,
  "pages": 2
}

Get Single Entry

GET /wp-json/roadmap/v1/changelog/{id}

Auth: Public

Returns a single changelog entry by post ID.


Filter Presets

Filter presets let users save named filter combinations for quick reuse. Presets are stored per-user — each user can only see and manage their own presets.

List Filter Presets

GET /wp-json/roadmap/v1/filter-presets

Auth: Logged in (any role)

Returns the current user’s saved filter presets.

Response:

[
  {
    "id": 7,
    "name": "High Priority Active",
    "filters": {
      "status": "in-progress",
      "priority": "high"
    },
    "is_default": false,
    "created_at": "2026-02-15 10:30:00"
  }
]

Create Filter Preset

POST /wp-json/roadmap/v1/filter-presets

Auth: Logged in (any role)

Save a named filter configuration for reuse.

Request body:

{
  "name": "High Priority Active",
  "filters": {
    "status": "in-progress",
    "priority": "high",
    "assignee": "42"
  }
}

Saveable filter keys: status, category, product, priority, assignee, search. Date range and dependency filters cannot be saved in presets.

Response: 201

{
  "success": true,
  "id": 7
}

Delete Filter Preset

DELETE /wp-json/roadmap/v1/filter-presets/{id}

Auth: Logged in (any role)

Delete one of your saved filter presets. You can only delete presets you created.

ParameterTypeDescription
idintFilter preset ID

Response:

{
  "success": true
}

User Profiles

Get User Activity

GET /wp-json/roadmap/v1/users/{id}/activity

Auth: Public

Retrieve a user’s roadmap activity including votes cast, items submitted, and comments made.

ParameterTypeDescription
idintWordPress user ID
per_pageintItems per page (default: 20, max: 100)
pageintPage number (default: 1)

Response:

{
  "user": {
    "id": 5,
    "name": "Jane Doe",
    "avatar": "https://..."
  },
  "stats": {
    "votes_cast": 12,
    "items_submitted": 3,
    "comments_made": 7
  },
  "voted_items": [
    {
      "item_id": 10,
      "title": "Dark Mode",
      "vote_value": 1,
      "voted_at": "2026-02-15",
      "url": "https://..."
    }
  ],
  "submitted_items": [
    {
      "id": 11,
      "title": "API Improvements",
      "date": "2026-01-20",
      "url": "https://...",
      "votes": 5
    }
  ],
  "comments": [
    {
      "id": 22,
      "item_id": 10,
      "item_title": "Dark Mode",
      "excerpt": "This would be great for...",
      "date": "2026-02-10"
    }
  ]
}

Get Top Contributors

GET /wp-json/roadmap/v1/users/top-contributors

Auth: Public

Retrieve the most active contributors ranked by vote count.

ParameterTypeDefaultDescription
limitint10Number of users to return (max: 100)

Response:

[
  {
    "user_id": 5,
    "name": "Jane Doe",
    "avatar": "https://...",
    "vote_count": 42
  }
]

Export

Export Items

GET /wp-json/roadmap/v1/export

Auth: export (Administrator role)

Export roadmap items as a CSV file download.

ParameterTypeDefaultDescription
productstring(all)Filter by product slug
statusstring(all)Filter by status
formatstringcsvExport format (csv supported; pdf planned)

CSV columns: ID, Title, Description, Status, Category, Priority, Target Date, Votes, Comments, Progress, Assignee.


Changelog (Additional Endpoints)

The free plugin provides GET /changelog and GET /changelog/{id} (documented above). The Pro addon adds these additional endpoints.

List Changelog Products

GET /wp-json/roadmap/v1/changelog/products

Auth: Public

Returns all products that have at least one published changelog entry.

Response:

[
  {
    "id": 3,
    "name": "Mobile App",
    "slug": "mobile-app",
    "changelog_count": 8
  }
]

Get Changelog by Product

GET /wp-json/roadmap/v1/changelog/by-product/{product}

Auth: Public

Retrieve paginated changelog entries for a specific product.

ParameterTypeDefaultDescription
productstringProduct slug (URL parameter)
limitint10Entries per page
pageint1Page number

Response:

{
  "product": {
    "id": 3,
    "name": "Mobile App",
    "slug": "mobile-app"
  },
  "changelogs": [],
  "total": 25,
  "pagination": {
    "page": 1,
    "per_page": 10,
    "total": 25,
    "total_pages": 3
  }
}

Error Responses

All endpoints return standard WordPress REST API error responses:

{
  "code": "rest_forbidden",
  "message": "Sorry, you are not allowed to do that.",
  "data": {
    "status": 403
  }
}
Status CodeMeaning
200Success
201Created
400Bad request (missing or invalid parameters)
401Not authenticated
403Authenticated but not authorized
404Resource not found
500Server error

Next Steps


← Hooks & Filters Reference | Customization Guide

Last updated: March 4, 2026