Fansly API LogoFansly API
Mass messaging

Send Mass Message

Send a Mass message to multiple fans at once.

Send a broadcast message to multiple fans at once. Supports attaching media with PPV, subscription, follow, list, or limited-time access rules, scheduling the send for later, and including or excluding specific audience segments.

https://v1.apifansly.com/api/fansly
POST
/{account_id}/mass-messaging

Get Started

All requests to the Fansly API require an API Key. See the Authentication page for details.

curl -X POST "https://v1.apifansly.com/api/fansly/{account_id}/mass-messaging" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "message_content",
    "mediaIds": ["media_id"],
    "access_type": ["ppv"],
    "price": 10.00, // $10.00
    "scheduledFor": time_in_ms
  }'
fetch("https://v1.apifansly.com/api/fansly/{account_id}/mass-messaging", {
  method: "POST",
  headers: {
    "x-api-key": "YOUR_API_KEY",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    content: "message_content",
    mediaIds: ["media_id"],
    access_type: ["ppv"],
    price: 10.00, // $10.00
    scheduledFor: time_in_ms
  })
})
import requests

url = "https://v1.apifansly.com/api/fansly/{account_id}/mass-messaging"
headers = {
    "x-api-key": "YOUR_API_KEY",
    "Content-Type": "application/json"
}
payload = {
    "content": "message_content",
    "mediaIds": ["media_id"],
    "access_type": ["ppv"],
    "price": 10.00, // $10.00
    "scheduledFor": time_in_ms
}

response = requests.post(url, headers=headers, json=payload)
print(response.json())
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

HttpClient client = HttpClient.newHttpClient();

String requestBody = "{\"content\":\"message_content\",\"mediaIds\":[\"media_id\"],\"access_type\":[\"ppv\"],\"price\":10.00,\"scheduledFor\":time_in_ms}";

HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://v1.apifansly.com/api/fansly/{account_id}/mass-messaging"))
        .header("x-api-key", "YOUR_API_KEY")
        .header("Content-Type", "application/json")
        .POST(HttpRequest.BodyPublishers.ofString(requestBody))
        .build();

client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
        .thenApply(HttpResponse::body)
        .thenAccept(System.out::println)
        .join();
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY");

var jsonBody = "{\"content\":\"message_content\",\"mediaIds\":[\"media_id\"],\"access_type\":[\"ppv\"],\"price\":10.00,\"scheduledFor\":time_in_ms}";
var content = new StringContent(jsonBody, Encoding.UTF8, "application/json");

var response = await client.PostAsync("https://v1.apifansly.com/api/fansly/{account_id}/mass-messaging", content);
var responseString = await response.Content.ReadAsStringAsync();

Console.WriteLine(responseString);
package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    url := "https://v1.apifansly.com/api/fansly/{account_id}/mass-messaging"
    payload := []byte(`{"content":"message_content","mediaIds":["media_id"],"access_type":["ppv"],"price":10.00,"scheduledFor":time_in_ms}`)

    req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload))
    req.Header.Set("x-api-key", "YOUR_API_KEY")
    req.Header.Set("Content-Type", "application/json")

    client := &http.Client{}
    resp, _ := client.Do(req)
    defer resp.Body.Close()

    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}

Path Parameters

account_id*
string
The unique identifier for the connected account.

Request Body

Message

content*
string
The text content of the broadcast message.
mediaIds ?
array
Array of uploaded media IDs, or objects in the form {mediaId: ... and previewId (if needed, otherwise null)}, to attach to the message.
scheduledFor ?
number
Epoch timestamp in milliseconds for when to send the message. If omitted, the message sends immediately.

Media Permissions

Configure access rules for media attached to the message. Supports PPV pricing, subscription tiers, follower-only access, list-based restrictions, and time-limited availability. Multiple access types can be combined to create custom media access requirements.

access_type ?
string | string[]
Access rule(s) for the attached media. Accepts a single value or an array. One of: ppv, subscription, follow, list, limited_time.
price ?
number
The price to unlock the media in dollars. Used when access_type includes ppv.
subscriptionTierId ?
string
The subscription tier ID required to access the media. Used when access_type includes subscription.
subscriptionTierName ?
string
The name of the subscription tier required to access the media.
subscriptionTierBefore ?
number
Epoch timestamp before which the subscription tier rule is active.
subscriptionTierAfter ?
number
Epoch timestamp after which the subscription tier rule is active.
listId ?
string
The list ID required to access the media. Used when access_type includes list.
listLabel ?
string
The name of the list required to access the media. Required if access_type includes list.
validBefore ?
number
Epoch timestamp before which the media is accessible. Used when access_type includes limited_time.
validAfter ?
number
Epoch timestamp after which the media is accessible.
permissions ?
array
Array of custom permission rules for advanced access configurations. Each object defines its own rule using the same fields as above (access_type, price, subscriptionTierId, etc.). Rules are OR'd together. The media unlocks if any single rule's conditions are satisfied.

Audience Targeting

These fields control which fans receive the broadcast.

includeFollowers ?
boolean
Include followers in the audience. Subscribers are excluded from this flag. Defaults to false.
includeSubscribersAutoRenewOn ?
boolean
Include subscribers who have auto-renew turned on. Defaults to false.
includeSubscribersAutoRenewOff ?
boolean
Include subscribers who have auto-renew turned off. Defaults to false.
includeExpiredSubscribers ?
boolean
Include subscribers whose subscription has expired. Defaults to false.
excludeCreators ?
boolean
Exclude creators from the audience. Only skips creators who are not already subscribed. Defaults to false.
excludeOfflineUsers ?
boolean
Exclude users who are currently offline. Defaults to false.
includeSubscriptionTierId ?
string
Restrict the subscriber audience to a specific subscription tier ID. If omitted, all tiers are targeted.
includeListIds ?
string[]
Array of list IDs to include in the broadcast audience.
excludeListIds ?
string[]
Array of list IDs to exclude from the broadcast audience.
excludeUserIds ?
string[]
Array of specific user IDs to exclude from receiving this broadcast.

Response

{
    "statusCode": 201,
    "message": "Success",
    "data": {
        "status_code": 200,
        "data": {
            "success": true,
            "response": "broadcast sent"
        }
    },
    "timestamp": "2026-06-19T13:42:24.655Z"
}

On this page