# Créer un CRM OnlyFans avec l'API : modèle de données, webhooks et synchro

> Créez un CRM OnlyFans : authentification sécurisée, modèle de données relationnel, import de l'historique et synchronisation par webhooks en quasi temps réel.

**En bref**

- Un modèle de données complet pour un CRM OnlyFans sépare les comptes d'agence multi-tenant, les portefeuilles de créateurs, les profils de fans, les conversations et les registres financiers.
- L'authentification repose sur des sessions client intégrées : les créateurs se connectent avec leur e-mail, leur mot de passe et la 2FA dans une fenêtre modale sécurisée.
- L'état initial des données est alimenté en paginant les endpoints de liste pour les fans, les chats et l'historique des revenus.
- La synchronisation continue s'appuie sur des webhooks (à partir du plan Basic) comme `messages.received` et `transactions.new` pour éliminer le polling gourmand en limites de requêtes.

Créer un CRM OnlyFans demande une base de données relationnelle pour stocker les comptes, les fans, les chats et les transactions, associée à un import de l'historique et à des webhooks événementiels pour garder le système synchronisé. Les développeurs peuvent bâtir cette architecture backend en authentifiant les créateurs via des fenêtres modales sécurisées, en récupérant l'historique via les endpoints de liste REST et en ingérant les changements d'état en direct grâce à des webhooks en quasi temps réel (à partir du plan Basic).

**Points clés**

- Un modèle de données complet pour un CRM OnlyFans sépare les comptes d'agence multi-tenant, les portefeuilles de créateurs, les profils de fans, les conversations et les registres financiers.
- L'authentification repose sur des sessions client intégrées : les créateurs se connectent avec leur e-mail, leur mot de passe et la 2FA dans une fenêtre modale sécurisée.
- L'état initial des données est alimenté en paginant les endpoints de liste pour les fans, les chats et l'historique des revenus.
- La synchronisation continue s'appuie sur des webhooks (à partir du plan Basic) comme `messages.received` et `transactions.new` pour éliminer le polling gourmand en limites de requêtes.

## Comment créer un CRM OnlyFans avec une API ?

Pour créer un CRM OnlyFans sur mesure avec une API, vous devez configurer l'authentification intégrée, concevoir un modèle de données relationnel pour les fans et les transactions, importer l'historique via les endpoints de liste REST et vous abonner à des webhooks en quasi temps réel (à partir du plan Basic) pour la synchronisation continue.

1. **Authentification et connexion des comptes** : utilisez le package `@onlyfansapi/auth` pour intégrer une fenêtre modale de connexion sécurisée.
2. **Modèle de données relationnel** : prévoyez des tables pour les comptes créateurs, les profils de dépenses des abonnés, les fils de discussion et les registres de transactions.
3. **Import de l'historique** : paginez des endpoints comme `GET https://app.fansapi.com/api/{account}/fans/all` pour alimenter vos bases internes avec les profils et les historiques de chat.
4. **Synchronisation par webhooks en quasi temps réel** : ingérez des événements comme `messages.received` et `transactions.new` pour mettre à jour l'état de la base sans polling continu.

## Concevoir le modèle de données relationnel

Un modèle de données de CRM isole les comptes d'agence multi-tenant des portefeuilles de créateurs, des profils de relation avec les fans, des conversations chronologiques et des registres financiers. Les équipes techniques qui développent leur propre logiciel, comme le décrit notre guide [CRM et logiciel d'agence OnlyFans](/fr/blog/meilleur-crm-logiciel-agence-onlyfans-comparatif), ont besoin d'un contrôle programmatique direct sur ces entités.

**Entités de données principales**

- **Comptes créateurs** : stocke les métadonnées du créateur et l'état de connexion de la session. Utilisez le `onlyfans_id` du créateur comme clé de l'enregistrement : un créateur reconnecté reçoit un nouvel ID `acct_`.
- **Fans** : centralise les métadonnées des abonnés, la ventilation des dépenses cumulées, les notes personnalisées et les tags CRM.
- **Chats et messages** : stocke les fils de discussion, le sens des messages, les états PPV et les ID des médias CDN joints.
- **Transactions** : conserve un enregistrement immuable des événements financiers pour le versement des commissions et l'attribution.

| Nom du champ | Type | Description |
| --- | --- | --- |
| `id` | `VARCHAR(64)` | ID utilisateur de l'abonné (`fan.id`) |
| `account_id` | `VARCHAR(64)` | ID du compte créateur concerné, commençant par `acct_` |
| `total_spent` | `DECIMAL(12,2)` | Dépenses cumulées (`totalSumm` / `spending.total`) |
| `messages_spent` | `DECIMAL(12,2)` | Dépenses en messages payants (`messagesSumm` / `spending.messages`) |
| `subscribes_spent` | `DECIMAL(12,2)` | Dépenses en abonnements (`subscribesSumm` / `spending.subscribes`) |

## Authentification intégrée et connexion des comptes

Agences et développeurs créent des parcours d'onboarding sécurisés en intégrant le package NPM officiel `@onlyfansapi/auth`. Le créateur se connecte avec son e-mail, son mot de passe et la 2FA dans notre fenêtre modale sécurisée.

