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

# Quickstart

> Make your first API call in under 5 minutes

This guide walks you through making your first Relayer API call. You will verify connectivity with the health endpoint, then make an authenticated request.

## Prerequisites

* An API key from your operator dashboard (see [Authentication](/get-started/authentication))
* `curl` or Node.js installed

## Environments

Relayer provides two environments. Choose the one that matches your stage:

| Environment    | Base URL                        | Use for                 |
| -------------- | ------------------------------- | ----------------------- |
| **Sandbox**    | `https://testnet.relayer.fi/v1` | Testing and development |
| **Production** | `https://api.relayer.fi/v1`     | Live operations         |

<Warning>
  Sandbox runs on Render — the first request after idle may take 30-60 seconds to cold-start.
</Warning>

## Step 1: Verify connectivity

Start with the unauthenticated root endpoint to confirm the API is reachable.

<Tabs>
  <Tab title="Sandbox">
    <CodeGroup>
      ```bash cURL theme={null}
      curl https://testnet.relayer.fi/v1/
      ```

      ```typescript Node.js theme={null}
      const response = await fetch("https://testnet.relayer.fi/v1/");
      const data = await response.json();
      console.log(data);
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Production">
    <CodeGroup>
      ```bash cURL theme={null}
      curl https://api.relayer.fi/v1/
      ```

      ```typescript Node.js theme={null}
      const response = await fetch("https://api.relayer.fi/v1/");
      const data = await response.json();
      console.log(data);
      ```
    </CodeGroup>
  </Tab>
</Tabs>

You should receive a `200` with a basic service descriptor.

## Step 2: Set up your environment

Store your API key and base URL as environment variables:

<Tabs>
  <Tab title="Sandbox">
    <CodeGroup>
      ```bash Terminal theme={null}
      export RELAYER_BASE_URL="https://testnet.relayer.fi/v1"
      export RELAYER_API_KEY="rk_client_key_v1_your_key_here"
      ```

      ```text .env file theme={null}
      RELAYER_BASE_URL=https://testnet.relayer.fi/v1
      RELAYER_API_KEY=rk_client_key_v1_your_key_here
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Production">
    <CodeGroup>
      ```bash Terminal theme={null}
      export RELAYER_BASE_URL="https://api.relayer.fi/v1"
      export RELAYER_API_KEY="rk_client_key_v1_your_production_key"
      ```

      ```text .env file theme={null}
      RELAYER_BASE_URL=https://api.relayer.fi/v1
      RELAYER_API_KEY=rk_client_key_v1_your_production_key
      ```
    </CodeGroup>
  </Tab>
</Tabs>

## Step 3: Make an authenticated request

Now make an authenticated call. This example lists the wallets in your workspace — a safe, read-only operation that confirms auth, scope, and module activation in one go.

<CodeGroup>
  ```bash cURL theme={null}
  curl -X GET $RELAYER_BASE_URL/signing/wallets \
    -H "Authorization: ApiKey $RELAYER_API_KEY" \
    -H "Content-Type: application/json"
  ```

  ```typescript Node.js theme={null}
  const baseUrl = process.env.RELAYER_BASE_URL;
  const apiKey = process.env.RELAYER_API_KEY;

  const response = await fetch(`${baseUrl}/signing/wallets`, {
    headers: {
      Authorization: `ApiKey ${apiKey}`,
      "Content-Type": "application/json",
    },
  });

  const result = await response.json();
  console.log(JSON.stringify(result, null, 2));
  ```

  ```python Python theme={null}
  import os, requests

  base_url = os.environ["RELAYER_BASE_URL"]
  api_key = os.environ["RELAYER_API_KEY"]

  response = requests.get(
      f"{base_url}/signing/wallets",
      headers={
          "Authorization": f"ApiKey {api_key}",
          "Content-Type": "application/json",
      },
  )
  print(response.json())
  ```
</CodeGroup>

A successful response looks like:

```json theme={null}
{
  "success": true,
  "message": "Wallets retrieved",
  "data": [],
  "statusCode": 200,
  "timestamp": "2026-05-15T12:00:00.000Z",
  "path": "/v1/signing/wallets"
}
```

<Tip>
  An empty `data` array is expected on a fresh workspace. It means the API authenticated your request successfully — you just haven't created any wallets yet.
</Tip>

## Step 4: Explore the Kits

Now that you are authenticated, explore the Kit that matches your use case:

<CardGroup cols={2}>
  <Card title="Signing Kit" icon="key" href="/signing/overview">
    Create self-custodial wallets and sign transactions with passkeys.
  </Card>

  <Card title="Payout Kit" icon="money-bill-transfer" href="/payout/overview">
    Set up fiat on/off-ramp rails and manage recipients.
  </Card>

  <Card title="Agent Kit" icon="robot" href="/agent/overview">
    Ship budget-enforced AI agents that can sign and pay for resources.
  </Card>

  <Card title="Widget Kit" icon="window-restore" href="/widget/overview">
    Embed canonical swap, transfer, and crosschain widgets in your app.
  </Card>
</CardGroup>

## Troubleshooting

| Problem              | Solution                                                                                                     |
| -------------------- | ------------------------------------------------------------------------------------------------------------ |
| `Connection refused` | Check `RELAYER_BASE_URL` — sandbox: `https://testnet.relayer.fi/v1`, production: `https://api.relayer.fi/v1` |
| `401 Unauthorized`   | Verify your `Authorization` header uses `ApiKey` prefix (not `Bearer`)                                       |
| `404 Not Found`      | Check the endpoint path starts with `/v1/`                                                                   |
| Slow first response  | Sandbox cold-starts after idle (30-60s). Production does not have this delay.                                |
