The LinqConnect API provides comprehensive business intelligence for commercial insurance underwriting. Transform business names and addresses into complete risk profiles with 28% more accuracy.
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.
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"
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
"expires_in": 3600,
"token_type": "Bearer"
}
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"
}'
When you sign up for LinqConnect access:
default-m2m-resource-server-polax1/linqdataFor testing and development, use our demo environment with simplified authentication:
Demo Base URL:
Demo API Key:
Note: Demo environment uses simplified API key authentication for easier testing.
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 999
X-RateLimit-Reset: 1609459200
Retry-After: 60
/v1/linqConnect
Main intelligence endpoint for comprehensive business analysis. Returns complete business intelligence including classification, risk assessment, property data, and more.
| 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 |
FIRMO - Firmographics and classificationRISK - Risk assessment and safety dataCVG - Coverage analysis and recommendationsEXP - Exposure analysisUWQ - Underwriting questionsPROPERTY - Property details and valuesRISK_PROPERTY - Property-specific risksREPLACEMENT - Replacement cost analysisFMCD - Fleet and motor carrier dataOSHA - OSHA safety records{
"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"
}
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.
{
"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"
}
}
{
"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": {
"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": {
"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": {
"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": [
{
"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
}
]
}
https://demo-api.linqura.ai/opensearch-sybl
Search for businesses to get entity IDs for use with LinqConnect. No authentication required.
| Parameter | Type | Required | Description |
|---|---|---|---|
q |
string | ✓ | Search query (business name, location) |
GET https://demo-api.linqura.ai/opensearch-sybl?q=Bailey%27s%20Garage
{
"results": [
{
"uid": "47574df3ad00c752f5f0a7b6f4b94ccdaa995f23",
"bus_name": "Bailey's Garage",
"bus_address": "143 Baileys Garage Rd, Bowersville, GA, 30516",
"confidence": 0.95
}
],
"total_results": 1,
"processing_time_ms": 234
}
/v1/health
Check API health and status. Use for monitoring and uptime verification.
{
"status": "healthy",
"version": "1.2.0",
"timestamp": "2025-01-15T10:30:00Z",
"uptime_seconds": 86400,
"response_time_ms": 12
}
/v1/features
Get available features for your access package. Requires authentication.
{
"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": {
"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"
}
}
Follow this quick start guide to make your first API call and get comprehensive business intelligence.
curl "https://demo-api.linqura.ai/opensearch-sybl?q=Bailey%27s%20Garage"
This returns entity IDs you can use with LinqConnect.
# 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.
// 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}`);
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);
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()
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();
Our comprehensive Postman collection includes all endpoints, example requests, and automated tests. Perfect for API exploration, testing, and team collaboration.
Ready to integrate LinqConnect?
https://demo-api.linqura.ai
https://api.linqura.ai
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);
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');
});