Skip to content

Create account

POST
/api/v1/auth/signup
curl --request POST \
--url https://api.ultimateteam.ai/api/v1/auth/signup \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <X-API-Key>' \
--data '{ "company_name": "example", "coupon_code": "example", "email": "hello@example.com", "password": "example" }'

Register a new tenant and owner user, returns a token pair.

Media typeapplication/json
SignupRequest

Request body for the signup endpoint.

Attributes: email: The new user’s email address. password: The new user’s password (min 8 characters). company_name: The company or tenant name. coupon_code: Optional coupon code granting a plan tier and/or bonus credits. A supplied-but-invalid code fails the signup with a 400 rather than silently provisioning Starter.

object
company_name
required
Company Name

Company or tenant name

string
>= 1 characters <= 255 characters
coupon_code
Any of:
string
<= 50 characters
email
required
Email

User email address

string format: email
<= 255 characters
password
required
Password

User password (min 8 chars)

string
>= 8 characters
Examplegenerated
{
"company_name": "example",
"coupon_code": "example",
"email": "hello@example.com",
"password": "example"
}

Successful Response

Media typeapplication/json
SignupResponse

Response body for the signup endpoint.

Attributes: access_token: A short-lived JWT access token. refresh_token: A long-lived JWT refresh token. token_type: Always ‘bearer’. tenant_id: The newly created tenant’s UUID. user_id: The newly created user’s UUID. applied_coupon: Summary of the redeemed coupon, or None when no coupon was supplied. bonus_credits_granted reports what actually landed in the credit store, which can be 0 even for a coupon carrying bonus credits if the credit store was unreachable — the account is still created and on the granted plan, because that is durable in Postgres.

object
access_token
required
Access Token

Short-lived JWT access token

string
applied_coupon
Any of:
AppliedCoupon

Coupon summary embedded in the signup response.

bonus_credits is the entitlement recorded in the redemption row; bonus_credits_granted is what actually landed in the credit store. They differ when the Redis grant failed after the account was already created — signup still succeeds (the plan is durable in Postgres), and the response reports what happened rather than what was intended.

object
bonus_credits
required
Bonus Credits
integer
bonus_credits_granted
required
Bonus Credits Granted
integer
code
required
Code
string
description
Any of:
string
discount_type
required
Discount Type
string
discount_value
required
Discount Value
integer
plan_granted
required
Any of:
string
initial_credit_status
required
InitialCreditStatus

Original signup entitlement, never a claim about remaining balance.

object
initial_credits
Any of:
integer
initial_plan
Any of:
PlanTier

Available subscription plan tiers.

string
Allowed values: starter professional business enterprise
status
required
Status
string
Allowed values: ready pending unavailable reconciliation_required not_recorded
refresh_token
required
Refresh Token

Long-lived JWT refresh token

string
tenant_id
required
Tenant Id

Newly created tenant UUID

string
token_type
required
Token Type

Token scheme, always ‘bearer’

string
user_id
required
User Id

Newly created user UUID

string
Example
{
"initial_credit_status": {
"initial_plan": "starter",
"status": "ready"
}
}

Validation Error

Media typeapplication/json
HTTPValidationError
object
detail
Detail
Array<object>
ValidationError
object
ctx
Context
object
input
Input
loc
required
Location
Array
msg
required
Message
string
type
required
Error Type
string
Examplegenerated
{
"detail": [
{
"ctx": {},
"input": "example",
"loc": [
"example"
],
"msg": "example",
"type": "example"
}
]
}