> 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

# AXIUM devices API quickstart

> Activate an AXIUM terminal and make your first card-present transaction with the Payabli API

This quickstart takes an Ingenico AXIUM terminal from unregistered to its first card-present sale. First you set up and activate the terminal, then you charge a card with the Payabli API. The terminal captures and encrypts card data at the point of sale, and your app orchestrates the payment through the API.

## Before you begin

You need:

* **An OAuth2 Bearer token with the `device_registry` scope** to generate the activation code. Registration only accepts OAuth2 — see [OAuth authentication](/developers/oauth-authentication) to set one up.
* **A physical AXIUM terminal** to register and present cards to. Contact Payabli to order your devices.
* **The device's admin password**, which Payabli provides. You need it to connect the terminal to Wi-Fi.
* **A paypoint enabled for semi-integrated devices**, and API credentials that allow you to make transactions.
* **A webhook subscription for the `ApprovedPayment` and `DeclinedPayment` events**, if you want Payabli to notify you when a sale completes instead of polling for it. Payabli doesn't send webhook events until you subscribe to them. See [Set up and receive events](/guides/pay-ops-developer-webhooks-quickstart) for instructions.

Semi-integrated AXIUM device processing requires configuration by the Payabli team. Contact us to get started.

## Activate the terminal

Activating an AXIUM terminal registers it to a paypoint so it can accept payments.

#### Set up the terminal

1. Power on the device.
2. Connect it to a Wi-Fi network. You may be prompted for the device's admin password.
3. Open the Payabli app. It prompts for a device name, then a 6-digit activation code.

The device ships with a printed user guide for the hardware setup. If you need another copy, download the guide for your model from [Ingenico user guides](https://ingenico.com/us-en/resources/user-guides).

#### Generate an activation code

Send a POST request to the [Generate device activation code endpoint](/developers/api-reference/device/generate-device-activation-code) (`/api/Device/challenge/{entry}`), where `{entry}` is the entrypoint of the paypoint the device registers to. Authenticate with an OAuth2 Bearer token that has the `device_registry` scope.

### Request

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

```curl
curl -X POST https://api-sandbox.payabli.com/api/Device/challenge/8cfec329267 \
     -H "Authorization: Bearer <token>"
```

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

async function main() {
    const client = new PayabliClient();
    await client.device.challenge("8cfec329267");
}
main();

```

```python
from payabli import payabli

client = payabli()

client.device.challenge(
    entry="8cfec329267",
)

```

```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.device().challenge("8cfec329267");
    }
}
```

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

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

        await client.Device.ChallengeAsync(
            "8cfec329267"
        );
    }

}

```

```go
package example

import (
    context "context"

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

func do() {
    client := client.NewClient()
    client.Device.Challenge(
        context.TODO(),
        "8cfec329267",
    )
}

```

```php
<?php

namespace Example;

use Payabli\PayabliClient;

$client = new PayabliClient();
$client->device->challenge(
    '8cfec329267',
);

```

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

url = URI("https://api-sandbox.payabli.com/api/Device/challenge/8cfec329267")

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

request = Net::HTTP::Post.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/Device/challenge/8cfec329267")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
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 a 6-digit `code` and its `expiresAt` timestamp.

### Response (200)

```json
{
  "responseText": "Success",
  "responseData": {
    "code": "748801",
    "expiresAt": "2026-08-13T19:58:27.5860203Z"
  },
  "responseCode": 1,
  "pageIdentifier": "",
  "roomId": 0,
  "isSuccess": true
}
```

Enter the device name and the code in the app, and the terminal registers itself to the paypoint. The code expires 5 minutes after it's issued, so generate it when the app reaches the activation screen. A paypoint can have more than one code active at once, so you can activate a batch of terminals in one pass. Each code binds to whichever device enters it first.

#### Get the device ID

Each transaction targets the terminal by its `deviceId`. List the devices registered to the paypoint to find the one you just activated:

### 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 the paypoint's devices in `Records`. Find the terminal by the device name you entered, shown as `friendlyName`, and copy its `deviceId`.

