Windows SDK — Setup & Integration
The Handpoint Windows SDK (HandpointSDK on NuGet) provides a strongly-typed C# interface for PAX SmartPOS and HiLite Bluetooth terminals. Your POS application calls methods like hapi.Sale() and hapi.Refund(), and receives results via event callbacks — no raw HTTP or WebSocket management required.
Supported environments: .NET / .NET Framework on Windows (see the NuGet package target for the exact TargetFramework).
Hardware: PAX SmartPOS (Cloud connection) and HiLite Bluetooth readers (direct Bluetooth).
PCI scope: Out of scope — card data is captured by the terminal, never by your application.
Prerequisites
| Requirement | Detail |
|---|---|
| .NET / .NET Framework | Check the NuGet package page for the supported target framework |
| NuGet package | HandpointSDK — available on nuget.org |
| Cloud API Key | Required for PAX SmartPOS (Cloud connection) — obtain from the Handpoint TMS |
| Shared Secret (SSK) | Required for HiLite Bluetooth — obtain from setup.handpoint.com per reader |
| Bluetooth pairing | HiLite readers must be paired in Windows Bluetooth settings before connecting |
Step 1 — Install the NuGet package
.NET CLI
dotnet add package HandpointSDK
Package Manager Console (Visual Studio)
Install-Package HandpointSDK
Internal Nexus feed (for RC builds)
dotnet nuget add source "http://nexus.handpoint.ninja:8081/repository/nuget-hosted/index.json" \
--name handpoint-nexus \
--username <nexus_user> --password <nexus_password>
dotnet add package HandpointSDK --source handpoint-nexus
Step 2 — Implement Events.Required
All transaction results and device events are delivered through the Events.Required interface. Create a class that implements it and can safely receive callbacks from a background thread.
using com.handpoint.api;
using System;
using System.Collections.Generic;
public class PaymentHandler : Events.Required
{
// Final transaction result — authorised, declined, cancelled, or failed
public void EndOfTransaction(TransactionResult result, Device device)
{
switch (result.FinStatus)
{
case FinancialStatus.AUTHORISED:
Console.WriteLine($"Approved: {result.TransactionID}");
Console.WriteLine(result.CustomerReceipt);
break;
case FinancialStatus.DECLINED:
Console.WriteLine("Declined");
break;
case FinancialStatus.CANCELLED:
Console.WriteLine("Cancelled by cardholder");
break;
case FinancialStatus.FAILED:
Console.WriteLine($"Failed: {result.ErrorMessage}");
break;
}
}
// Intermediate status updates during a transaction
public void CurrentTransactionStatus(StatusInfo info, Device device)
{
Console.WriteLine($"Status: {info.Status}");
}
// Called after SearchDevices() completes
public void DeviceDiscoveryFinished(List<Device> devices)
{
foreach (var d in devices)
Console.WriteLine($"Found: {d.Name} [{d.Address}]");
}
// Called when a signature must be collected from the cardholder
public void SignatureRequired(SignatureRequest request, Device device)
{
// Display request.MerchantReceipt to the operator
// Then call hapi.SignatureResult(accepted: true/false)
}
}
EndOfTransaction is called on a background thread. If you update UI controls from inside it, marshal back to the UI thread (Dispatcher.Invoke, Control.Invoke, etc.).