Scoped keys
Grant only the read or write scopes an integration needs.
REST management API ยท v1
Manage projects, requests, comments, releases, and usage from server-side tools. The API uses JSON, scoped project keys, cursor pagination, and predictable error envelopes.
Grant only the read or write scopes an integration needs.
Standard limits are 100 requests per minute per key.
Private actor traits and subscriber addresses are never returned.
curl https://priosmith.com/api/v1/projects \
-H "Authorization: Bearer ps_live_your_key" \
-H "Accept: application/json"Send a project-bound API key as a Bearer token. Keys are shown once when created, then stored only as a purpose-separated HMAC digest. Rotate a key immediately if it is exposed.
Authorization: Bearer ps_live_your_key| Scope | Allows |
|---|---|
| projects:read | List accessible projects and configuration |
| features:read / features:write | Read or manage requests and moderation status |
| comments:read / comments:write | Read or add administrative comments |
| releases:read / releases:write | Read releases and create drafts |
| releases:publish | Publish a release and enqueue subscriber notifications |
| usage:read | Read aggregate project usage |
| Method | Path | Purpose | MCP tool |
|---|---|---|---|
| GET | /api/v1/projects | List projects available to the project-bound API key. | list_projects |
| GET | /api/v1/projects/:projectId/features | List and cursor-page feature requests. | list_features |
| POST | /api/v1/projects/:projectId/features | Create a request in the default or supplied status. | create_feature |
| GET | /api/v1/projects/:projectId/features/:featureId | Read one feature request. | get_feature |
| PATCH | /api/v1/projects/:projectId/features/:featureId | Edit, moderate, or change request status and follower policy. | update_feature |
| DELETE | /api/v1/projects/:projectId/features/:featureId | Soft-delete a request. | delete_feature |
| GET | /api/v1/projects/:projectId/features/:featureId/comments | List non-deleted comments with moderation state. | list_comments |
| POST | /api/v1/projects/:projectId/features/:featureId/comments | Add an administrative comment. | create_comment |
| GET | /api/v1/projects/:projectId/releases | List draft, scheduled, and published releases. | list_releases |
| POST | /api/v1/projects/:projectId/releases | Create a draft or scheduled release. Scheduling additionally requires releases:publish. | create_release |
| POST | /api/v1/projects/:projectId/releases/:releaseId/publish | Publish a release and queue notifications. | publish_release |
| GET | /api/v1/projects/:projectId/usage | Return project counters and plan usage. | project_usage |
| GET | /api/features | Source-compatible page list with status, tag, and search filters; project comes only from the key. | compatibility_list_features |
| POST | /api/features/create | Create a feature using source field names without accepting author identity or a project override. | compatibility_create_feature |
| GET | /api/features?featureId=:featureId | Read one project-bound feature using source field names. | compatibility_get_feature |
| PUT | /api/features | Update feature title, description, or tags transactionally. | compatibility_update_feature |
| PUT | /api/features?is_status_update=true | Update feature status through the notification-policy-aware transaction. | compatibility_update_feature_status |
| DELETE | /api/features | Soft-delete one feature bound to the key project. | compatibility_delete_feature |
| GET | /api/features/voters?featureId=:featureId | List safe voter labels and masked email only; raw identity data is never returned. | compatibility_list_voters |
| POST | /api/features/add-voter | Queue a confirmation invitation; no vote or consent is created until the recipient confirms. | compatibility_add_voter |
| POST | /api/features/link-to-release | Atomically link one project feature to one project release. | compatibility_link_feature_to_release |
| POST | /api/features/merge | Transactionally move votes, subscribers, comments, tags, and release links, then soft-delete the source. | compatibility_merge_features |
| GET | /api/comments?featureId=:featureId | Page administrative comments without actor identities. | compatibility_list_comments |
| POST | /api/comments/create?featureId=:featureId | Create a public administrative comment or a private internal note. | compatibility_create_comment |
| PUT | /api/comments | Update comment body or internal visibility within the key project. | compatibility_update_comment |
| DELETE | /api/comments | Retention-bound soft deletion of one project comment. | compatibility_delete_comment |
| GET | /api/releases | Page project-bound releases using the source version, description, feature, and draft fields. | compatibility_list_releases |
| GET | /api/releases?releaseId=:releaseId | Read one project-bound release using the source release fields. | compatibility_get_release |
| POST | /api/releases | Create a draft or published release with the source field names. Setting is_draft to false additionally requires releases:publish. | compatibility_create_release |
| PUT | /api/releases | Update source release fields and replace feature links within the key project. Setting is_draft to false additionally requires releases:publish. | compatibility_update_release |
| DELETE | /api/releases?releaseId=:releaseId | Retention-bound soft deletion of one project release. | compatibility_delete_release |
| POST | /api/releases/send-changelog-email | Idempotently queue one consent-safe release email batch for at most 50 confirmed subscribers; recipient identities are never accepted or returned. | compatibility_send_changelog_email |
| POST | /api/releases/generate-changelog | Generate customer-facing Markdown from one project release and its linked requests; each attempted provider generation consumes the five-per-project UTC-day quota. | compatibility_generate_changelog |
| GET | /api/projects | Return the single project, statuses, and tags bound to the API key. | compatibility_get_project |
| GET | /api/usage | Return source-named aggregate project counters; features and featureRequests currently share the same non-deleted count. | compatibility_get_usage |
Open an endpoint only when you need its complete example. Copying the documentation includes every collapsed example.
Request
GET /api/v1/projects
Authorization: Bearer ps_live_your_key
Accept: application/jsonSuccess response
200 OK
{
"data": {
"projects": [
{
"id": "3fc4d742-57ef-4d41-b22e-c0bdb43a0fd2",
"name": "Northstar",
"slug": "northstar",
"description": "Customer feedback for the Northstar product.",
"visibility": "public",
"published_at": "2026-07-13T12:00:00.000Z",
"archived_at": null,
"created_at": "2026-07-13T12:00:00.000Z",
"updated_at": "2026-07-13T12:00:00.000Z"
}
]
}
}Request
GET /api/v1/projects/3fc4d742-57ef-4d41-b22e-c0bdb43a0fd2/features?limit=50&cursor=NEXT_CURSOR
Authorization: Bearer ps_live_your_key
Accept: application/jsonSuccess response
200 OK
{
"data": {
"features": [
{
"id": "f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f",
"request_number": 42,
"project_id": "3fc4d742-57ef-4d41-b22e-c0bdb43a0fd2",
"status_id": "97a8ad23-f482-49bb-88b9-716c5f41709d",
"title": "Native mobile app",
"slug": "native-mobile-app",
"body": "iOS and Android access for field teams",
"post_type": "feature",
"moderation_state": "visible",
"is_pinned": false,
"notify_followers": true,
"vote_count": 18,
"comment_count": 3,
"subscriber_count": 12,
"target_date": "2026-10-15",
"published_at": "2026-07-13T12:00:00.000Z",
"released_at": null,
"created_at": "2026-07-13T12:00:00.000Z",
"updated_at": "2026-07-13T12:00:00.000Z"
}
],
"nextCursor": "eyJjcmVhdGVkQXQiOiIyMDI2LS4uLiJ9"
}
}Request
POST /api/v1/projects/3fc4d742-57ef-4d41-b22e-c0bdb43a0fd2/features
Authorization: Bearer ps_live_your_key
Accept: application/json
Content-Type: application/json
{
"title": "Native mobile app",
"body": "iOS and Android access for field teams",
"postType": "feature"
}Success response
201 Created
{
"data": {
"feature": {
"id": "f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f",
"request_number": 42,
"project_id": "3fc4d742-57ef-4d41-b22e-c0bdb43a0fd2",
"status_id": "97a8ad23-f482-49bb-88b9-716c5f41709d",
"title": "Native mobile app",
"slug": "native-mobile-app",
"body": "iOS and Android access for field teams",
"post_type": "feature",
"moderation_state": "visible",
"is_pinned": false,
"notify_followers": true,
"vote_count": 18,
"comment_count": 3,
"subscriber_count": 12,
"target_date": "2026-10-15",
"published_at": "2026-07-13T12:00:00.000Z",
"released_at": null,
"created_at": "2026-07-13T12:00:00.000Z",
"updated_at": "2026-07-13T12:00:00.000Z"
}
}
}Request
GET /api/v1/projects/3fc4d742-57ef-4d41-b22e-c0bdb43a0fd2/features/f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f
Authorization: Bearer ps_live_your_key
Accept: application/jsonSuccess response
200 OK
{
"data": {
"feature": {
"id": "f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f",
"request_number": 42,
"project_id": "3fc4d742-57ef-4d41-b22e-c0bdb43a0fd2",
"status_id": "97a8ad23-f482-49bb-88b9-716c5f41709d",
"title": "Native mobile app",
"slug": "native-mobile-app",
"body": "iOS and Android access for field teams",
"post_type": "feature",
"moderation_state": "visible",
"is_pinned": false,
"notify_followers": true,
"vote_count": 18,
"comment_count": 3,
"subscriber_count": 12,
"target_date": "2026-10-15",
"published_at": "2026-07-13T12:00:00.000Z",
"released_at": null,
"created_at": "2026-07-13T12:00:00.000Z",
"updated_at": "2026-07-13T12:00:00.000Z"
}
}
}Request
PATCH /api/v1/projects/3fc4d742-57ef-4d41-b22e-c0bdb43a0fd2/features/f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f
Authorization: Bearer ps_live_your_key
Accept: application/json
Content-Type: application/json
{
"statusId": "97a8ad23-f482-49bb-88b9-716c5f41709d",
"notifyFollowers": false
}Success response
200 OK
{
"data": {
"feature": {
"id": "f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f",
"request_number": 42,
"project_id": "3fc4d742-57ef-4d41-b22e-c0bdb43a0fd2",
"status_id": "97a8ad23-f482-49bb-88b9-716c5f41709d",
"title": "Native mobile app",
"slug": "native-mobile-app",
"body": "iOS and Android access for field teams",
"post_type": "feature",
"moderation_state": "visible",
"is_pinned": false,
"notify_followers": false,
"vote_count": 18,
"comment_count": 3,
"subscriber_count": 12,
"target_date": "2026-10-15",
"published_at": "2026-07-13T12:00:00.000Z",
"released_at": null,
"created_at": "2026-07-13T12:00:00.000Z",
"updated_at": "2026-07-13T12:00:00.000Z"
}
}
}Request
DELETE /api/v1/projects/3fc4d742-57ef-4d41-b22e-c0bdb43a0fd2/features/f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f
Authorization: Bearer ps_live_your_key
Accept: application/jsonSuccess response
204 No Content
(no response body)Request
GET /api/v1/projects/3fc4d742-57ef-4d41-b22e-c0bdb43a0fd2/features/f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f/comments?limit=50
Authorization: Bearer ps_live_your_key
Accept: application/jsonSuccess response
200 OK
{
"data": {
"comments": [
{
"id": "25bb8fa2-1eec-47a5-9f45-4400dcc9e816",
"project_id": "3fc4d742-57ef-4d41-b22e-c0bdb43a0fd2",
"post_id": "f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f",
"parent_comment_id": null,
"body": "We have started the technical design.",
"is_internal": false,
"moderation_state": "visible",
"edited_at": null,
"created_at": "2026-07-13T12:00:00.000Z",
"updated_at": "2026-07-13T12:00:00.000Z"
}
],
"nextCursor": null
}
}Request
POST /api/v1/projects/3fc4d742-57ef-4d41-b22e-c0bdb43a0fd2/features/f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f/comments
Authorization: Bearer ps_live_your_key
Accept: application/json
Content-Type: application/json
{
"body": "We have started the technical design."
}Success response
201 Created
{
"data": {
"comment": {
"id": "25bb8fa2-1eec-47a5-9f45-4400dcc9e816",
"project_id": "3fc4d742-57ef-4d41-b22e-c0bdb43a0fd2",
"post_id": "f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f",
"parent_comment_id": null,
"body": "We have started the technical design.",
"is_internal": false,
"moderation_state": "visible",
"edited_at": null,
"created_at": "2026-07-13T12:00:00.000Z",
"updated_at": "2026-07-13T12:00:00.000Z"
}
}
}Request
GET /api/v1/projects/3fc4d742-57ef-4d41-b22e-c0bdb43a0fd2/releases?limit=50
Authorization: Bearer ps_live_your_key
Accept: application/jsonSuccess response
200 OK
{
"data": {
"releases": [
{
"id": "b6f1472f-2fc3-4dd9-b06e-c8931ae245f7",
"project_id": "3fc4d742-57ef-4d41-b22e-c0bdb43a0fd2",
"title": "Mobile beta",
"slug": "mobile-beta",
"summary": "The private beta is ready.",
"body": "Invitations are rolling out to the first customer cohort.",
"status": "draft",
"scheduled_at": null,
"published_at": null,
"created_at": "2026-07-13T12:00:00.000Z",
"updated_at": "2026-07-13T12:00:00.000Z"
}
],
"nextCursor": null
}
}Request
POST /api/v1/projects/3fc4d742-57ef-4d41-b22e-c0bdb43a0fd2/releases
Authorization: Bearer ps_live_your_key
Accept: application/json
Content-Type: application/json
{
"title": "Mobile beta",
"slug": "mobile-beta",
"summary": "The private beta is ready.",
"status": "draft"
}Success response
201 Created
{
"data": {
"release": {
"id": "b6f1472f-2fc3-4dd9-b06e-c8931ae245f7",
"project_id": "3fc4d742-57ef-4d41-b22e-c0bdb43a0fd2",
"title": "Mobile beta",
"slug": "mobile-beta",
"summary": "The private beta is ready.",
"body": "Invitations are rolling out to the first customer cohort.",
"status": "draft",
"scheduled_at": null,
"published_at": null,
"created_at": "2026-07-13T12:00:00.000Z",
"updated_at": "2026-07-13T12:00:00.000Z"
}
}
}Request
POST /api/v1/projects/3fc4d742-57ef-4d41-b22e-c0bdb43a0fd2/releases/b6f1472f-2fc3-4dd9-b06e-c8931ae245f7/publish
Authorization: Bearer ps_live_your_key
Accept: application/jsonSuccess response
200 OK
{
"data": {
"release": {
"id": "b6f1472f-2fc3-4dd9-b06e-c8931ae245f7",
"project_id": "3fc4d742-57ef-4d41-b22e-c0bdb43a0fd2",
"title": "Mobile beta",
"slug": "mobile-beta",
"summary": "The private beta is ready.",
"body": "Invitations are rolling out to the first customer cohort.",
"status": "published",
"scheduled_at": null,
"published_at": "2026-07-13T12:00:00.000Z",
"created_at": "2026-07-13T12:00:00.000Z",
"updated_at": "2026-07-13T12:00:00.000Z"
}
}
}Request
GET /api/v1/projects/3fc4d742-57ef-4d41-b22e-c0bdb43a0fd2/usage
Authorization: Bearer ps_live_your_key
Accept: application/jsonSuccess response
200 OK
{
"data": {
"projectId": "3fc4d742-57ef-4d41-b22e-c0bdb43a0fd2",
"counts": {
"features": 42,
"votes": 318,
"comments": 67,
"releases": 8,
"activeSubscribers": 96
},
"calculatedAt": "2026-07-13T12:00:00.000Z"
}
}Request
GET /api/features?page=1&limit=50&status=In%20progress&tag=Mobile&search=native
Authorization: Bearer ps_live_your_key
Accept: application/jsonSuccess response
200 OK
{
"data": [
{
"id": "f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f",
"title": "Native mobile app",
"description": "iOS and Android access for field teams",
"status": "In progress",
"tags": [
"Mobile"
],
"votes": 18,
"createdAt": "2026-07-13T12:00:00.000Z",
"updatedAt": "2026-07-13T12:00:00.000Z"
}
],
"meta": {
"page": 1,
"limit": 50,
"total": 1
}
}Request
POST /api/features/create
Authorization: Bearer ps_live_your_key
Accept: application/json
Content-Type: application/json
{
"title": "Native mobile app",
"description": "iOS and Android access for field teams",
"status": "In progress",
"tags": [
"Mobile"
]
}Success response
201 Created
{
"data": {
"id": "f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f",
"title": "Native mobile app",
"description": "iOS and Android access for field teams",
"status": "In progress",
"tags": [
"Mobile"
],
"votes": 18,
"createdAt": "2026-07-13T12:00:00.000Z",
"updatedAt": "2026-07-13T12:00:00.000Z"
}
}Request
GET /api/features?featureId=f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f
Authorization: Bearer ps_live_your_key
Accept: application/jsonSuccess response
200 OK
{
"data": {
"id": "f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f",
"title": "Native mobile app",
"description": "iOS and Android access for field teams",
"status": "In progress",
"tags": [
"Mobile"
],
"votes": 18,
"createdAt": "2026-07-13T12:00:00.000Z",
"updatedAt": "2026-07-13T12:00:00.000Z"
}
}Request
PUT /api/features
Authorization: Bearer ps_live_your_key
Accept: application/json
Content-Type: application/json
{
"featureId": "f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f",
"description": "Beta access for field teams",
"tags": [
"Mobile",
"Beta"
]
}Success response
200 OK
{
"data": {
"id": "f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f",
"title": "Native mobile app",
"description": "iOS and Android access for field teams",
"status": "In progress",
"tags": [
"Mobile"
],
"votes": 18,
"createdAt": "2026-07-13T12:00:00.000Z",
"updatedAt": "2026-07-13T12:00:00.000Z"
}
}Request
PUT /api/features?is_status_update=true
Authorization: Bearer ps_live_your_key
Accept: application/json
Content-Type: application/json
{
"featureId": "f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f",
"status": "In progress"
}Success response
200 OK
{
"data": {
"id": "f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f",
"title": "Native mobile app",
"description": "iOS and Android access for field teams",
"status": "In progress",
"tags": [
"Mobile"
],
"votes": 18,
"createdAt": "2026-07-13T12:00:00.000Z",
"updatedAt": "2026-07-13T12:00:00.000Z"
}
}Request
DELETE /api/features
Authorization: Bearer ps_live_your_key
Accept: application/json
Content-Type: application/json
{
"featureId": "f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f"
}Success response
200 OK
{
"data": {
"featureId": "f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f",
"deleted": true
}
}Request
GET /api/features/voters?featureId=f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f&page=1&limit=25
Authorization: Bearer ps_live_your_key
Accept: application/jsonSuccess response
200 OK
{
"data": [
{
"label": "Email subscriber",
"masked_email": "a***e@e*****e.com",
"identity_kind": "subscriber",
"status": "active",
"created_at": "2026-07-13T12:00:00.000Z"
}
],
"meta": {
"page": 1,
"limit": 25,
"total": 1
}
}Request
POST /api/features/add-voter
Authorization: Bearer ps_live_your_key
Accept: application/json
Content-Type: application/json
{
"featureId": "f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f",
"email": "alex@example.com"
}Success response
202 Accepted
{
"data": {
"featureId": "f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f",
"status": "pending_confirmation",
"queued": true,
"confirmation_required": true,
"masked_email": "a***x@e*****e.com"
}
}Request
POST /api/features/link-to-release
Authorization: Bearer ps_live_your_key
Accept: application/json
Content-Type: application/json
{
"featureId": "f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f",
"releaseId": "b6f1472f-2fc3-4dd9-b06e-c8931ae245f7"
}Success response
200 OK
{
"data": {
"featureId": "f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f",
"releaseId": "b6f1472f-2fc3-4dd9-b06e-c8931ae245f7",
"linked": true
}
}Request
POST /api/features/merge
Authorization: Bearer ps_live_your_key
Accept: application/json
Content-Type: application/json
{
"sourceFeatureId": "4d239ed7-c89b-4b22-9cc6-54485336ca58",
"targetFeatureId": "f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f"
}Success response
200 OK
{
"data": {
"sourcePostId": "4d239ed7-c89b-4b22-9cc6-54485336ca58",
"targetPostId": "f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f",
"merged": true,
"idempotent": false
}
}Request
GET /api/comments?featureId=f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f&page=1&limit=50
Authorization: Bearer ps_live_your_key
Accept: application/jsonSuccess response
200 OK
{
"data": [
{
"id": "25bb8fa2-1eec-47a5-9f45-4400dcc9e816",
"featureId": "f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f",
"body": "We have started the technical design.",
"is_internal": false,
"moderation_state": "visible",
"createdAt": "2026-07-13T12:00:00.000Z",
"updatedAt": "2026-07-13T12:00:00.000Z"
}
],
"meta": {
"page": 1,
"limit": 50,
"total": 1
}
}Request
POST /api/comments/create?featureId=f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f
Authorization: Bearer ps_live_your_key
Accept: application/json
Content-Type: application/json
{
"body": "Internal triage note",
"is_internal": true
}Success response
201 Created
{
"data": {
"id": "25bb8fa2-1eec-47a5-9f45-4400dcc9e816",
"featureId": "f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f",
"body": "Internal triage note",
"is_internal": true,
"moderation_state": "visible",
"createdAt": "2026-07-13T12:00:00.000Z",
"updatedAt": "2026-07-13T12:00:00.000Z"
}
}Request
PUT /api/comments
Authorization: Bearer ps_live_your_key
Accept: application/json
Content-Type: application/json
{
"commentId": "25bb8fa2-1eec-47a5-9f45-4400dcc9e816",
"body": "Updated internal triage note",
"is_internal": true
}Success response
200 OK
{
"data": {
"id": "25bb8fa2-1eec-47a5-9f45-4400dcc9e816",
"is_internal": true
}
}Request
DELETE /api/comments
Authorization: Bearer ps_live_your_key
Accept: application/json
Content-Type: application/json
{
"commentId": "25bb8fa2-1eec-47a5-9f45-4400dcc9e816"
}Success response
200 OK
{
"data": {
"commentId": "25bb8fa2-1eec-47a5-9f45-4400dcc9e816",
"deleted": true
}
}Request
GET /api/releases?page=1&limit=50
Authorization: Bearer ps_live_your_key
Accept: application/jsonSuccess response
200 OK
{
"data": [
{
"id": "b6f1472f-2fc3-4dd9-b06e-c8931ae245f7",
"version": "v1.7.0",
"title": "Mobile beta",
"short_description": "The private beta is ready.",
"long_description": "Invitations are rolling out to the first customer cohort.",
"feature_ids": [
"f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f"
],
"is_draft": true,
"created_at": "2026-07-13T12:00:00.000Z",
"updated_at": "2026-07-13T12:00:00.000Z"
}
],
"meta": {
"page": 1,
"limit": 50,
"total": 1
}
}Request
GET /api/releases?releaseId=b6f1472f-2fc3-4dd9-b06e-c8931ae245f7
Authorization: Bearer ps_live_your_key
Accept: application/jsonSuccess response
200 OK
{
"data": {
"id": "b6f1472f-2fc3-4dd9-b06e-c8931ae245f7",
"version": "v1.7.0",
"title": "Mobile beta",
"short_description": "The private beta is ready.",
"long_description": "Invitations are rolling out to the first customer cohort.",
"feature_ids": [
"f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f"
],
"is_draft": true,
"created_at": "2026-07-13T12:00:00.000Z",
"updated_at": "2026-07-13T12:00:00.000Z"
}
}Request
POST /api/releases
Authorization: Bearer ps_live_your_key
Accept: application/json
Content-Type: application/json
{
"version": "v1.7.0",
"title": "Mobile beta",
"short_description": "The private beta is ready.",
"long_description": "Invitations are rolling out to the first customer cohort.",
"feature_ids": [
"f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f"
],
"is_draft": true
}Success response
201 Created
{
"data": {
"id": "b6f1472f-2fc3-4dd9-b06e-c8931ae245f7",
"version": "v1.7.0",
"title": "Mobile beta",
"short_description": "The private beta is ready.",
"long_description": "Invitations are rolling out to the first customer cohort.",
"feature_ids": [
"f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f"
],
"is_draft": true,
"created_at": "2026-07-13T12:00:00.000Z",
"updated_at": "2026-07-13T12:00:00.000Z"
}
}Request
PUT /api/releases
Authorization: Bearer ps_live_your_key
Accept: application/json
Content-Type: application/json
{
"releaseId": "b6f1472f-2fc3-4dd9-b06e-c8931ae245f7",
"short_description": "The customer beta is ready.",
"feature_ids": [
"f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f"
],
"is_draft": false
}Success response
200 OK
{
"data": {
"id": "b6f1472f-2fc3-4dd9-b06e-c8931ae245f7",
"version": "v1.7.0",
"title": "Mobile beta",
"short_description": "The customer beta is ready.",
"long_description": "Invitations are rolling out to the first customer cohort.",
"feature_ids": [
"f5b5c8e1-cff5-4c3f-98ec-f951dc437e2f"
],
"is_draft": false,
"created_at": "2026-07-13T12:00:00.000Z",
"updated_at": "2026-07-13T12:00:00.000Z"
}
}Request
DELETE /api/releases?releaseId=b6f1472f-2fc3-4dd9-b06e-c8931ae245f7
Authorization: Bearer ps_live_your_key
Accept: application/jsonSuccess response
200 OK
{
"data": {
"releaseId": "b6f1472f-2fc3-4dd9-b06e-c8931ae245f7",
"deleted": true
}
}Request
POST /api/releases/send-changelog-email
Authorization: Bearer ps_live_your_key
Accept: application/json
Idempotency-Key: release-email:request-0001
Content-Type: application/json
{
"releaseId": "b6f1472f-2fc3-4dd9-b06e-c8931ae245f7",
"subject": "Mobile beta is ready",
"body": "The private beta is now available."
}Success response
202 Accepted
{
"data": {
"batchId": "2d84a58e-a9be-4d4b-b090-1bfd764d6219",
"status": "queued",
"recipientCount": 50
}
}Request
POST /api/releases/generate-changelog
Authorization: Bearer ps_live_your_key
Accept: application/json
Content-Type: application/json
{
"releaseId": "b6f1472f-2fc3-4dd9-b06e-c8931ae245f7",
"customPrompt": "Write in a friendly tone",
"existingChangelog": "Optional existing text to improve"
}Success response
200 OK
{
"changelog": "# v1.7.0 - Mobile beta\n\n## New features\n\n- The private mobile beta is ready for its first customer cohort.",
"remaining": 4,
"limit": 5
}Request
GET /api/projects
Authorization: Bearer ps_live_your_key
Accept: application/jsonSuccess response
200 OK
{
"data": {
"id": "3fc4d742-57ef-4d41-b22e-c0bdb43a0fd2",
"name": "Northstar",
"slug": "northstar",
"description": "Customer feedback for Northstar.",
"visibility": "public",
"statuses": [
{
"id": "97a8ad23-f482-49bb-88b9-716c5f41709d",
"name": "In progress",
"slug": "in-progress"
}
],
"tags": [
{
"id": "79d40fa1-cd6e-4018-8011-bd1af83f29ec",
"name": "Mobile",
"slug": "mobile"
}
]
}
}Request
GET /api/usage
Authorization: Bearer ps_live_your_key
Accept: application/jsonSuccess response
200 OK
{
"data": {
"upvotes": 318,
"featureRequests": 42,
"views": 1280,
"features": 42,
"releases": 8
}
}Collection endpoints return a stable opaque cursor. Pass the previous response's nextCursor value in the next request. The default page size is 50 and the maximum is 100.
GET /api/v1/projects/PROJECT_ID/features?limit=50&cursor=NEXT_CURSOR
{
"data": {
"features": [...],
"nextCursor": "opaque-value"
}
}Keys allow 100 requests per minute. Write endpoints also apply a limit of 10 requests per two minutes per key. Counters are coordinated in Supabase across Vercel instances. Every response includes limit, remaining, and reset headers. A 429 response includes Retry-After.
RateLimit-Limit: 100
RateLimit-Remaining: 97
RateLimit-Reset: 1752339660Webhook payloads are signed with HMAC-SHA256. Verify the raw request body before parsing JSON, reject stale timestamps, and make event processing idempotent by event ID.
X-PrioSmith-Signature: t=1752339600,v1=hex_digest
X-PrioSmith-Event: feature.status_changed
X-PrioSmith-Delivery: 019f...
{
"apiVersion": "2026-07-13",
"id": "019f...",
"type": "feature.status_changed",
"createdAt": "2026-07-13T12:00:00.000Z",
"workspaceId": "WORKSPACE_ID",
"projectId": "PROJECT_ID",
"data": { "objectType": "feature", "objectId": "FEATURE_ID" }
}Connect an MCP client to https://priosmith.com/api/mcp and send the same scoped API key as a Bearer token. The server supports initialization, ping, tool discovery, all twelve canonical management operations, and twenty-three collision-safe compatibility_ tools for the directly evidenced feature, voter, comment, release, project, usage, and changelog-generation operations above. Compatibility tools inherit the key's project boundary and do not accept a project override. Only tools allowed by every required key scope are advertised.
{
"mcpServers": {
"priosmith": {
"url": "https://priosmith.com/api/mcp",
"headers": {
"Authorization": "Bearer ps_live_your_key"
}
}
}
}The transport uses JSON responses without server-managed sessions or SSE. Never put an API key in browser code, a public repository, or a URL.
The repository includes the original-branded @priosmith/mcp-server package source. It forwards newline-delimited JSON-RPC from stdio to the same scoped /api/mcp service without printing credentials.
{
"mcpServers": {
"priosmith": {
"command": "node",
"args": [
"/absolute/path/to/priosmith/packages/priosmith-mcp/bin/priosmith-mcp.mjs"
],
"env": {
"PRIOSMITH_API_KEY": "ps_live_your_key",
"PRIOSMITH_API_URL": "https://priosmith.com/api/mcp"
}
}
}
}npx @priosmith/mcp-server until an owner publishes and verifies the package on npm.Errors use stable machine-readable codes. A request ID is safe to share with support; raw payloads, credentials, and customer PII are never included.
{
"error": {
"code": "BAD_REQUEST",
"message": "The request is invalid.",
"requestId": "req_019f..."
}
}