Skip to main content

API Reference v1

Integratiereferentie voor REST + Webhooks (versie 2026-06-15)

Quickstart CRM-integratie

De snelste route om een CRM met Heilo te verbinden. De volledige API-referentie staat hieronder.

Integreer webhook-first: het event call.completed is de primaire gegevensbron (het bevat de opnamekoppeling en het verwerkte transcript). REST /calls is een aanvulling — introspectie en het lezen van geselecteerde metadata.

  1. Stel een webhook-endpoint beschikbaar in uw CRM of middleware (zonder code: gebruik Zapier/Make — zie de handleiding hieronder).
  2. Voeg een abonnement toe in Heilo (Instellingen → Integraties) voor call.completed (optioneel ook call.outbound.attempted).
  3. Ontvang call.completed en verifieer de handtekening (Heilo-Signature-header, HMAC — zie hieronder).
  4. Ontdubbel op event_id (heilo-event-id-header); data.call_id groepeert events van hetzelfde gesprek.
  5. Map de velden naar uw CRM: vind/maak een contact op telefoonnummer, maak een lead/deal aan en koppel een activiteit/notitie (samenvatting + opnamekoppeling).

Geen code? De no-code verbindingshandleiding (Zapier/Make) leidt u er stap voor stap doorheen.

Authenticatie

De publieke API gebruikt Bearer-tokens. Genereer een API-sleutel via de kaart "API-sleutels" op de pagina Integraties en stuur deze mee in de header:

Authorization: Bearer hk_live_AbC1MnPq...

Heilo heeft drie authenticatiemodi:

  • Bearer (API-sleutels hk_live_…) — voor de publieke API. Geen CSRF, geen cookies.
  • Sessiecookies — voor de webapp (heilo.io). NIET gebruiken voor de publieke API.
  • HMAC-SHA256 — voor Webhooks die Heilo naar UW endpoint stuurt (u verifieert de signature-header).
Recht (scope)Betekenis
read.callsGesprekken lezen: GET /api/v1/calls, GET /api/v1/calls/:id
write.calls, read.contacts, write.contacts, manage.webhooks, manage.api_keysGereserveerd voor geplande API-endpoints — vink ze niet alvast aan.

Het veld environment in het /me-antwoord heeft vandaag altijd de waarde live. Testsleutels zijn gepland.

Base-URL

Alle publieke endpoints bevinden zich onder /api/v1/. Productie:

https://www.heilo.io/api/v1

Endpoints

Elk /api/v1-endpoint vereist Bearer. /me hieronder dient voor introspectie van de sleutel; het lezen van gesprekken staat in de sectie "Calls". Behandel webhooks als de primaire gegevensbron bij het integreren van een CRM — REST is voor introspectie en het lezen van geselecteerde metadata.

GET/api/v1/me

Introspectie van de API-sleutel — geeft de key id, user_id, scopes en rate limit terug. Handig voor een "connection test" in Zapier/Make.

Request

curl https://www.heilo.io/api/v1/me \
  -H "Authorization: Bearer hk_live_AbC1MnPq..."

Response

{
  "success": true,
  "data": {
    "api_key_id": "a1b2c3d4-5e6f-7081-92a3-b4c5d6e7f809",
    "user_id": "5f4e3d2c-1a2b-4c3d-8e9f-0a1b2c3d4e5f",
    "organization_id": "7a8b9c0d-1e2f-4a3b-9c8d-7e6f5a4b3c2d",
    "scopes": ["read.calls", "manage.webhooks"],
    "rate_limit_per_hour": 1000,
    "environment": "live"
  },
  "meta": { "timestamp": "2026-06-03T12:34:56Z" }
}

Toepassing: Zapier-verbindingstest tijdens het opzetten van een eigen integratie. Een 200-respons bewijst dat de sleutel + het netwerk werken.

Calls

Lees-endpoints voor gesprekken. Vereisen de scope read.calls.

GET/api/v1/calls

Geef de gesprekken van de organisatie weer. Paginering (page/limit≤100), filters: direction, status, datumbereik (dateFrom/dateTo). Geeft has_more terug.

Queryparameters

ParameterTypeWaarden
pageintvanaf 1 (standaard 1)
limitint1–100 (standaard 20)
directionenuminbound | outbound
statusenumnew | to_call | contacted | qualified
dateFrom / dateTostringdatum YYYY-MM-DD of ISO 8601, bijv. 2026-06-03T12:34:56Z

