Changelog
This page records every shipping change to the Machine API. Subscribe by watching github.com/aggregator-gg/docs.
2026-06-23 — bet-step ladder on the catalog + Apparat enumerated stakes
Section titled “2026-06-23 — bet-step ladder on the catalog + Apparat enumerated stakes”- 🆕
bet_stepson games.GET /v1/gamesandGET /v1/games/{id}now carry an optionalbet_steps— the discrete valid-stake ladder ({currency, steps[]}) for one currency, when on file. Single-currency (no FX), so it answers only for thatcurrency;nullotherwise. See the Game schema. - ⬆️ Apparat free-round stakes are now
enumerated(EUR).GET /v1/games/{id}/stakes?currency=EURreturns Apparat games asmode: enumeratedwithstake_field: bet_amountand the validstakesto pick from, where we hold the ladder (otherwiseprovider_validated, as before). Thestakes[].coin_levelfield is now optional — present only whenstake_fieldiscoin_level;amountis always present. No breaking change to TrueLabs.
2026-06-23 — free-round stake discovery
Section titled “2026-06-23 — free-round stake discovery”- 🆕
GET /v1/games/{game_id}/stakes?currency=. Discover the valid stakes for issuing free rounds on a game in a given currency, so you don’t have to guess thecoin_level/bet_amountforPOST /v1/free-rounds. Branch on the returnedmode:enumeratedlists the valid stakes (pick one and send it viastake_field);provider_validatedmeans submit abet_amountthe provider validates at issue time;unsupportedmeans the game has no free-round stake model. See the API reference and the Free rounds guide.
2026-06-23 — free-round support flag on the game catalog
Section titled “2026-06-23 — free-round support flag on the game catalog”- 🆕
free_rounds_supporton games.GET /v1/gamesandGET /v1/games/{id}now carry a booleanfree_rounds_support— whether the game supports free rounds / free spins. Use it to find issuable games before callingPOST /v1/free-rounds(issuance on afalsegame is rejected at grant time). See the Game schema.
2026-06-23 — certified markets on the game catalog
Section titled “2026-06-23 — certified markets on the game catalog”- 🆕
certified_marketson games.GET /v1/gamesandGET /v1/games/{id}now carry an optionalcertified_marketsobject — the provider-declared allow-list of regulated markets a game is certified for (regulated,dotcom,low_barrier,other,raw). It’s informational for filtering your storefront by what your licence permits — not a launch gate, and a different axis fromblocked_countries(which is enforced against the playercountry).nullwhen the provider declares no market data. See the Game schema.
2026-06-22 — free-rounds issuance API documented
Section titled “2026-06-22 — free-rounds issuance API documented”- 🆕 Issue free rounds via the API.
POST /v1/free-rounds(issue),GET /v1/free-rounds(list), andPOST /v1/free-rounds/{grant_id}/cancel(cancel) are now in the API reference and the Free rounds guide. Requires thewritescope +Idempotency-Key;countis per game. The settlement still arrives as theis_freewallet callback documented below.
2026-06-19 — free rounds on the wallet callback
Section titled “2026-06-19 — free rounds on the wallet callback”- 🆕 Free rounds (free spins). Free-round wallet events now reach your existing callback endpoint as standard
bet/wincallbacks carrying a newis_free: trueflag plusfree_round_grant_idandfree_round_kind. No new endpoint or action to implement. See the new Free rounds guide. - ⚠️ Balance handling. A
betwithis_free: trueis grant-funded — do not debit the player’s real-money balance; itsamountis the nominal stake for reporting only. Awinwithis_free: trueis credited like any win. Branch onis_free. - ✅ What to do: if you have no free-round promotions configured, no action is required — you will not receive
is_freecallbacks. Before enabling free rounds, update your handler per the Free rounds go-live checklist.
2026-06-14 — structured error codes on session business errors
Section titled “2026-06-14 — structured error codes on session business errors”- ⚠️ Breaking (error body shape).
POST /v1/sessions,POST /v1/demo-sessions, andGET /v1/games/{id}now return their business errors in the documented nested envelope —{ "error": { "code", "type", "message" } }— instead of a flat{ "error": "<message>" }. HTTP status codes are unchanged, and successful responses are unchanged. Affected codes:E2001game_not_found(404),E2002game_not_enabled(403),E2003game_blocked_jurisdiction(403),E3004player_self_excluded(403). - ✅ What to do: branch on
error.code(as the code samples and error reference already show). If your integration readerroras a string for these failures, switch toerror.message. Matching on HTTP status keeps working unchanged.
2026-05-27 — public status page
Section titled “2026-05-27 — public status page”- 🆕 Status page launched at status.aggregator.gg. Public uptime + incident history for the four operator-facing surfaces (API, cabinet, marketing site, docs). Subscribe to incident updates via email.
2026-05-26 — initial public documentation
Section titled “2026-05-26 — initial public documentation”- 🆕 Documentation:
docs.aggregator.gglaunched. - 🆕 OpenAPI 3.1 spec published — see the public mirror at
aggregator-gg/docs/openapi/aggregator.yaml. Use it for SDK generation, Postman collections, and contract testing on your side. - 🆕 Versioning policy: Hybrid path +
Aggregator-Versionheader model (see Versioning). 180-day minimum deprecation window. - 🆕
Idempotency-Keyheader documented as required onPOST /v1/sessionsand other financial endpoints.
Earlier — pre-changelog
Section titled “Earlier — pre-changelog”Releases before this changelog are not retrospectively listed. Reach out to your account contact if you need a specific historical change documented.