To build an OnlyFans CRM, connect an account you manage, import its subscribers into your own database, and keep that data current with scheduled syncs and supported webhook events. Keep your CreatorAPI key on your backend. The examples below use the OnlyFans integration; consult the separate platform references before adapting them to Fansly or another platform.
Follow the quickstart to create a key and connect your creator account. Use a read-only key for an import job that only reads data. Set CREATOR_API_KEY and CREATOR_ACCOUNT in your server environment; the account value is the connected account identifier available to your key.
curl --fail-with-body --silent --show-error \
-H "X-API-Key: $CREATOR_API_KEY" \
"https://api.creator-api.com/v1/whoami"
curl --fail-with-body --silent --show-error \
-H "X-API-Key: $CREATOR_API_KEY" \
"https://api.creator-api.com/v1/${CREATOR_ACCOUNT}/native/users/me"
The second request reads the connected creator's profile. Check the HTTP status before treating a response as data. A failed request must leave your last successful CRM snapshot intact. Never put your API key in frontend JavaScript or a public repository.
Use the platform, creator account and fan ID together as the primary key. A fan can interact with multiple creators, so a fan ID alone is not enough to separate records. This minimal SQLite schema is an example for your application, not a CreatorAPI response schema:
CREATE TABLE crm_fans (
platform TEXT NOT NULL,
creator_account TEXT NOT NULL,
fan_id TEXT NOT NULL,
username TEXT,
subscription_state TEXT,
last_synced_at TEXT NOT NULL,
PRIMARY KEY (platform, creator_account, fan_id)
);
CREATE TABLE crm_fan_tags (
platform TEXT NOT NULL,
creator_account TEXT NOT NULL,
fan_id TEXT NOT NULL,
label TEXT NOT NULL,
PRIMARY KEY (platform, creator_account, fan_id, label),
FOREIGN KEY (platform, creator_account, fan_id)
REFERENCES crm_fans (platform, creator_account, fan_id)
);
Map the fields you actually receive into this schema and allow missing values. Derive subscription state from the source data or the list you requested; do not assume an absent field means a fan has expired. If you add revenue, store a currency and a precise amount representation alongside it rather than mixing amounts from different currencies.
Start with one page of active subscribers. This request reads OnlyFans subscriptions through the native proxy:
curl --fail-with-body --silent --show-error --get \
-H "X-API-Key: $CREATOR_API_KEY" \
--data-urlencode "type=active" \
--data-urlencode "limit=20" \
--data-urlencode "offset=0" \
"https://api.creator-api.com/v1/${CREATOR_ACCOUNT}/native/subscriptions/subscribers"
Native responses retain platform-specific fields; inspect the response before writing the adapter. Use the OnlyFans reference for supported query parameters and pagination. Upsert records by your composite key, then commit the page and its checkpoint together. Continue until the endpoint's pagination indicates completion. Do not mark missing fans inactive after a partial or failed import.
For larger snapshots, review the export API and its dataset options. Keep imports bounded so that a retry does not restart an entire creator history.
Store tags such as new-subscriber or follow-up against the same creator-scoped fan identity. Define how each segment is calculated and when it expires. A useful first segment is a recent subscriber with no recorded follow-up; a spend-based segment needs verified transactions and a defined time window.
CreatorAPI also exposes a /v1/tags metadata layer. Read the CRM API overview before choosing between that shared API layer and tags in your own database. Keep your own permissions explicit when several agency users access the same CRM.
Read the supported event catalog before creating a webhook subscription:
curl --fail-with-body --silent --show-error \
-H "X-API-Key: $CREATOR_API_KEY" \
"https://api.creator-api.com/v1/webhooks/events"
Follow the webhook guide for signing and delivery settings. Verify each request signature before accepting its payload, persist accepted events, and process them asynchronously. Make updates idempotent so retries do not duplicate records or revenue. Do not assume events arrive once, in order, or instantly.
Keep a scheduled reconciliation job as well. Compare current source data with your CRM after outages or missed events, and expose the last successful sync time in the interface. Respect rate limits and retry transient errors with bounded backoff.
Start with a subscriber list, creator-scoped tags and a visible sync timestamp. Add transaction reporting and messaging workflows after this foundation works with real data from your connected account. See pricing and credit allowances when planning your sync frequency.
Get your key, connect an account and make your first call in minutes.