---
title: "Ühenda Twiliost"
description: "Suuna Twilio kõned CallSidi abil SIP-i kaudu ThunderPhone’i agendile ning võta need referUrl-i kaudu tagasi, kus üleandmine toimub edastusaadressis."
---

Sinu TwiML valib agendi SIP-aadressi, lisades kõne `CallSid`-i päisesse.
Kui helistaja vajab inimest, saadab agent SIP-i `REFER`-i, Twilio edastab üleandmist sisaldava edastusaadressi sinu `referUrl`-i töötlejale ning sinu töötleja tagastatud TwiML määrab, kuhu helistaja suunatakse, näiteks Flexi järjekorda.

## Enne alustamist

- ThunderPhone'i agent ja organisatsiooni [API-võti](/et/guides/api-keys).
- Twilio Programmable Voice ning koht TwiML-i ja `referUrl`-i töötleja majutamiseks: sinu enda server või TwiML Bin ja Twilio Function. Flex on valikuline.

## 1. Loo SIP-i lõpp-punkt

Twilio `<Sip>` kasutab kasutajanime ja parooli, seega kasuta standardset lõpp-punkti:

```bash
curl -X POST https://api.thunderphone.com/v1/sip-endpoints \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"agent_id": 12, "name": "Twilio"}'
```

Salvesta vastusest saadud `password` kohe; seda näidatakse ainult üks kord. Ainult Twiliost tulevate kõnede vastuvõtmiseks vaata
[Piira lähte-IP-aadresse](/et/guides/sip-addresses).

## 2. Saada kõned koos kontekstiga

Tagasta see TwiML kõne jaoks, mille soovid agendile üle anda:

```xml
<Response>
  <Dial answerOnBridge="true" referUrl="https://YOUR_SERVER/thunderphone-refer">
    <Sip username="tp409667538f83" password="YOUR_ENDPOINT_PASSWORD">sip:agent-12-jhxmginwjx@sip.thunderphone.com;transport=tls?X-Call-ID={{CallSid}}</Sip>
  </Dial>
</Response>
```

- `;transport=tls` on oluline: Twilio kasutab UDP-d, kui sellele ei öelda teisiti.
- `X-Call-ID` kannab `CallSid`-i. Twilio ei dokumenteeri oma kõne-ID päist, seega lisa see päis: ThunderPhone salvestab selle kõne `external_call_id`-na. `{{CallSid}}` töötab TwiML Bin-is; oma serverist kirjuta sissetuleva päringu `CallSid`.
- Lisa samal viisil rohkem konteksti, näiteks `&amp;X-Account-Id=12345`. TwiML-is kirjuta `&` kujul `&amp;`, sest eraldiseisev `&` ei ole kehtiv XML. Igaüks jõuab viibani muutujana, siin `{{sip_x_account_id}}`. Twilio lubab `x-` päiseid ja `User-to-User`-i protsendikodeerituna, kusjuures kogu URI on alla 255 tähemärgi ja päised alla 1 024 tähemärgi.
- `referUrl` võimaldab Twiliol agendi `REFER`-i vastu võtta; ilma selleta edastus nurjub [veaga 13802](https://www.twilio.com/docs/api/errors/13802). `answerOnBridge="true"` hoiab helistaja ühendatuna, kuni uus sihtkoht vastab, nii et nurjunud edastuse korral saab kasutada varuvarianti.

Studio vidin **Ühenda kõne aadressile** ei dokumenteeri kohandatud päiseid ega `referUrl`-i, seega anna Studio kaudu kõne sellele TwiML-ile üle, näiteks vidinaga **TwiML-i ümbersuunamine**.

## 3. Võta kõne tagasi

Häälagent suunab kõne `REFER`-iga, mille suunamisaadress sisaldab üleandmise
ID-d ja eesmärki. Lisa see suunamisnumber (vt
[Lisa suunamisnumber](/et/guides/contact-centers/overview)
ja [Päised suunamisaadressis](/et/guides/call-transfers)):

```json
{
  "name": "Twilio support",
  "number": "sip:support@acme.sip.twilio.com",
  "headers": {"X-Handoff-Id": "{{handoff_id}}", "X-Handoff-Intent": "{{handoff_intent}}"},
  "headers_in_uri": true
}
```

Twilio saadab kogu aadressi sinu `referUrl`-ile kui `ReferTransferTarget`, näiteks
`<sip:support@acme.sip.twilio.com?X-Handoff-Id=Zr3mY0b1Q9xWw2kPq4s7Tg&X-Handoff-Intent=billing_dispute>`.
Sinu töötleja loeb sellest päised välja ja tagastab TwiML-i, mis määrab, kuhu
helistaja järgmisena suunatakse. Aadressi kasutajaosa (`support`) saad ise
valida, seega saad lisada iga sihtkoha jaoks ühe suunamisnumbri ja selle järgi
marsruutida.

See Twilio Function lisab helistaja Flexi järjekorda koos üleandmisega ülesande
atribuutidena ja otsib kokkuvõtte üleandmise ID järgi. Otsing toimub
Functionis, sest Studio HTTP Requesti vidin ei saa saata `Authorization`
päist:

```js
exports.handler = async (context, event, callback) => {
  const target = (event.ReferTransferTarget || "").replace(/^<|>$/g, "");
  const params = new URLSearchParams(target.split("?")[1] || "");
  const handoffId = params.get("X-Handoff-Id") || "";
  const attributes = { handoff_id: handoffId, intent: params.get("X-Handoff-Intent") || "" };

  if (handoffId) {
    const response = await fetch(
      "https://api.thunderphone.com/v1/calls/handoff?handoff_id=" + encodeURIComponent(handoffId),
      { headers: { Authorization: "Bearer " + context.THUNDERPHONE_API_KEY } }
    );
    if (response.ok) {
      const call = await response.json();
      attributes.summary = (call.handoff && call.handoff.summary) || "";
    }
  }

  const twiml = new Twilio.twiml.VoiceResponse();
  twiml.enqueue({ workflowSid: context.FLEX_WORKFLOW_SID }).task({}, JSON.stringify(attributes));
  callback(null, twiml);
};
```

Hoia API-võtit Functioni keskkonnamuutujates. Muude väljade kohta vaata
[Üleantud kõne otsimine](/api-reference/calls#look-up-a-handed-off-call).

## Testi seda

Helista Twilio numbrile, mis tagastab ülaltoodud TwiML-i, palu häälagendil
ühendada sind inimesega ning kontrolli, et sinu `referUrl`-i töötleja saab
mõlema päisega `ReferTransferTarget`-i ja et helistaja jõuab järjekorda. Seejärel ava kõne käsuga
`GET /v1/calls/{call_id}`: `external_call_id` peaks olema `CallSid`.

## Piirangud

- Twilio piirab `Refer-To` pikkuse 256 tähemärgiga. ThunderPhone hoiab aadressi
  pikkuse 254 tähemärgil ja jätab välja päise, mis ei mahu ära, seega hoia
  päiste nimed ja väärtused lühikesed.
- Twilio ei dokumenteeri päiste lugemist `BYE`-l, seega ei saa tagasisuunamine
  üleandmist Twiliosse tagasi kaasa võtta. Kasuta ülaltoodud viisil `REFER`-i.
- Twilio ei aktsepteeri `REFER`-i kõnel, mis on ühendatud `<Conference>` või
  `<Queue>` kaudu, seega vali häälagent ülaltoodud viisil `<Dial><Sip>`-iga.
