Before a device can receive payment sessions, it must be enrolled on your merchant account. Your backend (or the Kustom Portal) generates a pairing code that a store clerk enters in the Kustom POS app. This registers the device automatically and receives an authentication token.
| Participant | Role |
|---|---|
| Merchant Ops | Merchant internal team with access to the Kustom Portal — or a third-party system connected to the Kustom Device API. Creates enrollments and controls which devices are assigned to specific locations. |
| Store Clerk | Merchant employee using the Kustom POS app to collect in-person payments; enters the pairing code in the app. |
| Kustom POS | Kustom POS app for iOS or Android running on any certified device. |
| Device API | Kustom device API, used to manage the device fleet. |
The first step (creating the enrollment) is the only part you implement, and it uses your API key. Registering the device is handled internally by the Kustom POS app once the clerk enters the pairing code.
Generates a short-lived pairing code. The metadata you provide in the enrollment is carried over to the device record once paired, and can be used later to filter devices.
- Productionhttps://api.kustom.co/ipp/v1/enrollments
- Playgroundhttps://api.playground.kustom.co/ipp/v1/enrollments
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
https://api.kustom.co/ipp/v1/enrollments \
-H 'Content-Type: application/json' \
-d '{
"metadata": {
"username": "john.doe",
"type": "android"
},
"expires_in": 36000,
"location_id": "46910cc3-ab41-4b80-b4a7-94dab9f1b795"
}'{ "enrollment_id": "660e8400-e29b-41d4-a716-446655440001", "enrollment_code": "ABC123XYZ", "expires_at": "2024-01-15T11:30:00Z", "status": "PENDING", "metadata": { "store_id": "123", "terminal_type": "checkout" } }
Share the enrollment_code with the store clerk, and they will enter it in the Kustom POS app. The app then calls the device registration endpoint (unauthenticated) and receives a device bearer token. This is handled entirely by the app; no further action is needed from your backend.
| Status | Meaning |
|---|---|
PENDING | Code generated, not yet entered by a clerk. |
CONSUMED | Device successfully registered. |
EXPIRED | Code not used before expires_at. Please generate a new enrollment. |
CANCELLED | Manually deleted via DELETE /ipp/v1/enrollments/{id}. |
CANCELLED and EXPIRED enrollments are excluded from the list results. If the code expires before the clerk enters it, create a new enrollment.
Once enrolled, a device has a stable device_id, which you use when creating sessions. The device metadata (carried over from the enrollment) can be used to filter devices in list queries.
- Productionhttps://api.kustom.co/ipp/v1/devices
- Playgroundhttps://api.playground.kustom.co/ipp/v1/devices
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
'https://api.kustom.co/ipp/v1/devices?location_id=497f6eca-6276-4993-bfeb-53cbbbba6f08&metadata=store_id%3A123&page_number=0&page_size=20' \
-H 'x-merchant-id: string'{ "content": [ { … }, { … } ], "total_elements": 2, "total_pages": 1, "page_number": 0, "page_size": 20, "first": true, "last": true }
- Productionhttps://api.kustom.co/ipp/v1/devices/{id}
- Playgroundhttps://api.playground.kustom.co/ipp/v1/devices/{id}
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X PUT \
'https://api.kustom.co/ipp/v1/devices/{id}' \
-H 'Content-Type: application/json' \
-d '{
"name": "POS Terminal - Main Entrance",
"metadata": {
"store_id": "456",
"department": "Sales"
},
"location_id": "660e8400-e29b-41d4-a716-446655440001"
}'{ "id": "550e8400-e29b-41d4-a716-446655440000", "hardware_id": "ABC123XYZ", "merchant_id": "merchant_12345", "location_id": "660e8400-e29b-41d4-a716-446655440001", "name": "POS Terminal - Main Entrance", "platform": "IOS", "metadata": { "store_id": "456", "department": "Sales" }, "created_at": "2024-01-15T10:30:00Z" }
- Productionhttps://api.kustom.co/ipp/v1/devices/{id}
- Playgroundhttps://api.playground.kustom.co/ipp/v1/devices/{id}
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X DELETE \
'https://api.kustom.co/ipp/v1/devices/{id}'No contentDeregistering a device revokes its bearer token immediately. The clerk will need to re-enroll if the device is to be used again.