Skip to content
FreeTicketDocs
Esc
↑↓navigate↵open⌘Jpreview

Headless sign-up: creates the unverified account and sends the email

Public (no auth). Verify-first: no credential is issued. The optional workspaceName creates the first tenant in the same step (on the free Spark plan). Rate-limited per IP and per email.

POST/auth/signup
Request body
requiredapplication/json
emailstring<email>required
matches ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
namestringrequired
min length 2 · max length 120
workspaceNamestring
min length 2 · max length 80
Responses
202

Account pending verification (or already existing: same shape, no enumeration). The email sent is used to verify AND set a password — it reuses the staff invitation (src/lib/staff-invite.ts). With that, the user can approve an ft login (Device Grant) from their browser.

user_idstringrequired
statusstringrequired
verification_sent_tostringrequired
422

Invalid body (email, name or workspaceName).

errorobjectrequired
Show properties
codestringrequired
messagestringrequired
retryablebooleanrequired
detailsany
429

Too many attempts from the same IP or the same email.

errorobjectrequired
Show properties
codestringrequired
messagestringrequired
retryablebooleanrequired
detailsany
Try it
Server
Bodyapplication/json
Request
curl -X POST 'https://admin.appfreeticket.com/api/v1/auth/signup' \
  -H 'Content-Type: application/json' \
  -d '{
  "email": "user@example.com",
  "name": "string",
  "workspaceName": "string"
}'
Response
{
  "user_id": "string",
  "status": "pending_verification",
  "verification_sent_to": "string"
}