Skip to content

Platforms

One API for OnlyFans and Fansly

Every creator account lives on one platform. The same routes, keys, MCP tools and webhooks serve both, and anything a platform lacks answers not_supported_on_platform. The tables below come straight from the API contract, so they change when the API does.

  • OnlyFans

    Chats, fans, spend, revenue, posts, tracking links and the vault, plus mass messages, paid messages, online fans and webhooks for every new message, sale and subscriber.

    22
    REST routes
    11
    webhook events
    28
    MCP tools
    OnlyFans API features
  • Fansly

    Fans, chats, revenue, posts, tracking links and the vault on the same routes, with the same keys. Send free messages and take them back, each approved by your team.

    20
    REST routes
    8
    webhook events
    24
    MCP tools
    The Fansly API

Differences

What only one platform has

Everything else works the same on both. Calling one of these for an account on the other platform answers not_supported_on_platform.

Fansly only

REST routes
Call Fansly
Rules
A message is free, goes to a chat the account already has and attaches free vault media only. Each account syncs about every 30 minutes. More on the Fansly API

Route by route

What works on each platform

Read from the API contract. Each name links to its reference in the docs.

REST routes

Every route an API key can call. Routes that take an account answer with meta.platform.

REST routes on OnlyFans and Fansly
REST routesOnlyFansFansly
GET /v1/meWho am IWorks on OnlyFansWorks on Fansly
GET /v1/accountsList accountsAdd platform=fansly or platform=onlyfans to list one platform.Works on OnlyFansWorks on Fansly
POST /v1/linksCreate linkSet platform, or leave it out and the creator picks.Works on OnlyFansWorks on Fansly
GET /v1/links/{linkId}Get linkWorks on OnlyFansWorks on Fansly
GET /v1/accounts/{accountId}Get accountWorks on OnlyFansWorks on Fansly
GET /v1/accounts/{accountId}/fansList fansWorks on OnlyFansWorks on Fansly
GET /v1/accounts/{accountId}/fans/{fanId}Get fanfresh=true reads the fan live on either platform.Works on OnlyFansWorks on Fansly
GET /v1/accounts/{accountId}/listsFan listsWorks on OnlyFansWorks on Fansly
GET /v1/accounts/{accountId}/chatsList chatsWorks on OnlyFansWorks on Fansly
GET /v1/accounts/{accountId}/chats/{fanId}/messagesList messagesOn Fansly, fresh=true works for a chat the account already has.Works on OnlyFansWorks on Fansly
GET /v1/accounts/{accountId}/messages/searchSearch messagesWorks on OnlyFansWorks on Fansly
GET /v1/accounts/{accountId}/revenueRevenue summaryWorks on OnlyFansWorks on Fansly
GET /v1/accounts/{accountId}/transactionsList transactionsWorks on OnlyFansWorks on Fansly
GET /v1/accounts/{accountId}/mass-messagesMass messagesWorks on OnlyFansDoes not work on Fansly
GET /v1/accounts/{accountId}/postsTop contentTips per post are set on Fansly and null on OnlyFans.Works on OnlyFansWorks on Fansly
GET /v1/accounts/{accountId}/linksTracking linksurl is null on Fansly, which does not say the address fans open.Works on OnlyFansWorks on Fansly
GET /v1/accounts/{accountId}/online-fansOnline fansWorks on OnlyFansDoes not work on Fansly
GET /v1/accounts/{accountId}/vaultVaultWorks on OnlyFansWorks on Fansly
GET /v1/accounts/{accountId}/onlyfans/{path}Call OnlyFansWorks on OnlyFansDoes not work on Fansly
GET /v1/accounts/{accountId}/fansly/{path}Call FanslyDoes not work on OnlyFansWorks on Fansly
POST /v1/accounts/{accountId}/actionsCreate actionFansly takes send_message and unsend_message.Works on OnlyFansWorks on Fansly
GET /v1/actions/{actionId}Get actionWorks on OnlyFansWorks on Fansly
GET /v1/actionsList actionsWorks on OnlyFansWorks on Fansly

Writes

Each write is an action that waits for a person to approve it, unless an owner or admin gave the key auto-approve.

Writes on OnlyFans and Fansly
WritesOnlyFansFansly
send_messageSend messageOn Fansly it is free, goes to a chat the account already has and attaches free vault media only.Works on OnlyFansWorks on Fansly
send_mass_messageSend mass messageWorks on OnlyFansDoes not work on Fansly
unsend_messageUnsend messageOn OnlyFans it can take back every copy of a mass message.Works on OnlyFansWorks on Fansly
add_fan_to_listAdd fan to listWorks on OnlyFansDoes not work on Fansly
remove_fan_from_listRemove fan from listWorks on OnlyFansDoes not work on Fansly

Webhook events

Every event that names an account carries account.platform. Read new Fansly messages, sales and subscribers from the API.

Webhook events on OnlyFans and Fansly
Webhook eventsOnlyFansFansly
account.connectedA creator account was linked to the workspace.Works on OnlyFansWorks on Fansly
account.status_changedAn account's status changed, for example to Needs relink.Works on OnlyFansWorks on Fansly
account.removedAn account was removed from the workspace.Works on OnlyFansWorks on Fansly
link.failedA hosted link session ended without connecting.Works on OnlyFansWorks on Fansly
message.receivedA fan sent a message.Works on OnlyFansDoes not work on Fansly
transaction.createdA fan paid for something: a subscription, tip, message, post or stream.Works on OnlyFansDoes not work on Fansly
subscriber.newA fan subscribed or resubscribed.Works on OnlyFansDoes not work on Fansly
action.pendingAn API client asked for a write that needs approval.Works on OnlyFansWorks on Fansly
action.executedAn approved write ran on the account.Works on OnlyFansWorks on Fansly
action.rejectedA person rejected a pending write.Works on OnlyFansWorks on Fansly
action.failedAn approved write failed on the platform.Works on OnlyFansWorks on Fansly

