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:

FilterDescriptionExample
countryCodeCountry (ISO 2-letter)NL, US, DE
cityNameCity nameAMSTERDAM, NEW YORK
provinceNameState/ProvinceNOORD-HOLLAND
sic4DigitsIndustry code (SIC)7371 (Software)
employeesTotal[min/max]Company size10 - 500
annualSales[min/max]Revenue (USD)1000000 - 10000000
foundingYears[min/max]Company age2015 - 2023
hasEmailHas email addresstrue
hasPhoneHas phone numbertrue
hasWebsiteHas websitetrue
hasContactPersonHas CEO/contacttrue

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 CodeIndustry
7371Computer Programming Services
7372Prepackaged Software
7373Computer Integrated Systems Design
7374Computer Processing & Data Prep
8742Management Consulting Services
6411Insurance Agents & Brokers
6021National Commercial Banks
5812Eating Places (Restaurants)
8011Offices & Clinics of Doctors
8111Legal Services
1521General Contractors (Residential)
5045Computers & Software Wholesale
7011Hotels & Motels
4512Air Transportation

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

Was this page helpful?