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 . 7 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 › Seguridad › Claves de acceso (API), necesitas entrar con tu cuenta. Para crearlas necesitas el permiso API_CREDENTIALS_MANAGE; sin él puedes ver las claves existentes y su uso, pero no crear ninguna.
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 regenérala 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 regenerarla: 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 acceso (API). Para abrirlo, entra con tu cuenta de UTILIA OS.