How it works
- Sign up as a developer, open API in the app, and create a key (secret shown once).
- From CI or your app,
POST /api/v1/testswith the key — you get a draft plus acheckout_url. - Pay via the checkout URL (hosted Stripe page or in-app Elements).
- When payment succeeds, the test becomes
open/paidand testers can claim slots. - Poll
GET /api/v1/tests/:idfor status and claim counts.
Same prepaid model as the create-test wizard: nothing goes live for testers until Stripe confirms payment.
Quick start
Base URL: https://app.qatested.io/api/v1
Auth: Authorization: Bearer qat_live_… (from Dev → API after sign-in)
export QATESTED_API_KEY='qat_live_PASTE_SECRET_HERE'
export APP_URL='https://app.qatested.io'
curl -sS -X POST "$APP_URL/api/v1/tests" \
-H "Authorization: Bearer $QATESTED_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Staging smoke after deploy",
"url_to_test": "https://staging.example.com",
"form_preset": "before_launch",
"slots_total": 3,
"pay_per_tester": 14,
"deadline": "2030-01-01T23:59:59Z",
"require_recording": true,
"required_devices": ["Mac", "Windows"],
"required_browsers": ["Chrome"],
"min_tester_tier": "standard",
"checkout_mode": "hosted"
}'
Open checkout_url from the JSON, pay, then poll:
curl -sS "$APP_URL/api/v1/tests/TEST_UUID" \
-H "Authorization: Bearer $QATESTED_API_KEY"
Expect "payment_status": "paid" and "status": "open".
Checkout modes
checkout_mode | checkout_url | Best for |
|---|---|---|
hosted (default) |
Stripe Hosted Checkout | CI / sharing a pay link without opening the app first |
dashboard |
In-app pay page (/dev/tests/:id?pay=1) |
Same Stripe Elements flow as Create Test |
Responses always include dashboard_url for the test detail page.
Endpoints
Manage keys (signed-in session)
Create, list, and revoke keys in the app after you sign in as a developer — open API in the sidebar (max 10 active keys per account).
Deploy & inspect (API key)
| Method | Path | Purpose |
|---|---|---|
POST | /tests | Create unpaid draft + checkout URL |
GET | /tests/:id | Status, claims, title_editable |
PATCH | /tests/:id | Rename while draft, or open with no claims yet |
GET | /projects | List projects for project_id |
GET | /form-templates | List custom form templates |
Create body (highlights)
| Field | Required | Notes |
|---|---|---|
title | Yes | Marketplace name testers see in Browse |
url_to_test | Yes | http(s) URL (URL tests in v1) |
slots_total | Yes | Typically 3–20 |
pay_per_tester | Yes | Platform minimum applies |
deadline | Yes | Future ISO timestamp |
required_devices / required_browsers | Yes | Non-empty arrays |
form_preset or form_template_id | One of | e.g. before_launch |
checkout_mode | No | hosted (default) or dashboard |
Test names (title)
title is required on create — it is the listing name testers see. Prefer something human (e.g. Example.com — staging smoke after deploy), not a raw timestamp.
Rename later with PATCH or the pencil control on the test detail page, until the first real tester claim.
curl -sS -X PATCH "$APP_URL/api/v1/tests/TEST_UUID" \
-H "Authorization: Bearer $QATESTED_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "title": "Example.com — after deploy smoke" }'
Security
- Only a hash of the key is stored — copy the secret when it is shown.
- Revoke compromised keys immediately in Dev → API.
- Store secrets in your CI vault; never commit them.
- Keys work only for developer accounts.
Not in v1
- WordPress plugin zip upload via API
- Charge without opening a browser (saved card / wallet)
- OAuth app install for third parties
- Tester claim / submit APIs
Ready to wire it up?
Create an account, generate a key under Dev → API, and post your first draft after the next deploy.