Conçu pour la confianceChiffrement TLSConforme au RGPDGoogle CloudPaiements sécurisésAperçu de la sécurité
G2

Noté 5,0 sur 5 sur G2

Lire les avis sur G2
The page-level analytics are the best part because they show real engagement instead of just basic opens.
Verified User in Computer Software
What I like most about the product is how easy it is to use, especially when it comes to listing all my links and embedding demos in one place for leads and prospects.
Jerome K.Founder
Responsiveness, configurability and development velocity.
Suman K.Co-Founder & CEO

Référence API

HummingDeck expose une API REST pour les partenaires d'intégration et les plateformes d'automatisation. Les endpoints s'authentifient avec un Bearer token et renvoient des réponses JSON.

URL de basehttps://app.hummingdeck.com/api/v1
OpenAPI Spec

Authentification

Chaque requête API transporte un Bearer token dans l'en-tête Authorization. Deux types d'identifiants sont acceptés, et leur comportement diffère.

Méthode

Bearer token

Format de l'en-tête

Authorization: Bearer {access_token}

Types d'identifiants

Token d'API de l'espace de travail

Authorization: Bearer hd_api_...

L’accès à l’API REST est disponible sur demande avec l’offre Business et est activé par espace de travail après examen. Les propriétaires et les administrateurs créent ensuite des clés API nommées séparément dans Paramètres de l’espace, Intégrations, HummingDeck API. Choisissez uniquement les autorisations nécessaires à chaque intégration. Une clé s’affiche une seule fois à sa création et ne peut plus être récupérée. Elle expire après un an et reste liée à son espace de travail, qu’une requête ne peut ni choisir ni modifier.

Un espace de travail peut avoir jusqu’à 20 clés API actives. Remplacer une clé invalide immédiatement son ancien secret uniquement ; les autres clés continuent de fonctionner. Les propriétaires et les administrateurs peuvent désactiver une clé ou toutes les clés à tout moment. La révocation de ce secret est définitive.

Une clé API d’espace de travail ne peut appeler que les opérations autorisées par les autorisations choisies. Les endpoints d’abonnement aux webhooks ne sont pas disponibles pour ces clés.

Zapier OAuth

Authorization: Bearer {access_token}

Émis via le flux d'autorisation OAuth lorsqu'un espace de travail connecte l'intégration Zapier. Les tokens d'accès expirent après 30 jours. Utilisez le token de rafraîchissement, valable 90 jours, pour en obtenir un nouveau sans réautoriser.

Ce sont les seuls identifiants pouvant créer ou supprimer des abonnements aux webhooks.

Autorisations

Choisissez au moins une autorisation. Les autorisations d’écriture incluent aussi l’accès en lecture correspondant. Vous pourrez les modifier en remplaçant la clé.

rooms:read

Consulter les salles, onglets, éléments, liens et libellés.

rooms:write

Créer et gérer les salles, onglets, éléments, liens et libellés.

plan:read

Consulter les phases et tâches du plan d’action mutuel.

plan:write

Créer et gérer les phases et tâches du plan d’action mutuel.

analytics:read

Consulter les analyses d’engagement, l’activité et les e-mails recueillis.

crm:read

Rechercher les entreprises et contacts de l’espace de travail.

crm:write

Créer ou modifier des entreprises, des contacts et les audiences des liens.

documents:read

Rechercher des documents et consulter leurs métadonnées.

documents:write

Importer des documents et joindre des documents ou URL aux salles.

Les libellés de permission sur les lignes des endpoints concernent les clés API de l’espace de travail. Les permissions requises s’appliquent toujours, les permissions supplémentaires sont nécessaires ensemble et les permissions conditionnelles uniquement lorsque la requête utilise les filtres ou champs associés. GET /me ne demande aucune permission. Zapier OAuth utilise son accès d’intégration fixe.

Quand une requête renvoie 401

