Przejdź do treści

Przewodniki

Własny agent

Chcą Państwo podłączyć do numeru volai własną platformę głosową - ElevenLabs Conversational AI we własnym workspace, Vapi, Retell, a nawet własny IVR na Asterisk/FreeSWITCH - zamiast wbudowanego agenta volai? Ta strona to instrukcja dla obu kierunków: połączeń przychodzących i wychodzących. Przy wychodzących nie płacą Państwo dodatkowo dopłaty za agenta (2.50 CZK/min (~EUR 0.10)) - agenta prowadzą Państwo (i opłacają) sami na własnej platformie.

Krótki przegląd

Połączenia przychodzące ustawia się przez skierowanie numeru na adres SIP Państwa platformy - bez nowej mechaniki. Połączenia wychodzące idą przez krótkotrwałe połączenie relay, ponieważ platforma sama nie potrafi na stałe zarejestrować linii jako klienta SIP.

Potrzebne będą: numer volai, klucz API (vk_...) oraz konto na Państwa platformie (ElevenLabs, Vapi, własna centrala...).

1Kiedy własny agent, a kiedy wbudowany

Obie drogi działają na tym samym numerze i tym samym saldzie - różnią się tylko tym, KTO prowadzi logikę rozmowy i ile to kosztuje dodatkowo:

KryteriumWbudowany agentWłasny agent
Kto prowadzi rozmowęMy - jeden systemPrompt, nasz głos i nasz workspace ElevenLabs.Państwo - dowolna platforma, własny prompt, własny głos, własne narzędzia.
KonfiguracjaJedno wywołanie POST /v1/agents.Dane SIP numeru + konfiguracja Państwa platformy (ta strona).
Cena połączenia0.92 CZK/min (~EUR 0.04) wychodzące, 0.50 CZK/min (~EUR 0.02) przychodzącetak samo - 0.92 CZK/min (~EUR 0.04) wychodzące, 0.50 CZK/min (~EUR 0.02) przychodzące
Dopłata za agenta+ 2.50 CZK/min (~EUR 0.10)brak - płacą Państwo tylko za minuty rozmów
Transkrypcja, podsumowanie, wykrywanie automatycznej sekretarkiTak, automatycznie.Nie - zajmuje się tym (lub nie) Państwa własna platforma.

Nie płacą Państwo dopłaty za agenta, ale też nie płacą nic dodatkowo za nas - własną platformę (ElevenLabs, Vapi...) opłacają Państwo sami według jej cennika. My naliczamy wyłącznie minuty rozmów na linii volai, tak samo jak przy kliencie SIP lub wbudowanym agencie. Stawki podajemy bez VAT, tak jak cały cennik.

2Połączenia przychodzące do własnego agenta

Bez nowej mechaniki - wystarczy istniejące ustawienie routingu mode: "sip" (takie samo jak dla własnego softfona, patrz SIP) z adresem sipUri Państwa platformy. Dla numeru SIP trunk w ElevenLabs zarejestrowanego we WŁASNYM workspace jest to adres z tym samym numerem, jaki ma Państwa linia volai:

bash
curl -X PATCH "https://volai.cz/v1/numbers/+420601234567" \
  -H "Authorization: Bearer vk_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"routing": {"mode": "sip", "sipUri": "sip:+420601234567@sip.rtc.elevenlabs.io"}}'

Na koncie ElevenLabs (Settings → Phone Numbers → Import → SIP trunk) proszę zarejestrować ten numer z konfiguracją inbound_trunk_config:

json
{
  "provider": "sip_trunk",
  "phone_number": "+420601234567",
  "label": "Mój własny agent",
  "inbound_trunk_config": {
    "allowed_addresses": ["81.31.45.0/24"],
    "media_encryption": "allowed"
  }
}

allowed_addresses powyżej to nasz zakres sygnalizacji (81.31.45.0/24) - bezpieczniejszy niż uniwersalny 0.0.0.0/0, który przepuszcza INVITE z dowolnego miejsca. Oba warianty przepuszczą połączenie, ale przy imporcie bez danych logowania allowlista jest JEDYNĄ kontrolą - dlatego proszę podać zakres, a nie 0.0.0.0/0.

