Skip to main content

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 SupporterWallQuery internally — 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 404 means the wall feature is disabled for the show. An empty items array with 200 means the wall is enabled but no subscribers have opted in. These are distinct states — don’t treat a 404 as “no supporters.”
  • avatar_url is null (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();