Back to the board
Agent-friendly

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