Skip to content
KinetX
Operator API v1

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

Quickstart

  1. 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.
  2. 2Optionally restrict the key to the IP addresses of your servers.
  3. 3Sign a request to GET /api/v1/operator/me and check that it returns your operator. How to sign requests →
  4. 4Add a webhook endpoint to be notified of registrations, payments, bonuses, KYC and compliance events.

Base URL:

URL
https://kinetx.amhtechnologies.com/api/v1

Conventions

  • Requests and responses are JSON (application/json). Successful responses wrap the result in data.
  • Money is always an integer in minor units of the currency (cents): 12550 is €125.50. Currencies are ISO 4217 codes.
  • Timestamps are ISO 8601 in UTC (2026-10-15T09:30:00Z); dates are YYYY-MM-DD.
  • Ids are KinetX integer ids. Keep your own id of a player in external_id and 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:

json
{
    "error": {
        "code": "VALIDATION_FAILED",
        "message": "The request data is invalid.",
        "details": {
            "birth_date": [
                "The player must be at least 18 years old."
            ]
        }
    }
}
CodeHTTPMeaning
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:

json
{
    "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.