> ## Documentation Index
> Fetch the complete documentation index at: https://docs.usetuner.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Overview

> Send call data to Tuner from your own voice stack — with the Python SDKs, or by building against the API directly.

Use this guide if you run your own voice stack, or a platform Tuner doesn't ship a dedicated integration for. Otherwise see [Retell](/docs/integrations/retell), [Vapi](/docs/integrations/vapi), [LiveKit](/docs/integrations/livekit), [Pipecat](/docs/integrations/pipecat), or [Dograh](/docs/integrations/dograh).

***

## What this is

Tuner needs one thing from your stack: the **completed call** — a structured conversation timeline plus metadata — sent once, after the call ends. Tuner then processes it and runs your configured analyses.

## Choose your path

The two paths produce identical results in Tuner and follow the same contract. Which one you take depends on your language, not your preference.

<CardGroup cols={2}>
  <Card title="Python SDKs" icon="cubes" href="/docs/integrations/custom-stack/sdk-quickstart">
    **On a Python stack — start here.** Attach observers to your STT, TTS, and LLM framework. They capture the transcript, per-turn timing, tool calls, usage, and cost for you, and send everything in one `flush()` at call end.
  </Card>

  <Card title="Direct API" icon="code" href="/docs/integrations/custom-stack/direct-api">
    **Any other language.** Build the call timeline yourself and POST it to the Create Call API after the call ends. More work — you assemble the per-turn timing and interruption data the SDKs derive automatically.
  </Card>
</CardGroup>

The SDKs are a client for the same API. Reach for the API directly when the SDKs don't fit your stack.

***

## The contract

However you send calls, these identifiers decide which agent a call lands under:

* **workspace\_id** — the Tuner workspace receiving the call
* **agent\_remote\_identifier** — your **Agent Remote ID**, from **Agent Settings → Agent Connection**
* **call\_id** — your unique identifier for the call; use the same value on every retry so ingestion stays idempotent
* **sip\_call\_id** *(inbound simulation only)* — the SIP `Call-ID` from the inbound call, which links a simulated call back to its simulation run. See [Simulation SIP setup](/docs/simulation/inbound/setup).
* **recipient** *(outbound simulation only)* — the SIP URI your system dialed, exactly as Tuner sent it. See [Outbound Simulation](/docs/simulation/outbound).

***

## Authentication

All API requests use **Bearer authentication**. Send your Tuner API key in the `Authorization` header, copied from **Workspace Settings** → **API Keys & Integrations**:

```
Authorization: Bearer <YOUR_TUNER_API_KEY>
```

The SDKs read the same key from the `TUNER_API_KEY` environment variable and send it for you.

***

## Webhooks

This agent can send events to a webhook — see [Webhooks](/docs/integrations/webhooks).

***

## Next steps

<CardGroup cols={2}>
  <Card title="Python SDKs" icon="cubes" href="/docs/integrations/custom-stack/sdk-quickstart">
    The session lifecycle, observers, and one flush at call end.
  </Card>

  <Card title="Direct API" icon="code" href="/docs/integrations/custom-stack/direct-api">
    Build the payload yourself and POST it.
  </Card>

  <Card title="Create Call API reference" icon="terminal" href="/docs/api-reference/create-call">
    The full request/response schema both paths feed into.
  </Card>

  <Card title="Review your first call" icon="magnifying-glass" href="/docs/observability/overview">
    What Tuner does with the data once it lands.
  </Card>
</CardGroup>
