---
title: "Użyj własnych numerów (VoIP, API)"
description: "Połącz Twilio, Telnyx, SignalWire, Vonage, Plivo lub dowolny inny trunk SIP przez SIP, zaimportuj numery telefonów, które już posiadasz, i pozwól agentom głosowym ThunderPhone odbierać oraz wykonywać na nich połączenia."
---

Zatwierdzone numery ThunderPhone mogą wykonywać połączenia wychodzące i obsługiwać kampanie. Jeśli wolisz używać własnych numerów za pośrednictwem własnego dostawcy VoIP, ten przewodnik przeprowadzi Cię przez proces połączenia: **przetestuj poświadczenia → utwórz połączenie → zaimportuj numery → zweryfikuj**.

<Note>
  Panel zawiera prowadzoną wersję całego tego procesu w sekcji
  **Połączenia → VoIP** (`/dashboard/voip-connections`): najpierw ścieżkę
  podłączania istniejącego dostawcy (Twilio i Telnyx za pomocą klucza API;
  SignalWire, Vonage, Plivo oraz każdy inny trunk przez ręczny formularz SIP
  z krokami specyficznymi dla dostawcy i generatorem przewodnika konfiguracji AI), a następnie
  prowadzoną konfigurację, która otwiera nowe konto Telnyx.
</Note>

## Obsługiwani dostawcy

