Error Codes
This page provides a complete reference of error codes returned by the Point API, along with their meanings and recommended resolutions.
HTTP Status Codes
| Status Code | Meaning |
|---|---|
200 OK | Request succeeded |
201 Created | Resource was created successfully |
204 No Content | Request succeeded with no response body |
400 Bad Request | Request is malformed |
401 Unauthorized | Authentication required or failed |
403 Forbidden | Authenticated but not authorised |
404 Not Found | Resource does not exist |
409 Conflict | Resource conflict (e.g., duplicate) |
422 Unprocessable Entity | Validation failed |
429 Too Many Requests | Rate limit exceeded |
500 Internal Server Error | Unexpected server error |
503 Service Unavailable | Platform temporarily unavailable |
Application Error Codes
Authentication Errors (AUTH_*)
| Code | Description | Resolution |
|---|---|---|
AUTH_TOKEN_MISSING | No access token provided | Include Authorization: Bearer {token} header |
AUTH_TOKEN_INVALID | Token is malformed or tampered | Request a new token |
AUTH_TOKEN_EXPIRED | Token has expired | Request a new token |
AUTH_INSUFFICIENT_SCOPE | Token doesn't have required permissions | Request a token with the correct scope |
AUTH_CLIENT_DISABLED | API client has been disabled | Contact your administrator |
Validation Errors (VAL_*)
| Code | Description | Resolution |
|---|---|---|
VAL_REQUIRED_FIELD | A required field is missing | Include the missing field in your request |
VAL_INVALID_FORMAT | A field value is in the wrong format | Check the field format requirements |
VAL_INVALID_CURRENCY | Currency code is not a valid ISO 4217 code | Use a valid 3-letter currency code |
VAL_INVALID_DATE | Date is not in ISO 8601 format | Use YYYY-MM-DD format |
VAL_DATE_RANGE | End date is before start date | Ensure from is before to |
VAL_INVALID_ISIN | ISIN does not pass checksum validation | Verify the ISIN is correct |
VAL_WEIGHTS_NOT_100 | Look-through weights don't sum to 100% | Ensure weights sum to exactly 100 |
Resource Errors (RES_*)
| Code | Description | Resolution |
|---|---|---|
RES_NOT_FOUND | The requested resource does not exist | Check the ID is correct |
RES_DUPLICATE_CODE | A resource with this code already exists | Use a unique code |
RES_ARCHIVED | The resource has been archived | Unarchive it first, or use a different resource |
RES_DEPENDENCY | Cannot delete — resource has dependents | Remove dependents first |
Data Errors (DATA_*)
| Code | Description | Resolution |
|---|---|---|
DATA_PRICE_NOT_FOUND | No price available for the security on the requested date | Check the date and security |
DATA_FX_RATE_NOT_FOUND | No FX rate available for the currency pair on the requested date | Check the date and currency pair |
DATA_VALUATION_NOT_AVAILABLE | Portfolio cannot be valued on the requested date | Check for missing price/FX exceptions |
Rate Limit Errors (RATE_*)
| Code | Description | Resolution |
|---|---|---|
RATE_LIMIT_EXCEEDED | Too many requests in the time window | Wait and retry; implement exponential backoff |
Error Response Format
All errors follow this format:
{
"error": {
"code": "VAL_REQUIRED_FIELD",
"message": "The 'baseCurrency' field is required.",
"details": [
{
"field": "baseCurrency",
"code": "VAL_REQUIRED_FIELD",
"message": "This field is required."
}
],
"requestId": "req_abc123xyz",
"timestamp": "2026-02-17T14:30:00Z"
}
}
Always include the requestId when contacting support about an error.
Retry Strategy
For transient errors (429, 500, 503), implement exponential backoff:
import time
import random
def api_request_with_retry(url, headers, max_retries=5):
for attempt in range(max_retries):
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.json()
if response.status_code in [429, 500, 503]:
wait_time = (2 ** attempt) + random.uniform(0, 1)
time.sleep(wait_time)
continue
# Non-retryable error
raise Exception(f"API error: {response.json()}")
raise Exception("Max retries exceeded")