The playground environment provides two dev-only endpoints, letting you test the full payment flow without a physical terminal.
The Dev endpoints (/ipp/v1/dev/*) are only available in playground (api.playground.kustom.co). Calls to these endpoints in production will result in 404.
Creates a simulated device — no Kustom POS app needed. The device is immediately registered and ready to receive sessions.
- Productionhttps://api.kustom.co/ipp/v1/dev/devices
- Playgroundhttps://api.playground.kustom.co/ipp/v1/dev/devices
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
https://api.kustom.co/ipp/v1/dev/devices \
-H 'Content-Type: application/json' \
-d '{
"name": "string",
"location_id": "46910cc3-ab41-4b80-b4a7-94dab9f1b795",
"metadata": {
"property1": "string",
"property2": "string"
}
}'Use the returned device_id when creating sessions. The device will have simulated: true in its metadata.
Create a session targeting your simulated device, exactly as you would in production:
- Productionhttps://api.kustom.co/ipp/v1/sessions
- Playgroundhttps://api.playground.kustom.co/ipp/v1/sessions
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
'https://api.kustom.co/ipp/v1/sessions?location_id=497f6eca-6276-4993-bfeb-53cbbbba6f08' \
-H 'Content-Type: application/json' \
-d '{
"device_id": "550e8400-e29b-41d4-a716-446655440000",
"order_amount": 240000,
"purchase_currency": "SEK",
"purchase_started_at": "2024-01-15T10:30:00Z",
"order_tax_amount": 48000,
"merchant_reference1": "ORDER-12345",
"order_items": [
{
"type": "physical",
"reference": "SKU-001",
"name": "T-Shirt",
"quantity": 2,
"unit_price": 100000,
"total_amount": 200000,
"tax_rate": 2500,
"total_tax_amount": 40000
},
{
"type": "physical",
"reference": "SKU-002",
"name": "Socks",
"quantity": 1,
"unit_price": 40000,
"total_amount": 40000,
"tax_rate": 2500,
"total_tax_amount": 8000
}
]
}'Simulates a physical card tap on the terminal, triggering the payment outcome of your choice.
- Productionhttps://api.kustom.co/ipp/v1/dev/sessions/{sessionId}/simulate-tap
- Playgroundhttps://api.playground.kustom.co/ipp/v1/dev/sessions/{sessionId}/simulate-tap
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
'https://api.kustom.co/ipp/v1/dev/sessions/{sessionId}/simulate-tap?outcome=SUCCESS'| Outcome | What happens |
|---|---|
SUCCESS | Payment approved. Session moves to FINALIZED. |
DECLINED_GENERIC | Card declined (generic reason). |
INSUFFICIENT_FUNDS | Card declined due to insufficient funds. |
LOST_CARD | Card reported lost. |
STOLEN_CARD | Card reported stolen. |
EXPIRED_CARD | Card has expired. |
INCORRECT_CVC | Wrong CVC entered. |
PROCESSING_ERROR | Terminal processing error. |
INCORRECT_NUMBER | Invalid card number. |
CARD_VELOCITY_EXCEEDED | Card velocity limit exceeded. |
outcome defaults to SUCCESS if omitted.
Before going live, verify the following against your playground integration:
- Device enrolled and visible in the device list
- Session created and dispatched to the device (status
CREATED) -
session.finalizedcallback received and processed -
order_idfrom callback successfully linked to your order record - Declined payment (
DECLINED_GENERIC) handled gracefully - Session cancellation flow tested
- Callback endpoint returns
2xxreliably