ofapisv1
guide

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

Related guides

All guides
Start free — 250 credits, no card
Generate a token and make your first call in minutes.
Get started