LinqConnect
API Reference

Complete technical reference for the LinqConnect API. Transform business data into actionable intelligence with 28% more accuracy and comprehensive coverage.

Current Version: v1.4.0
Production: https://api.linqura.ai
Demo: https://demo-api.linqura.ai
Format: JSON

Overview

LinqConnect API

The LinqConnect API provides comprehensive business intelligence for commercial insurance underwriting. Transform business names and addresses into complete risk profiles with 28% more accuracy.

7 Specialized AI Agents
Private AI Infrastructure
13 Feature Modules
snake_case Response Format

Key Features

  • Complete Classification: NAICS, SIC, ISO GL, WC codes
  • Risk Assessment: Safety records and risk indicators
  • Property Intelligence: Building details and replacement costs
  • Firmographics: Revenue, employees, business details
  • Coverage Analysis: Recommended coverages and limits
  • Underwriting Questions: Industry-specific questions

API Capabilities

  • 40M+ Businesses: Comprehensive US business database
  • Real-time Data: Updated every 90 days
  • Sub-2 Second Response: High-performance processing
  • Enterprise Scale: Handle thousands of requests
  • REST Architecture: Standard HTTP methods
  • JSON Format: Easy integration and parsing

Authentication

🔐 OAuth2 Client Credentials Flow

LinqConnect uses OAuth2 Client Credentials flow for secure API authentication. You'll receive client credentials (client ID, secret, and scope) when you sign up for access.

Step 1: Obtain Access Token

Exchange your client credentials for an access token:

curl -X POST https://api.linqura.ai/auth/oauth2/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=client_credentials" \
  -d "client_id=your-client-id" \
  -d "client_secret=your-client-secret" \
  -d "scope=default-m2m-resource-server-polax1/linqdata"

Response:

{
  "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
  "expires_in": 3600,
  "token_type": "Bearer"
}

Step 2: Use Access Token for API Calls

Include the Bearer token in your LinqConnect requests:

const response = await fetch('https://api.linqura.ai/v1/linqConnect', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...'
  },
  body: JSON.stringify({
    "enterprise_id": "your-enterprise-id",
    "access_package": "premium",
    "session_id": "session-123",
    "user_id": "user-456",
    "search_type": "business",
    "entity_id": "47574df3ad00c752f5f0a7b6f4b94ccdaa995f23",
    "features": "FIRMO,EXP,RISK,CVG"
  })
});
curl -X POST https://api.linqura.ai/v1/linqConnect \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..." \
  -d '{
    "enterprise_id": "your-enterprise-id",
    "access_package": "premium",
    "session_id": "session-123",
    "user_id": "user-456",
    "search_type": "business",
    "entity_id": "47574df3ad00c752f5f0a7b6f4b94ccdaa995f23",
    "features": "FIRMO,EXP,RISK,CVG"
  }'

📋 What You'll Receive

When you sign up for LinqConnect access:

  • Client ID: Your unique application identifier
  • Client Secret: Your secure authentication secret
  • Scope: default-m2m-resource-server-polax1/linqdata
  • Enterprise ID: Your organization identifier

⚠️ Security Best Practices

  • • Keep client secrets secure and never expose in frontend code
  • • Implement token refresh logic (tokens expire in 1 hour)
  • • Use server-to-server authentication only
  • • Store credentials in secure environment variables
  • • Cache tokens and refresh before expiration

🧪 Demo Environment

For testing and development, use our demo environment with simplified authentication:

Demo Base URL:

https://demo-api.linqura.ai

Demo API Key:

x-api-key: advisor@2024

Note: Demo environment uses simplified API key authentication for easier testing.

Rate Limits

Basic Plan

100
requests/minute

Premium Plan

1,000
requests/minute

Enterprise Plan

10,000
requests/minute

Rate Limit Headers

X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 999
X-RateLimit-Reset: 1609459200
Retry-After: 60

API Endpoints

POST /v1/linqConnect

Main intelligence endpoint for comprehensive business analysis. Returns complete business intelligence including classification, risk assessment, property data, and more.

