Оценка 5,0 из 5 на G2
Справочник API
HummingDeck предоставляет REST API для партнёров по интеграции и платформ автоматизации. Эндпоинты аутентифицируются с помощью Bearer-токена и возвращают ответы в формате JSON.
https://app.hummingdeck.com/api/v1Аутентификация
Каждый запрос к API передаёт Bearer-токен в заголовке Authorization. Принимаются два типа учётных данных, и ведут они себя по-разному.
Метод
Bearer-токен
Формат заголовка
Authorization: Bearer {access_token}
Типы учётных данных
Токен API рабочего пространства
Authorization: Bearer hd_api_...
Доступ к REST API предоставляется по запросу на плане Business и включается отдельно для каждого рабочего пространства после рассмотрения. Затем владельцы и администраторы создают отдельные именованные API-ключи в разделе «Настройки рабочего пространства», «Интеграции», «HummingDeck API». Выбирайте только те разрешения, которые нужны каждой интеграции. Ключ показывается один раз при создании, и получить его позже нельзя. Он действует один год и остаётся привязанным к своему рабочему пространству, поэтому запрос не может выбрать или изменить его.
В одном рабочем пространстве может быть до 20 активных API-ключей. При замене ключа немедленно перестаёт действовать только его предыдущий секрет; остальные ключи продолжают работать. Владельцы и администраторы могут в любой момент отключить один или все ключи. Отзыв секрета необратим.
API-ключ рабочего пространства может вызывать только операции, разрешённые выбранными правами. Эндпоинты подписки на вебхуки недоступны для таких ключей.
Zapier OAuth
Authorization: Bearer {access_token}
Выдаётся через процесс авторизации OAuth, когда рабочее пространство подключает интеграцию Zapier. Токены доступа действуют 30 дней. Используйте токен обновления, который действует 90 дней, чтобы получить новый токен доступа без повторной авторизации.
Это единственные учётные данные, которые могут создавать и удалять подписки на вебхуки.
Разрешения
Выберите хотя бы одно разрешение. Разрешения на запись также включают соответствующий доступ на чтение. Разрешения можно изменить при замене ключа.
rooms:readПросмотр комнат, вкладок, элементов, ссылок и меток.
rooms:writeСоздание комнат, вкладок, элементов, ссылок и меток и управление ими.
plan:readПросмотр этапов и задач совместного плана действий.
plan:writeСоздание этапов и задач совместного плана действий и управление ими.
analytics:readПросмотр аналитики вовлечённости, активности и собранных адресов.
crm:readПоиск компаний и контактов рабочего пространства.
crm:writeСоздание и обновление компаний, контактов и аудиторий ссылок.
documents:readПоиск документов и просмотр их метаданных.
documents:writeЗагрузка документов и добавление документов или URL в комнаты.
Метки разрешений в строках эндпоинтов относятся к API-ключам рабочего пространства. Обязательные разрешения нужны всегда, дополнительные — вместе с основным, а условные — только когда запрос использует связанные фильтры или поля. GET /me не требует разрешений. Zapier OAuth использует фиксированный доступ интеграции.
Когда запрос возвращает 401
Запрос возвращает 401, если ключ неизвестен или некорректен, истёк, был отключён, принадлежит рабочему пространству с выключенным доступом к API или был выпущен человеком, который больше не является владельцем или администратором этого пространства.
Проверить подключение
Убедитесь, что ваш токен действителен, и просмотрите профиль аутентифицированного пользователя.
/meВозвращает имя, email и информацию о команде текущего пользователя.
Разрешение API-ключа не требуется
Документы
Загружайте, ищите и управляйте документами (PDF-файлы, презентации, коммерческие предложения и другие файлы).
/decksЗагрузить новый документ. Отправьте как multipart/form-data с полем file (PDF, PPTX, DOCX, XLSX, XLS, HTML) и полем title. Ограничение на загрузку через API составляет 30 МБ. Обработка продолжается после загрузки; ответ содержит processingStatus.
documents:write/decksВозвращает до 20 документов, начиная с самых новых. Необязательный параметр запроса title фильтрует по части названия без учёта регистра.
documents:read/decks/{deckId}/replaceЗаменяет документ локальным файлом того же типа. Требуется API-ключ рабочего пространства с правом documents:write. Существующие ссылки, название и режим доставки сохраняются. Файлы с предпросмотром возвращают pending, файлы только для скачивания — completed. Поля ответа совпадают с POST /decks.
documents:writeGET /decks Поля ответа
| Field | Type | Description |
|---|---|---|
| id | string | Идентификатор документа |
| title | string | Заголовок документа |
| fileType | string | MIME-тип документа |
| pageCount | integer | null | Количество страниц |
| thumbnailUrl | string | null | URL миниатюры |
| processingStatus | string | pending, processing, completed или failed. Документ можно добавить в комнату, пока он обрабатывается; отправляйте ссылку на него, когда статус станет completed. |
| processingErrorCode | string | null | Причина сбоя обработки, если он произошёл |
| createdAt | string | Временная метка ISO 8601 |
POST /decks Поля ответа
| Field | Type | Description |
|---|---|---|
| id | string | Идентификатор документа |
| title | string | Заголовок документа |
| fileType | string | MIME-тип документа |
| processingStatus | string | pending, processing, completed или failed. Документ можно добавить в комнату, пока он обрабатывается; отправляйте ссылку на него, когда статус станет completed. |
| processingErrorCode | string | null | Причина сбоя обработки, если он произошёл |
Комнаты
Создавайте комнаты для сделок с документами и ссылкой для аудитории одним вызовом, находите комнаты, меняйте их настройки, архивируйте и восстанавливайте их, упорядочивайте вкладки и элементы. Доступно только с API-токенами рабочего пространства; учётные данные Zapier OAuth отклоняются.
/roomsВозвращает список комнат, начиная с новых. Фильтры: search, status (active, archived или all) и companyId. На странице 25 комнат (до 100 с limit); чтобы получить следующую страницу, передайте nextCursor текущей страницы как cursor.
rooms:readcrm:read(Required when the companyId filter is present.)/roomsСоздаёт комнату с документами и первой ссылкой для аудитории одним вызовом.
rooms:writedocuments:write(Required when documentIds contains one or more document IDs.)crm:write(Required when the request supplies contactId, recipientName, recipientEmail, companyId, companyName, or when either primaryLink.allowedEmails or primaryLink.allowedDomains is non-empty.)/rooms/{roomId}Возвращает настройки комнаты, её вкладки и элементы в порядке отображения, а также количество ссылок.
rooms:read/rooms/{roomId}Меняет название, приветственное сообщение, контактное лицо, компанию или контакт.
rooms:writecrm:write(Required when companyId or contactId is present, including null to detach the association.)/rooms/{roomId}/archiveАрхивирует комнату. Её ссылки перестают работать.
rooms:write/rooms/{roomId}/restoreВосстанавливает архивную комнату. Её ссылки снова работают.
rooms:write/rooms/{roomId}/tabsДобавляет вкладку в указанную позицию или в конец.
rooms:write/rooms/{roomId}/tabs/{tabId}Переименовывает вкладку.
rooms:write/rooms/{roomId}/tabs/orderЗадаёт новый порядок всех вкладок.
rooms:write/rooms/{roomId}/tabs/{tabId}Удаляет вкладку, в которой нет элементов.
rooms:write/rooms/{roomId}/itemsДобавляет во вкладку документ, URL, встраиваемый контент или разделитель раздела.
rooms:writedocuments:write(Required when type is document or url.)/rooms/{roomId}/items/{itemId}/moveПеремещает элемент в конец другой вкладки.
rooms:write/rooms/{roomId}/items/orderЗадаёт новый порядок элементов одной вкладки.
rooms:write/rooms/{roomId}/items/{itemId}Убирает элемент из комнаты. Он остаётся в вашей библиотеке.
rooms:write/rooms/{roomId}/linksПоказывает ссылки комнаты для аудитории, сначала новые, вместе с активными приглашёнными для каждой ограниченной ссылки.
rooms:read/rooms/{roomId}/linksСоздаёт атрибутированную открытую ссылку для активной комнаты.
rooms:writecrm:write/rooms/{roomId}/links/{linkId}Включает или выключает ссылку, задаёт или снимает срок действия, либо заменяет список доступа.
rooms:writecrm:write(Required when allowedEmails or allowedDomains is present, including an empty array that clears the audience.)/rooms/{roomId}/action-planВозвращает план действий комнаты: настройки, этапы, задачи (включая внутренние), зависимости и прогресс.
plan:read/rooms/{roomId}/action-planМеняет настройки плана, в том числе то, могут ли открывшие комнату отмечать свои задачи.
plan:write/rooms/{roomId}/action-plan/phasesДобавляет веху. Без поля color этапы по очереди получают бирюзовый, персиковый и синий.
plan:write/rooms/{roomId}/action-plan/phases/{phaseId}Переименовывает этап, перемещает его, меняет дату или задаёт цвет. color со значением null возвращает автоматическое чередование.
plan:write/rooms/{roomId}/action-plan/phases/{phaseId}Удаляет этап. Поле mode обязательно: delete_tasks или move_to_unphased, чтобы задачи не исчезли случайно.
plan:write/rooms/{roomId}/action-plan/tasksДобавляет задачу. assignee — это null, один side для ответственной компании или side с email для конкретного человека.
plan:write/rooms/{roomId}/action-plan/tasks/{taskId}Обновляет задачу. Если assignee не передан, ответственный не меняется; null снимает назначение.
plan:write/rooms/{roomId}/action-plan/tasks/{taskId}Удаляет задачу. Её подзадачи удаляются вместе с ней.
plan:write/rooms/{roomId}/action-plan/tasks/{taskId}/statusЗавершает или открывает задачу заново от имени рабочего пространства. Задача с незавершённой зависимостью возвращает 409 TASK_BLOCKED.
plan:write/rooms/{roomId}/analyticsПосещения комнаты, уникальные зрители, среднее время, открытые документы из общего числа и средний процент прочтения. Без ботов.
analytics:read/rooms/{roomId}/activityЧто происходило в комнате, начиная с самого свежего. Записи обсуждений называют отправителя и никогда не содержат текст сообщения. Сужайте выборку параметром since.
analytics:read/rooms/{roomId}/captured-emailsАдреса, собранные комнатой. Поле source равно verify, если адрес подтверждён одноразовой ссылкой, и ask, если его просто ввели.
analytics:read/room-viewsВходы в комнаты по всему рабочему пространству, начиная с самых свежих. Другого источника для входа в комнату нет; /views охватывает только просмотры документов.
analytics:read/room-labelsПоказывает метки комнат рабочего пространства и количество комнат, использующих каждую. Здесь вы найдёте идентификаторы, прежде чем помечать комнату.
rooms:read/room-labelsСоздаёт метку. Имена уникальны в пределах рабочего пространства без учёта регистра; color — шестнадцатеричное значение вида #RRGGBB.
rooms:write/room-labels/{labelId}Переименовывает метку, меняет её цвет или описание.
rooms:write/room-labels/{labelId}Удаляет метку и её назначения. Комнаты, которые её несли, не меняются; в ответе указано, сколько её лишились.
rooms:writeСоздание комнаты одним вызовом
Загрузите каждый файл через POST /decks, а затем создайте комнату для компании получателя с ограниченной ссылкой для тех, кто должен её видеть. Компания, контакты, комната, документы и ссылка создаются вместе: если вызов отклонён, не создаётся ничего. Документы можно добавить в комнату, пока они ещё обрабатываются. Элементы комнаты сообщают processingStatus, поэтому отправляйте ссылку, когда у каждого документа статус completed.
{
"name": "Acme renewal",
"companyName": "Acme Inc",
"recipientName": "Pat Buyer",
"recipientEmail": "pat@acme.example",
"documentIds": [
"{documentId}",
"{documentId}"
],
"primaryLink": {
"accessMode": "verified-allowlist",
"allowedEmails": [
"pat@acme.example",
{
"email": "cfo@acme.example",
"name": "Sam Rivera"
}
],
"allowedDomains": [
"acme.example"
]
}
}accessMode принимает значения open (любой, у кого есть URL), verify-any (посетители подтверждают адрес электронной почты одноразовой ссылкой) или verified-allowlist (только адреса из allowedEmails и все, у кого адрес на доменах из allowedDomains). API само никого не добавляет к ограниченной ссылке, поэтому укажите свой адрес, если хотите заранее посмотреть комнату. Параметр, которого нет в вашем тарифе, возвращает 403 FEATURE_NOT_AVAILABLE, а неизвестное поле возвращает 400, поэтому комната никогда не откроется не той аудитории, которую вы указали.
Упорядочивание вкладок и элементов
Начните с текущего состояния комнаты: при чтении комнаты её вкладки и элементы возвращаются в порядке отображения, и каждый элемент сообщает свою вкладку и позицию в ней, считая с 0. Добавляйте вкладки и элементы в нужную позицию, перемещайте элементы между вкладками и отправляйте полный новый порядок вкладки. Порядок должен содержать каждый элемент вкладки ровно один раз, поэтому прочитайте комнату заново, если за это время произошло другое изменение. Вкладку можно удалить, когда в ней больше нет элементов.
{
"type": "section",
"label": "Commercials",
"tabId": "{tabId}",
"position": 0
}Поддерживаемые источники встраивания
Встраивания принимают и ссылку для доступа, и ссылку для встраивания, приводя её к формату провайдера. Всё, чего нет в этом списке, возвращает 400 EMBED_PROVIDER_NOT_SUPPORTED.
| Field | Type | Description |
|---|---|---|
| Видео | Loom, YouTube, Vimeo, Wistia, Vidyard | |
| Планирование встреч | Calendly, Cal.com, SavvyCal, Google Calendar | |
| Формы | Typeform, Tally, Google Forms, Jotform, Fillout | |
| Дизайн | Figma, Miro, Canva, Whimsical | |
| Документы и таблицы | Google Docs, Google Sheets, Notion, Coda, Airtable | |
| Презентации | Google Slides, Pitch, Gamma, Guideflow, Flipsnack, Prezi | |
| Аудио | Spotify, SoundCloud |
Добавить ещё одну ссылку для аудитории
У каждой комнаты уже есть ссылка, созданная через POST /rooms; добавляйте новые для аудиторий, которым нужна другая атрибуция или другой доступ. Укажите хотя бы одно из полей recipientName, recipientEmail, contactId, companyId или companyName. accessMode принимает те же значения open, verify-any и verified-allowlist, что и primaryLink, с теми же полями (requireEmail, allowedEmails, allowedDomains, label, expiresAt, allowDownloads). Отклонённый вызов, в том числе из-за ограничения тарифа, не оставляет ни ссылки, ни компании, ни контакта.
{
"companyName": "Analytical Engines",
"accessMode": "verified-allowlist",
"allowedEmails": [
{
"email": "cfo@analytical.example",
"name": "Sam Rivera"
}
]
}Обновить ссылку
Четыре поля: isActive, expiresAt, allowedEmails, allowedDomains (последние два только у ссылок verified-allowlist). accessMode и слаг не меняются; создайте новую ссылку. Повторное включение ссылки заново проверяет лимит активных ссылок в тарифе.
{
"isActive": false
}Собрать план действий
У каждой комнаты ровно один план, поэтому он подключается к комнате без собственного идентификатора. Большинство задач принадлежит компании, а не человеку: отправьте один side, и план прочитает его как компанию. Именно это нужно, когда неизвестно, кто выполнит работу на другой стороне. Добавляйте email, только если знаете конкретного человека. Внутренняя задача никогда не видна в комнате, поэтому она не может принадлежать стороне получателя.
{
"title": "Sign the NDA",
"assignee": {
"side": "buyer"
},
"dueDate": "2026-10-02"
}Поле recipientCompletionEnabled в плане решает, могут ли открывшие комнату отмечать задачи своей стороны. По умолчанию true, и это единственное условие: API никогда не требует адрес получателя, чтобы завершить задачу. Кто именно отметил задачу, записывается с той достоверностью, которую даёт режим доступа комнаты.
Помечать комнаты метками
Метки действуют во всём рабочем пространстве: создайте их один раз и используйте повторно. Передайте labelIds в POST /rooms, чтобы пометить комнату при создании, или в PATCH /rooms/{roomId}, чтобы заменить весь набор; пустой массив снимает все метки, а если поле не передано, они не меняются. Комната несёт не более пяти меток — это структурное ограничение, а не настройка. При чтении комнаты её метки возвращаются вместе с ней.
{
"labelIds": [
"{labelId}"
]
}Узнать, что произошло
Запрашивайте /room-views, чтобы видеть входы по всему рабочему пространству, а затем читайте аналитику, активность и собранные адреса конкретной комнаты. Чтобы получить следующую страницу, передайте её nextCursor как cursor; курсор, который этот API не выдавал, возвращает 400 вместо перехода к началу, поэтому опрос не повторяет работу. Сужайте окно активности параметром since и переходите между страницами с помощью cursor. /room-views представляет временное окно, а не архив: без since возвращаются последние 30 дней, а запросы более чем за 90 дней отклоняются. Применённое окно возвращается в поле since; отправляйте его вместе с cursor, чтобы продолжать листать тот же набор.
Компании и контакты
Находите существующие записи или создавайте их по однозначным правилам сопоставления. Названия компаний и адреса электронной почты контактов сопоставляются без учёта регистра.
/companies?name={name}&domain={domain}Находит до 10 компаний по точному названию, домену или обоим параметрам.
crm:read/companiesНаходит компанию по названию без учёта регистра или создаёт её. Явно указанный домен только дополняет запись. Поле created показывает результат.
crm:write/contacts?email={query}Ищет контакты по адресу электронной почты. Возвращает совпавшие контакты и связанные с ними компании.
crm:read/contactsНаходит контакт по адресу электронной почты или создаёт его; можно указать существующую или новую компанию.
crm:writeЗапрос POST /companies
| Field | Type | Description | |
|---|---|---|---|
| name | string | обязательно | Название компании |
| domain | string | необязательно | Домен компании для дополнения записи. Никогда не используется для поиска существующей компании |
Запрос POST /contacts
| Field | Type | Description | |
|---|---|---|---|
| name | string | условно | Полное имя. Укажите его или firstName и lastName |
| firstName | string | условно | Имя, если поле name не указано |
| lastName | string | необязательно | Фамилия при использовании firstName |
| string | обязательно | Адрес электронной почты для поиска без учёта регистра | |
| title | string | необязательно | Должность |
| companyId | UUID | необязательно | Существующая компания в аутентифицированном рабочем пространстве |
| companyName | string | необязательно | Компания, которую нужно найти или создать, если companyId не указан |
| companyDomain | string | необязательно | Необязательный домен для дополнения companyName. Не используется как ключ поиска компании |
Ответ с компанией
| Field | Type | Description |
|---|---|---|
| company.id | UUID | Идентификатор компании |
| company.name | string | Название компании |
| company.domain | string | null | Нормализованный домен компании |
| created | boolean | Создал ли этот запрос компанию |
Ответ с контактом
| Field | Type | Description |
|---|---|---|
| contact.id | UUID | Идентификатор контакта |
| contact.firstName | string | Имя |
| contact.lastName | string | Фамилия |
| contact.email | string | Адрес электронной почты |
| contact.title | string | null | Должность |
| contact.companyId | UUID | null | Идентификатор связанной компании |
| contact.companyName | string | null | Название связанной компании |
| created | boolean | Создал ли этот запрос контакт |
| company | object | null | Найденная компания, если она есть |
| companyCreated | boolean | Создал ли этот запрос компанию |
Webhook
Подписывайтесь на события в реальном времени через REST Hooks. При возникновении события HummingDeck отправляет POST-запрос на зарегистрированный HTTPS-адрес с данными события. При сбое доставки выполняется до 3 повторных попыток (через 1 с, 5 с и 30 с). Подписки на вебхуки управляются интеграцией Zapier и недоступны для токенов API рабочего пространства.
/hooksПодписаться на событие. Требуется HTTPS-URL назначения и тип события. Возвращает идентификатор подписки.
Только Zapier OAuth
/hooks/{id}Отменить подписку на событие по идентификатору подписки.
Только Zapier OAuth
Типы событий
| Event | Description |
|---|---|
| view.created | Реальный человек просмотрел опубликованный документ. Трафик ботов (сканеры безопасности email, краулеры) фильтруется автоматически. |
| decision.made | Потенциальный клиент ответил на предложение — принял, отклонил или запросил изменения. |
| email_captured | Посетитель ввёл адрес электронной почты для доступа к защищённому контенту. |
Примеры данных
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"
}
}Просмотры и события
Эндпоинты для опроса последних данных о вовлечённости. Они возвращают те же данные, что webhook передаёт в реальном времени — используйте их для ретроспективного заполнения, тестирования или в качестве запасного варианта.
/viewsВывести последние 100 просмотров документов. Сессии ботов исключены.
analytics:read/decisionsВывести последние решения по предложениям (принято, отклонено, запрошены изменения).
analytics:read/emailsВывести последние записи email из защищённого контента.
analytics:readОбработка ошибок
Каждая ошибка возвращает JSON-объект с полем error, описывающим, что пошло не так. Большинство ответов также содержит поле code для программной обработки, например PLAN_LIMIT_REACHED, FEATURE_NOT_AVAILABLE, ROOM_NOT_ACTIVE, TAB_NOT_EMPTY, INVALID_FORMAT или FILE_TOO_LARGE. HTTP-коды статусов соответствуют общепринятым соглашениям.
| Status | Meaning |
|---|---|
| 400 | Неверный запрос: отсутствующие или недопустимые параметры |
| 401 | Не авторизован: недействительный или истёкший Bearer-токен |
| 403 | Запрещено: у учётных данных нет нужного scope, достигнут лимит тарифа, тариф не включает нужную возможность или этот тип учётных данных недоступен для эндпоинта |
| 404 | Не найдено: ресурс не существует или не принадлежит вашей команде |
| 409 | Конфликт: указанные идентификаторы не согласуются, комната архивирована или вкладки комнаты не допускают это изменение |
| 413 | Слишком большой запрос: тело запроса или загружаемый файл превышает лимит эндпоинта |
| 429 | Слишком много запросов: ключ или IP клиента превысил текущий лимит; повторите запрос после задержки из Retry-After |
| 500 | Ошибка сервера: повторите запрос |
Ограничения запросов
Для ручных ключей рабочего пространства и подключений Zapier OAuth действуют лимиты на учётные данные: 600 чтений за 5 минут, 120 операций записи в минуту, 60 запросов /room-views в минуту и 20 загрузок в час. Для всех учётных данных рабочего пространства вместе лимиты составляют 1 200 чтений за 5 минут, 240 операций записи в минуту, 120 запросов /room-views в минуту и 40 загрузок в час. Ошибки Bearer-аутентификации и недействительная аутентификация клиента OAuth отдельно ограничены 60 попытками за 5 минут для каждого IP клиента. Не более 50 активных webhook-подписок на команду.
Этот API в настоящее время используется нашей интеграцией с Zapier. В будущем могут поддерживаться дополнительные платформы интеграции.