Request

curl "https://www.heilo.io/api/v1/calls?limit=20&direction=inbound" \
  -H "Authorization: Bearer hk_live_AbC1MnPq..."

Response

{
  "success": true,
  "data": {
    "items": [
      {
        "call_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "direction": "inbound",
        "caller_phone": "+48600100200",
        "customer_phone_e164": "+48600100200",
        "caller_name": "Jan Kowalski",
        "duration": 87,
        "crm_status": "new",
        "review_status": null,
        "outbound_lifecycle": null,
        "transcript_processed": { "caller_name": "Jan Kowalski", "summary": "...", "service_needed": "..." },
        "created_at": "2026-06-03T12:34:56Z"
      }
    ],
    "has_more": false,
    "page": 1,
    "limit": 20
  },
  "meta": { "timestamp": "2026-06-03T12:34:56Z" }
}
GET/api/v1/calls/:id

Haal één gesprek op via id. 404 als het niet bij de organisatie van de sleutel hoort of is verwijderd.

Request

curl https://www.heilo.io/api/v1/calls/<id> \
  -H "Authorization: Bearer hk_live_AbC1MnPq..."

Opnamebestanden worden NIET via de API beschikbaar gesteld — ze worden gewist conform de wettelijke bewaartermijn (AVG). De API geeft gespreksmetadata en transcripttekst terug.

Rate limits

Uurlimieten per sleutel en per gebruiker (som van alle sleutels). Reset op het hele UTC-uur. Elk verzoek telt mee, ongeacht de responsstatus.

Per sleutel

1000 req/h

Per account (som van sleutels)

5000 req/h

Bij overschrijding geven we 429 terug met een Retry-After-header (seconden tot reset):

HTTP/1.1 429 Too Many Requests
Retry-After: 1842
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 2026-06-03T13:00:00Z

Fouten

Alle fouten geven een uniforme JSON-vorm terug met error.code (stabiel) en error.message (leesbaar, kan wijzigen). Log de code, niet het bericht.

{
  "success": false,
  "error": { "code": "RATE_LIMITED", "message": "Per-key rate limit 1000/h exceeded" },
  "meta": { "timestamp": "2026-06-03T12:34:56Z" }
}
HTTPcodeBetekenis
400BAD_REQUESTOnjuist gevormde query- of body-parameters (algemene validatie)
401UNAUTHORIZEDOntbrekend / ongeldig Bearer-token
402SUBSCRIPTION_INACTIVEAbonnement inactief — verleng de betaling om de sleutel weer in te schakelen
403FORBIDDENSleutel heeft niet de vereiste scope
404NOT_FOUNDResource niet gevonden (of behoort aan een andere gebruiker)
422VALIDATION_ERROREen bedrijfsregel heeft het verzoek geweigerd (bijv. ongeldig telefoonnummer, quota)
429RATE_LIMITEDUurlimiet overschreden (controleer Retry-After)
500DATABASE_ERRORServer-/databasefout — veilig om opnieuw te proberen met backoff
503MAINTENANCEPublieke API tijdelijk uitgeschakeld (kill switch)

De code SUBSCRIPTION_INACTIVE komt in twee situaties voor: HTTP 402 — het Heilo-abonnement is verlopen (betaling), en HTTP 409 — het webhook-abonnement is gepauzeerd (bijv. bij de actie Test); klik in dat geval eerst op "Opnieuw verifiëren".

Uitgaande Webhooks

Heilo doet na elk event een POST met JSON naar uw endpoint. Abonnementen worden aangemaakt via de kaart "Webhook-abonnementen" — vereist een handshake bij activering. Elk verzoek bevat een HMAC-handtekening die u moet verifiëren:

POST <your URL>
content-type: application/json
heilo-signature: t=1717423396,v1=4f3a...
heilo-event-id: 1bf3a5e2-...
heilo-event-type: call.completed

{
  "api_version": "2026-06-15",
  "event_id": "1bf3a5e2-...",
  "event_type": "call.completed",
  "resource_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "created_at": "2026-06-03T12:34:56Z",
  "data": { /* see the setup guide for the full schema */ }
}