Request Parameters

Parameter Type Required Description
enterprise_id string Unique identifier for your organization
access_package enum basic, premium, enterprise
session_id string Unique identifier for the user session
user_id string User identifier
search_type enum business, industry
entity_id string Business ID from search endpoint
entity_name string Business name
entity_address string Street address
entity_city string City
entity_state string State (2-letter code)
entity_zip_code string ZIP code
features string Comma-separated feature list

Available Features

Core Features
  • FIRMO - Firmographics and classification
  • RISK - Risk assessment and safety data
  • CVG - Coverage analysis and recommendations
  • EXP - Exposure analysis
  • UWQ - Underwriting questions
Advanced Features
  • PROPERTY - Property details and values
  • RISK_PROPERTY - Property-specific risks
  • REPLACEMENT - Replacement cost analysis
  • FMCD - Fleet and motor carrier data
  • OSHA - OSHA safety records

Example Request

{
  "enterprise_id": "org001",
  "access_package": "premium",
  "session_id": "sess-abc123",
  "user_id": "underwriter_001",
  "search_type": "business",
  "entity_id": "47574df3ad00c752f5f0a7b6f4b94ccdaa995f23",
  "entity_name": "Bailey's Garage",
  "entity_address": "143 Baileys Garage Rd",
  "entity_city": "Bowersville",
  "entity_state": "GA",
  "entity_zip_code": "30516",
  "features": "FIRMO,RISK,CVG,EXP,PROPERTY,UWQ"
}

Complete Response Schema

Real Response Example: This is actual LinqConnect API response data from Bailey's Garage analysis. All fields and structures shown are production-ready and documented below.

