Terminals
Manage Stripe card readers and POS hardware enrolled to your tenant. Slate wraps the Stripe Terminal API to provide unified device registration, status polling, and payment capture from physical readers.
List terminals
bash
GET /v1/slate/terminalsjson
{
"data": [
{
"id": "tmr_01hxyz",
"stripe_reader_id": "tmr_Fxxxxxxxxx",
"label": "Front Counter — Register 1",
"device_type": "bbpos_wisepos_e",
"status": "online",
"location": "loc_01hxyz",
"last_seen_at": "2025-06-01T09:55:00Z"
}
]
}Register a terminal
bash
POST /v1/slate/terminals| Name | Type | Required | Description |
|---|---|---|---|
| registration_code | string | Yes | The 8-character code displayed on the reader during pairing mode. |
| label | string | Yes | Human-readable name for the reader (e.g. "Front Counter"). |
| location_id | string | No | Stripe Terminal location ID. If omitted, the default tenant location is used. |
bash
curl -X POST https://api.hldgroup.org/v1/slate/terminals \
-H "x-internal-secret: <key>" \
-H "x-tenant-id: ten_01hxyz" \
-H "x-user-id: usr_01hxyz" \
-H "x-platform-role: tenant-system-admin" \
-H "Content-Type: application/json" \
-d '{
"registration_code": "halo-twix",
"label": "Front Counter — Register 1"
}'Supported reader models
| Name | Type | Required | Description |
|---|---|---|---|
| BBPOS WisePOS E | bbpos_wisepos_e | No | Countertop smart reader. Tap, chip, swipe. |
| Stripe Reader S700 | stripe_s700 | No | Android-based smart reader with touchscreen. |
| BBPOS WisePad 3 | bbpos_wisepad3 | No | Bluetooth portable reader for mobile POS. |
| Stripe Reader M2 | stripe_m2 | No | Bluetooth contactless and chip reader. |
Create a connection token
Your POS frontend needs a short-lived connection token to pair with a reader via Stripe.js Terminal SDK.
bash
POST /v1/slate/terminals/connection-tokenjson
{
"data": {
"secret": "wrcsec_test_..."
}
}Pass data.secret to StripeTerminal.create({ fetchConnectionToken: () => secret }) in your frontend.
Note:Connection tokens expire after 15 minutes. Generate one per POS session, not per payment. Store it in memory — never persist to disk or localStorage.