GET /ideabank/changelog
List the idea bank’s published changelog — the proposals that have shipped (status implemented), newest-first. Only the fields needed to display a public changelog are returned; scores, votes, comments, and internal identifiers are never exposed.
The changelog is a fixed top-N list: it returns at most the configured maximum number of entries in a single response. It is not paginated — no cursor is accepted and none is returned.
Capability Gate
This endpoint is gated by canViewChangelog, which is true only when the idea bank is OPENand the changelog has been enabled for it. When the gate is closed the endpoint responds with 404 (the idea bank is indistinguishable from one that does not exist).
canViewChangelog is independent of proposal-viewing access. A panelist can be allowed to read the changelog of an internal idea bank (one whose proposals, voting, and comments are not panelist-accessible) using the same token. The single compound token drives every Panelist API surface; the per-surface capabilities are reported by GET /ideabank.
Request
GET /public/ideabank/changelog
Headers
| Header | Required | Description |
|---|---|---|
| Authorization | Yes | Compound token from Tenant API |
This endpoint takes no query parameters. Any cursor or limit parameter is ignored — the response size is fixed by the idea bank’s configured maximum.
Response
{
"items": [
{
"title": "Dark mode",
"description": "A full dark theme across the dashboard and reports.",
"lastModified": 1718524800
},
{
"title": "CSV export",
"description": "Export any report to CSV from the toolbar.",
"lastModified": 1718265600
}
]
}
Response Fields
| Field | Type | Description |
|---|---|---|
| items | array | Implemented proposals, newest-first (see below) |
Item Object
| Field | Type | Description |
|---|---|---|
| title | string | Proposal title |
| description | string | Proposal description |
| lastModified | integer | Unix timestamp (seconds) of the proposal’s last activity |
Only title, description, and lastModified are returned. Proposal IDs, status, vote counts, comment counts, and scores are never included.
Ordering and Cap
- Items are sorted by activity, newest-first (most recently shipped at the top).
- The list is capped at the idea bank’s configured changelog maximum (default
10, hard maximum50). Proposals beyond the cap are omitted. - There is no pagination: the response never contains a
cursor, and supplying one has no effect.
Examples
cURL
curl -X GET \
"https://api.votito.com/public/ideabank/changelog" \
-H "Authorization: abc123:xyz789:ses456"
JavaScript
const loadChangelog = async (publicKey) => {
const response = await fetch('https://api.votito.com/public/ideabank/changelog', {
headers: { 'Authorization': publicKey }
});
if (!response.ok) {
throw new Error(`Failed to load changelog: ${response.status}`);
}
return response.json();
};
// Usage
const { items } = await loadChangelog(publicKey);
items.forEach((entry) => {
const shippedOn = new Date(entry.lastModified * 1000);
console.log(`${entry.title} — ${shippedOn.toLocaleDateString()}`);
});
Python
import requests
def load_changelog(public_key):
response = requests.get(
"https://api.votito.com/public/ideabank/changelog",
headers={"Authorization": public_key}
)
response.raise_for_status()
return response.json()
# Usage
data = load_changelog(public_key)
for entry in data["items"]:
print(f"{entry['title']} (updated {entry['lastModified']})")
Error Handling
| Status | Error | Description |
|---|---|---|
| 401 | Unauthorized | Missing or invalid authorization token |
| 404 | idea-bank-not-found | Idea bank does not exist, is closed, or changelog is disabled |
Notes
- Use GET /ideabank to read
canViewChangelogand the optionalchangelogSubtitlebefore rendering a changelog view. - Because the changelog is capped and unpaginated, render the full
itemsarray directly; there is no “load more” flow.