Referencia APIv1

Construye sobre tus pipelines de LeadGrid.

Crea dossiers, muévelos por las etapas, sincroniza notas y reacciona a los eventos. Una sola API REST, JSON de entrada y salida. Disponible en el plan Growth.

01 — Empieza aquí

Resumen

La API de LeadGrid te permite crear y gestionar dossiers, actualizar etapas, adjuntar notas y sincronizar datos con tus propias herramientas. Cada solicitud devuelve JSON.

URL base
https://leadgrid.io/api/v1
Formato
JSON (UTF-8)
Auth
Bearer clave API
Disponibilidad
Plan Growth

Todas las marcas de tiempo están en ISO 8601 UTC. Todos los importes son enteros o decimales en la unidad más práctica (p. ej. euros, no céntimos). La paginación usa page y per_page como parámetros de consulta; las respuestas incluyen un objeto meta con el recuento total.

02 — Seguridad

Autenticación

Cada solicitud debe incluir una clave API en la cabecera Authorization. Las claves comienzan con lg_live_ y están vinculadas a una sola organización.

  1. 1Ve a Ajustes → API y haz clic en Crear clave API.
  2. 2Elige los scopes que necesitas (ver tabla a continuación) y, opcionalmente, establece una fecha de caducidad. La clave completa se muestra una sola vez — cópiala de inmediato.
  3. 3Envía la clave como token Bearer en cada solicitud.
curl
curl https://leadgrid.io/api/v1/dossiers \
  -H "Authorization: Bearer lg_live_your_key_here"
Scopes disponibles
CampoTipoDescripción
dossiers:readscopeListar y recuperar dossiers.
dossiers:writescopeCrear, actualizar y archivar dossiers. También necesario para mover etapas.
flows:readscopeListar flows y leer sus etapas.
notes:readscopeLeer notas en dossiers.
notes:writescopeAñadir nuevas notas a dossiers.
Nunca expongas tu clave en código del lado del cliente. La clave tiene acceso completo a tu organización; trátala como una contraseña. Si una clave se filtra, elimínala desde Ajustes → API y rota de inmediato.
03 — Recursos

Dossiers

Los dossiers son las entidades que rastreas — candidatos en selección o leads en ventas. Cada dossier pertenece exactamente a un flow y se encuentra en exactamente una etapa.

GET/dossiers

Listar los dossiers de tu organización. Admite filtrado y paginación.

Parámetros de consulta
CampoTipoDescripción
typestring'candidate' or 'sales'.
statusstring'active', 'won', 'lost' or 'archived'.
stage_iduuidReturn only dossiers currently in this stage.
pageinteger1-based page number. Default: 1.
per_pageintegerItems per page (max 100). Default: 25.
Ejemplo de solicitud
curl "https://leadgrid.io/api/v1/dossiers?type=sales&status=active" \
  -H "Authorization: Bearer lg_live_your_key"
Ejemplo de respuesta
{
  "data": [
    {
      "id": "6f2b…",
      "type": "sales",
      "name": "Rabobank — Talent rollout",
      "company": "Rabobank",
      "contact_person": "Mark de Vries",
      "deal_size": 45000,
      "deal_currency": "EUR",
      "status": "active",
      "current_stage_id": "c3e1…",
      "assigned_to": "ab12…",
      "created_at": "2026-04-10T09:21:14Z"
    }
  ],
  "meta": { "total": 34, "page": 1, "per_page": 25 }
}
POST/dossiers

Crear un nuevo dossier. Si se omite flow_id, se usa el flow predeterminado para el tipo dado; el dossier comienza en la primera etapa de ese flow. Envía application/json para una creación simple, o multipart/form-data con un campo de archivo 'cv' para crear el dossier Y adjuntar un CV en PDF en una sola llamada atómica — si la subida falla, el dossier se revierte.

Cuerpo de la solicitud
CampoTipoDescripción
type*string'candidate' or 'sales'.
name*stringFor candidates: the person's name. For sales: deal or account name.
emailstringPrimary contact email.
phonestringPrimary contact phone.
companystringCandidate: current employer. Sales: target company.
rolestringCandidate: role they're applying for. Sales: role of the contact.
flow_iduuidOverride the default flow. Must belong to your organization.
assigned_touuidUser ID of the member to assign this dossier to.
intake_notesstringDirector/intake notes shown in the dossier drawer.
contact_personstringSales only. Named contact at the target company.
deal_sizenumberSales only. Expected contract value.
deal_currencystringSales only. ISO 4217 currency code (e.g. 'EUR').
cvfile (pdf)multipart/form-data only. Optional PDF CV (max 10 MB). Uploaded and attached in the same call. If the upload fails, the dossier is rolled back.
Ejemplo de solicitud
# JSON — plain create
curl -X POST https://leadgrid.io/api/v1/dossiers \
  -H "Authorization: Bearer lg_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "sales",
    "name": "KLM — Cabin crew hiring",
    "company": "KLM",
    "contact_person": "Pieter van Leeuwen",
    "deal_size": 62000,
    "deal_currency": "EUR"
  }'

