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, or the id is not a published show (a draft, scheduled, private or trashed show, or not a show at all), which answers 404 rest_not_found Show not found. whatever the wall switch says. 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 →