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

# Kupe App → Kupe Hub

> Move from api.kupe.in / app.kupe.in to x.kupe.in and hub.kupe.in. Same company, new platform.

<div class="kupe-hero kupe-hero-compact">
  <div class="kupe-matrix" aria-hidden="true" />

  <div class="kupe-hero-copy">
    <div class="kupe-kicker">Migration</div>
    <h1>Kupe App is now Kupe Hub</h1>

    <p>
      REST moves to <code>[https://x.kupe.in](https://x.kupe.in)</code>. Console moves to
      <code>[https://hub.kupe.in](https://hub.kupe.in)</code>. Auth is Bearer <code>sk-kupe-...</code>.
    </p>
  </div>
</div>

<Warning>
  **From 15 September 2026**, `app.kupe.in` becomes part of **Kupe Hub** at [`hub.kupe.in`](https://hub.kupe.in). Finish rewriting clients before then — App keys and UUIDs do not work on Hub.
</Warning>

<Note>
  **`hub.kupe.in` is the console**, not the REST host. APIs and WebSockets live on **`x.kupe.in`**.
</Note>

## At a glance

|            | Kupe App                     | Kupe Hub                                                                 |
| ---------- | ---------------------------- | ------------------------------------------------------------------------ |
| REST       | `https://api.kupe.in`        | `https://x.kupe.in`                                                      |
| Console    | `https://app.kupe.in`        | [`https://hub.kupe.in`](https://hub.kupe.in)                             |
| Auth       | `x-api-key: …`               | `Authorization: Bearer sk-kupe-…`                                        |
| Agent body | Nested `agent` + configs     | Flat `name`, `system_prompt`, `greeting`, `config.*`                     |
| IDs        | UUIDs                        | Prefixed (`agt_`, `org_`, `prj_`, `tel_`, …)                             |
| Outbound   | `POST /api/call/create_call` | One-contact [batch](/guides/campaigns)                                   |
| Inbound    | `POST /api/v1/phone/mapping` | [Inbound deployment](/guides/inbound)                                    |
| SDK / MCP  | None first-party             | [`kupe`](/sdk/python) · [`kupe-sdk`](/sdk/typescript) · [MCP](/kupe-mcp) |

## Headers (diff)

```diff theme={"theme":{"light":"github-light","dark":"github-dark"}}
- GET https://api.kupe.in/api/v1/agents
- x-api-key: YOUR_APP_KEY
+ GET https://x.kupe.in/v1/me
+ Authorization: Bearer sk-kupe-YOUR_KEY
```

## Auth response (diff)

```diff theme={"theme":{"light":"github-light","dark":"github-dark"}}
- // App: profile / consent blob
- { "id": "<uuid>", "email": "...", ... }
+ // Hub: scope for every later call
+ { "auth": "api_key", "org_id": "org_...", "project_id": "prj_...", "user_id": null }
```

## Rewrite order

1. Create a Hub account + project API key — [Authentication](/auth).
2. Point the base URL at `https://x.kupe.in` (SDKs join `/v1`).
3. Recreate the agent — [Agents](/migrate/agents), [Prompting](/guides/prompting).
4. Attach numbers + KYC / inbound — [Phones](/migrate/phones), [Inbound](/migrate/inbound).
5. Replace `create_call` with a campaign / batch — [Campaigns](/migrate/campaigns).
6. Move tools to org tools — [Tools](/migrate/tools).
7. Point browsers at [Realtime](/realtime), not App media sockets.

## Prefer the SDK

Kupe App had no first-party SDK. On Hub, use **Python first** (`pip install kupe`), or **npm** (`kupe-sdk`) if you are on TypeScript. Both talk to `https://x.kupe.in` with `KUPE_API_KEY` / `sk-kupe-...`. Full guides: [Python](/sdk/python) · [TypeScript](/sdk/typescript).

<CodeGroup>
  ```bash Python theme={"theme":{"light":"github-light","dark":"github-dark"}}
  pip install kupe
  ```

  ```bash npm theme={"theme":{"light":"github-light","dark":"github-dark"}}
  npm install kupe-sdk
  ```

  ```python Python theme={"theme":{"light":"github-light","dark":"github-dark"}}
  from kupe import Kupe

  client = Kupe()  # KUPE_API_KEY=sk-kupe-...
  me = client.me()
  # me.org_id, me.project_id — use these on every rewrite
  ```

  ```typescript TypeScript theme={"theme":{"light":"github-light","dark":"github-dark"}}
  import { Kupe } from "kupe-sdk";

  const kupe = new Kupe(); // KUPE_API_KEY or constructor key
  const me = await kupe.me();
  ```
</CodeGroup>

IDE agents can use [Kupe MCP](/kupe-mcp) (`http://mcp.kupe.in/mcp`) with the same key instead of hand-writing cURL.

<CardGroup cols={2}>
  <Card title="Hosts and auth" icon="key" href="/migrate/hosts-auth">
    Hosts, headers, `GET /v1/me`.
  </Card>

  <Card title="Agents" icon="bot" href="/migrate/agents">
    Nested App body → flat Hub `AgentBody`.
  </Card>

  <Card title="Realtime and PSTN" icon="audio-lines" href="/migrate/realtime">
    `create_call` → sessions and batches.
  </Card>

  <Card title="Phones, KYC, UCC" icon="smartphone" href="/migrate/phones">
    Telephony accounts, India KYC, UCC.
  </Card>

  <Card title="Full path catalog" icon="table" href="/migrate/paths-agents">
    Every App path → Hub replacement.
  </Card>

  <Card title="No 1:1" icon="circle-off" href="/migrate/paths-no-equivalent">
    Workflows, WhatsApp, n8n, admin retirements.
  </Card>
</CardGroup>