### 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
    }
  ]
}
```

See [Manage AXIUM devices](/guides/pay-in-developer-devices-axium-manage) for filtering and monitoring options.

With the terminal registered and its `deviceId` copied, you're ready to charge a card.

## Make your first transaction

Run a card-present sale by sending a POST request to the [Make a transaction endpoint](/developers/api-reference/moneyinV2/make-a-transaction) (`/api/v2/MoneyIn/getpaid`). Set `paymentMethod.method` to `device` and `paymentMethod.device` to the `deviceId` you copied.

### Request

POST [https://api-sandbox.payabli.com/api/v2/MoneyIn/getpaid](https://api-sandbox.payabli.com/api/v2/MoneyIn/getpaid)

```curl DeviceInitiated
curl -X POST https://api-sandbox.payabli.com/api/v2/MoneyIn/getpaid \
     -H "Authorization: Bearer <token>" \
     -H "Content-Type: application/json" \
     -d '{
  "paymentDetails": {
    "totalAmount": 100,
    "serviceFee": 0
  },
  "paymentMethod": {
    "device": "499585-389fj484-3jcj8hj3",
    "method": "device",
    "saveIfSuccess": true
  },
  "customerData": {
    "customerId": 4440
  },
  "entryPoint": "8cfec329267",
  "ipaddress": "255.255.255.255"
}'
```

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

async function main() {
    const client = new PayabliClient();
    await client.moneyIn.getpaidv2({
        body: {
            customerData: {
                customerId: 4440,
            },
            entryPoint: "8cfec329267",
            ipaddress: "255.255.255.255",
            paymentDetails: {
                serviceFee: 0,
                totalAmount: 100,
            },
            paymentMethod: {
                device: "499585-389fj484-3jcj8hj3",
                method: "device",
                saveIfSuccess: true,
            },
        },
    });
}
main();

```

```python DeviceInitiated
from payabli import payabli, PayorDataRequest, PaymentDetail, PayMethodDevice

client = payabli()

client.money_in.getpaidv_2(
    customer_data=PayorDataRequest(
        customer_id=4440,
    ),
    entry_point="8cfec329267",
    ipaddress="255.255.255.255",
    payment_details=PaymentDetail(
        service_fee=0,
        total_amount=100,
    ),
    payment_method=PayMethodDevice(
        device="499585-389fj484-3jcj8hj3",
        method="device",
        save_if_success=True,
    ),
)

```

```java DeviceInitiated
package com.example.usage;

import io.github.payabli.api.PayabliApiClient;
import io.github.payabli.api.resources.moneyin.requests.RequestPaymentV2;
import io.github.payabli.api.types.PayMethodDevice;
import io.github.payabli.api.types.PayMethodDeviceMethod;
import io.github.payabli.api.types.PaymentDetail;
import io.github.payabli.api.types.PaymentMethod;
import io.github.payabli.api.types.PayorDataRequest;
import io.github.payabli.api.types.TransRequestBody;
import java.util.Optional;

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

        client.moneyIn().getpaidv2(
            RequestPaymentV2
                .builder()
                .body(
                    TransRequestBody
                        .builder()
                        .paymentDetails(
                            PaymentDetail
                                .builder()
                                .totalAmount(100.0)
                                .serviceFee(0.0)
                                .build()
                        )
                        .paymentMethod(
                            PaymentMethod.of(
                                PayMethodDevice
                                    .builder()
                                    .device("499585-389fj484-3jcj8hj3")
                                    .method(PayMethodDeviceMethod.DEVICE)
                                    .saveIfSuccess(Optional.of(true))
                                    .build()
                            )
                        )
                        .customerData(
                            PayorDataRequest
                                .builder()
                                .customerId(4440L)
                                .build()
                        )
                        .entryPoint("8cfec329267")
                        .ipaddress("255.255.255.255")
                        .build()
                )
                .build()
        );
    }
}
```

```ruby DeviceInitiated
require "payabli"

client = Payabli::Client.new

client.money_in.getpaidv_2(
  customer_data: {
    customer_id: 4440
  },
  entry_point: "8cfec329267",
  ipaddress: "255.255.255.255",
  payment_details: {
    total_amount: 100,
    service_fee: 0
  },
  payment_method: {
    device: "499585-389fj484-3jcj8hj3",
    method_: "device",
    save_if_success: true,
    cardexp: "string",
    cardnumber: "string"
  }
)

```

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

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

        await client.MoneyIn.Getpaidv2Async(
            new RequestPaymentV2 {
                Body = new TransRequestBody {
                    CustomerData = new PayorDataRequest {
                        CustomerId = 4440L
                    },
                    EntryPoint = "8cfec329267",
                    Ipaddress = "255.255.255.255",
                    PaymentDetails = new PaymentDetail {
                        ServiceFee = 0,
                        TotalAmount = 100
                    },
                    PaymentMethod = new PayMethodDevice {
                        Device = "499585-389fj484-3jcj8hj3",
                        Method = PayMethodDeviceMethod.Device,
                        SaveIfSuccess = true
                    }
                }
            }
        );
    }

}

