The Praxis API uses JWT (JSON Web Tokens) for authentication. All API requests (except login/register) require a valid token.
POST /api/auth/register
{
"email": "john@example.com",
"password": "securePassword123",
"firstName": "John",
"lastName": "Doe",
"firmName": "Doe & Associates" // optional
}
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"email": "john@example.com",
"firstName": "John",
"lastName": "Doe",
"role": "admin",
"firmId": "660e8400-e29b-41d4-a716-446655440001"
},
"firm": {
"id": "660e8400-e29b-41d4-a716-446655440001",
"name": "Doe & Associates",
"subscriptionTier": "trial",
"subscriptionExpiry": "2026-02-15T00:00:00Z"
}
}
POST /api/auth/login
{
"email": "john@example.com",
"password": "securePassword123"
}
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": { ... },
"firm": { ... }
}
| Status | Error | Description |
|---|---|---|
| 401 | Invalid email or password | Credentials don't match |
| 401 | Account is disabled | User account has been deactivated |
| 401 | Firm account is disabled | Firm subscription expired or disabled |
Include the token in the Authorization header for all authenticated requests:
GET /api/cases HTTP/1.1
Host: cloud.praxislegal.be
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
curl -X GET "https://cloud.praxislegal.be/api/cases" \
-H "Authorization: Bearer YOUR_TOKEN_HERE"
const response = await fetch('https://cloud.praxislegal.be/api/cases', {
headers: {
'Authorization': `Bearer ${token}`
}
});
const data = await response.json();
GET /api/auth/me
Returns the currently authenticated user and firm information.
{
"user": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"email": "john@example.com",
"firstName": "John",
"lastName": "Doe",
"role": "admin",
"firmId": "660e8400-e29b-41d4-a716-446655440001"
},
"firm": {
"id": "660e8400-e29b-41d4-a716-446655440001",
"name": "Doe & Associates",
"subscriptionTier": "professional",
"subscriptionExpiry": "2027-01-15T00:00:00Z"
}
}
POST /api/auth/change-password
{
"currentPassword": "oldPassword123",
"newPassword": "newSecurePassword456"
}
{
"message": "Password changed successfully"
}
JWT tokens expire after 24 hours. When a token expires, you'll receive a 401 response:
{
"error": "Token expired"
}
Simply call the login endpoint again to obtain a new token.