User login
/auth/loginPublicAuthenticate a user with email and password. Returns access token and refresh token. The access token expires in 1 hour, refresh token in 7 days.
Request body
- emailstring (email)required
User's email address
- passwordstring (password)required
User's password (min 8 characters)
Responses
200Login successful
SuccessResponse
- successenumrequiredtrue
Always true for successful responses
- dataobjectrequired
Response data (structure varies by endpoint)
metaMetarequired
- timestampstring (date-time)required
Response timestamp
- requestIdstringrequired
Unique request identifier for debugging
paginationPagination
- pageintegerrequired
Current page number (1-indexed)
- limitintegerrequired
Items per page
- totalintegerrequired
Total number of items
- totalPagesintegerrequired
Total number of pages
object
dataobject
userUser
- idstring (uuid)required
User unique identifier
- emailstring (email)required
User's email address
- firstNamestring
User's first name
- lastNamestring
User's last name
- roleenumrequired"SUPER_ADMIN" · "ADMIN" · "CLIENT"
User's role
- workspaceIdstring (uuid)
Associated workspace ID
- emailVerifiedboolean
Whether email is verified
- avatarPathstring
Path to user avatar image
- createdAtstring (date-time)
Account creation timestamp
- updatedAtstring (date-time)
Last update timestamp
- accessTokenstring
JWT access token (expires in 1 hour)
- refreshTokenstring
JWT refresh token (expires in 7 days)
- expiresIninteger
Access token expiration in seconds
{
"success": true,
"data": {
"user": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"email": "admin@coinbax.com",
"firstName": "Admin",
"lastName": "User",
"role": "ADMIN",
"workspaceId": "123e4567-e89b-12d3-a456-426614174000"
},
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"expiresIn": 3600
},
"meta": {
"timestamp": "2026-02-24T12:00:00.000Z",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}400Bad request - validation error
- successenumrequiredfalse
Always false for error responses
dataobject
Always null for error responses
objectAlways null for error responses
errorErrorrequired
- codestringrequired
Machine-readable error code
- messagestringrequired
Human-readable error message
- statusCodeintegerrequired
HTTP status code
detailsobject
Additional error details (optional)
objectAdditional error details (optional)
metaMetarequired
- timestampstring (date-time)required
Response timestamp
- requestIdstringrequired
Unique request identifier for debugging
paginationPagination
- pageintegerrequired
Current page number (1-indexed)
- limitintegerrequired
Items per page
- totalintegerrequired
Total number of items
- totalPagesintegerrequired
Total number of pages
{
"success": false,
"data": null,
"error": {
"code": "VALIDATION_ERROR",
"message": "Request validation failed",
"statusCode": 400,
"details": {
"email": "Invalid email format"
}
},
"meta": {
"timestamp": "2026-02-24T12:00:00.000Z",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}401Invalid credentials
- successenumrequiredfalse
Always false for error responses
dataobject
Always null for error responses
objectAlways null for error responses
errorErrorrequired
- codestringrequired
Machine-readable error code
- messagestringrequired
Human-readable error message
- statusCodeintegerrequired
HTTP status code
detailsobject
Additional error details (optional)
objectAdditional error details (optional)
metaMetarequired
- timestampstring (date-time)required
Response timestamp
- requestIdstringrequired
Unique request identifier for debugging
paginationPagination
- pageintegerrequired
Current page number (1-indexed)
- limitintegerrequired
Items per page
- totalintegerrequired
Total number of items
- totalPagesintegerrequired
Total number of pages
{
"success": false,
"data": null,
"error": {
"code": "INVALID_CREDENTIALS",
"message": "Invalid email or password",
"statusCode": 401
},
"meta": {
"timestamp": "2026-02-24T12:00:00.000Z",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}429Too many requests - rate limit exceeded
- successenumrequiredfalse
Always false for error responses
dataobject
Always null for error responses
objectAlways null for error responses
errorErrorrequired
- codestringrequired
Machine-readable error code
- messagestringrequired
Human-readable error message
- statusCodeintegerrequired
HTTP status code
detailsobject
Additional error details (optional)
objectAdditional error details (optional)
metaMetarequired
- timestampstring (date-time)required
Response timestamp
- requestIdstringrequired
Unique request identifier for debugging
paginationPagination
- pageintegerrequired
Current page number (1-indexed)
- limitintegerrequired
Items per page
- totalintegerrequired
Total number of items
- totalPagesintegerrequired
Total number of pages
{
"success": false,
"data": null,
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Too many requests, please try again later",
"statusCode": 429
},
"meta": {
"timestamp": "2026-02-24T12:00:00.000Z",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}500Internal server error
- successenumrequiredfalse
Always false for error responses
dataobject
Always null for error responses
objectAlways null for error responses
errorErrorrequired
- codestringrequired
Machine-readable error code
- messagestringrequired
Human-readable error message
- statusCodeintegerrequired
HTTP status code
detailsobject
Additional error details (optional)
objectAdditional error details (optional)
metaMetarequired
- timestampstring (date-time)required
Response timestamp
- requestIdstringrequired
Unique request identifier for debugging
paginationPagination
- pageintegerrequired
Current page number (1-indexed)
- limitintegerrequired
Items per page
- totalintegerrequired
Total number of items
- totalPagesintegerrequired
Total number of pages
{
"success": false,
"data": null,
"error": {
"code": "INTERNAL_ERROR",
"message": "An unexpected error occurred",
"statusCode": 500
},
"meta": {
"timestamp": "2026-02-24T12:00:00.000Z",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}curl -X POST https://core-staging.coinbax.com/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "admin@coinbax.com",
"password": "admin123"
}'const response = await fetch('https://core-staging.coinbax.com/api/v1/auth/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"email": "admin@coinbax.com",
"password": "admin123"
}),
});
const result = await response.json();