Une requête renvoie 401 lorsque la clé est inconnue ou mal formée, a expiré, a été désactivée, appartient à un espace dont l’accès API a été coupé, ou a été émise par une personne qui n’est plus propriétaire ni administratrice de cet espace.

Tester votre connexion

Vérifiez que votre token est valide et consultez le profil de l'utilisateur authentifié.

GET/me

Renvoie le nom, l'e-mail et les informations d'équipe de l'utilisateur actuel.

Aucune permission de clé API requise

Documents

Téléchargez, recherchez et gérez des documents (PDFs, présentations, propositions et autres fichiers).

POST/decks

Télécharger un nouveau document. Envoyez-le en multipart/form-data avec un champ file (PDF, PPTX, DOCX, XLSX, XLS, HTML) et un champ title. La limite d’envoi via l’API est de 30 Mo. Le traitement se poursuit après l’envoi ; la réponse inclut processingStatus.

Requise:documents:write
GET/decks

Répertorie jusqu’à 20 documents, les plus récents en premier. Utilisez le paramètre de requête facultatif title pour filtrer sur une partie du titre sans tenir compte de la casse.

Requise:documents:read

GET /decks Champs de réponse

FieldTypeDescription
idstringIdentifiant du document
titlestringTitre du document
fileTypestringType MIME du document
pageCountinteger | nullNombre de pages
thumbnailUrlstring | nullURL de l'image miniature
processingStatusstringpending, processing, completed ou failed. Un document peut être ajouté à une salle pendant son traitement ; envoyez un lien vers ce document une fois qu’il indique completed.
processingErrorCodestring | nullRaison de l’échec du traitement, le cas échéant
createdAtstringHorodatage ISO 8601

POST /decks Champs de réponse

FieldTypeDescription
idstringIdentifiant du document
titlestringTitre du document
fileTypestringType MIME du document
processingStatusstringpending, processing, completed ou failed. Un document peut être ajouté à une salle pendant son traitement ; envoyez un lien vers ce document une fois qu’il indique completed.
processingErrorCodestring | nullRaison de l’échec du traitement, le cas échéant

Liens de partage

Créez des liens traçables vers vos documents. Un lien personnel peut retrouver ou créer son contact et son entreprise dans la même requête.

POST/shares

Crée un lien personnel ou anonyme. Un lien personnel peut retrouver ou créer automatiquement les fiches de compte.

Requise:documents:write
Conditionnelle:crm:write(Required for a non-anonymous share when the request supplies contactId, companyId, companyName, recipientEmail, or recipientName.)

Champs de la requête

FieldTypeDescription
deckIdstringrequisIdentifiant du document à partager
recipientNamestringfacultatifNom du destinataire pour un lien personnel
recipientEmailstringfacultatifE-mail du destinataire pour un lien personnel
contactIdUUIDfacultatifContact existant dans l’espace de travail authentifié
companyIdUUIDfacultatifEntreprise existante. Incompatible avec companyName
companyNamestringfacultatifEntreprise à retrouver par son nom ou à créer
companyDomainstringfacultatifDomaine enregistré pour l’enrichissement lorsque companyName est fourni. Il ne sélectionne jamais une entreprise
typestringfacultatifPar défaut personal avec des champs de destinataire ou de compte, sinon anonymous

Créer le lien et les fiches de compte en une seule fois

Envoyez les coordonnées du destinataire et de l’entreprise directement à /shares. HummingDeck retrouve les fiches correspondantes, crée celles qui manquent, les associe au lien et indique ce qui a été créé. Définissez explicitement type sur anonymous pour ignorer la création de fiches.

{
  "deckId": "8f3d41de-2bb8-4d8e-80de-6cd2072ffab1",
  "recipientName": "Ada Lovelace",
  "recipientEmail": "ada@analytical.example",
  "companyName": "Analytical Engines",
  "companyDomain": "analytical.example"
}

Champs de réponse

