Ir al contenido

Inicio rápido

Cinco peticiones, en cURL, JavaScript y Python. Al final tienes una clave, una lista de contactos y un webhook que te avisa cuando un lead queda calificado.

  • Eres propietario o admin de tu espacio de WhatSetter. La página de la API lo dice: Solo los propietarios y admins pueden gestionar las claves API.
  • Tienes curl, Node.js 18 o más reciente, o Python 3 con requests.
  • La URL base es https://app.whatsetter.com/api/v1.
  1. Abre Configuración, luego API y MCP.
  2. Haz clic en Crear una clave.
  3. Rellena Nombre de la clave (por ejemplo Sync CRM) y elige los Permisos: Acceso completo, o Personalizado para marcar los scopes uno a uno.
  4. Haz clic en Crear la clave.
  5. Copia la clave. El diálogo lo dice: Copia tu clave ahora. No volverá a mostrarse. Luego haz clic en Ya guardé mi clave.

Guárdala en una variable de entorno, nunca en tu código:

Terminal window
export WHATSETTER_API_KEY="ws_live_…"

GET /me no necesita ningún scope. Te dice qué espacio y qué permisos tiene la clave.

Terminal window
curl https://app.whatsetter.com/api/v1/me \
-H "Authorization: Bearer $WHATSETTER_API_KEY"
{
"data": {
"team_id": "6b0c1d2e3f405162738a",
"key": {
"id": "66f1a2b3c4d5e6f7a8b9c0d1",
"name": "Sync CRM",
"scopes": ["leads:read", "leads:write", "lists:write", "webhooks:manage"]
}
}
}

Un 401 invalid_api_key significa que la clave está mal copiada o revocada. Un 401 missing_api_key significa que la cabecera no nos llegó.

GET /leads necesita leads:read. Filtra por status, campaign_id, phone, source o since, y pagina con limit (1 a 100) y cursor.

Terminal window
curl "https://app.whatsetter.com/api/v1/leads?status=qualified&limit=10" \
-H "Authorization: Bearer $WHATSETTER_API_KEY"
{
"data": [
{
"id": "66f1a2b3c4d5e6f7a8b9c0d1",
"phone": "33612345678",
"name": "Julien",
"status": "qualified",
"qualified": true,
"qualified_at": "2026-09-18T09:12:41.000Z",
"campaign_id": "acme-france-1-ab12",
"source": "list",
"tags": ["hot"],
"messages_count": 14,
"last_message_at": "2026-09-18T09:12:00.000Z",
"last_message_direction": "inbound"
}
],
"pagination": { "has_more": false, "next_cursor": null }
}

El objeto lead está recortado aquí. Cuando has_more es true, devuelve next_cursor como cursor para obtener la página siguiente.

Dos llamadas: POST /lists crea una lista vacía y luego POST /lists/{id}/leads sube hasta 500 contactos por llamada. Ambas necesitan lists:write. Los teléfonos se deduplican dentro del lote y contra la lista.

Terminal window
# 1. Crear la lista
curl -X POST https://app.whatsetter.com/api/v1/lists \
-H "Authorization: Bearer $WHATSETTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Sync CRM, leads calientes"}'
# 2. Subir contactos (sustituye LIST_ID por el id del paso 1)
curl -X POST https://app.whatsetter.com/api/v1/lists/LIST_ID/leads \
-H "Authorization: Bearer $WHATSETTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"leads":[{"phone":"+34612345678","name":"Julia","custom_variables":{"ciudad":"Madrid"}}]}'
{
"data": {
"imported": 1,
"duplicates_in_list": 0,
"rejected": [],
"lead_ids": ["66f1a2b3c4d5e6f7a8b9c0d2"]
}
}

POST /webhooks necesita webhooks:manage. El endpoint debe ser HTTPS.

Terminal window
curl -X POST https://app.whatsetter.com/api/v1/webhooks \
-H "Authorization: Bearer $WHATSETTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://tu-servidor.com/webhooks/whatsetter","events":["contact.qualified","contact.not_qualified"]}'
{
"data": {
"id": "66f1c0ffee00000000000abc",
"url": "https://tu-servidor.com/webhooks/whatsetter",
"events": ["contact.qualified", "contact.not_qualified"],
"active": true,
"description": null,
"secret_prefix": "whsec_3f9a",
"secret": "whsec_3f9a…",
"last_delivery_at": null,
"last_delivery_status": null,
"created_at": "2026-09-19T10:00:00.000Z"
}
}

El secret solo aparece en esta respuesta. Guárdalo: lo necesitas para verificar la firma de cada entrega. Después envíate un evento de prueba firmado con POST /webhooks/{id}/test.