Developer Portal
Build realistic kiosks, backends, and tickets so your team can explore how the Doveshield platform communicates from kiosk hardware to cloud services.

Get to know the sandbox
Prototype the entire kiosk flow without touching production hardware.
Spin up mock environments to understand the lifecycle of ticket issuance and redemption. Each resource in the portal mirrors what a real kiosk will talk to in the field.
Core records you will model
Kiosk
Represents a physical cabinet or terminal. Assign each kiosk a meaningful name and location so you can track traffic during testing.
- Preshared key: Automatically generated secret that authenticates the kiosk with every API call.
- State: Use kiosk records to simulate multiple hardware footprints.
Backend
A backend represents a back office system that contains Tickets which manage the lifecycle of ticket issuance and redemption. Think of it as the server your kiosks call into for ticket lookups and redemptions. To integrate the SentinelPay system you will have to build a backend that conforms to our API.
- Identifier: Use the backend ID in every API request path.
- Environment data: Store connection notes, mock credentials, or integration status.
- Ownership: Backends are scoped to your account so you control who can access them.
Tickets
Tickets simulate barcodes dispensed at the kiosk. They move through the same states as production tickets, letting you practice the redemption flow end-to-end.
- EAN code: Unique value that identifies the ticket within a backend.
- Value: Represent prizes, balances, or payout amounts.
- State machine: States include issued and cashed_out so you can rehearse validation logic.
Authenticate every request with the kiosk preshared key
Every kiosk record generates a
preshared_key
when it is created. The kiosk software must send this secret in the
preshared_key
HTTP header on each request.
Keep the key private—anyone with the value can impersonate the kiosk. Rotate it by creating a new kiosk or updating the record when necessary.
preshared_key: YOUR_KIOSK_KEY
alongside the default
Content-Type
header.
# Example headers for kiosk requests
preshared_key: abcd1234
Content-Type: application/json
Ticket lifecycle endpoints
Look up a ticket
Retrieve ticket details by calling the
GET /api/v1/backends/:backend_id/tickets/:ean_code
endpoint.
Replace
:backend_id
with your backend's ID and
:ean_code
with the ticket barcode.
curl \
-H "preshared_key: YOUR_KIOSK_KEY" \
-H "Content-Type: application/json" \
https://doveshield.com/api/v1/backends/42/tickets/9900001111222
import requests
base_url = "https://doveshield.com"
backend_id = 42
ticket_ean = "9900001111222"
headers = {
"preshared_key": "YOUR_KIOSK_KEY",
"Content-Type": "application/json",
}
response = requests.get(
f"{base_url}/api/v1/backends/{backend_id}/tickets/{ticket_ean}",
headers=headers,
timeout=10,
)
response.raise_for_status()
print(response.json())
Successful calls return the ticket JSON payload, including the current
state
and
value
fields.
Cash out a ticket
Move a ticket to the
cashed_out
state with a
POST /api/v1/backends/:backend_id/tickets/:ean_code/cash_out
request.
Cashing out twice returns an error so you can validate duplicate redemption handling.
curl \
-X POST \
-H "preshared_key: YOUR_KIOSK_KEY" \
-H "Content-Type: application/json" \
https://doveshield.com/api/v1/backends/42/tickets/9900001111222/cash_out
import requests
base_url = "https://doveshield.com"
backend_id = 42
ticket_ean = "9900001111222"
headers = {
"preshared_key": "YOUR_KIOSK_KEY",
"Content-Type": "application/json",
}
response = requests.post(
f"{base_url}/api/v1/backends/{backend_id}/tickets/{ticket_ean}/cash_out",
headers=headers,
timeout=10,
)
if response.status_code == 200:
print("Ticket cashed out:", response.json())
else:
print("Cash out failed:", response.status_code, response.json())
Handle
404
responses for missing tickets and
422
responses when the ticket is already cashed out.
Next steps
Log in to create your first backend, register kiosks, and mint tickets. With the mock environment ready, you can iterate on kiosk firmware and backend integrations quickly and safely.