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

# Introduction

> Card Partners API for issuing and managing virtual cards

The Card Partners API lets you issue virtual cards, manage users, fund and withdraw from cards, and track transactions — all through a single integration.

## Base URL

| Environment | URL                                       |
| ----------- | ----------------------------------------- |
| Staging     | `https://services-staging.getplu.com/api` |
| Production  | `https://services.getplu.com/api`         |

## Core Concepts

### Partner Isolation

Every API call is scoped to your partner account. You can only access users, cards, and transactions that belong to you. This isolation is enforced at the API layer — no cross-partner data access is possible.

### Service IDs

Resources are identified by **service IDs** rather than internal database IDs:

| Resource    | Format                           | Example                         |
| ----------- | -------------------------------- | ------------------------------- |
| User        | `{slug}-user-{uid}`              | `acme-user-abc123def456ghi`     |
| Card        | `{slug}-card-{uid}`              | `acme-card-xyz789jkl012mno`     |
| Transaction | `{slug}-card-transactions-{uid}` | `acme-card-transactions-pqr345` |

Use these IDs in all API calls and store them on your end for reference.

### Idempotency

All mutating endpoints (POST, DELETE) require an `idempotency-key` header to prevent duplicate operations:

```bash theme={null}
idempotency-key: 550e8400-e29b-41d4-a716-446655440000
```

If you retry a request with the same idempotency key and body, the API returns a `400` error indicating the key was already used. Keys expire after 5 minutes.

## Response Format

All responses follow the same shape:

```json Success theme={null}
{
  "status": "success",
  "message": "Operation completed",
  "data": { }
}
```

```json Error theme={null}
{
  "status": "error",
  "message": "ERROR_CODE",
  "data": {
    "error": "Human-readable error description"
  }
}
```

## Integration Flow

<Steps>
  <Step title="Get your API key">
    Obtain your API key (prefixed `sk_staging_` or `sk_live_`) from your partner dashboard.
  </Step>

  <Step title="Configure webhooks">
    Set your webhook URL via [Set Webhook](/api-reference/profile/set-webhook) to receive event notifications.
  </Step>

  <Step title="Create users">
    Create users via the [Create User](/api-reference/users/create-user) endpoint. Users go through Persona KYC verification.
  </Step>

  <Step title="Issue cards">
    Once a user is KYC-approved, [create a card](/api-reference/cards/create-card) for them. Choose a funding type:

    * **Float** (default) — fund from your partner wallet via API
    * **Crypto** — card gets a stablecoin deposit address for on-chain funding, plus the list of [supported networks](/webhooks#supported-networks) it can be funded on
  </Step>

  <Step title="Fund and manage">
    [Fund cards](/api-reference/cards/fund-card) (float cards only), [withdraw](/api-reference/cards/withdraw-card), [freeze/unfreeze](/api-reference/cards/switch-status), and [track transactions](/api-reference/transactions/list-transactions). Crypto cards are funded by on-chain stablecoin deposits to the card's deposit address.
  </Step>
</Steps>
