Aanmelden
Gratis account aanmaken
Wil je een indruk krijgen van de mogelijkheden van Innovatiespotter? Maak nu een gratis account aan en krijg een selectie van innovatieve bedrijven.
*: verplicht
Met een gratis account zie je van elke zoekvraag de eerste 10 resultaten. Wil je alle bedrijven zien en deze kunnen exporteren? Mail ons voor toegang tot alle gegevens en meer informatie.
Wil je een indruk krijgen van de mogelijkheden van Innovatiespotter? Maak nu een gratis account aan en krijg een selectie van innovatieve bedrijven.
*: verplicht
Vind snel de bedrijven die je zoekt
De Innovatiespotter is een krachtige online tool die 24/7 het internet afspeurt naar bedrijven die actief zijn met innovatie, technologie, en duurzaamheid.
Use our REST API to integrate our data with your datawarehouse or CRM and get advantage of our API exclusive capabilities
https://online.innovatiespotter.nl/api/companies?geregistreerd=true&page_size=1curl -u "email@example.com:password" \
"https://online.innovatiespotter.nl/api/companies?geregistreerd=true&page_size=1"
{
"companies": [{ ... }],
"count": 1,
"total": 12345,
"page": 1,
"pages": 12345
}
bedrijventerreinhas_website_contentecosysteemkeywordshas_website_contentCaption: API = API exclusive features • NEW = Recently added • BETA = Experimental
Advanced Filters (_exclude, _and): Enhanced Boolean logic for complex filtering scenarios, allowing precise data selection and exclusion criteria.
Bedrijventerrein: Comprehensive business park information including location details, environmental zones, and company counts for companies located on registered industrial estates.
Domeinsamenvatting (BETA): ML-generated company domain analysis and summaries based on website content, providing insights into business focus and activities.
Duurzaamheid: Sustainability classifications including SDG mappings, sustainability claims, and environmental certifications to identify environmentally conscious companies.
Innovatie-ecosysteem: Structured ecosystem data mapping companies to innovation networks, awards, patents, subsidies, and accelerator programs with historical tracking.
Keywords-Snippet: AI-powered content analysis providing highlighted search results with relevance scoring and context snippets from company websites.
geregistreerd=true to your filters.sbi_code_exclude=09,139themas_exclude=im_public_bouwecosysteem_exclude=rvo
bedrijventerrein=50001has_website_content=trueecosysteem_and=award,startupkeywords="innovation AI"
"Bedrijventerrein": {
"rin_nummer": 50001,
"plan_naam": "Amsterdam Science Park",
"kern_naam": "Amsterdam",
"gem_namen": "Amsterdam",
"prov_namen": "Noord-holland",
"aantal": 535,
"milieuzone": "Onbekend"
}
Domeinsamenvatting (BETA):
"Domeinsamenvatting": {
"inbiome.com": "This company specializes in molecular
diagnostics and microbiome analysis using their
patented Molecular Culture technology..."
}
Duurzaamheid data:
"Duurzaamheid": {
"Duurzaamheidsclaims": ["Keurmerk", "Richtlijn"],
"SDG's": {"dz_sdg_sdg13": "SDG 13"},
"Duurzaamheidsthema's": []
}
"Innovatie-ecosysteem": {
"netwerk_life-science-at-work": "LifeSciences@Work",
"patent_patenten-rvo": "Patent",
"subsidie_rvo_eurostars-2020": "EUROSTARS (2020)"
}
Keywords-Snippet data:
"Keywords-Snippet": "Partnerships and services to drive ##HLS##innovation##HLE##. At inbiome research and development is at the heart of...", "Keywords-Matched": ["innovation", "environment"], "Score": 6.917399
Note: Keywords snippets use ##HLS## and ##HLE## markers to highlight matching terms.
Query insights show the processed search logic: "query_insights": {"keywords": "+(keywords:innovation keywords:environment keywords:agrifod)"}
# Create .env file first:
# API_EMAIL=your-email@example.com
# API_PASSWORD=your-password
import requests
import os
from dotenv import load_dotenv
load_dotenv() # Load .env file
response = requests.get(
'https://online.innovatiespotter.nl/api/companies',
auth=(os.getenv('API_EMAIL'), os.getenv('API_PASSWORD'))
)
response.raise_for_status() # Raise exception for HTTP errors
companies = response.json()
print(f"Found {companies['total']} companies")
Azure provides Python SDKs for secure credential management in cloud environments
# pip install azure-keyvault-secrets azure-identity requests
import requests
from azure.keyvault.secrets import SecretClient
from azure.identity import DefaultAzureCredential
# Azure credentials managed via environment/managed identity
credential = DefaultAzureCredential()
client = SecretClient(
vault_url="https://your-vault.vault.azure.net/",
credential=credential
)
email = client.get_secret("api-email").value
password = client.get_secret("api-password").value
response = requests.get(
'https://online.innovatiespotter.nl/api/companies',
auth=(email, password)
)
response.raise_for_status()
data = response.json()
# Save as .env in your project root API_EMAIL=your-email@example.com API_PASSWORD=your-secure-password API_BASE_URL=https://online.innovatiespotter.nl/api
<?php
// Save as config.php (never commit to git)
return [
'api_email' => 'your-email@example.com',
'api_password' => 'your-secure-password',
'api_base_url' => 'https://online.innovatiespotter.nl/api'
];
Fetch API is the modern standard for HTTP requests in browsers, replacing XMLHttpRequest
// Modern JavaScript approach with environment variables
const credentials = btoa(`${process.env.API_EMAIL}:${process.env.API_PASSWORD}`);
fetch('https://online.innovatiespotter.nl/api/companies?geregistreerd=true&page_size=1', {
headers: {
'Authorization': `Basic ${credentials}`
}
})
.then(response => {
if (!response.ok) throw new Error(`HTTP ${response.status}: ${response.statusText}`);
return response.json();
})
.then(data => {
console.log('Success:', data);
document.getElementById("api_test").innerHTML = JSON.stringify(data, null, 4);
})
.catch(error => {
console.error('Error:', error);
document.getElementById("api_test").innerHTML = `Error: ${error.message}`;
});
// Load credentials from config.php file (placed outside web root with proper permissions) $config = require_once 'config.php'; $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => $config['api_base_url'] . '/companies', CURLOPT_RETURNTRANSFER => true, CURLOPT_USERPWD => $config['api_email'] . ':' . $config['api_password'], CURLOPT_HTTPAUTH => CURLAUTH_BASIC ]); $response = curl_exec($curl); $data = json_decode($response, true); curl_close($curl); // Alternative: Using environment variables // $curl = curl_init(); // curl_setopt_array($curl, [ // CURLOPT_USERPWD => $_ENV['API_EMAIL'] . ':' . $_ENV['API_PASSWORD'], // // ... other options // ]);
Code to check API connectivity/functionality quickly in localhost
// Modern secure approach - get credentials from user input or env
const getCredentials = () => {
// Option 1: Get from environment (Node.js/build tools)
return {
username: process.env.API_EMAIL || '',
password: process.env.API_PASSWORD || ''
};
};
const { username, password } = getCredentials();
$.ajax({
url: "https://online.innovatiespotter.nl/api/companies?geregistreerd=true&page_size=1",
type: "GET",
headers: {
"Authorization": 'Basic ' + btoa(username + ":" + password),
"X-Requested-With": "XMLHttpRequest"
},
complete: function(data) {
let output, output_formatted;
if (data.responseJSON) {
output = data.responseJSON;
output_formatted = JSON.stringify(data.responseJSON, null, 4);
} else {
output = data.statusText + " => See more in console/Network.";
output_formatted = output;
}
console.log(output);
document.getElementById("api_test").innerHTML = output_formatted;
}
});
| Code | Description |
|---|---|
| 200 | OK – Request succeeded, valid response returned. |
| 204 | No Content – Used for OPTIONS or empty responses. |
| Request Errors (4xx) | |
| 400 | Bad Request – Invalid parameters or missing required fields. Solution: Check parameter names and values against documentation. |
| 401 | Unauthorized – Authentication failed. Solution: Check email/password combination. |
| 403 | Forbidden – Access denied. Solution: Verify account is active and has API access. |
| 404 | Not Found – Endpoint or resource does not exist. Solution: Verify endpoint URL and company identifiers. |
| 406 | Not Acceptable – Requested content type not supported. Solution: Use application/json. |
| 412 | Precondition Failed – Missing required headers or conditions. |
| 416 | Page Number Exceeds Last Page – Requested page does not exist. Solution: use `has_next_page` when iterating to check for next pages. |
| 422 | Unprocessable Entity – Semantic error - Validation error in submitted data. |
| 429 | Too Many Requests – API limit exceeded (monthly or daily fair usage). Solution: Reduce request frequency or contact support to extend limits. |
| Server Errors (5xx) | |
| 500 | Internal Server Error – Unexpected error, contact support if persistent. |
| 503 | Service Unavailable – Temporary outage or maintenance, try again later. |
Access comprehensive Dutch innovation data through our RESTful API endpoints
search performs comprehensive multi-criteria search across all available data, while quicksearch focuses on companies within your subscription for faster results.
| Parameter | Type | Required | Default |
|---|---|---|---|
q |
string | ✅ | - |
page_size |
integer (0-50) | ❌ | 10 |
page_number |
integer | ❌ | 1 |
| Example URL | Description |
|---|---|
/api/search?q=b.v
|
Basic search for "b.v" (10 results) |
/api/search?q=b.v&page_size=20
|
Search with 20 results per page |
/api/search?q=b.v&page_size=20&page_number=2
|
Second page of results |
$.get('https://online.innovatiespotter.nl/api/search', {
'q': 'b.v.',
'page_size': 20
}, function(data) {
console.log('Found ' + data.total + ' companies');
// Handle response data
});
| 200 | Success - Request completed |
| 4XX | Client error (auth, parameters) |
| 5XX | Server error |
Retrieve comprehensive company information with advanced filtering capabilities including location, innovation themes, business types, and ecosystem memberships. Perfect for data analysis and business intelligence applications.
| Parameter | Range/Options | Default |
|---|---|---|
page_size |
1-100 | 100 |
page_number |
1-∞ | 1 |
sort_column |
Various fields | datum_toegevoegd |
sort_direction |
asc, desc | asc |
id, bedrijfsnaam, adres, postcode,
plaats, provincie, werknemers, jaar,
rechtsvorm, bag, kvk, datum_toegevoegd,
geregistreerd, status_aangepast, score
Note: For keywords filter, only 'score' sort is available
bag | Building function types |
jaar | Year ranges (0 - current year) |
plaats | City names |
postcode | Postal codes (4 or 6 digits) |
provincie | Province names |
rechtsvorm | Legal entity types |
type_bedrijf | Business categories |
vestigingstype | Branch types |
werknemers | Employee ranges |
bedrijventerrein | Business park ID (rin_nummer) |
economischactief | Boolean: true/false |
ecosysteem | Innovation ecosystem categories |
geregistreerd | Boolean: true/false |
has_website_content | Boolean: true/false |
keywords | Website Content search queries |
sbi_code | SBI Code |
sbi_tekst | SBI Hoofdactiviteit |
themas | Innovation themes |
kvk | 8-digit KvK numbers |
vestigingsnummer | 12-digit branch numbers |
All filter values available from:
/api/filter_values/{filter_name}
Add _exclude suffix to exclude specific values from results.
sbi_code_exclude | Exclude SBI codes & subcategories |
themas_exclude | Exclude innovation themes |
ecosysteem_exclude | Exclude ecosystem categories |
Add _and suffix to require ALL specified values (API exclusive).
themas_and | Require ALL innovation themes |
ecosysteem_and | Require ALL ecosystem categories |
Check the response of the examples above by entering those urls in your browser. You should see a json response after you login with your credentials.
$.get('https://online.innovatiespotter.nl/api/companies', {'themas': 'im_proef_energie', 'geregistreerd': 'true'}, yourOnSuccessFunction() );
200 -> OK
4XX -> client error (login, wrong parameters etc)
5XX -> server error
These are the names we use in the backend for referring to the themes you see in the frontend, so for example if you want to filter by the theme "Energie", you have to use the label name im_proef_energie in your request.
So we use this endpoint to provide you with the backend filter names you need to use when you are filtering in companies endpoint.
q -> text (required) [case insensitive]Possible values: all, rechtsvorm, type_bedrijf, Type Bedrijf, bag, bedrijventerrein, ecosysteem, sbi_code, werknemers, themas, Thema's, plaats.
Check the response of the examples above by entering those urls in your browser. You should see a json response.
$.get('https://online.innovatiespotter.nl/api/filter_values/themas', yourOnSuccessFunction() );
200 -> OK
4XX -> client error (login, wrong parameters etc)
5XX -> server error
Request detailed company data using internal company IDs or 12-digit vestigingsnummers (branch numbers).
Use /api/company_full for single companies or /api/companies_full for batch requests up to 20 companies.
Note: These endpoints automatically filter for registered/active companies only.
/api/companies endpoint to find company IDs and vestigingsnummers.
Both fields are returned in the response and can be used with this endpoint. For registered companies only, add geregistreerd=true to your companies query.
| Parameter | Type | Required | Description |
|---|---|---|---|
id |
integer(s) | ✅* | Internal company ID(s), comma-separated for multiple |
vestigingsnummer |
string(s) | ✅* | 12-digit branch number(s), comma-separated for multiple |
* Either id or vestigingsnummer is required
| /company_full | Up to 10 companies |
| /companies_full | Up to 20 companies |
| Example URL | Endpoint | Description |
|---|---|---|
/api/company_full/3441068
|
company_full | Single company by ID |
/api/company_full?id=3441068,3593466,2678774
|
company_full | Multiple companies by ID |
/api/company_full?vestigingsnummer=000021885613
|
company_full | Single company by vestigingsnummer |
/api/companies_full?id=3441068,3593466,2678774,1234567,8901234
|
companies_full | Batch request (up to 20) |
/api/companies_full?vestigingsnummer=000021885613,000012345678,000098765432
|
companies_full | Batch by vestigingsnummer |
/api/companies_full?id=3441068,3593466&vestigingsnummer=000021885613,000012345678
|
companies_full | Mixed ID and vestigingsnummer |
$.get('https://online.innovatiespotter.nl/api/company_full/3441068',
function(data) {
console.log('Company:', data.bedrijfsnaam);
// Handle company data
});
$.get('https://online.innovatiespotter.nl/api/company_full', {
'vestigingsnummer': '000021885613'
}, function(data) {
console.log('Company:', data.bedrijfsnaam);
// Handle company data
});
$.get('https://online.innovatiespotter.nl/api/companies_full', {
'id': '3441068,3593466,2678774'
}, function(data) {
console.log('Companies:', data.companies);
console.log('Total found:', data.records_filtered);
});
| 200 | Success - Request completed |
| 4XX | Client error (auth, parameters) |
| 5XX | Server error |
| Field | Present in endpoints | Premium field |
|---|---|---|
| Adres | 1, 2, 4 | |
| BAG | 1, 2, 3, 4 | |
| Bedrijfsnaam | 1, 2, 4 | |
| Bedrijventerrein NEW API | 2, 3 | |
| Datum Toegevoegd | 1, 2, 4 | |
| Domeinsamenvatting NEW API BETA | 2 | |
| Duurzaamheid NEW | 2 | |
| E-mails | 4 | |
| Gemeente | 1, 2, 4 | |
| Geregistreerd | 1, 2, 4 | |
| Geregistreerde Status Aangepast | 1, 2, 4 | |
| Handelsnamen | 1, 2, 4 | |
| ID | 1, 2, 4 | |
| Innovatie-ecosysteem NEW API | 2, 3 | |
| Innovatie-footprint | 1, 2, 4 | |
| in_subscription | 1, 4 | |
| Jaar | 1, 2, 4 | |
| Keywords-Snippet NEW API | 2 | |
| KvK-Nummer | 1, 2, 4 | |
| 4 | ||
| Plaats | 1, 2, 3, 4 | |
| Postcode | 1, 2, 4 | |
| Provincie | 1, 2, 4 | |
| Rechtsvorm | 1, 2, 3, 4 | |
| SBI Branche | 4 | |
| SBI Code NEW | 1, 2, 4 | |
| SBI Hoofdactiviteit | 1, 2, 4 | |
| Telefoon | 4 | |
| Thema's | 1, 2, 3, 4 | |
| Topics | 1, 2, 3, 4 | |
| Type Bedrijf | 2, 3, 4 | |
| Vestiging | 1, 2, 4 | |
| Vestigingsnummer | 4 | |
| Websites | 1, 2, 4 | |
| Website Content Available NEW API | 2 | |
| Werknemers | 1, 2, 3, 4 |
Detailed explanation of complex response field structures and their usage
When filtering by bedrijventerrein using rin_nummer values, each company in the response includes a bedrijventerrein field containing an associative array with detailed business park information:
{
"bedrijventerrein": {
"rin_nummer": 4870,
"jaar": 2022,
"plan_naam": "Eemspoort",
"kern_naam": "Groningen",
"start_jaar": 1997,
"gem_namen": "Groningen",
"prov_namen": "Groningen",
"aantal": 177,
"ha_netto": "83.00",
"milieuzone": "Ja",
"max_milieu": "4"
}
}
Note: The bedrijventerrein field is only populated when companies are located on a registered business park. Companies not on business parks will have this field as null or empty.
sbi_code, sbi_tekstSBI (Standaard Bedrijfsindeling) is the Dutch Standard Business Classification system. The API uses hierarchical wildcard matching - searching for a parent code automatically includes all subcategories.
Default (Flat List):
/api/filter_values/sbi_code
Returns 2-3 digit codes in "code: name" format
Hierarchical Format:
/api/filter_values/sbi_code?format=hierarchy
Returns nested structure with 2-4 digit codes (keys can be used with sbi_code filter, values with sbi_tekst filter)
Exact matching is available only for:
sbi_tekst using the exact SBI Hoofdactiviteit text value01 → matches 01* (all Agriculture activities)63 → matches 63* (all IT services)721 → matches 721* (Scientific research and development + subcategories)01: Landbouw, jacht en dienstverlening... ├── 011: Teelt van eenjarige gewassen ├── 012: Teelt van meerjarige gewassen └── 013: Teelt van sierplanten 63: Dienstverlenende activiteiten op het gebied van informatie └── 631: Gegevensverwerking, webhosting en aanverwante activiteiten; webportals └── 639: Overige dienstverlenende activiteiten op het gebied van informatie 072: Speur- en ontwikkelingswerk ├── 721: Natuurwetenschappelijk speur- en ontwikkelingswerk │ ├── 7211: Biotechnologisch speur- en ontwikkelingswerk │ └── 7219: Overig natuurwetenschappelijk speur- en ontwikkelingswerk └── 722: Maatschappij- en geesteswetenschappelijk onderzoek
ecosysteem?ecosysteem=key"Innovatie-ecosysteem": {key:value}/api/filter_values/ecosysteem
Structure: Each key-value pair represents an ecosystem membership where:
award_mkbtop100-2015, netwerk_pioneering)This field contains detailed information about companies' innovation ecosystem memberships and awards. Each entry provides both the technical identifier and human-readable description:
{
"Innovatie-ecosysteem": {
"award_mkbtop100-2015": "MKB Innovatie Top 100 (2015)",
"netwerk_pioneering": "Pioneering",
"award_fast50-2015": "Deloitte Fast 50 (2015)",
"netwerk_tfhc": "Task Force Health Care"
}
}
The ecosysteem filter allows you to filter companies by their innovation footprint categories. The filter uses keys returned from the /api/filter_values/ecosysteem endpoint, which provides a hierarchical structure of ecosystem categories.
The /api/filter_values/ecosysteem endpoint returns a nested JSON structure organized by categories:
{
"award": {
"accenture": {
"award_accenture-2020": "Accenture Innovation Awards 2020"
},
"fd-gazellen": {…}
},
"investering": {
"investering_prime-ventures": "Prime Ventures",
"investering_techstars": "Techstars"
},
"rvo": {
"horizon": {…}
}
}
You can use any key from the ecosysteem response structure as a filter value. This includes:
patent, rvo, techleap to get all companies in that categorychallenger50, fd-gazellen to get companies in specific award programsaward_winnaars-social-impact-lab-pwc for precise filteringcategory_*-year.
* acts as a wildcard and matches any type within the chosen category for the specified year.award_*-2024 will match all awards given in 2024, regardless of the specific program.subsidie_rvo_*-2024 will match all RVO subsidies in 2024, regardless of the specific subsidy type.
Note: The filter keys correspond exactly to the keys available in the Innovatie-ecosysteem response field and from the /api/filter_values/ecosysteem endpoint.
import requests
import pandas as pd
import json
import time
from requests.auth import HTTPBasicAuth
# Configuration (see Environment Variables Version)
USERNAME = 'your-email@example.com'
PASSWORD = 'your-password'
BASE_URL = 'https://online.innovatiespotter.nl/api/companies'
def fetch_companies_to_csv():
start_time = time.time()
df = pd.DataFrame()
# Fetch data from multiple pages
for page_num in range(1, 10):
try:
# Build URL with filters
url = f"{BASE_URL}?sort_direction=desc&sort_column=werknemers&werknemers=Cat. 01: 1 - 1,Cat. 07: 100 - 249&geregistreerd=true&page_number={page_num}"
# Make request with authentication
response = requests.get(url, auth=HTTPBasicAuth(USERNAME, PASSWORD))
response.raise_for_status()
# Parse JSON response
data = response.json()
companies = data['companies']
# Append to DataFrame
page_df = pd.DataFrame(companies)
df = pd.concat([df, page_df], ignore_index=True)
print(f"Fetched page {page_num} - {len(companies)} companies")
time.sleep(1) # Rate limiting
if len(companies) == 0:
break
except Exception as e:
print(f"Error on page {page_num}: {e}")
continue
# Export to CSV
if not df.empty:
df.to_csv('innovatiespotter_companies.csv', index=False)
print(f"Exported {len(df)} companies to CSV")
end_time = time.time()
print(f"Total execution time: {end_time - start_time:.2f} seconds")
# Run the function
if __name__ == "__main__":
fetch_companies_to_csv()
import os
import requests
import pandas as pd
from requests.auth import HTTPBasicAuth
# Use environment variables for security
USERNAME = os.getenv('INNOVATIESPOTTER_EMAIL')
PASSWORD = os.getenv('INNOVATIESPOTTER_PASSWORD')
if not USERNAME or not PASSWORD:
raise ValueError("Please set environment variables")
# Your API code here...