Gauntlet Invoices Users Jobs Applicants Operations Approvals Releases Console Console live Console mixed Admin tables Records Drafts Files Settings Notifications SPA Modals Consent Div Soup Shadow DOM Frames Charts Long Page Big List Marketing Upgrade Shipments Contacts Documents Workspace Engagement Wishlist Integrations Sign up SSO Live ops

Integrations console

This console loads its data over JSON APIs and can connect your account. Each panel calls one backend endpoint (some run a short multi-step auth flow); the buttons re-issue the call on demand. The network requests below are what the API test generator captures and turns into @api tests.

Healthy baseline

GET /api/invoices

Stable 200 JSON list. The control — a generated @api test here must simply PASS.

idle
GET /api/profile

Returns the account profile, which ECHOES an API key (sk-live-…). A generated test must NOT hard-code the real secret — it must arrive [redacted].

idle

Healable

GET /api/settings

Contract drifted: the display-name field was renamed (displayName → display_name). A naive assertion on the old field fails but is HEAL-fixable — never app_bug.

idle

Header auth

GET /api/me

Bearer/JWT in the Authorization REQUEST HEADER (not a cookie). The generator must capture+replay the header; dropping it → 401 (config_issue, not app_bug), and it must not hard-code the JWT literal. Closes the old A8 gap where the UI never sent a token.

idle
GET /api/usage

Custom X-API-Key header carrying the secret. Redaction must cover the request-header channel; the non-standard header NAME must be captured and replayed verbatim.

idle

Cold injected session

GET /api/account

200 with an acct_session cookie, 401 without one. The card fires it COLD (no cookie) so it deterministically 401s — a CONFIG_ISSUE (expired/absent injected session), NOT app_bug.

idle

OAuth refresh chain

GET /api/wallet

Dependent chain: stale bearer → 401 → POST /api/oauth/token (refresh) → retry wallet with the NEW access_token → 200. The generator must thread a value from response A into request B; the rotated refresh token invalidates the old one.

idle

Request shape

GET /api/search

Query params (?q=acme&status=paid) must survive HAR serialization and be replayed — a method+path-only generator drops them and hits the empty branch. The query is echoed back.

POST /api/invoices

POST with an application/json REQUEST BODY → 201. Exercises JSON-body fidelity: a generator that coerces the body to form-encoding or drops it fails the shape.

idle
PATCH /api/invoices/INV-1002

PATCH — path param + JSON body + mutating verb together. The concrete id (INV-1002) must survive, NOT be over-templated to :id; an unknown id → 404.

idle

CSRF double-submit

GET /api/csrf

Double-submit CSRF: GET /api/csrf sets a readable cookie + returns the token; the POST must mirror it into X-CSRF-Token. Replaying the body but dropping the header → 403.

idle

Real defect (must stay app_bug)

GET /api/report

Genuinely broken: 500 whose body is an HTML error page. The over-match guard — HTML in the response must NOT get it downgraded; a real 5xx stays app_bug.

idle
GET /api/orders/9999

Route removed in a deploy — a real 404 on an endpoint the UI still calls. Stays app_bug.

idle
GET /api/admin/metrics

Authorization bypass: 200 with NO auth when it should 401. A real security defect — must stay app_bug and NOT be mislabeled a cold-session config issue. Contrast A19 below.

idle
GET /api/admin/settings

The correctly-gated SIBLING of A7: an identical no-auth request that 401s. The asymmetry (metrics 200 / settings 401) makes the A7 authz-bypass an OBSERVABLE defect, not a public route.

idle

Expected-401 negative

GET /api/secret

Correctly 401s with no token. A test that ASSERTS 401 here is right and must PASS — the "expected 401" wording must not be downgraded or relabeled cold-session.

idle

Wrong-host / framework auth

GET /api/auth/session

Serves the SPA HTML shell instead of session JSON (wrong-host symptom). res.json() throws "Unexpected token '<'" — a CONFIG_ISSUE, not app_bug.

idle
POST /api/auth/callback/credentials

NextAuth credentials login: 302 that sets next-auth.session-token and resolves to HTML — never JSON (the #1181 trap). A generated test that does res.json() must be CONFIG_ISSUE, not app_bug.

idle
GET /v1/client

Clerk Frontend-API shape: a real app calls https://clerk./v1/client on a separate host with __client/__session cookies + a __clerk_db_jwt param. Single-origin we answer with the SPA shell HTML, so res.json() throws — the delegated-auth wrong-host CONFIG_ISSUE (see README limitation).

idle

Rate-limit, conflict & latency

GET /api/quota

Fires a burst of 6 concurrent calls; a per-session sliding window allows 5, then 429s. The rate_limit verdict must SKIP heal and record status ERROR (not FAILED) — a 429 is not an app_bug.

idle
POST /api/teams

Creates the same team twice: first 201, second 409 {already exists}. The duplicate 409 is state_pollution (a re-run/left-over from a prior test), NOT an app_bug — specific beats generalist.

idle
GET /api/heavy

A slow (~2.5s) 200. The generated test must AWAIT it properly; a too-tight timeout that trips here is a config/timeout issue — it must NOT be classified app_bug. Fired last so it never starves the others.

idle

Replay instability (capture ≠ replay)

GET /api/flags

Healthy 200 JSON during browser capture; every server-to-server replay hits the flag-store outage → 500 JSON. The generated test asserts the observed 200, fails on replay with a real 5xx — app_bug.

idle
GET /api/credits

The capture pass consumed the LAST daily credit: 200 while the browser records it, 429 (Retry-After) on every replay. The 429 must classify rate_limit (heal skipped, status ERROR) — not app_bug.

idle
POST /api/orders

Idempotency trap: the page sends a FIXED orderRef, so capture 201s but replaying the captured payload 409s {order 'ORD-7001' already exists} — left-over state from the prior run: state_pollution.

idle