Avaliado com 5,0 em 5 no G2
Referência da API
O HummingDeck expõe uma API REST para parceiros de integração e plataformas de automação. Os endpoints autenticam-se com um Bearer token e devolvem respostas JSON.
https://app.hummingdeck.com/api/v1Autenticação
Cada pedido à API leva um Bearer token no cabeçalho Authorization. São aceites dois tipos de credencial, e comportam-se de forma diferente.
Método
Bearer token
Formato do cabeçalho
Authorization: Bearer {access_token}
Tipos de credencial
Token de API do espaço de trabalho
Authorization: Bearer hd_api_...
O acesso à API REST está disponível mediante pedido no plano Business e é ativado por espaço de trabalho após análise. Depois, os proprietários e administradores criam chaves de API com nomes distintos em Definições do espaço, Integrações, HummingDeck API. Selecione apenas as permissões necessárias para cada integração. A chave é mostrada uma vez ao ser criada e não pode ser recuperada depois. Expira após um ano e permanece ligada ao respetivo espaço, pelo que um pedido não pode escolher nem alterar o espaço.
Um espaço de trabalho pode ter até 20 chaves de API ativas. Substituir uma chave invalida imediatamente apenas o segredo anterior dessa chave; as restantes continuam a funcionar. Os proprietários e administradores podem desativar uma chave ou todas as chaves a qualquer momento. A revogação desse segredo é permanente.
Uma chave de API do espaço de trabalho só pode chamar as operações permitidas pelas permissões selecionadas. Os endpoints de subscrição de webhooks não estão disponíveis para estas chaves.
Zapier OAuth
Authorization: Bearer {access_token}
Emitido através do fluxo de autorização OAuth quando um espaço de trabalho liga a integração Zapier. Os tokens de acesso expiram ao fim de 30 dias. Use o token de atualização, válido 90 dias, para obter um novo sem voltar a autorizar.
É a única credencial que pode criar ou eliminar subscrições de webhooks.
Permissões
Escolha pelo menos uma permissão. As permissões de escrita também incluem o acesso de leitura correspondente. Pode alterar as permissões quando substituir a chave.
rooms:readVer salas, separadores, itens, links e etiquetas.
rooms:writeCriar e gerir salas, separadores, itens, links e etiquetas.
plan:readVer fases e tarefas do plano de ação mútuo.
plan:writeCriar e gerir fases e tarefas do plano de ação mútuo.
analytics:readVer análises de interação, atividade e emails recolhidos.
crm:readProcurar empresas e contactos do espaço de trabalho.
crm:writeCriar ou atualizar empresas, contactos e públicos dos links.
documents:readProcurar documentos e ver os respetivos metadados.
documents:writeCarregar documentos e anexar documentos ou URLs a salas.
Os rótulos de permissão nas linhas dos endpoints aplicam-se às chaves de API do espaço de trabalho. As permissões obrigatórias aplicam-se sempre, as adicionais são necessárias em conjunto e as condicionais apenas quando o pedido usa os filtros ou campos relacionados. GET /me não requer permissão. O Zapier OAuth usa o acesso fixo da integração.
Quando um pedido devolve 401
Um pedido devolve 401 quando a chave é desconhecida ou inválida, expirou, foi desativada, pertence a um espaço com o acesso à API desativado ou foi emitida por alguém que já não é proprietário nem administrador desse espaço.
Teste sua conexão
Verifique se seu token é válido e consulte o perfil do usuário autenticado.
/meRetorna o nome, o e-mail e as informações de equipe do usuário atual.
Nenhuma permissão da chave de API necessária
Documentos
Envie, pesquise e gerencie documentos (PDFs, apresentações, propostas e outros arquivos).
/decksEnviar um novo documento. Envie como multipart/form-data com um campo file (PDF, PPTX, DOCX, XLSX, XLS, HTML) e um campo title. O limite de upload pela API é de 30 MB. O processamento continua após o upload; a resposta inclui processingStatus.
documents:write/decksLista até 20 documentos, dos mais recentes para os mais antigos. Use o parâmetro de consulta opcional title para filtrar por parte do título sem diferenciar maiúsculas de minúsculas.
documents:readGET /decks Campos da resposta
| Field | Type | Description |
|---|---|---|
| id | string | ID do documento |
| title | string | Título do documento |
| fileType | string | Tipo MIME do documento |
| pageCount | integer | null | Número de páginas |
| thumbnailUrl | string | null | URL da imagem em miniatura |
| processingStatus | string | pending, processing, completed ou failed. Um documento pode entrar em uma sala enquanto é processado; envie um link para ele quando o status for completed. |
| processingErrorCode | string | null | Motivo da falha no processamento, quando houver |
| createdAt | string | Carimbo de data/hora ISO 8601 |
POST /decks Campos da resposta
| Field | Type | Description |
|---|---|---|
| id | string | ID do documento |
| title | string | Título do documento |
| fileType | string | Tipo MIME do documento |
| processingStatus | string | pending, processing, completed ou failed. Um documento pode entrar em uma sala enquanto é processado; envie um link para ele quando o status for completed. |
| processingErrorCode | string | null | Motivo da falha no processamento, quando houver |
Salas
Crie salas de negociação com seus documentos e o link de público em uma única chamada, encontre salas, altere as configurações, arquive e restaure salas, e organize suas abas e itens. Disponível apenas com tokens de API do espaço de trabalho; as credenciais OAuth do Zapier são rejeitadas.
/roomsLista as salas, das mais recentes para as mais antigas. Filtre com search, status (active, archived ou all) e companyId. Cada página traz 25 salas (até 100 com limit); passe o nextCursor de uma página como cursor para obter a próxima.
rooms:readcrm:read(Required when the companyId filter is present.)/roomsCria uma sala com seus documentos e o primeiro link de público em uma única chamada.
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}Retorna as configurações da sala, suas abas e itens na ordem de exibição e a quantidade de links.
rooms:read/rooms/{roomId}Altera o nome, a mensagem de boas-vindas, o ponto de contato, a empresa ou o contato.
rooms:writecrm:write(Required when companyId or contactId is present, including null to detach the association.)/rooms/{roomId}/archiveArquiva a sala. Os links dela param de funcionar.
rooms:write/rooms/{roomId}/restoreRestaura uma sala arquivada. Os links voltam a funcionar.
rooms:write/rooms/{roomId}/tabsAdiciona uma aba em uma posição escolhida ou no final.
rooms:write/rooms/{roomId}/tabs/{tabId}Renomeia uma aba.
rooms:write/rooms/{roomId}/tabs/orderColoca todas as abas em uma nova ordem.
rooms:write/rooms/{roomId}/tabs/{tabId}Remove uma aba que não mostra itens.
rooms:write/rooms/{roomId}/itemsAdiciona a uma aba um documento, uma URL, um conteúdo incorporado ou um divisor de seção.
rooms:writedocuments:write(Required when type is document or url.)/rooms/{roomId}/items/{itemId}/moveMove um item para o final de outra aba.
rooms:write/rooms/{roomId}/items/orderColoca os itens de uma aba em uma nova ordem.
rooms:write/rooms/{roomId}/items/{itemId}Tira um item da sala. Ele continua na sua biblioteca.
rooms:write/rooms/{roomId}/linksLista os links de público da sala, do mais recente, com os convidados ativos de cada link restrito.
rooms:read/rooms/{roomId}/linksCria um link aberto com atribuição para uma sala ativa.
rooms:writecrm:write/rooms/{roomId}/links/{linkId}Liga ou desliga um link, define ou limpa a validade, ou substitui a lista de acesso.
rooms:writecrm:write(Required when allowedEmails or allowedDomains is present, including an empty array that clears the audience.)/rooms/{roomId}/action-planRetorna o plano de ação da sala: configurações, fases, tarefas (inclusive internas), dependências e progresso.
plan:read/rooms/{roomId}/action-planAltera as configurações do plano, inclusive se quem abre a sala pode marcar as próprias tarefas.
plan:write/rooms/{roomId}/action-plan/phasesAdiciona um marco. Sem color, as fases alternam turquesa, pêssego e azul por ordem.
plan:write/rooms/{roomId}/action-plan/phases/{phaseId}Renomeia uma fase, move-a, muda a data ou define a cor. Enviar color null restaura a rotação.
plan:write/rooms/{roomId}/action-plan/phases/{phaseId}Remove uma fase. mode é obrigatório: delete_tasks ou move_to_unphased, para que nenhuma tarefa suma por acidente.
plan:write/rooms/{roomId}/action-plan/tasksAdiciona uma tarefa. assignee é null, apenas um side para a empresa responsável, ou um side com email para uma pessoa específica.
plan:write/rooms/{roomId}/action-plan/tasks/{taskId}Atualiza uma tarefa. Omitir assignee mantém a responsabilidade; enviar null a remove.
plan:write/rooms/{roomId}/action-plan/tasks/{taskId}Remove uma tarefa. As subtarefas vão junto.
plan:write/rooms/{roomId}/action-plan/tasks/{taskId}/statusConclui ou reabre uma tarefa em nome do espaço de trabalho. Uma tarefa com dependência inacabada retorna 409 TASK_BLOCKED.
plan:write/rooms/{roomId}/analyticsVisitas à sala, visitantes únicos, tempo médio, documentos abertos do total e conclusão média. Sem bots.
analytics:read/rooms/{roomId}/activityO que aconteceu na sala, do mais recente. As entradas de conversa identificam quem escreveu e nunca trazem a mensagem. Restrinja com since.
analytics:read/rooms/{roomId}/captured-emailsEndereços que a sala coletou. source é verify quando a pessoa confirmou com um link de uso único, e ask quando apenas digitou.
analytics:read/room-viewsEntradas em salas em todo o espaço de trabalho, do mais recente. Não há outra fonte para saber que alguém entrou; /views cobre apenas visualizações de documentos.
analytics:read/room-labelsLista as etiquetas de sala do espaço de trabalho com quantas salas usam cada uma. Aqui você encontra os IDs antes de etiquetar uma sala.
rooms:read/room-labelsCria uma etiqueta. Os nomes são únicos por espaço de trabalho, sem diferenciar maiúsculas; color é um valor hexadecimal #RRGGBB.
rooms:write/room-labels/{labelId}Renomeia uma etiqueta, muda sua cor ou edita sua descrição.
rooms:write/room-labels/{labelId}Exclui uma etiqueta e suas atribuições. As salas que a tinham não mudam; a resposta informa quantas a perderam.
rooms:writeCriar uma sala em uma única chamada
Envie cada arquivo com POST /decks e depois crie a sala para a empresa do destinatário com um link restrito para as pessoas que devem vê-la. A empresa, os contatos, a sala, os documentos e o link são criados juntos: se a chamada for recusada, nada é criado. Os documentos podem entrar na sala enquanto ainda estão sendo processados. Os itens da sala informam processingStatus, então envie o link quando todos os documentos estiverem como 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 (qualquer pessoa com a URL), verify-any (os visitantes confirmam o e-mail com um link de uso único) ou verified-allowlist (somente os endereços em allowedEmails e qualquer pessoa dos domínios em allowedDomains). A API não adiciona ninguém a um link restrito por conta própria, então inclua o seu endereço se quiser visualizar a sala antes. Uma opção que o seu plano não inclui retorna 403 FEATURE_NOT_AVAILABLE, e um campo desconhecido retorna 400, para que uma sala nunca se abra para um público diferente do que você pediu.
Organizar abas e itens
Parta da sala como ela está agora: ao ler uma sala, você recebe as abas e os itens na ordem de exibição, e cada item informa sua aba e sua posição nela, contando a partir de 0. Adicione abas e itens em uma posição, mova itens entre abas e envie a nova ordem completa de uma aba. Uma ordem precisa listar cada item da aba exatamente uma vez, então leia a sala de novo se outra alteração tiver acontecido nesse meio-tempo. Uma aba pode ser removida quando não mostra mais nenhum item.
{
"type": "section",
"label": "Commercials",
"tabId": "{tabId}",
"position": 0
}Provedores de incorporação suportados
Os embeds aceitam um link de compartilhamento ou de incorporação e o normalizam para a forma de incorporação do provedor. Qualquer coisa fora desta lista retorna 400 EMBED_PROVIDER_NOT_SUPPORTED.
| Field | Type | Description |
|---|---|---|
| Vídeo | Loom, YouTube, Vimeo, Wistia, Vidyard | |
| Agendamento | Calendly, Cal.com, SavvyCal, Google Calendar | |
| Formulários | Typeform, Tally, Google Forms, Jotform, Fillout | |
| Design | Figma, Miro, Canva, Whimsical | |
| Documentos e tabelas | Google Docs, Google Sheets, Notion, Coda, Airtable | |
| Apresentações | Google Slides, Pitch, Gamma, Guideflow, Flipsnack, Prezi | |
| Áudio | Spotify, SoundCloud |
Adicionar outro link de público
Cada sala já tem um link criado por POST /rooms; adicione mais para públicos que precisam de outra atribuição ou outro acesso. Informe pelo menos um entre recipientName, recipientEmail, contactId, companyId ou companyName. accessMode aceita os mesmos valores open, verify-any ou verified-allowlist de primaryLink, com os mesmos campos (requireEmail, allowedEmails, allowedDomains, label, expiresAt, allowDownloads). Uma chamada recusada, inclusive por limite do plano, não deixa nenhum link, empresa ou contato.
{
"companyName": "Analytical Engines",
"accessMode": "verified-allowlist",
"allowedEmails": [
{
"email": "cfo@analytical.example",
"name": "Sam Rivera"
}
]
}Atualizar um link
Quatro campos: isActive, expiresAt, allowedEmails e allowedDomains (os dois últimos apenas em links verified-allowlist). accessMode e o slug nunca mudam; crie um link novo. Reativar um link verifica de novo o limite de links ativos do plano.
{
"isActive": false
}Montar o plano de ação
Cada sala tem exatamente um plano, por isso ele fica sob a sala sem identificador próprio. A maioria das tarefas pertence a uma empresa e não a uma pessoa: envie apenas um side e o plano o lê como a empresa, que é o que você quer quando não sabe quem fará o trabalho do outro lado. Acrescente um email só quando souber quem é a pessoa. Uma tarefa interna nunca aparece na sala, então não pode pertencer ao destinatário.
{
"title": "Sign the NDA",
"assignee": {
"side": "buyer"
},
"dueDate": "2026-10-02"
}recipientCompletionEnabled no plano decide se quem abre a sala pode marcar as tarefas do próprio lado. O padrão é true e é a única barreira: a API nunca pede o endereço de um destinatário para concluir uma tarefa. Quem marcou cada uma fica registrado com a certeza que o modo de acesso da sala permite.
Etiquetar salas
As etiquetas valem para todo o espaço de trabalho: crie uma vez e reutilize. Envie labelIds em POST /rooms para etiquetar uma sala já na criação, ou em PATCH /rooms/{roomId} para substituir o conjunto inteiro; um array vazio remove todas as etiquetas e omitir o campo as mantém. Uma sala carrega no máximo cinco, o que é estrutural e não uma configuração. Ler uma sala retorna suas etiquetas.
{
"labelIds": [
"{labelId}"
]
}Saber o que aconteceu
Consulte /room-views para ver as entradas em todo o espaço de trabalho e depois leia a analítica, a atividade e os endereços recolhidos de uma sala. Passe o nextCursor de uma página como cursor para continuar; um cursor que esta API não emitiu devolve 400 em vez de recomeçar, para que a consulta não repita trabalho. Use since para restringir a janela de atividade e cursor para percorrer as páginas. /room-views é uma janela, não um arquivo: sem since recebe os últimos 30 dias, e pedidos com mais de 90 dias são recusados. A janela aplicada volta como since; envie-a com cursor para continuar a percorrer o mesmo conjunto.
Empresas e contatos
Localize registros de conta existentes ou crie novos com correspondência determinística. Nomes de empresas e e-mails de contatos são comparados sem diferenciar maiúsculas de minúsculas.
/companies?name={name}&domain={domain}Pesquisa empresas pelo nome exato e por um domínio opcional.
crm:read/companiesLocaliza uma empresa pelo nome sem diferenciar maiúsculas de minúsculas ou a cria. Um domínio explícito apenas enriquece o registro.
crm:write/contacts?email={query}Pesquisa contatos por endereço de e-mail e retorna as correspondências com a empresa associada.
crm:read/contactsLocaliza ou cria um contato pelo e-mail e o associa opcionalmente a uma empresa.
crm:writeRequisição POST /companies
| Field | Type | Description | |
|---|---|---|---|
| name | string | obrigatório | Nome da empresa |
| domain | string | opcional | Domínio usado para enriquecer a empresa. Nunca é usado para localizar uma empresa existente |
Requisição POST /contacts
| Field | Type | Description | |
|---|---|---|---|
| name | string | condicional | Nome completo. Obrigatório se firstName não for informado |
| firstName | string | condicional | Nome. Obrigatório se name não for informado |
| lastName | string | opcional | Sobrenome |
| string | obrigatório | Endereço de e-mail usado para correspondência única | |
| title | string | opcional | Cargo |
| companyId | UUID | opcional | Empresa existente no espaço de trabalho autenticado |
| companyName | string | opcional | Nome da empresa a localizar ou criar |
| companyDomain | string | opcional | Domínio opcional de enriquecimento usado com companyName. Não é uma chave de correspondência |
Resposta da empresa
| Field | Type | Description |
|---|---|---|
| company.id | UUID | ID da empresa |
| company.name | string | Nome da empresa |
| company.domain | string | null | Domínio normalizado da empresa |
| created | boolean | true se a requisição POST criou a empresa |
Resposta do contato
| Field | Type | Description |
|---|---|---|
| contact.id | UUID | ID do contato |
| contact.firstName | string | Nome |
| contact.lastName | string | Sobrenome |
| contact.email | string | Endereço de e-mail normalizado |
| contact.title | string | null | Cargo |
| contact.companyId | UUID | null | ID da empresa associada |
| contact.companyName | string | null | Nome da empresa associada |
| created | boolean | true se a requisição POST criou o contato |
| company | object | null | Empresa resolvida, quando disponível |
| companyCreated | boolean | true se esta requisição criou a empresa |
Webhooks
Assine eventos em tempo real por meio de REST Hooks. Quando um evento ocorre, o HummingDeck envia uma requisição POST para sua URL HTTPS registrada com o payload do evento. As entregas com falha são repetidas até 3 vezes (com intervalos de 1 s, 5 s e 30 s). As subscrições de webhooks são geridas pela integração Zapier e não estão disponíveis para tokens de API do espaço de trabalho.
/hooksAssinar um evento. Requer uma URL HTTPS de destino e um tipo de evento. Retorna um ID de assinatura.
Apenas Zapier OAuth
/hooks/{id}Cancelar a assinatura de um evento pelo ID de assinatura.
Apenas Zapier OAuth
Tipos de eventos
| Event | Description |
|---|---|
| view.created | Uma pessoa real visualizou um documento compartilhado. O tráfego de bots (scanners de segurança de e-mail, crawlers) é filtrado automaticamente. |
| decision.made | Um prospect respondeu a uma proposta: aceita, recusada ou com alterações solicitadas. |
| email_captured | Um visitante inseriu seu endereço de e-mail para acessar conteúdo restrito. |
Exemplos 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"
}
}Visualizações e eventos
Endpoints de polling para recuperar dados de engajamento recentes. Eles retornam os mesmos dados que os webhooks entregam em tempo real. Use-os para preenchimento retroativo, testes ou como alternativa.
/viewsListar as 100 visualizações de documentos mais recentes. Sessões de bots são excluídas.
analytics:read/decisionsListar decisões recentes sobre propostas (aceitas, recusadas, alterações solicitadas).
analytics:read/emailsListar capturas de e-mail recentes de conteúdo restrito.
analytics:readTratamento de erros
Cada erro retorna um objeto JSON com um campo error que descreve o que deu errado. A maioria das respostas também inclui um campo code para tratamento programático, como PLAN_LIMIT_REACHED, FEATURE_NOT_AVAILABLE, ROOM_NOT_ACTIVE, TAB_NOT_EMPTY, INVALID_FORMAT ou FILE_TOO_LARGE. Os códigos de status HTTP seguem as convenções habituais.
| Status | Meaning |
|---|---|
| 400 | Requisição inválida: parâmetros ausentes ou inválidos |
| 401 | Não autorizado: Bearer token inválido ou expirado |
| 403 | Proibido: a credencial não tem um scope necessário, foi atingido um limite do plano, o plano não inclui uma opção necessária ou este tipo de credencial não é permitido neste endpoint |
| 404 | Não encontrado: o recurso não existe ou não pertence à sua equipe |
| 409 | Conflito: os identificadores informados não correspondem, a sala está arquivada, ou as abas da sala não permitem a alteração |
| 413 | Payload demasiado grande: o corpo do pedido ou o ficheiro excede o limite deste endpoint |
| 429 | Demasiados pedidos: a chave ou o IP cliente excedeu o limite atual; tente novamente após o intervalo Retry-After |
| 500 | Erro do servidor: repita a requisição |
Limites de taxa
As chaves manuais do espaço e as ligações OAuth Zapier têm limites por credencial: 600 leituras a cada 5 minutos, 120 escritas por minuto, 60 pedidos a /room-views por minuto e 20 carregamentos por hora. No conjunto de todas as credenciais, cada espaço está limitado a 1 200 leituras a cada 5 minutos, 240 escritas por minuto, 120 pedidos a /room-views por minuto e 40 carregamentos por hora. As falhas de autenticação Bearer e as autenticações inválidas de cliente OAuth estão separadamente limitadas a 60 tentativas a cada 5 minutos por IP cliente. Máximo de 50 assinaturas de webhook ativas por equipa.
Esta API é atualmente utilizada pela nossa integração com o Zapier. Plataformas de integração adicionais poderão ser suportadas no futuro.