Response Metadata
{
  "metadata": {
    "enterprise_id": "org001",
    "session_id": "sess-b95fmhl2o",
    "user_id": "demo_user",
    "search_type": "business",
    "entity_id": "440a0ddf535dfa04ac9b914b396c6c4befc07e0a",
    "entity_name": "Baileys Garage",
    "entity_address": "RR 2 Box 581",
    "entity_city": "Coldwater",
    "entity_state": "MS",
    "entity_zip_code": "38618",
    "features": ["exp", "risk", "cvg", "uwq", "firmo", "property", "risk_property", "replacement", "fmcd", "osha"],
    "access_package": "premium",
    "status": "success",
    "timestamp": "2025-08-17T20:56:47.364004"
  }
}
Business Information (FIRMO)
{
  "firmo": {
    "business_information": {
      "id": "440a0ddf535dfa04ac9b914b396c6c4befc07e0a",
      "name": "Baileys Garage",
      "dba_name": null,
      "location": {
        "street_address": "RR 2 Box 581",
        "city": "Coldwater",
        "state": "MS",
        "zip_code": "38618",
        "latitude": 34.69990158,
        "longitude": -89.9332962
      },
      "start_year": 1996,
      "website": null,
      "description": "Baileys Garage is a General Automotive Repair Shops business providing Automotive Service & Collision Repair services.",
      "business_match_score": 1
    },
    "classification": {
      "primary_naics_verified": {
        "verified": true,
        "naics_code": "811111",
        "naics_title": "General Automotive Repair",
        "confidence": 0.95
      },
      "secondary_naics": [
        {
          "naics_code": "441320",
          "naics_title": "Tire Dealers",
          "confidence": 0.78
        }
      ],
      "sic_codes": [
        {
          "sic_code": "7538",
          "sic_title": "General Automotive Repair Shops",
          "confidence": 0.92
        }
      ],
      "iso_gl_codes": [
        {
          "iso_code": "16925",
          "description": "Automobile Service or Repair Centers",
          "risk_level": "Standard"
        }
      ],
      "wc_codes": [
        {
          "wc_code": "8380",
          "description": "Automobile Service or Repair Centers",
          "rate_class": "Standard"
        }
      ]
    }
  }
}
Risk Assessment
{
  "risk": {
    "overall_risk_score": 3.2,
    "risk_level": "Medium",
    "risk_factors": [
      {
        "category": "Environmental",
        "factor": "Chemical Storage",
        "severity": "Medium",
        "description": "Storage of automotive fluids and chemicals",
        "mitigation": "Proper storage containers and spill containment"
      },
      {
        "category": "Safety",
        "factor": "Equipment Operation", 
        "severity": "Medium",
        "description": "Use of lifts and heavy equipment",
        "mitigation": "Regular equipment maintenance and safety training"
      }
    ],
    "safety_indicators": {
      "osha_violations": 0,
      "safety_rating": "Good",
      "last_inspection": "2023-08-15",
      "safety_programs": ["Equipment Training", "Chemical Handling"]
    },
    "industry_benchmarks": {
      "average_risk_score": 3.8,
      "percentile_ranking": 75,
      "comparison": "Below average risk for industry"
    }
  }
}
Coverage Analysis
{
  "coverage": {
    "recommended_coverages": [
      {
        "coverage_type": "General Liability",
        "recommended_limit": 1000000,
        "minimum_limit": 500000,
        "reasoning": "Standard coverage for automotive repair operations",
        "risk_factors": ["Customer premises liability", "Product liability for parts"],
        "industry_standard": true
      },
      {
        "coverage_type": "Products Liability", 
        "recommended_limit": 1000000,
        "minimum_limit": 500000,
        "reasoning": "Coverage for tire and parts sales",
        "risk_factors": ["Defective parts", "Installation errors"],
        "industry_standard": true
      },
      {
        "coverage_type": "Garagekeepers",
        "recommended_limit": 100000,
        "minimum_limit": 50000,
        "reasoning": "Coverage for customer vehicles in care, custody, control",
        "risk_factors": ["Vehicle damage during service", "Theft from premises"],
        "industry_standard": true
      }
    ],
    "additional_considerations": [
      {
        "coverage_type": "Environmental Liability",
        "reasoning": "Chemical storage and disposal risks",
        "recommended": false,
        "optional": true
      }
    ]
  }
}
Property Intelligence
{
  "property": {
    "building_details": {
      "construction_type": "Masonry Non-Combustible",
      "year_built": 1995,
      "square_footage": 4800,
      "occupancy_type": "Service",
      "number_of_stories": 1,
      "roof_type": "Built-up",
      "heating_type": "Gas",
      "sprinkler_system": false,
      "fire_department_distance": 2.3
    },
    "replacement_cost": {
      "building": 480000,
      "business_personal_property": 150000,
      "equipment": 200000,
      "total_insurable_value": 830000,
      "valuation_method": "Cost Approach",
      "last_updated": "2025-01-15"
    },
    "risk_characteristics": {
      "fire_risk": "Medium",
      "flood_zone": "X",
      "seismic_zone": "Low",
      "wind_exposure": "B"
    }
  }
}
Underwriting Questions
{
  "underwriting_questions": [
    {
      "question": "Do you perform any body work or painting?",
      "category": "Operations",
      "importance": "High",
      "reasoning": "Affects environmental and fire risk exposure",
      "expected_answers": ["Yes", "No"],
      "follow_up_required": true
    },
    {
      "question": "What is your annual payroll?",
      "category": "Exposure",
      "importance": "High", 
      "reasoning": "Determines workers compensation exposure",
      "expected_format": "Currency",
      "validation_required": true
    },
    {
      "question": "Do you have a customer waiting area?",
      "category": "Premises",
      "importance": "Medium",
      "reasoning": "Affects premises liability exposure",
      "expected_answers": ["Yes", "No"],
      "follow_up_required": false
    }
  ]
}
GET /v1/health

Check API health and status. Use for monitoring and uptime verification.

Example Response

{
  "status": "healthy",
  "version": "1.2.0",
  "timestamp": "2025-01-15T10:30:00Z",
  "uptime_seconds": 86400,
  "response_time_ms": 12
}
GET /v1/features

Get available features for your access package. Requires authentication.

Example Response

