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
- Input validation errors (3 out of 5 aborted runs)
- Transient upstream (boe.es) hiccups (1 out of 5 aborted runs)
- 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-DDformat for dates - The gazette is indexed by date, not by company. There is no company-name filter - fetch the day and filter on
companyNameyourself provincesandactTypesare lists, not strings. Leave them empty to take everything- For a single day,
dateon its own does the same job asdateFromanddateToset 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
- Timeouts, on searches wide enough to walk a long result list
- 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:
searchQuerymatches 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
managerNameinstead maxResultsbounds 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
| Error | Solution |
|---|---|
| ”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
| Error | Solution |
|---|---|
| ”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:
- Check your input format against the examples above
- Re-run transient failures - neither actor needs a proxy or key from you; upstream hiccups clear on a retry
- Reduce query scope - test with smaller date ranges first
- Review run logs in Apify Console for specific error messages
Related Tools
For comprehensive European compliance workflows, combine these actors:
- BORME Corporate Acts Scraper - Spanish corporate registry data
- Societe.com Company Data Scraper - French company intelligence
- Spain Company Directory Scraper - Spanish business directory
- WKO Business Directory Scraper - Austrian company registry
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.