auth

Get Signup Status

Where the caller's own self-serve setup stands.

Deliberately NOT gated on the public signup toggle: an operator switching the surface off must not strand people mid-setup, and this read creates nothing, mails nothing, and answers only about the caller's own address — so keeping it alive leaks nothing the account's existence hasn't already committed to. The write paths stay behind the toggle.

paused is derived from the live pause flag rather than stored, so a waitlisted person always sees the current admission posture.

No account row exists until the verification link is redeemed, so a bare 404 there would tell a mid-verification return "you never signed up" while their link is still live — an outstanding link reports verification_pending instead, and only a truly unknown address 404s.

intent comes from the account when there is one and from the live link when there is not, which is the only place it exists before redemption. The page resends the verification mail from this answer, so a verification_pending read that reported no intent would have a buyer resend themselves a free signup.

get/api/v1/auth/signup/status

Response

Successful Response

status'verification_pending' | 'preparing' | 'ready' | 'failed' | 'waitlisted' | 'paused' required
profile_collectedboolean
intent'free' | 'paid'

What a public signup is asking for.

PAID is what a buyer arriving from the pricing page carries. It is not a funding fact — nothing is charged until checkout, and the workspace opens on the same joining grant a free signup gets — so it decides only two things, and this is the one statement of them that the rest of the codebase points at rather than restates:

  1. None of the free Discovery experiment's controls bind. The seat cap, the waitlist and the operator pause are that experiment's budget, and a buyer is not in it: a paid account holds no seat, so admitting one spends nothing the cap was sized to protect. Its abuse gates still bind — a verified address, the rate limits and the disposable-domain block — because those protect MAIA, not the experiment. The work-email rule is the exception: it decides who the free experiment is offered to, and refusing a buyer for paying from a personal address is a lost sale.
  2. The workspace records WorkspaceOrigin.DIRECT_PAID rather than SELF_SERVE_DISCOVERY.

It is not a privilege worth stealing: everything it unlocks is reachable through the free door by anyone the paid door would admit, except during the hours the free cohort is full or paused.

Changes