Verity API

Error Handling

Understanding API errors and how to handle them

The Verity API uses conventional HTTP response codes and returns consistent error responses to help you handle errors gracefully.

Error Response Format

All error responses follow this structure:

{
  "success": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Human-readable error message",
    "hint": "Suggestion for fixing the error",
    "details": { ... }
  },
  "meta": {
    "request_id": "req_abc123"
  }
}

HTTP Status Codes

CodeDescription
200Success
400Bad Request - Invalid parameters
401Unauthorized - Invalid or missing API key
403Forbidden - Valid key but insufficient permissions
404Not Found - Resource doesn't exist
429Too Many Requests - Rate limit exceeded
500Internal Server Error - Something went wrong on our end

Error Codes

Authentication Errors

CodeDescription
AUTH_MISSINGNo Authorization header provided
AUTH_INVALID_FORMATAuthorization header format is incorrect
AUTH_INVALID_KEYAPI key is invalid or not found
AUTH_REVOKED_KEYAPI key has been revoked
AUTH_SUSPENDED_KEYAPI key is suspended
AUTH_SCOPE_INSUFFICIENTKey doesn't have required scope

Validation Errors

CodeDescription
VALIDATION_ERRORGeneric validation error - check details
VALIDATION_INVALID_JSONRequest body is not valid JSON
VALIDATION_MISSING_FIELDRequired field is missing
VALIDATION_INVALID_TYPEField has wrong type

Resource Errors

CodeDescription
RESOURCE_NOT_FOUNDRequested resource doesn't exist
RESOURCE_POLICY_NOT_FOUNDPolicy ID not found
RESOURCE_CODE_NOT_FOUNDProcedure code not found

Rate Limiting

CodeDescription
RATE_LIMIT_EXCEEDEDToo many requests
RATE_LIMIT_MINUTEMinute-based limit exceeded

Request Errors

CodeDescription
REQUEST_INVALID_CURSORPagination cursor is invalid
REQUEST_MISSING_IDEMPOTENCYPOST request missing idempotency key
REQUEST_DUPLICATEDuplicate idempotent request

Handling Errors

JavaScript Example

async function makeApiRequest(url) {
  const response = await fetch(url, {
    headers: {
      'Authorization': `Bearer ${API_KEY}`
    }
  });

  const data = await response.json();

  if (!data.success) {
    const { code, message, hint } = data.error;

    switch (code) {
      case 'AUTH_INVALID_KEY':
        // Handle invalid API key
        console.error('Invalid API key. Check your credentials.');
        break;
      case 'RATE_LIMIT_EXCEEDED':
        // Implement retry logic
        const retryAfter = response.headers.get('Retry-After');
        console.log(`Rate limited. Retry after ${retryAfter} seconds.`);
        break;
      case 'VALIDATION_ERROR':
        // Handle validation errors
        console.error('Validation error:', data.error.details);
        break;
      default:
        console.error(`Error ${code}: ${message}`);
    }

    throw new Error(message);
  }

  return data.data;
}

Python Example

import requests

class VerityAPIError(Exception):
    def __init__(self, code, message, hint=None):
        self.code = code
        self.message = message
        self.hint = hint
        super().__init__(message)

def make_api_request(url, api_key):
    response = requests.get(url, headers={'Authorization': f'Bearer {api_key}'})
    data = response.json()

    if not data.get('success'):
        error = data.get('error', {})
        raise VerityAPIError(
            error.get('code'),
            error.get('message'),
            error.get('hint')
        )

    return data['data']

Request ID

Every response includes a request_id in the meta object. Include this when contacting support to help us debug issues:

{
  "meta": {
    "request_id": "req_abc123def456"
  }
}

Retry Strategy

For transient errors (5xx status codes), implement an exponential backoff retry strategy:

  1. Wait 1 second, retry
  2. Wait 2 seconds, retry
  3. Wait 4 seconds, retry
  4. Give up after 3 retries

For 429 errors, use the Retry-After header value instead.

On this page