Skip to main content

Supporter Wall REST API

REST endpoints for the Supporter Wall feature.

When to use this instead of the shortcode. [benecaster_supporter_wall] is the right tool for a wall on a WordPress page, and the benecaster_supporter_wall_output filter covers most cases where you want to change how it looks. Reach for this endpoint when the wall has to render somewhere the shortcode cannot run — a headless front end, a React or Vue component, a mobile app, or another site entirely. It is public and unauthenticated, so it works from any origin without a nonce.


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",
      "message": "",
      "token_type": "subscriber"
    }
  ]
}

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 The subscriber’s resolved wall name — the name they set on their account page, falling back to first + last name, then their WordPress display name. There is no per-show name format setting; see How Names Are Resolved
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
message string The subscriber’s “Why I support” message, when the show has that field turned on and the subscriber wrote one; empty string otherwise
token_type string subscriber or follower. A follower’s badges include a { label: "Follower", source: "follower_auto" } chip alongside anything else the row has

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();

See Also

Need this built rather than just documented? See our services →