Referencia de API
HummingDeck expone una API REST para socios de integración y plataformas de automatización. Los endpoints se autentican con un Bearer token y devuelven respuestas JSON.
https://app.hummingdeck.com/api/v1Autenticación
Cada petición a la API lleva un Bearer token en la cabecera Authorization. Se aceptan dos tipos de credencial, y se comportan de forma distinta.
Método
Bearer token
Formato del encabezado
Authorization: Bearer {access_token}
Tipos de credencial
Token de API del espacio de trabajo
Authorization: Bearer hd_api_...
Lo emite el propietario del espacio de trabajo desde Configuración del espacio, Integraciones, HummingDeck API. Disponible para espacios seleccionados durante un piloto privado. El token se muestra una sola vez al crearlo y después no se puede recuperar. Caduca un año después de su creación y queda vinculado de forma permanente al espacio para el que se emitió, así que una petición no puede elegir ni cambiar su espacio de trabajo.
Crear un token cuando ya existe uno lo sustituye, y el anterior deja de funcionar de inmediato. El propietario puede desactivar un token en cualquier momento. Para ese token es definitivo: crea uno nuevo en lugar de esperar restaurarlo.
Los endpoints de suscripción a webhooks no están disponibles para los tokens de API del espacio de trabajo.
Zapier OAuth
Authorization: Bearer {access_token}
Se emite mediante el flujo de autorización OAuth cuando un espacio de trabajo conecta la integración de Zapier. Los tokens de acceso caducan a los 30 días. Usa el token de actualización, que dura 90 días, para obtener uno nuevo sin volver a autorizar.
Es la única credencial que puede crear o eliminar suscripciones a webhooks.
Cuando una petición devuelve 401
Una petición se rechaza con 401 cuando el token es desconocido o incorrecto, ha caducado, se ha desactivado, pertenece a un espacio de trabajo cuyo acceso a la API se ha desactivado, o lo emitió alguien que ya no es propietario de ese espacio.
Prueba tu conexión
Verifica que tu token es válido y consulta el perfil del usuario autenticado.
/meDevuelve el nombre, el correo electrónico y la información del equipo del usuario actual.Documentos
Sube, busca y gestiona documentos (PDFs, presentaciones, propuestas y otros archivos).
/decksSube un nuevo documento. Envía como multipart/form-data con un campo file (PDF, PPTX, DOCX, XLSX, HTML) y un campo title. El límite de carga de la API es de 30 MB./decks?title={query}Busca documentos por título. No distingue mayúsculas de minúsculas; devuelve hasta 20 resultados.Campos de respuesta
| Field | Type | Description |
|---|---|---|
| id | string | ID del documento |
| title | string | Título del documento |
| fileType | string | Tipo de archivo (pdf, pptx, docx, html) |
| pageCount | number | Número de páginas |
| thumbnailUrl | string | URL de la imagen en miniatura |
| createdAt | string | Marca de tiempo ISO 8601 |
Salas
Consulta la estructura de una sala y crea enlaces de audiencia con seguimiento. Solo está disponible con tokens de API del espacio de trabajo; las credenciales OAuth de Zapier se rechazan.
/rooms/{roomId}Devuelve los metadatos, las pestañas, los elementos y el número de enlaces activos y totales./rooms/{roomId}/linksCrea un enlace abierto con atribución para una sala activa.Crear un enlace abierto para una sala
Indica al menos uno de estos campos: recipientName, recipientEmail, contactId, companyId o companyName. El nombre o correo busca o crea un contacto; los campos de empresa buscan o crean una empresa. Un enlace abierto permite acceder a cualquiera que tenga la URL.
{
"accessMode": "open",
"recipientName": "Ada Lovelace",
"recipientEmail": "ada@analytical.example",
"companyName": "Analytical Engines"
}Empresas y contactos
Busca registros de cuenta existentes o créalos con coincidencias deterministas. Los nombres de empresa y los correos de contacto no distinguen mayúsculas de minúsculas.
/companies?name={name}&domain={domain}Busca hasta 10 empresas por nombre exacto, dominio o ambos./companiesBusca una empresa por nombre sin distinguir mayúsculas de minúsculas o la crea. Un dominio explícito solo completa el registro. El campo created identifica el resultado./contacts?email={query}Busca contactos por dirección de correo electrónico. Devuelve contactos coincidentes con su empresa asociada./contactsBusca un contacto por correo o lo crea, con una empresa existente o nueva opcional.Solicitud POST /companies
| Field | Type | Description | |
|---|---|---|---|
| name | string | obligatorio | Nombre de la empresa |
| domain | string | opcional | Dominio de la empresa para completar datos. Nunca se usa para buscar una empresa existente |
Solicitud POST /contacts
| Field | Type | Description | |
|---|---|---|---|
| name | string | condicional | Nombre completo. Usa este campo o firstName y lastName |
| firstName | string | condicional | Nombre cuando no se proporciona name |
| lastName | string | opcional | Apellido cuando se usa firstName |
| string | obligatorio | Correo usado para buscar sin distinguir mayúsculas de minúsculas | |
| title | string | opcional | Cargo |
| companyId | UUID | opcional | Empresa existente en el espacio de trabajo autenticado |
| companyName | string | opcional | Empresa que se buscará o creará si no se proporciona companyId |
| companyDomain | string | opcional | Dominio opcional para completar datos con companyName. No se usa como criterio de búsqueda |
Respuesta de empresa
| Field | Type | Description |
|---|---|---|
| company.id | UUID | ID de la empresa |
| company.name | string | Nombre de la empresa |
| company.domain | string | null | Dominio normalizado de la empresa |
| created | boolean | Indica si esta solicitud ha creado la empresa |
Respuesta de contacto
| Field | Type | Description |
|---|---|---|
| contact.id | UUID | ID del contacto |
| contact.firstName | string | Nombre |
| contact.lastName | string | Apellido |
| contact.email | string | Dirección de correo electrónico |
| contact.title | string | null | Cargo |
| contact.companyId | UUID | null | ID de la empresa asociada |
| contact.companyName | string | null | Nombre de la empresa asociada |
| created | boolean | Indica si esta solicitud ha creado el contacto |
| company | object | null | Empresa resuelta, si está disponible |
| companyCreated | boolean | Indica si esta solicitud ha creado la empresa |
Webhooks
Suscríbete a eventos en tiempo real mediante REST Hooks. Cuando ocurre un evento, HummingDeck envía una solicitud POST a tu URL HTTPS registrada con el payload del evento. Las entregas fallidas se reintentan hasta 3 veces (a intervalos de 1 s, 5 s y 30 s). Las suscripciones a webhooks las gestiona la integración de Zapier y no están disponibles para los tokens de API del espacio de trabajo.
/hooksSuscribirse a un evento. Requiere una URL HTTPS de destino y un tipo de evento. Devuelve un ID de suscripción./hooks/{id}Cancelar la suscripción a un evento por ID de suscripción.Tipos de eventos
| Event | Description |
|---|---|
| view.created | Una persona real vio un documento compartido. El tráfico de bots (escáneres de seguridad de correo electrónico, rastreadores) se filtra automáticamente. |
| decision.made | Un prospecto respondió a una propuesta: aceptada, rechazada o con cambios solicitados. |
| email_captured | Un visitante introdujo su dirección de correo electrónico para acceder a contenido protegido. |
Ejemplos de payloads
view.created
{
"event": "view.created",
"data": {
"id": "view_abc123",
"deck_id": "deck_xyz789",
"deck_title": "Q4 Enterprise Proposal",
"viewer_email": "sarah@acme.com",
"viewer_name": "Sarah Wood",
"viewer_company": "Acme Corp",
"location": "San Francisco, CA",
"device": "Desktop",
"browser": "Chrome",
"pages_viewed": 8,
"total_pages": 12,
"duration_seconds": 272,
"completion_percent": 67,
"created_at": "2026-03-29T14:32:00Z"
}
}decision.made
{
"event": "decision.made",
"data": {
"share_slug": "proposal-2024",
"decision": "accepted",
"deck_title": "Q4 Enterprise Proposal",
"viewer_email": "sarah@acme.com",
"viewer_name": "Sarah Wood",
"decision_note": "Approved pending final review",
"decided_at": "2026-03-29T15:30:00Z"
}
}email_captured
{
"event": "email_captured",
"data": {
"email": "prospect@company.com",
"share_slug": "proposal-2024",
"deck_title": "Q4 Enterprise Proposal",
"view_id": "view_xyz789",
"captured_at": "2026-03-29T14:35:00Z"
}
}Vistas y eventos
Endpoints de sondeo para recuperar datos de interacción recientes. Devuelven los mismos datos que entregan los webhooks en tiempo real. Úsalos para rellenar histórico, hacer pruebas o como alternativa.
/viewsListar las 100 visualizaciones de documentos más recientes. Las sesiones de bots están excluidas./decisionsListar las decisiones recientes sobre propuestas (aceptadas, rechazadas, cambios solicitados)./emailsListar las capturas de correo electrónico recientes de contenido protegido.Manejo de errores
Cada error devuelve un objeto JSON con un campo error que describe qué ha fallado. Algunas respuestas incluyen además un campo code para el tratamiento programático, como PLAN_LIMIT_REACHED, INVALID_FORMAT o FILE_TOO_LARGE. Los códigos de estado HTTP siguen las convenciones habituales.
| Status | Meaning |
|---|---|
| 400 | Solicitud incorrecta: parámetros faltantes o inválidos |
| 401 | No autorizado: Bearer token inválido o expirado |
| 403 | Prohibido: se ha alcanzado el límite del plan, o este tipo de credencial no está permitido en este endpoint |
| 404 | No encontrado: el recurso no existe o no pertenece a tu equipo |
| 409 | Conflicto: los identificadores de contacto, correo y empresa no coinciden |
| 500 | Error del servidor: reintenta la solicitud |
Límites de velocidad
Máximo 50 suscripciones de webhook activas por equipo. Las solicitudes de API no tienen límite de velocidad, pero un uso excesivo puede ser limitado.
Esta API es utilizada actualmente por nuestra integración con Zapier. Es posible que en el futuro se admitan plataformas de integración adicionales.