Beleid voor opnieuw proberen en pauzeren:

  • Tijdelijke fouten (HTTP 408/429/5xx, netwerk) worden opnieuw geprobeerd met exponential backoff (2min, 5min, 30min, 2u) — daarna dead-letter na 5 pogingen.
  • Permanente fouten (HTTP 401/403/422) pauzeren het abonnement onmiddellijk — geen nieuwe pogingen.
  • 50 opeenvolgende tijdelijke fouten, of 2 opeenvolgende HTTP 410 Gone (bijv. een verwijderd Make-scenario), pauzeren het abonnement eveneens.
  • Hervat een gepauzeerd abonnement met "Opnieuw verifiëren" — een nieuwe handshake reactiveert de wachtrij.

Wordt een abonnement automatisch gepauzeerd, dan sturen we een e-mail naar het adres van de accounteigenaar. Dead-letter-events kunt u opnieuw versturen met de knop "Opnieuw versturen" in het Afleverlog — nadat het abonnement opnieuw is geverifieerd.

Verificatiemodi

Heilo ondersteunt twee activeringsmodellen voor webhook-abonnementen. De standaard (permissief) past bij Zapier / Make / typische CRM-endpoints. Strict komt overeen met het model van de Slack Events API — handig voor eigen servers die de challenge synchroon kunnen terugsturen.

Modus permissive (standaard)

Heilo doet een POST van webhook.subscription.verify naar uw URL. Elke 2xx-respons activeert het abonnement. De response body wordt genegeerd. Dit komt overeen met het model van Stripe / GitHub / Twilio.

Modus strict (opt-in)

Heilo doet een POST van webhook.subscription.verify met een challenge-veld. Uw endpoint MOET antwoorden met 2xx en een JSON-body:

{"challenge":"<echo of the challenge field from Heilo's POST>"}

U kiest de modus bij het aanmaken van het abonnement (verification_mode in POST /api/v1/webhook-subscriptions, standaard permissive). Het wijzigen van de modus na aanmaak vereist verwijderen + opnieuw aanmaken — bewust, omdat het de contractsemantiek wijzigt.

Limieten: max. 20 actieve abonnementen per account (te overschrijven via env). Een abonnement wordt automatisch gepauzeerd na 50 opeenvolgende tijdelijke fouten of 2 opeenvolgende HTTP 410, en onmiddellijk bij HTTP 401/403/422.

HMAC-verificatie (signing_secret)

Stripe-compatibel formaat. signed_string = "<unix_ts>.<raw_body>" (gescheiden door een punt). Verifieer altijd de RAW request body (vóór het parsen van JSON) — elke normalisatie wijzigt de handtekening.

signed_string = "<unix_timestamp>.<raw_request_body>"
signature     = HMAC-SHA256(signing_secret, signed_string).hex()
header        = "t=<unix_timestamp>,v1=<signature>"
import { createHmac, timingSafeEqual } from 'crypto';

// rawBody MUST be the exact received bytes — do NOT re-serialize the JSON.
function verifyHeiloSignature(rawBody, header, signingSecret, toleranceSec = 300) {
  if (!header) return false;
  const parts = Object.fromEntries(
    header.split(',').map((p) => p.split('=').map((s) => s.trim()))
  );
  const t = Number(parts.t);
  const sig = parts.v1;
  if (!Number.isFinite(t) || !sig) return false;

  // Asymmetric tolerance: reject old replays; allow only small clock skew ahead.
  const now = Math.floor(Date.now() / 1000);
  if (now - t > toleranceSec || t - now > 60) return false;

  const expected = createHmac('sha256', signingSecret)
    .update(`${t}.${rawBody}`)
    .digest('hex');
  const a = Buffer.from(expected, 'utf8');
  const b = Buffer.from(sig, 'utf8');
  // timingSafeEqual THROWS on length mismatch — length-check first.
  return a.length === b.length && timingSafeEqual(a, b);
}

Standaardtolerantie van 300s (5 min) voorkomt replay-aanvallen. Serverklokken moeten via NTP gesynchroniseerd zijn.

Het ondertekeningsgeheim tonen we maar één keer — bij het aanmaken van het abonnement. Bent u het kwijt of vermoedt u een lek: verwijder het abonnement en maak het opnieuw aan met dezelfde URL (het adres in Zapier/Make verandert niet). Rotatie van het geheim zonder verwijderen is gepland.