FieldTypeDescription
idstringIdentifiant du lien de partage
slugstringSlug du lien (utilisé dans l'URL)
shareUrlstringURL traçable complète
typestring"personal" ou "anonymous"
recipientNamestringNom du destinataire (si personnel)
recipientEmailstringE-mail du destinataire (si personnel)
contactobject | nullContact associé au lien personnel
contactCreatedbooleantrue si cette requête a créé le contact
companyobject | nullEntreprise associée au lien personnel
companyCreatedbooleantrue si cette requête a créé l’entreprise
createdAtstringHorodatage ISO 8601

Salles

Créez des Digital Sales Rooms avec leurs documents et leur lien d’audience en un seul appel, retrouvez vos salles, modifiez leurs paramètres, archivez-les et restaurez-les, et organisez leurs onglets et leurs éléments. Disponible uniquement avec les jetons d’API de l’espace de travail ; les identifiants OAuth Zapier sont refusés.

GET/rooms

Liste les salles, des plus récentes aux plus anciennes, avec les filtres search, status (active, archived ou all) et companyId. Chaque page contient 25 salles (jusqu’à 100 avec limit) ; passez le nextCursor d’une page comme cursor pour obtenir la suivante.

Requise:rooms:read
Conditionnelle:crm:read(Required when the companyId filter is present.)
POST/rooms

Crée une salle avec ses documents et son premier lien d’audience en un seul appel.

Requise:rooms:write
Conditionnelle:documents: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.)
GET/rooms/{roomId}

Renvoie les paramètres de la salle, ses onglets et ses éléments dans l’ordre d’affichage, ainsi que le nombre de liens.

Requise:rooms:read
PATCH/rooms/{roomId}

Modifie le nom, le message d’accueil, l’interlocuteur, l’entreprise ou le contact.

Requise:rooms:write
Conditionnelle:crm:write(Required when companyId or contactId is present, including null to detach the association.)
POST/rooms/{roomId}/archive

Archive la salle. Ses liens cessent de fonctionner.

Requise:rooms:write
POST/rooms/{roomId}/restore

Restaure une salle archivée. Ses liens fonctionnent à nouveau.

Requise:rooms:write
POST/rooms/{roomId}/tabs

Ajoute un onglet, à une position donnée ou à la fin.

Requise:rooms:write
PATCH/rooms/{roomId}/tabs/{tabId}

Renomme un onglet.

Requise:rooms:write
PUT/rooms/{roomId}/tabs/order

Réorganise tous les onglets.

Requise:rooms:write
DELETE/rooms/{roomId}/tabs/{tabId}

Supprime un onglet qui n’affiche aucun élément.

Requise:rooms:write
POST/rooms/{roomId}/items

Ajoute à un onglet un document, une URL, un contenu intégré ou un séparateur de section.

Requise:rooms:write
Conditionnelle:documents:write(Required when type is document or url.)
POST/rooms/{roomId}/items/{itemId}/move

Déplace un élément à la fin d’un autre onglet.

Requise:rooms:write
PUT/rooms/{roomId}/items/order

Réorganise les éléments d’un onglet.

Requise:rooms:write
DELETE/rooms/{roomId}/items/{itemId}

Retire un élément de la salle. Il reste dans votre bibliothèque.

Requise:rooms:write
GET/rooms/{roomId}/links

Liste les liens d'audience de la salle, les plus récents d'abord, avec les invités actifs de chaque lien restreint.

Requise:rooms:read
POST/rooms/{roomId}/links

Crée un lien ouvert attribué pour une salle active.

Requise:rooms:write
Également requise:crm:write
PATCH/rooms/{roomId}/links/{linkId}

Active ou désactive un lien, définit ou efface son expiration, ou remplace sa liste d'accès.

Requise:rooms:write
Conditionnelle:crm:write(Required when allowedEmails or allowedDomains is present, including an empty array that clears the audience.)
GET/rooms/{roomId}/action-plan

Renvoie le plan d'action de la salle : ses paramètres, ses phases, ses tâches (y compris internes), ses dépendances et sa progression.

