Saltar para o conteúdo

Guias

Agente próprio

Quer ligar a um número volai a sua própria plataforma de voz - o ElevenLabs Conversational AI no seu próprio workspace, o Vapi, o Retell ou até um IVR próprio em Asterisk/FreeSWITCH - em vez do agente integrado do volai? Esta página é um guia para os dois sentidos: chamadas recebidas e efetuadas. Nas chamadas efetuadas não paga ainda a sobretaxa de agente de 2,50 kr/min (≈ 0,10 EUR) - o agente é operado (e pago) por si, na sua plataforma.

Visão rápida

As chamadas recebidas configuram-se encaminhando o número para o endereço SIP da sua plataforma - sem mecânica nova. As chamadas efetuadas passam por uma ligação de relay de curta duração, porque a plataforma não consegue registar a linha de forma permanente como cliente SIP.

Vai precisar de: um número volai, uma chave de API (vk_...) e uma conta na sua plataforma (ElevenLabs, Vapi, central própria...).

1Quando usar agente próprio e quando o integrado

Os dois caminhos funcionam no mesmo número e com o mesmo saldo - diferem apenas em QUEM opera a lógica da conversa e no custo adicional:

CritérioAgente integradoAgente próprio
Quem conduz a conversaNós - um systemPrompt, a nossa voz e o nosso workspace ElevenLabs.O próprio - qualquer plataforma, prompt próprio, voz própria, ferramentas próprias.
ConfiguraçãoUma chamada a POST /v1/agents.Credenciais SIP do número + configuração da sua plataforma (esta página).
Preço da chamada0,92 kr/min (≈ 0,04 EUR) efetuada, 0,50 kr/min (≈ 0,02 EUR) recebidaigual - 0,92 kr/min (≈ 0,04 EUR) efetuada, 0,50 kr/min (≈ 0,02 EUR) recebida
Sobretaxa de agente+ 2,50 kr/min (≈ 0,10 EUR)nenhuma - paga apenas os minutos da chamada
Transcrição, resumo, deteção de atendedorSim, automaticamente.Não - fica a cargo (ou não) da sua própria plataforma.

Não paga a sobretaxa de agente, mas também não recebe de nós nada de graça - a sua plataforma (ElevenLabs, Vapi...) paga-a diretamente, segundo a tabela de preços dela. Nós faturamos apenas os minutos de chamada na linha volai, tal como com um cliente SIP ou com o agente integrado. Os preços são sem IVA, como toda a tabela de preços.

2Chamadas recebidas no agente próprio

Nenhuma mecânica nova - basta o encaminhamento existente mode: "sip" (igual ao de um softphone próprio, ver SIP) com o sipUri da sua plataforma. Para um número SIP-trunk do ElevenLabs registado no SEU próprio workspace, trata-se do endereço com o mesmo número que tem a sua linha volai:

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

E na sua conta ElevenLabs (Settings → Phone Numbers → Import → SIP trunk) registe este número com inbound_trunk_config:

json
{
  "provider": "sip_trunk",
  "phone_number": "+420601234567",
  "label": "O meu agente",
  "inbound_trunk_config": {
    "allowed_addresses": ["81.31.45.0/24"],
    "media_encryption": "allowed"
  }
}

allowed_addresses acima é o nosso intervalo de sinalização (81.31.45.0/24) - mais seguro do que o universal 0.0.0.0/0, que deixa entrar um INVITE de qualquer lado. Ambos deixam passar a chamada, mas numa importação sem credenciais a allowlist é a ÚNICA verificação - por isso indique o intervalo, não 0.0.0.0/0.

Utiliza uma plataforma diferente do ElevenLabs? O princípio é o mesmo - descubra nela o endereço SIP para onde deve chegar a chamada do seu número e indique-o em sipUri. No Vapi, o mesmo intervalo vai para o BYO trunk como gateways.

No Vapi, o endereço de encaminhamento é sip:<E164>@<credentialId>.sip.vapi.ai - o <credentialId> encontra-se no seu BYO SIP trunk no Vapi; uma organização na região da UE tem, em vez de sip.vapi.ai, o domínio sip.eu.vapi.ai. O sip.vapi.ai simples pertence aos números nativos do Vapi e não funciona para um número nosso. Deixe o nome de utilizador e a palavra-passe vazios no BYO trunk, o Vapi reconhece as nossas chamadas pelo IP nos gateways.

Em gateways, indique o intervalo como IP 81.31.45.0 e a máscara (netmask) 24 em separado. Com a máscara por omissão 32, o Vapi deixaria passar apenas um endereço e rejeitaria as nossas chamadas.

