curl --request POST \
--url https://{your-subdomain}.neetoengage.com/api/external/v1/feature_requests/{id}/upvotes \
--header 'Accept: <accept>' \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--data '
{
"reference_note": {
"body": "<p>Raised on a support call. See conversation 4821.</p>",
"author_email": "oliver@example.com"
},
"customer": {
"email": "sam@example.com",
"name": "Sam Smith"
},
"operation_key": "support-ticket-4822-vote"
}
'const options = {
method: 'POST',
headers: {
'X-Api-Key': '<x-api-key>',
Accept: '<accept>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
reference_note: {
body: JSON.stringify('<p>Raised on a support call. See conversation 4821.</p>'),
author_email: 'oliver@example.com'
},
customer: {email: 'sam@example.com', name: 'Sam Smith'},
operation_key: 'support-ticket-4822-vote'
})
};
fetch('https://{your-subdomain}.neetoengage.com/api/external/v1/feature_requests/{id}/upvotes', 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}/upvotes"
payload = {
"reference_note": {
"body": "<p>Raised on a support call. See conversation 4821.</p>",
"author_email": "oliver@example.com"
},
"customer": {
"email": "sam@example.com",
"name": "Sam Smith"
},
"operation_key": "support-ticket-4822-vote"
}
headers = {
"X-Api-Key": "<x-api-key>",
"Accept": "<accept>",
"Content-Type": "application/json"
}
response = requests.post(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": "Under consideration",
"track": "Backlog",
"votes_count": 15,
"created_at": "2026-03-02T10:15:30Z"
},
"vote_registered": true,
"already_voted": false
}{
"error": "Could not authenticate, invalid API Key"
}{
"error": "FeatureRequest does not exist."
}Add a voter to a feature request
Records a customer’s vote on a feature request and attaches a private note for your team. If the customer has already voted, no second vote is added and already_voted is true. The note is added on every call. When customer is left out, only the note is added.
Send an operation_key to make the call safe to retry. See Idempotency.
curl --request POST \
--url https://{your-subdomain}.neetoengage.com/api/external/v1/feature_requests/{id}/upvotes \
--header 'Accept: <accept>' \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--data '
{
"reference_note": {
"body": "<p>Raised on a support call. See conversation 4821.</p>",
"author_email": "oliver@example.com"
},
"customer": {
"email": "sam@example.com",
"name": "Sam Smith"
},
"operation_key": "support-ticket-4822-vote"
}
'const options = {
method: 'POST',
headers: {
'X-Api-Key': '<x-api-key>',
Accept: '<accept>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
reference_note: {
body: JSON.stringify('<p>Raised on a support call. See conversation 4821.</p>'),
author_email: 'oliver@example.com'
},
customer: {email: 'sam@example.com', name: 'Sam Smith'},
operation_key: 'support-ticket-4822-vote'
})
};
fetch('https://{your-subdomain}.neetoengage.com/api/external/v1/feature_requests/{id}/upvotes', 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}/upvotes"
payload = {
"reference_note": {
"body": "<p>Raised on a support call. See conversation 4821.</p>",
"author_email": "oliver@example.com"
},
"customer": {
"email": "sam@example.com",
"name": "Sam Smith"
},
"operation_key": "support-ticket-4822-vote"
}
headers = {
"X-Api-Key": "<x-api-key>",
"Accept": "<accept>",
"Content-Type": "application/json"
}
response = requests.post(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": "Under consideration",
"track": "Backlog",
"votes_count": 15,
"created_at": "2026-03-02T10:15:30Z"
},
"vote_registered": true,
"already_voted": false
}{
"error": "Could not authenticate, invalid API Key"
}{
"error": "FeatureRequest does not exist."
}{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
A private note for the team. Customers never see it.
Hide child attributes
Hide child attributes
Body of the note. HTML is accepted.
"<p>Raised on a support call. See conversation 4821.</p>"
Email of the team member the note is attributed to. If it does not match a team member, the note is attributed to the workspace's oldest team member.
"oliver@example.com"
The customer who asked for the feature. The customer is found by email, or created if they do not exist, and is recorded as a voter.
Retry token. See Idempotency.
"support-ticket-4822-vote"
Response
The call succeeded. Check vote_registered and already_voted for the outcome.
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"
true when this call added a new vote.
true
true when the customer had already voted, so no vote was added.
false