The Only API docs

Events

The event types, what triggers each, and their payload fields.

Polling is opt-in per account. Once you enable it — PATCH /accounts/{of_user_id}/polling with {"enabled": true} — we poll that account in the background, diff the results, and emit typed events. Those events are stored, broadcast over SSE, delivered to your webhooks, and evaluated by your automations — all from the same emission.

Event types

event_typeEmitted whenKey payload fields
new_subscriberA new subscription appearsfan, price, subscribed_at, expire_at
renewed_subscriberAn existing subscription renewsfan, price, subscribed_at, expire_at
expired_subscriberThe subscriber count drops (sampled every 10th poll)previous_total, new_total, deltanegative
new_tipA tip row appears in the transactions ledgerfan, amount, net, currency, tx_type, status, description
new_messageA new-message notification arrivesfan, text — the only type with a text field
new_purchaseA paid-content row appears — tx_type is message, post, stream or chargebackfan, amount, net, currency, tx_type, status, description
balance_increasedFansly only — the wallet balance rises. Never emitted for OnlyFans; the money signal there is new_tip/new_purchasedelta, available, previous_balance, new_balance, currency
polling_pausedPolling auto-pauses after 5 consecutive failuresreason, failures
payout_completedReserved — not currently emitted

Background jobs additionally emit progress events on the SSE stream, which are not stored or delivered to webhooks:

EventEmitted by
export.progress / export.completeData exports
refresh.progress / refresh.completeCache refreshes and backfills, including the automatic backfill when you first enable polling
import.progress / import.completeBulk account import — progress is coalesced to at most one per second

Webhook subscriptions also accept * as a wildcard for every type. * is a subscription filter only — it is never the event_type of a delivered event.

Envelope

{
  "id": 12345,
  "event_type": "new_tip",
  "crm_id": "crm_0123456789abcdef",
  "of_user_id": "1234567",
  "occurred_at": "2026-04-18T12:34:56.789",
  "payload": {
    "fan": {
      "id": "987",
      "username": "somefan",
      "display_name": "Some Fan",
      "avatar": "https://…"
    },
    "amount": 10.0,
    "net": 8.0,
    "currency": "USD",
    "tx_type": "tip",
    "status": "done",
    "description": "Tip from somefan",
    "created_at": "2026-04-18T12:34:50+00:00"
  }
}

Reading past events

curl "$BASE/api/crm/$CRM/events?types=new_tip,new_subscriber&limit=100" \
  -H "X-API-Key: $KEY"
ParameterPurpose
typesComma-separated event types
of_user_idRestrict to one connected account
since / untilISO bounds on created_at (when we recorded it), not occurred_at. since is exclusive, until inclusive
limitDefault 100, max 500

This route is panel-wide and takes no offset — narrow with since/until rather than paging.

Behaviours worth knowing

Choosing a delivery mechanism

On this page