{
  "access_package": "premium",
  "available_features": [
    "FIRMO",
    "RISK",
    "CVG",
    "EXP",
    "UWQ",
    "PROPERTY",
    "RISK_PROPERTY",
    "REPLACEMENT",
    "FMCD",
    "OSHA"
  ],
  "rate_limit": 1000,
  "features_description": {
    "FIRMO": "Firmographics and business classification",
    "RISK": "Risk assessment and safety indicators",
    "CVG": "Coverage analysis and recommendations",
    "EXP": "Exposure analysis",
    "UWQ": "Industry-specific underwriting questions",
    "PROPERTY": "Property details and valuations",
    "RISK_PROPERTY": "Property-specific risk factors",
    "REPLACEMENT": "Replacement cost analysis",
    "FMCD": "Fleet and motor carrier data",
    "OSHA": "OSHA safety records and violations"
  }
}

Error Handling

HTTP Status Codes

200
OK
Request successful
400
Bad Request
Invalid request parameters
401
Unauthorized
Invalid or missing API key
422
Validation Error
Request validation failed
429
Rate Limited
Too many requests
500
Server Error
Internal processing error

Error Response Format

{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Invalid request parameters",
    "details": [
      {
        "field": "enterprise_id",
        "message": "This field is required"
      },
      {
        "field": "features",
        "message": "Invalid feature code: INVALID_FEATURE"
      }
    ],
    "request_id": "req_abc123",
    "timestamp": "2024-01-15T10:30:00Z"
  }
}

Quick Start Guide

Get Started in 5 Minutes

Follow this quick start guide to make your first API call and get comprehensive business intelligence.

Step 1: Search for a Business

curl "https://demo-api.linqura.ai/opensearch-sybl?q=Bailey%27s%20Garage"

This returns entity IDs you can use with LinqConnect.

Step 2: Get Business Intelligence

# Production Environment
curl -X POST https://api.linqura.ai/v1/linqConnect \
  -H "Content-Type: application/json" \
  -H "x-api-key: your-production-api-key" \
  -d '{
    "enterprise_id": "your-org-id",
    "access_package": "premium",
    "session_id": "sess-123",
    "user_id": "user-123",
    "search_type": "business",
    "entity_id": "47574df3ad00c752f5f0a7b6f4b94ccdaa995f23",
    "entity_name": "Bailey'\''s Garage",
    "features": "FIRMO,RISK,CVG"
  }'

# Demo Environment  
curl -X POST https://demo-api.linqura.ai/v1/linqConnect \
  -H "Content-Type: application/json" \
  -H "x-api-key: your-demo-api-key" \
  -d '{
    "enterprise_id": "demo-org",
    "access_package": "premium",
    "session_id": "sess-demo-123",
    "user_id": "demo-user",
    "search_type": "business",
    "entity_name": "Bailey'\''s Garage",
    "features": "FIRMO,RISK,CVG"
  }'

This returns comprehensive business intelligence including classification, risk assessment, and coverage recommendations.

Step 3: Process the Response

// Extract key data from the response
const classification = response.firmo?.classification;
const riskScore = response.risk?.overall_risk_score;
const coverages = response.coverage?.recommended_coverages;

// Use in your underwriting workflow
console.log(`NAICS: ${classification.primary_naics_code}`);
console.log(`Risk Score: ${riskScore}`);
console.log(`Recommended GL Limit: $${coverages[0].recommended_limit}`);

Code Samples & Development Resources

Production-Ready Code Examples

JavaScript/Node.js Example

Production-ready JavaScript implementation using fetch API

const { LinqConnectClient } = require('@linqura/linq-connect');

// Initialize client
const client = new LinqConnectClient({
  apiKey: process.env.LINQURA_API_KEY,
  enterpriseId: process.env.LINQURA_ENTERPRISE_ID,
  environment: 'production' // or 'development'
});

// Search for business
const businesses = await client.searchBusiness('Bailey\'s Garage');

