LinkedIn Profile Details
Enriquece cualquier URL de perfil de LinkedIn. Headline, experiencia, formación. JSON limpio en una llamada.
Ejecuta como Apify Actor. Envía hasta 5.000 URLs por ejecución, paga solo por los perfiles encontrados.
Inicio rápido (Apify API)
# Trigger the actor with the Apify APIcurl -X POST "https://api.apify.com/v2/acts/atomus~linkedin-profile-scraper/runs?token=YOUR_APIFY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ }'Qué hace
Manda hasta 100 URLs públicas de perfil de LinkedIn por llamada. Devuelve JSON limpio y normalizado con nombre, cargo, headline, summary, empresa, ubicación y skills. Cada URL cuesta 1 crédito; los errores por URL se reembolsan automáticamente. Sin cuenta de LinkedIn de tu lado.
Endpoint
POST https://api.atomusapi.dev/v1/linkedin-profile-enrichment/enrichAutenticación
Envía tu API key como Bearer token en el header Authorization. Las claves están limitadas a un solo tenant.
Authorization: Bearer atm_live_xxxxxxxxxxxxxxIdempotency
Send Idempotency-Key: <uuid> to make a request safely retryable. Atomus stores the response for 24h and replays it on retries with the same key.
Entrada
Request body
| Field | Type | Description | |
|---|---|---|---|
| url | string | requerido | Una sola URL de perfil de LinkedIn para enriquecer. Debe coincidir con https://www.linkedin.com/in/<handle>/. Para enriquecer varios perfiles, envía una solicitud por URL; el rate limit (4 req/s) te permite paralelizar en el cliente. |
Salida
Response object
| Field | Type | Description | |
|---|---|---|---|
| data.url | string | requerido | Repite la URL enviada en la solicitud. |
| data.status | string | requerido | Uno de: success, not_found, error. |
| data.profile.full_name | string | null | opcional | Nombre completo mostrado. Presente solo cuando status = success. |
| data.profile.title | string | null | opcional | Cargo actual. Solo en success. |
| data.profile.headline | string | null | opcional | Headline del perfil (la frase corta debajo del nombre en LinkedIn). Solo en success. |
| data.profile.summary | string | null | opcional | Resumen del perfil / sección acerca de. Solo en success. |
| data.profile.company.name | string | null | opcional | Nombre de la empresa actual. Solo en success. |
| data.profile.location.country | string | opcional | Código de país (ISO 3166-1 alpha-2). Solo en success. |
| data.profile.location.state | string | opcional | Estado o región. Solo en success. |
| data.profile.location.city | string | opcional | Ciudad. Solo en success. |
| data.profile.skills | string[] | opcional | Habilidades listadas. Solo en success. |
| data.profile.educations | object[] | opcional | Historial educativo; formato upstream opaco, trata cada entrada como unknown por ahora. Solo en success. |
| data.profile.position_groups | object[] | opcional | Historial laboral agrupado por empresa; formato upstream opaco, trata cada entrada como unknown por ahora. Solo en success. |
| data.code | string | opcional | Código de error. Presente solo cuando status = error. |
| data.message | string | opcional | Mensaje de error. Presente solo cuando status = error. |
| meta.request_id | string | requerido | ID de rastreo opaco. Inclúyelo al abrir un ticket de soporte. |
| meta.api | string | requerido | Identificador de la API: linkedin-profile-enrichment. |
| meta.version | string | requerido | Versión de la API. |
| meta.mode | string | requerido | Modo del entorno en el que se ejecutó la solicitud. |
| meta.credits_used | number | requerido | Créditos cobrados por esta solicitud (1 solo cuando status=success; 0 en not_found y error — ambos reservan y reembolsan). |
| meta.credits_remaining | number | requerido | Saldo de créditos del tenant después de esta solicitud. |
| meta.duration_ms | number | requerido | Duración del procesamiento en el servidor en milisegundos. |
Ejemplo de request
curl
curl -X POST "https://api.atomusapi.dev/v1/linkedin-profile-enrichment/enrich" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "url": "https://www.linkedin.com/in/example-1" }'JavaScript
const res = await fetch( "https://api.atomusapi.dev/v1/linkedin-profile-enrichment/enrich", { method: "POST", headers: { "Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json", }, body: JSON.stringify({ url: "https://www.linkedin.com/in/example-1", }), });
if (!res.ok) { const { error } = await res.json(); throw new Error(`${error.code}: ${error.message}`);}
const { data, meta } = await res.json();if (data.status === "success") console.log(data.profile.full_name);else if (data.status === "not_found") console.log("profile not found");else console.error(data.code, data.message);Python
import requests
res = requests.post( "https://api.atomusapi.dev/v1/linkedin-profile-enrichment/enrich", headers={ "Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json", }, json={"url": "https://www.linkedin.com/in/example-1"}, timeout=10,)
if not res.ok: err = res.json()["error"] raise RuntimeError(f"{err['code']}: {err['message']}")
data = res.json()["data"]if data["status"] == "success": print(data["profile"]["full_name"])elif data["status"] == "not_found": print("profile not found")else: print(data["code"], data["message"])Errores y límites
{ "error": { "code": "rate_limit_exceeded", "message": "Human-readable explanation.", "retryable": true, "request_id": "req_01HXXX..." }}unauthenticatedHTTP 401 : Falta el header Authorization o está mal formado. (no reintentar)invalid_api_keyHTTP 401 : La API key no es reconocida o ha sido revocada. (no reintentar)insufficient_creditsHTTP 402 : El saldo de créditos del tenant está por debajo del costo de la solicitud. Recarga y reintenta. (no reintentar)invalid_inputHTTP 400 : El cuerpo de la solicitud no es JSON válido o falta el campo url. (no reintentar)validation_failedHTTP 422 : La url no es una URL válida de perfil linkedin.com/in/<handle>. (no reintentar)rate_limit_exceededHTTP 429 : La tasa sostenida de solicitudes superó el límite del tenant. (reintentable)upstream_errorHTTP 502 : El proveedor upstream devolvió una respuesta de error. (reintentable)upstream_timeoutHTTP 504 : El proveedor upstream no respondió dentro del tiempo límite. (reintentable)internal_errorHTTP 500 : Error inesperado del servidor. (reintentable)
Límites de tasa
4 requests/segundo por cuenta (compartido entre todas las API keys de la misma cuenta). Cada llamada enriquece una URL de perfil de LinkedIn. Para enriquecer varias, paraleliza las llamadas en el cliente hasta el límite. Picos por encima del límite devuelven 429 rate_limit_exceeded; haz backoff usando los response headers. La ventana por segundo se aplica en el servidor; las filas por minuto, hora, día, semana y mes son derivaciones de throughput sostenido.
| Ventana | Máx. solicitudes |
|---|---|
| Por segundo | 4 |
| Por minuto | 240 |
| Por hora | 14,400 |
| Por día | 345,600 |
| Por semana | 2,419,200 |
| Por mes | 10,368,000 |
x-ratelimit-limit: máximo de requests por segundo de la cuenta (compartido entre todas las keys)x-ratelimit-remaining: requests restantes en la ventana actualx-ratelimit-reset: unix epoch (segundos) cuando la ventana se reinicia
Facturación
- 1 crédito por enriquecimiento exitoso
Solo las respuestas success se cobran. Las respuestas not_found (no se encontró perfil en la URL) y error no consumen crédito — el crédito se reserva antes de la llamada y se reembolsa automáticamente. Cada llamada reporta el gasto en meta.credits_used y el nuevo saldo en meta.credits_remaining.
¿Altos volúmenes?
Sáltate los tiers del marketplace y obtén precio unitario ajustado a tu volumen real de llamadas, con línea directa al equipo que opera el pipeline.
Obtener precio por volumen