```

```go DeviceInitiated
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.RequestPaymentV2{
        Body: &payabli.TransRequestBody{
            PaymentDetails: &payabli.PaymentDetail{
                TotalAmount: 100,
                ServiceFee: payabli.Float64(
                    0,
                ),
            },
            PaymentMethod: &payabli.PaymentMethod{
                PayMethodDevice: &payabli.PayMethodDevice{
                    Device: "499585-389fj484-3jcj8hj3",
                    Method: payabli.PayMethodDeviceMethodDevice,
                    SaveIfSuccess: payabli.Bool(
                        true,
                    ),
                },
            },
            CustomerData: &payabli.PayorDataRequest{
                CustomerId: payabli.Int64(
                    int64(4440),
                ),
            },
            EntryPoint: payabli.String(
                "8cfec329267",
            ),
            Ipaddress: payabli.String(
                "255.255.255.255",
            ),
        },
    }
    client.MoneyIn.Getpaidv2(
        context.TODO(),
        request,
    )
}

```

```php DeviceInitiated
<?php

namespace Example;

use Payabli\PayabliClient;
use Payabli\MoneyIn\Requests\RequestPaymentV2;
use Payabli\Types\TransRequestBody;
use Payabli\Types\PayorDataRequest;
use Payabli\Types\PaymentDetail;
use Payabli\Types\PayMethodCredit;

$client = new PayabliClient();
$client->moneyIn->getpaidv2(
    new RequestPaymentV2([
        'body' => new TransRequestBody([
            'customerData' => new PayorDataRequest([
                'customerId' => 4440,
            ]),
            'entryPoint' => '8cfec329267',
            'ipaddress' => '255.255.255.255',
            'paymentDetails' => new PaymentDetail([
                'serviceFee' => 0,
                'totalAmount' => 100,
            ]),
            'paymentMethod' => new PayMethodCredit([
                'saveIfSuccess' => true,
                'cardexp' => 'value',
                'cardnumber' => 'value',
            ]),
        ]),
    ]),
);

```

```swift DeviceInitiated
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "paymentDetails": [
    "totalAmount": 100,
    "serviceFee": 0
  ],
  "paymentMethod": [
    "device": "499585-389fj484-3jcj8hj3",
    "method": "device",
    "saveIfSuccess": true
  ],
  "customerData": ["customerId": 4440],
  "entryPoint": "8cfec329267",
  "ipaddress": "255.255.255.255"
] as [String : Any]

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

