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

# Quickstart

> First authenticated request in under five minutes.

## 1. Create an API key

In the dashboard: **Settings → API & MCP → Create key**.

1. Give it a label (e.g. `Zapier production`).
2. Pick the minimum scopes your integration needs. For the examples below, `locations:read`, `calls:read`, and `leads:read` are enough.
3. Click **Create key**.

The full secret (`550e8400-e29b-41d4-a716-446655440000`) is shown **exactly once**. Copy it into your secret manager before dismissing the modal — there is no way to recover it later. The key prefix (first 16 chars) stays visible in the dashboard so you can identify the key after the fact.

<Warning>
  Never commit a `550e8400-e29b-41d4-a716-446655440000` secret to source control. Never ship it in client-side code. If an API key leaks, revoke it from the dashboard — any integration using it stops instantly.
</Warning>

## 2. Make a request

API keys are location-scoped. Every call authenticates with:

```
Authorization: Bearer 550e8400-e29b-41d4-a716-446655440000
```

<CodeGroup>
  ```bash curl theme={null}
  curl https://api.pickupbell.com/api/v1/locations \
    -H "Authorization: Bearer 550e8400-e29b-41d4-a716-446655440000"
  ```

  ```ts Node (fetch) theme={null}
  const res = await fetch("https://api.pickupbell.com/api/v1/locations", {
    headers: { Authorization: `Bearer ${process.env.PICKUPBELL_KEY}` },
  });
  const { data } = await res.json();
  ```

  ```python Python theme={null}
  import os, httpx
  r = httpx.get(
    "https://api.pickupbell.com/api/v1/locations",
    headers={"Authorization": f"Bearer {os.environ['PICKUPBELL_KEY']}"},
  )
  print(r.json()["data"])
  ```
</CodeGroup>

You get back one location — the one the key was minted under:

```json theme={null}
{
  "data": [
    {
      "id": "5e9a7b21-…",
      "slug": "premier-hvac",
      "name": "Premier HVAC & Cooling",
      "timezone": "America/Chicago",
      "industry": "hvac_residential",
      "pickupbell_phone": "+15125559876",
      "service_areas": ["Austin", "Round Rock", "Cedar Park"]
    }
  ]
}
```

## 3. List recent calls

```bash theme={null}
curl "https://api.pickupbell.com/api/v1/locations/premier-hvac/calls?limit=5" \
  -H "Authorization: Bearer 550e8400-e29b-41d4-a716-446655440000"
```

```json theme={null}
{
  "data": [
    {
      "id": "8a3f9d21-…",
      "caller_phone": "***-***-0142",
      "caller_name": "Sarah Chen",
      "outcome": "transferred",
      "urgency_level": 5,
      "is_emergency": true,
      "duration_sec": 252,
      "service_type": "AC repair",
      "issue_summary": "AC not cooling, 98° out, toddler in home",
      "estimated_value": 2800,
      "started_at": "2026-04-22T14:47:12Z"
    }
  ]
}
```

Notice the masked phone (`***-***-0142`). That's the PII scrubber at work — see [PII scrubbing](/pii-scrubbing). Add the scopes `transcripts:read` and `recordings:read` to your key to fetch full transcripts and recording URLs.

## 4. Subscribe to webhooks

If you'd rather be pushed to than polled, see [Webhooks](/webhooks/overview). The post-call webhook fires within \~2s of every call ending.

## 5. Or: use the MCP server

If you just want Claude to do the work, skip the REST docs and head to [MCP overview](/mcp/overview). The same key works with either.
