API de leads
Crea leads en el CRM desde tu servidor con POST /api/v1/leads y una clave de API: campos y máximos, límites, errores y qué pasa con el lead creado.
Actualizado el . 8 min de lectura
Incluido en los planes Profesional y Avanzado. Ver precios
POST /api/v1/leads crea un lead en el CRM desde cualquier sistema tuyo: tu web, tu tienda en línea, un formulario de WordPress o un proceso automático. Es la vía más flexible, porque decides tú qué campos envías, y la adecuada cuando la petición sale de un servidor. Si quieres captar desde el navegador de tus visitantes sin programar, usa un formulario insertado.
Crear un lead desde tu servidor
Participan: Tu servidor, UTILIA OS, Tu equipo.
De Tu servidor a UTILIA OS:
POST /api/v1/leads
Con la cabecera X-API-Key y los datos del lead.Nota en UTILIA OS:
Comprueba la clave (401) y su límite (429), el plan (403), los datos (400) y que el correo no esté ya en un lead (409).De UTILIA OS a Tu servidor:
201: success y lead (respuesta)
Con las cabeceras X-RateLimit del contador de la clave.De UTILIA OS a Tu equipo:
Lead nuevo en el CRM
Asignado a quien creó la clave, con aviso a las personas y departamentos elegidos en ella.
Endpoint
/api/v1/leadsCrea un lead en el CRM
Autenticación
Envía la clave en la cabecera X-API-Key:
X-API-Key: utl_tu_clave_de_apiLas claves se crean en Ajustes › Claves de API, necesitas entrar con tu cuenta, con Nueva clave y el tipo Enviar leads desde tu web, que solo crea leads. Para crearlas necesitas el permiso API_CREDENTIALS_MANAGE, y que el plan incluya el CRM con sus leads. Con API_CREDENTIALS_VIEW («Ver las claves de API») solo puedes consultarlas y ver su uso.
Una clave de API de la organización (utk_…) no sirve en esta ruta, que responde 401 con ella. Con una de esas claves, si incluye «CRM: escribir», los leads se crean con POST /api/crm/leads, la ruta que usa la aplicación.
Cada clave se abre pulsando su fila, en el grupo Enviar leads: en su ficha se activa o se desactiva, se eligen sus avisos de leads y se ve su uso. Al renovarla con Renovar la clave, al pie de la ficha, la actual deja de valer en el acto y la nueva solo se muestra una vez. Si tienes la verificación en dos pasos, crear o renovar una clave te pide el código.
En la misma pantalla, en el grupo Aplicaciones externas, aparecen también las claves de las aplicaciones externas de tu organización, con el nombre de su aplicación. Su ficha dice «Es la clave de la aplicación nombre de la aplicación. Se renueva y se retira desde su ficha.» (o, si tu plan no incluye Integraciones, «Es la clave de una aplicación externa.»). Esas no se renuevan, desactivan ni borran desde aquí: se gestionan desde la ficha de la aplicación, que se abre con Abrir la aplicación si puedes verla. Si se intenta por la API, la respuesta es 409 con API_KEY_MANAGED_BY_EXTERNAL_APP.
La clave no va en el navegador
Usa la clave solo en tu servidor. Si la pones en el JavaScript de una página, cualquiera puede leerla y crear leads en tu nombre. Si sospechas que se ha filtrado, desactívala o renuévala desde la misma pantalla.
Campos del cuerpo
Cada campo de texto tiene un máximo de caracteres; si lo superas, la respuesta es 400. Es la causa más habitual de un 400 cuando los datos parecen correctos.
- emailstringobligatorio
- Correo principal. Formato válido. Hasta 255 caracteres.
- sourcestringobligatorio
- Origen del lead, texto libre ('landing-web', 'formulario-contacto'...). De él se deduce la categoría de origen que verás en el CRM. Hasta 100 caracteres.
- fullNamestring
- Nombre completo. Hasta 200 caracteres. Envía al menos uno de fullName, firstName o lastName.
- firstNamestring
- Nombre. Hasta 100 caracteres.
- lastNamestring
- Apellidos. Hasta 100 caracteres.
- secondaryEmailstring
- Correo secundario, distinto del principal. Sirve para asociar al lead los correos que lleguen desde otra dirección. Hasta 255 caracteres.
- leadTypestringPor defecto:
OTHER - LEAD_MAGNET, DEMO_REQUEST, CONTACT_FORM, REFERRAL, EVENT, COLD_OUTREACH, INBOUND_CALL u OTHER.
- phonestring
- Teléfono fijo. Hasta 50 caracteres.
- mobilestring
- Teléfono móvil. Hasta 50 caracteres.
- companyNamestring
- Empresa. Hasta 200 caracteres.
- positionstring
- Cargo. Hasta 150 caracteres.
- websitestring
- Sitio web. Hasta 255 caracteres.
- notesstring
- Notas. Sin máximo declarado.
- tagsstring[]
- Etiquetas para clasificar el lead.
- metadataobject
- Datos propios en JSON. Anídalos bajo una clave tuya (ver más abajo).
- pageUrlstring
- Página donde se captó el lead. Hasta 500 caracteres.
- clientTimestampstring
- Momento de la captación en tu sistema, en ISO 8601.
- utmobject
- Etiquetas de la campaña: source, medium y term (hasta 100 caracteres), campaign (hasta 200) y content (hasta 100).
Nombre del lead. Si no envías fullName, se construye uniendo firstName y lastName con lo que llegue; si envías fullName, manda ese. Sin ninguno de los tres, la respuesta es 400.
Tus datos en metadata. El objeto se mezcla en la raíz de la metadata del lead y se aplica el último, así que una clave tuya llamada tracking, apiKey o leadForm sustituiría los datos que guarda el servidor. Anida siempre lo tuyo bajo una clave propia: {"metadata": {"miIntegracion": {"formId": 42}}}.
Campañas de correo. Esta API acepta las etiquetas utm, pero no el identificador del destinatario de una campaña (_ur) que sí acepta el envío de un formulario. Un lead creado por aquí se atribuye a la campaña por sus etiquetas, nunca al envío concreto que abrió esa persona.
Lo que guarda el servidor
Con cada lead, el servidor añade a metadata un bloque tracking:
- tracking.ipstringobligatorio
- IP de origen de la petición. 'unknown' si no se puede saber.
- tracking.userAgentstring | nullobligatorio
- Cabecera user-agent de la petición.
- tracking.refererstring | nullobligatorio
- Cabecera referer.
- tracking.pageUrlstring | nullobligatorio
- El pageUrl que enviaste.
- tracking.utmobjectobligatorio
- Las cinco claves source, medium, campaign, term y content, siempre presentes; las que no envíes valen null.
- tracking.clientTimestampstring | nullobligatorio
- El clientTimestamp que enviaste.
- tracking.serverTimestampstringobligatorio
- Momento en que el servidor creó el lead, en ISO 8601.
Junto a tracking, la metadata incluye apiKey (identificador, nombre y prefijo de la clave usada) y, si la clave pertenece a un formulario de captación, leadForm (identificador y nombre). Todo se ve en la ficha del lead en el CRM.
Qué pasa con el lead creado
- Se asigna a quien creó la clave de API, que figura también como su creador. No hay reparto por reglas: todos los leads de una clave van a la misma persona. Desde ahí puedes reasignarlos en el CRM.
- Nace en estado
NEW, etapaINITIAL_CONTACTy prioridadMEDIUM. - Recibe una puntuación: 20 puntos de partida, más 10 por
phoneomobile, 15 porcompanyName, 10 porposition, 5 porwebsitey 5 porsource, hasta un máximo de 100. - Toma la categoría de origen que se deduce de
source. - Avisa a las personas y departamentos configurados en la clave.
- Dispara el evento de lead creado, que pueden escuchar las automatizaciones y los avisos a tu servidor.
- Suma a las estadísticas del formulario si la clave pertenece a uno.
Límites de peticiones
Límites de la API de leads
- Peticiones por clave
- 100por hora
- Se elige entre 10 y 10.000 al crear la clave.
- Tope general por dirección IP
- 600por minuto
- Para todo el tráfico que llega desde esa dirección.
El límite de una clave no se puede cambiar después, ni siquiera al renovarla: si necesitas otro, crea una clave nueva. Y aunque tu clave admita muchas peticiones por hora, reparte los envíos masivos en el tiempo para no chocar con el tope por dirección IP.
Las respuestas procesadas llevan X-RateLimit-Limit (máximo por hora de la clave), X-RateLimit-Remaining (lo que queda) y X-RateLimit-Reset (cuándo se reinicia el contador, en segundos Unix).
Al superar el límite de la clave, la respuesta 429 no lleva esas cabeceras ni Retry-After. Lee el campo retryAfter del cuerpo: los segundos que faltan para que se reinicie el contador.
{
"statusCode": 429,
"message": "Límite de peticiones superado. Inténtalo de nuevo más tarde.",
"retryAfter": 2841
}Respuesta (201)
{
"success": true,
"lead": {
"id": "clx1234567890",
"email": "juan@empresa.com",
"fullName": "Juan Pérez",
"source": "landing-contacto",
"leadType": "CONTACT_FORM",
"status": "NEW",
"createdAt": "2026-10-08T10:30:00.000Z"
}
}Errores
| Código | Motivo |
|---|---|
| 400 | Falta un campo obligatorio o los tres de nombre, un correo no es válido, el principal y el secundario coinciden, o un campo supera su máximo. |
| 401 | Falta la clave, no es válida o ha caducado. |
| 403 | El plan de la organización dueña de la clave no incluye el CRM (errorCode: MODULE_NOT_ENABLED) o la capacidad de leads (errorCode: CAPABILITY_NOT_ENABLED). |
| 409 | Ya hay un lead no archivado con ese correo, como principal o como secundario, en tu organización. |
| 429 | Límite de la clave superado; el cuerpo trae retryAfter. |
El 403 de plan no se arregla reintentando ni con permisos: hay que ampliar el plan. Se distingue de otros 403 por el errorCode, como se explica en Errores de plan. Los duplicados (409) puedes revisarlos y fusionarlos desde los leads del CRM.
Ejemplos
curl -X POST 'https://os.utilia.ai/api/v1/leads' \
-H 'Content-Type: application/json' \
-H 'X-API-Key: utl_tu_clave_de_api' \
-d '{
"email": "juan@empresa.com",
"fullName": "Juan Pérez",
"source": "landing-contacto",
"leadType": "CONTACT_FORM",
"phone": "+34 912 345 678",
"companyName": "Empresa SL",
"position": "Director Comercial",
"tags": ["web", "interesado"],
"utm": {
"source": "google",
"medium": "cpc",
"campaign": "captacion-2026"
}
}'El ejemplo de WordPress se ejecuta en tu servidor después de que Contact Form 7 envíe su correo, así que la clave no llega nunca al navegador.
Siguiente paso
Cuando el lead esté en el CRM, el flujo sigue allí: califícalo, conviértelo en oportunidad y, al ganarla, en cliente. Lo tienes en Leads. Si además quieres consultar o actualizar leads desde tu aplicación, con scopes y avisos, usa los endpoints de leads de la API externa.
Ponlo en práctica
Lo encontrarás en Claves de API. Para abrirlo, entra con tu cuenta de UTILIA OS.