| Dostawca | Identyfikator `provider` | Uwagi |
|----------|---------------|-------|
| Twilio | `twilio` | SID konta + token uwierzytelniający; jedno połączenie na konto lub subkonto Twilio (zobacz [subkonta Twilio](#twilio-subaccounts)) |
| Telnyx | `telnyx` | Klucz API; dostępne prowadzone wdrożenie (`setup_method: guided_telnyx`) |
| SignalWire | `signalwire` | Brak natywnego połączenia z dostawcą; połącz jako `manual` z predefiniowaną konfiguracją SIP SignalWire |
| Vonage | `vonage` | Brak natywnego połączenia z dostawcą; połącz jako `manual` z predefiniowaną konfiguracją SIP Vonage |
| Ręczny SIP | `manual` | Dowolny trunk SIP, w tym SignalWire, Vonage i Plivo. Jeśli zaczniesz od jednego z kafelków tych dostawców w panelu, połączenie nadal będzie miało wartość `manual` i zapisze wybór w `sip_config.preset` (`signalwire`, `vonage` lub `plivo`) |

## 1. Przetestuj poświadczenia

Zanim utworzysz trwałe połączenie VoIP, sprawdź poświadczenia dostawcy,
aby potwierdzić, że działają. Zwracany jest identyfikator
`verification_evidence_id`, który przekazujesz do kroku tworzenia, aby
za testowanie poświadczeń nie naliczono opłaty dwukrotnie.

```bash
curl -X POST https://api.thunderphone.com/v1/voip-connections/test \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "provider":    "telnyx",
    "credentials": { "apiKey": "KEY...", "connectionId": "123456" },
    "sip_config":  { "domain": "acme.sip.telnyx.com" }
  }'
```

```json Response
{
  "status": "pass",
  "verification_evidence_id": "b9a2...",
  "suggested_connection_name": "Telnyx: Acme Main (+15550001234)",
  "checks": {
    "credentials_valid": true,
    "inbound_reachable": true,
    "outbound_authorized": true
  }
}
```

Jeśli któraś kontrola się nie powiedzie, `status` odpowiedzi będzie mieć wartość `fail`, a `checks`
wskaże, który etap zakończył się błędem. Popraw konfigurację po stronie dostawcy
(przypisanie trunku, lista dozwolonych adresów IP, autoryzacja połączeń wychodzących) i spróbuj ponownie.

## 2. Utwórz połączenie

Przekaż właśnie otrzymany `verification_evidence_id`:

```bash
curl -X POST https://api.thunderphone.com/v1/voip-connections \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name":         "Acme Telnyx Main",
    "provider":     "telnyx",
    "setup_method": "api_key",
    "credentials":  { "apiKey": "KEY...", "connectionId": "123456" },
    "sip_config":   { "domain": "acme.sip.telnyx.com" },
    "verification_evidence_id": "b9a2..."
  }'
```

Odpowiedź to [obiekt VoipConnection](/api-reference/voip-connections#connection-object)
ze stanem `status="connected"`. Poświadczenia i inne tajne wartości połączenia są przechowywane po stronie serwera i nigdy
nie są zwracane w postaci zwykłego tekstu przez kolejne żądania GET — aby je zmienić, uruchom ponownie
`test` i wykonaj PATCH z nowym potwierdzeniem.

### Subkonta Twilio

Połączenie Twilio jest powiązane z jednym kontem Twilio, którego
Account SID i Auth Token zawiera. Twilio przechowuje numery telefonów i trunki SIP
w obrębie każdego subkonta, więc połączenie utworzone przy użyciu konta nadrzędnego widzi tylko własne numery konta nadrzędnego, a istniejącego
połączenia nie można później przełączyć na inne subkonto.

Aby uzyskać dostęp do numerów przechowywanych na subkontach, utwórz jedno połączenie na każde
subkonto. Panel zrobi to za Ciebie: gdy połączysz konto nadrzędne z aktywnymi subkontami,
okno konfiguracji wyświetli ich listę, zaznaczysz wybrane konta, a ThunderPhone utworzy
połączenie (oraz trunk SIP) na każdym z nich. Ten sam proces jest dostępny przez API:

```bash
# Discover active subaccounts visible to the parent credentials
curl -X POST https://api.thunderphone.com/v1/voip-connections/twilio/subaccounts \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"credentials": {"accountSid": "ACparent...", "authToken": "..."}}'
```

```json Response
{
  "discovery_id": "7c1e...",
  "parent": { "sid": "ACparent...", "friendly_name": "Acme" },
  "subaccounts": [
    { "sid": "ACsupport...", "friendly_name": "Acme Support", "already_connected": false, "connection_id": null },
    { "sid": "ACsales...",   "friendly_name": "Acme Sales",   "already_connected": true,  "connection_id": 5 }
  ]
}
```

```bash
# Create a connection for each selected subaccount
curl -X POST https://api.thunderphone.com/v1/voip-connections/twilio/subaccounts/connect \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"discovery_id": "7c1e...", "subaccount_sids": ["ACsupport..."]}'
```

Odpowiedź zawiera po jednym wierszu dla każdego subkonta ze stanem `status`
`created`, `skipped` (już połączono) lub `failed`, a także błędem `error`,
na który możesz zareagować. Wiersze są niezależne, więc błąd w jednym subkoncie
nigdy nie blokuje pozostałych, a `discovery_id` pozostaje ważny przez 30
minut, dzięki czemu wiersz zakończony błędem można po prostu ponowić. Tokeny subkont
są odczytywane z Twilio podczas wykrywania i zapisywane w nowym połączeniu;
nigdy nie są zwracane przez API. Każde nowe połączenie następnie importuje
i weryfikuje numery dokładnie tak samo jak połączenie utworzone ręcznie.
Dodaj `"enable_transfers": true`, aby włączyć także transfery połączeń dla pnia SIP
każdego nowego połączenia; błąd w tym przypadku jest zgłaszany w
`test_result.transfer_enable_error` tego połączenia i nie powoduje błędu
wiersza.

## 3. Wyświetl i importuj numery

Sprawdź numery widoczne dla Twoich danych uwierzytelniających, które nie są jeszcze
w organizacji ThunderPhone:

```bash
curl https://api.thunderphone.com/v1/voip-connections/5/available-numbers \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY"
```

Następnie zaimportuj wybrane numery:

```bash
curl -X POST https://api.thunderphone.com/v1/voip-connections/5/import-numbers \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"numbers": ["+15550001234", "+15550009999"]}'
```

Każdy import staje się zasobem [numeru telefonu](/api-reference/phone-numbers)
w Twojej organizacji z `number_type="voip"` i `status="provisioning"`.

## 4. Zweryfikuj każdy zaimportowany numer

Importowanie rejestruje numer jako *dostępny*; faktyczne kierowanie przez niego połączeń
wymaga weryfikacji. W przypadku połączeń z dostawcami (Twilio,
Telnyx) ponownie sprawdza ona poświadczenia dostawcy i osiągalność SIP.
W przypadku połączenia **ręcznego SIP** najpierw podejmowana jest próba samopołączenia zwrotnego:
ThunderPhone wykonuje krótkie połączenie testowe *z* numeru, *przez* Twój trunk
SIP, *z powrotem na ten sam numer*. Jeśli nie zweryfikuje to ścieżki przychodzącej, system
przechodzi do krótkiego połączenia testowego *z* numeru, *przez* Twój trunk SIP,
*na* numer ThunderPhone. Testy te sprawdzają nazwę użytkownika,
hasło, transport, routing wychodzący i dostarczanie połączeń przychodzących trunku. Twój operator
nalicza opłaty za te połączenia tak jak za każde inne.

```bash
curl -X POST https://api.thunderphone.com/v1/phone-numbers/{id}/verify-voip \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY"
```

Po pomyślnej weryfikacji `voip_verification_status` zmienia się na `verified`, a numer otrzymuje `status="active"`. Numer na własnym koncie Telnyx nadal odbiera połączenia przychodzące, gdy jego połączenie testowe się nie powiedzie lub połączenia wychodzące nie są jeszcze skonfigurowane: otrzymuje `status="active"` z `voip_verification_status` ustawionym na `unverified`, a odpowiedź wyjaśnia przyczynę. W przypadku niepowodzenia odpowiedź określa, co nie zadziałało — dla ręcznego trunku jest to odpowiedź SIP operatora, na przykład *"odrzucono poświadczenia ThunderPhone (SIP 401)"* lub *"nie można było skierować połączenia (SIP 404)"* — popraw to (poświadczenia, dozwolone źródłowe adresy IP, brakujące przypisanie trunku w panelu dostawcy) i wywołaj ponownie.

W przypadku ręcznego połączenia SIP z listą dozwolonych adresów test połączenia przychodzącego również zakończy się niepowodzeniem, jeśli
te Dozwolone źródłowe adresy IP blokowałyby rzeczywiste połączenie przychodzące.

## 5. Przypisz agentów i odbierz połączenie

Po zweryfikowaniu numeru przypisujesz agentów obsługujących połączenia przychodzące / wychodzące
tak samo jak w przypadku numeru ThunderPhone. Zobacz
[Obsługa połączeń przychodzących](/pl/guides/handle-inbound-calls) oraz
[Wykonywanie połączeń wychodzących](/pl/guides/place-outbound-calls).

## Rotacja poświadczeń

Gdy klucz dostawcy zostanie zmieniony, ponownie wykonaj proces testowania, a następnie aktualizacji:

```bash
# 1. Test the new credentials
curl -X POST https://api.thunderphone.com/v1/voip-connections/test ...

# 2. PATCH the connection with the new evidence
curl -X PATCH https://api.thunderphone.com/v1/voip-connections/{id} \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "credentials": { "apiKey": "NEW_KEY..." },
    "verification_evidence_id": "fresh-evidence-id"
  }'
```

Połączenie pozostaje na miejscu — nie trzeba ponownie importować numerów.

---

## Kolejne kroki

<CardGroup cols={2}>
  <Card title="Dokumentacja połączeń VoIP" icon="phone-volume" href="/api-reference/voip-connections">
    Każde pole w odpowiedziach dotyczących połączenia, dowodów i importu.
  </Card>
  <Card title="Dokumentacja numerów telefonów" icon="phone" href="/api-reference/phone-numbers">
    Przypisuj agentów, przenoś między organizacjami, zwalniaj numery.
  </Card>
  <Card title="Wykonywanie połączeń wychodzących" icon="arrow-up-right" href="/pl/guides/place-outbound-calls">
    Teraz, gdy numer należy do Ciebie, zacznij wykonywać połączenia wychodzące.
  </Card>
</CardGroup>
