ofapisv1
capability

OnlyFans Mass DM API

Sending the same message to thousands of fans by looping over individual chats is slow, fragile, and easy to double-send. the ofapis OnlyFans mass DM API exposes mass messaging as mailings — a mailing is an object you create once (the message plus targeting), preview to see exactly who it hits and what it costs, then trigger as a single dispatch. Because the trigger is one operation rather than N chat writes, it's idempotent: firing the same mailing twice by accident does not fan out into duplicate sends.

What you can do

Endpoints

GET    /api/public/v1/accounts/{accountId}/mailings
POST   /api/public/v1/accounts/{accountId}/mailings
POST   /api/public/v1/accounts/{accountId}/mailings/{mailingId}/preview
POST   /api/public/v1/accounts/{accountId}/mailings/{mailingId}/trigger
GET    /api/public/v1/accounts/{accountId}/mailings/{mailingId}/runs
GET    /api/public/v1/accounts/{accountId}/mailings/{mailingId}/runs/{runId}
DELETE /api/public/v1/accounts/{accountId}/mailings/{mailingId}

Preview before you send

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": 3120, "perRecipientWeight": 1, "estimatedCost": 3120 } }

estimatedCost is recipientCount × perRecipientWeight — billing is one credit per recipient by default — so a broadcast never surprises your balance. Run preview whenever the target segment might have changed; the number reflects the audience at call time, not at create time.

One edge case worth handling: if the mailing targets all subscribers rather than a list, recipientCount returns -1 and estimatedCost is 0, because the count isn't known without enumerating the whole audience. Fall back to your own subscriber count before confirming a send that size.

Trigger and track

curl -X POST \
  https://api.ofapis.com/api/public/v1/accounts/42/mailings/9d4c1e77-3b2a-4f68-a5c9-7e10b2f8d341/trigger \
  -H "Authorization: Bearer ofapis_sk_..."
{ "data": { "runId": "2c7f0a91-8d43-4b16-9e05-1f6a3c4d7b28", "recipientCount": 3120, "creditsDebited": 3120 } }

Trigger kicks off a run. Dispatch is asynchronous — the trigger returns quickly with the runId, then you poll /runs/{runId} (which reports status, successCount, skippedCount and creditsDebited) to watch delivery progress rather than blocking on the whole send. A 30,000-recipient blast can outrun a single plan's monthly credits, so check the preview cost against your balance first: Starter includes 30,000 credits a month, Pro 120,000.

When to use it

Use mailings for broadcast campaigns, segment promotions, and re-engagement blasts. Build the target audience with the fan segments API first, then point the mailing at it. For one-to-one replies, use the messaging API instead. Mailings sit at the centre of most agency automation workflows.

FAQ

How is a mass DM billed?

One credit per recipient by default, and the preview endpoint shows the estimate before you commit. Only successful dispatches are charged, so a mailing that fails to trigger costs nothing.

Can I target a segment instead of everyone?

Yes. Create a fan segment and point the mailing at it, and the dispatch reaches only that audience. Leave targeting open to reach all active subscribers.

Is the trigger idempotent?

The dispatch runs as one mailing operation rather than thousands of individual sends, so an accidental repeat does not silently duplicate messages to every fan. Inspect the mailing's runs to confirm whether a dispatch already happened.

How do I know if a mailing finished?

Trigger starts an asynchronous run. Poll GET /mailings/{mailingId}/runs/{runId} to follow delivery status to completion instead of assuming the trigger response means "done."

Start free · Build an agency workflow

Related guides

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