Requise:plan:read
PATCH/rooms/{roomId}/action-plan

Modifie les paramètres du plan, y compris si les personnes qui ouvrent la salle peuvent cocher leurs propres tâches.

Requise:plan:write
POST/rooms/{roomId}/action-plan/phases

Ajoute un jalon. Sans color, les phases alternent turquoise, pêche et bleu dans l'ordre.

Requise:plan:write
PATCH/rooms/{roomId}/action-plan/phases/{phaseId}

Renomme une phase, la déplace, change sa date ou définit sa couleur. Envoyer color null rétablit la rotation.

Requise:plan:write
DELETE/rooms/{roomId}/action-plan/phases/{phaseId}

Supprime une phase. mode est obligatoire : delete_tasks ou move_to_unphased, pour qu'aucune tâche ne disparaisse par accident.

Requise:plan:write
POST/rooms/{roomId}/action-plan/tasks

Ajoute une tâche. assignee vaut null, un side seul pour l'entreprise responsable, ou un side avec email pour une personne précise.

Requise:plan:write
PATCH/rooms/{roomId}/action-plan/tasks/{taskId}

Met à jour une tâche. Omettre assignee laisse la responsabilité inchangée ; envoyer null la supprime.

Requise:plan:write
DELETE/rooms/{roomId}/action-plan/tasks/{taskId}

Supprime une tâche. Ses sous-tâches partent avec elle.

Requise:plan:write
POST/rooms/{roomId}/action-plan/tasks/{taskId}/status

Termine ou rouvre une tâche au nom de l'espace de travail. Une tâche derrière une dépendance inachevée renvoie 409 TASK_BLOCKED.

Requise:plan:write
GET/rooms/{roomId}/analytics

Visites de la salle, visiteurs uniques, temps moyen, documents ouverts sur le total et achèvement moyen. Hors robots.

Requise:analytics:read
GET/rooms/{roomId}/activity

Ce qui s'est passé dans la salle, le plus récent d'abord. Les entrées de discussion nomment l'auteur et ne contiennent jamais le message. Restreignez avec since.

Requise:analytics:read
GET/rooms/{roomId}/captured-emails

Adresses recueillies par la salle. source vaut verify si la personne l'a confirmée avec un lien à usage unique, et ask si elle l'a seulement saisie.

Requise:analytics:read
GET/room-views

Entrées dans les salles pour tout l'espace de travail, les plus récentes d'abord. Il n'existe pas d'autre source ; /views ne couvre que les vues de documents.

Requise:analytics:read
GET/room-labels

Liste les libellés de salle de l'espace de travail avec le nombre de salles qui utilisent chacun. C'est ici que vous trouvez les identifiants avant d'étiqueter une salle.

Requise:rooms:read
POST/room-labels

Crée un libellé. Les noms sont uniques par espace de travail, sans tenir compte de la casse ; color est une valeur hexadécimale #RRGGBB.

Requise:rooms:write
PATCH/room-labels/{labelId}

Renomme un libellé, change sa couleur ou modifie sa description.

Requise:rooms:write
DELETE/room-labels/{labelId}

Supprime un libellé et ses affectations. Les salles qui le portaient ne changent pas ; la réponse indique combien l'ont perdu.

Requise:rooms:write

Créer une salle en un seul appel

Envoyez chaque fichier avec POST /decks, puis créez la salle pour l’entreprise du destinataire avec un lien restreint pour les personnes qui doivent la voir. L’entreprise, les contacts, la salle, les documents et le lien sont créés ensemble : si l’appel est refusé, rien n’est créé. Les documents peuvent entrer dans la salle pendant leur traitement. Les éléments de la salle indiquent processingStatus : envoyez donc le lien une fois que chaque document indique 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 vaut open (toute personne disposant de l’URL), verify-any (les visiteurs confirment leur adresse e-mail avec un lien à usage unique) ou verified-allowlist (uniquement les adresses de allowedEmails et toute personne des domaines de allowedDomains). L’API n’ajoute personne d’elle-même à un lien restreint : incluez votre propre adresse si vous voulez prévisualiser la salle. Une option que votre forfait n’inclut pas renvoie 403 FEATURE_NOT_AVAILABLE, et un champ inconnu renvoie 400 : une salle ne s’ouvre donc jamais à une autre audience que celle demandée.

