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

# REST API

> The recommended way to create and sign with wallets from your backend — pregenerated user wallets, agent wallets, and server-side signing over plain HTTP

Para's REST API lets your backend create wallets and sign over HTTP. Two interfaces sit on top of the same API. Pick the one that fits your stack:

<CardGroup cols={2}>
  <Card title="REST SDK — @getpara/rest-sdk" href="/v3/rest/sdk" description="Typed TypeScript client with ethers, viem, and Solana signer adapters. The default for Node and other server runtimes." horizontal />

  <Card title="Raw HTTP API" href="/v3/rest/api/wallets" description="Call the endpoints directly with fetch or cURL. Send live requests right from the interactive API reference." horizontal />
</CardGroup>

<div className="flex flex-wrap gap-2 my-2">
  <a href="/v3/rest/api/wallets" className="inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium text-zinc-700 dark:text-zinc-200 rounded-xl border border-zinc-200 dark:border-zinc-800 bg-gradient-to-b from-white to-zinc-50 dark:from-zinc-800 dark:to-zinc-900 shadow-xs hover:shadow-sm hover:border-zinc-300 dark:hover:border-zinc-700 transition-all">
    <Icon icon="play" size={18} className="text-primary" />

    <span>Try it in the API reference</span>
  </a>

  <a href="/openapi.yaml" download="para-rest-api.yaml" className="inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium text-zinc-700 dark:text-zinc-200 rounded-xl border border-zinc-200 dark:border-zinc-800 bg-gradient-to-b from-white to-zinc-50 dark:from-zinc-800 dark:to-zinc-900 shadow-xs hover:shadow-sm hover:border-zinc-300 dark:hover:border-zinc-700 transition-all">
    <Icon icon="file-code" size={18} className="text-primary" />

    <span>Download OpenAPI Spec</span>
  </a>
</div>

## Prerequisites

To use Para REST, you need an API key. It authenticates every request through the `X-API-Key` header.

<Warning>
  Don't have an API key yet? Request access to the [Developer Portal](https://developer.getpara.com) to create API keys, manage billing, teams, and more.
</Warning>

<Warning>
  You can restrict Para REST to specific IPs by adding CIDR entries in the [Developer Portal](https://developer.getpara.com). Once you add them, requests from other IPs return `401 Unauthorized`.
</Warning>

<Danger>
  **Protect your API key.** REST API wallets are permanently scoped to the project that created them. If you lose access
  to your API key, you can rotate it safely. Deleting the project or creating a new one means losing wallet access.
  See [Setup → Authentication](/v3/rest/setup#authentication) for details.
</Danger>

## When to Use

* **Programmatic wallets:** the default path for new server-created or pre-created wallet integrations.
* **Any secp256k1 or ed25519 chain:** the `sign-raw` endpoint is chain-agnostic. Create an EVM wallet for secp256k1 signing (works with Bitcoin, etc.) or a Solana/Stellar wallet for ed25519 signing, then hash and serialize transactions on your side.
* Your backend needs wallets and you prefer REST semantics over share-backed SDK ceremonies.
* You already rely on secret-key auth + IP allowlists.
* You prefer cURL or language-native HTTP clients over SDKs.

## Wallet lifecycle

REST-created wallets are pre-created wallets. The difference is the integration surface: REST creates and signs through HTTP, while SDK pregen creates wallets through SDK share-management flows.

| Phase             | REST behavior                                                                                            |
| ----------------- | -------------------------------------------------------------------------------------------------------- |
| Create            | Your backend calls `POST /v1/wallets` with `type`, `userIdentifier`, and `userIdentifierType`.           |
| Sign before claim | Your backend signs with REST while the wallet is still project-controlled.                               |
| Track broadcasts  | `transfer` and `sign-transaction` with `broadcast: true` return `transactionId` for polling or webhooks. |
| Claim             | A user can claim the wallet through a client SDK flow if the identifier matches.                         |
| After claim       | REST signing stops because the wallet is now user-owned. Use client SDK flows instead.                   |

## Endpoint coverage

| Endpoint                      | EVM | Solana | Cosmos | Stellar | Notes                                                                      |
| ----------------------------- | --- | ------ | ------ | ------- | -------------------------------------------------------------------------- |
| `POST /v1/wallets`            | Yes | Yes    | Yes    | Yes     | Creates a project-controlled wallet.                                       |
| `sign-raw`                    | Yes | Yes    | Yes    | Yes     | Signs raw hex bytes.                                                       |
| `sign-message`                | Yes | Yes    | Yes    | Yes     | EVM uses EIP-191. Other wallet types sign UTF-8 bytes.                     |
| `sign-transaction`            | Yes | Yes    | No     | Yes     | EVM and Solana can broadcast with `broadcast: true`. Stellar is sign-only. |
| `sign-typed-data`             | Yes | No     | No     | No      | EIP-712 only.                                                              |
| `sign-authorization`          | Yes | No     | No     | No      | EIP-7702 only.                                                             |
| `transfer` and `estimate-fee` | Yes | Yes    | No     | No      | Builds transfer transactions for supported chains.                         |

## Wallet Claiming

When a user signs up through your app with the same identifier used to create the wallet (e.g., the same email), the wallet is automatically claimed and transferred to their account. No server-side action is needed. For details on the client-side flow, see the [Web Pregeneration guide](/v3/react/guides/pregen#claiming-a-pregenerated-wallet).

## Next Steps

<CardGroup cols={2}>
  <Card title="REST SDK" imgUrl="/images/v3/general-server.png" href="/v3/rest/sdk" description="Typed TypeScript client and server-side signer adapters" />

  <Card title="Setup" imgUrl="/images/v3/general-server.png" href="/v3/rest/setup" description="Authentication and error handling" />

  <Card title="BYO auth" imgUrl="/images/v3/general-server.png" href="/v3/rest/byo-auth" description="Use REST with your own auth and client apps" />

  <Card title="Multi-Wallet Setup" imgUrl="/images/v3/general-server.png" href="/v3/rest/multi-wallet" description="Multiple wallets per user with CUSTOM_ID" />

  <Card title="Migrate from SDK Pregen" imgUrl="/images/v3/general-server.png" href="/v3/rest/migrate-from-sdk-pregen" description="Move existing SDK pregen wallets to the REST API" />

  <Card title="Raw HTTP Example" imgUrl="/images/v3/general-examples.png" href="https://github.com/getpara/examples-hub/tree/3.0.0/server/rest-with-node" description="Low-level Node.js fetch baseline" />
</CardGroup>