// Get comprehensive intelligence
const intelligence = await client.getBusinessIntelligence({
  entityId: businesses[0].uid,
  entityName: businesses[0].bus_name,
  features: ['FIRMO', 'RISK', 'CVG', 'PROPERTY']
});

console.log('Classification:', intelligence.firmo.classification);
console.log('Risk Score:', intelligence.risk.overall_risk_score);
console.log('Coverage Recommendations:', intelligence.coverage.recommended_coverages);

Python Example

Production-ready Python implementation using requests library

# LinqConnect API - Python Implementation
import requests
import os
import json

# For demo purposes - replace with environment variables in production
CLIENT_ID = '2ltpdpp26bptf7c05o9p1e3q3b'  # os.getenv('LINQURA_CLIENT_ID')
CLIENT_SECRET = 'fprpbe0mj840vla00ss5ac08rlka5tvgm2i0o8dok19d49brljq'  # os.getenv('LINQURA_CLIENT_SECRET')
API_ENDPOINT = 'https://api.linqura.ai/evaluation/v1/linqConnect'
AUTH_ENDPOINT = 'https://api.linqura.ai/auth/oauth2/token'

def get_access_token():
    """Get OAuth2 access token using client credentials flow"""
    auth_data = {
        'grant_type': 'client_credentials',
        'client_id': CLIENT_ID,
        'client_secret': CLIENT_SECRET,
        'scope': 'default-m2m-resource-server-5hjwra/read'
    }
    
    response = requests.post(
        AUTH_ENDPOINT,
        headers={'Content-Type': 'application/x-www-form-urlencoded'},
        data=auth_data
    )
    
    if response.status_code == 200:
        return response.json()['access_token']
    else:
        raise Exception(f"Authentication failed: {response.text}")

def get_business_intelligence():
    try:
        # Get access token first
        access_token = get_access_token()
        
        response = requests.post(
            API_ENDPOINT,
            headers={
                'Content-Type': 'application/json',
                'Authorization': f'Bearer {access_token}'
            },
            json={
                'enterprise_id': 'org001',
                'access_package': 'premium',
                'session_id': f'sess_{int(time.time())}',
                'user_id': 'demo_user',
                'search_type': 'business',
                'entity_name': 'Baileys Garage',
                'entity_address': '1234 Main Street, Bowersville, GA 30516',
                'features': 'FIRMO,EXP,RISK,CVG'
            }
        )
        
        response.raise_for_status()
        intelligence = response.json()
        
        print('Business Profile:', intelligence.get('firmo', {}))
        print('Risk Assessment:', intelligence.get('risk', {}))
        print('Coverage Recommendations:', intelligence.get('coverage', {}))
        
        return intelligence
    except requests.exceptions.RequestException as e:
        print(f'API Error: {e}')
        raise

# Usage
get_business_intelligence()

C#/.NET Example

Production-ready C# implementation using HttpClient

// LinqConnect API - C#/.NET Implementation
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

public class LinqConnectExample
{
    private static readonly HttpClient client = new HttpClient();
    private const string ApiEndpoint = "https://api.linqura.ai/evaluation/v1/linqConnect";
    private const string AuthEndpoint = "https://api.linqura.ai/auth/oauth2/token";
    // For demo purposes - replace with environment variables in production
    private readonly string clientId = "2ltpdpp26bptf7c05o9p1e3q3b"; // Environment.GetEnvironmentVariable("LINQURA_CLIENT_ID");
    private readonly string clientSecret = "fprpbe0mj840vla00ss5ac08rlka5tvgm2i0o8dok19d49brljq"; // Environment.GetEnvironmentVariable("LINQURA_CLIENT_SECRET");
    
    private async Task GetAccessTokenAsync()
    {
        var authData = new List>
        {
            new KeyValuePair("grant_type", "client_credentials"),
            new KeyValuePair("client_id", clientId),
            new KeyValuePair("client_secret", clientSecret),
            new KeyValuePair("scope", "default-m2m-resource-server-5hjwra/read")
        };
        
        var content = new FormUrlEncodedContent(authData);
        var response = await client.PostAsync(AuthEndpoint, content);
        
        if (response.IsSuccessStatusCode)
        {
            var responseContent = await response.Content.ReadAsStringAsync();
            var tokenResponse = JsonSerializer.Deserialize(responseContent);
            return tokenResponse.GetProperty("access_token").GetString();
        }
        
        throw new Exception($"Authentication failed: {response.StatusCode}");
    }
    
