Send a DM or PPV
Send a single DM (or PPV) to one fan. Works for OnlyFans and Fansly.
Send a single DM (or PPV) to one fan. Works for OnlyFans and Fansly.
price > 0makes the message a PPV.mediaFileslocks vault media behind the price.- Sends are gated per account by the
allow_of_write_actionspolling 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
Authorization
apiKey Your CRM panel API key
In: header
Path Parameters
Creator account ID of the connected account (OnlyFans or Fansly). Use GET /accounts to list connected accounts and their IDs.
The fan's user ID.
Header Parameters
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}