> This is Payabli documentation. For a complete page index, fetch https://docs.payabli.com/llms.txt — append .md to any page URL for lightweight markdown. For section-level indexes, query parameters, and other AI-optimized access methods, see https://docs.payabli.com/ai-agents.md

# Manage PAX devices

> Learn how to set up, register, list, and unregister PAX devices with the Payabli API

The PAX A920 is Payabli's PAX device. This portable terminal accepts magnetic stripe, EMV chip, and NFC contactless payments. It processes transactions initiated through the Payabli Virtual Terminal or your integrated software. This guide covers how to set up, register, list, and unregister PAX devices through the API. For AXIUM devices, see [Manage AXIUM devices](/guides/pay-in-developer-devices-axium-manage).

Contact your Payabli solutions engineer to start the process of integrating with the PAX A920.

## Set up the device

When you receive your PAX A920 device, follow these instructions to unbox and get the device ready to register in Payabli.

When you receive your PAX A920 device, follow these instructions to unbox and get the device ready to register in Payabli.

#### Unbox the Device

The PAX A920 comes with a USB power cord and 3 rolls of receipt paper (one roll preinstalled).

#### Power the Device

1. Plug the device in to a power source. You can plug into a wall or a computer using the included USB power adapter.
2. Fully charge the device before turning it on.
3. When the device is charged, power it on by pressing and holding the small rectangle button on the right side of the device for 2 to 4 seconds.

#### Connect to WiFi

After the device boots up, it automatically launches the WSPLink app. You can't use your own apps with the PAX device

1. Exit the WSPLink app by pressing the top left and bottom right corners of the screen at the same time.
2. Open the **Settings** app.
3. Toggle WiFi on, then press **Wi-Fi**. The device will detect nearby WiFi networks.
4. Select the network you want to connect to, enter password, and allow the device to connect.

The PAX A920 connects only to 2.4Ghz WiFi networks, and can't connect to 5 GHz networks.

5. Press the circle icon at the bottom of the screen to go back to the home screen.

#### Let the Device Update

After the device connects to WiFi, it will cycle through updating the embedded software. This step can take up to 15 minutes, and the device may make some noises or alerts during this process.

Don't turn off the device, open any apps or disconnect WiFi during the update process.

When the updates have finished, the screen will be fully white.

#### Open WSPLink

WSPLink is the app that you use to make transactions. Press the WSPLink icon to open the app.

The screen may be blank or all white. This is normal. The screen lights up when a payment is sent to it.

#### Register the Device in Payabli

Now, you must register the device in Payabli before you can accept payments.

## Register a device

Send a POST request to `/api/Cloud/register/{entry}` to register a new PAX device. See the [API reference](/developers/api-reference/cloud/register-cloud-device) for this endpoint for full documentation.

The registration code is the serial number on the back of the device.

This example registers the device with the registration code `YS7DS5` to the `8cfec329267` paypoint, and gives it the description of "Front Desk POS".

### Request

