Skip to main content
Learn how to send messages to multiple fans simultaneously using the OFAuth message queue.

Prerequisites

You have a connected OnlyFans account with a valid connectionId

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

OptionTypeDescription
textstringMessage content (supports markdown)
mediaItemsnumber[]Media IDs from vault
pricenumberPPV price (3βˆ’3-200)
previewMediaCountnumberPreview items before paywall
isLockedTextbooleanLock text behind paywall
userIdsnumber[]Specific user IDs to target
userListsnumber[]User list IDs to target
excludeUserListsnumber[]User list IDs to exclude
scheduledDatestringISO date for scheduled sending
subscribedAfterDatestringOnly target users subscribed after date
isMarkdownbooleanParse 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