Skip to main content

Error Handling

The JLR Data Hub API uses RFC 7807 Problem Details for error responses, providing structured and actionable error information.

Error response format​

All error responses use application/problem+json content type:

{
"type": "/errors/validation-failed",
"title": "Validation Failed",
"status": 400,
"detail": "The request payload contains invalid fields",
"instance": "/v1/vehicles/INVALID-VIN",
"correlationId": "550e8400-e29b-41d4-a716-446655440000",
"violations": [
{
"field": "vin",
"rejectedValue": "INVALID-VIN",
"message": "must be exactly 17 characters"
}
]
}

Common HTTP status codes​

StatusMeaningAction
400Bad RequestCheck request parameters and payload
401UnauthorizedRefresh your access token or re-authenticate
403ForbiddenYour client is not configured to access this resource; check its vehicles and data categories
404Not FoundVerify the resource identifier exists
429Too Many RequestsWait and retry with backoff
500Internal Server ErrorRetry later; report if persistent

Correlation ID​

Every response includes an X-Correlation-ID header. Include this when contacting support to help trace issues.

Retry strategy​

async function fetchWithRetry(url, options, maxRetries = 3) {
for (let attempt = 0; attempt <= maxRetries; attempt++) {
const response = await fetch(url, options);

if (response.status === 429) {
const retryAfter = parseInt(response.headers.get('Retry-After') || '60');
await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
continue;
}

if (response.status >= 500 && attempt < maxRetries) {
const delay = Math.pow(2, attempt) * 1000;
await new Promise(resolve => setTimeout(resolve, delay));
continue;
}

return response;
}

throw new Error('Max retries exceeded');
}