curl --request PATCH \
--url https://{your-subdomain}.neetoengage.com/api/external/v1/feature_requests/{id}/track \
--header 'Accept: <accept>' \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--data '
{
"track_id": "7c1d9e52-0a4b-4f38-8e6d-93b5a2f4c107",
"message": "<p>This shipped today.</p>",
"notify_all_voters": true,
"changelog_id": "d4a2b6f0-9c13-4e85-a7d1-58e3c0b9f216",
"operation_key": "release-2026-03-move-120"
}
'const options = {
method: 'PATCH',
headers: {
'X-Api-Key': '<x-api-key>',
Accept: '<accept>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
track_id: '7c1d9e52-0a4b-4f38-8e6d-93b5a2f4c107',
message: '<p>This shipped today.</p>',
notify_all_voters: true,
changelog_id: 'd4a2b6f0-9c13-4e85-a7d1-58e3c0b9f216',
operation_key: 'release-2026-03-move-120'
})
};
fetch('https://{your-subdomain}.neetoengage.com/api/external/v1/feature_requests/{id}/track', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{your-subdomain}.neetoengage.com/api/external/v1/feature_requests/{id}/track"
payload = {
"track_id": "7c1d9e52-0a4b-4f38-8e6d-93b5a2f4c107",
"message": "<p>This shipped today.</p>",
"notify_all_voters": True,
"changelog_id": "d4a2b6f0-9c13-4e85-a7d1-58e3c0b9f216",
"operation_key": "release-2026-03-move-120"
}
headers = {
"X-Api-Key": "<x-api-key>",
"Accept": "<accept>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text){
"feature_request": {
"id": "5f0f3c2e-8d1b-4c53-9a6e-2b7d41c9e8a1",
"title": "Export roadmap as CSV",
"url": "https://spinkart.neetoengage.com/feature-requests/120-export-roadmap-as-csv",
"admin_url": "https://spinkart.neetoengage.com/admin/feature-requests/120-export-roadmap-as-csv",
"status": "Shipped",
"track": "Shipped",
"votes_count": 15,
"created_at": "2026-03-02T10:15:30Z"
}
}{
"error": "Could not authenticate, invalid API Key"
}{
"error": "Track does not exist."
}{
"error": "param is missing or the value is empty or invalid: track_id"
}Move a feature request to a track
Moves a feature request to another track and records the move in its activity log. PUT works the same as PATCH.
Set notify_all_voters to true to email every subscribed voter. If you leave out message, the default “now live” email is sent. Pass changelog_id to attach a changelog to the feature request and link it in that email. Get track ids from List tracks and changelog ids from List changelogs.
Send an operation_key to make the call safe to retry. See Idempotency.
curl --request PATCH \
--url https://{your-subdomain}.neetoengage.com/api/external/v1/feature_requests/{id}/track \
--header 'Accept: <accept>' \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--data '
{
"track_id": "7c1d9e52-0a4b-4f38-8e6d-93b5a2f4c107",
"message": "<p>This shipped today.</p>",
"notify_all_voters": true,
"changelog_id": "d4a2b6f0-9c13-4e85-a7d1-58e3c0b9f216",
"operation_key": "release-2026-03-move-120"
}
'const options = {
method: 'PATCH',
headers: {
'X-Api-Key': '<x-api-key>',
Accept: '<accept>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
track_id: '7c1d9e52-0a4b-4f38-8e6d-93b5a2f4c107',
message: '<p>This shipped today.</p>',
notify_all_voters: true,
changelog_id: 'd4a2b6f0-9c13-4e85-a7d1-58e3c0b9f216',
operation_key: 'release-2026-03-move-120'
})
};
fetch('https://{your-subdomain}.neetoengage.com/api/external/v1/feature_requests/{id}/track', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{your-subdomain}.neetoengage.com/api/external/v1/feature_requests/{id}/track"
payload = {
"track_id": "7c1d9e52-0a4b-4f38-8e6d-93b5a2f4c107",
"message": "<p>This shipped today.</p>",
"notify_all_voters": True,
"changelog_id": "d4a2b6f0-9c13-4e85-a7d1-58e3c0b9f216",
"operation_key": "release-2026-03-move-120"
}
headers = {
"X-Api-Key": "<x-api-key>",
"Accept": "<accept>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text){
"feature_request": {
"id": "5f0f3c2e-8d1b-4c53-9a6e-2b7d41c9e8a1",
"title": "Export roadmap as CSV",
"url": "https://spinkart.neetoengage.com/feature-requests/120-export-roadmap-as-csv",
"admin_url": "https://spinkart.neetoengage.com/admin/feature-requests/120-export-roadmap-as-csv",
"status": "Shipped",
"track": "Shipped",
"votes_count": 15,
"created_at": "2026-03-02T10:15:30Z"
}
}{
"error": "Could not authenticate, invalid API Key"
}{
"error": "Track does not exist."
}{
"error": "param is missing or the value is empty or invalid: track_id"
}{your-subdomain} with your workspace’s subdomain. Learn how to find your subdomain in Workspace subdomain.
Headers
API key. Refer to Authentication for more information.
Must be application/json.
application/json Path Parameters
The feature request's id (UUID) or its slug. The slug is the last segment of the feature request's admin URL, for example 120-export-roadmap-as-csv. Both are accepted.
Body
Track to move the feature request to.
"7c1d9e52-0a4b-4f38-8e6d-93b5a2f4c107"
HTML body of the status update shown in the activity log and, when notify_all_voters is true, emailed to voters.
"<p>This shipped today.</p>"
Email the status update to every subscribed voter.
true
Changelog to attach to the feature request.
"d4a2b6f0-9c13-4e85-a7d1-58e3c0b9f216"
Retry token. See Idempotency.
"release-2026-03-move-120"
Response
The feature request was moved.
Hide child attributes
Hide child attributes
Unique identifier of the feature request.
"5f0f3c2e-8d1b-4c53-9a6e-2b7d41c9e8a1"
Title of the feature request. Public on the roadmap.
"Export roadmap as CSV"
Public URL of the feature request on the roadmap.
"https://spinkart.neetoengage.com/feature-requests/120-export-roadmap-as-csv"
URL of the feature request in the NeetoEngage admin panel.
"https://spinkart.neetoengage.com/admin/feature-requests/120-export-roadmap-as-csv"
Name of the public roadmap lane the feature request is shown in. null when the feature request's track does not map to a public lane.
"Under consideration"
Name of the track the feature request is on.
"Backlog"
Number of votes on the feature request.
1
Time the feature request was created.
"2026-03-02T10:15:30Z"