Sales & Lead Generation
Build targeted lead lists using powerful filters. Find companies that match your ideal customer profile by industry, size, location, and more.
Filter Options
The BoldData API offers extensive filtering capabilities:
| Filter | Description | Example |
|---|---|---|
countryCode | Country (ISO 2-letter) | NL, US, DE |
cityName | City name | AMSTERDAM, NEW YORK |
provinceName | State/Province | NOORD-HOLLAND |
sic4Digits | Industry code (SIC) | 7371 (Software) |
employeesTotal[min/max] | Company size | 10 - 500 |
annualSales[min/max] | Revenue (USD) | 1000000 - 10000000 |
foundingYears[min/max] | Company age | 2015 - 2023 |
hasEmail | Has email address | true |
hasPhone | Has phone number | true |
hasWebsite | Has website | true |
hasContactPerson | Has CEO/contact | true |
Try Lead Generation
Don't have an API key? Get your API key →
Configure your filters and click "Find Leads" to see results
TypeScript Implementation
GET
/api/company/export// Lead Generation - works in Node.js 18+ and browsers
const API_KEY = 'YOUR_API_KEY';
const BASE_URL = 'https://app.companydata.com/api/company';
interface LeadFilters {
countryCode?: string;
cityName?: string;
provinceName?: string;
sicCode?: string;
employeesMin?: number;
employeesMax?: number;
revenueMin?: number;
revenueMax?: number;
foundedAfter?: number;
foundedBefore?: number;
hasEmail?: boolean;
hasPhone?: boolean;
hasWebsite?: boolean;
hasContactPerson?: boolean;
}
interface Lead {
id: string;
companyName: string;
address: string;
city: string;
country: string;
phone?: string;
email?: string;
website?: string;
contactName?: string;
contactTitle?: string;
employees?: number;
revenue?: number;
industry?: string;
sicCode?: string;
foundingYear?: number;
}
interface LeadSearchResult {
leads: Lead[];
totalCount: number;
page: number;
pageSize: number;
totalPages: number;
}
async function fetchApi<T>(endpoint: string, params: Record<string, string | number | boolean>): Promise<T> {
const url = new URL(`${BASE_URL}/${endpoint}`);
Object.entries(params).forEach(([key, value]) => {
if (value !== undefined && value !== '' && value !== null) {
url.searchParams.append(key, String(value));
}
});
const response = await fetch(url.toString(), {
headers: { 'x-api-key': API_KEY },
});
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${await response.text()}`);
}
return response.json();
}
function mapToLead(company: Record<string, any>): Lead {
return {
id: company['ID'],
companyName: company['Company Name'],
address: [company['Address 1'], company['Address 2']].filter(Boolean).join(', '),
city: company['City'],
country: company['Country Name'],
phone: company['Phone Number'],
email: company['Email'],
website: company['Website'],
contactName: company['CEO Name'],
contactTitle: company['CEO Title'],
employees: company['Employees Total'] ? parseInt(company['Employees Total']) : undefined,
revenue: company['Yearly Revenue in U.S. Dollars'] ? parseInt(company['Yearly Revenue in U.S. Dollars']) : undefined,
industry: company['Business Category'],
sicCode: company['Business Category Code 1'],
foundingYear: company['Founding Year'] ? parseInt(company['Founding Year']) : undefined,
};
}
async function findLeads(
filters: LeadFilters,
page = 1,
pageSize = 25
): Promise<LeadSearchResult> {
const params: Record<string, string | number | boolean> = {
page,
pageSize,
};
// Location filters
if (filters.countryCode) params.countryCode = filters.countryCode;
if (filters.cityName) params.cityName = filters.cityName;
if (filters.provinceName) params.provinceName = filters.provinceName;
// Industry filter
if (filters.sicCode) params.sic4Digits = filters.sicCode;
// Size filters
if (filters.employeesMin) params['employeesTotal[min]'] = filters.employeesMin;
if (filters.employeesMax) params['employeesTotal[max]'] = filters.employeesMax;
// Revenue filters
if (filters.revenueMin) params['annualSales[min]'] = filters.revenueMin;
if (filters.revenueMax) params['annualSales[max]'] = filters.revenueMax;
// Age filters
if (filters.foundedAfter) params['foundingYears[min]'] = filters.foundedAfter;
if (filters.foundedBefore) params['foundingYears[max]'] = filters.foundedBefore;
// Contact info filters
if (filters.hasEmail) params.hasEmail = 'true';
if (filters.hasPhone) params.hasPhone = 'true';
if (filters.hasWebsite) params.hasWebsite = 'true';
if (filters.hasContactPerson) params.hasContactPerson = 'true';
const response = await fetchApi<{
data: {
records: Record<string, any>[];
totalCount?: number;
};
page: number;
pageSize: number;
}>('export', params);
return {
leads: (response.data?.records || []).map(mapToLead),
totalCount: response.data?.totalCount || 0,
page: response.page,
pageSize: response.pageSize,
totalPages: Math.ceil((response.data?.totalCount || 0) / pageSize),
};
}
// Export all leads matching filters (paginated)
async function* exportAllLeads(
filters: LeadFilters,
pageSize = 100
): AsyncGenerator<Lead[], void, unknown> {
let page = 1;
let hasMore = true;
while (hasMore) {
const result = await findLeads(filters, page, pageSize);
if (result.leads.length > 0) {
yield result.leads;
}
hasMore = page < result.totalPages;
page++;
// Rate limiting
if (hasMore) {
await new Promise(resolve => setTimeout(resolve, 100));
}
}
}
// Example usage
async function main() {
// Find software companies in Netherlands with 10-100 employees
const filters: LeadFilters = {
countryCode: 'NL',
sicCode: '7371', // Computer Programming Services
employeesMin: 10,
employeesMax: 100,
hasEmail: true,
hasPhone: true,
};
console.log('Searching for leads...');
const result = await findLeads(filters, 1, 10);
console.log(`Found ${result.totalCount} matching companies\n`);
result.leads.forEach((lead, i) => {
console.log(`${i + 1}. ${lead.companyName}`);
console.log(` ${lead.city}, ${lead.country}`);
console.log(` Employees: ${lead.employees || 'N/A'}`);
console.log(` Phone: ${lead.phone || 'N/A'}`);
console.log(` Email: ${lead.email || 'N/A'}`);
console.log('');
});
}
main();
Common SIC Codes
Here are frequently used industry codes:
| SIC Code | Industry |
|---|---|
| 7371 | Computer Programming Services |
| 7372 | Prepackaged Software |
| 7373 | Computer Integrated Systems Design |
| 7374 | Computer Processing & Data Prep |
| 8742 | Management Consulting Services |
| 6411 | Insurance Agents & Brokers |
| 6021 | National Commercial Banks |
| 5812 | Eating Places (Restaurants) |
| 8011 | Offices & Clinics of Doctors |
| 8111 | Legal Services |
| 1521 | General Contractors (Residential) |
| 5045 | Computers & Software Wholesale |
| 7011 | Hotels & Motels |
| 4512 | Air Transportation |
For a complete list of SIC codes, see the U.S. Department of Labor SIC Manual or contact support.
Building a Lead Scoring System
Combine BoldData filters with custom scoring:
interface ScoredLead extends Lead {
score: number;
scoreBreakdown: Record<string, number>;
}
function scoreLead(lead: Lead, idealProfile: {
minEmployees?: number;
maxEmployees?: number;
minRevenue?: number;
preferredCountries?: string[];
requireEmail?: boolean;
requirePhone?: boolean;
}): ScoredLead {
let score = 0;
const breakdown: Record<string, number> = {};
// Size score (0-30 points)
if (lead.employees) {
const inRange = (
(!idealProfile.minEmployees || lead.employees >= idealProfile.minEmployees) &&
(!idealProfile.maxEmployees || lead.employees <= idealProfile.maxEmployees)
);
breakdown.size = inRange ? 30 : 15;
score += breakdown.size;
}
// Revenue score (0-25 points)
if (lead.revenue && idealProfile.minRevenue) {
breakdown.revenue = lead.revenue >= idealProfile.minRevenue ? 25 : 10;
score += breakdown.revenue;
}
// Location score (0-15 points)
if (idealProfile.preferredCountries?.includes(lead.country)) {
breakdown.location = 15;
score += 15;
}
// Contact info score (0-30 points)
if (idealProfile.requireEmail && lead.email) {
breakdown.email = 15;
score += 15;
}
if (idealProfile.requirePhone && lead.phone) {
breakdown.phone = 15;
score += 15;
}
return { ...lead, score, scoreBreakdown: breakdown };
}
Best Practices
Filtering Strategy
- Start broad, then narrow - Begin with location + industry, add filters as needed
- Use
has*filters - Ensure leads have contactable information - Combine filters logically - Employee count + revenue often correlates
Data Export
- Paginate large exports - Use async generators for memory efficiency
- Respect rate limits - Add delays between API calls
- Cache results - Store leads to avoid re-fetching
Lead Quality
- Verify contact info - Email addresses may need validation
- Check for duplicates - Same company may appear with different addresses
- Update regularly - Company data changes; refresh lead lists periodically