POST [https://api-sandbox.payabli.com/api/Cloud/register/\{entry}](https://api-sandbox.payabli.com/api/Cloud/register/\{entry})

```curl
curl -X POST https://api-sandbox.payabli.com/api/Cloud/register/8cfec329267 \
     -H "Authorization: Bearer <token>" \
     -H "Content-Type: application/json" \
     -d '{
  "description": "Front Desk POS",
  "registrationCode": "YS7DS5"
}'
```

```typescript
import { PayabliClient } from "@payabli/sdk-node";

async function main() {
    const client = new PayabliClient();
    await client.cloud.addDevice("8cfec329267", {
        description: "Front Desk POS",
        registrationCode: "YS7DS5",
    });
}
main();

```

```python
from payabli import payabli

client = payabli()

client.cloud.add_device(
    entry="8cfec329267",
    description="Front Desk POS",
    registration_code="YS7DS5",
)

```

```java
package com.example.usage;

import io.github.payabli.api.PayabliApiClient;
import io.github.payabli.api.resources.cloud.requests.DeviceEntry;

public class Example {
    public static void main(String[] args) {
        PayabliApiClient client = PayabliApiClient
            .builder()
            .build();

        client.cloud().addDevice(
            "8cfec329267",
            DeviceEntry
                .builder()
                .description("Front Desk POS")
                .registrationCode("YS7DS5")
                .build()
        );
    }
}
```

```ruby
require "payabli"

client = Payabli::Client.new

client.cloud.add_device(
  entry: "8cfec329267",
  description: "Front Desk POS",
  registration_code: "YS7DS5"
)

```

```csharp
using PayabliApi;
using System.Threading.Tasks;

public partial class Examples
{
    public async Task Example() {
        var client = new PayabliApiClient();

        await client.Cloud.AddDeviceAsync(
            entry: "8cfec329267",
            request: new DeviceEntry {
                Description = "Front Desk POS",
                RegistrationCode = "YS7DS5"
            }
        );
    }

}

```

```go
package example

import (
    context "context"

    payabli "github.com/payabli/sdk-go"
    client "github.com/payabli/sdk-go/client"
)

func do() {
    client := client.NewClient()
    request := &payabli.DeviceEntry{
        Description: payabli.String(
            "Front Desk POS",
        ),
        RegistrationCode: payabli.String(
            "YS7DS5",
        ),
    }
    client.Cloud.AddDevice(
        context.TODO(),
        "8cfec329267",
        request,
    )
}

```

```php
<?php

namespace Example;

use Payabli\PayabliClient;
use Payabli\Cloud\Requests\DeviceEntry;

$client = new PayabliClient();
$client->cloud->addDevice(
    '8cfec329267',
    new DeviceEntry([
        'description' => 'Front Desk POS',
        'registrationCode' => 'YS7DS5',
    ]),
);

```

```swift
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "description": "Front Desk POS",
  "registrationCode": "YS7DS5"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api-sandbox.payabli.com/api/Cloud/register/8cfec329267")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

A successful registration returns a response with the device ID in the body.

### Response (200)

```json
{
  "responseText": "Success",
  "isSuccess": true,
  "responseData": "6c361c7d-674c-44cc-b790-382b75d1xxx"
}
```

## List devices

Send a GET request to `/api/Query/devices/{entry}` to retrieve the devices registered to a paypoint. For organization-wide results, use `/api/Query/devices/org/{orgId}`. The response includes every device model registered to the paypoint or organization; see [Devices overview](/guides/pay-in-devices-overview) for how to tell them apart.

This example lists devices for the `8cfec329267` paypoint.

### Request

GET [https://api-sandbox.payabli.com/api/Query/devices/\{entry}](https://api-sandbox.payabli.com/api/Query/devices/\{entry})

```curl
curl -G https://api-sandbox.payabli.com/api/Query/devices/8cfec329267 \
     -H "Authorization: Bearer <token>" \
     -d fromRecord=0 \
     -d limitRecord=20 \
     -d sortBy=desc(createdAt)
```

```typescript
import { PayabliClient } from "@payabli/sdk-node";

async function main() {
    const client = new PayabliClient();
    await client.query.listDevices("8cfec329267", {
        fromRecord: 0,
        limitRecord: 20,
        sortBy: "desc(createdAt)",
    });
}
main();

```

```python
from payabli import payabli

client = payabli()

client.query.list_devices(
    entry="8cfec329267",
    from_record=0,
    limit_record=20,
    sort_by="desc(createdAt)",
)

```

```java
package com.example.usage;

import io.github.payabli.api.PayabliApiClient;
import io.github.payabli.api.resources.query.requests.ListDevicesRequest;

public class Example {
    public static void main(String[] args) {
        PayabliApiClient client = PayabliApiClient
            .builder()
            .build();

        client.query().listDevices(
            "8cfec329267",
            ListDevicesRequest
                .builder()
                .fromRecord(0)
                .limitRecord(20)
                .sortBy("desc(createdAt)")
                .build()
        );
    }
}
```

```csharp
using PayabliApi;
using System.Threading.Tasks;

public partial class Examples
{
    public async Task Example() {
        var client = new PayabliApiClient();

        await client.Query.ListDevicesAsync(
            entry: "8cfec329267",
            request: new ListDevicesRequest {
                FromRecord = 0,
                LimitRecord = 20,
                SortBy = "desc(createdAt)"
            }
        );
    }

}

```

```go
package example

import (
    context "context"

    payabli "github.com/payabli/sdk-go"
    client "github.com/payabli/sdk-go/client"
)

func do() {
    client := client.NewClient()
    request := &payabli.ListDevicesRequest{
        FromRecord: payabli.Int(
            0,
        ),
        LimitRecord: payabli.Int(
            20,
        ),
        SortBy: payabli.String(
            "desc(createdAt)",
        ),
    }
    client.Query.ListDevices(
        context.TODO(),
        "8cfec329267",
        request,
    )
}

```

```php
<?php

namespace Example;

use Payabli\PayabliClient;
use Payabli\Query\Requests\ListDevicesRequest;

$client = new PayabliClient();
$client->query->listDevices(
    '8cfec329267',
    new ListDevicesRequest([
        'fromRecord' => 0,
        'limitRecord' => 20,
        'sortBy' => 'desc(createdAt)',
    ]),
);

```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api-sandbox.payabli.com/api/Query/devices/8cfec329267?fromRecord=0&limitRecord=20&sortBy=desc%28createdAt%29")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```swift
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api-sandbox.payabli.com/api/Query/devices/8cfec329267?fromRecord=0&limitRecord=20&sortBy=desc%28createdAt%29")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

The response returns matching devices in `Records` and aggregate totals in `Summary`. Use `Summary.totalRecords` and `Summary.totalPages` with the `fromRecord` and `limitRecord` query parameters to page through results.

### Response (200)

```json
{
  "Summary": {
    "pageIdentifier": null,
    "pageSize": 20,
    "totalAmount": 0,
    "totalNetAmount": 0,
    "totalPages": 2,
    "totalRecords": 28
  },
  "Records": [
    {
      "deviceId": "499585-389fj484-3jcj8hj3",
      "idCloud": 142,
      "description": "Front Counter Terminal",
      "serialNumber": "SN-90210-XR",
      "friendlyName": "Front Counter",
      "make": null,
      "model": null,
      "deviceType": 1,
      "deviceStatus": 1,
      "deviceOs": null,
      "macAddress": "1A2B3C4D5E6F",
      "lastHealthCheck": "2026-04-09T14:49:42Z",
      "registrationCode": "REG-A1B2C3D4",
      "activationAttempts": 0,
      "activationCodeExpiry": "2026-04-09T14:49:42Z",
      "createdAt": "2026-04-09T01:14:37Z",
      "updatedAt": "2026-04-09T14:49:42Z",
      "paypointId": 3040,
      "paypointDba": "Gruzya Adventure Outfitters",
      "paypointLegal": "Gruzya Adventure Outfitters, LLC",
      "paypointEntry": "8cfec329267",
      "paypointLogo": "https://payabli-public-objects.s3.amazonaws.com/pe3040.png",
      "externalPaypointId": "GRUZYA-01",
      "parentOrgId": 100,
      "parentOrgName": "Mountain View Services",
      "transactionCount": 342,
      "volumeProcessed": 28650.75
    }
  ]
}
```

Filter and sort results with query parameters — for example, `status(eq)=1` for active devices only. The full list of filterable fields, including `make` and `model`, is on the [List devices by paypoint](/developers/api-reference/get-list-of-devices-for-a-paypoint) API reference; for operator syntax and pagination, see the [Filters and conditions reference](/guides/pay-ops-reporting-overview#filters-and-conditions-reference).

## Unregister a device

Send a DELETE request to `/api/Cloud/register/{entry}/{deviceId}` to remove a device registration. See the [API reference](/developers/api-reference/cloud/unregister-cloud-device) for this endpoint for full documentation.

This example unregisters the device with the deviceId `6c361c7d-674c-44cc-b790-382b75d1xxx` from the `8cfec329267` paypoint.

### Request

DELETE [https://api-sandbox.payabli.com/api/Cloud/register/\{entry}/\{deviceId}](https://api-sandbox.payabli.com/api/Cloud/register/\{entry}/\{deviceId})

```curl
curl -X DELETE https://api-sandbox.payabli.com/api/Cloud/register/8cfec329267/499585-389fj484-3jcj8hj3 \
     -H "Authorization: Bearer <token>"
```

```typescript
import { PayabliClient } from "@payabli/sdk-node";

async function main() {
    const client = new PayabliClient();
    await client.cloud.removeDevice("8cfec329267", "499585-389fj484-3jcj8hj3");
}
main();

```

```python
from payabli import payabli

client = payabli()

client.cloud.remove_device(
    entry="8cfec329267",
    device_id="499585-389fj484-3jcj8hj3",
)

```

```java
package com.example.usage;

import io.github.payabli.api.PayabliApiClient;

public class Example {
    public static void main(String[] args) {
        PayabliApiClient client = PayabliApiClient
            .builder()
            .build();

        client.cloud().removeDevice("8cfec329267", "499585-389fj484-3jcj8hj3");
    }
}
```

```ruby
require "payabli"

client = Payabli::Client.new

client.cloud.remove_device(
  entry: "8cfec329267",
  device_id: "499585-389fj484-3jcj8hj3"
)

```

```csharp
using PayabliApi;
using System.Threading.Tasks;

public partial class Examples
{
    public async Task Example() {
        var client = new PayabliApiClient();

        await client.Cloud.RemoveDeviceAsync(
            "8cfec329267",
            "499585-389fj484-3jcj8hj3"
        );
    }

}

```

```go
package example

import (
    context "context"

    client "github.com/payabli/sdk-go/client"
)

func do() {
    client := client.NewClient()
    client.Cloud.RemoveDevice(
        context.TODO(),
        "8cfec329267",
        "499585-389fj484-3jcj8hj3",
    )
}

```

```php
<?php

namespace Example;

use Payabli\PayabliClient;

$client = new PayabliClient();
$client->cloud->removeDevice(
    '8cfec329267',
    '499585-389fj484-3jcj8hj3',
);

```

```swift
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api-sandbox.payabli.com/api/Cloud/register/8cfec329267/499585-389fj484-3jcj8hj3")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "DELETE"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

A successful operation returns a 200 response with the device ID in the body.

### Response (200)

```json
{
  "responseText": "Success",
  "isSuccess": true,
  "responseData": "6c361c7d-674c-44cc-b790-382b75d1xxx"
}
```

## Asynchronous transaction flow

The PAX A920 device uses an asynchronous flow to process transactions. After you initiate a transaction via the Payabli Virtual Terminal or your own integrated software, the Payabli API sends a response to indicate the transaction has been initiated. The device is then ready to collect payment information from the customer. After the transaction is completed, the final status is sent to you in a webhook event.

#### Initiate transaction

A transaction is initiated from the Payabli Virtual Terminal or your own integrated software.

#### Initial response

The Payabli API responds with the current status of the transaction.
The transaction isn't complete yet.

#### Collect payment

The PAX A920 device collects payment information from the customer.

#### Webhook response

When the transaction is complete, the API sends a webhook event to notify you of the final status of the transaction.

You must enable webhook notifications to receive them. They are not sent by default.
See [Set up and receive events using Web](/guides/pay-ops-developer-webhooks-quickstart) for more information.

The response for an initiated transaction looks like this:

```json Initiated transaction response
{
  "responseText": "Success",
  "isSuccess": true,
  "pageIdentifier": null,
  "responseData": {
    "authCode": null,
    "referenceId": "237-e2928ea2f73d473f95f4094d56870ffc",
    "resultCode": 1,
    "resultText": "Initiated",
    "avsResponseText": null,
    "cvvResponseText": null,
    "customerId": 319082,
    "methodReferenceId": null
  }
}
```

The `resultText` has a value of `"Initiated"`, which means the transaction is in progress.

## Webhooks

To get the final status of the transaction, you need to listen for either the `ApprovedPayment` webhook event or the `DeclinedPayment` webhook event. The webhook payloads for a completed transaction look like this:

```json Success
{
  "Event": "ApprovedPayment",
  "Paypoint": "Athlete Factory LLC\r\n",
  "Text": "Payment Approved!",
  "transId": "10-33eb676a-da48-401f-9494-e69a324b152d",
  "NetAmount": "100.00",
  "Fee": "0.00",
  "TotalAmount": "100.00",
  "transTime": "04/04/2022 13:56:17",
  "CustomerId": "224",
  "CustomerNumber": "888"
}
```

```json Failure
{
  "Event": "DeclinedPayment",
  "Paypoint": "Athlete Factory LLC",
  "Text": "Payment Declined!",
  "transId": "10-073d7d504e3c4357be3ff904f9653b4a",
  "NetAmount": "0.05",
  "Fee": "0.00",
  "TotalAmount": "0.05",
  "transTime": "9/18/2023 7:20:14 PM",
  "CustomerId": "1323",
  "CustomerNumber": "customer-xchg_004"
}
```

See [Notifications and Reports Overview](/guides/pay-ops-notifications-webhooks-overview) for more information on how to set up webhooks.

## Related resources

See these related resources to help you get the most out of Payabli.

#### Related topics

* **[Register cloud device](/developers/api-reference/cloud/register-cloud-device)** - Learn how to register a cloud device using the API
* **[Manage Ingenico Link and Lane devices](/guides/pay-in-developer-devices-link-lane-manage)** - Learn how to register, list, and unregister Ingenico Link and Lane devices with the Payabli API