GET /ideabank
Load an idea bank for display to a panelist. Returns the idea bank metadata plus a set of capability flags derived from the idea bank’s access level and feature configuration. Use the capability flags to decide which interface elements (proposal list, vote buttons, proposal form, comments, changelog, roadmap) to render.
Request
GET /public/ideabank
Headers
| Header | Required | Description |
|---|---|---|
| Authorization | Yes | Compound idea-bank token from Tenant API |
The token is the publicKey returned by the Tenant API’s ideabank panelist access endpoint. It encodes the tenant, the idea bank, and the panelist, so no path parameters are required.
Response
{
"title": "Product Ideas",
"description": "Tell us what to build next.",
"canViewProposals": true,
"canVote": true,
"canSubmitProposal": true,
"canComment": true,
"canViewChangelog": true,
"canViewRoadmap": true,
"proposalCount": 42,
"proposalFormLabels": {
"title": "Your idea",
"description": "Tell us more"
},
"contactInfoCollection": {
"label": "email",
"prompt": "Leave your email so we can follow up"
},
"existingContactInfo": "panelist@example.com",
"roadmapSubtitle": "What we are working on",
"roadmapTags": ["planned", "in-progress", "shipped"],
"changelogSubtitle": "Recently shipped"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| title | string | Idea bank title (always present) |
| description | string | Idea bank description (present only when the panelist can access proposals) |
| canViewProposals | boolean | Whether the panelist may list proposals |
| canVote | boolean | Whether the panelist may vote on proposals |
| canSubmitProposal | boolean | Whether the panelist may submit new proposals |
| canComment | boolean | Whether the panelist may read and post comments |
| canViewChangelog | boolean | Whether the published changelog is available |
| canViewRoadmap | boolean | Whether the published roadmap is available |
| proposalCount | integer | Number of proposals in the idea bank (present only when the panelist can access proposals) |
| proposalFormLabels | object | (Optional) Custom labels for the proposal submission form |
| contactInfoCollection | object | (Optional) Prompt configuration when the idea bank collects contact info with submissions |
| existingContactInfo | string | (Optional) Contact info the panelist previously provided, for pre-filling the form |
| roadmapSubtitle | string | (Optional) Subtitle to show above the roadmap, present only when canViewRoadmap is true |
| roadmapTags | array | (Optional) Ordered list of roadmap tag values, present only when canViewRoadmap is true |
| changelogSubtitle | string | (Optional) Subtitle to show above the changelog, present only when canViewChangelog is true |
Capability Gating
The capability flags are the authoritative source for what the panelist may do. They are computed from the idea bank’s access level (suggestion_box, closed_voting, open_voting, community_forum) and its feature configuration. The access level maps to capabilities as follows:
| Access Level | canViewProposals | canVote | canSubmitProposal | canComment |
|---|---|---|---|---|
| suggestion_box | false | false | true | false |
| closed_voting | true | true | false | false |
| open_voting | true | true | true | false |
| community_forum | true | true | true | true |
canViewChangelog and canViewRoadmap are independent of the access level; they are true when the corresponding feature is enabled on an open idea bank.
When a capability is false, the matching endpoint either returns an empty result or a 404. For example, calling list proposals when canViewProposals is false returns an empty items array rather than data. Always gate your UI on these flags rather than calling endpoints speculatively.
When the panelist has no proposal access at all (the access level forbids it), description, proposalCount, and the proposal-related capability flags are omitted. The response still includes canViewChangelog and canViewRoadmap so a changelog-only or roadmap-only idea bank can be rendered.
Examples
cURL
curl -X GET \
"https://api.votito.com/public/ideabank" \
-H "Authorization: abc123:xyz789:ses456"
JavaScript
const loadIdeaBank = async (publicKey) => {
const response = await fetch('https://api.votito.com/public/ideabank', {
headers: { 'Authorization': publicKey }
});
if (!response.ok) {
throw new Error(`Failed to load idea bank: ${response.status}`);
}
return response.json();
};
// Usage - gate the UI on capabilities
const ideaBank = await loadIdeaBank(publicKey);
if (ideaBank.canViewProposals) {
renderProposalList();
}
if (ideaBank.canSubmitProposal) {
renderProposalForm(ideaBank.proposalFormLabels);
}
Python
import requests
def load_idea_bank(public_key):
response = requests.get(
"https://api.votito.com/public/ideabank",
headers={"Authorization": public_key}
)
response.raise_for_status()
return response.json()
# Usage
idea_bank = load_idea_bank(public_key)
if idea_bank["canComment"]:
enable_comments()
Error Handling
| Status | Error | Description |
|---|---|---|
| 401 | Unauthorized | Missing or invalid token |
| 403 | Forbidden | Token expired or malformed |
| 404 | idea-bank-not-found | Idea bank is closed, or the panelist has no access and neither the changelog nor the roadmap is available |
Notes
- The token already identifies the idea bank, so there is no
ideaBankIdpath parameter on the Panelist API. existingContactInfois returned only when the idea bank collects contact info and the panelist has previously supplied it.- Cache the capability flags for the session, but reload the idea bank if you suspect its status changed.