How to Automate OnlyFans DMs
Knowing how to automate OnlyFans DMs well is about targeting, not volume — the right message to the right fans, sent once, tracked to completion. This guide walks segment → mass DM → schedule → track with ofapis, an independent API for your own connected account.
Step 1 — Segment your fans
A blast to everyone converts worse than a targeted one. Group fans into a list (VIPs, churn-risk, new joiners) and message each group differently. Create a segment:
curl -X POST https://api.ofapis.com/api/public/v1/accounts/42/lists \
-H "Authorization: Bearer ofapis_sk_..." \
-H "Content-Type: application/json" \
-d '{"name":"VIP spenders"}'
Then add fans by their OnlyFans user id:
curl -X POST https://api.ofapis.com/api/public/v1/accounts/42/lists/9/users \
-H "Authorization: Bearer ofapis_sk_..." \
-H "Content-Type: application/json" \
-d '{"userIds":[101,102,103]}'
Resolve ids from the subscribers API. Segments are explicit membership, not live queries — re-sync from your own scoring on a schedule. See the fan segments API.
Step 2 — Create a mass DM
Don't loop over chats — that burns credits and rate limit and risks double-sends. Create a mailing (message plus targeting) pointed at the segment:
curl -X POST https://api.ofapis.com/api/public/v1/accounts/42/mailings \
-H "Authorization: Bearer ofapis_sk_..." \
-H "Content-Type: application/json" \
-d '{"name":"vip-drop","text":"VIP drop 👀","listId":"9","priceCents":1500}'
{ "data": { "id": "9d4c1e77-3b2a-4f68-a5c9-7e10b2f8d341", "name": "vip-drop", "text": "VIP drop 👀",
"mediaIds": [], "listId": "9", "priceCents": 1500, "lockedText": false } }
Mailing ids are UUIDs — keep the returned id, you need it for preview and trigger.
Step 3 — Preview the cost
Always preview before firing. The preview returns recipient count and an estimated credit cost — one credit per recipient by default — reflecting the audience at call time:
curl -X POST https://api.ofapis.com/api/public/v1/accounts/42/mailings/9d4c1e77-3b2a-4f68-a5c9-7e10b2f8d341/preview \
-H "Authorization: Bearer ofapis_sk_..."
{ "data": { "mailingId": "9d4c1e77-3b2a-4f68-a5c9-7e10b2f8d341", "listId": "9",
"recipientCount": 214, "perRecipientWeight": 1, "estimatedCost": 214 } }
estimatedCost is recipientCount × perRecipientWeight. If you target all subscribers instead of a list, recipientCount comes back as -1 (the count isn't known without full enumeration) and estimatedCost is 0 — so budget from your own subscriber count in that case. A 30,000-fan blast can outrun a plan's monthly credits, so check the estimate against your /me balance first.
Step 4 — Schedule or send now
To send immediately, trigger it. To schedule, pass a future UTC scheduledAt on the trigger:
import requests
requests.post(
"https://api.ofapis.com/api/public/v1/accounts/42/mailings/9d4c1e77-3b2a-4f68-a5c9-7e10b2f8d341/trigger",
headers={"Authorization": "Bearer ofapis_sk_..."},
json={"scheduledAt": "2026-07-25T18:00:00Z"},
)
Dispatch is asynchronous — the trigger returns quickly and starts a run. Because it's one mailing operation, an accidental repeat won't fan out into duplicate sends.
Step 5 — Track delivery
Watch the run to completion instead of assuming the trigger meant "done":
curl https://api.ofapis.com/api/public/v1/accounts/42/mailings/9d4c1e77-3b2a-4f68-a5c9-7e10b2f8d341/runs \
-H "Authorization: Bearer ofapis_sk_..."
Inspect a single run at /runs/{runId} for delivered vs. failed counts.
Common errors
| Status | Meaning | Fix |
|---|---|---|
401 |
Revoked token | Reissue the key in the dashboard |
404 |
Unknown mailingId or listId |
Recreate the mailing or segment |
409 |
Mailing already triggered | Check its runs before re-firing |
429 |
Rate limit | Back off; see rpm on pricing |
Only successful calls cost credits; failed triggers are free.
FAQ
Should I loop over chats to DM everyone?
No. Use a mailing pointed at a segment — it sends in one dispatch, previews the cost first, and can't fan out into duplicates the way a half-finished loop can.
How do I know what a blast will cost before sending?
Call the mailing preview endpoint. It returns the recipient count and estimated credits (one per recipient by default) for the audience at call time, so you can check it against your balance.
Can I schedule a mass DM for later?
Yes. Pass a future UTC scheduledAt (ISO-8601) when you trigger the mailing, and ofapis dispatches it at that instant.
Do fan segments update themselves?
No. A segment is an explicit membership list. Keep it current by adding and removing fans from your own scoring logic, typically on a schedule.
Next steps
Related: OnlyFans automation guide