# Mensaje de bienvenida automático en OnlyFans con cada suscripción (webhook subscriptions.new)

> Aprende a enviar automáticamente un mensaje de bienvenida en OnlyFans con el webhook subscriptions.new: eventos casi en tiempo real en lugar de polling manual.

**En resumen**

- El webhook `subscriptions.new` (desde el plan Basic) se activa casi en tiempo real cuando un nuevo fan se suscribe.
- Usa como `chat_id` de tu respuesta de la API el ID del fan que viene en el objeto `user` (o `fan`) del payload, no el `user_id` de primer nivel (que es el creador conectado).
- Los mensajes de bienvenida de pago automatizados requieren un precio entre 3 y 200 y un array `mediaFiles` con contenido, salvo que `lockedText` sea true.
- Los eventos de webhook casi en tiempo real reemplazan el polling periódico de las listas de suscriptores.
- Las agencias pueden desplegar secuencias de bienvenida con código backend propio o con nuestros propios paquetes no-code para Zapier, Make y n8n.

Para enviar automáticamente un mensaje de bienvenida en OnlyFans cuando alguien se suscribe, los desarrolladores pueden escuchar el evento de webhook `subscriptions.new` y lanzar una solicitud POST a la API de mensajes de chat. [OnlyFansAPI](https://fansapi.com) ofrece este webhook desde el plan Basic, así que los saludos gratuitos o el contenido Pay-Per-View (PPV) bloqueado se envían casi en tiempo real después de que el fan se suscribe.

**Puntos clave**

- El webhook `subscriptions.new` (desde el plan Basic) se activa casi en tiempo real cuando un nuevo fan se suscribe.
- Usa como `chat_id` de tu respuesta de la API el ID del fan que viene en el objeto user (o fan) del payload, no el `user_id` de primer nivel (que es el creador conectado).
- Los mensajes de bienvenida de pago automatizados requieren un precio entre 3 y 200 y un array `mediaFiles` con contenido, salvo que `lockedText` sea true.
- Los eventos de webhook casi en tiempo real reemplazan el polling periódico de las listas de suscriptores.
- Las agencias pueden desplegar secuencias de bienvenida con código backend propio o con nuestros propios paquetes no-code para Zapier, Make y n8n.

## Cómo activar webhooks con cada nuevo suscriptor

La forma de activar webhooks con cada nuevo suscriptor es configurar un endpoint que reciba el evento `subscriptions.new`, que envía una solicitud HTTP POST con los datos del nuevo suscriptor casi en tiempo real después de que se suscribe. Los desarrolladores configuran una URL de servidor para recibir este payload, verifican el evento entrante y extraen el ID de usuario del fan para lanzar acciones posteriores, como enviar un mensaje de bienvenida automatizado.

Este enfoque basado en eventos reemplaza el polling manual de listas de suscriptores paginadas. Escuchar `subscriptions.new` requiere el plan Basic ($69/mes) o superior, ya que el plan Free no incluye webhooks.

## Polling frente a push casi en tiempo real

Una de las grandes diferencias técnicas en la operación de creadores es cómo los sistemas detectan a los nuevos suscriptores.

| Criterio de arquitectura | Polling periódico | Push casi en tiempo real (`subscriptions.new`) |
| --- | --- | --- |
| **Velocidad de detección** | Depende de tu intervalo de polling | Entrega casi en tiempo real |
| **Eficiencia de créditos** | 1 crédito por solicitud no cacheada, en cada consulta | 1 crédito por cada 100 eventos de webhook |
| **Deduplicación** | Requiere registros de diferencias en una base de datos local | Encabezado `X-OFAPI-Idempotency-Key` por evento |
| **Infraestructura** | Bucles cron pesados | Handler de webhooks basado en eventos |

Con los webhooks, el mensaje de bienvenida sale casi en tiempo real después de que el fan se suscribe.

## Reglas de los mensajes de pago (PPV) en automatizaciones

Al responder a un nuevo suscriptor, los desarrolladores pueden enviar texto gratuito o adjuntar contenido Pay-Per-View (PPV) bloqueado. La API aplica reglas específicas a estos mensajes directos.

- **Restricciones de precio:** los mensajes directos de pago tienen un precio de 3 a 200. La API acepta un precio de 0 (gratis) o de 3 a 200 y rechaza cualquier otro valor.
- **Contenido multimedia obligatorio:** todo mensaje de pago con un precio mayor que 0 debe incluir al menos un archivo multimedia, salvo que `lockedText` sea true. Un payload con precio, un array `mediaFiles` vacío y sin `lockedText` devuelve un error de validación 422.
- **Formatos de ID de medios:** el parámetro `mediaFiles` acepta ID de subida temporales generados con nuestra API (p. ej., `ofapi_media_123`) e ID permanentes de medios de la bóveda (p. ej., `3866342509`). Puedes combinar estos ID en el mismo array. Consulta nuestra [guía de subida de medios](https://docs.fansapi.com/introduction/guides/uploading-media) para ver cómo obtener los ID.
- **Vistas previas gratuitas:** para ofrecer adelantos gratuitos junto al contenido bloqueado, pasa los ID de vista previa en el array `previews`. Todo elemento incluido en el array `previews` también debe estar en el array `mediaFiles`.

## El payload del webhook subscriptions.new

Cuando un fan se suscribe, el servidor envía un payload JSON con los detalles del evento y el perfil del suscriptor. Para ver la lista completa de eventos compatibles y las instrucciones para verificar la firma HMAC, consulta nuestra [guía de webhooks de OnlyFans](https://fansapi.com/es/blog/guia-webhooks-onlyfans).

```json
{
  "event": "subscriptions.new",
  "account_id": "acct_123",
  "payload": {
    "id": "123",
    "type": "subscribed",
    "createdAt": "2026-10-04T12:00:00+00:00",
    "subType": "new_subscriber",
    "user_id": "222222222",
    "user": {
      "id": 987654321,
      "name": "Alex",
      "username": "alex99",
      "subscribePrice": 0,
      "isVerified": true,
      "canReceiveChatMessage": false
    }
  }
}
```

El `user_id` dentro del payload es el ID del creador conectado, no el del suscriptor. El ID del suscriptor está en el objeto user (y fan), y normalmente es su ID de chat para los mensajes directos.

## Ejemplos de código de implementación

Puedes escuchar el evento y enviar un mensaje de bienvenida con los SDK oficiales o con solicitudes REST directas. Los webhooks se entregan al menos una vez, así que ambos ejemplos omiten las repeticiones del mismo evento usando el encabezado `X-OFAPI-Idempotency-Key`.

### Implementación en TypeScript con Node.js

```typescript
import express from 'express';
import OnlyFansAPI from '@onlyfansapi/onlyfans-sdk';

const app = express();
app.use(express.json());
const client = new OnlyFansAPI();
const seen = new Set<string>(); // usa un almacenamiento persistente en producción

app.post('/webhooks/onlyfans', async (req, res) => {
  const { event, account_id, payload } = req.body;
  const eventKey = req.header('X-OFAPI-Idempotency-Key');

  // Responder primero, luego enviar
  res.sendStatus(200);
  if (eventKey) {
    if (seen.has(eventKey)) return;
    seen.add(eventKey);
  }

  if (event === 'subscriptions.new') {
    const fanId = String(payload.user.id);

    try {
      await client.chats.messages.send(fanId, {
        account: account_id,
        text: 'Hey! Thanks for subscribing 💜 Check your DMs for a surprise.',
      });

      await client.chats.messages.send(fanId, {
        account: account_id,
        text: 'Here is an exclusive welcome video just for you.',
        price: 9.99,
        mediaFiles: ['3866342509']
      });
    } catch (error) {
      console.error('Failed to send message');
    }
  }
});

app.listen(3000, () => console.log('Listening on port 3000'));
```

### Implementación en Python

```python
import os
from fastapi import FastAPI, Request, Response
from onlyfansapi import OnlyFansAPI

app = FastAPI()
client = OnlyFansAPI()
seen = set()  # usa un almacenamiento persistente en producción

@app.post("/webhooks/onlyfans")
async def handle_webhook(request: Request):
    event_key = request.headers.get("X-OFAPI-Idempotency-Key")
    if event_key in seen:
        return Response(status_code=200)
    if event_key:
        seen.add(event_key)

    data = await request.json()
    event = data.get("event")
    account_id = data.get("account_id")
    payload = data.get("payload", {})

    if event == "subscriptions.new":
        fan = payload.get("user", {})
        fan_id = str(fan.get("id"))

        client.chats.messages.send(
            fan_id,
            account=account_id,
            text="Hey! Thanks for subscribing 💕",
        )

        client.chats.messages.send(
            fan_id,
            account=account_id,
            text="Unwrap your exclusive welcome gift.",
            price=5.00,
            media_files=["3866342509"],
        )

    return Response(status_code=200)
```

### Solicitud REST directa

```bash
curl -X POST "https://app.fansapi.com/api/acct_123456789/chats/987654321/messages" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Welcome to my VIP page! Here is a welcome treat.",
    "price": 10,
    "mediaFiles": ["3866342509"]
  }'
```

## Automatización no-code de mensajes de bienvenida

Los creadores y los operadores de agencias pueden crear estas secuencias sin escribir código con nuestras [integraciones de Zapier, Make y n8n](https://fansapi.com/no-code). Estos paquetes nativos se conectan directamente a tu cuenta. Los disparadores de suscriptores funcionan con webhooks, así que requieren el plan Basic o superior.

- **Configuración en Zapier:** selecciona la app OnlyFans API y elige el disparador New Subscriber. Nuestra app de Zapier solo ofrece disparadores, así que envía la respuesta desde n8n, Make o tu propio código.
- **Configuración en Make:** añade el disparador OnlyFans API New Subscription. Conecta un módulo Make a custom API call que envíe tu texto y un precio opcional al endpoint Send Message.
- **n8n (recomendado):** instala nuestro nodo de comunidad `@onlyfansapi/n8n-nodes-onlyfansapi`. Añade un listener de webhook en n8n y apunta un webhook `subscriptions.new` a su URL. Usa lógica condicional para crear ramas según el precio de suscripción (`{PRICE}` en el payload) y luego añade el nodo OnlyFans API para ejecutar la operación Send Message.