Supporter Wall REST API
REST endpoints for the Supporter Wall feature. Ships in feature/internal-membership-supporter-wall.
GET /benecaster/v1/shows/{id}/supporter-wall
Returns the list of opted-in subscribers for a show’s Supporter Wall. This endpoint is public — no authentication required.
Auth: None (permission_callback => '__return_true').
Path parameter:
| Param | Type | Description |
|---|---|---|
{id} |
int | Show post ID |
Query parameters:
| Param | Type | Default | Description |
|---|---|---|---|
limit |
int | 100 | Maximum rows to return. Values above 500 are clamped to 500 |
tier |
string | (all) | Filter by a single tier_slug |
order |
string | (show setting) | Override sort order: join_date, tier, or alphabetical |
Response — wall enabled, subscribers opted in (200):
{
"items": [
{
"user_id": 42,
"display_name": "Jane Smith",
"avatar_url": "https://yoursite.com/wp-content/uploads/benecaster/avatars/42.jpg",
"badges": [
{
"label": "Gold Member",
"color": "#F5A623",
"icon_svg": "<svg …>…</svg>",
"icon_attachment_url": null,
"source": "tier_auto"
}
],
"joined_at": "2026-03-15T12:00:00Z"
}
]
}
Response — wall enabled, no opted-in subscribers (200):
{
"items": []
}
Response — wall disabled (404):
{
"code": "rest_not_found",
"message": "Supporter Wall is not enabled for this show.",
"data": { "status": 404 }
}
Response fields:
| Field | Type | Description |
|---|---|---|
user_id |
int | WordPress user ID |
display_name |
string | Display name per the show’s configured display name format (display name / username / first name only) |
avatar_url |
string|null | Full URL to the subscriber’s uploaded avatar; null when no avatar has been uploaded |
badges |
array | Badge chip array produced by BadgeChipRenderer::serialize_for_rest(). May be empty |
badges[].label |
string | Badge display label |
badges[].color |
string | Hex color string |
badges[].icon_svg |
string | Inline SVG markup (non-empty for built-in icon slugs) |
badges[].icon_attachment_url |
string|null | URL to uploaded icon image (non-empty for custom uploaded icons) |
badges[].source |
string | tier_auto (auto-assigned by tier) or manual (admin-assigned) |
joined_at |
string | ISO 8601 UTC timestamp of when the subscriber joined |
Notes:
- The endpoint uses
SupporterWallQueryinternally — the result set is identical to what[benecaster_supporter_wall]renders. Query parameters (limit,tier,order) behave the same as the shortcode attributes. - 404 vs empty 200: A
404means the wall feature is disabled for the show. An emptyitemsarray with200means the wall is enabled but no subscribers have opted in. These are distinct states — don’t treat a 404 as “no supporters.” avatar_urlisnull(not a placeholder URL) when no avatar has been uploaded. Rendering code should handle null by displaying an initials-based fallback.
Example — headless React component:
const res = await fetch( `/wp-json/benecaster/v1/shows/${showId}/supporter-wall` );
if ( res.status === 404 ) return null; // wall disabled
const { items } = await res.json();