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

# Verify an Address

> End-to-end walkthrough for verifying address control using a signature or small deposit.

<Warning>Address verification is in **Developer Preview**. Endpoints and schemas are subject to change. To participate, contact [Paxos Support](https://support.paxos.com).</Warning>

This guide covers both verification methods. Both flows use the same authentication step, so one access token covers the full walkthrough.

Use this guide when your application verifies addresses directly or when a third-party wallet collects signatures on behalf of its users.

## Before You Begin

* A [Sandbox account](https://account.sandbox.paxos.com) with API credentials (Client ID and Client Secret)
* The `address_ownership:read_verification` and `address_ownership:write_verification` scopes enabled on your credentials. See [API Credentials](/guides/developer/credentials).
* The blockchain address you want to verify and its `network`
* For `SIGNATURE`: a way for the address holder to sign the Paxos message
* For `SMALL_DEPOSIT`: a way for the address holder or custodian to send a transaction from the address

## Who Does What

| Role                            | Responsibility                                                                                                                                                  |
| ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Paxos customer or API caller    | Authenticates with Paxos, creates the verification record, sends the signing details to the wallet or user, submits the returned signature, and polls status.   |
| Wallet or third-party collector | Shows the exact Paxos message to the address holder, collects the signature, and returns it to the API caller. Paxos credentials are not required.              |
| Address holder                  | Signs the exact message with the wallet that controls the address, or sends the small deposit from the address. Private keys and seed phrases are never shared. |

## Authenticate

Add the `address_ownership:read_verification` and `address_ownership:write_verification` scopes to your [Sandbox account](https://account.sandbox.paxos.com) under [API Management](https://account.sandbox.paxos.com/admin/api), then authenticate.

```bash theme={null}
curl --location 'https://oauth.sandbox.paxos.com/oauth2/token' \
  --form grant_type=client_credentials \
  --form client_id={client_id} \
  --form client_secret={client_secret} \
  --form scope='address_ownership:read_verification address_ownership:write_verification'
```

Save the `access_token` from the response. You will use it in every subsequent request.

```json theme={null}
{
  "access_token": "{access_token}",
  "expires_in": 3599,
  "scope": "address_ownership:read_verification address_ownership:write_verification",
  "token_type": "bearer"
}
```

## Signature Flow

Use this flow when the address holder can sign a message with the wallet that controls the address. This is the recommended flow for wallet integrations because it does not require an on-chain transaction.

* Authenticate (above)
* Create a verification to get the message to sign
* Send the verification details to the wallet or user
* Collect the signature and submit it via [Submit Signature](/api-reference/endpoints/address-verification/submit-signature)

### 1. Create a Verification

<Tabs>
  <Tab title="EVM">
    Covers Ethereum, Ink, XLayer, Arbitrum One, and Robinhood Chain.

    ```bash theme={null}
    curl --location --request POST 'https://api.sandbox.paxos.com/v2/addresses/verifications' \
      --header 'Authorization: Bearer {access_token}' \
      --header 'Content-Type: application/json' \
      --data '{
        "network": "ETHEREUM",
        "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
        "verification_method": "SIGNATURE",
        "ref_id": "my-idempotency-key-001"
      }'
    ```

    The response contains `signature_verification.message`, the exact string to sign, and `signature_verification.nonce`, which is embedded in that message.

    ```json theme={null}
    {
      "id": "01934abc-def0-7890-abcd-ef0123456789",
      "network": "ETHEREUM",
      "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
      "verification_method": "SIGNATURE",
      "status": "PENDING",
      "signature_verification": {
        "message": "Paxos Address Ownership Verification\nNonce: a1b2c3d4\nIssued At: 2026-05-19T12:00:00Z",
        "nonce": "a1b2c3d4",
        "signature": ""
      },
      "created_at": "2026-05-19T12:00:00Z",
      "updated_at": "2026-05-19T12:00:00Z",
      "expires_at": "2026-05-21T12:00:00Z"
    }
    ```

    Save the `id`, `signature_verification.message`, `network`, `address`, and `expires_at`.
  </Tab>

  <Tab title="Solana">
    ```bash theme={null}
    curl --location --request POST 'https://api.sandbox.paxos.com/v2/addresses/verifications' \
      --header 'Authorization: Bearer {access_token}' \
      --header 'Content-Type: application/json' \
      --data '{
        "network": "SOLANA",
        "address": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
        "verification_method": "SIGNATURE",
        "ref_id": "my-idempotency-key-002"
      }'
    ```

    The response structure is identical to EVM. Sign `message` using ed25519 instead of EIP-191.

    ```json theme={null}
    {
      "id": "01934abc-def0-7890-abcd-ef0123456790",
      "network": "SOLANA",
      "address": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
      "verification_method": "SIGNATURE",
      "status": "PENDING",
      "signature_verification": {
        "message": "Paxos Address Ownership Verification\nNonce: b3c4d5e6\nIssued At: 2026-05-19T12:00:00Z",
        "nonce": "b3c4d5e6",
        "signature": ""
      },
      "created_at": "2026-05-19T12:00:00Z",
      "updated_at": "2026-05-19T12:00:00Z",
      "expires_at": "2026-05-21T12:00:00Z"
    }
    ```

    Save the `id`, `signature_verification.message`, `network`, `address`, and `expires_at`.
  </Tab>
</Tabs>

### 2. Collect the Signature

Send the signing details to the wallet or user. Do not send Paxos client credentials, client secrets, or OAuth tokens to a wallet frontend or third-party collector.

```json theme={null}
{
  "verification_id": "01934abc-def0-7890-abcd-ef0123456789",
  "network": "ETHEREUM",
  "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
  "message": "Paxos Address Ownership Verification\nNonce: a1b2c3d4\nIssued At: 2026-05-19T12:00:00Z",
  "expires_at": "2026-05-21T12:00:00Z"
}
```

The wallet must sign `message` exactly as returned by Paxos, including casing, spacing, and line breaks.

<Info>
  The signed message verifies control of the address for the requested Paxos use case. It is not an on-chain transaction and does not authorize movement of funds.
</Info>

### 3. Submit the Signature

After the wallet or address holder returns the signature, submit it to Paxos with the verification `id`.

**Signing standards:**

* **EVM networks** (Ethereum, Ink, XLayer, Arbitrum One, Robinhood Chain): EIP-191 `personal_sign`. Most wallets and libraries (ethers.js, viem, web3.py) expose this as `signMessage`.
* **Solana**: ed25519. Sign the message bytes with `nacl.sign.detached` or equivalent.

Pass the verification `id` and the collected `signature` in the request body.

```bash theme={null}
curl --location --request POST \
  'https://api.sandbox.paxos.com/v2/addresses/verifications/signature' \
  --header 'Authorization: Bearer {access_token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "id": "01934abc-def0-7890-abcd-ef0123456789",
    "signature": "0x1b9b6f1a2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a1b"
  }'
```

If the signature is valid, `status` moves to `APPROVED` immediately.

```json theme={null}
{
  "id": "01934abc-def0-7890-abcd-ef0123456789",
  "network": "ETHEREUM",
  "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
  "verification_method": "SIGNATURE",
  "status": "APPROVED",
  "signature_verification": {
    "message": "Paxos Address Ownership Verification\nNonce: a1b2c3d4\nIssued At: 2026-05-19T12:00:00Z",
    "nonce": "a1b2c3d4",
    "signature": "0x1b9b6f1a2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a1b"
  },
  "created_at": "2026-05-19T12:00:00Z",
  "updated_at": "2026-05-19T12:05:00Z",
  "expires_at": "2026-05-21T12:00:00Z"
}
```

<Tip>
  If the signature doesn't verify, the verification stays `PENDING`. Call this endpoint again with a corrected signature.
</Tip>

## Small Deposit Flow

Use this flow when the address holder cannot sign a message, for example if the address is held by a custodian or a hardware wallet that doesn't support the Paxos message format.

* Authenticate (above)
* Create a verification to get the deposit address and amount
* Send exactly the specified amount from the address under verification
* Poll until the verification approves

### 1. Create a Verification

```bash theme={null}
curl --location --request POST 'https://api.sandbox.paxos.com/v2/addresses/verifications' \
  --header 'Authorization: Bearer {access_token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "network": "ETHEREUM",
    "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
    "verification_method": "SMALL_DEPOSIT",
    "ref_id": "my-idempotency-key-003"
  }'
```

The response tells you where to send funds. The details are under `small_deposit_verification`.

```json theme={null}
{
  "id": "01934abc-def0-7890-abcd-ef0123456791",
  "network": "ETHEREUM",
  "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
  "verification_method": "SMALL_DEPOSIT",
  "status": "PENDING",
  "small_deposit_verification": {
    "deposit_address": "0xPaxosControlledAddress123456789abcdef01234",
    "amount": "0.000001",
    "asset": "ETH"
  },
  "created_at": "2026-05-19T12:00:00Z",
  "updated_at": "2026-05-19T12:00:00Z",
  "expires_at": "2026-05-21T12:00:00Z"
}
```

Send exactly `small_deposit_verification.amount` on-chain from `0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045` to the `deposit_address`. Paxos checks both the sender and the amount. No further API call is needed.

<Tip>
  If the deposit isn't detected, you can send again from the same address within the 48-hour window.
</Tip>

### 2. Poll for Status

Poll [Get Address Verification](/api-reference/endpoints/address-verification/get-verification) until `status` is no longer `PENDING`.

```bash theme={null}
curl --location \
  'https://api.sandbox.paxos.com/v2/addresses/verifications/01934abc-def0-7890-abcd-ef0123456791' \
  --header 'Authorization: Bearer {access_token}'
```

```json theme={null}
{
  "id": "01934abc-def0-7890-abcd-ef0123456791",
  "network": "ETHEREUM",
  "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
  "verification_method": "SMALL_DEPOSIT",
  "status": "APPROVED",
  "small_deposit_verification": {
    "deposit_address": "0xPaxosControlledAddress123456789abcdef01234",
    "amount": "0.000001",
    "asset": "ETH",
    "transaction_hash": "0xabc123def456..."
  },
  "created_at": "2026-05-19T12:00:00Z",
  "updated_at": "2026-05-19T12:18:43Z",
  "expires_at": "2026-05-21T12:00:00Z"
}
```

| `status`   | Meaning                     | Next step                           |
| ---------- | --------------------------- | ----------------------------------- |
| `PENDING`  | In progress                 | Poll again                          |
| `APPROVED` | Address control confirmed   | Done                                |
| `EXPIRED`  | Verification window elapsed | Create a new verification and retry |

## What to Expect

| Method          | Time to approval                             | Notes                                                                                                                                                |
| --------------- | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| `SIGNATURE`     | Immediate                                    | Approves the moment a valid signature is submitted                                                                                                   |
| `SMALL_DEPOSIT` | A few minutes                                | Depends on on-chain confirmation time for your network                                                                                               |
| `MANUAL`        | Contact [Support](https://support.paxos.com) | Handled off-platform for additional verification requirements that have not yet been automated. It is not created or expired through the public API. |

<Tip>
  For `SMALL_DEPOSIT`, poll [Get Address Verification](/api-reference/endpoints/address-verification/get-verification) every 10-15 seconds after sending your transaction. Paxos detects the deposit as soon as it confirms on-chain.
</Tip>

## Idempotency

Use `ref_id` to make verification creation safe to retry. If a request times out before you get a response, resend it with the same `ref_id` and Paxos returns the existing verification instead of creating a new one.

`ref_id` is scoped to your account. The same value can be used across different accounts without conflict.

## List Verifications

Use [List Address Verifications](/api-reference/endpoints/address-verification/list-verifications) to retrieve verification records, with optional filters.

```bash theme={null}
curl --location \
  'https://api.sandbox.paxos.com/v2/addresses/verifications?order=DESC' \
  --header 'Authorization: Bearer {access_token}'
```

```json theme={null}
{
  "items": [
    {
      "id": "01934abc-def0-7890-abcd-ef0123456789",
      "network": "ETHEREUM",
      "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
      "verification_method": "SIGNATURE",
      "status": "PENDING",
      "ref_id": "my-idempotency-key-001",
      "signature_verification": {
        "message": "Paxos Address Ownership Verification\nNonce: a1b2c3d4\nIssued At: 2026-05-19T12:00:00Z",
        "nonce": "a1b2c3d4",
        "signature": ""
      },
      "created_at": "2026-05-19T12:00:00Z",
      "updated_at": "2026-05-19T12:00:00Z",
      "expires_at": "2026-05-21T12:00:00Z"
    },
    {
      "id": "01934abc-def0-7890-abcd-ef0123456791",
      "network": "ETHEREUM",
      "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
      "verification_method": "SMALL_DEPOSIT",
      "status": "PENDING",
      "ref_id": "my-idempotency-key-003",
      "small_deposit_verification": {
        "deposit_address": "0xPaxosControlledAddress123456789abcdef01234",
        "amount": "0.000001",
        "asset": "ETH",
        "transaction_hash": ""
      },
      "created_at": "2026-05-19T11:00:00Z",
      "updated_at": "2026-05-19T11:00:00Z",
      "expires_at": "2026-05-21T11:00:00Z"
    }
  ],
  "next_page_cursor": ""
}
```

Supported query filters: `status`, `verification_method`, `network`, `address`, `created_at.gte`, `created_at.lte`, `created_at.gt`, `created_at.lt`, `order`, `limit`, `page_cursor`.

> Questions? Contact [Support](https://support.paxos.com).