let request = NSMutableURLRequest(url: NSURL(string: "https://api-sandbox.payabli.com/api/v2/MoneyIn/getpaid")! 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()
```

To tokenize and save the card while you charge it, set `paymentMethod.saveIfSuccess` to `true`. After the sale succeeds, the card's `methodReferenceId` appears in the transaction details as `StoredId`, ready to reuse for future charges. See [payment method tokenization](/guides/platform-tokenization-overview) for more.

A device sale is two-phase. The request returns `Initiated` (result code `A0001`), not `Approved`, because the terminal hasn't read a card yet. The terminal prompts the cardholder to present their card, and the fields that describe the card and authorization stay `null` until they do.

### Response (201)

```json
{
  "code": "A0001",
  "reason": "Initiated",
  "explanation": "Transaction initiated",
  "action": "No action required",
  "data": {
    "parentOrgName": "Riverside Pet Supply",
    "paypointDbaname": "Riverside Pet Store",
    "paypointLegalname": "Riverside Pet Store",
    "paypointEntryname": "495147f647",
    "paymentTransId": "3040-96dfa9a7c4ed4f82a3dd4a4a12ad28ae",
    "connectorName": "FV",
    "externalProcessorInformation": "",
    "gatewayTransId": null,
    "orderId": "",
    "method": "device",
    "batchNumber": "",
    "batchAmount": 0,
    "payorId": 4440,
    "paymentData": {
      "maskedAccount": null,
      "accountType": null,
      "accountExp": null,
      "holderName": "",
      "storedId": null,
      "initiator": null,
      "storedMethodUsageType": null,
      "sequence": null,
      "orderDescription": null,
      "accountId": null,
      "signatureData": null,
      "binData": null,
      "paymentDetails": {
        "totalAmount": 100,
        "serviceFee": 0,
        "checkNumber": null,
        "checkUniqueId": "",
        "currency": "USD",
        "orderDescription": null,
        "orderId": null,
        "orderIdAlternative": null,
        "paymentDescription": "",
        "groupNumber": null,
        "source": null,
        "payabliTransId": null,
        "categories": [],
        "splitFunding": [],
        "checkImage": null,
        "unbundled": null
      }
    },
    "transStatus": 10,
    "paypointId": 3040,
    "totalAmount": 100,
    "netAmount": 100,
    "feeAmount": 0,
    "settlementStatus": 0,
    "operation": "Sale",
    "responseData": {
      "resultCode": "A0001",
      "resultCodeText": "Initiated",
      "response": null,
      "responsetext": "Initiated",
      "authcode": null,
      "transactionid": null,
      "avsresponse": null,
      "avsresponse_text": null,
      "cvvresponse": null,
      "cvvresponse_text": null,
      "orderid": null,
      "response_code": "100",
      "response_code_text": "Operation successful",
      "customer_vault_id": null,
      "emv_auth_response_data": null,
      "type": null
    },
    "source": "api",
    "scheduleReference": 0,
    "orgId": 123,
    "refundId": 0,
    "returnedId": 0,
    "chargebackId": 0,
    "retrievalId": 0,
    "invoiceData": {
      "invoiceNumber": null,
      "invoiceDate": null,
      "invoiceDueDate": null,
      "invoiceEndDate": null,
      "invoiceStatus": null,
      "invoiceType": null,
      "frequency": null,
      "paymentTerms": null,
      "termsConditions": null,
      "notes": null,
      "tax": null,
      "discount": null,
      "invoiceAmount": null,
      "freightAmount": null,
      "dutyAmount": null,
      "purchaseOrder": null,
      "firstName": null,
      "lastName": null,
      "company": null,
      "shippingAddress1": null,
      "shippingAddress2": null,
      "shippingCity": null,
      "shippingState": null,
      "shippingZip": null,
      "shippingCountry": null,
      "shippingEmail": null,
      "shippingPhone": null,
      "shippingFromZip": null,
      "summaryCommodityCode": null,
      "items": null,
      "attachments": null,
      "additionalData": null
    },
    "entrypageId": 0,
    "externalPaypointID": "",
    "isValidatedACH": false,
    "transactionTime": "2025-12-01T09:50:03.559",
    "customer": {
      "identifiers": null,
      "firstName": "John",
      "lastName": "Cassian",
      "companyName": null,
      "billingAddress1": "728 Larkspur Lane",
      "billingAddress2": "",
      "billingCity": "Asheville",
      "billingState": "NC",
      "billingZip": "28801",
      "billingCountry": "US",
      "billingPhone": "+18285550147",
      "billingEmail": "john.cassian@example.com",
      "customerNumber": "C-90010",
      "shippingAddress1": "728 Larkspur Lane",
      "shippingAddress2": "",
      "shippingCity": "Asheville",
      "shippingState": "NC",
      "shippingZip": "28801",
      "shippingCountry": "US",
      "customerId": 4440,
      "customerStatus": 0,
      "additionalData": null
    },
    "splitFundingInstructions": null,
    "cfeeTransactions": [],
    "transactionEvents": [
      {
        "transEvent": "Created",
        "eventData": "0HNHD68HATSUC:00000001",
        "eventTime": "2025-12-01T09:50:02.558651"
      },
      {
        "transEvent": "Initiated",
        "eventData": "0HNHD68HATSUC:00000001",
        "eventTime": "2025-12-01T09:50:03.609111"
      }
    ],
    "riskStatus": "PASSED",
    "riskReason": "",
    "riskAction": "",
    "deviceId": "499585-389fj484-3jcj8hj3",
    "achSecCode": "",
    "achHolderType": "personal",
    "ipAddress": "255.255.255.255",
    "isSameDayACH": false,
    "walletType": null,
    "pendingFeeAmount": 0,
    "riskFlagged": false,
    "riskFlaggedOn": "2025-12-01T09:50:02.5474568",
    "riskActionCode": 0,
    "transAdditionalData": null
  },
  "token": null
}
```

`Initiated` means the sale has started, not that it succeeded. Don't treat `A0001` as an approval — wait for the final result before you fulfill the order.

### Get the final result

The cardholder presents their card and completes the sale on the terminal. Because that happens after the initial response, the final result reaches you separately. You have two ways to get it:

* **Listen for a webhook.** Payabli sends an `ApprovedPayment` or `DeclinedPayment` event when the sale completes, so you don't have to poll. Subscribe to these events first — see [Before you begin](#before-you-begin).
* **Poll for transaction details.** Call [Get transaction details](/developers/api-reference/moneyin/get-details-for-a-processed-transaction) (`/api/MoneyIn/details/{transId}`) with the `paymentTransId` from the initial response, and repeat until the status resolves.

A completed sale returns `resultCode` `A0000` and `TransStatus` `1` in the transaction details:

### Response (200)

```json
{
  "splitCount": 0,
  "TransactionTime": "2026-04-09T14:49:44Z",
  "BatchAmount": 100,
  "BatchNumber": "3040_device_20260401_1a2b3c4d",
  "ConnectorName": "FV",
  "Customer": {
    "FirstName": "Elizabeta",
    "LastName": "Marion",
    "BillingEmail": "elizabeta.marion@email.com",
    "CustomerNumber": "C-90010",
    "customerId": 4440,
    "customerStatus": 1
  },
  "DeviceId": "499585-389fj484-3jcj8hj3",
  "FeeAmount": 0,
  "GatewayTransId": "020080b14c2541444bc985621033c1b7ccda",
  "Method": "device",
  "NetAmount": 100,
  "Operation": "Sale",
  "OrderId": "",
  "ParentOrgName": "Riverside Pet Supply",
  "PaymentData": {
    "AccountExp": "07/28",
    "AccountType": "visa",
    "HolderName": "",
    "Initiator": null,
    "MaskedAccount": "4xxxxxxxxxxx1111",
    "paymentDetails": {
      "totalAmount": 100,
      "categories": [],
      "currency": "USD",
      "serviceFee": 0,
      "splitFunding": []
    },
    "Sequence": null,
    "StoredId": null,
    "StoredMethodUsageType": null
  },
  "PaymentTransId": "3040-96dfa9a7c4ed4f82a3dd4a4a12ad28ae",
  "PayorId": 4440,
  "PaypointDbaname": "Riverside Pet Store",
  "PaypointEntryname": "495147f647",
  "PaypointId": 3040,
  "PaypointLegalname": "Riverside Pet Store",
  "PendingFeeAmount": 0,
  "RefundId": 0,
  "ResponseData": {
    "authcode": "OK2576",
    "emv_auth_response_data": null,
    "response_code": "100",
    "response_code_text": "Operation successful",
    "responsetext": "Approved",
    "resultCode": "A0000",
    "resultCodeText": "Approved",
    "transactionid": "020080b14c2541444bc985621033c1b7ccda"
  },
  "ReturnedId": 0,
  "ScheduleReference": 0,
  "SettlementStatus": 0,
  "Source": "api",
  "TotalAmount": 100,
  "TransactionEvents": [
    {
      "TransEvent": "Created",
      "EventTime": "2026-04-09T14:49:39Z"
    },
    {
      "TransEvent": "Initiated",
      "EventTime": "2026-04-09T14:49:39Z"
    },
    {
      "TransEvent": "Approved",
      "EventTime": "2026-04-09T14:49:44Z"
    }
  ],
  "TransStatus": 1
}
```

If your paypoints use the Payabli Portal, the AXIUM device also appears as a payment method in the Virtual Terminal. There, you can select it to charge a card in person. See [Create a transaction in the Portal](/guides/pay-in-portal-transactions-create#virtual-terminal).

## Related resources

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

#### Related topics

* **[Manage AXIUM devices](/guides/pay-in-developer-devices-axium-manage)** - Learn how to manage AXIUM devices with the Payabli API
* **[Devices overview](/guides/pay-in-devices-overview)** - Learn how to accept card-present payments with Payabli's cloud and AXIUM devices
* **[Make a sale transaction with the API](/guides/pay-in-developer-transactions-create)** - Learn how to authorize and capture a sales transaction in one step using the API