GET /ideabanks/{ideaBankId}/panelists/{panelistId}
Retrieve ideabank panelist capabilities and generate a secure URL for directing panelists to an idea bank.
Request
GET /tenant/ideabanks/{ideaBankId}/panelists/{panelistId}
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| ideaBankId | string | The idea bank ID (from your Votito dashboard) |
| panelistId | string | Your unique identifier for the panelist (e.g., customer ID, email hash) |
Headers
| Header | Required | Description |
|---|---|---|
| X-API-Key | Yes | Your API key |
Response
{
"ideaBank": {
"status": "OPEN",
"title": "Product Ideas"
},
"panelist": {
"canVote": true,
"canSubmitProposal": true,
"publicKey": "abc123:xyz789:ses456",
"hostedIdeaBankUrl": "https://www.votito.com/public/ideabank/?key=abc123%3Axyz789%3Ases456"
}
}
Response Fields
ideaBank object
| Field | Type | Description |
|---|---|---|
| status | string | Idea bank status: “OPEN” |
| title | string | Idea bank title |
panelist object
| Field | Type | Description |
|---|---|---|
| canVote | boolean | Whether the panelist can vote on proposals |
| canSubmitProposal | boolean | Whether the panelist can submit new proposals |
| publicKey | string | Compound token for Panelist API authentication |
| hostedIdeaBankUrl | string | Ready-to-use URL for the panelist to access the idea bank |
Examples
cURL
curl -X GET \
"https://api.votito.com/tenant/ideabanks/bank-123/panelists/customer-456" \
-H "X-API-Key: vtt_your_api_key"
JavaScript
const getIdeaBankAccess = async (ideaBankId, panelistId) => {
const response = await fetch(
`https://api.votito.com/tenant/ideabanks/${ideaBankId}/panelists/${panelistId}`,
{
headers: { 'X-API-Key': process.env.VOTITO_API_KEY }
}
);
if (!response.ok) {
throw new Error(`API error: ${response.status}`);
}
return response.json();
};
// Usage
const { panelist, ideaBank } = await getIdeaBankAccess('bank-123', 'customer-456');
console.log(`Idea bank URL: ${panelist.hostedIdeaBankUrl}`);
Python
import requests
import os
def get_ideabank_access(ideabank_id, panelist_id):
response = requests.get(
f"https://api.votito.com/tenant/ideabanks/{ideabank_id}/panelists/{panelist_id}",
headers={"X-API-Key": os.environ["VOTITO_API_KEY"]}
)
response.raise_for_status()
return response.json()
# Usage
data = get_ideabank_access("bank-123", "customer-456")
print(f"Idea bank URL: {data['panelist']['hostedIdeaBankUrl']}")
Common Use Cases
Idea Bank Distribution
Generate unique idea bank URLs for each panelist in your CRM:
const response = await fetch(
`https://api.votito.com/tenant/ideabanks/${ideaBankId}/panelists/${customerId}`,
{ headers: { 'X-API-Key': apiKey } }
);
const { panelist } = await response.json();
// Send panelist.hostedIdeaBankUrl to your customer
sendEmail(customer.email, panelist.hostedIdeaBankUrl);
Embedding in an IFrame
Render the idea bank directly in your application:
<iframe
src="https://www.votito.com/public/ideabank/?key=abc123%3Axyz789%3Ases456"
width="100%"
height="600"
frameborder="0">
</iframe>
Error Handling
| Status | Error | Description |
|---|---|---|
| 403 | Forbidden | Missing or invalid API key |
| 404 | idea_bank_not_found | Idea bank does not exist, is closed, or is internal |
Notes
Panelist ID Best Practices
- Use stable, unique identifiers (customer IDs, hashed emails)
- Avoid personally identifiable information in plain text
- Keep IDs consistent across requests for accurate activity tracking
URL Expiration
The hostedIdeaBankUrl does not expire. The publicKey is valid as long as the idea bank remains OPEN with a panelist-accessible access level.
Access Levels
The endpoint only returns a successful response when the idea bank is OPEN and its access level allows panelist access. Idea banks with internal access level, or idea banks that are closed, return a 404 response.
The canVote and canSubmitProposal fields reflect the capabilities defined by the idea bank’s access level:
| Access Level | canVote | canSubmitProposal |
|---|---|---|
| open_voting | true | true |
| closed_voting | true | false |
| suggestion_box | false | true |