Eventtypes

Kies event_types bij het aanmaken van een abonnement. Elk event heeft een uniek event_id (UUID v5) en wordt per abonnement ontdubbeld.

De eerste gebeurtenis die u ontvangt is webhook.test — een testbericht met data._test = true. Gebruik het om uw velden te mappen of filter het eruit.

event_typeOmschrijving
call.completedGesprek afgerond, transcript gereed
call.outbound.attemptedUitgaande belpoging gedaan (vóór verbinding)
call.recording.readyOpnamebestand beschikbaar om te downloaden
call.transcribedTranscript gereed (los van call.completed)
call.failedGesprek mislukt (in gesprek/niet beantwoord/fout)
call.outbound.lifecycle_repairedCorrectie van uitgaande levenscyclus — gespreksstatus hersteld
call.deletion_scheduledGesprek ingepland voor verwijdering (AVG art. 17, bewaartermijn)
call.recording.deletedOpname verwijderd (AVG)
contact.createdNieuw contact aangemaakt
contact.updatedContact bijgewerkt

Hieronder het data-object van elk event. Veldnamen, types en enum-waarden maken deel uit van het API-contract en veranderen binnen v1 niet van betekenis; er kunnen in de loop van de tijd nieuwe, optionele velden bijkomen.

call.completed

Verstuurd nadat de opname en het transcript van een afgerond gesprek zijn verwerkt. De primaire gegevensbron voor een CRM — volledige payload (inclusief recording_url en het verwerkte transcript).

{
  "api_version": "2026-06-15",
  "event_id": "1bf3a5e2-...",        // same value as heilo-event-id header
  "event_type": "call.completed",
  "resource_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "created_at": "2026-06-03T12:34:56Z",
  "data": {
    "call_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "direction": "inbound",
    "caller_phone": "+48600100200",
    "customer_phone_e164": "+48600100200",
    "duration": 87,
    "recording_url": "https://www.heilo.io/api/v1/calls/.../recording.mp3?token=...&exp=...",
    "transcript_processed": { "caller_name": "Jan Kowalski", "summary": "...", "service_needed": "..." },
    "transcript_original": "..."
  }
}
VeldTypeOmschrijving
call_idstring (uuid)Gespreks-ID in Heilo — dezelfde waarde als resource_id; koppelt alle events van één gesprek.
direction'inbound' | 'outbound'Gespreksrichting.
caller_phonestringTelefoonnummer van de gesprekspartner, zoals opgeslagen bij het gesprek.
customer_phone_e164stringHetzelfde nummer nogmaals — een alias voor eenvoudiger veldmapping.
durationnumberLengte van de opname in seconden.
recording_urlstring | nullStabiele link naar de opname; null wanneer de opname op het moment van verwerking nog niet was opgeslagen.
transcript_processedobjectVerwerkte gespreksanalyse — zie het transcript_processed-veldoverzicht in deze sectie.
transcript_originalstring | nullRuw, letterlijk transcript; null wanneer niet beschikbaar.

Aflevering is at-least-once en niet gegarandeerd in volgorde — sla idempotent op. Dedup-sleutel: event_id. data.call_id koppelt events van hetzelfde gesprek (bijv. call.completed na call.recording.ready).

transcript_processed — veldoverzicht

De stabiele subset waarop u kunt vertrouwen bij het mappen naar een CRM. Elk veld is optioneel — het is null wanneer het gesprek die informatie niet bevatte.

VeldTypeOmschrijving
caller_namestring | nullNaam van de beller, indien opgegeven.
summarystring | nullKorte samenvatting van het gesprek.
subjectstring | nullTitel van één regel voor het gesprek (max. 80 tekens).
service_neededstring | nullWaar de beller om vroeg.
services_matchboolean | nullOf het verzoek past bij de diensten die u aanbiedt.
lead_scorenumber | null (1–10)Inschatting van de leadkwaliteit van 1 tot 10.
preferred_datestring | nullDoor de beller genoemde datum of tijd, indien genoemd.
client_citystring | nullStad, indien genoemd.
client_addressstring | nullAdres, indien genoemd.
additional_detailsstring | nullExtra context uit het gesprek.

Velden die kunnen voorkomen

