Resposta rápida
En Ajustes → Claves de API, crea una clave con los alcances correctos y llama a https://api.bip.marketing con el encabezado x-bip-api-key. POST /api/leads crea o actualiza contactos, POST /api/events registra eventos, /api/campaigns/trigger dispara una campaña por API y /api/campaigns/cancel cancela un envío pendiente.
Tu sistema ya sabe cuándo alguien se registra, compra o paga. Con la API, la BIP se entera en ese mismo instante: el contacto queda actualizado, la compra entra en su historial y el mensaje correcto le llega a esa persona. Esta guía muestra cómo poner la integración en marcha. La referencia completa de cada endpoint está en bipmarketing.readme.io.
Lo que necesita
- Acceso de administrador a la cuenta de la BIP, para crear la clave
- Un servidor o back end que haga llamadas HTTPS (la clave nunca va al navegador)
- Una campaña con Disparo por API, si vas a enviar mensajes
- Los campos personalizados y KPIs creados en Ajustes, si vas a enviarlos
- Un plan de pago para campañas de WhatsApp (el gratuito envía email)
Lo que vas a lograr
- Contactos creados o actualizados en el momento del registro, sin hojas de cálculo y sin duplicar a nadie.
- Bienvenidas, confirmaciones o recordatorios para una persona, disparados por tu sistema en una sola llamada.
- Compras y otras acciones registradas en el historial del contacto, con valor y detalles.
- Recordatorios que se cancelan solos cuando el cliente cumple: pagó el pedido, terminó la compra.
- Etiquetas y KPIs (ingresos, pedidos, puntos) siempre al día para armar segmentos.
Cómo funciona
- 1Crea una clave de API con los alcances que usa la integración
- 2Tu servidor llama a la BIP con la clave en el encabezado x-bip-api-key
- 3La BIP actualiza el contacto, registra el evento o dispara la campaña
Todas las llamadas van a https://api.bip.marketing, con cuerpo en JSON. La clave identifica tu cuenta: no necesitas indicar el namespace.
Son cuatro endpoints:
POST /api/leadscrea o actualiza un contacto.POST /api/eventsregistra un evento (una compra, un registro de prueba) en el historial del contacto.POST /api/campaigns/triggerdispara una campaña de Disparo por API para un contacto. Si el contacto todavía no existe, la misma llamada puede crearlo.POST /api/campaigns/cancelcancela un disparo con retraso que todavía no salió.
La BIP reconoce a cada persona por el email o por el teléfono. Si el contacto ya existe, los datos nuevos entran en el mismo perfil: los emails, teléfonos y etiquetas se suman, y los campos enviados se actualizan.
Paso a paso
1. Crea la clave de API
- En Ajustes, abre la pestaña Claves de API y haz clic en Añadir nueva clave de API.
- En Nombre, indica quién va a usar la clave. Por ejemplo: Loja Horizonte — sitio web.
- Deja Activo encendido. Si quieres que la clave deje de funcionar en una fecha, enciende Habilitado en Caducidad automática: la BIP sugiere un mes a partir de hoy y tú lo ajustas en el calendario.
- En Alcances, enciende solo lo que usa la integración. La tabla de Alcances muestra qué habilita cada uno.
- Haz clic en Guardar. Aparece el campo Clave de API con el botón de copiar. Copia la clave y guárdala en el servidor.
Solo los administradores crean, editan y eliminan claves. En la lista, cada clave muestra sus alcances y un punto verde (activa) o rojo (inactiva). Puedes volver a copiar la clave desde la lista cuando la necesites.

Captura de pantalla próximamente
2. Prepara campos y KPIs
La API solo guarda campos personalizados y KPIs que ya existen en la cuenta. Crea antes lo que la integración va a enviar.
- En Ajustes → General, ve a Campos y haz clic en Añadir campo para cada dato extra (por ejemplo, Plano, un campo de tipo Cadena para el plan del cliente).
- En KPIs, haz clic en Añadir KPI y completa el ID de KPI (por ejemplo,
receita, para los ingresos) y el Nombre del KPI (Receita). En la API, usas el ID. - Haz clic en Guardar.
Las etiquetas no necesitan preparación: una etiqueta nueva pasa a existir en la cuenta la primera vez que llega por la API.

