Code Examples

Complete code examples for integrating with the CreditRisk API in different programming languages.

Complete Authentication Flow

class CreditRiskAPI {
    constructor(apiToken) {
        this.apiToken = apiToken;
        this.baseURL = 'https://api.creditrisk.co.za/api';
        this.accessToken = localStorage.getItem('access_token');
        this.refreshToken = localStorage.getItem('refresh_token');
    }

    async request(endpoint, options = {}) {
        const url = `${this.baseURL}${endpoint}?api_token=${this.apiToken}`;
        
        const config = {
            headers: {
                'Content-Type': 'application/json',
                ...options.headers
            },
            ...options
        };

        if (this.accessToken && options.requiresAuth) {
            config.headers.Authorization = `Bearer ${this.accessToken}`;
        }

        try {
            let response = await fetch(url, config);
            
            // If unauthorized, try to refresh token
            if (response.status === 401 && this.refreshToken) {
                const refreshed = await this.refreshAccessToken();
                if (refreshed) {
                    config.headers.Authorization = `Bearer ${this.accessToken}`;
                    response = await fetch(url, config);
                }
            }
            
            return await response.json();
        } catch (error) {
            throw new Error(`API request failed: ${error.message}`);
        }
    }

    async login(username, password) {
        const result = await this.request('/auth', {
            method: 'POST',
            body: JSON.stringify({ username, password })
        });

        if (result.status === 'success') {
            this.accessToken = result.access_token;
            this.refreshToken = result.refresh_token;
            
            localStorage.setItem('access_token', this.accessToken);
            localStorage.setItem('refresh_token', this.refreshToken);
        }

        return result;
    }

    async refreshAccessToken() {
        try {
            const result = await this.request('/refresh', {
                method: 'POST',
                body: JSON.stringify({ refresh_token: this.refreshToken })
            });

            if (result.status === 'success') {
                this.accessToken = result.access_token;
                localStorage.setItem('access_token', this.accessToken);
                return true;
            }
        } catch (error) {
            // Refresh failed, redirect to login
            this.logout();
        }
        return false;
    }

    async logout() {
        if (this.accessToken) {
            await this.request('/logout', {
                method: 'POST',
                requiresAuth: true,
                body: JSON.stringify({ access_token: this.accessToken })
            });
        }

        this.accessToken = null;
        this.refreshToken = null;
        localStorage.removeItem('access_token');
        localStorage.removeItem('refresh_token');
    }

    async sendApplicationInvite(inviteData) {
        return await this.request('/send_application_invite', {
            method: 'POST',
            requiresAuth: true,
            body: JSON.stringify(inviteData)
        });
    }
}

// Usage
const api = new CreditRiskAPI('your-api-token-here');

// Login
api.login('user@example.com', 'password123')
    .then(result => {
        if (result.status === 'success') {
            console.log('Logged in successfully');
            
            // Send invite
            return api.sendApplicationInvite({
                email: 'customer@example.com',
                company_name: 'ABC Corp',
                contact_name: 'John Doe'
            });
        }
    })
    .then(result => {
        console.log('Invite sent:', result);
    })
    .catch(error => {
        console.error('Error:', error);
    });

Warning: session_start(): Session cannot be started after headers have already been sent in /var/www/cr_api/pages/examples.php on line 170

Warning: Trying to access array offset on null in /var/www/cr_api/pages/examples.php on line 224

Warning: Trying to access array offset on null in /var/www/cr_api/pages/examples.php on line 275
import requests
import json

class CreditRiskAPI:
    def __init__(self, api_token):
        self.api_token = api_token
        self.base_url = 'https://api.creditrisk.co.za/api'
        self.access_token = None
        self.refresh_token = None
        self.session = requests.Session()

    def _make_request(self, endpoint, data=None, method='GET', requires_auth=False):
        url = f"{self.base_url}{endpoint}?api_token={self.api_token}"
        
        headers = {'Content-Type': 'application/json'}
        
        if requires_auth and self.access_token:
            headers['Authorization'] = f'Bearer {self.access_token}'

        try:
            if method == 'POST':
                response = self.session.post(url, json=data, headers=headers)
            else:
                response = self.session.get(url, headers=headers)
                
            # Handle token refresh
            if response.status_code == 401 and requires_auth and self.refresh_token:
                if self.refresh_access_token():
                    # Retry request with new token
                    return self._make_request(endpoint, data, method, requires_auth)
            
            return response.json()
            
        except requests.exceptions.RequestException as e:
            raise Exception(f"API request failed: {str(e)}")

    def login(self, username, password):
        result = self._make_request('/auth', {
            'username': username,
            'password': password
        }, 'POST')

        if result.get('status') == 'success':
            self.access_token = result['access_token']
            self.refresh_token = result['refresh_token']

        return result

    def refresh_access_token(self):
        if not self.refresh_token:
            return False

        try:
            result = self._make_request('/refresh', {
                'refresh_token': self.refresh_token
            }, 'POST')

            if result.get('status') == 'success':
                self.access_token = result['access_token']
                return True
        except:
            # Refresh failed, clear tokens
            self.logout()
        
        return False

    def logout(self):
        if self.access_token:
            try:
                self._make_request('/logout', {
                    'access_token': self.access_token
                }, 'POST', requires_auth=True)
            except:
                pass  # Ignore logout errors
        
        self.access_token = None
        self.refresh_token = None

    def send_application_invite(self, invite_data):
        return self._make_request('/send_application_invite', 
                                invite_data, 'POST', requires_auth=True)

# Usage
api = CreditRiskAPI('your-api-token-here')

# Login
login_result = api.login('user@example.com', 'password123')
if login_result.get('status') == 'success':
    print("Logged in successfully")
    
    # Send invite
    invite_result = api.send_application_invite({
        'email': 'customer@example.com',
        'company_name': 'ABC Corp',
        'contact_name': 'John Doe'
    })
    
    print("Invite result:", invite_result)
else:
    print("Login failed:", login_result.get('message'))

Error Handling Best Practices

Common Errors
  • 401 Unauthorized: Token expired or invalid
  • 400 Bad Request: Invalid input data
  • 429 Too Many Requests: Rate limit exceeded
  • 500 Server Error: Internal server issue
Best Practices
  • Implement automatic token refresh
  • Use secure token storage
  • Handle network timeouts gracefully
  • Log API responses for debugging