Naar de inhoud

Webhook na het gesprek ​

De webhook na het gesprek stuurt alle gegevens van een afgerond gesprek naar je server: wie er belde, hoe lang, wat de uitkomst was, de samenvatting, de transcriptie en de eigen variabelen die je hebt gedefinieerd. Het is de basis voor koppelingen met een CRM, Slack of een spreadsheet.

Je maakt hem per assistent aan als HTTP-verzoek onder Assistenten → Taken, op de kaart Acties: klik op Nieuw toevoegen, kies HTTP-verzoek en laat Wanneer op Na het gesprek staan. Daarvoor heb je de rol Bewerker of Beheerder nodig.

Wanneer wordt hij aangeroepen? ​

Na het ophangen wacht het platform tot de samenvatting is geschreven en de eigen variabelen zijn geëxtraheerd, en verstuurt dan het verzoek. Meestal is dat binnen een minuut na het einde van het gesprek. Bij tekstkanalen gebeurt dit zodra het gesprek wordt afgesloten: als de assistent het afrondt, als iemand in de Inbox op Gesprek beëindigen klikt, of na een tijd zonder activiteit: bij webchat de Time-out bij inactiviteit (standaard 60 minuten), bij sms en WhatsApp 6 uur (met je team: niet zolang de klant op een antwoord wacht, daarna na 18 uur stilte).

De webhook gaat af voor elk gesprek van een assistent waaraan de actie is gekoppeld, inkomend en uitgaand, ook bij uitkomsten als no_interaction of spam. Wil je alleen bepaalde gesprekken ontvangen, vul dan bij de actie in gewone taal Onder welke voorwaarde moet dit na het gesprek gebeuren? in, of filter aan je kant op outcome.

Zei de klant niets of mislukte de analyse, dan is er geen samenvatting en zijn er geen eigen variabelen. summary blijft dan leeg en een actie met een voorwaarde loopt niet.

In Uitproberen gaat de webhook af bij Echt bellen, want dat is een echt gesprek. Bij Chatten gaat hij alleen af met Acties echt uitvoeren aan, en pas als de assistent het gesprek afsluit. Hetzelfde geldt bij Bellen als je een bericht typt terwijl er geen gesprek loopt. Een gesprek dat je daar met Gesprek starten voert, stuurt de webhook niet.

De standaardbody ​

Laat je het Body-sjabloon van de actie leeg, dan sturen wij een POST (de standaardmethode) met alle ingebouwde variabelen plus je eigen variabelen als JSON, voorzien van de header X-Yarla-Signature (zie Webhooks). Bij GET gaan er geen body en geen handtekening mee.

json
{
  "personNumber": "+31612345678",
  "agentNumber": "+31201234567",
  "conversationId": "v3:8fK2mQ7xT1pLw9Zr",
  "conversationLink": "https://<dashboard-domain>/nl/inbox/v3%3A8fK2mQ7xT1pLw9Zr",
  "startTimestamp": "2026-09-10T14:02:11.000Z",
  "direction": "inbound",
  "channel": "voice",
  "durationSeconds": 187,
  "disconnectReason": "normal_clearing",
  "summary": "Jan de Vries meldt een lekkende keukenkraan die al twee dagen druppelt. Hij wil een offerte en is bereikbaar na 17:00.",
  "plainTranscript": "Assistant: Goedemiddag, je spreekt met Anna van Loodgieter Jansen. Waarmee kan ik je helpen?\nCustomer: Mijn keukenkraan lekt al twee dagen.\nAssistant: Dat is vervelend. Mag ik je naam en adres noteren?\n...",
  "audioLink": "https://<dashboard-domain>/nl/inbox/v3%3A8fK2mQ7xT1pLw9Zr",
  "outcome": "resolved",
  "assistant": { "name": "Anna" },
  "company": {
    "name": "Loodgieter Jansen",
    "website": "https://loodgieterjansen.example",
    "phone": "+31201234567",
    "email": "info@loodgieterjansen.example",
    "address": ""
  },
  "contact": { "name": "Jan de Vries", "company": "" },
  "inboundContext": { "customerName": "Jan de Vries", "customerId": "C-1042" },
  "issueType": "leak",
  "urgency": "normal",
  "callbackAfter": "17:00"
}
VeldBetekenis
personNumberNummer van de beller of ontvanger (E.164). Leeg bij webchat.
agentNumberJe nummer waarop het gesprek liep. Leeg bij webchat.
conversationIdUnieke id van het gesprek, dezelfde als id in de API. De vorm verschilt per kanaal (bij sms bijvoorbeeld sms:01J8ZK3Q7X4M9V2RT6B5N8WPHA), dus behandel hem als tekst.
conversationLinkDirecte link naar het gesprek in de Inbox, in de taal van je bedrijf.
startTimestampBegin van het gesprek, ISO 8601 in UTC.
directioninbound of outbound.
channelvoice (telefoongesprek), sms, whatsapp of webchat.
durationSecondsDuur in seconden. 0 bij sms, WhatsApp en webchat.
disconnectReasonTechnische code voor de reden waarom het telefoongesprek eindigde, bijvoorbeeld completed, transferred, normal_clearing of user_busy. Leeg bij sms, WhatsApp en webchat.
summarySamenvatting van het AI-model.
plainTranscriptDe transcriptie als tekst. Elk bericht begint met Customer: of Assistant:, in elke taal. Een bericht met regeleinden loopt over meer regels, en antwoorden van je team staan ook onder Assistant:. Ook interne aanduidingen tussen blokhaken kunnen erin staan.
audioLinkLink naar het gesprek in de Inbox, waar je de opname beluistert. Dit is geen link naar een audiobestand. Leeg als er geen opname is, bijvoorbeeld als Gesprekken opnemen uitstaat of bij tekstkanalen. Opnames worden na 30 dagen verwijderd.
outcomeresolved, transferred, appointment_booked, callback_requested, voicemail, abandoned, no_interaction of spam.
assistant.nameNaam van de assistent.
company.nameNaam van je bedrijf.
company.website, company.phone, company.emailJe website en het telefoonnummer en e-mailadres voor klanten. Leeg als je ze niet hebt ingevuld.
company.addressJe adres, alleen als je dat deelt met klanten. Anders leeg.
contact.name, contact.companyGegevens van het gekoppelde contact. Leeg als er geen contact bij het gesprek hoort. Ook leeg bij een uitgaand gesprek naar een nummer dat al een contact heeft, en als het contact pas is toegevoegd nadat het gesprek begon.
inboundContextAlle velden die je inkomende webhook teruggaf. Leeg object als die niet heeft gelopen, zoals bij uitgaande gesprekken en tekstkanalen.
Je eigen variabelen, hier issueType, urgency en callbackAfterElk onder zijn eigen naam op het hoogste niveau, niet in een apart object. Het zijn de Extra variabelen om te extraheren van alle ingeschakelde acties na het gesprek van deze assistent. Een variabele die niet uit het gesprek kwam, ontbreekt. Een eigen variabele met de naam van een ingebouwde variabele overschrijft die. Bij uitgaande gesprekken staan hier ook de variabelen van de campagne of de API-aanroep.

