Skip to content

Error Handling

The HEIR API uses standard HTTP status codes and returns structured error responses.

Error Response Format

json
{
  "success": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Human-readable error message",
    "details": [
      { "field": "beneficiaries[0].address", "reason": "Invalid checksum" }
    ]
  },
  "meta": {
    "requestId": "req_abc123xyz",
    "timestamp": "2024-01-15T12:00:00.000Z"
  }
}

HTTP Status Codes

StatusDescription
200Success
201Created
400Bad Request - Invalid parameters
401Unauthorized - Missing or invalid authentication
403Forbidden - Insufficient permissions
404Not Found - Resource doesn't exist
429Too Many Requests - Rate limited
500Internal Server Error

Error Codes

Authentication Errors

CodeDescription
API_KEY_MISSINGNo API key provided
API_KEY_INVALIDInvalid or expired API key
API_KEY_INVALID_FORMATKey doesn't match expected format
UNAUTHORIZEDAuthentication required

Authorization Errors

CodeDescription
INSUFFICIENT_SCOPEAPI key lacks required scope
TIER_NOT_ALLOWEDFeature requires higher tier
IP_NOT_ALLOWEDRequest IP not in whitelist

Validation Errors

CodeDescription
VALIDATION_ERRORRequest parameters invalid
INVALID_ADDRESSWallet address format invalid
INVALID_PERCENTAGEPercentage out of range
PERCENTAGE_SUMBeneficiary percentages don't sum to 100

Resource Errors

CodeDescription
NOT_FOUNDResource not found
ALREADY_EXISTSResource already exists
LIMIT_REACHEDMaximum limit reached

Rate Limit Errors

CodeDescription
RATE_LIMIT_EXCEEDEDToo many requests
BURST_LIMIT_EXCEEDEDToo many requests per second

Handling Errors

javascript
async function makeRequest(endpoint, options) {
  const response = await fetch(`https://api.heir.es/api/v1${endpoint}`, {
    ...options,
    headers: {
      'Authorization': `Bearer ${API_KEY}`,
      'Content-Type': 'application/json',
      ...options.headers
    }
  });
  
  const data = await response.json();
  
  if (!data.success) {
    const error = new Error(data.error.message);
    error.code = data.error.code;
    error.details = data.error.details;
    error.requestId = data.meta.requestId;
    throw error;
  }
  
  return data;
}

// Usage
try {
  const result = await makeRequest('/contracts/generate', {
    method: 'POST',
    body: JSON.stringify(contractData)
  });
} catch (error) {
  console.error(`Error ${error.code}: ${error.message}`);
  console.error('Request ID:', error.requestId); // For support
  
  if (error.code === 'VALIDATION_ERROR') {
    error.details.forEach(d => {
      console.error(`  ${d.field}: ${d.reason}`);
    });
  }
}

Request ID

Every response includes a unique requestId in the meta object. Include this when contacting support for faster resolution.

Released under the MIT License.