VeldTypeOmschrijving
caller_locationstring | nullIn het gesprek gedetecteerde geografische verwijzing.
client_countrystring | nullLand, indien genoemd.
counterparty_namestring | nullNaam van de andere partij — alleen uitgaande gesprekken en gespreksmodus.
detected_languagestringTaalcode van het gesprek (bijv. pl); de sleutel kan volledig ontbreken.
proposal_itemsobject[] | nullVoorgestelde vervolgacties en beslissingen uit het gesprek.

De analyse kan extra velden bevatten — behandel onbekende velden als optioneel en ga er nooit van uit dat ze aanwezig zijn.

call.outbound.attempted

Verstuurd wanneer een uitgaande belpoging een eindstatus bereikt — ook bij mislukkingen. completed betekent dat het gesprek tot stand kwam en normaal eindigde; de opname en het transcript volgen als aparte events.

VeldTypeOmschrijving
call_idstring (uuid)Gespreks-ID in Heilo — dezelfde waarde als resource_id; koppelt alle events van één gesprek.
agent_user_idstring (uuid)ID van de Heilo-gebruiker die het gesprek startte.
customer_phonestringHet gebelde klantnummer.
customer_phone_e164stringHetzelfde nummer nogmaals — een alias voor eenvoudiger veldmapping.
outbound_lifecycle'completed' | 'agent_no_answer' | 'customer_no_answer' | 'failed_to_initiate'Eindstatus die het event veroorzaakte; completed betekent dat het gesprek tot stand kwam en normaal eindigde.
durationnumber | nullGespreksduur in seconden; null wanneer het gesprek bij het opzetten mislukte of de duur nog niet bekend is.
attempted_atstring (ISO 8601)Moment waarop het event is verstuurd (ISO 8601).
has_recordingbooleantrue alleen wanneer outbound_lifecycle completed is — de opname volgt dan als call.recording.ready.

call.recording.ready

Verstuurd zodra het opnamebestand beschikbaar is. Gebruik het om de audio op te halen of te archiveren.

VeldTypeOmschrijving
call_idstring (uuid)Gespreks-ID in Heilo — dezelfde waarde als resource_id; koppelt alle events van één gesprek.
recording_urlstring | nullStabiele link naar de opname; in zeldzame gevallen null wanneer de link niet kon worden gegenereerd.
durationnumber | nullDuur in seconden; null wanneer nog niet bekend.

call.transcribed

Verstuurd in dezelfde verwerkingsronde als call.completed — bevat alleen het transcript, zonder gespreksgegevens of opnamelink.

VeldTypeOmschrijving
call_idstring (uuid)Gespreks-ID in Heilo — dezelfde waarde als resource_id; koppelt alle events van één gesprek.
transcript_originalstring | nullRuw, letterlijk transcript; null wanneer niet beschikbaar.
transcript_processedobjectVerwerkte gespreksanalyse — zie het transcript_processed-veldoverzicht in deze sectie.

call.failed

Verstuurd wanneer een uitgaand gesprek niet tot stand kwam (geen antwoord, bezet, fout bij opzetten). Geldt alleen voor uitgaande gesprekken. Meestal is een nieuwe lead niet nodig — leg een contactpoging vast.

VeldTypeOmschrijving
call_idstring (uuid)Gespreks-ID in Heilo — dezelfde waarde als resource_id; koppelt alle events van één gesprek.
outbound_lifecycle'agent_no_answer' | 'customer_no_answer' | 'failed_to_initiate'Welke fase van het uitgaande gesprek mislukte.
failure_reasonstring | nullMachineleesbare foutcode (bijv. customer_busy, agent_no_confirmation); kan null zijn.

call.outbound.lifecycle_repaired

Verstuurd wanneer Heilo de status van een uitgaand gesprek achteraf corrigeert (een late bevestiging van de provider toonde aan dat het gesprek toch tot stand kwam). Werk de gespreksstatus aan uw kant bij.

VeldTypeOmschrijving
call_idstring (uuid)Gespreks-ID in Heilo — dezelfde waarde als resource_id; koppelt alle events van één gesprek.
previous_lifecycle'agent_only'Status vóór de correctie; momenteel altijd agent_only.
new_lifecycle'completed'Status na de correctie; momenteel altijd completed.
repaired_atstring (ISO 8601)Moment van de correctie (ISO 8601).

