Développeurs
Construisez sur Neural Summary
Envoyez vos appels et réunions via une API REST. Recevez le résumé, les actions et toutes les lentilles demandées sous forme de webhooks signés. Pas de nouvel outil pour votre équipe, pas de copier-coller.
Comment ça marche
Vous envoyez un enregistrement avec des métadonnées facultatives. Neural Summary le transcrit, rédige le résumé et génère les livrables des lentilles demandées. Une fois terminé, nous envoyons un webhook signé à votre endpoint. De là, vous acheminez le résultat où vous voulez : un CRM, une boîte mail, une base de données ou une automatisation dans Zapier, Make ou n8n.
Un enregistrement en entrée, des livrables structurés en sortie.
Démarrage rapide
1. Créez une clé API. Ouvrez Paramètres › Intégrations et copiez la clé. Elle n’est affichée qu’une seule fois.
# Create an API key in Settings > Integrations. It is shown once.
API_KEY="ns_live_..."2. Envoyez un fichier audio. Le multipart convient pour les petits fichiers.
curl -X POST https://neuralsummary.com/integrations/v1/transcriptions \
-H "Authorization: Bearer $API_KEY" \
-F "audio=@./call.mp3;type=audio/mpeg" \
-F 'metadata={"title":"Call with Acme","callMetadata":{"callerName":"Jane Doe","callerEmail":"[email protected]"},"integrationOptions":{"lensTemplates":["followUpEmail"]}}'3. Recevez le résultat. Abonnez un webhook (recommandé) ou interrogez la transcription jusqu’à ce qu’elle soit terminée.
curl -H "Authorization: Bearer $API_KEY" \
https://neuralsummary.com/integrations/v1/transcriptions/<id>Authentification
Chaque requête /integrations/v1/* nécessite une clé API, dans l’un ou l’autre de ces en-têtes :
Authorization: Bearer ns_live_...x-api-key: ns_live_...
Les clés se gèrent dans Paramètres › Intégrations. Nous stockons un hash bcrypt plus les premiers caractères pour l’affichage, jamais la clé brute. Révoquez une clé depuis le même écran et elle cesse de fonctionner immédiatement. Une clé hérite des limites du plan de son propriétaire, et les envois via intégration comptent dans le même quota mensuel que l’application.
Endpoints
/integrations/v1/transcriptionsEnvoi multipart, adapté aux fichiers jusqu’à environ 100 Mo. Envoyez le fichier dans audio et, si besoin, un champ JSON metadata avec title, callMetadata et integrationOptions. Retourne une transcription avec le statut pending.
/integrations/v1/upload-urlPour les enregistrements volumineux. Demandez une URL de stockage signée, envoyez-y le fichier directement, puis appelez from-storage. L’audio ne transite jamais par notre API.
{
"fileName": "long-call.m4a",
"contentType": "audio/x-m4a",
"fileSize": 524288000
}Vous recevez une uploadUrl et un storagePath. Envoyez les octets en PUT avec exactement le même Content-Type. L’URL expire au bout d’une heure.
/integrations/v1/transcriptions/from-storageUne fois le PUT terminé, indiquez-nous que le fichier est prêt. Nous n’acceptons qu’un storagePath que nous avons émis.
{
"storagePath": "uploads/<your-uid>/...long-call.m4a",
"fileName": "long-call.m4a",
"fileSize": 524288000,
"contentType": "audio/x-m4a",
"title": "Sales call with Acme",
"callMetadata": { "callerEmail": "[email protected]" },
"integrationOptions": { "lensTemplates": ["followUpEmail", "salesEmail"] }
}/integrations/v1/transcriptions/:idSolution de repli par polling pour les systèmes qui ne peuvent pas recevoir de webhooks. Retourne la transcription complète, avec ses résultats dès que le statut est completed. N’interrogez pas plus d’une fois toutes les 10 secondes. La latence typique est de 30 à 60 secondes par minute d’enregistrement.
Modèles de lentilles
Passez n’importe lequel de ces identifiants à integrationOptions.lensTemplates pour les générer en plus du résumé. Le résumé est toujours produit. Les identifiants inconnus renvoient 400 Bad Request.
| ID | Livrable |
|---|---|
followUpEmail | E-mail de suivi prêt à envoyer |
salesEmail | E-mail de suivi commercial avec preuves |
actionItems | Liste d’actions avec responsables et dates |
meetingMinutes | Compte rendu de réunion formel |
oneOnOneNotes | Notes de 1:1 |
agileBacklog | User stories avec critères d’acceptation |
prd | Document d’exigences produit |
retrospective | Thèmes de rétro et améliorations |
crmNotes | Notes au format CRM (BANT, parties prenantes) |
dealQualification | Qualification MEDDICC |
objectionHandler | Objections et réponses suggérées |
blogPost | Brouillon d’article de blog |
linkedinPost | Variantes de post LinkedIn |
Webhooks
Ajoutez un endpoint dans Paramètres › Intégrations › Webhooks. Nous envoyons un POST signé lorsqu’une transcription issue d’une intégration se termine. Abonnez-vous à l’un ou aux deux événements : v1.transcription.completed et v1.transcription.failed.
La livraison est retentée à chaque réponse non-2xx.
Payload
{
"id": "evt_aBcDeFgHiJkLmNoP",
"event": "v1.transcription.completed",
"createdAt": "2026-05-16T10:13:45.123Z",
"data": {
"transcriptionId": "tr_xyz",
"title": "Call with Acme",
"durationSeconds": 312,
"detectedLanguage": "english",
"callMetadata": {
"callerName": "Jane Doe",
"callerEmail": "[email protected]",
"callerPhone": "+31612345678",
"callSource": "ringcentral",
"externalRef": "call_98765"
},
"summary": { "...": "SummaryV2: title, intro, sections, decisions, nextSteps" },
"generatedAnalysisIds": ["ana_abc", "ana_def"],
"conversationCategory": "sales-call",
"completedAt": "2026-05-16T10:13:45.000Z"
}
}Vérifier la signature
L’en-tête X-NeuralSummary-Signature a la forme t=<unix-seconds>,v1=<hex>. Le HMAC est le SHA-256 de <seconds>.<raw-body> avec votre secret de webhook. C’est le même format que Stripe. Rejetez tout ce qui date de plus de cinq minutes.
const crypto = require('crypto');
// Header format: t=<unix-seconds>,v1=<hex-hmac>
function verify(rawBody, headerValue, secret, toleranceSeconds = 300) {
const parts = Object.fromEntries(
headerValue.split(',').map((p) => p.split('=')),
);
const ts = parseInt(parts.t, 10);
if (Math.abs(Date.now() / 1000 - ts) > toleranceSeconds) return false;
const expected = crypto
.createHmac('sha256', secret)
.update(`${ts}.${rawBody}`)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(expected, 'hex'),
Buffer.from(parts.v1, 'hex'),
);
}Nouvelles tentatives
Une réponse non-2xx est retentée jusqu’à cinq fois avec backoff exponentiel : 30 s, 1 min, 2 min, 4 min, 8 min. Nous ne retentons pas les réponses 4xx, sauf 408 et 429. Les livraisons échouées apparaissent sous Livraisons récentes avec un bouton Rejouer en un clic.
Zapier, Make et n8n
Vous n’avez pas besoin d’écrire un gestionnaire de webhook. Zapier, Make et n8n disposent tous d’une action HTTP générique qui appelle nos endpoints, plus d’un déclencheur catch-hook qui reçoit notre webhook. Une recette classique transforme un appel enregistré en brouillon d’e-mail de suivi :
De l’enregistrement d’appel au brouillon de suivi, sans code.
Le schéma est le même dans chaque outil : utilisez le module ou l’action HTTP pour les trois appels d’envoi, et le déclencheur catch-hook pour le webhook. Prenez data.callMetadata.callerEmail dans le webhook comme destinataire, et récupérez le contenu de la lentille via l’endpoint de polling avec data.transcriptionId.
Limites et sécurité
- Plan Enterprise requis (les admins peuvent contourner pour tester).
- Limites par clé : 30 envois multipart, 60 créations d’URL d’envoi et 120 lectures par polling par minute.
- Jusqu’à 5 Go par fichier, soit la limite d’envoi du plan Enterprise.
- Les URL de webhook doivent utiliser HTTPS en production. Les hôtes loopback sont refusés.
- Les clés API sont stockées sous forme de hash bcrypt. Les secrets de webhook sont affichés à la demande ; traitez-les comme un mot de passe.
Commencez à construire
Générez une clé API dans Paramètres › Intégrations et envoyez votre premier enregistrement. Besoin d’aide ? [email protected].