Organiser les onglets et les éléments

Partez de l’état actuel de la salle : la lecture d’une salle renvoie ses onglets et ses éléments dans l’ordre d’affichage, et chaque élément indique son onglet et sa position dans celui-ci, à partir de 0. Ajoutez des onglets et des éléments à une position donnée, déplacez des éléments entre onglets et envoyez le nouvel ordre complet d’un onglet. Un ordre doit citer chaque élément de l’onglet exactement une fois : relisez donc la salle si une autre modification a eu lieu entre-temps. Un onglet peut être supprimé dès qu’il n’affiche plus aucun élément.

{
  "type": "section",
  "label": "Commercials",
  "tabId": "{tabId}",
  "position": 0
}

Fournisseurs d'intégration pris en charge

Les intégrations acceptent un lien de partage ou un lien d'intégration et le normalisent vers la forme d'intégration du fournisseur. Tout ce qui sort de cette liste renvoie 400 EMBED_PROVIDER_NOT_SUPPORTED.

FieldTypeDescription
VidéoLoom, YouTube, Vimeo, Wistia, Vidyard
Prise de rendez-vousCalendly, Cal.com, SavvyCal, Google Calendar
FormulairesTypeform, Tally, Google Forms, Jotform, Fillout
DesignFigma, Miro, Canva, Whimsical
Documents et tableauxGoogle Docs, Google Sheets, Notion, Coda, Airtable
PrésentationsGoogle Slides, Pitch, Gamma, Guideflow, Flipsnack, Prezi
AudioSpotify, SoundCloud

Ajouter un autre lien d'audience

Chaque salle possède déjà un lien créé par POST /rooms ; ajoutez-en d'autres pour les audiences qui ont besoin d'une attribution ou d'un accès différents. Fournissez au moins l'un des champs recipientName, recipientEmail, contactId, companyId ou companyName. accessMode accepte les mêmes valeurs open, verify-any ou verified-allowlist que primaryLink, avec les mêmes champs (requireEmail, allowedEmails, allowedDomains, label, expiresAt, allowDownloads). Un appel refusé, y compris par une limite du forfait, ne laisse ni lien, ni entreprise, ni contact.

{
  "companyName": "Analytical Engines",
  "accessMode": "verified-allowlist",
  "allowedEmails": [
    {
      "email": "cfo@analytical.example",
      "name": "Sam Rivera"
    }
  ]
}

Modifier un lien

Quatre champs : isActive, expiresAt, allowedEmails, allowedDomains (les deux derniers uniquement sur les liens verified-allowlist). accessMode et le slug ne changent jamais ; créez plutôt un nouveau lien. Réactiver un lien revérifie la limite de liens actifs du forfait.

{
  "isActive": false
}

Construire le plan d'action

Chaque salle possède exactement un plan, qui se rattache donc à la salle sans identifiant propre. La plupart des tâches appartiennent à une entreprise plutôt qu'à une personne : envoyez un side seul et le plan le lit comme l'entreprise, ce qui convient quand vous ignorez qui fera le travail en face. N'ajoutez un email que si vous connaissez la personne. Une tâche interne n'apparaît jamais dans la salle et ne peut donc pas appartenir au destinataire.

{
  "title": "Sign the NDA",
  "assignee": {
    "side": "buyer"
  },
  "dueDate": "2026-10-02"
}

