GET /feature-requests
List feature requests for a session
Returns the feature_requests array stored on the given session document. Public endpoint — no PAT required.
Authentication
[]
Request, responses and operation details
{
"summary": "List feature requests for a session",
"description": "Returns the feature_requests array stored on the given session document. Public endpoint — no PAT required.",
"security": [],
"parameters": [
{
"in": "query",
"name": "sessionId",
"required": true,
"schema": {
"type": "string"
},
"example": "sess_abc123",
"description": "The session document ID whose feature_requests array should be returned"
}
],
"responses": {
"200": {
"description": "Array of feature request objects stored on the session",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/LegacyFeatureRequest"
}
}
}
}
},
"400": {
"description": "sessionId query parameter is missing"
},
"404": {
"description": "Session not found"
}
}
}
PATCH /feature-requests/{id}
Update the status of a session feature request
Maps newStatusNumber to a human-readable status string and writes it to current_status on the matching feature request in the session's feature_requests array.
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Update the status of a session feature request",
"description": "Maps newStatusNumber to a human-readable status string and writes it to current_status on the matching feature request in the session's feature_requests array.",
"parameters": [
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
},
"example": "fr-0001",
"description": "The id of the feature request inside the session's feature_requests array"
},
{
"in": "query",
"name": "sessionId",
"required": true,
"schema": {
"type": "string"
},
"example": "sess_abc123",
"description": "The session document ID that owns the feature request"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UpdateFeatureRequestStatusBody"
}
}
}
},
"responses": {
"200": {
"description": "Feature request updated",
"content": {
"text/plain": {
"schema": {
"type": "string",
"example": "Feature request updated"
}
}
}
},
"400": {
"description": "Missing required parameters or invalid newStatusNumber"
},
"404": {
"description": "Session or feature request not found"
}
}
}
GET /feature_requests
List community feature requests (the customer product-ideas board)
Customer-submitted product ideas for this instance, with name, productArea (UI/UX, Performance, Security, Integrations, API, Analytics, Admin, Notifications), currentStatus New → Under Review → Planned → In Progress → Delivered/Declined, vote count, submitter and moderator. This is the public wish-list board — committed delivery plans live in the roadmap app and support tickets in itsm. Supports server-side OData querying — _filter, _orderby, _select, _search, _top, _skip, _count (the spec names these $filter etc.; MCP clients see the _ form because $ is not a legal tool-input key).
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List community feature requests (the customer product-ideas board)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/FeatureRequest"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
},
"description": "Customer-submitted product ideas for this instance, with name, productArea (UI/UX, Performance, Security, Integrations, API, Analytics, Admin, Notifications), currentStatus New → Under Review → Planned → In Progress → Delivered/Declined, vote count, submitter and moderator. This is the public wish-list board — committed delivery plans live in the roadmap app and support tickets in itsm. Supports server-side OData querying — _filter, _orderby, _select, _search, _top, _skip, _count (the spec names these $filter etc.; MCP clients see the _ form because $ is not a legal tool-input key)."
}
POST /feature_requests
Submit a community feature request (new product idea)
Adds an idea to the community board with a name, product area, submitter and starting status. Use it for wish-list requests only — bugs and support issues belong in the itsm app.
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Submit a community feature request (new product idea)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/FeatureRequest"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/FeatureRequest"
}
}
}
}
},
"description": "Adds an idea to the community board with a name, product area, submitter and starting status. Use it for wish-list requests only — bugs and support issues belong in the itsm app."
}
PATCH /feature_requests/{id}
Update a community feature request (triage status, votes, moderator)
Partial update of one idea on the board — most often moving currentStatus through triage (New → Under Review → Planned → In Progress → Delivered/Declined), incrementing votes, or assigning a moderator. Send only the fields you want to change.
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Update a community feature request (triage status, votes, moderator)",
"description": "Partial update of one idea on the board — most often moving currentStatus through triage (New → Under Review → Planned → In Progress → Delivered/Declined), incrementing votes, or assigning a moderator. Send only the fields you want to change.",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"description": "Fields to update (partial)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/FeatureRequest"
}
}
}
},
"responses": {
"200": {
"description": "Updated",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/FeatureRequest"
}
}
}
},
"404": {
"description": "Not found"
}
}
}