On this page
Your first test in 5 minutes
From an empty workspace to a run with evidence. Every step below names what it costs — nothing in NthCase spends without telling you first.
1 · Redeem a code
Nothing runs without a plan, and plans and credits can't be bought yet. A redemption code gives your workspace a month of a plan — Starter, Pro or Team — and the plan's credits come with it: a weekly budget (Starter 60, Pro 250 and Team 800 credits) that resets every seven days and never rolls over. Redeem yours on the Credits page. A code for the plan you are on adds its month to your current period, a code for a plan with more moves you up to it, and a code never moves you to a plan with less. When the month is over the plan ends: its weekly budget stops, and the rest of the last one goes with it. Some codes carry credits of their own too, and those never expire. Starter costs $29/mo, Pro $99/mo and Team $349/mo once on sale.
2 · Register your app
Upload an .ipa / .apk, give a package id, or point at a web URL — and attest that the app is yours. The attestation is not a checkbox for show: every run, discovery and scope generation is blocked on an un-attested app, before any billing happens. Plans hold 2 / 5 / 10 verified apps; the limit applies when you ADD an app — a plan change never touches the apps you already registered. An app registered with only a package id runs only on one of your own devices where it is already installed — the platform's devices never have it.
3 · Optional: let Discovery map it
Point Discovery at the app and it crawls screen by screen, builds the element map future compiles are grounded in, and proposes scenarios for review. You choose a depth (Quick · Standard · Thorough) and a model, and the exact price is quoted before the crawl starts — you pay the quote, not the meter.
4 · Write a scenario, compile it
A scenario is ordered natural-language steps — no selectors, no ids, and no requirement to write them in English. Compiling produces the deterministic plan that runs replay. With a map from Discovery, the compile takes your app's real selectors from it; without one, it works from the steps alone. Compiling is a spend and floors at 1 credit.
1. Open the storefront and dismiss the cookie banner 2. Add the first product to the basket 3. Go to checkout and fill the delivery form 4. Pay with the declined test card 5. Assert the decline message names the reason
5 · Run it, read the evidence
Trigger the run on a real device. It costs the greater of the run floor — 2 credits on an emulator, 4 on one of our physical devices, and the base 2 with no device time on a device you connected yourself — or the AI tokens it used; a run that reaches no verdict pays tokens only, because an infrastructure failure is not your test failing. The verdict comes back with a screenshot per step, the duration, the model used, the redacted logs, and the network capture when the run recorded one: an Android run whose scenario turns capture on, on one of our devices or on your own phone once its machine has turned capture on; the run's Network tab says why when there is none. Full arithmetic on /docs/pricing.
6 · Put it in CI
Mint an API key (Settings → API keys — owner-only) and gate a pipeline with the CLI. Keys authenticate on Pro and Team: you can mint one before the workspace's plan carries API access, and the same key starts working the moment it does.
npm install -g @nthcase/cli@0.1.6
export NTH_API_KEY=gp_your_key
nth trigger <scenarioId> --wait \
--timeout 900
# exit 0 passed · 1 failed
# 2 engine error · 3 timed out
# 4 cancelledWhat it prints when the run passes, and when it fails:
$ nth trigger 7c2f9a14-5b3e-4d8a-a1f0-3e9b6c2d8f51 --wait Run 4e70d5d5-8f1c-4a3b-9d62-0b7e5c1a9f34 Passed. 2 credits. https://nthcase.com/runs/4e70d5d5-8f1c-4a3b-9d62-0b7e5c1a9f34 $ echo $? 0
$ nth trigger 9b1f3c57-2e84-4d6a-a0c9-6e5d4b3a2f18 --wait Run 3a7e19c4-5b2d-4f60-9c81-d24e6b0f7a35 Failed. 2 credits. https://nthcase.com/runs/3a7e19c4-5b2d-4f60-9c81-d24e6b0f7a35 step 5 failed (assert): Verify the cart reads "Cart (1)" reason: Text of [id="cart-count"] is not exactly "Cart (1)" $ echo $? 1