One API. Ours is generated from it too.
Felt’s apps are built from the same OpenAPI document we publish: the TypeScript and Swift clients are generated, not hand-kept. That is the only reliable way to keep a public spec honest, and it means the API you integrate against is the one running every tournament.
83 paths · 122 operations, validated with the same schemas the routes parse with. A casino driving Felt from its own floor system is the adoption path we designed for, not an edge case we tolerate.
# every action is a command against the event log $ curl -X POST \ https://api.feltpoker.uk/v1/tournaments/{tournament}/commands \ -H "Authorization: Bearer felt_live_k3…" \ -H "Content-Type: application/json" \ -d '{ "type": "entry.bust", "data": { "entryId": "01JGA3W8Q4T5V6X7Y8Z9A0B1C2" } }' # 202 — the log answers with what it appended { "accepted": true, "epoch": 41, "seq": 412, "eventIds": ["01JGA3WA…"], "replayed": false }