Learn how to send messages to multiple fans simultaneously using the OFAuth message queue.
Prerequisites
Why Use Mass Messaging?
Instead of sending individual messages one-by-one (which hits rate limits), use the message queue 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/messages/queue", {
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("Queued 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/messages/queue", {
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/messages/queue", {
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/messages/queue", {
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/messages/queue", {
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, // Preview items
userLists: [1]
})
})
Schedule for Later
Queue a message to send at a specific time:
const response = await fetch("https://api.ofauth.com/v2/access/messages/queue", {
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
})
})
console.log("Message scheduled for:", result.scheduledDate)
View Queue Stats
Check the status of your mass messages:
// Get sent messages
const sent = await fetch(
"https://api.ofauth.com/v2/access/messages/queue/stats?type=sent&limit=10",
{ headers }
)
// Get scheduled (pending) messages
const scheduled = await fetch(
"https://api.ofauth.com/v2/access/messages/queue/stats?type=scheduled&limit=10",
{ headers }
)
// Get unsent (failed) messages
const unsent = await fetch(
"https://api.ofauth.com/v2/access/messages/queue/stats?type=unsent&limit=10",
{ headers }
)
Queue Stats 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/statistics/messages/queue/QUEUE_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/messages/queue/QUEUE_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 queued message before it sends:
const response = await fetch(
"https://api.ofauth.com/v2/access/messages/queue/QUEUE_MESSAGE_ID",
{
method: "DELETE",
headers: {
apikey: "YOUR_API_KEY",
"x-connection-id": "conn_abc123"
}
}
)
if (response.ok) {
console.log("Scheduled 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/messages/queue",
{
method: "POST",
headers,
body: JSON.stringify({
text: "π **Special Offer!**\n\nThanks for being an amazing subscriber! Here's 20% off my premium content this week only.\n\nUse code: VIP20 π",
userLists: activeList ? [activeList.id] : undefined,
subscribedAfterDate: activeList ? undefined : "2024-01-01T00:00:00Z"
})
}
)
const result = await messageResponse.json()
console.log("β
Mass message queued!")
console.log(" ID:", result.id)
return result
}
sendPromoToActiveSubscribers()
All Queue Options
| Option | Type | Description |
|---|
text | string | Message content (supports markdown) |
mediaItems | number[] | Media IDs from vault |
price | number | PPV price (3β200) |
previewMediaCount | number | Preview items before paywall |
isLockedText | boolean | Lock text behind paywall |
userIds | number[] | Specific user IDs to target |
userLists | number[] | User list IDs to target |
excludeUserLists | number[] | User list IDs to exclude |
scheduledDate | string | ISO date for scheduled sending |
subscribedAfterDate | string | Only target users subscribed after date |
isMarkdown | boolean | 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