> For the complete documentation index, see [llms.txt](https://docs.2checkout.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.2checkout.com/soap-api-reference/soap-api-6.0/api-requests/retrieve-unitokens-list.md).

# Retrieve UniTokens list

Use the **listUniTokens** method to return a paginated list of UniTokens associated with a customer.

At least one of **CustomerReference** or **ExternalCustomerReference** must be provided. If both are provided, they must belong to the same customer record. Requires the UNITOKEN feature to be enabled for the account.

## Request parameters <a href="#request-parameters" id="request-parameters"></a>

<table><thead><tr><th width="150">Parameter</th><th>Type / Description</th></tr></thead><tbody><tr><td><code>sessionID</code></td><td><p><strong>Required (string)</strong></p><p>Session identifier, the output of the Login method. Include sessionID into all your requests. The sessionID expires in 10 minutes.</p></td></tr><tr><td><code>CustomerReference</code></td><td><p><strong>Required if ExternalCustomerReference is not provided (string)</strong></p><p>The 2Checkout internal customer ID (AVANGATE_CUSTOMER_ID).</p></td></tr><tr><td><code>ExternalCustomerReference</code></td><td><p><strong>Required if CustomerReference is not provided (string)</strong></p><p>The external customer ID set by the merchant (EXTERNAL_CUSTOMER_ID).</p></td></tr><tr><td><code>Page</code></td><td><p><strong>Optional (integer)</strong></p><p>Page number for pagination. Default value is 1.</p></td></tr><tr><td><code>Limit</code></td><td><p><strong>Optional (integer)</strong></p><p>Number of results per page. Default value is 100. Maximum value is 1000.</p></td></tr></tbody></table>

### Request sample <a href="#request-example" id="request-example"></a>

```php
<?php

declare(strict_types=1);

class Configuration
{
    public const MERCHANT_CODE = 'MERCHANT_CODE';
    public const MERCHANT_KEY = 'SECRET_KEY';
    public const URL = 'https://api.2checkout.com/soap/6.0';
    public const ACTION = 'listUniTokens';
    //array or JSON
    public const PAYLOAD = <<<JSON
{
    "CustomerReference": "12345",
    "ExternalCustomerReference": null,
    "Page": 1,
    "Limit": 10
}
JSON;
}
class Client
{
    public function call(
        string $url = Configuration::URL,
        $payload = Configuration::PAYLOAD,
        string $action = Configuration::ACTION
    ): ?object {
        if (is_array($payload)) {
            $payload = json_encode($payload);
        }
        if (!empty($payload)) {
            // SoapClient works with objects(StdClass)
            $payload = json_decode($payload);
        }
        $soapClient = $this->getClient($url);
        $sessionId = $this->getSession($soapClient);
        $args = array_filter([$sessionId, $payload]);
        return $soapClient->$action(...$args);
    }

    public function getClient(string $url): SoapClient
    {
        return new SoapClient(
            $url.'?wsdl',
            [
                'location' => $url,
                'cache_wsdl' => WSDL_CACHE_NONE,
            ]
        );
    }

    public function getSession(SoapClient $client)
    {
        $date = gmdate('Y-m-d H:i:s');
        $merchantCode = Configuration::MERCHANT_CODE;
        $key = Configuration::MERCHANT_KEY;
        $string = strlen($merchantCode).$merchantCode.strlen($date).$date;
        $algo = 'sha256';
        $hash = hash_hmac($algo, $string, $key);
        $client->__setCookie('XDEBUG_SESSION', 'PHPSTORM');
        return $client->login($merchantCode, $date, $hash, $algo);
    }
}
try {
    $client = new Client();
    var_dump($client->call());
} catch (Exception $ex) {
    var_dump($ex);
}
```

### Response sample <a href="#response-example" id="response-example"></a>

```php
{
    "UniTokens": [
      {
        "UniToken": "550e8400-e29b-41d4-a716-446655440000",
        "PaymentType": "CC",
        "CardBrand": "VISA",
        "CardFirst4Digits": "4111",
        "CardLast4Digits": "1111"
      },
      {
        "UniToken": "660f9500-f30c-52e5-b827-557766550001",
        "PaymentType": "GOOGLEPAY",
        "CardBrand": null,
        "CardFirst4Digits": null,
        "CardLast4Digits": null
      }
    ],
    "Pagination": {
      "Page": 1,
      "Limit": 100,
      "Count": 2
    }
  }

```

| Error                           | Description                                                                 |
| ------------------------------- | --------------------------------------------------------------------------- |
| UNITOKEN\_FEATURE\_NOT\_ENABLED | The UNITOKEN feature is not enabled for the merchant account                |
| CUSTOMER\_REFERENCE\_REQUIRED   | Neither CustomerReference nor ExternalCustomerReference was provided        |
| CUSTOMER\_REFERENCE\_MISMATCH   | Both references were provided but they belong to different customer records |
| UNITOKEN\_VALIDATION\_ERROR     | Page or Limit failed validation (e.g. Page < 1, Limit > 1000)               |


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.2checkout.com/soap-api-reference/soap-api-6.0/api-requests/retrieve-unitokens-list.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
