Jak połączyć CRM z Heilo przez API
Prosta ścieżka integracji: Heilo wysyła dane rozmów do Twojego CRM-a, a niżej znajdziesz szczegóły dla programisty.
Szybki start: połącz CRM z Heilo
Najprostsza integracja polega na tym, że Heilo samo wysyła dane po każdej rozmowie do Twojego CRM-a.
Najważniejsze zdarzenie to call.completed. Oznacza: rozmowa jest gotowa, a CRM może zapisać kontakt, lead lub notatkę. Adresy REST /calls traktuj jako dodatek do sprawdzania lub odczytu danych.
- Przygotuj adres URL w CRM-ie, Zapierze, Make albo własnym systemie, na który Heilo ma wysyłać dane.
- W Heilo dodaj subskrypcję na zdarzenie call.completed. Opcjonalnie dodaj też call.outbound.attempted, jeśli chcesz śledzić próby połączeń wychodzących.
- Odbieraj call.completed i sprawdzaj podpis Heilo-Signature, żeby upewnić się, że wiadomość przyszła z Heilo.
- Nie twórz duplikatów: zapisuj event_id z nagłówka heilo-event-id. data.call_id oznacza konkretną rozmowę.
- W CRM-ie znajdź albo utwórz kontakt po numerze telefonu, potem dodaj lead, deal, aktywność albo notatkę z podsumowaniem i linkiem do nagrania.
Nie kodujesz? Przewodnik połączenia bez kodu (Zapier/Make) prowadzi krok po kroku.
Dostęp przez klucz API
Do publicznego API używasz klucza API. Wygeneruj go w karcie „Klucze API”, a programista wklei go w nagłówek Authorization:
Authorization: Bearer hk_live_AbC1MnPq...
W Heilo są trzy sposoby potwierdzania dostępu:
- Klucz API, np. hk_live_… — używany przez CRM, Zapier, Make albo własny skrypt.
- Sesja użytkownika w przeglądarce — używana tylko w panelu Heilo, nie w integracji API.
- Podpis HMAC — dodatkowe zabezpieczenie webhooków, czyli wiadomości wysyłanych z Heilo do Twojego adresu URL.
| Uprawnienie (scope) | Znaczenie |
|---|---|
| read.calls | Odczyt rozmów: GET /api/v1/calls, GET /api/v1/calls/:id |
| write.calls, read.contacts, write.contacts, manage.webhooks, manage.api_keys | Zarezerwowane dla planowanych adresów API — nie zaznaczaj na zapas. |
Pole environment w odpowiedzi /me ma dziś zawsze wartość live. Klucze testowe są w planach.
Adres API
Wszystkie publiczne adresy API zaczynają się od:
https://www.heilo.io/api/v1
Adresy API
Te adresy służą głównie do sprawdzenia klucza i odczytu wybranych danych rozmów. Główna integracja CRM powinna opierać się na webhookach, czyli automatycznych powiadomieniach wysyłanych przez Heilo po rozmowie.
/api/v1/meSprawdza, czy klucz API działa. Zwraca identyfikator klucza, użytkownika, uprawnienia i limit zapytań.
Przykładowe zapytanie
curl https://www.heilo.io/api/v1/me \ -H "Authorization: Bearer hk_live_AbC1MnPq..."
Przykładowa odpowiedź
{
"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" }
}Przydatne jako test połączenia: jeśli dostajesz odpowiedź 200, klucz i sieć działają.
Rozmowy
Te adresy pozwalają odczytać rozmowy. Klucz API musi mieć uprawnienie read.calls.
/api/v1/callsLista rozmów organizacji. Stronicowanie (page/limit≤100), filtry: direction, status, zakres dat (dateFrom/dateTo). Zwraca has_more.
Parametry zapytania
| Parametr | Typ | Wartości |
|---|---|---|
| page | int | od 1 (domyślnie 1) |
| limit | int | 1–100 (domyślnie 20) |
| direction | enum | inbound | outbound |
| status | enum | new | to_call | contacted | qualified |
| dateFrom / dateTo | string | data YYYY-MM-DD lub ISO 8601, np. 2026-06-03T12:34:56Z |
Przykładowe zapytanie
curl "https://www.heilo.io/api/v1/calls?limit=20&direction=inbound" \ -H "Authorization: Bearer hk_live_AbC1MnPq..."
Przykładowa odpowiedź
{
"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" }
}/api/v1/calls/:idJedna rozmowa po identyfikatorze. API zwróci 404, jeśli rozmowa nie należy do organizacji albo została usunięta.
Przykładowe zapytanie
curl https://www.heilo.io/api/v1/calls/<id> \ -H "Authorization: Bearer hk_live_AbC1MnPq..."
Lista rozmów nie zwraca plików nagrań. Link do nagrania dostajesz w webhooku, a nagrania mogą zostać usunięte zgodnie z retencją i RODO.
Limity zapytań
Heilo ogranicza liczbę zapytań w ciągu godziny, osobno dla jednego klucza i całego konta. Limit resetuje się o pełnej godzinie UTC.
Na jeden klucz
1000 req/h
Na całe konto
5000 req/h
Po przekroczeniu limitu API zwraca 429 i informację, kiedy spróbować ponownie:
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
Błędy
Błędy mają stały format JSON. W automatyzacji zapisuj error.code, bo error.message jest opisem dla człowieka i może się zmienić.
{
"success": false,
"error": { "code": "RATE_LIMITED", "message": "Per-key rate limit 1000/h exceeded" },
"meta": { "timestamp": "2026-06-03T12:34:56Z" }
}| HTTP | code | Znaczenie |
|---|---|---|
| 400 | BAD_REQUEST | Niepoprawne parametry zapytania lub treści (ogólna walidacja) |
| 401 | UNAUTHORIZED | Brak lub niepoprawny klucz API |
| 402 | SUBSCRIPTION_INACTIVE | Subskrypcja nieaktywna — odnów płatność, aby znów włączyć klucz |
| 403 | FORBIDDEN | Klucz API nie ma potrzebnego uprawnienia |
| 404 | NOT_FOUND | Zasób nie istnieje albo należy do innego użytkownika |
| 422 | VALIDATION_ERROR | Reguła biznesowa odrzuciła żądanie (np. niepoprawny numer, limit) |
| 429 | RATE_LIMITED | Przekroczono limit zapytań |
| 500 | DATABASE_ERROR | Błąd serwera lub bazy — można spróbować ponownie później |
| 503 | MAINTENANCE | Publiczne API jest tymczasowo wyłączone |
Kod SUBSCRIPTION_INACTIVE występuje w dwóch sytuacjach: HTTP 402 — subskrypcja Heilo wygasła (płatność), oraz HTTP 409 — subskrypcja webhooka jest wstrzymana (np. przy akcji Test); wtedy najpierw kliknij „Ponów weryfikację”.
Webhooki: dane wysyłane do CRM-a
Webhook to adres URL w Twoim CRM-ie, Zapierze, Make albo własnym systemie. Po rozmowie Heilo wyśle tam JSON z danymi. Przy aktywacji sprawdzamy, czy adres odpowiada. Każda wiadomość ma podpis HMAC, żeby odbiorca mógł sprawdzić, że pochodzi z Heilo:
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 */ }
}Co się stanie, jeśli Twój adres nie odpowie:
- Błędy przejściowe (HTTP 408/429/5xx, sieć) ponawiamy z rosnącą przerwą (2 min, 5 min, 30 min, 2 h) — po 5 próbach wiadomość trafia do martwej kolejki.
- Błędy trwałe (HTTP 401/403/422) od razu wstrzymują subskrypcję — bez ponawiania.
- 50 błędów przejściowych z rzędu albo 2 razy z rzędu HTTP 410 Gone (np. usunięty scenariusz w Make) także wstrzymują subskrypcję.
- Po poprawieniu adresu kliknij „Ponów weryfikację”, aby wznowić wysyłkę.
Gdy subskrypcja zostanie automatycznie wstrzymana, wysyłamy e-mail na adres właściciela konta. Zdarzenia z martwej kolejki możesz wysłać ponownie przyciskiem „Wyślij ponownie” w Historii wysyłek — po ponownej weryfikacji subskrypcji.
Weryfikacja adresu webhooka
Gdy dodajesz adres webhooka, Heilo sprawdza, czy da się na niego wysłać wiadomość. Dla Zapier i Make zostaw tryb domyślny. Tryb zaawansowany jest tylko dla własnych serwerów.
Tryb prosty permissive (domyślnie)
Heilo wysyła wiadomość testową. Każda odpowiedź 2xx oznacza, że adres działa.
Tryb zaawansowany strict (opcjonalnie)
Heilo wysyła wiadomość testową z polem challenge. Twój serwer musi odesłać odpowiedź 2xx z takim JSON-em:
{"challenge":"<echo of the challenge field from Heilo's POST>"}Tryb wybierasz przy tworzeniu subskrypcji. Po utworzeniu nie zmienisz go w miejscu — usuń subskrypcję i dodaj ją ponownie.
Możesz mieć maksymalnie 20 aktywnych subskrypcji na konto. Subskrypcję wstrzymujemy automatycznie po 50 błędach przejściowych z rzędu lub 2 razy z rzędu HTTP 410, a od razu przy HTTP 401/403/422.
Podpis bezpieczeństwa HMAC
Heilo podpisuje każdą wiadomość webhooka. Programista powinien sprawdzić podpis na niezmienionej treści żądania, zanim zapisze dane w CRM-ie.
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);
}Domyślnie akceptuj wiadomości wysłane maksymalnie 5 minut temu. Dzięki temu stary, przechwycony request nie powinien zostać użyty ponownie.
Sekret podpisu pokazujemy tylko raz — przy utworzeniu subskrypcji. Jeśli go zgubisz albo podejrzewasz wyciek: usuń subskrypcję i utwórz ją ponownie z tym samym adresem URL (adres w Zapier/Make się nie zmienia). Rotacja sekretu bez usuwania jest w planach.
Zdarzenia, które może wysłać Heilo
Przy tworzeniu subskrypcji wybierasz, które zdarzenia chcesz odbierać. Każde zdarzenie ma unikalny identyfikator, dzięki czemu CRM może uniknąć duplikatów.
Pierwsze zdarzenie, które dostaniesz, to webhook.test — wiadomość testowa z data._test = true. Użyj jej do zmapowania pól albo odfiltruj.
| nazwa techniczna | Opis |
|---|---|
| call.completed | Zakończona rozmowa, transkrypcja gotowa |
| call.outbound.attempted | Próba wybrania numeru wychodzącego (przed nawiązaniem) |
| call.recording.ready | Nagranie gotowe do pobrania |
| call.transcribed | Transkrypcja gotowa |
| call.failed | Rozmowa nieudana (zajęte / brak odpowiedzi / błąd) |
| call.outbound.lifecycle_repaired | Korekta statusu rozmowy wychodzącej |
| call.deletion_scheduled | Rozmowa zaplanowana do usunięcia (RODO) |
| call.recording.deleted | Nagranie usunięte (RODO) |
| contact.created | Nowy kontakt utworzony |
| contact.updated | Kontakt zaktualizowany |
Poniżej obiekt data każdego zdarzenia. Nazwy pól, typy i wartości słownikowe są częścią kontraktu API i nie zmieniają znaczenia w ramach v1; z czasem mogą dochodzić nowe, opcjonalne pola.
call.completed
Wysyłane po zakończeniu przetwarzania rozmowy. To główna wiadomość dla CRM-a: zawiera link do nagrania, podsumowanie i rozpoznane dane rozmówcy.
{
"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": "..."
}
}| Pole | Typ | Opis |
|---|---|---|
| call_id | string (uuid) | Identyfikator rozmowy w Heilo — ta sama wartość co resource_id; łączy wszystkie zdarzenia jednej rozmowy. |
| direction | 'inbound' | 'outbound' | Kierunek rozmowy. |
| caller_phone | string | Numer telefonu rozmówcy, tak jak zapisany przy rozmowie. |
| customer_phone_e164 | string | Ten sam numer jeszcze raz — alias ułatwiający mapowanie pól. |
| duration | number | Długość nagrania w sekundach. |
| recording_url | string | null | Stały link do nagrania; null, gdy nagranie nie było jeszcze zapisane w chwili przetwarzania. |
| transcript_processed | object | Przetworzona analiza rozmowy — patrz spis pól transcript_processed w tej sekcji. |
| transcript_original | string | null | Surowa, dosłowna transkrypcja; null, gdy niedostępna. |
Heilo może wysłać to samo zdarzenie więcej niż raz, dlatego CRM powinien sprawdzać event_id i nie tworzyć duplikatów. data.call_id łączy wszystkie zdarzenia dotyczące tej samej rozmowy.
transcript_processed — spis pól
Stabilny podzbiór pól, na którym możesz polegać przy mapowaniu do CRM-a. Każde pole jest opcjonalne — ma wartość null, gdy rozmowa nie zawierała tej informacji.
| Pole | Typ | Opis |
|---|---|---|
| caller_name | string | null | Imię i nazwisko rozmówcy, jeśli je podał. |
| summary | string | null | Krótkie podsumowanie rozmowy. |
| subject | string | null | Jednolinijkowy tytuł rozmowy (do 80 znaków). |
| service_needed | string | null | Czego dotyczyła prośba rozmówcy. |
| services_match | boolean | null | Czy prośba pasuje do usług, które oferujesz. |
| lead_score | number | null (1–10) | Ocena jakości leada od 1 do 10. |
| preferred_date | string | null | Termin wspomniany przez rozmówcę, jeśli padł. |
| client_city | string | null | Miasto, jeśli padło w rozmowie. |
| client_address | string | null | Adres, jeśli padł w rozmowie. |
| additional_details | string | null | Dodatkowy kontekst z rozmowy. |
Pola, które mogą się pojawić
| Pole | Typ | Opis |
|---|---|---|
| caller_location | string | null | Odniesienie geograficzne wykryte w rozmowie. |
| client_country | string | null | Kraj, jeśli padł w rozmowie. |
| counterparty_name | string | null | Nazwa drugiej strony — tylko rozmowy wychodzące i tryb rozmowy. |
| detected_language | string | Kod języka rozmowy (np. pl); klucz może w ogóle nie wystąpić. |
| proposal_items | object[] | null | Zaproponowane działania i decyzje wyciągnięte z rozmowy. |
Analiza może zawierać dodatkowe pola — traktuj nieznane pola jako opcjonalne i nie zakładaj ich obecności.
call.outbound.attempted
Wysyłane, gdy próba połączenia wychodzącego osiągnie stan końcowy — także nieudany. completed oznacza, że rozmowa się odbyła i zakończyła normalnie; nagranie i transkrypcja przyjdą osobnymi zdarzeniami.
| Pole | Typ | Opis |
|---|---|---|
| call_id | string (uuid) | Identyfikator rozmowy w Heilo — ta sama wartość co resource_id; łączy wszystkie zdarzenia jednej rozmowy. |
| agent_user_id | string (uuid) | Identyfikator użytkownika Heilo, który dzwonił. |
| customer_phone | string | Wybierany numer klienta. |
| customer_phone_e164 | string | Ten sam numer jeszcze raz — alias ułatwiający mapowanie pól. |
| outbound_lifecycle | 'completed' | 'agent_no_answer' | 'customer_no_answer' | 'failed_to_initiate' | Stan końcowy, który wywołał zdarzenie; completed oznacza, że rozmowa się odbyła i zakończyła normalnie. |
| duration | number | null | Czas rozmowy w sekundach; null, gdy połączenie nie doszło do skutku przy nawiązywaniu albo czas nie jest jeszcze znany. |
| attempted_at | string (ISO 8601) | Moment wysłania zdarzenia (ISO 8601). |
| has_recording | boolean | true tylko wtedy, gdy outbound_lifecycle to completed — nagranie przyjdzie wtedy jako call.recording.ready. |
call.recording.ready
Wysyłane, gdy plik nagrania jest gotowy. Użyj, jeśli CRM ma pobierać lub archiwizować audio.
| Pole | Typ | Opis |
|---|---|---|
| call_id | string (uuid) | Identyfikator rozmowy w Heilo — ta sama wartość co resource_id; łączy wszystkie zdarzenia jednej rozmowy. |
| recording_url | string | null | Stały link do nagrania; w rzadkich przypadkach null, gdy nie udało się wygenerować linku. |
| duration | number | null | Czas trwania w sekundach; null, gdy jeszcze nieznany. |
call.transcribed
Wysyłane w tym samym przebiegu co call.completed — zawiera wyłącznie transkrypcję, bez danych rozmowy i linku do nagrania.
| Pole | Typ | Opis |
|---|---|---|
| call_id | string (uuid) | Identyfikator rozmowy w Heilo — ta sama wartość co resource_id; łączy wszystkie zdarzenia jednej rozmowy. |
| transcript_original | string | null | Surowa, dosłowna transkrypcja; null, gdy niedostępna. |
| transcript_processed | object | Przetworzona analiza rozmowy — patrz spis pól transcript_processed w tej sekcji. |
call.failed
Wysyłane, gdy połączenie wychodzące nie doszło do skutku (brak odpowiedzi, zajęte, błąd przy nawiązywaniu). Dotyczy tylko połączeń wychodzących. Zwykle nie warto tworzyć wtedy leada — wystarczy odnotować próbę kontaktu.
| Pole | Typ | Opis |
|---|---|---|
| call_id | string (uuid) | Identyfikator rozmowy w Heilo — ta sama wartość co resource_id; łączy wszystkie zdarzenia jednej rozmowy. |
| outbound_lifecycle | 'agent_no_answer' | 'customer_no_answer' | 'failed_to_initiate' | Który etap połączenia wychodzącego się nie powiódł. |
| failure_reason | string | null | Techniczny kod przyczyny (np. customer_busy, agent_no_confirmation); może być null. |
call.outbound.lifecycle_repaired
Wysyłane, gdy Heilo koryguje wstecznie stan rozmowy wychodzącej (późny sygnał od operatora potwierdził, że rozmowa jednak się odbyła). Zaktualizuj stan rozmowy po swojej stronie.
| Pole | Typ | Opis |
|---|---|---|
| call_id | string (uuid) | Identyfikator rozmowy w Heilo — ta sama wartość co resource_id; łączy wszystkie zdarzenia jednej rozmowy. |
| previous_lifecycle | 'agent_only' | Stan przed korektą; obecnie zawsze agent_only. |
| new_lifecycle | 'completed' | Stan po korekcie; obecnie zawsze completed. |
| repaired_at | string (ISO 8601) | Moment korekty (ISO 8601). |
call.deletion_scheduled
RODO art. 17: rozmowa jest zaplanowana do usunięcia. CRM powinien przestać używać nagrania i przygotować się na usunięcie danych.
| Pole | Typ | Opis |
|---|---|---|
| call_id | string (uuid) | Identyfikator rozmowy w Heilo — ta sama wartość co resource_id; łączy wszystkie zdarzenia jednej rozmowy. |
| pending_deletion_at | string (ISO 8601) | Kiedy dane zostaną trwale usunięte (ISO 8601). |
| reason | 'consent_not_asked' | 'consent_withdrawn' | 'retention_expired' | 'user_erasure' | Powód zaplanowania usunięcia. |
call.recording.deleted
RODO: nagranie zostało usunięte — recording_url zwraca 410. Usuń albo wyłącz link do nagrania po swojej stronie.
| Pole | Typ | Opis |
|---|---|---|
| call_id | string (uuid) | Identyfikator rozmowy w Heilo — ta sama wartość co resource_id; łączy wszystkie zdarzenia jednej rozmowy. |
| reason | string | null | Powód zapisany przy planowaniu usunięcia; może być null. |
| recording_sid | string | null | Identyfikator nagrania w Twilio; null, gdy nie dało się go ustalić. |
| deletion_kind | 'hard_deleted' | 'twilio_404' | hard_deleted = usunięte przez Heilo; twilio_404 = plik już wcześniej zniknął po stronie Twilio. |
| deleted_at | string (ISO 8601) | Moment usunięcia nagrania (ISO 8601). |
contact.created
Wysyłane po utworzeniu nowego kontaktu w Heilo. data.contact to pełny obraz nowego kontaktu; nie zawiera notatek ani tagów.
| Pole | Typ | Opis |
|---|---|---|
| contact | object | Pełny obraz nowego kontaktu (pola poniżej). |
| contact.id | string (uuid) | Identyfikator kontaktu w Heilo. |
| contact.phone | string | Numer telefonu kontaktu. |
| contact.first_name | string | null | null, jeśli nie podano. |
| contact.last_name | string | null | null, jeśli nie podano. |
| contact.email | string | null | null, jeśli nie podano. |
| contact.company | string | null | null, jeśli nie podano. |
contact.updated
Wysyłane po edycji kontaktu. W przeciwieństwie do contact.created to nie jest pełny obraz: data.diff zawiera tylko zmienione pola.
| Pole | Typ | Opis |
|---|---|---|
| contact_id | string (uuid) | Identyfikator zaktualizowanego kontaktu. |
| diff | object (partial) | Tylko zmienione pola — klucze nieobecne w diff nie były modyfikowane. |
Możliwe klucze w diff: first_name, last_name, email, phone, company, notes, tags
webhook.test
Pierwsza wiadomość po utworzeniu subskrypcji i przy każdym ręcznym teście. resource_id to identyfikator subskrypcji (nie rozmowy); pozostałe pola data odzwierciedlają przykład call.completed z przykładowymi wartościami.
| Pole | Typ | Opis |
|---|---|---|
| _test | true | Zawsze true — odróżnia wiadomość testową od prawdziwych zdarzeń. |
| _message | string | Czytelna informacja, że to test. |
| _sent_at | string (ISO 8601) | Moment wysłania testu (ISO 8601). |
Wersjonowanie i roadmap
Wersja API
Wersja API jest oznaczona datą. Drobne zmiany, takie jak nowe pola w odpowiedzi, nie powinny psuć istniejącej integracji.
Aktualna wersja
v1 · 2026-06-15
To nazwa wersji API, nie informacja o dzisiejszej dacie.
Status
Beta
Jeśli kiedyś zmienimy API w sposób wymagający zmian po Twojej stronie, wydamy nową główną wersję, np. v2, i utrzymamy starą wersję przez co najmniej 12 miesięcy.
Planowane funkcje
Te adresy API planujemy dodać w kolejnych wydaniach. Kolejność zależy od potrzeb klientów.
- GET /contacts — lista kontaktów
- POST /contacts — tworzenie kontaktu (synchronizacja z CRM-a do Heilo)
Brakuje konkretnego adresu API? Napisz na support@heilo.io i opisz, co chcesz zautomatyzować.
Zarządzaj kluczami i webhookami w panelu
Po zalogowaniu wygenerujesz klucze API, dodasz subskrypcje webhooków i sprawdzisz historię wysyłek.