KinetX Operator API
Build your own casino front end or connect your back office to KinetX: players, wallet, payments, games, bonuses, responsible gaming and reports over one signed REST API, plus webhooks for everything that happens on the platform.
Introduction
The Operator API is for API (headless) operators that run their own website or app, and for Turnkey operators that keep their own front end or payment provider. Every business rule of the platform applies to API calls exactly as in the backoffice: KYC thresholds, responsible-gaming limits and cooling-off periods, self-exclusion, bonus terms, AML monitoring and the audit log.
Check your credentials and see which operator and scopes the key belongs to.
Register players, read and update their profiles and status, and issue player session tokens for your front end.
Real and bonus balances and the transaction ledger of a player.
Record deposits collected by your own payment provider, request withdrawals and follow their status.
The game catalogue (providers, categories, RTP) and game launch URLs.
Your bonus catalogue, granting bonuses, redeeming promo codes and the bonuses of a player.
Deposit, bet, loss, balance and session limits with cooling-off periods, and self-exclusion.
GGR and payment summaries for a date range.
Endpoints your front end calls directly with a player session token (Authorization: Bearer).
Quickstart
- 1In the backoffice open Tools → API & Webhooks and create an API key with the scopes you need. Copy the secret: it is shown only once.
- 2Optionally restrict the key to the IP addresses of your servers.
- 3Sign a request to
GET /api/v1/operator/meand check that it returns your operator. How to sign requests → - 4Add a webhook endpoint to be notified of registrations, payments, bonuses, KYC and compliance events.
Base URL:
https://kinetx.amhtechnologies.com/api/v1
Conventions
- Requests and responses are JSON (
application/json). Successful responses wrap the result indata. - Money is always an integer in minor units of the currency (cents):
12550is €125.50. Currencies are ISO 4217 codes. - Timestamps are ISO 8601 in UTC (
2026-10-15T09:30:00Z); dates areYYYY-MM-DD. - Ids are KinetX integer ids. Keep your own id of a player in
external_idand look players up with it. - Every response carries an X-Request-Id header; quote it when you contact support.
- An API key only ever sees the data of its own operator: records of other operators answer 404.
Idempotency
Network failures happen. Send an Idempotency-Key header (a UUID) with every POST: the first response is stored for 24 hours and replayed for every retry with the same key and the same request, marked with Idempotent-Replayed: true. Reusing a key for a different request is refused with IDEMPOTENCY_KEY_REUSED; a retry while the first request still runs gets 409 IDEMPOTENCY_IN_PROGRESS.
Money movements are additionally idempotent on your own reference: a deposit with an external_reference that was already recorded returns the original deposit instead of crediting twice.
Errors
Errors use HTTP status codes and one envelope with a stable machine-readable code:
{
"error": {
"code": "VALIDATION_FAILED",
"message": "The request data is invalid.",
"details": {
"birth_date": [
"The player must be at least 18 years old."
]
}
}
}
| Code | HTTP | Meaning |
|---|---|---|
| MISSING_CREDENTIALS | 401 | X-Api-Key, X-Timestamp or X-Signature is missing. |
| INVALID_API_KEY | 401 | The API key does not exist. |
| API_KEY_INACTIVE | 401 | The API key is revoked or expired, or the operator account is inactive. |
| TIMESTAMP_OUT_OF_RANGE | 401 | X-Timestamp differs from the server time by more than 300 seconds; details.server_time has the server clock. |
| INVALID_NONCE | 401 | X-Nonce is longer than 128 characters. |
| INVALID_SIGNATURE | 401 | X-Signature does not match the request. |
| REPLAYED_REQUEST | 401 | This exact signed request was already received. Sign every request with a fresh timestamp (or nonce). |
| INVALID_PLAYER_TOKEN | 401 | The player session token is missing, invalid or expired. |
| IP_NOT_ALLOWED | 403 | The caller IP is not in the allowlist of the API key. |
| INSUFFICIENT_SCOPE | 403 | The API key lacks the scope of the endpoint; details.required_scopes lists it. |
| FEATURE_NOT_AVAILABLE | 403 | Not available for your cooperation model. |
| NOT_FOUND | 404 | The resource does not exist or belongs to another operator. |
| METHOD_NOT_ALLOWED | 405 | The HTTP method is not supported by the endpoint. |
| IDEMPOTENCY_IN_PROGRESS | 409 | A request with this Idempotency-Key is still running. Retry shortly. |
| DUPLICATE_TRANSACTION | 409 | The reference was already used for a different operation. |
| INSUFFICIENT_FUNDS | 402 | The balance is too low. |
| VALIDATION_FAILED | 422 | The request data is invalid; details maps each field to its messages. |
| INVALID_REQUEST | 422 | The request cannot be processed as sent. |
| IDEMPOTENCY_KEY_REUSED | 422 | The Idempotency-Key was already used for a different request. |
| INVALID_IDEMPOTENCY_KEY | 422 | The Idempotency-Key is longer than 255 characters. |
| SELF_EXCLUDED_IDENTITY | 422 | A self-excluded player with the same identity exists. |
| PLAYER_RESTRICTED | 422 | The account is locked, closed or self-excluded, or the action is disabled for the player. |
| LIMIT_EXCEEDED | 422 | A responsible-gaming limit (deposit, bet, loss, balance or session) refuses the action. |
| RESPONSIBLE_GAMING_RULE | 422 | A responsible-gaming rule refuses the change (e.g. shortening a self-exclusion). |
| KYC_REQUIRED | 422 | The player must be verified (KYC) for this withdrawal. |
| PAYMENT_REQUEST_INVALID | 422 | A payment rule refuses the request (amount bounds, method, daily caps). |
| BONUS_INVALID | 422 | A bonus rule refuses the action (excluded player, grant cap, max bet). |
| PROMO_CODE_INVALID | 422 | The promo code is unknown, expired or already used by the player. |
| NOT_AN_ORIGINAL | 422 | The game is not a KinetX Original. |
| RATE_LIMITED | 429 | Too many requests for this API key; wait for Retry-After seconds. |
| SERVER_ERROR | 500 | Unexpected error. Retry with the same Idempotency-Key; contact support with the X-Request-Id. |
List pagination
List endpoints take page and per_page (1–100, default 25) and return meta and links next to the data:
{
"data": [
"…"
],
"meta": {
"current_page": 2,
"per_page": 25,
"total": 137,
"last_page": 6,
"from": 26,
"to": 50
},
"links": {
"first": "…?page=1",
"last": "…?page=6",
"prev": "…?page=1",
"next": "…?page=3"
}
}
Rate limits
Each API key may send 600 requests per minute by default (staff can set another limit per key). Player session tokens count against the key that issued them. Every response reports the budget in X-RateLimit-Limit and X-RateLimit-Remaining; above it you get 429 RATE_LIMITED with a Retry-After header.
Versioning
The version is part of the path (/api/v1). Within v1 we only add: new endpoints, optional parameters, response fields and webhook events. Ignore fields you do not know. Breaking changes come as v2, announced in the changelog well in advance.