Een eigen body ​

Verwacht je systeem een specifiek formaat, dan bouw je in de actie zelf een body met variabelen. Ingebouwde variabelen gebruik je onder hun naam, geneste velden met een punt, en eigen variabelen direct onder hun eigen naam.

json
{
  "text": "Nieuw gesprek ({{outcome}}) van {{personNumber}}: {{summary}} — {{conversationLink}}",
  "ticket": {
    "externalId": "{{conversationId}}",
    "customer": "{{contact.name}}",
    "customerId": "{{inboundContext.customerId}}",
    "issue": "{{issueType}}",
    "urgency": "{{urgency}}"
  }
}

Zet variabelen in JSON tussen aanhalingstekens; alleen een heel object, zoals {{inboundContext}}, zet je zonder. Begint je body met { of [, dan zorgen wij ervoor dat aanhalingstekens en regeleinden in de waarden de JSON niet breken, dus ook lange tekst zoals plainTranscript kan erin. Een variabele zonder waarde wordt leeg. Alle beschikbare variabelen staan in Acties.

Het antwoord ​

Van je antwoord kijken wij alleen naar de statuscode. Een status in de 2xx-reeks betekent geslaagd; alles anders, of geen antwoord binnen 8 seconden, wordt als mislukt gemarkeerd. De inhoud van je antwoord wordt verder genegeerd; bij een mislukking bewaren wij alleen de eerste 300 tekens als toelichting. Gebruik het definitieve adres: bij een doorverwijzing met 301, 302 of 303 wordt een POST een GET zonder body.

Mislukte verzoeken worden niet automatisch opnieuw geprobeerd, en je kunt ze ook niet handmatig opnieuw uitvoeren. Je ziet het resultaat bij het gesprek in de Inbox: klap Technische details open en kijk onder Wat de acties hebben gedaan. Antwoord daarom direct met 200 en verwerk de gegevens daarna, zodat een trage CRM-koppeling nooit tot een mislukking leidt.

Idempotentie ​

Wij sturen per gesprek één verzoek per actie. Toch kan hetzelfde gesprek meer dan één keer bij je aankomen, bijvoorbeeld omdat een tussenstap zoals Make of je eigen wachtrij opnieuw probeert, of omdat meerdere acties naar hetzelfde endpoint sturen. Gebruik conversationId om dubbele verwerking te voorkomen:

  • sla de verwerkte id's op en sla een verzoek met een bekende id over, of
  • gebruik de id als externe sleutel in je CRM en werk het bestaande record bij in plaats van een nieuw record te maken.

Veelgebruikte toepassingen ​

  • CRM: ticket of notitie aanmaken bij het contact, met summary en conversationLink.
  • Slack of Teams: een bericht per gesprek in een kanaal, zodat het team direct kan opvolgen.
  • Spreadsheet of database: één rij per gesprek voor rapportage. Voor Google Sheets is er een aparte actie die geen endpoint nodig heeft.
  • Terugbellijst: alleen gesprekken met outcome gelijk aan callback_requested doorsturen naar je planning.

Voor Make, n8n en Zapier staan kant-en-klare stappen in Make en n8n.

Gerelateerde artikelen ​

Yarla Help — de handleiding voor jouw AI-telefoonassistent.