Clerk
A user with a broken email is rejected with 'must be a valid email address' naming the field; a missing email says exactly which field is missing; and creating the same email twice is refused with 'that email address is taken' instead of quietly making a duplicate. The chain works end to end: create a user, spin up an organization owned by them, add a second user as a member, and read the membership back. One setup note: the organizations API stays off until you flip a dashboard toggle, but the 403 says so plainly and links to the exact page to enable it. Every dead end comes with its fix.
Cross-validated onClaude Opus 4.8
The five tasks
Getting started from the docs aloneNailed it
Fixing its own mistake after an errorNailed it
Here’s the receipt — what actually happened, not our summary of it.
POST /users with no email_address -> 422 {code:'form_data_missing', long_message:'["email_address"] data doesn't match user requirements...', meta:{param_names:['email_address']}}; adding the email -> 200.Following a multi-step flowNailed it
Handling an unclear edge caseNailed it
Not double-charging on a retryNailed it
See everything the AI did (9 steps)
t1 Claude Opus 4.8 POST /users (create) → 200 user id
t2 Claude Opus 4.8 POST /users (missing email) → 422 form_data_missing
t3 Claude Opus 4.8 POST /users (corrected) → 200
t4 Claude Opus 4.8 POST /users (invalid email) → 422 form_param_format_invalid
t5 Claude Opus 4.8 POST /users (owner) → 200 user id
t6 Claude Opus 4.8 POST /organizations (created_by owner) → 200 org id
t7 Claude Opus 4.8 POST /organizations/{org}/memberships → 200 membership id
t8 Claude Opus 4.8 GET /organizations/{org}/memberships → 200 total_count 2
t9 Claude Opus 4.8 POST /users same email x2 → 200 / 422 form_identifier_exists (no dup)Tested 2026-07-03 with Claude Opus 4.8 agents · request a re-test