Documentation

Build against the CPMCheats API

Signed requests and responses, replay protection, per-key scopes and limits, async jobs with live progress, and realtime — across CPM, CPM2, Garage and Traffic Racer.

Introduction

The CPMCheats API wraps the real CPM, CPM2, Garage and Traffic Racer game integrations behind a signed, rate-limited, observable HTTP surface. Every write is authenticated by an HMAC signature; responses are signed too.

Quick Start

  1. Create an API client and key in the owner dashboard.
  2. Store the public token, private token and HMAC secret shown once.
  3. Sign each request (see below) and call an endpoint under /v1.

Authentication

Each key has three credentials:

  • cpm_pk_live_… — public token, identifies the key (X-API-Key).
  • cpm_sk_live_… — private token, authenticates non-signed keys.
  • cpm_hmac_live_… — HMAC secret, signs requests and responses. Never sent.

Request Signing

Build the canonical request and HMAC-SHA256 it with your secret:

canonical =
  "v1" \n
  METHOD \n
  PATH \n
  NORMALIZED_QUERY \n
  TIMESTAMP \n
  NONCE \n
  SHA256_HEX(BODY)

signature = HMAC_SHA256(hmac_secret, canonical)

Send these headers:

X-API-Key: cpm_pk_live_…
X-Timestamp: 1790000000
X-Nonce: 550e8400-e29b-41d4-a716-446655440000
X-Signature: <hex>

Query normalization percent-encodes keys/values (encodeURIComponent rules) and sorts by key then value. Timestamps must be within ±300s; nonces are single-use.

Response Signing

Responses carry a signature over the exact bytes returned:

X-Request-ID: …
X-Response-Timestamp: …
X-Response-Nonce: …
X-Response-Signature: HMAC_SHA256(secret,
  "v1" \n REQUEST_ID \n STATUS \n TS \n NONCE \n SHA256(BODY))

Errors

All errors use one shape and a typed code:

{ "error": { "code": "INVALID_SIGNATURE",
             "message": "Signature verification failed",
             "request_id": "…" } }

Rate Limits

Limits are per key across seconds/minutes/hours/days/months, enforced in Redis so they hold across instances. Responses include X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset; a 429 includes Retry-After.

Idempotency

Important writes accept an Idempotency-Key. The same key with a different payload is rejected; the same key + payload replays the stored result.

Async Jobs & Feedback

Long operations (mass clone, farm, full unlock, bulk car mod, hunt, body-kit/FSO-all) return 202 with a follow-up envelope:

{ "job_id": "…",
  "status": "queued",
  "status_url": "/v1/jobs/{id}",
  "events_url": "/v1/jobs/{id}/events" }

Poll GET /v1/jobs/{id} for the live record, or stream GET /v1/jobs/{id}/events (SSE) for per-step progress — e.g. "Transferring car 12345 (3 of 50)" — until a terminal event. Only the key/client that created a job can read it.

Realtime

The owner dashboard subscribes to /v1/realtime/ws for live requests, jobs, workers, security events and metrics. The public status page uses /v1/status/events (SSE). Both are push-only — no polling.

CPM

Endpoints under /v1/cpm/*: auth, account, money/coins, player, unlocks, rank, friends, cars, store, backup/restore and cloning.

CPM2

Endpoints under /v1/cpm2/*: auth, money/coins, cars, unlock, buy, king rank, air/siren, FSO, body kits, liveries, daily tasks, farm and create account.

Garage

Endpoints under /v1/garage/*: auth, player data, cars, tools and a full hack (player + cars + tools).

Traffic Racer

Endpoints under /v1/traffic/*: auth, anonymous login and hack (money, gold, level, nitro & turbo).

Webhooks

Register a webhook to receive job.completed, job.failed and job.cancelled with an independent HMAC signature in X-Webhook-Signature.