DEV Community

Alessandro Binda
Alessandro Binda

Posted on

Company Data API: A Developer's Guide to Building with Business Registry Data

Business registry data is one of the most useful — and most underused — data sources available to developers. If your application needs to verify a company's legal existence, check its financial standing, autofill company information from a VAT number, or perform due diligence at scale, a company data API can save you months of scraping work.

This guide covers what company data APIs actually expose, how to evaluate them, and a practical walkthrough of what you can build.

What Business Registry Data Contains

Depending on the country and data source, business registry records can include:

  • Legal company name and registered address
  • VAT number / tax code / company registration number
  • Legal form (LLC, corporation, sole trader, etc.)
  • Registered capital
  • Date of incorporation
  • Legal representative and board members
  • Annual financial filings (revenue, assets, liabilities, profit/loss)
  • SIC/ATECO industry classification codes
  • Company status (active, dissolved, in liquidation, bankrupt)
  • Court proceedings and judgments (in some jurisdictions)

Not all jurisdictions expose all of this. The UK (Companies House) and Denmark are unusually open. Italy publishes core data via the Chamber of Commerce (CCIAA) but charges for full financial data. The US has no single national registry — you work with state-level records, which are inconsistent in both format and completeness.

Evaluating a Company Data API

Before integrating, ask these questions:

1. Coverage: What countries are covered? What percentage of active companies in those countries are in the database? A 60% coverage rate sounds impressive until you realize that the 40% missing includes many legitimate businesses.

2. Freshness: How often is the data updated? Annual financial filings can be 12-18 months old by the time they're filed, processed, and indexed. For risk assessment, you want signals that reflect current reality, not last year's situation.

3. Financial depth: Does the API return raw financial figures, or does it normalize them into comparable metrics? Knowing that Company X reported €2.1M in assets is less useful than knowing its debt-to-asset ratio relative to industry benchmarks.

4. Scoring vs. raw data: Some APIs return raw registry data. Others return processed scores. You may want both — the score for quick checks, the raw data for custom analysis.

5. Rate limits and pricing: For bulk lookups (screening a list of suppliers, running nightly checks on your client portfolio), rate limits matter enormously. A limit of 100 requests/hour makes batch processing impractical.

Practical Use Cases

VAT Number Validation and Autofill

The simplest use case: a user types their company VAT number into your registration form, and you autofill their company name, address, and other details. This reduces friction and errors.

async function autofillCompanyData(vatNumber) {
  const response = await fetch(
    `https://api.get-scala.com/score/company?vat=${vatNumber}`,
    { headers: { Authorization: `Bearer ${API_KEY}` } }
  );
  const data = await response.json();

  return {
    name: data.company_name,
    address: data.registered_address,
    city: data.city,
    country: data.country,
    status: data.status,
    score: data.financial_health_score
  };
}
Enter fullscreen mode Exit fullscreen mode

Supplier Screening Pipeline

You have a list of 500 suppliers. You want to flag any that are at financial risk before renewing contracts. Run them through the API in batch, filter by score threshold, and export a report.

async function screenSupplierList(suppliers) {
  const results = await Promise.allSettled(
    suppliers.map(s =>
      fetch(`https://api.get-scala.com/score/company?vat=${s.vatNumber}`)
        .then(r => r.json())
        .then(data => ({ ...s, score: data.score, riskCategory: data.risk_category }))
    )
  );

  return results
    .filter(r => r.status === 'fulfilled')
    .map(r => r.value)
    .sort((a, b) => a.score - b.score); // lowest scores first
}
Enter fullscreen mode Exit fullscreen mode

Real-Time Risk Monitoring

Monitor your active client portfolio on a rolling basis. Set up a nightly job that checks scores and triggers alerts when a client's score drops below a threshold.

// Run nightly via cron
async function monitorClientPortfolio(clients) {
  for (const client of clients) {
    const current = await getScore(client.vatNumber);
    const previous = await db.getLastScore(client.id);

    if (current.score < RISK_THRESHOLD || current.score < previous.score - 10) {
      await sendAlert({
        clientName: client.name,
        previousScore: previous.score,
        currentScore: current.score,
        riskCategory: current.risk_category
      });
    }

    await db.saveScore(client.id, current);
  }
}
Enter fullscreen mode Exit fullscreen mode

The Score API from S.C.A.L.A.

The S.C.A.L.A. company score exposes a REST API covering Italian and European company data. The free tier allows a limited number of lookups per month, suitable for prototyping. Paid tiers (API Starter at €19/month for 500 calls, API Growth at €49/month for 5K calls) cover most production use cases.

The response schema includes:

{
  "company_name": "Acme Srl",
  "vat_number": "IT12345678901",
  "status": "active",
  "score": 74,
  "risk_category": "low",
  "revenue": 2100000,
  "employees_range": "10-49",
  "last_filing_year": 2023,
  "legal_form": "Srl",
  "ateco_code": "62.01",
  "city": "Milano",
  "region": "Lombardia"
}
Enter fullscreen mode Exit fullscreen mode

Handling Data Quality Issues

Registry data is messy. Build defensively:

  • Always validate VAT number format before hitting the API (saves quota)
  • Handle null fields gracefully — not all companies file all data
  • For scoring, treat missing financial data as a signal, not just a gap
  • Cache results with appropriate TTL (24 hours for most use cases, shorter for high-risk monitoring)
  • Log API errors separately from data quality issues — they require different handling

Limitations to Be Aware Of

Company data APIs are powerful but not omniscient. What they cannot tell you:

  • Real-time cash position (filings are historical)
  • Off-balance-sheet liabilities
  • Key person risk (what happens if the founder leaves)
  • Market and competitive position
  • Qualitative factors that experienced analysts pick up in conversation

Use the score as a first filter, not a final judgment. For large transactions, it surfaces which companies warrant deeper investigation — it does not replace that investigation.


The S.C.A.L.A. Score API documentation and free tier are available at get-scala.com/score/. API keys require registration at get-scala.com.

Top comments (0)