Created by Github action --------- Co-authored-by: Crowdin Bot <support+bot@crowdin.com> Co-authored-by: github-actions <github-actions@twenty.com>
87 lines
5.6 KiB
Plaintext
87 lines
5.6 KiB
Plaintext
---
|
|
title: Webhooks
|
|
image: /images/docs/getting-started/webhooks.png
|
|
info: Discover how to use our Webhooks.
|
|
---
|
|
|
|
<Frame>
|
|
<img src="/images/docs/getting-started/webhooks.png" alt="Header" />
|
|
</Frame>
|
|
|
|
## Overzicht
|
|
|
|
Webhooks in Twenty completeren de API door **realtime meldingen** naar uw eigen applicaties te verzenden wanneer bepaalde gebeurtenissen plaatsvinden in uw CRM. In plaats van de API continu te raadplegen voor wijzigingen, kunt u webhooks instellen zodat Twenty gegevens naar uw systeem **stuwt** wanneer specifieke gebeurtenissen zich voordoen (bijvoorbeeld wanneer een nieuw record wordt gemaakt of een bestaand record wordt bijgewerkt). Hiermee blijven externe systemen direct en efficiënt gesynchroniseerd met Twenty.
|
|
|
|
Met webhooks stuurt Twenty een HTTP POST-verzoek naar een URL die u aangeeft, dat details over de gebeurtenis bevat. U kunt die gegevens vervolgens in uw applicatie verwerken (bijv. om uw externe database bij te werken, workflows te activeren of waarschuwingen te verzenden).
|
|
|
|
## Setting Up a Webhook
|
|
|
|
To create a webhook in Twenty, use the **APIs & Webhooks** settings in your Twenty app:
|
|
|
|
1. **Navigate to Settings:** In your Twenty application, go to **Settings → APIs & Webhooks**.
|
|
2. **Create a Webhook:** Under **Webhooks** click on **+ Create webhook**.
|
|
3. **Voer URL in:** Geef het eindpunt-URL op uw server op waar u wilt dat Twenty webhook-verzoeken verzendt. Dit moet een publiek toegankelijke URL zijn die POST-verzoeken kan ontvangen.
|
|
4. **Opslaan:** Klik op **Opslaan** om de webhook te maken. De nieuwe webhook wordt onmiddellijk actief.
|
|
|
|
U kunt meerdere webhooks maken als u verschillende gebeurtenissen naar verschillende eindpunten wilt verzenden. Elke webhook is in feite een abonnement voor alle relevante gebeurtenissen (op dit moment stuurt Twenty alle gebeurtenistypen naar de opgegeven URL; het filteren van specifieke gebeurtenistypen kan configureerbaar zijn in de gebruikersinterface). Als u ooit een webhook moet verwijderen, kunt u deze verwijderen vanaf dezelfde instellingenpagina (selecteer de webhook en kies verwijderen).
|
|
|
|
## Gebeurtenissen en Payloads
|
|
|
|
Zodra een webhook is ingesteld, stuurt Twenty een HTTP POST-verzoek naar uw opgegeven URL telkens wanneer een triggergebeurtenis plaatsvindt in uw CRM-gegevens. Veelvoorkomende gebeurtenissen die webhooks activeren zijn:
|
|
|
|
- **Record Aangemaakt:** bv. een nieuw persoon wordt toegevoegd (`persoon.aangemaakt`), een nieuw bedrijf wordt aangemaakt (`bedrijf.aangemaakt`), een notitie wordt gemaakt (`notitie.aangemaakt`), enz.
|
|
- **Record Bijgewerkt:** bv. de informatie van een bestaande persoon wordt bijgewerkt (`persoon.bijgewerkt`), een bedrijfsrecord wordt bewerkt (`bedrijf.bijgewerkt`), enz.
|
|
- **Record Verwijderd:** bv. een persoon of bedrijf wordt verwijderd (`persoon.verwijderd`, `bedrijf.verwijderd`).
|
|
- **Andere Gebeurtenissen:** Indien van toepassing, andere objectgebeurtenissen of aangepaste triggers (bijvoorbeeld als taken of andere objecten worden bijgewerkt, worden vergelijkbare gebeurtenistypen gebruikt zoals `taak.aangemaakt`, `notitie.bijgewerkt`, enz.).
|
|
|
|
Het POST-verzoek van de webhook bevat een JSON-payload in zijn lichaam. De payload bevat over het algemeen minstens twee dingen: het type gebeurtenis en de gegevens met betrekking tot die gebeurtenis (vaak het record dat is aangemaakt/bijgewerkt). Een webhook voor een nieuw aangemaakte persoon kan bijvoorbeeld een payload als volgt verzenden:
|
|
|
|
```
|
|
{
|
|
"event": "person.created",
|
|
"data": {
|
|
"id": "abc12345",
|
|
"firstName": "Alice",
|
|
"lastName": "Doe",
|
|
"email": "alice@example.com",
|
|
"createdAt": "2025-02-10T15:30:45Z",
|
|
"createdBy": "user_123"
|
|
},
|
|
"timestamp": "2025-02-10T15:30:50Z"
|
|
}
|
|
```
|
|
|
|
In dit voorbeeld:
|
|
|
|
- `"event"` specificeert wat er gebeurde (`persoon.aangemaakt`).
|
|
- `"data"` bevat de details van het nieuwe record (dezelfde informatie die je zou krijgen als je die persoon via de API opvroeg).
|
|
- `"timestamp"` geeft aan wanneer de gebeurtenis plaatsvond (in UTC).
|
|
|
|
Uw eindpunt moet klaar zijn om dergelijke JSON-gegevens via POST te ontvangen. Gewoonlijk parseert u de JSON, kijkt naar het `"event"`-type om te begrijpen wat er is gebeurd, en gebruikt vervolgens de `"data"` dienovereenkomstig (bijv. maak een nieuw contact aan in uw systeem of werk een bestaand contact bij).
|
|
|
|
**Opmerking:** Het is belangrijk om te reageren met een **2xx HTTP-status** vanaf uw webhook-eindpunt om de succesvolle ontvangst te bevestigen. Als de Twenty-webhookzender geen 2xx-reactie ontvangt, wordt de levering mogelijk als mislukt beschouwd. (In de toekomst kan logica voor opnieuw proberen mislukte webhooks opnieuw proberen te verzenden, dus streef er altijd naar om zo snel mogelijk een 200 OK terug te geven nadat de gegevens zijn verwerkt.)
|
|
|
|
## Webhook Validation
|
|
|
|
Om de beveiliging van je webhook-eindpunten te waarborgen, voegt Twenty een handtekening toe in de `X-Twenty-Webhook-Signature`-header.
|
|
|
|
Deze handtekening is een HMAC SHA256-hash van de requestpayload, berekend met behulp van je webhookgeheim.
|
|
|
|
Om de handtekening te valideren, moet u:
|
|
|
|
1. Concateneer de timestamp (van `X-Twenty-Webhook-Timestamp`-header), een dubbele punt en de JSON-string van de payload
|
|
2. Bereken de HMAC SHA256-hash met behulp van uw webhook-geheim als de sleutel ()
|
|
3. Vergelijk de resulterende hex-digest met de handtekeningheader
|
|
|
|
Hier is een voorbeeld in Node.js:
|
|
|
|
```javascript
|
|
const crypto = require("crypto");
|
|
const timestamp = "1735066639761";
|
|
const payload = JSON.stringify({...});
|
|
const secret = "your-secret";
|
|
const stringToSign = `${timestamp}:${JSON.stringify(payload)}`;
|
|
const signature = crypto.createHmac("sha256", secret)
|
|
.update(stringToSign)
|
|
.digest("hex");
|
|
``` |