Error Handling

The FaceSign API uses conventional HTTP response codes to indicate the success or failure of an API request. Understanding these errors and implementing proper error handling is crucial for building a robust integration.

HTTP status codes

FaceSign returns the following HTTP status codes:

  • Name
    200 OK
    Description

    The request was successful.

  • Name
    201 Created
    Description

    The resource was successfully created.

  • Name
    400 Bad Request
    Description

    The request was invalid or cannot be served. Check the error message for details.

  • Name
    401 Unauthorized
    Description

    The request requires authentication or the API key is invalid.

  • Name
    403 Forbidden
    Description

    The API key doesn't have permissions to perform the request.

  • Name
    404 Not Found
    Description

    The requested resource doesn't exist.

  • Name
    409 Conflict
    Description

    The request conflicts with another request (perhaps using the same idempotency key).

  • Name
    429 Too Many Requests
    Description

    Too many requests hit the API too quickly. We recommend implementing exponential backoff.

  • Name
    500 Internal Server Error
    Description

    Something went wrong on FaceSign's end. These are rare.

Error response format

All error responses follow a consistent format:

Error response

{
  "error": {
    "type": "invalid_request_error",
    "message": "The 'mode' parameter is required.",
    "param": "mode",
    "code": "parameter_missing"
  }
}

Error object properties

  • Name
    type
    Type
    string
    Description

    The type of error returned. See error types below.

  • Name
    message
    Type
    string
    Description

    A human-readable message providing more details about the error.

  • Name
    param
    Type
    string
    Description

    The parameter the error relates to if the error is parameter-specific.

  • Name
    code
    Type
    string
    Description

    A short string uniquely identifying the problem.

Error types

  • Name
    api_error
    Description

    API errors cover any other type of problem (e.g., a temporary problem with FaceSign's servers).

  • Name
    authentication_error
    Description

    Failure to properly authenticate in the request.

  • Name
    invalid_request_error
    Description

    Invalid request errors arise when your request has invalid parameters.

  • Name
    rate_limit_error
    Description

    Too many requests hit the API too quickly.

  • Name
    validation_error
    Description

    Errors triggered by our validation system (e.g., invalid email format).

Handling errors

Here's how to properly handle errors in your integration:

Error handling examples

import { FaceSign } from '@facesign/sdk';

const facesign = new FaceSign({
  apiKey: process.env.FACESIGN_API_KEY,
});

try {
  const session = await facesign.sessions.create({
    mode: 'redirect',
    success_url: 'https://example.com/success',
    cancel_url: 'https://example.com/cancel',
  });
} catch (error) {
  if (error.type === 'invalid_request_error') {
    // Handle invalid parameters
    console.error(`Invalid parameter: ${error.param}`);
    console.error(`Error message: ${error.message}`);
  } else if (error.type === 'authentication_error') {
    // Handle authentication errors
    console.error('Check your API key');
  } else if (error.statusCode === 429) {
    // Handle rate limiting
    console.error('Rate limited. Retry after:', error.headers['retry-after']);
  } else {
    // Handle other errors
    console.error('An unexpected error occurred:', error.message);
  }
}

Common errors and solutions

Authentication errors

Invalid API key

{
  "error": {
    "type": "authentication_error",
    "message": "Invalid API key provided.",
    "code": "invalid_api_key"
  }
}

Solution: Check that you're using the correct API key and that it hasn't been revoked.

Invalid request errors

Missing required parameter

{
  "error": {
    "type": "invalid_request_error",
    "message": "The 'success_url' parameter is required.",
    "param": "success_url",
    "code": "parameter_missing"
  }
}

Solution: Ensure all required parameters are included in your request.

Rate limit errors

Rate limit exceeded

{
  "error": {
    "type": "rate_limit_error",
    "message": "Too many requests. Please retry after 60 seconds.",
    "code": "rate_limit_exceeded"
  }
}

Solution: Implement exponential backoff and respect the Retry-After header.

Implementing retry logic

For transient errors and rate limiting, implement exponential backoff:

Retry with exponential backoff

async function createSessionWithRetry(params: any, maxRetries = 3) {
  let lastError;
  
  for (let i = 0; i < maxRetries; i++) {
    try {
      return await facesign.sessions.create(params);
    } catch (error) {
      lastError = error;
      
      // Don't retry client errors (4xx) except rate limits
      if (error.statusCode >= 400 && error.statusCode < 500 && error.statusCode !== 429) {
        throw error;
      }
      
      // Calculate delay with exponential backoff
      const delay = Math.min(1000 * Math.pow(2, i), 10000);
      
      // Use Retry-After header if available
      if (error.headers && error.headers['retry-after']) {
        const retryAfter = parseInt(error.headers['retry-after']) * 1000;
        await new Promise(resolve => setTimeout(resolve, retryAfter));
      } else {
        await new Promise(resolve => setTimeout(resolve, delay));
      }
    }
  }
  
  throw lastError;
}

Idempotency

To safely retry requests without accidentally performing the same operation twice, use idempotency keys:

Using idempotency keys

const session = await facesign.sessions.create({
  mode: 'redirect',
  success_url: 'https://example.com/success',
  cancel_url: 'https://example.com/cancel',
}, {
  idempotencyKey: 'unique-key-for-this-request',
});

Best practices

  1. Always handle errors gracefully - Don't let API errors crash your application
  2. Log errors for debugging - Include request IDs for easier troubleshooting
  3. Implement retry logic - Use exponential backoff for transient errors
  4. Respect rate limits - Monitor your usage and implement proper throttling
  5. Use idempotency keys - Prevent duplicate operations when retrying
  6. Show user-friendly messages - Don't expose technical error details to end users

Getting help

If you encounter persistent errors:

  1. Check the API status page for any ongoing issues
  2. Review your request parameters against the API documentation
  3. Contact support with the request ID from the error response