recipientCompletionEnabled sur le plan décide si les personnes qui ouvrent la salle peuvent cocher les tâches de leur côté. La valeur par défaut est true, et c'est la seule barrière : l'API ne demande jamais l'adresse d'un destinataire pour terminer une tâche. Qui a coché quoi est enregistré au niveau de certitude que permet le mode d'accès de la salle.

Étiqueter les salles

Les libellés valent pour tout l'espace de travail : créez-les une fois et réutilisez-les. Passez labelIds dans POST /rooms pour étiqueter une salle dès sa création, ou dans PATCH /rooms/{roomId} pour remplacer l'ensemble ; un tableau vide retire tous les libellés, et omettre le champ les laisse tels quels. Une salle en porte cinq au maximum, ce qui est structurel et non un réglage. La lecture d'une salle renvoie ses libellés.

{
  "labelIds": [
    "{labelId}"
  ]
}

Savoir ce qui s'est passé

Interrogez /room-views pour les entrées de tout l'espace de travail, puis lisez les analyses, l'activité et les adresses recueillies d'une salle. Passez le nextCursor d'une page comme cursor pour continuer ; un curseur que cette API n'a pas émis renvoie 400 au lieu de repartir du début, de sorte qu'un scrutateur ne refait jamais le même travail. Utilisez since pour restreindre la période d’activité et cursor pour parcourir ses pages. /room-views est une fenêtre et non une archive : sans since vous obtenez les 30 derniers jours, et au-delà de 90 jours la requête est refusée. La fenêtre appliquée revient dans since ; renvoyez-la avec cursor pour continuer à parcourir le même ensemble.

Entreprises et contacts

Retrouvez des fiches de compte existantes ou créez-les avec une correspondance déterministe. Les noms d’entreprise et les e-mails des contacts sont comparés sans tenir compte de la casse.

GET/companies?name={name}&domain={domain}

Recherche des entreprises par nom exact et, facultativement, par domaine.

Requise:crm:read
POST/companies

Retrouve une entreprise par son nom sans tenir compte de la casse ou la crée. Un domaine explicite enrichit uniquement la fiche.

Requise:crm:write
GET/contacts?email={query}

Recherche des contacts par adresse e-mail et renvoie les correspondances avec leur entreprise associée.

Requise:crm:read
POST/contacts

Retrouve ou crée un contact par e-mail et l’associe facultativement à une entreprise.

Requise:crm:write

Requête POST /companies

FieldTypeDescription
namestringrequisNom de l’entreprise
domainstringfacultatifDomaine utilisé pour enrichir l’entreprise. Il ne sert jamais à retrouver une entreprise existante

Requête POST /contacts

FieldTypeDescription
namestringconditionnelNom complet. Requis si firstName est absent
firstNamestringconditionnelPrénom. Requis si name est absent
lastNamestringfacultatifNom de famille
emailstringrequisAdresse e-mail utilisée pour une correspondance unique
titlestringfacultatifIntitulé du poste
companyIdUUIDfacultatifEntreprise existante dans l’espace de travail authentifié
companyNamestringfacultatifNom de l’entreprise à retrouver ou à créer
companyDomainstringfacultatifDomaine d’enrichissement facultatif utilisé avec companyName. Ce n’est pas une clé de correspondance

Réponse de l’entreprise

FieldTypeDescription
company.idUUIDIdentifiant de l’entreprise
company.namestringNom de l’entreprise
company.domainstring | nullDomaine normalisé de l’entreprise
createdbooleantrue si la requête POST a créé l’entreprise

Réponse du contact

FieldTypeDescription
contact.idUUIDIdentifiant du contact
contact.firstNamestringPrénom
contact.lastNamestringNom de famille
contact.emailstringAdresse e-mail normalisée
contact.titlestring | nullIntitulé du poste
contact.companyIdUUID | nullIdentifiant de l’entreprise associée
contact.companyNamestring | nullNom de l’entreprise associée
createdbooleantrue si la requête POST a créé le contact
companyobject | nullEntreprise résolue, si disponible
companyCreatedbooleantrue si cette requête a créé l’entreprise

