Drimble APIdrimble.nl ↗
Search and retrieve Dutch company data from Drimble.nl. Access KVK numbers, SBI codes, addresses, legal forms, and business descriptions via 2 endpoints.
What is the Drimble API?
The Drimble.nl API provides access to Dutch business listings through 2 endpoints, covering company search and full detail retrieval. The search_companies endpoint accepts keyword queries alongside geographic and SBI code filters to return paginated lists of companies. The get_company_details endpoint returns structured records including KVK numbers, legal form, employee counts, SBI classifications, and full address breakdowns for any company listed on Drimble.nl.
curl -X GET 'https://api.parse.bot/scraper/9681bf2d-0c8b-4bb8-b56b-ab6902bea290/search_companies?page=1&query=bakker' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace drimble-nl-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""
Drimble.nl Business Listings API Client
Extract business listings and full company details from drimble.nl
Get your API key from: https://parse.bot/settings
"""
import os
import requests
from typing import Optional, Dict, Any
class ParseClient:
"""Client for interacting with the Parse API for Drimble.nl business listings."""
def __init__(self, api_key: Optional[str] = None):
"""
Initialize the Parse API client.
Args:
api_key: API key for authentication. Defaults to PARSE_API_KEY env var.
"""
self.base_url = "https://api.parse.bot"
self.scraper_id = "9681bf2d-0c8b-4bb8-b56b-ab6902bea290"
self.api_key = api_key or os.getenv("PARSE_API_KEY")
if not self.api_key:
raise ValueError("API key not provided and PARSE_API_KEY env var not set")
def _call(self, endpoint: str, method: str = "POST", **params) -> Dict[str, Any]:
"""
Make a request to the Parse API.
Args:
endpoint: The endpoint name (e.g., 'search_companies')
method: HTTP method ('GET' or 'POST')
**params: Query or body parameters depending on method
Returns:
Response JSON as a dictionary
"""
url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
headers = {
"X-API-Key": self.api_key,
"Content-Type": "application/json"
}
if method.upper() == "GET":
response = requests.get(url, headers=headers, params=params)
elif method.upper() == "POST":
response = requests.post(url, headers=headers, json=params)
else:
raise ValueError(f"Unsupported HTTP method: {method}")
response.raise_for_status()
return response.json()
def search_companies(
self,
query: Optional[str] = None,
sbi: Optional[str] = None,
prid: Optional[int] = None,
gid: Optional[int] = None,
pid: Optional[int] = None,
wid: Optional[int] = None,
bid: Optional[int] = None,
page: Optional[int] = None
) -> Dict[str, Any]:
"""
Search for companies on Drimble.nl using keywords and filters.
Args:
query: Keyword search for company name or related terms
sbi: SBI code filter (e.g., 'F' for construction)
prid: Province ID filter
gid: Gemeente (Municipality) ID filter
pid: Plaats (City) ID filter
wid: Wijk (District) ID filter
bid: Buurt (Neighborhood) ID filter
page: Page number for pagination (default: 1)
Returns:
Dictionary containing companies list and available filters
"""
params = {}
if query:
params["query"] = query
if sbi:
params["sbi"] = sbi
if prid:
params["prid"] = prid
if gid:
params["gid"] = gid
if pid:
params["pid"] = pid
if wid:
params["wid"] = wid
if bid:
params["bid"] = bid
if page:
params["page"] = page
return self._call("search_companies", method="GET", **params)
def get_company_details(self, url: str) -> Dict[str, Any]:
"""
Get full details for a specific business listing.
Args:
url: The company detail page URL or relative path from search results
Returns:
Dictionary containing company details including address, SBI codes, and description
"""
return self._call("get_company_details", method="GET", url=url)
def main():
"""
Demonstrate practical workflow: search for companies and retrieve their details.
"""
# Initialize the client
client = ParseClient()
print("=" * 70)
print("Drimble.nl Business Listings API - Practical Business Intelligence")
print("=" * 70)
# Step 1: Search for IT/Software companies (SBI code 'J' for Information and Communication)
print("\n📊 Step 1: Searching for IT/Software companies...")
search_params = {
"query": "software",
"sbi": "J",
"page": 1
}
print(f" Search parameters: {search_params}")
search_results = client.search_companies(**search_params)
# Display search results summary
if "data" in search_results:
data = search_results["data"]
companies = data.get("companies", [])
print(f"\n✓ Found {len(companies)} software companies in results")
# Display available SBI filters to understand the data structure
if "sbi_filter" in data:
sbi_options = data["sbi_filter"].get("options", [])
print(f"\n📋 Available Industry Categories (SBI Codes): {len(sbi_options)} total")
for sbi_option in sbi_options[:5]:
print(f" • {sbi_option.get('code')}: {sbi_option.get('description')}")
# Display geographic filter options
if "geolocation_filter" in data:
geoloc = data["geolocation_filter"]
print(f"\n🗺️ Geographic Filter Level: {geoloc.get('level')}")
options = geoloc.get("options", [])
if options:
print(f" Available regions: {len(options)}")
for option in options[:5]:
print(f" • {option.get('name')} (ID: {option.get('id')})")
# Step 2: Process each company and get detailed information
if companies:
print(f"\n📝 Step 2: Retrieving detailed information for companies...")
print("-" * 70)
for idx, company in enumerate(companies[:3], 1): # Process first 3 companies
print(f"\nCompany #{idx}: {company.get('company_name', 'Unknown')}")
print(f" KVK Number: {company.get('kvk_number')}")
print(f" Branch Number: {company.get('branch_number')}")
print(f" Registration Date: {company.get('registration_date', 'N/A')}")
# Fetch detailed information for this company
company_url = company.get("url")
if company_url:
try:
print(f" → Fetching complete profile...")
details = client.get_company_details(url=company_url)
if "data" in details:
detail_data = details["data"]
# Display address information
if "address" in detail_data:
addr = detail_data["address"]
print(f"\n 📍 Address Information:")
print(f" Street: {addr.get('street')} {addr.get('house_number')}")
if addr.get('house_number_extension'):
print(f" Extension: {addr.get('house_number_extension')}")
print(f" Postcode: {addr.get('postcode')}")
print(f" City: {addr.get('plaats')}")
print(f" Municipality: {addr.get('municipality')}")
print(f" Province: {addr.get('province')}")
# Display business details
print(f"\n 💼 Business Details:")
print(f" Legal Form: {detail_data.get('legal_form', 'N/A')}")
print(f" Employees: {detail_data.get('employees', 'N/A')}")
# Display SBI codes
if "sbi_codes" in detail_data:
sbi_codes = detail_data["sbi_codes"]
if sbi_codes:
print(f"\n 🏭 Industry Classifications:")
for sbi in sbi_codes:
print(f" • {sbi.get('code')}: {sbi.get('description', 'N/A')}")
else:
print(f"\n 🏭 Industry Classifications: Not specified")
# Display business description
if "description" in detail_data:
description = detail_data["description"]
print(f"\n 📄 Business Description:")
# Truncate long descriptions
if len(description) > 150:
print(f" {description[:150]}...")
else:
print(f" {description}")
except requests.exceptions.RequestException as e:
print(f" ✗ Error fetching details: {e}")
except Exception as e:
print(f" ✗ Unexpected error: {e}")
print("\n" + "-" * 70)
print("✓ Analysis Complete!")
print("\nKey Insights:")
print(f" • Total companies found: {len(companies)}")
print(f" • Companies processed: {min(3, len(companies))}")
print(f" • Available industry categories: {len(search_results['data'].get('sbi_filter', {}).get('options', []))}")
if "geolocation_filter" in search_results["data"]:
print(f" • Geographic regions available: {len(search_results['data']['geolocation_filter'].get('options', []))}")
print("\n" + "=" * 70)
print("Workflow completed successfully!")
print("=" * 70)
if __name__ == "__main__":
main()Search for companies on Drimble.nl using keywords and filters (province, municipality, city, SBI code). Returns paginated company results along with available SBI and geographic filter options.
| Param | Type | Description |
|---|---|---|
| bid | integer | Buurt (Neighborhood) ID filter. |
| gid | integer | Gemeente (Municipality) ID filter. |
| pid | integer | Plaats (City) ID filter. |
| sbi | string | SBI code filter. Accepted values: A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S. |
| wid | integer | Wijk (District) ID filter. |
| page | integer | Page number for pagination. |
| prid | integer | Province ID filter (e.g. 27 for Noord-Holland, 28 for Zuid-Holland). |
| query | string | Keyword search for company name or related terms. |
{
"type": "object",
"fields": {
"companies": "array of company objects with coc_number, kvk_number, branch_number, company_name, registration_date, and url",
"sbi_filter": "object with options array containing available SBI code filters (code and description)",
"geolocation_filter": "object with level string and options array containing geographic filter choices (name, id, slug)"
},
"sample": {
"data": {
"companies": [
{
"url": "www.drimble.nl/bedrijf/alkmaar/000064774538/haytak.html",
"coc_number": "997218720000",
"kvk_number": "99721872",
"company_name": "Haytak",
"branch_number": "000064774538",
"registration_date": "2026-02-13T00:00:00"
}
],
"sbi_filter": {
"options": [
{
"code": "A",
"description": "Landbouw, bosbouw en visserij"
}
]
},
"geolocation_filter": {
"level": "Province",
"options": [
{
"id": 30,
"name": "Noord-Brabant",
"slug": "noord-brabant"
}
]
}
},
"status": "success"
}
}About the Drimble API
Company Search
The search_companies endpoint accepts a query string alongside optional geographic filters — prid for province, gid for gemeente (municipality), pid for plaats (city), wid for wijk (district), and bid for buurt (neighborhood). You can also filter by sbi code (single-letter values A through S covering Dutch standard industrial classification sectors). Results are paginated via the page parameter. Each company record in the response includes company_name, coc_number, kvk_number, branch_number, registration_date, and a url field used as input to the detail endpoint.
Company Details
Passing a url from search_companies results to get_company_details returns the full record for that business. The address object includes street, house_number, house_number_extension, postcode, plaats, municipality, province, and a formatted_address string. Additional fields cover legal_form (e.g. Eenmanszaak, BV), employees, kvk_number, branch_number, registration_date, description (a free-text business activity summary), and sbi_codes — an array of SBI classification objects describing the company's registered activities.
Filters and Navigation
The search_companies response also returns a sbi_filter object listing available SBI sector options with codes and descriptions, and a geolocation_filter object with a level string and a set of geographic options (name, ID, slug). These can be used to progressively narrow searches without hardcoding geography IDs. Province ID 27 corresponds to Noord-Holland and 28 to Zuid-Holland; other province IDs follow the same pattern.
The Drimble API is a managed, monitored endpoint for drimble.nl — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when drimble.nl changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official drimble.nl API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a prospect list of companies in a specific Dutch municipality filtered by SBI sector code
- Enrich a CRM with KVK numbers, legal forms, and registered addresses for Dutch business contacts
- Map Dutch SME density by province or neighborhood using geographic filter IDs
- Monitor new business registrations in a target sector by checking registration_date fields
- Validate and standardize Dutch company addresses using the structured address object fields
- Classify a portfolio of companies by SBI code to analyze sector distribution
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Drimble.nl offer an official developer API?+
What geographic granularity is available in search_companies?+
Does the API return contact details like phone numbers or email addresses?+
get_company_details endpoint covers address, KVK number, legal form, SBI codes, employee count, and business description, but does not expose phone numbers or email addresses. You can fork this API on Parse and revise it to add those fields if Drimble.nl surfaces them on the detail page.Are historical registration changes or previous addresses available?+
How does SBI code filtering work in search_companies?+
sbi parameter accepts a single letter from A to S, each corresponding to a sector in the Dutch Standard Industrial Classification (e.g. G for wholesale/retail, I for hospitality). The sbi_filter object returned alongside results lists all available codes with their descriptions, which you can use to determine valid values for subsequent queries.