Conecta tu producto con Fabiana
Avisa a Fabiana cuando alguien se registra o hace algo en tu producto. Ella mantiene el contacto al día y tus automatizaciones envían el email adecuado en el momento adecuado.
Autenticación
Crea una clave en Configuración → Claves API (planes Pro y Business). Solo se muestra una vez. Envíala en cada petición:
Authorization: Bearer fab.…La URL base es https://api.getfabiana.com. Las peticiones y respuestas son JSON. Cada organización puede hacer 300 peticiones por minuto.
Enviar eventos
Una llamada por cada cosa que pasa. Fabiana busca el contacto por email o teléfono, o lo crea, y guarda las propiedades en el contacto como campos personalizados.
curl -X POST https://api.getfabiana.com/v1/events \
-H "Authorization: Bearer $FABIANA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"event": "signed_up",
"contact": { "email": "ana@example.com", "name": "Ana", "emailOptIn": true },
"properties": { "plan": "pro", "seats": 3 }
}'{ "contactId": "6f1c…", "created": true }Qué pasa después
- El evento aparece en la cronología del contacto.
- Se ejecutan las automatizaciones con el disparador Llega un evento, filtradas por nombre del evento y propiedades.
- Se ejecutan las automatizaciones con el disparador Cambia un campo personalizado cuando una propiedad cambia de valor.
- Las secuencias que esperaban este evento avanzan; las que deben pararse con él se paran.
- Un contacto nuevo también activa las automatizaciones de Se crea el contacto.
Los nombres de evento usan letras, números y _ . : -. Las propiedades son planas: hasta 50 textos, números o booleanos.
Emails a partir de tus eventos
Las automatizaciones pueden iniciar una secuencia de emails o enviar un email suelto, escrito como texto o hecho con una plantilla con tu logo y tu color. Asuntos y textos pueden usar {{first_name}}, {{name}}, {{email}} y cualquier propiedad como {{custom.plan}}. Los pasos de una secuencia pueden esperar días u horas, esperar a un evento o a una propiedad, o bifurcarse según una condición.
Los emails de marketing solo llegan a contactos que aceptaron recibirlos o que ya son clientes, y llevan enlace de baja. Envía emailOptIn: true cuando la persona marcó la casilla en tu formulario de registro.
Un email suelto marcado como Transaccional, sobre la propia cuenta o petición de la persona (una bienvenida, un recibo), se envía sin ese consentimiento y sin enlace de baja. Nunca lo uses para promociones.
Añade tu dominio en Configuración → Envío de emails y copia los registros DNS que aparecen. Una vez verificado, los emails salen desde tu propia dirección, firmados para tu dominio.
Contactos
| POST | /v1/events | Registra algo que un contacto hizo en tu producto |
| POST | /v1/contacts | Crea un contacto, o devuelve el que tiene el mismo email o teléfono |
| GET | /v1/contacts | Lista contactos, de 50 en 50 (limit, cursor) |
| GET | /v1/contacts/{id} | Devuelve un contacto |
| PATCH | /v1/contacts/{id} | Actualiza un contacto |
curl -X POST https://api.getfabiana.com/v1/contacts \
-H "Authorization: Bearer $FABIANA_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "email": "ana@example.com", "name": "Ana", "tags": ["trial"], "properties": { "plan": "pro" } }'La referencia completa está en la descripción OpenAPI, que la mayoría de herramientas de API y asistentes de código saben leer.
Webhooks
Añade un endpoint en Configuración → Webhooks y elige los eventos que quieres. Fabiana envía un POST por cada uno y reintenta si tu servidor falla.
contact.created: Se creó un contacto: Fabiana, el equipo, una importación o la APIcontact.updated: Un contacto cambió; changedFields dice quécontact.stage_changed: Un contacto pasó a otra etapa del embudo (también se envía como deal.stage_changed)lead.created: Fabiana captó un nuevo lead en una conversaciónlead.converted: Un contacto llegó por primera vez a la etapa de reservadodeal.closed: Se cerró una venta como ganada (también se envía como deal.closed_won)deal.closed_lost: Un contacto pasó a la etapa de perdidoconversation.created: Empezó una conversación nueva (también se envía como conversation.started)message.received: Un cliente escribió por cualquier canalhandoff.requested: Fabiana pasó una conversación al equipo (también se envía como conversation.handoff)handoff.claimed: Alguien del equipo tomó una conversaciónhandoff.resolved: Se resolvió una conversación que había tomado el equipoconversation.resolved: Una conversación se marcó como resueltaconversation.closed: Una conversación se archivócsat.submitted: Un cliente valoró una conversación
{
"event": "deal.closed",
"organizationId": "…",
"timestamp": "2026-10-29T10:00:00.000Z",
"data": { "contactId": "…", "name": "Ana", "dealClosedValue": 1200, "dealClosedAt": "…", "stage": "booked" }
}Comprueba la cabecera X-Fabiana-Signature con el cuerpo tal cual y el secreto del webhook:
import { createHmac, timingSafeEqual } from 'node:crypto'
function isFromFabiana(rawBody: string, header: string, secret: string): boolean {
const expected = 'sha256=' + createHmac('sha256', secret).update(rawBody).digest('hex')
return header.length === expected.length && timingSafeEqual(Buffer.from(header), Buffer.from(expected))
}Errores
400 la petición no es válida, 401 falta la clave o fue revocada, 403 el rol de la clave o tu plan no lo permiten, 404 no existe ese contacto, 429 demasiadas peticiones. El cuerpo trae un message.
¿Dudas? Escribe a hello@getfabiana.com.