# multipart — create + attach CV in one call
curl -X POST https://leadgrid.io/api/v1/dossiers \
  -H "Authorization: Bearer lg_live_your_key" \
  -F "type=candidate" \
  -F "name=Sophie van Dijk" \
  -F "role=Senior Frontend Engineer" \
  -F "email=sophie@example.com" \
  -F "cv=@./resume.pdf"
Ejemplo de respuesta
{
  "data": {
    "id": "a91c…",
    "type": "candidate",
    "name": "Sophie van Dijk",
    "cv_url": "<org-id>/dossiers/a91c…/cv.pdf",
    "status": "active",
    "current_stage_id": "b77f…",
    "created_at": "2026-04-15T12:03:40Z"
  }
}
GET/dossiers/:id

Recuperar un solo dossier por ID.

Ejemplo de solicitud
curl https://leadgrid.io/api/v1/dossiers/a91c… \
  -H "Authorization: Bearer lg_live_your_key"
Ejemplo de respuesta
{
  "data": {
    "id": "a91c…",
    "type": "sales",
    "name": "KLM — Cabin crew hiring",
    "deal_size": 62000,
    "current_stage_id": "b77f…"
  }
}
PATCH/dossiers/:id

Actualizar cualquier subconjunto de campos. Establecer current_stage_id mueve el dossier a una nueva etapa y emite un webhook dossier.stage_changed.

Cuerpo de la solicitud
CampoTipoDescripción
namestringRename the dossier.
emailstringUpdate primary contact email.
phonestringUpdate phone.
companystringUpdate company / employer.
rolestringUpdate role.
contact_personstringSales only.
deal_sizenumberSales only.
deal_currencystringSales only.
statusstring'active', 'won', 'lost' or 'archived'.
assigned_touuidReassign to another member. Null to unassign.
intake_notesstringReplace intake notes.
current_stage_iduuidMove to a new stage. Must belong to the dossier's flow.
Ejemplo de solicitud
curl -X PATCH https://leadgrid.io/api/v1/dossiers/a91c… \
  -H "Authorization: Bearer lg_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{ "current_stage_id": "d8e2…", "status": "active" }'
Ejemplo de respuesta
{
  "data": {
    "id": "a91c…",
    "current_stage_id": "d8e2…",
    "status": "active"
  }
}
DELETE/dossiers/:id

Archiva el dossier (eliminación suave). Establece el estado en 'archived' y emite dossier.deleted. Los datos se conservan y se pueden restaurar mediante PATCH.

Ejemplo de solicitud
curl -X DELETE https://leadgrid.io/api/v1/dossiers/a91c… \
  -H "Authorization: Bearer lg_live_your_key"
Ejemplo de respuesta
{
  "data": {
    "id": "a91c…",
    "status": "archived"
  }
}
POST/dossiers/:id/cv

Subir un CV en PDF (máx. 10 MB) y adjuntarlo a un dossier existente. La subida reemplaza cualquier CV previo. Acepta multipart/form-data con un campo 'cv', o application/pdf con los bytes del PDF como cuerpo sin formato. Emite dossier.updated.

Ejemplo de solicitud
# multipart/form-data
curl -X POST https://leadgrid.io/api/v1/dossiers/a91c…/cv \
  -H "Authorization: Bearer lg_live_your_key" \
  -F "cv=@./resume.pdf"

# raw application/pdf
curl -X POST https://leadgrid.io/api/v1/dossiers/a91c…/cv \
  -H "Authorization: Bearer lg_live_your_key" \
  -H "Content-Type: application/pdf" \
  --data-binary @./resume.pdf
Ejemplo de respuesta
{
  "data": {
    "id": "a91c…",
    "cv_url": "<org-id>/dossiers/a91c…/cv.pdf"
  }
}
04 — Recursos

Flows

Los flows son los pipelines por los que se mueven los dossiers. Cada flow tiene etapas ordenadas con plazos opcionales y probabilidades de cierre.

GET/flows

Listar los flows de tu organización. Las etapas están anidadas y ordenadas por posición.

Parámetros de consulta
CampoTipoDescripción
typestringFilter to 'candidate' or 'sales'.
pageintegerPage number. Default: 1.
per_pageintegerItems per page. Default: 25.
Ejemplo de solicitud
curl "https://leadgrid.io/api/v1/flows?type=sales" \
  -H "Authorization: Bearer lg_live_your_key"
Ejemplo de respuesta
{
  "data": [
    {
      "id": "f01a…",
      "name": "Sales Flow",
      "type": "sales",
      "is_default": true,
      "stages": [
        {
          "id": "s1…",
          "name": "Lead",
          "position": 1,
          "deadline_days": 3,
          "win_probability": 14,
          "color": "#FF5C35"
        },
        {
          "id": "s2…",
          "name": "Discovery",
          "position": 2,
          "deadline_days": 5,
          "win_probability": 29,
          "color": "#22C55E"
        }
      ]
    }
  ],
  "meta": { "total": 1, "page": 1, "per_page": 25 }
}
GET/flows/:id/stages

