Home · For developers · Deploy API

Customer Deploy API · v1

Deploy a QA test from CI.

After CI is green, create an unpaid draft, pay with Stripe Hosted Checkout or the in-app pay page, then open slots for verified human testers. Automation caught what you scripted — this is the layer that catches what you didn’t. No sales call — API keys live in your developer dashboard.

How it works

  1. Sign up as a developer, open API in the app, and create a key (secret shown once).
  2. From CI or your app, POST /api/v1/tests with the key — you get a draft plus a checkout_url.
  3. Pay via the checkout URL (hosted Stripe page or in-app Elements).
  4. When payment succeeds, the test becomes open / paid and testers can claim slots.
  5. Poll GET /api/v1/tests/:id for 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_modecheckout_urlBest 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)

MethodPathPurpose
POST/testsCreate unpaid draft + checkout URL
GET/tests/:idStatus, claims, title_editable
PATCH/tests/:idRename while draft, or open with no claims yet
GET/projectsList projects for project_id
GET/form-templatesList custom form templates

Create body (highlights)

FieldRequiredNotes
titleYesMarketplace name testers see in Browse
url_to_testYeshttp(s) URL (URL tests in v1)
slots_totalYesTypically 3–20
pay_per_testerYesPlatform minimum applies
deadlineYesFuture ISO timestamp
required_devices / required_browsersYesNon-empty arrays
form_preset or form_template_idOne ofe.g. before_launch
checkout_modeNohosted (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

Not in v1

Ready to wire it up?

Create an account, generate a key under Dev → API, and post your first draft after the next deploy.