    public async Task GetBusinessIntelligenceAsync()
    {
        try
        {
            // Get access token first
            var accessToken = await GetAccessTokenAsync();
            
            var requestBody = new
            {
                enterprise_id = "org001",
                access_package = "premium", 
                session_id = $"sess_{DateTimeOffset.UtcNow.ToUnixTimeSeconds()}",
                user_id = "demo_user",
                search_type = "business",
                entity_name = "Baileys Garage",
                entity_address = "1234 Main Street, Bowersville, GA 30516",
                features = "FIRMO,EXP,RISK,CVG"
            };
            
            var json = JsonSerializer.Serialize(requestBody);
            var content = new StringContent(json, Encoding.UTF8, "application/json");
            
            client.DefaultRequestHeaders.Clear();
            client.DefaultRequestHeaders.Add("Authorization", $"Bearer {accessToken}");
            
            var response = await client.PostAsync(ApiEndpoint, content);
            response.EnsureSuccessStatusCode();
            
            var responseBody = await response.Content.ReadAsStringAsync();
            var intelligence = JsonDocument.Parse(responseBody);
            
            Console.WriteLine("Business Intelligence Retrieved Successfully");
            Console.WriteLine(responseBody);
            
            return intelligence;
        }
        catch (HttpRequestException ex)
        {
            Console.WriteLine($"API Error: {ex.Message}");
            throw;
        }
    }
}

// Usage
var example = new LinqConnectExample();
await example.GetBusinessIntelligenceAsync();

Enterprise Support

🏢 Dedicated Support
Technical account manager for enterprise customers
⚡ SLA Response Times
Critical: 1hr, Standard: 4hr, General: 24hr
🔧 Custom Integration
White-glove integration support available
📊 Usage Analytics
Detailed usage reporting and optimization

Postman Collection

Ready-to-Use API Collection

Our comprehensive Postman collection includes all endpoints, example requests, and automated tests. Perfect for API exploration, testing, and team collaboration.

Collection Includes:

  • All LinqConnect endpoints with examples
  • Pre-configured authentication variables
  • Environment templates for dev/staging/prod
  • Automated test scripts for validation
  • Response examples with real data
  • Error handling scenarios and troubleshooting

Quick Setup:

  1. Download the collection JSON file
  2. Import into Postman workspace
  3. Set your API key in environment variables
  4. Run the "Health Check" request to validate
  5. Explore all LinqConnect features

Environment Configuration

Demo Environment

Base URL:
https://demo-api.linqura.ai
Rate Limit: 100 req/min
Features: All available
Purpose: Testing and evaluation

Production Environment

Base URL:
https://api.linqura.ai
Rate Limit: Based on plan (1K-10K req/min)
SLA: 99.9% uptime
Support: Enterprise SLA

Production Code Examples

Batch Processing Example

Process multiple businesses efficiently with proper error handling and rate limiting.

const { LinqConnectClient } = require('@linqura/linq-connect');
const pLimit = require('p-limit');

class BatchProcessor {
    constructor(apiKey, enterpriseId) {
        this.client = new LinqConnectClient({ apiKey, enterpriseId });
        this.limit = pLimit(10); // Process 10 concurrent requests
        this.results = [];
        this.errors = [];
    }

    async processBatch(businessList) {
        console.log(`Processing ${businessList.length} businesses...`);
        
        const promises = businessList.map(business => 
            this.limit(() => this.processSingleBusiness(business))
        );
        
        await Promise.allSettled(promises);
        
        return {
            successful: this.results.length,
            failed: this.errors.length,
            results: this.results,
            errors: this.errors
        };
    }