Webhooks

Abonnez-vous aux événements en temps réel via REST Hooks. Lorsqu'un événement se produit, HummingDeck envoie une requête POST à votre URL HTTPS enregistrée avec le payload de l'événement. Les livraisons échouées sont relancées jusqu'à 3 fois (à intervalles de 1 s, 5 s et 30 s). Les abonnements aux webhooks sont gérés par l'intégration Zapier et ne sont pas accessibles aux tokens d'API d'espace de travail.

POST/hooks

S'abonner à un événement. Nécessite une URL HTTPS cible et un type d'événement. Renvoie un identifiant d'abonnement.

Zapier OAuth uniquement

DELETE/hooks/{id}

Se désabonner d'un événement par identifiant d'abonnement.

Zapier OAuth uniquement

Types d'événements

EventDescription
view.createdUne vraie personne a consulté un document partagé. Le trafic de bots (scanners de sécurité e-mail, robots d'indexation) est filtré automatiquement.
decision.madeUn prospect a répondu à une proposition : acceptée, refusée ou avec des modifications demandées.
email_capturedUn visiteur a saisi son adresse e-mail pour accéder à du contenu protégé.

Exemples 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"
  }
}

Vues et événements

Endpoints d'interrogation pour récupérer les données d'engagement récentes. Ils renvoient les mêmes données que les webhooks livrent en temps réel. Utilisez-les pour le remplissage, les tests ou en tant que solution de secours.

GET/views

Lister les 100 consultations de documents les plus récentes. Les sessions de bots sont exclues.

Requise:analytics:read
GET/decisions

Lister les décisions récentes sur les propositions (acceptées, refusées, modifications demandées).

Requise:analytics:read
GET/emails

Lister les captures d'e-mail récentes depuis du contenu protégé.

Requise:analytics:read

Gestion des erreurs

Chaque erreur renvoie un objet JSON avec un champ error décrivant ce qui n’a pas fonctionné. La plupart des réponses contiennent aussi un champ code pour le traitement programmatique, par exemple PLAN_LIMIT_REACHED, FEATURE_NOT_AVAILABLE, ROOM_NOT_ACTIVE, TAB_NOT_EMPTY, INVALID_FORMAT ou FILE_TOO_LARGE. Les codes de statut HTTP suivent les conventions habituelles.

StatusMeaning
400Requête incorrecte : paramètres manquants ou invalides
401Non autorisé : Bearer token invalide ou expiré
403Interdit : l’identifiant ne possède pas un scope requis, une limite du forfait est atteinte, le forfait n’inclut pas une option nécessaire, ou ce type d’identifiant n’est pas autorisé sur cet endpoint
404Introuvable : la ressource n'existe pas ou n'appartient pas à votre équipe
409Conflit : les identifiants fournis ne correspondent pas, la salle est archivée, ou les onglets de la salle ne permettent pas la modification
413Charge utile trop volumineuse : le corps de la requête ou le fichier dépasse la limite de cet endpoint
429Trop de requêtes : la clé ou l’IP cliente a dépassé sa limite actuelle ; réessayez après le délai Retry-After
500Erreur serveur : réessayez la requête

Limites de débit

Les clés manuelles d’espace et les connexions OAuth Zapier sont limitées par identifiant : 600 lectures par 5 minutes, 120 écritures par minute, 60 requêtes /room-views par minute et 20 imports par heure. Pour l’ensemble des identifiants, chaque espace est limité à 1 200 lectures par 5 minutes, 240 écritures par minute, 120 requêtes /room-views par minute et 40 imports par heure. Les échecs d’authentification Bearer et les authentifications de client OAuth invalides sont chacun limités à 60 tentatives par 5 minutes et par IP cliente. Maximum 50 abonnements webhook actifs par équipe.

Cette API est actuellement utilisée par notre intégration Zapier. Des plateformes d'intégration supplémentaires pourront être prises en charge à l'avenir.