The Only API docs
Messaging

Send a DM or PPV

Send a single DM (or PPV) to one fan. Works for OnlyFans and Fansly.

POST
/accounts/{of_user_id}/chats/{with_user_id}/messages

Send a single DM (or PPV) to one fan. Works for OnlyFans and Fansly.

  • price > 0 makes the message a PPV.
  • mediaFiles locks vault media behind the price.
  • Sends are gated per account by the allow_of_write_actions polling setting (PATCH /accounts/{of_user_id}/polling), on both platforms.

Attaching media on Fansly. Use content_ids: these are the content_id values from POST /accounts/{of_user_id}/media or POST /accounts/{of_user_id}/media/{media_id}/permissions, not raw media ids. A raw media id attaches nothing and the fan sees an empty message. Price and permissions live on the media itself (set when you upload or gate it), not on the message — so a Fansly PPV is a gated attachment, not a price on the send.

A voice note is just an audio file: upload it, gate it, attach its content_id.

scheduled_for takes a future unix timestamp; 0 or omitted sends immediately.

Rate limited to 120 requests/minute.

Guide: Messaging & mass DM

X-API-Key<token>

Your CRM panel API key

In: header

Path Parameters

of_user_id*string

Creator account ID of the connected account (OnlyFans or Fansly). Use GET /accounts to list connected accounts and their IDs.

with_user_id*string

The fan's user ID.

Header Parameters

X-Proxy?string

Proxy URL — HTTP or SOCKS5 (e.g. http://user:pass@host:port or socks5://user:pass@host:port). Optional on post-connection routes, where it overrides the proxy saved at login time. Required on the connection routes (POST /accounts/login, POST /accounts/login/cookies, POST /accounts/login/verify-otp) for OnlyFans accounts; optional for Fansly.

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

curl -X POST "https://example.com/accounts/string/chats/string/messages" \  -H "Content-Type: application/json" \  -d '{    "text": "string"  }'
{  "message": "string",  "success": true}