getregdata
Home / Blog / Article
Article · 2026-05-04

European Compliance Scraper Reliability: BORME and Societe.com Configuration Guide

compliance · regtech · europe · automation · 4 min read

European Business Data Suite reliability is crucial for compliance workflows. After analyzing our run logs, we’ve identified specific patterns that cause failures with BORME Corporate Acts and Societe.com scrapers. This guide helps you configure these tools correctly and avoid common pitfalls.

The Reliability Challenge

Most runs that fail on these two actors fail for the same handful of reasons, and nearly all of them are on the caller’s side, not the actor’s:

  • BORME: aborted runs are almost always an invalid input (bad date format or an out-of-range date) or a timeout on an over-wide date range.
  • Societe.com: the two failure modes are a company name that does not match exactly and a transient anti-bot block that clears on a re-run.
  • Common thread: both actors fail on how they are called, not on a technical bug.

The good news? When you feed them valid inputs, both run reliably - and neither needs a proxy or key from you.

BORME Corporate Acts Scraper: Configuration Guide

Common Failure Patterns

  1. Input validation errors (3 out of 5 aborted runs)
  2. Transient upstream (boe.es) hiccups (1 out of 5 aborted runs)
  3. Timeout on large date ranges (1 out of 5 aborted runs)

Correct Configuration

Step 1: Input Validation

BORME requires specific input format. Invalid inputs cause immediate abortion:

{
  "dateFrom": "2024-01-01",
  "dateTo": "2024-01-31",
  "provinces": [],
  "actTypes": []
}

Critical rules:

  • Use YYYY-MM-DD format for dates
  • The gazette is indexed by date, not by company. There is no company-name filter - fetch the day and filter on companyName yourself
  • provinces and actTypes are lists, not strings. Leave them empty to take everything
  • For a single day, date on its own does the same job as dateFrom and dateTo set to the same value

Step 2: No Proxy or Key to Configure

The BORME actor is plain HTTP against boe.es plus PDF parsing - it downloads the official BORME PDFs directly. There is no proxyConfiguration field in its input schema and no API key to supply. You configure nothing here; the actor runs on the Apify free plan.

Step 3: Optimize Date Ranges

Large date ranges cause timeouts. Split queries:

# Instead of 1 year, use monthly chunks
queries = [
    {"dateFrom": "2024-01-01", "dateTo": "2024-01-31"},
    {"dateFrom": "2024-02-01", "dateTo": "2024-02-29"},
    # ...
]

Testing Your Configuration

Run this test query to verify your setup:

{
  "dateFrom": "2024-01-01",
  "dateTo": "2024-01-07",
  "provinces": [],
  "actTypes": []
}

This should return results within 30 seconds if configured correctly.

Societe.com Company Data Scraper: Configuration Guide

Common Failure Patterns

  1. Timeouts, on searches wide enough to walk a long result list
  2. Transient anti-bot blocks, which clear on a re-run

Correct Configuration

Step 1: Timeout Settings

French portals are slower than expected, so give the run headroom. Timeout is a run option, not an input field - set it on the run (timeout in the API call or the Timeout box in the Console), not inside the actor input.

Step 2: Input Validation

The search field is searchQuery, and it does a partial match - there is no companyName field and no maxPages field. Bound the work with maxResults:

{
  "searchQuery": "Société Générale",
  "maxResults": 5
}

Important:

  • searchQuery matches partially, so a distinctive fragment of the name is usually enough
  • To skip search entirely, pass sirenNumbers - each 9-digit SIREN resolves to one exact company
  • To find every company a person holds a role in, use managerName instead
  • maxResults bounds a name or manager search; maxConcurrency (1-5) trades speed for load

Step 3: No Proxy or Key to Configure

Societe.com blocks datacenter IPs with DataDome, but the actor clears the anti-bot layer internally - there is no proxyConfiguration field in its input schema and no API key to supply. That unblocking cost is already baked into the per-result price, and the actor runs on the Apify free plan.

Testing Your Configuration

Test with this known French company:

{
  "sirenNumbers": ["542051180"],
  "includeDirectors": true,
  "includeFinancials": true
}

That is TotalEnergies by SIREN, which avoids depending on a name match. It returns the company record with its directors in well under a minute. Note that revenue and netResult arrive as strings or null - Societe.com does not publish figures for every company, so guard before you format them.

Production-Ready Patterns

1. Error Handling and Retries

Implement retry logic for transient failures:

import time
import requests

def fetch_borme_data_with_retry(query, max_retries=3):
    for attempt in range(max_retries):
        try:
            result = borme_actor.run(query)
            if result.get('success'):
                return result
            elif result.get('error') == 'timeout':
                time.sleep(10 * (attempt + 1))  # Exponential backoff
            else:
                break  # Don't retry on validation errors
        except Exception as e:
            if attempt == max_retries - 1:
                raise
            time.sleep(5 * (attempt + 1))
    return None

2. Batch Processing

Process multiple companies efficiently:

# BORME - Process monthly chunks
def process_borme_year(year, company_names=None):
    results = []
    for month in range(1, 13):
        start_date = f"{year}-{month:02d}-01"
        if month == 12:
            end_date = f"{year}-12-31"
        else:
            end_date = f"{year}-{month+1:02d}-01"
        
        query = {
            "dateFrom": start_date,
            "dateTo": end_date,
            "provinces": [],
            "actTypes": []
        }

        # There is no company-name filter on the input, so narrow the day's
        # rows on your side if you are watching a specific list of companies.
        rows = borme_actor.run(query)
        if company_names:
            wanted = {n.upper() for n in company_names}
            rows = [r for r in rows if r.get("companyName", "").upper() in wanted]
        results.extend(rows)

    return results

3. Data Validation

Verify data quality before processing:

def validate_borme_data(data):
    # "acts" is the list of announced acts; "date" is the publication date.
    required_fields = ['companyName', 'acts', 'date']
    return all(field in data for field in required_fields)

def validate_societe_data(data):
    required_fields = ['companyName', 'siren', 'directors']
    return all(field in data for field in required_fields)

Troubleshooting Common Issues

BORME Issues

ErrorSolution
”Invalid date format”Use YYYY-MM-DD format
”Company not found”Check exact company name spelling
”Upstream fetch failed”Transient boe.es hiccup - re-run the query
”Query timeout”Reduce date range to < 3 months

Societe.com Issues

ErrorSolution
”Request timeout”Increase timeout to 120 seconds
”Access denied”Transient anti-bot block - re-run; the actor rotates its own unblocking
”Company not found”Verify exact company name with accents
”Rate limit exceeded”Add 30-second delay between requests

Success Metrics

When configured correctly, you should see:

  • BORME: 95%+ success rate on valid inputs
  • Societe.com: 90%+ success rate on valid inputs
  • Average response time: BORME (30-60s), Societe.com (60-120s)

Getting Help

If you continue experiencing issues:

  1. Check your input format against the examples above
  2. Re-run transient failures - neither actor needs a proxy or key from you; upstream hiccups clear on a retry
  3. Reduce query scope - test with smaller date ranges first
  4. Review run logs in Apify Console for specific error messages

For comprehensive European compliance workflows, combine these actors:

Reliability isn’t just about technology - it’s about understanding the unique requirements of each European registry. With proper configuration, these tools become powerful assets for your compliance automation workflows.


Turn this into working data. Browse the registries and use cases, or start free on Apify.

Originally published on Dev.to.