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*
stringThe unique identifier for the connected account.
Request Body
Message
content*
stringThe text content of the broadcast message.
mediaIds ?
arrayArray of uploaded media IDs, or objects in the form {
mediaId: ... and previewId (if needed, otherwise null)}, to attach to the message.scheduledFor ?
numberEpoch 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 ?
numberThe price to unlock the media in dollars. Used when
access_type includes ppv.subscriptionTierId ?
stringThe subscription tier ID required to access the media. Used when
access_type includes subscription.subscriptionTierName ?
stringThe name of the subscription tier required to access the media.
subscriptionTierBefore ?
numberEpoch timestamp before which the subscription tier rule is active.
subscriptionTierAfter ?
numberEpoch timestamp after which the subscription tier rule is active.
listId ?
stringThe list ID required to access the media. Used when
access_type includes list.listLabel ?
stringThe name of the list required to access the media. Required if
access_type includes list.validBefore ?
numberEpoch timestamp before which the media is accessible. Used when
access_type includes limited_time.validAfter ?
numberEpoch timestamp after which the media is accessible.
permissions ?
arrayArray 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 ?
booleanInclude followers in the audience. Subscribers are excluded from this flag. Defaults to false.
includeSubscribersAutoRenewOn ?
booleanInclude subscribers who have auto-renew turned on. Defaults to false.
includeSubscribersAutoRenewOff ?
booleanInclude subscribers who have auto-renew turned off. Defaults to false.
includeExpiredSubscribers ?
booleanInclude subscribers whose subscription has expired. Defaults to false.
excludeCreators ?
booleanExclude creators from the audience. Only skips creators who are not already subscribed. Defaults to false.
excludeOfflineUsers ?
booleanExclude users who are currently offline. Defaults to false.
includeSubscriptionTierId ?
stringRestrict 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"
}