> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zerodash.studio/llms.txt
> Use this file to discover all available pages before exploring further.

# Free-to-play mode

> Demo sessions in the virtual FUN currency — no wallet, no callbacks, no tracked bets.

Free-to-play launches a game with virtual money so a player can try it before depositing. It uses the **same launch endpoint** with two parameters changed.

<Warning>
  Do not confuse this with [free rounds](/free-rounds/overview). Free-to-play is a demo with fake money and no wallet involvement. Free rounds are **real money** bonus rounds that do hit your wallet, with a stake of zero.
</Warning>

## Launching a demo

```http theme={null}
GET /api/v1/games/lucky-duck?ipAddress=1.2.3.4&freeToPlay=true&lang=en
X-Operator: your-operator-id
X-Zd-Signature: …
X-Zd-Timestamp: 1778920901644
```

<Check>Set `freeToPlay=true`.</Check>
<Check>Omit `currency` — the session uses the virtual **FUN** currency automatically.</Check>
<Check>Omit `token` — there is no player session to authorize.</Check>

The response is a launch URL just like a real money session, opened the same way.

## What does not happen

<CardGroup cols={2}>
  <Card title="No wallet callbacks" icon="ban">
    Your `/player`, `/debit`, `/credit` and `/rollback` endpoints are never called.
  </Card>

  <Card title="No transactions" icon="receipt">
    Nothing is written to your ledger, and nothing needs reconciling.
  </Card>

  <Card title="No tracked bets" icon="chart-simple">
    Demo bets are not recorded inside Zero-Dash and never appear in reporting.
  </Card>

  <Card title="No player identity" icon="user-slash">
    There is no `accountId`, because there is no authorization step.
  </Card>
</CardGroup>

## Availability

Not every game supports demo mode. Check `freeToPlay` on the game in [List games](/api-reference/customer/list-games) and only render a demo button when it is `true`.

```javascript theme={null}
const demoable = games.filter((g) => g.available && g.freeToPlay);
```

<Note>
  A demo launch for a game with `freeToPlay: false` is rejected. Filter on the catalogue rather than discovering it at click time.
</Note>

## Real money and demo, side by side

|                           | Real money         | Free-to-play                    |
| ------------------------- | ------------------ | ------------------------------- |
| `freeToPlay`              | `false`            | `true`                          |
| `currency`                | Required, ISO-4217 | Must be omitted (virtual `FUN`) |
| `token`                   | Required           | Must be omitted                 |
| Wallet callbacks          | Yes                | None                            |
| Bets tracked by Zero-Dash | Yes                | No                              |
| Session resumption        | Yes                | Not persisted                   |

<Tip>
  Because a demo session has no player identity, it cannot be resumed and carries nothing across reloads. Present it as a try-out, not as gameplay to come back to.
</Tip>
