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

# Sign-in on a Smart TV or a kiosk

> Recipe: sign-in with a QR code on a device without a keyboard — the backend creates a confirmation, the device shows the QR code, the user confirms on the phone, and the backend opens the session.

Your app runs on a TV, a kiosk or a device with nothing to type on. You want the user to sign in with
a QR code on the screen and confirm the sign-in in a messenger on their phone.

<Note>
  If the device has a browser or a webview, a regular sign-in works — see the
  [Passwordless sign-in for a web app](/docs/recipes/web-app-sign-in) recipe. Below is the path without a browser.
</Note>

## What you need

* a Veriqa server with a channel enabled;
* a backend for the app: the client secret cannot be stored on the device, because it can be
  extracted from the app;
* room on the screen for the QR code with the "Powered by Veriqa" strip under it.

## Steps

<Steps>
  <Step title="Create a separate client for the device">
    The client needs `AllowClientCredentials`, `AllowConfirmationTokenGrant`, `openid` in
    `AllowedScopes` and a declared action type with the message text —
    [Configure the client](/docs/reference/confirmation-api#1-configure-the-client).
  </Step>

  <Step title="Create a confirmation from the backend">
    `POST /api/transaction/confirmation` returns a `channel_entry` with the QR image and the link —
    [Create the confirmation](/docs/reference/confirmation-api#3-create-the-confirmation).
  </Step>

  <Step title="Show the QR code on the screen">
    The app displays the `qr` image with any TV SDK; no browser is needed —
    [What exists today](/docs/scenarios/smart-tv#what-exists-today).
  </Step>

  <Step title="Wait for the outcome">
    The backend polls `GET /api/transaction/{id}/result` until the outcome is no longer `pending` —
    [Read the outcome](/docs/reference/confirmation-api#4-read-the-outcome).
  </Step>

  <Step title="Open the session">
    The backend exchanges the confirmed transaction for an `id_token`, stores the `sub` and opens its
    own session on the device —
    [Linking from your server](/docs/scenarios/channel-linking#linking-from-your-server-without-a-sign-in).
  </Step>
</Steps>

## How to check

Start a sign-in on the device, scan the QR code with your phone and confirm in the messenger. The
backend should receive the `confirmed` outcome and, after the exchange, an `id_token` with the `sub`
of whoever confirmed.

There is no `refresh_token` on this path: the transaction is redeemed once, and the app itself keeps
the long-lived session on the device.

## Next steps

* [Nova Stream](/docs/samples/showcase/streaming-tv) — a showcase sample on a TV: sign-in through the
  Veriqa page and a purchase confirmed through the server-to-server confirmation API;
* [Smart TV and keyboard-free surfaces](/docs/scenarios/smart-tv) — how this differs from device flow and
  what does not exist yet;
* [Video: sign-in on a TV](/docs/videos/tv-sign-in).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.