3Chamadas efetuadas a partir do agente próprio (relay)

Este é o sentido contrário - a sua plataforma efetua a chamada para fora. A maioria das plataformas de IA de voz (incluindo o ElevenLabs) não consegue registar de forma permanente uma linha telefónica como cliente SIP - limita-se a enviar uma chamada autenticada com as credenciais da sua linha. A rede telefónica não deixa passar essa chamada diretamente para o número de destino e, por isso, encaminha-a através de uma ligação de relay de curta duração:

Porquê relay e não marcação direta

A marcação direta do número de destino através do trunk não funciona por nenhum dos dois caminhos possíveis: para um número fora da nossa rede a chamada nem sequer chega a existir (a plataforma comunica a falha e não fica rasto em lado nenhum) e, para outro número volai na nossa rede, só se liga INTERNAMENTE como chamada anónima - nunca sai realmente da nossa rede, embora pareça uma chamada estabelecida. O relay é a única forma de a chamada realmente sair.

1. Configure a sua plataforma para a sua linha

Obtenha as credenciais SIP da sua linha:

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

A resposta devolve server (para o REGISTER de um softphone, ver SIP) e outboundTrunkAddress SEPARADAMENTE - não são intermutáveis.

E defina outboundTrunkAddress - NÃO server - como trunk de saída da sua plataforma. No ElevenLabs trata-se do campo outbound_trunk_config do número de telefone em causa (Settings → Phone Numbers → o seu número → Outbound calling), exatamente neste formato:

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

Indique exatamente outboundTrunkAddress

O endereço do trunk de saída tem de ser exatamente o valor de outboundTrunkAddress da resposta - quer coincida com server, quer não. Um endereço diferente significa que a chamada não é encaminhada na rede e a plataforma comunica-o como 1011 sip request timed out - no histórico de chamadas não fica nada.

2. Crie a ligação de relay

Imediatamente antes da chamada (a ligação tem uma duração curta, ver os limites abaixo), chame:

bash
curl -X POST https://volai.cz/v1/relay \
  -H "Authorization: Bearer vk_A_SUA_CHAVE" \
  -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"
}

O número de destino indica-o a NÓS em to - a plataforma nunca o vê, recebe apenas o sipName simples da resposta.

3. Peça à plataforma que ligue para o sipName

O nome simples, não o SIP URI completo

O ElevenLabs, no campo to_number rejeita o SIP URI completo com a mensagem “SipCallTo should be a phone number or SIP user, not a full SIP URI” - por isso a resposta acima devolve sipName (o nome simples volai_relay_2) e sipUri (o completo sip:volai_relay_2@sip.volai.cz) SEPARADAMENTE. Em to_number só pertence o primeiro.

No ElevenLabs, isto significa chamar /v1/convai/sip-trunk/outbound-call com to_number definido diretamente como o sipName:

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

agent_id encontra-se no seu agente no ElevenLabs, agent_phone_number_id é o phone_number_id do número importado - devolve-o a resposta da importação ou pode lê-lo na lista Phone numbers.

Tem um cliente SIP próprio ou uma central em vez do ElevenLabs? Marque diretamente o sipUri completo, como uma chamada SIP normal - esta restrição aplica-se apenas às plataformas que querem um nome simples sem o prefixo sip: .

4. O que acontece a seguir

A rede telefónica aceita a chamada com o nome volai_relay_2, encaminha-a para o seu to e define como número visível de quem liga o seu from - quem recebe vê no ecrã a sua linha volai, não o nome interno do slot de relay (se o número tiver nomes de relay próprios - ver Faturação abaixo; caso contrário, quem recebe vê o número de demonstração do volai). Quando a chamada termina, o lease é libertado e os minutos são faturados como uma chamada efetuada normal - 0,92 kr/min (≈ 0,04 EUR), sem sobretaxa de agente.

A resposta sobre a marcação da chamada só chega depois de todo o toque (facilmente dezenas de segundos) - não é um erro, mas um timeout curto do seu lado pareceria nesse momento uma falha, embora a chamada esteja em curso.

4Resolução de problemas

As mensagens mais frequentes com um agente próprio e o que fazer:

