Learn how to send messages to multiple fans simultaneously using the OFAuth mass messaging API.
Prerequisites
Why Use Mass Messaging?
Instead of sending individual messages one-by-one (which hits rate limits), use mass messaging to:
Send to multiple fans in a single API call
Schedule messages for later delivery
Target specific user lists
Exclude certain user groups
Track delivery and purchase stats
Send to Specific Users
Send a message to a list of user IDs:
const response = await fetch ( "https://api.ofauth.com/v2/access/mass-messages" , {
method: "POST" ,
headers: {
apikey: "YOUR_API_KEY" ,
"x-connection-id" : "conn_abc123" ,
"Content-Type" : "application/json"
},
body: JSON . stringify ({
text: "Hey everyone! New content dropping soon π₯" ,
userIds: [ 123 , 456 , 789 , 1011 , 1213 ]
})
})
const result = await response . json ()
console . log ( "Mass message ID:" , result . id )
Send to User Lists
Target OnlyFans user lists instead of individual IDs:
const response = await fetch ( "https://api.ofauth.com/v2/access/mass-messages" , {
method: "POST" ,
headers: {
apikey: "YOUR_API_KEY" ,
"x-connection-id" : "conn_abc123" ,
"Content-Type" : "application/json"
},
body: JSON . stringify ({
text: "Special message for my VIPs! π" ,
userLists: [ 1 , 2 , 3 ] // OnlyFans list IDs
})
})
Get Available Lists
First, fetch your user lists:
const response = await fetch ( "https://api.ofauth.com/v2/access/users/lists" , {
headers: {
apikey: "YOUR_API_KEY" ,
"x-connection-id" : "conn_abc123"
}
})
const lists = await response . json ()
lists . forEach ( list => {
console . log ( ` ${ list . name } (ID: ${ list . id } )` )
})
Exclude Certain Users
Send to lists but exclude specific groups:
const response = await fetch ( "https://api.ofauth.com/v2/access/mass-messages" , {
method: "POST" ,
headers: {
apikey: "YOUR_API_KEY" ,
"x-connection-id" : "conn_abc123" ,
"Content-Type" : "application/json"
},
body: JSON . stringify ({
text: "Exclusive offer! π" ,
userLists: [ 1 , 2 ], // Send to these lists
excludeUserLists: [ 3 , 4 ] // But not these lists
})
})
Target New Subscribers
Send only to users who subscribed after a certain date:
const response = await fetch ( "https://api.ofauth.com/v2/access/mass-messages" , {
method: "POST" ,
headers: {
apikey: "YOUR_API_KEY" ,
"x-connection-id" : "conn_abc123" ,
"Content-Type" : "application/json"
},
body: JSON . stringify ({
text: "Welcome to my page! Here's a special gift for new subscribers π" ,
userLists: [ 1 ], // Active subscribers list
subscribedAfterDate: "2024-01-01T00:00:00Z"
})
})
Send PPV Mass Message
Include pay-per-view content:
const response = await fetch ( "https://api.ofauth.com/v2/access/mass-messages" , {
method: "POST" ,
headers: {
apikey: "YOUR_API_KEY" ,
"x-connection-id" : "conn_abc123" ,
"Content-Type" : "application/json"
},
body: JSON . stringify ({
text: "Exclusive content you don't want to miss! π" ,
mediaItems: [ 12345 , 12346 ], // Media IDs from vault
price: 14.99 , // PPV price ($3-$200)
previewMediaCount: 1 , // First 1 item in mediaItems (left to right) is preview
userLists: [ 1 ]
})
})
mediaItems accepts vault media IDs, upload references (mediaUploadId), and http(s) URLs. See the mediaItems reference .
Schedule for Later
Schedule a message to send at a specific time:
const response = await fetch ( "https://api.ofauth.com/v2/access/mass-messages" , {
method: "POST" ,
headers: {
apikey: "YOUR_API_KEY" ,
"x-connection-id" : "conn_abc123" ,
"Content-Type" : "application/json"
},
body: JSON . stringify ({
text: "Happy New Year! π" ,
userLists: [ 1 ],
scheduledDate: "2024-12-31T23:59:00Z" // ISO 8601 format
})
})
const result = await response . json ()
console . log ( "Message scheduled for:" , result . scheduledDate )
List Sent Mass Messages
Check the stats of your sent mass messages:
// Get sent mass message stats
const response = await fetch (
"https://api.ofauth.com/v2/access/analytics/mass-messages/sent?limit=10" ,
{ headers }
)
const massMessages = await response . json ()
Response
{
"list" : [
{
"id" : 12345 ,
"text" : "Hey everyone!" ,
"sentCount" : 150 ,
"purchasedCount" : 23 ,
"totalAmount" : 344.77 ,
"createdAt" : "2024-01-15T10:30:00Z"
}
],
"hasMore" : true
}
Get Message Buyers
See who purchased a PPV mass message:
const response = await fetch (
"https://api.ofauth.com/v2/access/analytics/mass-messages/MASS_MESSAGE_ID/buyers?limit=20" ,
{
headers: {
apikey: "YOUR_API_KEY" ,
"x-connection-id" : "conn_abc123"
}
}
)
const buyers = await response . json ()
buyers . list . forEach ( buyer => {
console . log ( ` ${ buyer . username } - $ ${ buyer . amount } ` )
})
Update Scheduled Message
Modify a message before it sends:
const response = await fetch (
"https://api.ofauth.com/v2/access/mass-messages/MASS_MESSAGE_ID" ,
{
method: "PUT" ,
headers: {
apikey: "YOUR_API_KEY" ,
"x-connection-id" : "conn_abc123" ,
"Content-Type" : "application/json"
},
body: JSON . stringify ({
text: "Updated message content! π" ,
scheduledDate: "2024-12-26T12:00:00Z" // Reschedule
})
}
)
Cancel Scheduled Message
Delete a mass message before it sends:
const response = await fetch (
"https://api.ofauth.com/v2/access/mass-messages/MASS_MESSAGE_ID" ,
{
method: "DELETE" ,
headers: {
apikey: "YOUR_API_KEY" ,
"x-connection-id" : "conn_abc123"
}
}
)
if ( response . ok ) {
console . log ( "Mass message cancelled" )
}
Complete Example
Full workflow: get subscribers, filter, and send:
const API_KEY = "YOUR_API_KEY"
const CONNECTION_ID = "conn_abc123"
const headers = {
apikey: API_KEY ,
"x-connection-id" : CONNECTION_ID ,
"Content-Type" : "application/json"
}
async function sendPromoToActiveSubscribers () {
// Step 1: Get user lists
const listsResponse = await fetch (
"https://api.ofauth.com/v2/access/users/lists" ,
{ headers }
)
const lists = await listsResponse . json ()
// Find "Active" list (or create targeting logic)
const activeList = lists . find ( l => l . name . toLowerCase (). includes ( "active" ))
if ( ! activeList ) {
console . log ( "No active list found, sending to all recent subscribers" )
}
// Step 2: Create the mass message
const messageResponse = await fetch (
"https://api.ofauth.com/v2/access/mass-messages" ,
{
method: "POST" ,
headers ,
body: JSON . stringify ({
text: "π **Special Offer!** \n\n Thanks for being an amazing subscriber! Here's 20% off my premium content this week only. \n\n Use code: VIP20 π" ,
userLists: activeList ? [ activeList . id ] : undefined ,
subscribedAfterDate: activeList ? undefined : "2024-01-01T00:00:00Z"
})
}
)
const result = await messageResponse . json ()
console . log ( "β
Mass message created!" )
console . log ( " ID:" , result . id )
return result
}
sendPromoToActiveSubscribers ()
All Queue Options
Option Type Description textstring Message content (supports markdown ) mediaItems(number|string)[] Media IDs, upload references, or URLs (see mediaItems reference ) pricenumber PPV price (3 β 3- 3 β 200) previewMediaCountnumber How many mediaItems are previews. Uses the first N items from left to right. isLockedTextboolean Lock text behind paywall userIdsnumber[] Specific user IDs to target userListsnumber[] User list IDs to target excludeUserListsnumber[] User list IDs to exclude scheduledDatestring ISO date for scheduled sending subscribedAfterDatestring Only target users subscribed after date isMarkdownboolean Parse text as markdown (default: true)
Tips & Best Practices
Use lists for targeting : Create user lists in OnlyFans (VIPs, top tippers, etc.) for easy targeting without managing individual IDs.
Donβt spam : OnlyFans monitors messaging patterns. Excessive mass messaging can result in account restrictions.
Schedule strategically : Schedule messages for when your audience is most active. Use analytics to find optimal times.
A/B test : Send different messages to different lists to see what performs better.
Next Steps
Upload Media Upload content for PPV messages
Track Earnings Monitor PPV revenue