Le backend génère un [token de session client](https://docs.fansapi.com/api-reference/client-sessions/create-client-session) via `POST https://app.fansapi.com/api/client-sessions`. Le frontend lance ensuite la fenêtre modale avec `startOnlyFansAuthentication`. Une fois la 2FA validée, la fenêtre modale renvoie un `accountId` au format `acct_XXXX`, qui rattache le créateur au tenant du CRM.

## Import initial de l'historique via les endpoints de liste

Dès qu'un compte est connecté, le CRM lance une synchronisation initiale de l'historique pour alimenter la base avant de s'appuyer sur les webhooks. Comme l'explique notre page [API CRM OnlyFans](https://fansapi.com/onlyfans-crm-api), ce processus parcourt les abonnés, les conversations, les historiques de messages et les transactions passées.

### Paginer les abonnés et les profils de dépenses

[Récupérez tous les fans actifs et expirés](https://docs.fansapi.com/api-reference/fans/list-all-fans) avec une pagination par offset pour obtenir la ventilation financière complète.

```typescript
export async function backfillFans(accountId: string, apiKey: string) {
  let offset = 0;
  const limit = 20;
  let hasMore = true;

  while (hasMore) {
    const url = `https://app.fansapi.com/api/${accountId}/fans/all?limit=${limit}&offset=${offset}`;
    const res = await fetch(url, {
      headers: { 'Authorization': `Bearer ${apiKey}` }
    });

    const result = await res.json();
    const fans = result.data?.list ?? [];

    // Logique d'upsert pour chaque profil de fan et ses données de dépenses

    hasMore = result.data?.hasMore === true;
    offset += limit;
  }
}
```

## Synchronisation en quasi temps réel via les webhooks

Interroger les API en continu épuise les limites de requêtes et crée un décalage de synchronisation. Les webhooks livrent les [événements de messages et de transactions](https://docs.fansapi.com/webhooks/available-events) en quasi temps réel (`transactions.new` peut avoir jusqu'à 3 minutes de retard). Les webhooks et l'infrastructure de proxy mobile dédiée sont disponibles à partir du plan Basic ($69/mois). OnlyFansAPI donne accès à plus de 320 endpoints, a traité plus de 300 millions de requêtes API et de webhooks, et est utilisé par plus de 1 100 entreprises.

### Catalogue des principaux événements webhook

- `accounts.connected` : se déclenche quand un créateur termine le parcours d'authentification.
- `messages.received` : message entrant d'un fan.
- `messages.ppv.unlocked` : un fan achète un message PPV que vous avez envoyé.
- `subscriptions.new` : un nouvel abonné arrive.
- `subscriptions.renewed` : l'abonnement d'un abonné est refacturé.
- `subscriptions.expired` : un abonnement expire.
- `transactions.new` : tout paiement, comme les pourboires, les posts ou les abonnements.

Les routeurs de webhooks doivent ingérer ces événements pour mettre à jour la base du CRM.

```typescript
export async function handleOnlyFansWebhook(req: Request, res: Response) {
  // Vérifiez d'abord l'en-tête Signature (HMAC SHA256 du corps brut) et ignorez les valeurs X-OFAPI-Idempotency-Key déjà reçues
  const { event, account_id, payload } = req.body;
  res.status(200).json({ received: true });

  if (event === 'messages.received') {
    // Insérer le message dans la base du CRM et mettre à jour les compteurs de non-lus
  } else if (event === 'transactions.new') {
    // Enregistrer l'événement financier dans le registre
  }
}
```

## Exécuter des actions CRM et la synchronisation sortante

Pour fonctionner comme un CRM opérationnel, le système renvoie des actions sortantes vers la plateforme. OnlyFansAPI fait passer ces requêtes par une IP mobile dédiée par compte OnlyFans connecté (États-Unis ou Royaume-Uni, à partir du plan Basic), sans rotation. OnlyFansAPI n'a enregistré aucun bannissement en plus de 5 ans.

### Envoyer des messages sortants et des PPV

Les messages de chat sortants prennent en charge le texte brut, les fichiers médias téléversés sur le CDN et la tarification PPV. Les messages payants exigent un prix compris entre 3 et 200 et nécessitent `mediaFiles`, sauf si `lockedText` vaut true. Les messages de masse n'ont pas de mode test (dry-run).

```typescript
export async function sendCrmReply(
  accountId: string,
  chatId: string,
  text: string,
  price: number = 0,
  apiKey: string,
  mediaFiles: string[] = []
) {
  const payload: any = { text };
  if (price > 0) {
    payload.price = price;
    payload.mediaFiles = mediaFiles; // obligatoire pour les messages payants, sauf si lockedText vaut true
  }

  const msgRes = await fetch(`https://app.fansapi.com/api/${accountId}/chats/${chatId}/messages`, {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${apiKey}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(payload)
  });

  return await msgRes.json();
}
```

### Mettre à jour les notes et la segmentation des fans

Un CRM sur mesure permet aux opérateurs de tenir des notes persistantes et des listes de segments qui se synchronisent directement. Les développeurs peuvent créer ou modifier les notes d'un fan sur le compte du créateur en appelant `PUT https://app.fansapi.com/api/{account}/fans/{fan_id}/notes` (champ `notes` du corps), et ajouter des fans à une liste OnlyFans avec `POST https://app.fansapi.com/api/{account}/user-lists/{userListId}/users`.

Développer un outil interne sur mesure permet aux agences de contrôler entièrement leur couche de données. En combinant authentification intégrée, import via les endpoints de liste et ingestion de webhooks en quasi temps réel, les équipes de développement peuvent créer des applications évolutives, avec une disponibilité de 99,98 %.