Używają Państwo innej platformy niż ElevenLabs? Zasada jest ta sama - proszę sprawdzić u niej adres SIP, na który mają trafiać połączenia dla Państwa numeru, i wpisać go w pole sipUri. W Vapi ten sam zakres trafia do trunku BYO jako gateways.

W Vapi adres routingu ma postać sip:<E164>@<credentialId>.sip.vapi.ai - <credentialId> znajdą Państwo przy swoim trunku BYO SIP w Vapi, a organizacja w regionie UE ma zamiast sip.vapi.ai domenę sip.eu.vapi.ai. Sam sip.vapi.ai należy do natywnych numerów Vapi i dla numeru od nas nie działa. Nazwę użytkownika i hasło proszę zostawić w trunku BYO puste - Vapi rozpoznaje nasze połączenia po adresie IP w gateways.

W gateways proszę podać zakres jako IP 81.31.45.0 oraz maskę (netmask) 24 osobno. Przy domyślnej masce 32 Vapi przepuściłoby tylko jeden adres i odrzucałoby nasze połączenia.

3Połączenia wychodzące z własnego agenta (relay)

To kierunek przeciwny - Państwa platforma sama wykonuje połączenia. Większość platform głosowych AI (w tym ElevenLabs) nie potrafi jednak na stałe zarejestrować linii telefonicznej jako klienta SIP - wysyła jedynie uwierzytelnione połączenie z danymi logowania Państwa linii. Sieć telefoniczna nie przepuści takiego połączenia bezpośrednio na numer docelowy, dlatego prowadzą je Państwo przez krótkotrwałe połączenie relay:

Dlaczego relay, a nie bezpośrednie wybieranie

Bezpośrednie wybranie numeru docelowego przez trunk nie działa żadną z dwóch możliwych dróg: na numer spoza naszej sieci połączenie w ogóle nie powstaje (platforma zgłasza błąd, a po połączeniu nie zostaje żaden ślad), a na inny numer volai w naszej sieci łączy się tylko WEWNĘTRZNIE jako połączenie anonimowe - nigdy faktycznie nie opuszcza naszej sieci, choć wygląda na połączone. Relay to jedyny sposób, by połączenie naprawdę wyszło na zewnątrz.

1. Proszę skonfigurować platformę na swoją linię

Proszę pobrać dane SIP swojej linii:

bash
curl "https://volai.cz/v1/numbers/+420601234567/sip" \
  -H "Authorization: Bearer vk_YOUR_KEY"
json
{
  "server": "sip.volai.cz",
  "username": "123456",
  "password": "a1b2c3d4e5f6",
  "outboundTrunkAddress": "sip.volai.cz",
  "port": 5060,
  "transport": "tcp",
  "inboundSignallingCidrs": ["81.31.45.0/24"]
}

Odpowiedź zwraca server (do REGISTER softfona, patrz SIP) oraz outboundTrunkAddress OSOBNO - nie są wymienne.

Proszę ustawić outboundTrunkAddress - a NIE server - jako wychodzący trunk swojej platformy. W ElevenLabs jest to outbound_trunk_config danego numeru telefonu (Settings → Phone Numbers → Państwa numer → Outbound calling), dokładnie w tej postaci:

json
{
  "outbound_trunk_config": {
    "address": "sip.volai.cz",
    "transport": "tcp",
    "media_encryption": "allowed",
    "credentials": {
      "username": "123456",
      "password": "a1b2c3d4e5f6"
    }
  }
}

Proszę wpisać dokładnie outboundTrunkAddress

Adres wychodzącego trunku musi być dokładnie wartością outboundTrunkAddress z odpowiedzi - niezależnie od tego, czy jest taki sam jak server. Inny adres oznacza, że połączenie nie jest kierowane w sieci, a platforma zgłasza to jako 1011 sip request timed out - w historii połączeń nie zostaje po nim nic.

2. Proszę utworzyć połączenie relay

Tuż przed połączeniem (połączenie ma krótki czas życia, patrz limity poniżej) proszę wywołać:

bash
curl -X POST https://volai.cz/v1/relay \
  -H "Authorization: Bearer vk_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"to": "+420777123456", "from": "+420601234567"}'
json
{
  "id": "rl_4f2a91cd",
  "sipName": "volai_relay_2",
  "sipUri": "sip:volai_relay_2@sip.volai.cz",
  "expiresAt": 1756111760000,
  "callId": "c_9d4e2b7f"
}