call.deletion_scheduled

AVG art. 17: het gesprek is ingepland voor verwijdering. Uw CRM moet stoppen met het gebruik van de opname en zich voorbereiden op het verwijderen van de gegevens.

VeldTypeOmschrijving
call_idstring (uuid)Gespreks-ID in Heilo — dezelfde waarde als resource_id; koppelt alle events van één gesprek.
pending_deletion_atstring (ISO 8601)Wanneer de gegevens definitief worden verwijderd (ISO 8601).
reason'consent_not_asked' | 'consent_withdrawn' | 'retention_expired' | 'user_erasure'Reden voor de geplande verwijdering.

call.recording.deleted

AVG: de opname is verwijderd — recording_url geeft 410 terug. Verwijder of deactiveer de opnamelink aan uw kant.

VeldTypeOmschrijving
call_idstring (uuid)Gespreks-ID in Heilo — dezelfde waarde als resource_id; koppelt alle events van één gesprek.
reasonstring | nullReden vastgelegd bij het inplannen van de verwijdering; kan null zijn.
recording_sidstring | nullTwilio-opname-ID; null wanneer deze niet kon worden bepaald.
deletion_kind'hard_deleted' | 'twilio_404'hard_deleted = verwijderd door Heilo; twilio_404 = het bestand was aan de kant van Twilio al verdwenen.
deleted_atstring (ISO 8601)Moment van verwijdering van de opname (ISO 8601).

contact.created

Verstuurd wanneer in Heilo een nieuw contact wordt aangemaakt. data.contact is een volledige momentopname van het nieuwe contact; notities en tags zitten er niet in.

VeldTypeOmschrijving
contactobjectVolledige momentopname van het nieuwe contact (velden hieronder).
contact.idstring (uuid)Contact-ID in Heilo.
contact.phonestringTelefoonnummer van het contact.
contact.first_namestring | nullnull wanneer niet opgegeven.
contact.last_namestring | nullnull wanneer niet opgegeven.
contact.emailstring | nullnull wanneer niet opgegeven.
contact.companystring | nullnull wanneer niet opgegeven.

contact.updated

Verstuurd wanneer een contact wordt bewerkt. Anders dan bij contact.created is dit geen momentopname: data.diff bevat alleen de gewijzigde velden.

VeldTypeOmschrijving
contact_idstring (uuid)ID van het bijgewerkte contact.
diffobject (partial)Alleen de gewijzigde velden — sleutels die in diff ontbreken, zijn niet gewijzigd.

Mogelijke sleutels in diff: first_name, last_name, email, phone, company, notes, tags

webhook.test

Het eerste bericht na het aanmaken van een abonnement en bij elke handmatige test. resource_id is het abonnements-ID (geen gespreks-ID); de overige data-velden spiegelen het call.completed-voorbeeld met voorbeeldwaarden.

VeldTypeOmschrijving
_testtrueAltijd true — onderscheidt het testbericht van echte events.
_messagestringLeesbare melding dat dit een test is.
_sent_atstring (ISO 8601)Moment waarop de test is verstuurd (ISO 8601).
Versiebeheer & roadmap

Versiebeheer

De Heilo API gebruikt een datumgestempelde versie. Alleen breaking changes verhogen de hoofdversie (v1 → v2). Velden of endpoints toevoegen is niet-brekend.

Huidige versie

v1 · 2026-06-15

De datum is de versie-identificatie van de API (datumgestempeld), niet de datum van vandaag.

Status

Beta

Achterwaarts compatibel: nieuwe responsvelden, nieuwe event_types, nieuwe endpoints. Breaking change = nieuwe hoofdversie (v2). Oude versie minimaal 12 maanden ondersteund na aankondiging van v2.

Roadmap (v1.1+)

Endpoints gepland voor komende v1.X-releases. Geen harde toezegging — de richting hangt af van feedback.

  • GET /contactscontacten opvragen
  • POST /contactscontact aanmaken (synchroniseren vanuit CRM naar Heilo)

Heeft u een endpoint nodig? Mail support@heilo.io met uw use-case — we prioriteren de roadmap op basis van werkelijke vraag.

Beheer sleutels en webhooks in het paneel

Na het inloggen genereert u API-sleutels, voegt u webhook-abonnementen toe en bekijkt u het verzendlogboek.