Create Coupon
POST
/api/v1/admin/coupons
const url = 'https://api.ultimateteam.ai/api/v1/admin/coupons';const options = { method: 'POST', headers: {'X-API-Key': '<X-API-Key>', 'Content-Type': 'application/json'}, body: '{"active":true,"bonus_credits":0,"code":"example","description":"example","discount_type":"percent","discount_value":1,"duration":"once","duration_months":1,"expires_at":"2026-04-15T12:00:00Z","max_redemptions":1,"plan_grant":"starter"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.ultimateteam.ai/api/v1/admin/coupons \ --header 'Content-Type: application/json' \ --header 'X-API-Key: <X-API-Key>' \ --data '{ "active": true, "bonus_credits": 0, "code": "example", "description": "example", "discount_type": "percent", "discount_value": 1, "duration": "once", "duration_months": 1, "expires_at": "2026-04-15T12:00:00Z", "max_redemptions": 1, "plan_grant": "starter" }'Create a coupon.
The code is normalized to UPPERCASE by the request schema, so the UNIQUE constraint sees the same form every redemption path looks up.
Args: body: Validated coupon definition. user: The authenticated platform operator (injected). session: Database session.
Returns: The created coupon.
Raises: HTTPException 409: A coupon with this code already exists.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”Media typeapplication/json
CreateCouponRequest
POST /api/v1/admin/coupons request body.
object
active
Active
boolean
bonus_credits
Bonus Credits
Extra credits granted on top of the plan allowance.
integer
code
required
Code
Coupon code. Normalized to UPPERCASE before storage.
string
discount_type
Discount Type
‘percent’ (0..100) or ‘fixed_amount’ (cents off).
string
discount_value
required
Discount Value
0..100 when discount_type is ‘percent’, else cents.
integer
duration
Duration
Stripe-compatible discount duration.
string
Responses
Section titled “ Responses ”Successful Response
Media typeapplication/json
CouponOut
The canonical coupon JSON shape returned by every coupon endpoint.
object
active
required
Active
boolean
bonus_credits
required
Bonus Credits
integer
code
required
Code
string
created_at
required
Created At
string format: date-time
discount_type
required
Discount Type
string
discount_value
required
Discount Value
integer
duration
required
Duration
string
id
required
Id
string format: uuid
times_redeemed
required
Times Redeemed
integer
Examplegenerated
{ "active": true, "bonus_credits": 1, "code": "example", "created_at": "2026-04-15T12:00:00Z", "created_by": "example", "description": "example", "discount_type": "example", "discount_value": 1, "duration": "example", "duration_months": 1, "expires_at": "2026-04-15T12:00:00Z", "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "max_redemptions": 1, "plan_grant": "example", "times_redeemed": 1}Validation Error
Media typeapplication/json
HTTPValidationError
object
detail
Detail
Array<object>
ValidationErrorobject
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" } ]}