Numer docelowy podają Państwo NAM w polu to - platforma nigdy go nie widzi, dostaje tylko samą nazwę sipName z odpowiedzi.

3. Proszę polecić platformie połączenie z sipName

Sama nazwa, a nie pełny URI SIP

ElevenLabs w polu to_number odrzuca pełny URI SIP komunikatem „SipCallTo should be a phone number or SIP user, not a full SIP URI” - dlatego odpowiedź powyżej zwraca osobno sipName (sama nazwa, np. volai_relay_2) oraz sipUri (pełny URI, np. sip:volai_relay_2@sip.volai.cz) OSOBNO. Do pola to_number trafia tylko pierwsza z nich.

W ElevenLabs oznacza to wywołanie /v1/convai/sip-trunk/outbound-call z polem to_number ustawionym bezpośrednio na sipName:

json
{
  "agent_id": "agent_...",
  "agent_phone_number_id": "phnum_...",
  "to_number": "volai_relay_2"
}

agent_id znajdą Państwo przy swoim agencie w ElevenLabs, agent_phone_number_id to phone_number_id zaimportowanego numeru - zwraca go odpowiedź importu albo można go odczytać z listy Phone numbers.

Własny klient SIP lub centrala PBX zamiast ElevenLabs? Proszę wybrać wprost pełny sipUri jak przy zwykłym połączeniu SIP - to ograniczenie dotyczy tylko platform, które chcą samej nazwy z pominięciem prefiksu sip: .

4. Co dzieje się dalej

Sieć telefoniczna przyjmuje połączenie na nazwie volai_relay_2, przekazuje je na Państwa to i ustawia widoczny numer dzwoniącego na Państwa from - osoba wywoływana zobaczy na wyświetlaczu Państwa linię volai, a nie wewnętrzną nazwę slotu relay (jeśli numer ma własne nazwy relay - patrz Rozliczanie poniżej; w przeciwnym razie zobaczy numer demonstracyjny volai). Po zakończeniu rozmowy lease jest zwalniany, a minuty są naliczane tak samo jak przy zwykłym połączeniu wychodzącym - 0.92 CZK/min (~EUR 0.04), bez dopłaty za agenta.

Odpowiedź o wykonaniu połączenia przychodzi dopiero po całym dzwonieniu (nawet kilkadziesiąt sekund) - to nie jest błąd, choć krótki timeout po Państwa stronie wyglądałby w tej chwili jak awaria, mimo że połączenie trwa.

4Rozwiązywanie problemów

Najczęstsze komunikaty przy własnym agencie i co z nimi zrobić:

KomunikatPrzyczynaRozwiązanie
1011 sip request timed outAdres wychodzącego trunku nie jest wartością outboundTrunkAddress.Proszę ustawić w ElevenLabs outbound_trunk_config.address na outboundTrunkAddress z odpowiedzi z danymi SIP, a nie na server.
SipCallTo should be a phone number or SIP user, not a full SIP URIto_number zawiera pełny sipUri zamiast samej nazwy.Do to_number trafia tylko sipName z odpowiedzi POST /v1/relay.
Połączenie z platformy od razu się kończy (w ElevenLabs failed), u nas nicNumer telefonu został wybrany bezpośrednio, a nie przez relay.Proszę utworzyć połączenie relay (POST /v1/relay) i zadzwonić na zwrócone sipName.
max auth retry attempts reached for SIP invitePlatforma nie przeszła uwierzytelniania: albo nie zgadza się nazwa użytkownika lub hasło wychodzącego trunku, albo połączenie dotarło jako numer telefonu zamiast sipName - sieć żąda wtedy kolejnego uwierzytelnienia, którego platforma nie przejdzie.Nazwę użytkownika i hasło proszę przepisać dokładnie z danych SIP numeru (username, password). Do to_number proszę wpisać wyłącznie sipName z POST /v1/relay i uruchomić połączenie przez API (POST /v1/convai/sip-trunk/outbound-call) lub narzędzie MCP ElevenLabs make_outbound_call, a nie przez formularz przyjmujący tylko numer telefonu. Lease czeka na połączenie tylko ttlSecs (domyślnie 120 s).
404 from_number_not_ownedfrom w POST /v1/relay nie jest Państwa numerem volai.Do from proszę wpisać dokładnie ten numer volai, z którego Państwo dzwonią.
400 relay_lease_limitNa tym numerze (1) lub koncie (2) działa już aktywny lease.Proszę poczekać, aż lease zostanie zwolniony, albo anulować nieużywany (DELETE /v1/relay/{id}).
503 capacity_busyWspólna pula slotów relay jest chwilowo pełna.Nic nie jest naliczane - proszę spróbować ponownie za chwilę.
Połączenie przychodzące nie dzwoniNumer nie jest zaimportowany w ElevenLabs, allowed_addresses nie przepuszcza naszego zakresu albo routing w volai nie został zapisany.Proszę sprawdzić wszystkie trzy kroki powyżej; jeśli centrala żąda uwierzytelnienia 401, proszę uzupełnić nazwę użytkownika i hasło w routingu.
Osoba wywoływana widzi numer volai zamiast Państwa numeruNumer nie ma jeszcze własnych nazw relay. Zakłada się je zaraz po zakupie, tym razem się to nie udało.Następne połączenie ponowi założenie samo. Jeśli osoba wywoływana widzi numer volai także po godzinie, proszę napisać do wsparcia.
Powtórzone połączenie kończy się natychmiastowym odrzuceniem (SIP 603)Platforma ponownie wybrała to samo sipName, zwykle po nieodebranym połączeniu. Lease łączy tylko jedno połączenie.Przed każdą próbą, także powtórzeniem po nieodebraniu, proszę utworzyć nowy lease (POST /v1/relay) i wyłączyć automatyczne ponawianie w platformie.

