Events
POST /v1/events, POST /v1/events/bulk y GET /v1/events: tracking de eventos custom con auto-creación de leads, envío masivo de hasta 1,000 eventos y consulta con filtros y paginación.
Trackea eventos desde tu aplicación hacia ReallyQuickEmails para segmentación y automatizaciones. Los eventos se asocian automáticamente a leads — si el email no existe, RQE crea un lead nuevo con datos vacíos.
Autenticacion
Authorization: Bearer sk_proj_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxVer más en API Pública v1.
Endpoints
POST /v1/events
Trackea un evento individual.
Parámetros del body:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| string | Sí | Email del lead. Se normaliza (trim + minúsculas) y se valida el formato | |
| event | string | Sí | Nombre del evento — nomenclatura libre, usa la que tenga sentido en tu app |
| properties | object | No | Propiedades custom del evento. Debe ser un objeto, no un array |
| timestamp | ISO 8601 | No | Cuándo ocurrió (default: ahora) |
Request:
curl -X POST https://api.reallyquickemails.com/v1/events \
-H "Authorization: Bearer sk_proj_xxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"email": "jane@acme.com",
"event": "bought_stuff",
"properties": {
"item": "shoes",
"total": 89.99,
"category": "running"
},
"timestamp": "2026-04-10T15:00:00Z"
}'import { RQE } from '@reallyquickemails/sdk';
const rqe = new RQE({ apiKey: 'sk_proj_xxxxxxxxxxxx' });
const { data, error } = await rqe.events.track({
email: 'jane@acme.com',
event: 'bought_stuff',
properties: { item: 'shoes', total: 89.99, category: 'running' },
timestamp: '2026-04-10T15:00:00Z',
});Response (201):
{
"success": true,
"event_id": "uuid",
"recipient_id": "uuid",
"created_lead": true
}created_lead: true = el email no existía y se creó un lead nuevo automáticamente.
Errores:
| Código | Significado |
|---|---|
| 400 | Validación fallida: campo faltante, email inválido o properties no es objeto |
Ver más en Leads.
POST /v1/events/bulk
Trackea hasta 1,000 eventos en una sola petición.
Parámetros del body:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| events | array | Sí | Hasta 1,000 eventos. Cada elemento acepta los mismos campos que POST /v1/events: email y event requeridos; properties y timestamp opcionales |
Request:
curl -X POST https://api.reallyquickemails.com/v1/events/bulk \
-H "Authorization: Bearer sk_proj_xxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"events": [
{ "email": "jane@acme.com", "event": "signed_up" },
{ "email": "mike@store.co", "event": "bought_stuff", "properties": { "total": 50 } },
{ "email": "sarah@clinic.com", "event": "appt_done", "properties": { "service": "cleaning" } }
]
}'const { data, error } = await rqe.events.bulk([
{ email: 'jane@acme.com', event: 'signed_up' },
{ email: 'mike@store.co', event: 'bought_stuff', properties: { total: 50 } },
{ email: 'sarah@clinic.com', event: 'appt_done', properties: { service: 'cleaning' } },
]);Response (201):
{
"success": true,
"total": 3,
"created_leads": 1
}total: cantidad de eventos registrados.created_leads: cantidad de leads nuevos creados automáticamente (emails únicos que no existían).
Errores:
| Código | Significado |
|---|---|
| 400 | Más de 1,000 eventos, o un elemento inválido. La validación es por elemento: la respuesta indica el índice (por ejemplo, events[2].email is required) y no se registra ningún evento |
GET /v1/events
Lista eventos con filtros; los resultados se ordenan por timestamp descendente (más recientes primero).
Parámetros de query:
| Parámetro | Tipo | Default | Descripción |
|---|---|---|---|
| string | — | Filtrar por email (se normaliza antes de comparar) | |
| event | string | — | Filtrar por nombre de evento |
| since | ISO 8601 | — | Eventos desde esta fecha (inclusive) |
| until | ISO 8601 | — | Eventos hasta esta fecha (inclusive) |
| page | number | 1 | Página |
| per_page | number | 50 | Resultados por página (mín 1, máx 200) |
Request:
curl "https://api.reallyquickemails.com/v1/events?email=jane@acme.com&event=bought_stuff&since=2026-04-01" \
-H "Authorization: Bearer sk_proj_xxxxxxxxxxxx"const { data, error } = await rqe.events.list({
email: 'jane@acme.com',
event: 'bought_stuff',
since: '2026-04-01',
});Response (200):
{
"success": true,
"data": [
{
"id": "uuid",
"email": "jane@acme.com",
"event": "bought_stuff",
"properties": { "item": "shoes", "total": 89.99 },
"timestamp": "2026-04-10T15:00:00Z",
"recipient_id": "uuid",
"created_at": "2026-04-10T15:00:01Z"
}
],
"pagination": {
"page": 1,
"per_page": 50,
"total": 142,
"total_pages": 3
}
}Ver más en SDK de Node.js.
Errores
Las respuestas de error tienen el formato { "error": "mensaje" }. Códigos comunes a todos los endpoints:
| Código | Significado |
|---|---|
| 401 | API key faltante o inválida |
| 500 | Error interno (incluye campo adicional details) |