Obtener las etapas de un solo flow, ordenadas por posición. Útil si ya conoces el flow_id y solo quieres las etapas.

Ejemplo de solicitud
curl https://leadgrid.io/api/v1/flows/f01a…/stages \
  -H "Authorization: Bearer lg_live_your_key"
Ejemplo de respuesta
{
  "data": [
    {
      "id": "s1…",
      "name": "Lead",
      "position": 1,
      "deadline_days": 3,
      "win_probability": 14
    }
  ],
  "meta": { "total": 6, "page": 1, "per_page": 6 }
}
05 — Recursos

Notas

Las notas son la línea de tiempo de actualizaciones adjuntas a un dossier. Están ordenadas de más antigua a más reciente y siempre son internas por defecto.

GET/dossiers/:id/notes

Listar las notas de un dossier, las más antiguas primero.

Ejemplo de solicitud
curl https://leadgrid.io/api/v1/dossiers/a91c…/notes \
  -H "Authorization: Bearer lg_live_your_key"
Ejemplo de respuesta
{
  "data": [
    {
      "id": "n1…",
      "dossier_id": "a91c…",
      "content": "Had a great first call — strong culture fit.",
      "is_internal": true,
      "created_at": "2026-04-14T09:12:30Z"
    }
  ],
  "meta": { "total": 3, "page": 1, "per_page": 25 }
}
POST/dossiers/:id/notes

Añadir una nueva nota a un dossier. Emite un webhook note.created.

Cuerpo de la solicitud
CampoTipoDescripción
content*stringThe note text. Cannot be empty.
is_internalbooleanDefault: true. Internal notes are not shared.
Ejemplo de solicitud
curl -X POST https://leadgrid.io/api/v1/dossiers/a91c…/notes \
  -H "Authorization: Bearer lg_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{ "content": "Followed up by email." }'
Ejemplo de respuesta
{
  "data": {
    "id": "n2…",
    "dossier_id": "a91c…",
    "content": "Followed up by email.",
    "is_internal": true,
    "created_at": "2026-04-15T12:04:10Z"
  }
}
06 — Eventos

Webhooks

Configura un endpoint de webhook en Ajustes → API. LeadGrid envía una solicitud POST con un cuerpo JSON cuando ocurre cualquiera de estos eventos.

Tipos de eventos
CampoTipoDescripción
dossier.createdeventA new dossier was created (via API, UI or email).
dossier.updatedeventAny field on a dossier changed. Fires alongside stage_changed when applicable.
dossier.stage_changedeventcurrent_stage_id was updated.
dossier.deletedeventDossier was archived (status set to 'archived').
note.createdeventA new note was added to a dossier.
Example payload
POST https://your-app.com/webhooks/leadgrid
Content-Type: application/json
X-LeadGrid-Signature: t=1713178230,v1=3b2c4f…

{
  "id": "evt_…",
  "type": "dossier.stage_changed",
  "created_at": "2026-04-15T12:04:10Z",
  "data": {
    "id": "a91c…",
    "current_stage_id": "d8e2…",
    "status": "active"
  }
}

Verificación de firma

Cada solicitud de webhook incluye una cabecera X-LeadGrid-Signature que contiene una marca de tiempo y una firma HMAC-SHA256 de `${"timestamp"}.${"body"}` firmada con el secreto de tu endpoint. Verifícala antes de confiar en el payload.

node.js (verification)
import crypto from "node:crypto";

export function verifyLeadGridSignature(
  header: string,
  body: string,
  secret: string,
) {
  const parts = Object.fromEntries(
    header.split(",").map((p) => p.split("=")),
  );
  const { t, v1 } = parts as { t: string; v1: string };

  const expected = crypto
    .createHmac("sha256", secret)
    .update(`${t}.${body}`)
    .digest("hex");

  return crypto.timingSafeEqual(
    Buffer.from(expected),
    Buffer.from(v1),
  );
}
07 — Referencia

Errores y límites de solicitudes

Los errores usan códigos de estado HTTP estándar. El cuerpo siempre contiene un objeto de error con un código estable y un mensaje legible.

Error shape
{
  "error": {
    "code": "not_found",
    "message": "Dossier not found."
  }
}
Códigos de error comunes
CampoTipoDescripción
unauthorized401Missing, malformed or invalid API key. Also returned for expired keys.
plan_required402Your organization is on Free or Pro. API access requires Growth.
forbidden403The API key doesn't include the required scope for this action.
not_found404The resource doesn't exist, or doesn't belong to your organization.
invalid_body400Missing required field, unknown value or malformed JSON.
rate_limited429You've exceeded the rate limit for your plan. Retry after the time in the Retry-After header.
internal500Unexpected server error. Safe to retry.
Límite de solicitudes Growth
600 req / min / key
Respuesta 429
Retry-After header in seconds
Cada respuesta incluye X-RateLimit-Limit y X-RateLimit-Remaining cabeceras para que puedas reducir la velocidad antes de alcanzar el límite.