5Rozliczanie

Połączenie wychodzące przez relay jest rozliczane według tej samej stawki co zwykłe połączenie wychodzące - 0.92 CZK/min (~EUR 0.04) - bez jakiejkolwiek dopłaty za agenta. Stawki podajemy bez VAT, tak jak cały cennik.

Liczba równoczesnych połączeń jest ograniczona (patrz limity poniżej): najwyżej 1 aktywne połączenie na jeden Państwa numer i najwyżej 2 na całe konto jednocześnie.

Osoba wywoływana zobaczy Państwa linię volai TYLKO wtedy, gdy numer ma własne nazwy relay (relayNames) - numer dostaje je zaraz po zakupie. Dopóki ich nie ma, lease przechodzi na wspólną pulę, a osoba wywoływana widzi numer demonstracyjny volai. Jeśli trwa to dłużej niż godzinę, proszę napisać do wsparcia.

6Limity, kwoty i zabezpieczenia

Limit aktywnych leasów to najwyżej 1 na numer oraz najwyżej 2 na konto - celowe zabezpieczenie przed zajęciem całej wspólnej puli slotów relay przez jednego klienta:

CoWartość
Lease czeka na pierwsze połączenie (pending)domyślnie 120 s, ttlSecs od 15 do 300 s
Połączenie trwa (active)15 minut
Aktywny lease na jeden Państwa numernajwyżej 1
Aktywne leasy na kontonajwyżej 2
Użycie leasujednorazowe - drugie połączenie na ten sam lease zostanie odrzucone, także ponowienie po nieodebraniu wymaga nowego leasu
  • from musi być Państwa własnym numerem volai - w przeciwnym razie from_number_not_owned. Bez tej kontroli można by podszywać się pod cudzą linię (spoofing identyfikatora dzwoniącego).
  • Te same bramki co przy zwykłym połączeniu - lista numerów, na które nie wolno dzwonić (dotyczy tylko połączeń, nie SMS), automatyczna 30-dniowa blokada po 3 nieudanych próbach na ten sam numer w ciągu 24 godzin, linie o podwyższonej opłacie, ochrona przed pętlą między numerami volai, blokada numeru wywoływanego oraz ogólny limit częstotliwości połączeń. Żadnej z tych kontroli nie da się obejść przez relay.
  • Pełna pula -> 503 capacity_busy - sloty relay to wspólny limit równoczesności CAŁEJ platformy, nie tylko Państwa konta. Przy capacity_busy nic nie jest naliczane, proszę spróbować ponownie za chwilę.
  • Pełną dokumentację REST (kody błędów, GET/DELETE na leasach) znajdą Państwo w dokumentacji REST API.

Każdy błąd API zawiera cause (kto go naprawia) oraz action (co zrobić) - patrz Format błędów w dokumentacji REST API.