Skip to main content
Learn how to send messages to multiple users at once using smart lists and custom lists. This tutorial covers the two-step process: discovering your audience lists and sending targeted mass messages.

Overview

Mass messaging allows you to send a single message to many users efficiently. Instead of sending individual messages, you can target entire audience segments defined by:
  • Smart lists: Pre-built audience segments (subscribers, followers, expired subscribers, etc.)
  • Custom lists: User-created lists for custom audience targeting

The two-step flow

Step 1: Discover available lists
  • Fetch smart lists to see pre-built audience segments
  • Fetch custom lists to see user-created segments
  • Optionally fetch members to preview recipients
Step 2: Send the mass message
  • Select lists to include (required)
  • Optionally select lists to exclude
  • Send with text, media, or pay-to-view content

Authentication required

Mass messaging requires OAuth with these scopes:
  • write:chat - Send messages
  • read:fan - Read fan/subscriber data
See the OAuth Tutorial for setup instructions.

Prerequisites

  • OAuth authentication with required scopes (see note above)
  • Basic familiarity with REST APIs
  • Understanding of your Fanvue audience structure

Step 1: Discover your lists

Before sending a mass message, you need to know which lists are available. There are two types:

Smart lists (pre-built audiences)

Smart lists are automatically maintained audience segments based on user behaviour and relationships.

Fetch all smart lists

Response:
Each entry’s uuid is one of the fixed identifiers below. The key is named uuid for backward compatibility, but the value is a fixed identifier string, never a real UUID. Available smart list identifiers: These are a fixed, predefined set of lowercase string identifiers, not UUIDs, despite the uuid key above and the legacy smartListUuids field name used when sending a mass message:
  • subscribers - Users with an active subscription
  • auto_renewing - Subscribers whose subscription will auto-renew
  • non_renewing - Subscribers who have turned off auto-renew
  • followers - Users following you without an active subscription
  • free_trial_subscribers - Subscribers currently on a free trial
  • expired_subscribers - Users whose subscription has expired
  • spent_more_than_50 - Users who have spent more than $50
  • muted - Users you have muted
  • creators - Creators you have a chat with
Smart list identifiers are lowercase with underscores and come from the fixed set listed above. They are not UUIDs, do not build a UUID validator for smart list identifiers. Only customListUuids accepts real UUIDs.

Preview smart list members (optional)

Response:

Custom lists (user-created audiences)

Custom lists are manually created segments for specific targeting.

Fetch all custom lists

Response:

Preview custom list members (optional)

Response structure is the same as smart list members.

TypeScript example: fetching lists

Step 2: Send mass messages

Once you know your available lists, you can send a mass message to one or more lists.

Basic mass message request

Response:

Request schema

Smart list values are fixed identifier strings, not UUIDs. The field accepts a fixed, predefined set of lowercase string identifiers (the same field on excludedLists behaves identically). Do not generate, validate against, or expect UUID values here, sending a UUID will be rejected. Only customListUuids accepts real UUIDs (those returned by the custom-lists endpoint).The complete set of accepted smart list identifiers is:
  • subscribers, users with an active subscription
  • auto_renewing, subscribers whose subscription will auto-renew
  • non_renewing, subscribers who have turned off auto-renew
  • followers, users following you without an active subscription
  • free_trial_subscribers, subscribers currently on a free trial
  • expired_subscribers, users whose subscription has expired
  • spent_more_than_50, users who have spent more than $50
  • muted, users you have muted
  • creators, creators you have a chat with
These are the only valid values; any other string is rejected.
smartListIds is the current field name. It replaced smartListUuids, which was misleading because the values were never UUIDs. smartListUuids is retained as a deprecated alias and is still accepted on includedLists and excludedLists, so existing integrations keep working, but new code should send smartListIds. If both are present, smartListIds wins. Responses echo both fields for backward compatibility; smartListUuids will be removed in a future API version.
Validation rules:
  • Must provide either text or mediaUuids (or both)
  • At least one list must be included
  • If price is set, mediaUuids must be provided
  • Price must be in cents (e.g., 999 = $9.99) with a minimum of 200 (i.e., $2.00)
  • Smart list identifiers are lowercase (e.g., "subscribers", not "SUBSCRIBERS")

Practical examples

Example 1: Send to all subscribers

Example 2: Send to multiple lists

Target both active and expired subscribers:

Example 3: Send to custom list with exclusions

Send to VIP list but exclude users who already received a similar message:

Example 4: Send pay-to-view message with media

Send a message with media that requires payment to unlock:
Price is specified in cents. In this example, 999 represents $9.99. Minimum price is 200 cents ($2.00).

Example 5: Combine smart and custom lists

Complete TypeScript implementation

Here’s a full example combining list discovery and mass messaging:

Best practices

1. Start small

When testing, start with a small custom list or use the preview feature to understand your audience:

2. Handle rate limits

The mass messages endpoint has rate limits. Handle them gracefully:

3. Validate before sending

4. Track send history

Store mass message results for analytics:

Troubleshooting

”At least one list must be provided”

Ensure you’re providing at least one list in includedLists:

“Smart list not found”

Smart list identifiers must be lowercase:

403 Forbidden error

Verify you have the required OAuth scopes:
  • write:chat
  • read:fan
Check your OAuth configuration includes both scopes.

Empty recipientCount

If recipientCount is 0, the lists might be empty or exclusions removed all recipients:

Additional resources