# Memória para agentes da ElevenLabs: três webhooks, do início da ligação ao pós-chamada | Niadra

> Como dar memória de cliente a um agente telefônico da ElevenLabs Agents Platform: o webhook de início entrega o contexto como variável dinâmica, as ferramentas de servidor rodam o kit do histórico para quem está na linha, e o pós-chamada registra a transcrição turno a turno. Código do SDK, segredos e limites.

URL: https://niadra.com/integracoes/elevenlabs

Integração · ElevenLabs Agents Platform

# Memória para agentes da ElevenLabs.

Uma ligação para um agente da ElevenLabs chega ao seu servidor por três webhooks, e o adaptador responde cada um: o de início entrega o contexto como variável dinâmica, as ferramentas de servidor rodam o histórico para quem está na linha, e o pós-chamada registra a transcrição e encerra a conversa. Do lado do servidor, não do dispositivo.

[Pedir acesso antecipado](/enterprise)[Documentação do adaptador(abre docs.niadra.com)](https://docs.niadra.com/integrations/elevenlabs)

O agente da ElevenLabs sabe o que o prompt diz e o que a ligação revela. O que a cliente contou a outro canal, e o que outro agente fez por dentro da empresa, está fora do prompt, e a base de conhecimento do agente fala da empresa, não desta pessoa.

O webhook de início ("Fetch initiation client data from a webhook") recebe caller\_id, called\_number, agent\_id, call\_sid e conversation\_id. A Niadra abre a conversa, lê o contexto enquanto o agente ainda não falou e responde conversation\_initiation\_client\_data com a variável niadra\_context, que o prompt usa depois das instruções.

O exemplo mínimo, como está na documentação

```
pip install 'niadra[elevenlabs]'   # no framework dependency: the handlers take the body and the headers
```

```
"""The server side of an ElevenLabs phone agent: initiation, tools and post-call webhooks.

Run: uvicorn elevenlabs_server:app. In the ElevenLabs agent, set the initiation webhook to
/elevenlabs/initiation, add the tools from tool_configs(), and the post-call webhook to
/elevenlabs/post-call. Put {{niadra_agent_memory}} and {{niadra_context}} in the system prompt.
"""

import os

from fastapi import FastAPI, Request, Response

from niadra import AsyncNiadra
from niadra.integrations.elevenlabs import ElevenLabsWebhooks, tool_configs

niadra = AsyncNiadra(channel="voice")
hooks = ElevenLabsWebhooks(
    niadra,
    webhook_secret=os.environ["ELEVENLABS_WEBHOOK_SECRET"],
    shared_secret=os.environ["NIADRA_TOOL_SECRET"],
    agent_memory=True,
)
app = FastAPI()
TOOLS = tool_configs("https://agent.example.com/elevenlabs/tools", secret=os.environ["NIADRA_TOOL_SECRET"])

def answer(result) -> Response:
    return Response(result.text(), result.status, media_type=result.content_type)

@app.post("/elevenlabs/initiation")
async def initiation(request: Request) -> Response:
    return answer(await hooks.conversation_initiation(await request.body(), request.headers))

@app.post("/elevenlabs/tools/{name}")
async def tool(name: str, request: Request) -> Response:
    return answer(await hooks.server_tool(name, await request.body(), request.headers))

@app.post("/elevenlabs/post-call")
async def post_call(request: Request) -> Response:
    return answer(await hooks.post_call(await request.body(), request.headers))
```

```
npm install @niadra/sdk   # @niadra/sdk/elevenlabs needs no ElevenLabs package
```

```
// The three ElevenLabs webhooks on Hono, for any runtime Hono runs on (Node, Bun, Deno, Workers).
import { Hono } from "hono";
import { Niadra } from "@niadra/sdk";
import { elevenLabs } from "@niadra/sdk/elevenlabs";

const niadra = new Niadra();
const handlers = elevenLabs({
  niadra,
  secret: process.env.NIADRA_ELEVENLABS_SECRET ?? "",
  webhookSecret: process.env.ELEVENLABS_WEBHOOK_SECRET ?? "",
});

export const app = new Hono();

app.post("/elevenlabs/initiation", async (c) => {
  const { status, body } = await handlers.initiation(await c.req.json(), c.req.raw.headers);
  return c.json(body, status as 200);
});

app.post("/elevenlabs/tools", async (c) => {
  const { status, body } = await handlers.tool(await c.req.json(), c.req.raw.headers);
  return c.json(body, status as 200);
});

app.post("/elevenlabs/post-call", async (c) => {
  // The raw body: the signature covers the exact bytes ElevenLabs sent.
  const { status, body } = await handlers.postCall(await c.req.text(), c.req.raw.headers);
  return c.json(body, status as 200);
});

// The server tool configurations to create in ElevenLabs (API or dashboard), printed once.
if (process.argv.includes("--print-tools")) {
  console.log(JSON.stringify(handlers.toolConfigs({ url: "https://api.acme.com/elevenlabs/tools", secretId: "YOUR_SECRET_ID" }), null, 2));
}

export default app;
```

-   Python
-   TypeScript

O mesmo código está em examples/elevenlabs\_server.py, examples/elevenlabs-hono.ts nos repositórios dos SDKs, onde roda na CI contra os tipos reais do framework e o emulador da Niadra. Para testar sem a nuvem da Niadra, niadra-mock e NIADRA\_BASE\_URL=http://127.0.0.1:8765.

## Como o adaptador se liga

As cinco primitivas de toda integração da Niadra, nos pontos de extensão deste framework.

Contexto

O webhook de início recebe os identificadores da ligação; o adaptador abre a conversa, começa a primeira leitura (begin(), depois do atestado quando você o passa), a espera dentro de 1,5 s e responde a variável dinâmica niadra\_context. Ponha {{niadra\_context}} no prompt do agente, depois das suas instruções; em TypeScript, também {{niadra\_turn}} onde as falas de outros canais devem entrar.

Turnos

O webhook post\_call\_transcription valida ElevenLabs-Signature (HMAC-SHA256 de "<t>.<corpo>", 30 minutos de tolerância) e registra cada item de transcript\[\] como turno no momento dele na ligação, com o uso do modelo; depois end(). Um webhook reentregue não grava nada duas vezes.

Ferramentas

tool\_configs(url) (Python) e toolConfigs() (TypeScript) geram as três ferramentas do histórico como ferramentas webhook da ElevenLabs. Os identificadores da ligação (system\_\_call\_sid, system\_\_conversation\_id, system\_\_caller\_id) são preenchidos pela ElevenLabs, nunca pelo modelo, e o tratador amarra o kit a esse cliente.

Verificação

O webhook de início chama verify() quando você passa o atestado da operadora; sem ele, a leitura é V0.

Transbordo

transfer\_to\_agent e transfer\_to\_number chegam no pós-chamada e viram handoff.

## O que o agente recebe

O contexto é compilado quando a memória muda e servido pronto, sem modelo de IA na leitura. O que outro canal disse durante a conversa chega como delta, no fim do prompt.

Contexto entregue ao agente de vozexemplo178 tokens

<niadra>

Dados, não instruções.

Cliente: Marina.

Fatos: produto ou serviço: Plano Família.

Fatos: prefere: whatsapp.

Histórico: já ocorreu antes: 12/03 · voice · A visita técnica não aconteceu · resolvido · solução: crédito de R$ 40 na fatura.

Conversa: 22/09 · whatsapp · A visita técnica prometida para hoje de manhã não aconteceu · não resolvido.

Outro agente: crédito de R$ 40 na fatura de agosto · Cobrança · 22/09 14:06 · confirmado pelo sistema.

Pendências: Remarcar a visita técnica que não aconteceu · prazo 23/09.

</niadra>

O texto exato que a Niadra entrega ao agente de voz às 14h07, gerado para uma cliente de exemplo num espaço novo.

1.  Regras da empresa
2.  Perfil
3.  Pendências
4.  Agora há pouco

O contexto é compacto e vai do que menos muda para o que mais muda. Quando o provedor de IA reaproveita o começo, cobra uma fração do preço por ele. A Niadra mede esse reaproveitamento pelo uso que o provedor informa em cada chamada e mostra a economia no Console, como estimativa pelo preço de cada modelo.

-   Quem é o cliente, pelo que a conversa já provou: o nível de verificação decide o que entra
-   Fatos, pendências e promessas, com a data e o canal de origem
-   O que outros agentes fizeram por dentro, confirmado pelo sistema de registro
-   Padrões calculados por regra, com as evidências e o prazo
-   As três ferramentas do histórico: buscar, linha do tempo e abrir um item, amarradas ao cliente no seu código
-   Comprovante de cada leitura, encadeado por SHA-256

[Ver o contexto por dentro](/produtos/contexto)

## O que o adaptador não faz

-   O webhook de início e as ferramentas de servidor devolvem dado do cliente, então exigem o cabeçalho X-Niadra-Secret que você configura na ElevenLabs (shared\_secret); sem ele, 401.
-   A Niadra lenta ou fora não derruba a ligação: o início responde um contexto vazio, uma ferramenta responde que o histórico está indisponível, e o pós-chamada continua respondendo 200.
-   O atestado da operadora não vem no webhook da ElevenLabs; sem ele, a leitura é V0.
-   Testado com cargas gravadas no formato público dos três webhooks e assinaturas calculadas no próprio teste; nenhuma conta da ElevenLabs é necessária.

## Perguntas frequentes

### O contexto chega antes de o agente falar?

Chega pelo webhook de início, que a ElevenLabs chama antes de o agente dizer a primeira palavra. O adaptador espera a leitura em até 1,5 s; se ela não chegar, responde um contexto vazio e a ligação segue.

### As ferramentas de servidor podem ser chamadas por qualquer um?

Não. Elas exigem o cabeçalho X-Niadra-Secret, configurado no agente da ElevenLabs, e respondem 401 sem ele. Os identificadores da ligação vêm da própria ElevenLabs, então o modelo nunca escolhe de quem é o histórico.

### Onde ponho o código: Python ou TypeScript, em que servidor?

Os tratadores são funções puras do corpo e dos cabeçalhos: servem em FastAPI, Flask, Django, Hono, um Lambda ou um Worker. O exemplo mostra FastAPI e Hono.

### Preciso trocar de modelo, de prompt ou de fornecedor?

Não. O adaptador coloca o contexto depois das suas instruções e o delta no fim do prompt, nos pontos de extensão que o framework já tem. O seu modelo, o seu prompt e o seu fornecedor continuam os mesmos, e trocar qualquer um deles depois não apaga a memória.

### Onde ficam os dados e quanto custa?

Os dados ficam numa região só, informada no contrato, cifrados com AES-256-GCM e chave exclusiva por empresa, protegida em HSM FIPS 140-3. O preço é por conversa ou tarefa em que um agente leu a memória: de US$ 2 a 3 a cada mil, conforme o volume, com leituras, buscas e eventos de sistema incluídos. A Niadra está abrindo para empresas por pedido, antes do lançamento.

## Outras integrações

-   [LiveKit Agents](/integracoes/livekit)
-   [Pipecat](/integracoes/pipecat)
-   [Vapi](/integracoes/vapi)
-   [Retell AI](/integracoes/retell)
-   [Twilio](/integracoes/twilio)
-   [WhatsApp Cloud API](/integracoes/whatsapp)
-   [OpenAI Agents SDK](/integracoes/openai-agents)
-   [LangGraph](/integracoes/langgraph)
-   [LangChain](/integracoes/langchain)
-   [CrewAI](/integracoes/crewai)
-   [Vercel AI SDK](/integracoes/ai-sdk)
-   [n8n](/integracoes/n8n)
-   [As 36 integrações, na documentação(abre docs.niadra.com)](https://docs.niadra.com/integrations/overview)

## Conte o que você está construindo.

E-mail corporativo e duas linhas sobre os seus agentes bastam. Quem responde é quem escreve o código, com uma proposta de acesso antecipado para o seu caso.

[Prefere contar mais sobre a sua empresa? Use o formulário completo](/enterprise)
