Skip to main content

Token Refresh

Refresh the access token using a refresh token.

Endpoint

POST /api/v3/auth/token/refresh

Description

Obtains a new access token using a valid refresh token. Use this endpoint when the access token has expired or is about to expire.

Authentication

This endpoint does not require Bearer token authentication. The refresh token is provided in the request body.

Request Body

FieldTypeRequiredDescription
refreshTokenstringYesValid refresh token from login or previous refresh

Response

Returns new session data with fresh tokens.

FieldTypeDescription
accessTokenstringNew JWT access token
refreshTokenstringNew refresh token
tokenTypestringToken type (bearer)
expiresInintegerToken lifetime in seconds
expiresAtintegerToken expiration timestamp
userobjectUser information

Usage

import requests

response = requests.post(
"https://cadenza-api-uat.algo724.com/api/v3/auth/token/refresh",
json={
"refreshToken": "v1.MjAyNC0wMS0xNVQxMDowMDowMFo..."
}
)

data = response.json()["data"]
new_access_token = data["accessToken"]
new_refresh_token = data["refreshToken"] # Update stored refresh token
curl -X POST https://cadenza-api-uat.algo724.com/api/v3/auth/token/refresh \
-H "Content-Type: application/json" \
-d '{"refreshToken": "v1.MjAyNC0wMS0xNVQxMDowMDowMFo..."}'

Example Response

{
"data": {
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "v1.new-refresh-token-here...",
"tokenType": "bearer",
"expiresIn": 3600,
"expiresAt": 1703059835,
"user": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"email": "user@example.com",
"createdAt": "2024-01-15T10:00:00Z"
}
},
"success": true,
"errno": 0,
"error": null
}

Error Responses

HTTP CodeErrorDescription
400Invalid requestMissing refresh token
401Invalid tokenRefresh token is invalid or expired

Example Error

{
"data": null,
"success": false,
"errno": -100003,
"error": "Invalid refresh token"
}

Token Refresh Strategy

Implement proactive token refresh in your application:

import time

class TokenManager:
def __init__(self, access_token: str, refresh_token: str, expires_at: int):
self.access_token = access_token
self.refresh_token = refresh_token
self.expires_at = expires_at

def get_valid_token(self) -> str:
# Refresh 5 minutes before expiry
if time.time() > self.expires_at - 300:
self._refresh()
return self.access_token

def _refresh(self):
response = requests.post(
"https://cadenza-api-uat.algo724.com/api/v3/auth/token/refresh",
json={"refreshToken": self.refresh_token}
)
data = response.json()["data"]
self.access_token = data["accessToken"]
self.refresh_token = data["refreshToken"]
self.expires_at = data["expiresAt"]

Notes

  • The refresh token is also updated on each refresh - always store the new refresh token
  • Refresh tokens have a longer lifetime than access tokens
  • If the refresh token expires, the user must log in again
  • Implement automatic refresh before the access token expires for seamless user experience