| name | Yes | Project name shown in the dashboard, e.g. the app's name. | |
| frame | No | Default frame for phone/tablet videos: portrait (9:16, default), landscape (widescreen 16:9) or none (full screen). | |
| voice | No | Narration voice id from list_voices (default: the language's default voice). | |
| device | No | Default device for this project's videos: desktop (default) or a phone/tablet preset (desktop, iphone, iphone-max, android, android-large, ipad, ipad-pro, android-tablet). Any run can override it. | |
| backdrop | No | Default backdrop behind the phone frame: neutral (default) or brand. | |
| language | No | Narration language code from list_voices (default en). | |
| variables | No | Demo credentials, e.g. [{name: "USERNAME", value: "demo@example.com"}, {name: "PASSWORD", value: "…"}], referenced in guides as {USERNAME}. Stored encrypted and never returned by any tool. A value passed here goes through the conversation; to keep it out of chat, leave variables out and set them on the project's page in the Screen Browser dashboard. | |
| app_locale | No | BCP-47 code of the app's interface language (de, pt-BR). Guides can be in any language; the recorder looks for the words the page shows. Omit for English. | |
| target_url | Yes | The app's login or home page, e.g. https://app.example.com/login | |
| allow_hosts | No | Other hosts the app loads or calls (API, CDN, auth). The recording browser can reach only the target host plus these. | |
| attestation_type | Yes | Legal basis for recording this app: {"self_owned":"I own or operate this application.","client_authorized":"My client has authorised me to record this application on their behalf.","internal_tool":"This is an internal tool and I have authority to record it."} | |
| login_success_text | No | Login gate: visible text present only when signed in, e.g. "Sign out". | |
| login_success_selector | No | Login gate: a CSS selector visible only when signed in, e.g. nav a[href="/campaigns"]. | |
| login_success_url_contains | No | Login gate: URL fragment present only after a successful login, e.g. /dashboard. If the app lands on the root URL after login, use login_success_selector or login_success_text instead. At least one gate is required; recording never starts before it passes. | |