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

# Dialpad import (in certification)

> Coming soon: import Dialpad hangup, recording, and transcription events into PyAI, verified with Dialpad's HS256 webhook JWT, for Recap summaries and Trace scorecards.

<Note>
  The Dialpad importer is in live certification and opens when the gates
  pass. This guide documents the exact setup so you are ready on day one.
</Note>

The Dialpad importer will bring every completed call into PyAI with the same
shape as the other providers: transcript, Recap summary, and Trace scorecard
under one stable call id. Dialpad's native transcripts import when present;
otherwise PyAI transcribes the recording.

## What you will need

* A **Dialpad API key** with the **`recordings_export`** scope: Dialpad Admin
  → **API keys** (company settings).
* A **Dialpad webhook secret** you choose (unique, different from the API
  key). Dialpad uses it to sign deliveries with an HS256 JWT.

## Connect (when it opens)

1. In PyAI Console, open **Integrations** and choose **Dialpad**, then enter
   the API key and your webhook secret.
2. Copy the generated webhook URL.
3. In Dialpad, create a webhook with that URL and your secret, then create a
   call-event subscription for **`hangup`**, **`recording`**, and
   **`call_transcription`**.
4. Calls import from then on, with recordings fetched through the
   authenticated Dialpad API (never a webhook-supplied URL).

## Troubleshooting (planned)

* **"JSON deliveries are rejected."** The webhook must be created with the
  secret so Dialpad sends the signed JWT; unsigned JSON is refused by design.
* **Recording export denied.** The API key needs the `recordings_export`
  scope; regenerate it in Dialpad admin with that scope enabled.
* **Duplicate-looking calls after editing the subscription.** Dedupe is on
  the provider call id, so re-delivered events collapse; a changed payload
  for the same call id returns a conflict instead of a second record.