MCP tools

One tool set serves both platforms. The account decides which platform a call reaches.

MCP tools on OnlyFans and Fansly
MCP toolsOnlyFansFansly
list_accountsList accountsWorks on OnlyFansWorks on Fansly
account_healthAccount healthWorks on OnlyFansWorks on Fansly
link_accountLink an accountWorks on OnlyFansWorks on Fansly
get_linkCheck a linkWorks on OnlyFansWorks on Fansly
find_fansFind fansWorks on OnlyFansWorks on Fansly
get_fanGet fanWorks on OnlyFansWorks on Fansly
list_chatsList chatsWorks on OnlyFansWorks on Fansly
get_chatGet chatWorks on OnlyFansWorks on Fansly
search_messagesSearch messagesWorks on OnlyFansWorks on Fansly
revenue_summaryRevenue summaryWorks on OnlyFansWorks on Fansly
list_transactionsList transactionsWorks on OnlyFansWorks on Fansly
mass_message_performanceMass message performanceWorks on OnlyFansDoes not work on Fansly
top_contentTop contentWorks on OnlyFansWorks on Fansly
link_performanceTracking link performanceWorks on OnlyFansWorks on Fansly
online_fansOnline fansWorks on OnlyFansDoes not work on Fansly
list_vaultList vaultWorks on OnlyFansWorks on Fansly
search_apiSearch the platform APIWorks on OnlyFansWorks on Fansly
describe_endpointDescribe a platform endpointWorks on OnlyFansWorks on Fansly
call_apiCall the platform APIWorks on OnlyFansWorks on Fansly
search_docsSearch docsWorks on OnlyFansWorks on Fansly
get_docGet docWorks on OnlyFansWorks on Fansly
draft_messageDraft a messageWorks on OnlyFansWorks on Fansly
send_messageSend messageWorks on OnlyFansWorks on Fansly
send_mass_messageSend mass messageWorks on OnlyFansDoes not work on Fansly
unsend_messageUnsend messageWorks on OnlyFansWorks on Fansly
list_fan_listsList fan listsWorks on OnlyFansWorks on Fansly
label_fanAdd or remove a fan from a listWorks on OnlyFansDoes not work on Fansly
get_actionGet actionWorks on OnlyFansWorks on Fansly

Linking

How creators connect each platform

On both platforms the creator signs in on our hosted page, so you never see a password.

How a creator links an OnlyFans or a Fansly account
LinkingOnlyFansFansly
Signs in withAccount email and passwordUsername or email, and password
Two-factor codeFrom an authenticator app, a text message or emailBy email or from an authenticator app
Human checkSometimesNever
Selfie checkSometimesNever
StatusesAll seven, including Awaiting selfie and Restricted by OnlyFansFive. Never Awaiting selfie or Restricted
WorkspacesAny number, each with its own accessOne at a time. A second link fails with account_in_use
Sandbox creatorsIvy, Juniper and WrenSloane

Link a creator

One workspace

Write it once for both

A key reaches every account in its workspace, on either platform. Branch on platform only where the platforms differ, and keep every id a string.

both-platforms.ts
const BFL = "https://betterfans.link/v1";
const headers = { Authorization: `Bearer ${process.env.BFL_KEY}` };

// One key reaches every account in the workspace, on either platform
const { data: accounts } = await fetch(`${BFL}/accounts`, { headers }).then((r) => r.json());

for (const account of accounts) {
  // Same route on both. Ids are strings: Fansly ids do not fit in a number.
  const { data: fans, meta } = await fetch(
    `${BFL}/accounts/${account.id}/fans?sort=spend&limit=5`,
    { headers },
  ).then((r) => r.json());

  console.log(meta.platform, account.username, fans.length);

  if (account.platform === "onlyfans") {
    // Online fans and mass messages exist on OnlyFans only
  }
}

FAQ

OnlyFans and Fansly API questions

Can one workspace hold OnlyFans and Fansly creators?

Yes. A workspace can link creators on both platforms, and GET /v1/accounts lists them together with each one's platform. Add platform=fansly or platform=onlyfans to list one platform. Roles, approvals, the request log and the audit log cover every account the same way.

What happens if I call an OnlyFans only route for a Fansly account?

The API answers 400 not_supported_on_platform and does nothing. The same goes for a write type the platform does not take: a mass message for a Fansly account is refused when you create it, before any action exists. Each route in the docs lists the platforms it works for.

Do OnlyFans and Fansly return the same data shapes?

Yes. A fan, chat, message, transaction, post, tracking link or vault item has the same fields on both platforms. A field is null where a platform does not say it, such as the address of a Fansly tracking link or the tips on an OnlyFans post.

How do I tell which platform an account is on?

Every account has a platform field, onlyfans or fansly. Every response for one account repeats it in meta.platform, and every webhook event that names an account carries account.platform, so you can branch on it anywhere.

GET STARTED

Build it in test mode today.

Sign up, make a test key and build against sandbox creators on both platforms. Link real accounts when your flow is ready.

Questions first? Write to hello@betterfans.link.