Valutato 5,0 su 5 su G2
Riferimento API
HummingDeck espone un'API REST per i partner di integrazione e le piattaforme di automazione. Gli endpoint si autenticano con un Bearer token e restituiscono risposte JSON.
https://app.hummingdeck.com/api/v1Autenticazione
Ogni richiesta API porta un Bearer token nell'header Authorization. Sono accettati due tipi di credenziale, che si comportano in modo diverso.
Metodo
Bearer token
Formato dell'intestazione
Authorization: Bearer {access_token}
Tipi di credenziale
Token API dello spazio di lavoro
Authorization: Bearer hd_api_...
L’accesso all’API REST è disponibile su richiesta con il piano Business e viene abilitato per ogni spazio di lavoro dopo una verifica. I proprietari e gli amministratori creano quindi chiavi API con nomi distinti in Impostazioni dello spazio, Integrazioni, HummingDeck API. Seleziona solo le autorizzazioni necessarie a ogni integrazione. La chiave viene mostrata una sola volta alla creazione e non può essere recuperata in seguito. Scade dopo un anno e resta legata al proprio spazio di lavoro, che una richiesta non può scegliere né cambiare.
Uno spazio di lavoro può avere fino a 20 chiavi API attive. La sostituzione di una chiave invalida immediatamente solo il suo segreto precedente; le altre chiavi continuano a funzionare. Proprietari e amministratori possono disattivare una chiave o tutte le chiavi in qualsiasi momento. La revoca di quel segreto è permanente.
Una chiave API dello spazio di lavoro può chiamare solo le operazioni consentite dalle autorizzazioni selezionate. Gli endpoint di sottoscrizione ai webhook non sono disponibili per queste chiavi.
Zapier OAuth
Authorization: Bearer {access_token}
Emesso tramite il flusso di autorizzazione OAuth quando uno spazio di lavoro collega l'integrazione Zapier. I token di accesso scadono dopo 30 giorni. Usa il token di aggiornamento, valido 90 giorni, per ottenerne uno nuovo senza riautorizzare.
È l'unica credenziale che può creare o eliminare sottoscrizioni ai webhook.
Autorizzazioni
Scegli almeno un’autorizzazione. Le autorizzazioni di scrittura includono anche il corrispondente accesso in lettura. Puoi modificarle quando sostituisci la chiave.
rooms:readVisualizza stanze, schede, elementi, link ed etichette.
rooms:writeCrea e gestisci stanze, schede, elementi, link ed etichette.
plan:readVisualizza fasi e attività del piano d’azione reciproco.
plan:writeCrea e gestisci fasi e attività del piano d’azione reciproco.
analytics:readVisualizza analisi del coinvolgimento, attività ed email acquisite.
crm:readCerca aziende e contatti dello spazio di lavoro.
crm:writeCrea o aggiorna aziende, contatti e destinatari dei link.
documents:readCerca documenti e leggine i metadati.
documents:writeCarica documenti e collega documenti o URL alle stanze.
Le etichette dei permessi nelle righe degli endpoint si applicano alle chiavi API dello spazio di lavoro. I permessi richiesti valgono sempre, quelli aggiuntivi servono insieme e quelli condizionali solo quando la richiesta usa i relativi filtri o campi. GET /me non richiede permessi. Zapier OAuth usa il proprio accesso di integrazione fisso.
Quando una richiesta restituisce 401
Una richiesta restituisce 401 se la chiave è sconosciuta o malformata, è scaduta, è stata disattivata, appartiene a uno spazio di lavoro con accesso API disattivato oppure è stata emessa da una persona che non è più proprietaria o amministratrice di quello spazio.
Testa la connessione
Verifica che il tuo token sia valido e consulta il profilo dell'utente autenticato.
/meRestituisce nome, e-mail e informazioni sul team dell'utente corrente.
Nessun permesso della chiave API richiesto
Documenti
Carica, cerca e gestisci documenti (PDF, presentazioni, proposte e altri file).
/decksCaricare un nuovo documento. Invia come multipart/form-data con un campo file (PDF, PPTX, DOCX, XLSX, XLS, HTML) e un campo title. Il limite di caricamento tramite API è di 30 MB. L’elaborazione prosegue dopo il caricamento; la risposta include processingStatus.
documents:write/decksElenca fino a 20 documenti, dal più recente. Usa il parametro di query facoltativo title per filtrare una parte del titolo senza distinzione tra maiuscole e minuscole.
documents:readGET /decks Campi della risposta
| Field | Type | Description |
|---|---|---|
| id | string | ID del documento |
| title | string | Titolo del documento |
| fileType | string | Tipo MIME del documento |
| pageCount | integer | null | Numero di pagine |
| thumbnailUrl | string | null | URL dell'immagine in miniatura |
| processingStatus | string | pending, processing, completed o failed. Un documento può entrare in una stanza mentre è in elaborazione; invia un link al documento quando risulta completed. |
| processingErrorCode | string | null | Motivo per cui l’elaborazione non è riuscita, se è successo |
| createdAt | string | Timestamp ISO 8601 |
POST /decks Campi della risposta
| Field | Type | Description |
|---|---|---|
| id | string | ID del documento |
| title | string | Titolo del documento |
| fileType | string | Tipo MIME del documento |
| processingStatus | string | pending, processing, completed o failed. Un documento può entrare in una stanza mentre è in elaborazione; invia un link al documento quando risulta completed. |
| processingErrorCode | string | null | Motivo per cui l’elaborazione non è riuscita, se è successo |
Stanze
Crea Deal Room con i relativi documenti e il link per il pubblico in una sola chiamata, trova le stanze, modificane le impostazioni, archiviale e ripristinale, e organizzane schede ed elementi. Disponibile solo con token API dell’area di lavoro; le credenziali OAuth di Zapier vengono rifiutate.
/roomsElenca le stanze, dalla più recente. Filtra con search, status (active, archived o all) e companyId. Ogni pagina contiene 25 stanze (fino a 100 con limit); passa il nextCursor di una pagina come cursor per ottenere la successiva.
rooms:readcrm:read(Required when the companyId filter is present.)/roomsCrea una stanza con i suoi documenti e il primo link per il pubblico in una sola chiamata.
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}Restituisce le impostazioni della stanza, le schede e gli elementi nell’ordine di visualizzazione e il numero di link.
rooms:read/rooms/{roomId}Modifica nome, messaggio di benvenuto, referente, azienda o contatto.
rooms:writecrm:write(Required when companyId or contactId is present, including null to detach the association.)/rooms/{roomId}/archiveArchivia la stanza. I suoi link smettono di funzionare.
rooms:write/rooms/{roomId}/restoreRipristina una stanza archiviata. I suoi link tornano a funzionare.
rooms:write/rooms/{roomId}/tabsAggiunge una scheda, in una posizione precisa o in fondo.
rooms:write/rooms/{roomId}/tabs/{tabId}Rinomina una scheda.
rooms:write/rooms/{roomId}/tabs/orderRiordina tutte le schede.
rooms:write/rooms/{roomId}/tabs/{tabId}Rimuove una scheda che non mostra elementi.
rooms:write/rooms/{roomId}/itemsAggiunge a una scheda un documento, un URL, un contenuto incorporato o un separatore di sezione.
rooms:writedocuments:write(Required when type is document or url.)/rooms/{roomId}/items/{itemId}/moveSposta un elemento in fondo a un’altra scheda.
rooms:write/rooms/{roomId}/items/orderRiordina gli elementi di una scheda.
rooms:write/rooms/{roomId}/items/{itemId}Toglie un elemento dalla stanza. Resta nella tua libreria.
rooms:write/rooms/{roomId}/linksElenca i link per il pubblico della room, dal più recente, con gli invitati attivi di ogni link riservato.
rooms:read/rooms/{roomId}/linksCrea un link aperto con attribuzione per una stanza attiva.
rooms:writecrm:write/rooms/{roomId}/links/{linkId}Attiva o disattiva un link, imposta o cancella la scadenza, oppure sostituisce la lista di accesso.
rooms:writecrm:write(Required when allowedEmails or allowedDomains is present, including an empty array that clears the audience.)/rooms/{roomId}/action-planRestituisce il piano d'azione della stanza: impostazioni, fasi, attività (comprese quelle interne), dipendenze e avanzamento.
plan:read/rooms/{roomId}/action-planModifica le impostazioni del piano, compreso se chi apre la room può spuntare le proprie attività.
plan:write/rooms/{roomId}/action-plan/phasesAggiunge una milestone. Senza color le fasi alternano turchese, pesca e blu nell'ordine.
plan:write/rooms/{roomId}/action-plan/phases/{phaseId}Rinomina una fase, la sposta, ne cambia la data o ne imposta il colore. Inviare color null ripristina la rotazione.
plan:write/rooms/{roomId}/action-plan/phases/{phaseId}Elimina una fase. mode è obbligatorio: delete_tasks o move_to_unphased, così nessuna attività sparisce per errore.
plan:write/rooms/{roomId}/action-plan/tasksAggiunge un'attività. assignee è null, un side da solo per l'azienda che se ne occupa, o un side con email per una persona specifica.
plan:write/rooms/{roomId}/action-plan/tasks/{taskId}Aggiorna un'attività. Omettere assignee lascia invariata la responsabilità; inviare null la rimuove.
plan:write/rooms/{roomId}/action-plan/tasks/{taskId}Elimina un'attività. Le sue sotto-attività spariscono con lei.
plan:write/rooms/{roomId}/action-plan/tasks/{taskId}/statusCompleta o riapre un'attività per conto dello spazio di lavoro. Un'attività con una dipendenza non conclusa restituisce 409 TASK_BLOCKED.
plan:write/rooms/{roomId}/analyticsVisite alla stanza, visitatori unici, tempo medio, documenti aperti sul totale e completamento medio. Bot esclusi.
analytics:read/rooms/{roomId}/activityChe cosa è successo nella room, dal più recente. Le voci di discussione indicano chi ha scritto e non contengono mai il messaggio. Restringi con since.
analytics:read/rooms/{roomId}/captured-emailsIndirizzi raccolti dalla room. source è verify se la persona lo ha confermato con un link monouso, ask se lo ha solo digitato.
analytics:read/room-viewsIngressi nelle room di tutto lo spazio di lavoro, dal più recente. Non c'è altra fonte per sapere che qualcuno è entrato; /views copre solo le visualizzazioni dei documenti.
analytics:read/room-labelsElenca le etichette delle room dello spazio di lavoro con quante room usano ciascuna. Qui trovi gli ID prima di etichettare una room.
rooms:read/room-labelsCrea un'etichetta. I nomi sono unici per spazio di lavoro, senza distinzione tra maiuscole e minuscole; color è un valore esadecimale #RRGGBB.
rooms:write/room-labels/{labelId}Rinomina un'etichetta, ne cambia il colore o ne modifica la descrizione.
rooms:write/room-labels/{labelId}Elimina un'etichetta e le sue assegnazioni. Le room che la portavano restano invariate; la risposta indica quante l'hanno persa.
rooms:writeCreare una stanza con una sola chiamata
Carica ogni file con POST /decks, poi crea la stanza per l’azienda del destinatario con un link riservato alle persone che devono vederla. Azienda, contatti, stanza, documenti e link vengono creati insieme: se la chiamata viene rifiutata, non viene creato nulla. I documenti possono entrare nella stanza anche mentre sono ancora in elaborazione. Gli elementi della stanza riportano processingStatus, quindi invia il link quando ogni documento risulta 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 può essere open (chiunque abbia l’URL), verify-any (i visitatori confermano il proprio indirizzo e-mail con un link monouso) o verified-allowlist (solo gli indirizzi in allowedEmails e chiunque abbia un indirizzo nei domini in allowedDomains). L’API non aggiunge nessuno di sua iniziativa a un link riservato, quindi includi il tuo indirizzo se vuoi vedere l’anteprima della stanza. Un’opzione non inclusa nel tuo piano restituisce 403 FEATURE_NOT_AVAILABLE e un campo sconosciuto restituisce 400, così una stanza non si apre mai a un pubblico diverso da quello richiesto.
Organizzare schede ed elementi
Parti dallo stato attuale della stanza: leggendo una stanza ottieni schede ed elementi nell’ordine di visualizzazione, e ogni elemento riporta la sua scheda e la sua posizione al suo interno, contando da 0. Aggiungi schede ed elementi in una posizione, sposta elementi tra le schede e invia il nuovo ordine completo di una scheda. Un ordine deve elencare ogni elemento della scheda esattamente una volta, quindi rileggi la stanza se nel frattempo è intervenuta un’altra modifica. Una scheda si può rimuovere quando non mostra più elementi.
{
"type": "section",
"label": "Commercials",
"tabId": "{tabId}",
"position": 0
}Fornitori di embed supportati
Gli embed accettano un link di condivisione o di incorporamento e lo normalizzano alla forma di incorporamento del fornitore. Qualsiasi cosa fuori da questo elenco restituisce 400 EMBED_PROVIDER_NOT_SUPPORTED.
| Field | Type | Description |
|---|---|---|
| Video | Loom, YouTube, Vimeo, Wistia, Vidyard | |
| Pianificazione | Calendly, Cal.com, SavvyCal, Google Calendar | |
| Moduli | Typeform, Tally, Google Forms, Jotform, Fillout | |
| Design | Figma, Miro, Canva, Whimsical | |
| Documenti e tabelle | Google Docs, Google Sheets, Notion, Coda, Airtable | |
| Presentazioni | Google Slides, Pitch, Gamma, Guideflow, Flipsnack, Prezi | |
| Audio | Spotify, SoundCloud |
Aggiungere un altro link per il pubblico
Ogni stanza ha già un link creato da POST /rooms; aggiungine altri per i destinatari che richiedono un'attribuzione o un accesso diverso. Indica almeno uno tra recipientName, recipientEmail, contactId, companyId o companyName. accessMode accetta gli stessi valori open, verify-any o verified-allowlist di primaryLink, con gli stessi campi (requireEmail, allowedEmails, allowedDomains, label, expiresAt, allowDownloads). Una chiamata rifiutata, anche per un limite del piano, non lascia alcun link, azienda o contatto.
{
"companyName": "Analytical Engines",
"accessMode": "verified-allowlist",
"allowedEmails": [
{
"email": "cfo@analytical.example",
"name": "Sam Rivera"
}
]
}Aggiornare un link
Quattro campi: isActive, expiresAt, allowedEmails, allowedDomains (gli ultimi due solo sui link verified-allowlist). accessMode e lo slug non cambiano mai; crea invece un nuovo link. Riattivare un link fa ricontrollare il limite di link attivi del piano.
{
"isActive": false
}Costruire il piano d'azione
Ogni room ha esattamente un piano, quindi si aggancia alla room senza un identificatore proprio. La maggior parte delle attività appartiene a un'azienda e non a una persona: se invii solo un side, il piano lo legge come l'azienda, che è ciò che serve quando non sai chi farà il lavoro dall'altra parte. Aggiungi un'email solo quando conosci la persona. Un'attività interna non compare mai nella room, quindi non può appartenere al destinatario.
{
"title": "Sign the NDA",
"assignee": {
"side": "buyer"
},
"dueDate": "2026-10-02"
}recipientCompletionEnabled sul piano decide se chi apre la room può spuntare le attività del proprio lato. Il valore predefinito è true ed è l'unico vincolo: l'API non chiede mai l'indirizzo di un destinatario per completare un'attività. Chi ha spuntato cosa viene registrato con la certezza consentita dalla modalità di accesso della room.
Etichettare le room
Le etichette valgono per tutto lo spazio di lavoro: creale una volta e riusale. Passa labelIds in POST /rooms per etichettare una room al momento della creazione, oppure in PATCH /rooms/{roomId} per sostituire l'intero insieme; un array vuoto rimuove tutte le etichette e omettere il campo le lascia invariate. Una room ne porta al massimo cinque, per struttura e non per impostazione. Leggendo una room vengono restituite le sue etichette.
{
"labelIds": [
"{labelId}"
]
}Sapere che cosa è successo
Interroga /room-views per vedere gli ingressi in tutto lo spazio di lavoro, quindi leggi analytics, attività e indirizzi raccolti di una singola room. Per continuare, passa il nextCursor di una pagina come cursor; un cursore non emesso da questa API restituisce 400 invece di ripartire dall'inizio, così chi interroga non ripete il lavoro. Usa since per restringere l'intervallo dell'attività e cursor per scorrerne le pagine. /room-views è una finestra, non un archivio: senza since ottieni gli ultimi 30 giorni, mentre le richieste oltre 90 giorni indietro vengono rifiutate. La finestra applicata torna come since; inviala insieme a cursor per continuare a sfogliare lo stesso insieme.
Aziende e contatti
Trova i record dell’account esistenti o creane di nuovi con una corrispondenza deterministica. I nomi delle aziende e le e-mail dei contatti vengono confrontati senza distinzione tra maiuscole e minuscole.
/companies?name={name}&domain={domain}Cerca aziende per nome esatto e dominio facoltativo.
crm:read/companiesTrova un’azienda per nome senza distinzione tra maiuscole e minuscole o la crea. Un dominio esplicito arricchisce soltanto il record.
crm:write/contacts?email={query}Cerca contatti per indirizzo e-mail e restituisce le corrispondenze con l’azienda associata.
crm:read/contactsTrova o crea un contatto per e-mail e lo collega facoltativamente a un’azienda.
crm:writeRichiesta POST /companies
| Field | Type | Description | |
|---|---|---|---|
| name | string | obbligatorio | Nome dell’azienda |
| domain | string | facoltativo | Dominio usato per arricchire l’azienda. Non viene mai usato per trovare un’azienda esistente |
Richiesta POST /contacts
| Field | Type | Description | |
|---|---|---|---|
| name | string | condizionale | Nome completo. Obbligatorio se firstName non è presente |
| firstName | string | condizionale | Nome. Obbligatorio se name non è presente |
| lastName | string | facoltativo | Cognome |
| string | obbligatorio | Indirizzo e-mail usato per una corrispondenza univoca | |
| title | string | facoltativo | Titolo professionale |
| companyId | UUID | facoltativo | Azienda esistente nello spazio di lavoro autenticato |
| companyName | string | facoltativo | Nome dell’azienda da trovare o creare |
| companyDomain | string | facoltativo | Dominio facoltativo di arricchimento usato con companyName. Non è una chiave di corrispondenza |
Risposta dell’azienda
| Field | Type | Description |
|---|---|---|
| company.id | UUID | ID dell’azienda |
| company.name | string | Nome dell’azienda |
| company.domain | string | null | Dominio aziendale normalizzato |
| created | boolean | true se la richiesta POST ha creato l’azienda |
Risposta del contatto
| Field | Type | Description |
|---|---|---|
| contact.id | UUID | ID del contatto |
| contact.firstName | string | Nome |
| contact.lastName | string | Cognome |
| contact.email | string | Indirizzo e-mail normalizzato |
| contact.title | string | null | Titolo professionale |
| contact.companyId | UUID | null | ID dell’azienda associata |
| contact.companyName | string | null | Nome dell’azienda associata |
| created | boolean | true se la richiesta POST ha creato il contatto |
| company | object | null | Azienda risolta, se disponibile |
| companyCreated | boolean | true se questa richiesta ha creato l’azienda |
Webhook
Iscriviti agli eventi in tempo reale tramite REST Hooks. Quando si verifica un evento, HummingDeck invia una richiesta POST all'URL HTTPS registrato con il payload dell'evento. Le consegne fallite vengono ritentate fino a 3 volte (a intervalli di 1 s, 5 s e 30 s). Le sottoscrizioni ai webhook sono gestite dall'integrazione Zapier e non sono disponibili per i token API dello spazio di lavoro.
/hooksIscriversi a un evento. Richiede un URL HTTPS di destinazione e un tipo di evento. Restituisce un ID abbonamento.
Solo Zapier OAuth
/hooks/{id}Annullare l'iscrizione a un evento tramite ID abbonamento.
Solo Zapier OAuth
Tipi di eventi
| Event | Description |
|---|---|
| view.created | Una persona reale ha visualizzato un documento condiviso. Il traffico bot (scanner di sicurezza e-mail, crawler) viene filtrato automaticamente. |
| decision.made | Un prospect ha risposto a una proposta: accettata, rifiutata o con modifiche richieste. |
| email_captured | Un visitatore ha inserito il proprio indirizzo e-mail per accedere a contenuti protetti. |
Esempi di payload
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"
}
}Visualizzazioni ed eventi
Endpoint di polling per recuperare i dati di coinvolgimento recenti. Restituiscono gli stessi dati che i webhook consegnano in tempo reale. Usali per il backfilling, i test o come alternativa.
/viewsElencare le 100 visualizzazioni di documenti più recenti. Le sessioni bot sono escluse.
analytics:read/decisionsElencare le decisioni recenti sulle proposte (accettate, rifiutate, modifiche richieste).
analytics:read/emailsElencare le recenti acquisizioni di e-mail da contenuti protetti.
analytics:readGestione degli errori
Ogni errore restituisce un oggetto JSON con un campo error che descrive cosa non ha funzionato. La maggior parte delle risposte include anche un campo code per la gestione programmatica, come PLAN_LIMIT_REACHED, FEATURE_NOT_AVAILABLE, ROOM_NOT_ACTIVE, TAB_NOT_EMPTY, INVALID_FORMAT o FILE_TOO_LARGE. I codici di stato HTTP seguono le convenzioni consuete.
| Status | Meaning |
|---|---|
| 400 | Richiesta non valida: parametri mancanti o non validi |
| 401 | Non autorizzato: Bearer token non valido o scaduto |
| 403 | Vietato: alla credenziale manca uno scope richiesto, è stato raggiunto un limite del piano, il piano non include un’opzione necessaria, oppure questo tipo di credenziale non è consentito su questo endpoint |
| 404 | Non trovato: la risorsa non esiste o non appartiene al tuo team |
| 409 | Conflitto: gli identificatori forniti non corrispondono, la stanza è archiviata, oppure le schede della stanza non consentono la modifica |
| 413 | Payload troppo grande: il corpo della richiesta o il file supera il limite di questo endpoint |
| 429 | Troppe richieste: la chiave o l’IP client ha superato il limite corrente; riprova dopo l’intervallo Retry-After |
| 500 | Errore del server: riprova la richiesta |
Limiti di frequenza
Le chiavi manuali dello spazio e le connessioni OAuth Zapier hanno limiti per credenziale: 600 letture ogni 5 minuti, 120 scritture al minuto, 60 richieste a /room-views al minuto e 20 caricamenti all’ora. Considerando tutte le credenziali, ogni spazio è limitato a 1.200 letture ogni 5 minuti, 240 scritture al minuto, 120 richieste a /room-views al minuto e 40 caricamenti all’ora. Le autenticazioni Bearer non riuscite e le autenticazioni client OAuth non valide sono limitate separatamente a 60 tentativi ogni 5 minuti per IP client. Massimo 50 abbonamenti webhook attivi per team.
Questa API è attualmente utilizzata dalla nostra integrazione Zapier. Ulteriori piattaforme di integrazione potrebbero essere supportate in futuro.