MensagemCausaSolução
1011 sip request timed outO endereço do trunk de saída não é outboundTrunkAddress.No ElevenLabs, defina outbound_trunk_config.address como outboundTrunkAddress da resposta com as credenciais SIP, não como server.
SipCallTo should be a phone number or SIP user, not a full SIP URIto_number contém o sipUri completo em vez do nome simples.Em to_number só pertence o sipName da resposta de POST /v1/relay.
A chamada termina logo na plataforma (no ElevenLabs failed), do nosso lado nadaMarcou o número de telefone diretamente, não através do relay.Crie uma ligação de relay (POST /v1/relay) e ligue para o sipName devolvido.
max auth retry attempts reached for SIP inviteA plataforma não passou a autenticação: ou o nome de utilizador ou a palavra-passe do trunk de saída não coincidem, ou a chamada chegou como número de telefone em vez de sipName - a rede pede então outra autenticação, que a plataforma não consegue passar.Copie o nome de utilizador e a palavra-passe exatamente das credenciais SIP do número (username, password). Em to_number indique apenas o sipName de POST /v1/relay e inicie a chamada através da API (POST /v1/convai/sip-trunk/outbound-call) ou da ferramenta MCP do ElevenLabs make_outbound_call, não por um formulário que só aceita números de telefone. O lease espera pela chamada apenas ttlSecs (por omissão 120 s).
404 from_number_not_ownedfrom em POST /v1/relay não é um número volai seu.Indique em from exatamente o número volai a partir do qual liga.
400 relay_lease_limitNeste número (1) ou conta (2) já está a decorrer um lease ativo.Aguarde que o lease seja libertado ou cancele um que não esteja a ser usado (DELETE /v1/relay/{id}).
503 capacity_busyO pool partilhado de slots de relay está neste momento cheio.Nada é cobrado - tente novamente daí a pouco.
A chamada recebida não tocaO número não está importado no ElevenLabs, allowed_addresses não deixa passar o nosso intervalo ou o encaminhamento não está guardado no volai.Confirme os três passos acima; se a central pedir 401, preencha o nome de utilizador e a palavra-passe no encaminhamento.
Quem recebe vê o número volai em vez do seuO número ainda não tem nomes de relay próprios. São criados logo após a compra e desta vez não correu bem.A chamada seguinte repete a criação por si. Se quem recebe continuar a ver o número volai passada uma hora, escreva ao suporte.
Uma chamada repetida termina logo com recusa (SIP 603)A plataforma voltou a marcar o mesmo sipName, tipicamente depois de uma chamada não atendida. Um lease liga apenas uma chamada.Antes de cada tentativa, mesmo de uma repetição após chamada não atendida, crie um novo lease (POST /v1/relay) e desative a repetição automática na plataforma.

5Faturação

Uma chamada efetuada através do relay é faturada ao mesmo preço de uma chamada efetuada normal - 0,92 kr/min (≈ 0,04 EUR) - sem qualquer sobretaxa de agente. Os preços são sem IVA, como toda a tabela de preços.

A simultaneidade é limitada (ver os limites abaixo): no máximo 1 chamada ativa por cada um dos seus números e no máximo 2 em simultâneo por conta.

Quem recebe só vê a sua linha volai se o número tiver nomes de relay (relayNames) próprios - o número recebe-os logo após a compra. Enquanto não os tiver, o lease passa para o pool partilhado e quem recebe vê o número de demonstração do volai. Se isto durar mais de uma hora, escreva ao suporte.

6Limites, quotas e segurança

O limite é de 1 lease ativo por cada um dos seus números e no máximo 2 por conta - uma salvaguarda deliberada para que um único cliente não ocupe todo o pool partilhado de slots de relay:

O quêValor
Lease à espera da primeira chamada (pending)120 s por omissão, ttlSecs 15 a 300 s
Chamada em curso (active)15 minutos
Lease ativo por cada um dos seus númerosno máximo 1
Leases ativos por contano máximo 2
Utilização do leasede uso único - uma segunda chamada no mesmo lease é recusada, e uma repetição após chamada não atendida também precisa de um novo lease
  • from tem de ser um número volai seu - caso contrário from_number_not_owned. Sem esta verificação seria possível fazer-se passar por uma linha alheia (caller ID spoofing).
  • As mesmas barreiras de uma chamada normal - lista de não chamar (vale apenas para chamadas, não para SMS), bloqueio automático de 30 dias após 3 tentativas falhadas para o mesmo número em 24 horas, linhas de tarifa especial, proteção contra ciclos entre números volai, bloqueio do número de destino e o limite geral de frequência de chamadas. Nada disto se pode contornar através do relay.
  • Pool cheio -> 503 capacity_busy - os slots de relay são um limite de simultaneidade partilhado por TODA a plataforma, não apenas pela sua conta. Em caso de capacity_busy nada é cobrado, tente novamente daí a pouco.
  • A referência REST completa (códigos de erro, GET/DELETE sobre os leases) encontra-se em REST API.

Cada erro da API inclui cause (quem o resolve) e action (o que fazer) - ver Formato dos erros na referência da REST API.