Captura de pantalla próximamente
3. Envía contactos con POST /api/leads
Úsalo cuando alguien se registra, actualiza su perfil o se convierte en cliente. La clave necesita el alcance Escritura de leads (leads:write).
La BIP busca el contacto por id, email o phone. Si lo encuentra, lo actualiza. Si no lo encuentra, lo crea, y en ese caso name es obligatorio.
{
"name": "Marina Alves",
"email": "marina.alves@exemplo.com",
"phone": "+5511912345678",
"tags": ["cliente", "loja-centro"],
"fields": [{ "key": "Plano", "value": "Ouro" }],
"kpis": { "receita": 349.9 },
"metadata": { "origem_cadastro": "checkout" }
}
Qué pasa con cada dato:
- Nombre: reemplaza el nombre actual.
- Email y teléfono: los valores nuevos se suman al perfil. El teléfono, siempre con
+y el código de país. - Etiquetas:
tagssuma;tagsRemovequita. La API nunca quita una etiqueta que no pediste. - Campos:
keyes el nombre del campo, tal como aparece en Ajustes. Unvaluevacío ("",nullo[]) borra el campo del contacto. Un valor con formato incorrecto se ignora solo en ese campo. - KPIs: el valor se suma a lo que el contacto ya tiene. Enviar
{"receita": 120}a quien tiene 349,90 deja 469,90. Para puntuar contactos, crea un KPI comopuntosy ve sumando por aquí. - Metadatos: cada clave enviada reemplaza a la anterior; las demás quedan como están.
- Contacto archivado: vuelve a la lista.
La respuesta trae el id del contacto y repite los datos enviados. Guarda el id si vas a registrar eventos después.
curl -X POST https://api.bip.marketing/api/leads \
-H "Content-Type: application/json" \
-H "x-bip-api-key: TU_CLAVE_DE_API" \
-d '{"name": "Marina Alves", "email": "marina.alves@exemplo.com", "phone": "+5511912345678", "tags": ["cliente"]}'4. Registra eventos con POST /api/events
Úsalo para guardar lo que la persona hizo fuera de la BIP: una compra, una prueba iniciada, una nota de satisfacción. La clave necesita el alcance Escritura de eventos (events:write).
typees libre:purchase,trial_started,nps.- Indica el contacto por
leadId(elidque devuelve/api/leads) o portracker(el identificador del visitante del script del sitio). El contacto tiene que existir. valuees texto:"349.90","9".metadataguarda los detalles que quieras (número de pedido, artículos).
El evento aparece en el Feed del contacto con el tipo, el valor y los detalles en Más información. Para segmentar a quienes compraron, envía en el mismo momento una etiqueta o un KPI por /api/leads, como en la receta de compra de Listo para copiar.
curl -X POST https://api.bip.marketing/api/events \
-H "Content-Type: application/json" \
-H "x-bip-api-key: TU_CLAVE_DE_API" \
-d '{"type": "purchase", "leadId": "ID_DEL_CONTACTO", "value": "349.90", "metadata": {"pedido": "LH-10482"}}'5. Crea la campaña de Disparo por API
Para enviarle un mensaje a una persona por la API, usas una campaña con Disparo por API. No usa segmento: cada llamada elige el contacto.
- En Campañas, haz clic en Nueva campaña.
- Elige el Canal y el contenido: Email con una Plantilla de email (y, si quieres, hasta 3 Webhooks), o WhatsApp con una plantilla aprobada.
- En Tipo de Programación, elige Disparo por API.
- En Modo de Disparo, elige Inmediato (el mensaje sale en cuanto la BIP recibe la llamada) o Retraso (la BIP espera los segundos de Retraso (Segundos); una nueva llamada para el mismo contacto reinicia el temporizador).
- En Ventana de Reingreso del Lead, decide si la persona puede volver a recibirla. Por defecto, cada contacto recibe la campaña una vez. Para recordatorios que se repiten, enciende Permitir Reingreso del Lead y define el Período de Espera (Días).
- Abre Integración vía API: la BIP muestra los comandos listos, ya con el ID de la campaña. El ID también está al final de la dirección de la página.
- Haz clic en Guardar → Guardar y Activar y confirma en Activar Disparo por API.