    async processSingleBusiness(business) {
        try {
            // Search for the business first
            const searchResults = await this.client.searchBusiness(business.name);
            
            if (searchResults.length === 0) {
                throw new Error(`Business not found: ${business.name}`);
            }

            // Get comprehensive intelligence
            const intelligence = await this.client.getBusinessIntelligence({
                entityId: searchResults[0].uid,
                entityName: searchResults[0].bus_name,
                features: business.features || ['FIRMO', 'RISK', 'CVG']
            });

            // Process and store results
            const processedResult = {
                business_name: business.name,
                entity_id: searchResults[0].uid,
                classification: intelligence.firmo?.classification,
                risk_score: intelligence.risk?.overall_risk_score,
                recommended_coverages: intelligence.coverage?.recommended_coverages,
                processing_time: Date.now()
            };

            this.results.push(processedResult);
            console.log(`✅ Processed: ${business.name}`);
            
            return processedResult;
            
        } catch (error) {
            const errorRecord = {
                business_name: business.name,
                error: error.message,
                timestamp: Date.now()
            };
            
            this.errors.push(errorRecord);
            console.error(`❌ Failed: ${business.name} - ${error.message}`);
            
            throw error;
        }
    }
}

// Usage example
async function main() {
    const processor = new BatchProcessor(
        process.env.LINQURA_API_KEY,
        process.env.LINQURA_ENTERPRISE_ID
    );

    const businessesToProcess = [
        { name: "Bailey's Garage", features: ["FIRMO", "RISK", "CVG"] },
        { name: "Joe's Restaurant", features: ["FIRMO", "RISK", "CVG", "PROPERTY"] },
        { name: "ABC Construction", features: ["FIRMO", "RISK", "CVG", "OSHA"] }
    ];

    const results = await processor.processBatch(businessesToProcess);
    
    console.log(`Batch complete: ${results.successful} successful, ${results.failed} failed`);
    
    // Export results
    require('fs').writeFileSync(
        'batch_results.json',
        JSON.stringify(results, null, 2)
    );
}

main().catch(console.error);

Webhook Integration

Set up webhooks to receive real-time notifications when business data changes or renewal intelligence is available.

const express = require('express');
const crypto = require('crypto');
const app = express();

// Webhook endpoint for LinqConnect notifications
app.post('/webhooks/linqconnect', express.raw({type: 'application/json'}), (req, res) => {
    const signature = req.headers['x-linqura-signature'];
    const payload = req.body;
    
    // Verify webhook signature
    const expectedSignature = crypto
        .createHmac('sha256', process.env.LINQURA_WEBHOOK_SECRET)
        .update(payload)
        .digest('hex');
    
    if (signature !== `sha256=${expectedSignature}`) {
        return res.status(401).send('Invalid signature');
    }
    
    const event = JSON.parse(payload);
    
    switch (event.type) {
        case 'business.data_updated':
            handleBusinessDataUpdate(event.data);
            break;
            
        case 'renewal.intelligence_ready':
            handleRenewalIntelligence(event.data);
            break;
            
        case 'classification.changed':
            handleClassificationChange(event.data);
            break;
            
        default:
            console.log(`Unknown event type: ${event.type}`);
    }
    
    res.status(200).send('OK');
});

async function handleBusinessDataUpdate(data) {
    console.log(`Business data updated for: ${data.entity_name}`);
    
    // Update your system with fresh data
    await updateBusinessRecord(data.entity_id, data.updated_fields);
    
    // Trigger renewal review if significant changes
    if (data.significant_changes) {
        await triggerRenewalReview(data.entity_id);
    }
}

async function handleRenewalIntelligence(data) {
    console.log(`Renewal intelligence ready for: ${data.entity_name}`);
    
    // Process renewal recommendations
    await processRenewalRecommendations(data.entity_id, data.recommendations);
    
    // Notify underwriting team
    await notifyUnderwriters(data);
}

app.listen(3000, () => {
    console.log('LinqConnect webhook server running on port 3000');
});