Captura de pantalla próximamente
6. Dispara con /api/campaigns/trigger
La clave necesita el alcance Disparo de Campañas (campaigns:trigger). Envía campaignId y lead.
lead puede ser:
- Texto, para un contacto que ya existe: el email, el teléfono con código de país, el ID del contacto o el identificador del visitante.
- Objeto, para crear o actualizar el contacto y disparar en la misma llamada. Acepta los mismos datos que
/api/leadsy exige también el alcance Escritura de leads (leads:write).
{
"campaignId": "ID_DE_LA_CAMPAÑA",
"lead": { "name": "Tiago Pereira", "email": "tiago.pereira@exemplo.com", "tags": ["trial"] }
}
La respuesta confirma el contacto y el modo: {"campaignId": "…", "leadId": "…", "mode": "immediate"} o "mode": "delay". El envío ocurre enseguida, en la cola de la campaña.
Para herramientas que solo llaman a una dirección, el mismo endpoint acepta GET, con campaignId, lead y api-key en la URL. En ese caso, identifica el contacto por el email. Para todo lo demás, usa POST.
curl -X POST https://api.bip.marketing/api/campaigns/trigger \
-H "Content-Type: application/json" \
-H "x-bip-api-key: TU_CLAVE_DE_API" \
-d '{"campaignId": "ID_DE_LA_CAMPAÑA", "lead": "marina.alves@exemplo.com"}'7. Cancela un disparo con /api/campaigns/cancel
En una campaña con Retraso, el mensaje queda en espera. Si su motivo desapareció (el cliente pagó, terminó el pedido), cancélalo. La clave necesita el alcance Disparo de Campañas.
- Envía el mismo
campaignIdy el contacto enlead, como texto. - La respuesta trae
"cancelled": truecuando había un envío pendiente y se canceló. - Trae
"cancelled": falsecuando no había nada que cancelar: el mensaje ya salió, nunca se disparó o la campaña es Inmediato. No es un error: puedes llamarlo cuantas veces quieras. - Un disparo cancelado no cuenta como envío.
curl -X POST https://api.bip.marketing/api/campaigns/cancel \
-H "Content-Type: application/json" \
-H "x-bip-api-key: TU_CLAVE_DE_API" \
-d '{"campaignId": "ID_DE_LA_CAMPAÑA", "lead": "marina.alves@exemplo.com"}'Referencia
Base y autenticación
| Elemento | Valor |
|---|---|
| Dirección base | https://api.bip.marketing |
| Clave | Encabezado x-bip-api-key: TU_CLAVE_DE_API |
| Clave en la URL | Parámetro ?api-key=TU_CLAVE_DE_API (prefiere el encabezado) |
| Cuerpo | JSON, con Content-Type: application/json |
Endpoints
| Método | Ruta | Alcance | Para qué |
|---|---|---|---|
| POST | /api/leads | leads:write | Crear o actualizar un contacto |
| POST | /api/events | events:write | Registrar un evento en el contacto |
| GET o POST | /api/campaigns/trigger | campaigns:trigger (y leads:write con lead objeto) | Disparar una campaña por API para un contacto |
| GET o POST | /api/campaigns/cancel | campaigns:trigger | Cancelar un disparo con retraso aún pendiente |
Alcances
| En el panel | Alcance | Qué habilita |
|---|---|---|
| Escritura de leads | leads:write | /api/leads y el lead como objeto en el trigger |
| Escritura de eventos | events:write | /api/events |
| Disparo de Campañas | campaigns:trigger | /api/campaigns/trigger y /api/campaigns/cancel |
| Lectura de leads | leads:read | Lectura de datos del contacto; los endpoints de esta guía no lo usan |
Campos de POST /api/leads
| Campo | Tipo | Cómo funciona |
|---|---|---|
email | texto | Identifica el contacto o suma un email. Envía email, phone o id. |
phone | texto | Formato internacional, con + y el código de país: +5511912345678. |
id | texto | ID de un contacto que ya existe. |
name | texto | Obligatorio para un contacto nuevo, con al menos 2 caracteres. |
tags | lista de textos | Suma etiquetas al contacto. |
tagsRemove | lista de textos | Quita etiquetas. Escríbelas como las guarda la BIP: minúsculas, sin acentos, guion en lugar de espacio (lembrete-pagamento). |
fields | lista de { "key", "value" } | key es el nombre del campo personalizado. Un valor vacío borra el campo. |
kpis | objeto { "id": número } | Se suma al valor actual. Solo KPIs creados en Ajustes. |
metadata | objeto | Datos libres; cada clave enviada reemplaza a la anterior. |
note | { "text", "createdBy" } | Agrega una nota al contacto. Envía los dos campos. |
tracker | texto | Vincula al visitante del script del sitio con el contacto. |
Formato de los campos personalizados: Fecha en aaaa-mm-dd o dd/mm/aaaa; Número con punto decimal; Booleano true o false; Ubicación con el nombre de la ciudad; Teléfono con + y el código de país; Array como lista JSON.
Campos de POST /api/events
| Campo | Tipo | Cómo funciona |
|---|---|---|
type | texto | Obligatorio. Libre: purchase, trial_started, nps. |
leadId | texto | ID del contacto. Envía leadId o tracker. |
tracker | texto | Identificador del visitante, ya vinculado a un contacto. |
value | texto | Valor del evento, como "349.90". Obligatorio cuando type es click. |
metadata | objeto | Detalles libres, como el número de pedido y los artículos. |
url | texto | Página vinculada al evento. La BIP la guarda sin https:// y sin lo que va después de ?. |
Cómo lee la BIP el lead en trigger y cancel
Lo que envías en lead | La BIP busca por |
|---|---|
Texto con @ | |
Texto que empieza con +, o solo dígitos (7 o más) | Teléfono (con código de país: +5511912345678) |
| Otro texto | ID del contacto y, después, identificador del visitante |
| Objeto (solo en el trigger, vía POST) | Crea o actualiza el contacto y dispara |
Códigos de respuesta
| Código | Mensaje | Qué hacer |
|---|---|---|
| 200 | — | Todo salió bien. |
| 400 | Validation Error | Revisa los datos: nombre con 2 caracteres o más en el contacto nuevo, email o teléfono válidos, type en el evento. |
| 400 | leadId or tracker is required | Indica el contacto del evento. |
| 400 | Campaign is not configured for API triggers | Usa una campaña con Disparo por API. |
| 400 | Campaign is not active | Activa la campaña con Guardar y Activar. |
| 403 | API key is not active / API key has expired | Enciende la clave o ajusta la caducidad en Claves de API. |
| 403 | API key does not have the required permissions | Enciende en la clave el alcance que falta. |
| 404 | API key not found | Revisa que la clave se haya copiado completa. |
| 404 | Lead not found | El contacto no existe: créalo con /api/leads o usa lead como objeto. |
| 404 | Campaign not found | Revisa el ID de la campaña. |
Reglas que siempre se aplican
- Un contacto nuevo necesita un
namecon al menos 2 caracteres y un email o teléfono válido. - El trigger solo funciona en campañas de Disparo por API activadas.
- Por defecto, cada contacto recibe una campaña una vez. Un nuevo intento aparece como Rechazada en las estadísticas. Para repetir, enciende Permitir Reingreso del Lead.
- En el modo Retraso, cada contacto tiene como máximo un envío en espera por campaña. Una nueva llamada reinicia el temporizador.
- En BIP Lite, cada disparo de campaña para un contacto cuenta como un envío del mes. Crear contactos, registrar eventos y cancelar disparos no cuentan.
- Quien se dio de baja (opt-out) no recibe el mensaje, aunque se dispare por la API.
Listo para copiar
Se registró en el sitio → bienvenida en una llamada
Nimbus App envía un email de bienvenida en cuanto alguien crea su cuenta. Una campaña de Disparo por API en modo Inmediato, con el email de bienvenida, y una llamada con lead como objeto: la BIP crea el contacto y envía. El campo Plano (Cadena) tiene que existir en Ajustes. La clave necesita Disparo de Campañas y Escritura de leads.
curl -X POST https://api.bip.marketing/api/campaigns/trigger \
-H "Content-Type: application/json" \
-H "x-bip-api-key: TU_CLAVE_DE_API" \
-d '{
"campaignId": "ID_DE_LA_CAMPAÑA",
"lead": {
"name": "Tiago Pereira",
"email": "tiago.pereira@exemplo.com",
"tags": ["trial"],
"fields": [{ "key": "Plano", "value": "Trial" }]
}
}'// En el servidor de Nimbus App, justo después de crear la cuenta del usuario
const API_KEY = process.env.BIP_API_KEY ?? 'TU_CLAVE_DE_API';
export async function enviarBoasVindas(usuario: { nome: string; email: string }) {
const res = await fetch('https://api.bip.marketing/api/campaigns/trigger', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'x-bip-api-key': API_KEY },
body: JSON.stringify({
campaignId: 'ID_DE_LA_CAMPAÑA',
lead: {
name: usuario.nome,
email: usuario.email,
tags: ['trial'],
fields: [{ key: 'Plano', value: 'Trial' }]
}
})
});
if (!res.ok) throw new Error(`BIP ${res.status}: ${await res.text()}`);
return res.json(); // { campaignId, leadId, mode }
}Compra → evento purchase
Loja Horizonte registra cada pedido pagado. Primero, actualiza el contacto con la etiqueta cliente y suma los KPIs receita (ingresos) y pedidos (crea los dos en Ajustes). Después, registra el evento purchase con el valor y el número de pedido. La clave necesita Escritura de leads y Escritura de eventos.
curl -X POST https://api.bip.marketing/api/leads \
-H "Content-Type: application/json" \
-H "x-bip-api-key: TU_CLAVE_DE_API" \
-d '{"name": "Marina Alves", "email": "marina.alves@exemplo.com", "tags": ["cliente"], "kpis": {"receita": 349.9, "pedidos": 1}}'
curl -X POST https://api.bip.marketing/api/events \
-H "Content-Type: application/json" \
-H "x-bip-api-key: TU_CLAVE_DE_API" \
-d '{"type": "purchase", "leadId": "ID_DEL_CONTACTO", "value": "349.90", "metadata": {"pedido": "LH-10482", "itens": 3}}'// En el servidor de Loja Horizonte, cuando se confirma el pago del pedido
const API_KEY = process.env.BIP_API_KEY ?? 'TU_CLAVE_DE_API';
async function bip(path: string, body: unknown) {
const res = await fetch(`https://api.bip.marketing${path}`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'x-bip-api-key': API_KEY },
body: JSON.stringify(body)
});
if (!res.ok) throw new Error(`BIP ${res.status}: ${await res.text()}`);
return res.json();
}
export async function registrarCompra(pedido: { id: string; total: number; itens: number; nome: string; email: string }) {
const contato = await bip('/api/leads', {
name: pedido.nome,
email: pedido.email,
tags: ['cliente'],
kpis: { receita: pedido.total, pedidos: 1 }
});
await bip('/api/events', {
type: 'purchase',
leadId: contato.id,
value: pedido.total.toFixed(2),
metadata: { pedido: pedido.id, itens: pedido.itens }
});
}Con esto, el segmento de clientes sale de un solo criterio: KPI → Indicador Receita → Mayor o igual a → el valor que quieras.
Cancelar el recordatorio cuando paga
Loja Horizonte le recuerda el pago a quien generó un código Pix (el pago instantáneo de Brasil) y no pagó. La campaña Recordatorio de pago usa Disparo por API con un Retraso de 3600 segundos (una hora). El sistema la dispara cuando se genera el Pix y la cancela cuando entra el pago. Si la persona paga antes de una hora, el recordatorio nunca sale y no cuenta como envío. La clave necesita Disparo de Campañas.
# Pix generado: programa el recordatorio
curl -X POST https://api.bip.marketing/api/campaigns/trigger \
-H "Content-Type: application/json" \
-H "x-bip-api-key: TU_CLAVE_DE_API" \
-d '{"campaignId": "ID_DE_LA_CAMPAÑA", "lead": "marina.alves@exemplo.com"}'
# Pago confirmado: cancela el recordatorio
curl -X POST https://api.bip.marketing/api/campaigns/cancel \
-H "Content-Type: application/json" \
-H "x-bip-api-key: TU_CLAVE_DE_API" \
-d '{"campaignId": "ID_DE_LA_CAMPAÑA", "lead": "marina.alves@exemplo.com"}'// En el servidor de Loja Horizonte
const API_KEY = process.env.BIP_API_KEY ?? 'TU_CLAVE_DE_API';
const CAMPANHA_LEMBRETE = 'ID_DE_LA_CAMPAÑA';
async function bip(path: string, body: unknown) {
const res = await fetch(`https://api.bip.marketing${path}`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'x-bip-api-key': API_KEY },
body: JSON.stringify(body)
});
if (!res.ok) throw new Error(`BIP ${res.status}: ${await res.text()}`);
return res.json();
}
// Pix generado: el recordatorio sale dentro de una hora, si nada cambia
export const agendarLembrete = (email: string) =>
bip('/api/campaigns/trigger', { campaignId: CAMPANHA_LEMBRETE, lead: email });
// Pago confirmado: { cancelled: true } si el recordatorio todavía estaba en espera
export const cancelarLembrete = (email: string) =>
bip('/api/campaigns/cancel', { campaignId: CAMPANHA_LEMBRETE, lead: email });Si el comprador puede no ser contacto todavía, cambia el email del trigger por un lead objeto con nombre y email (la clave pasa a necesitar también Escritura de leads). Para recordarle a la misma persona en pedidos futuros, enciende Permitir Reingreso del Lead en la campaña.
Cómo medir
- Respuestas de la API: guarda en tu sistema el código y el cuerpo de cada respuesta. El
leadId, elmodey elcancelledte dicen qué hizo la BIP. - Contacto: en Leads, abre el contacto. El Feed muestra la creación y las actualizaciones hechas por la API, las etiquetas, los KPIs y cada evento con su tipo y valor. La sección KPIs muestra el total acumulado.
- Fuente: en Segmentos, el criterio Primera / Última fuente → Primera fuente (Tipo) → API cuenta cuántos contactos llegaron por la integración.
- Campaña: en Campañas, abre Ver Estadísticas de la campaña por API. Ves procesados, entregados, aperturas y clics y, en Interacciones del destinatario, el estado de cada persona: Enviado, Rechazada (ya la había recibido), Baja o Error.
Preguntas frecuentes
¿Llamar a la API cuenta como envío?
No. Crear y actualizar contactos y registrar eventos no consumen envíos. Lo que cuenta es cada disparo de campaña para un contacto. Un disparo con retraso cancelado antes de salir no cuenta.
¿Qué pasa si disparo dos veces para la misma persona?
En el modo Inmediato, cada llamada es un nuevo disparo, y la Ventana de Reingreso del Lead decide si la persona la recibe de nuevo. Por defecto, la recibe una vez. En el modo Retraso, la segunda llamada reinicia el temporizador y sale un solo mensaje.
¿Puedo llamar a la API directamente desde el navegador o la app?
No. La clave quedaría a la vista de cualquiera. Llama a la API desde tu servidor. En el sitio, el script del sitio registra las visitas, y tu servidor vincula al visitante con el contacto mediante el campo tracker.
¿Cuál es la diferencia entre la API y los webhooks?
La API lleva datos de tu sistema a la BIP. Los webhooks hacen el camino inverso: llevan los datos del contacto de la BIP a tu sistema en cada envío de campaña.