Start hier
Aan de slag
- Je hebt een actief betaald premium abonnement nodig. Studentenaccounts hebben geen API-toegang.
- Maak een API key aan via Profiel > API.
- Bewaar de key meteen; de volledige waarde wordt maar één keer getoond.
- Kies het endpoint dat bij je toepassing past en stuur de key mee als Bearer token.
Geldt voor beide endpoints
Authenticatie
Stuur bij iedere request deze headers mee. Vervang YOUR_API_KEY door je eigen key.
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
Accept: application/json
Requestlimieten: houd maximaal 1 request per seconde per API key en 1.000 requests per dag per account aan.
De daglimiet telt Keyword metrics en Keyword zoeken samen. Ook requests via verschillende API keys van hetzelfde account worden bij elkaar opgeteld.
Kies je toepassing
Twee endpoints
Keyword metrics
Exacte batch-lookup voor zoekvolume, CPC, intentie, moeilijkheid en maandhistorie van maximaal 100 bekende zoekwoorden.
Bekijk endpointKeyword zoeken
Full-text discovery voor nieuwe keywords, met volume- en intentiefilters en cursor-paginering.
Bekijk endpointKeyword metrics
Gebruik dit endpoint als je al weet voor welke zoekwoorden je data nodig hebt. Het voert een exacte batch-lookup uit voor maximaal 100 unieke zoekwoorden.
Endpoint
POST https://tool.zoekwoord.nl/api/v1/keywords/metrics
Requestvelden
| Veld | Type | Vereist | Validatie |
|---|---|---|---|
| keywords | array<string> | Ja | 1–100 unieke, niet-lege zoekwoorden; maximaal 255 tekens per zoekwoord. |
Requestvoorbeeld
{
"keywords": ["seo bureau", "zoekwoorden onderzoek"]
}Codevoorbeelden
cURL
curl --request POST 'https://tool.zoekwoord.nl/api/v1/keywords/metrics' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--data '{"keywords":["seo bureau","zoekwoorden onderzoek"]}'JavaScript
const response = await fetch('https://tool.zoekwoord.nl/api/v1/keywords/metrics', {
method: 'POST',
headers: {
Authorization: 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
Accept: 'application/json',
},
body: JSON.stringify({ keywords: ['seo bureau', 'zoekwoorden onderzoek'] }),
});
const result = await response.json();PHP
$response = Http::withToken('YOUR_API_KEY')
->acceptJson()
->post('https://tool.zoekwoord.nl/api/v1/keywords/metrics', [
'keywords' => ['seo bureau', 'zoekwoorden onderzoek'],
]);
$result = $response->json();Response
{
"data": [
{
"keyword": "seo bureau",
"found": true,
"data_source": "Zoekwoord.nl",
"spell": null,
"spell_type": null,
"search_volume": 1000,
"clickstream_search_volume": 920,
"clickstream_normalized_search_volume": 980,
"cpc": 2.73,
"seo_difficulty": 47,
"competition": 31,
"competition_level": "MEDIUM",
"intent": "commercial",
"secondary_intents": ["transactional"],
"history": { "202501": 900, "202502": 1000 },
"be_nl_search_volume": 120,
"be_nl_history": { "202501": 90, "202502": 120 }
},
{
"keyword": "onbekend zoekwoord",
"found": false,
"data_source": "Zoekwoord.nl"
}
]
}Responsevelden
| Veld | Beschrijving |
|---|---|
| keyword | Ingestuurd zoekwoord, zonder spaties aan begin en einde. |
| found | Of er metrics beschikbaar zijn. Bij false ontbreken de overige velden. |
| data_source | Bron van de data; Zoekwoord.nl. |
| spell / spell_type | Spellingssuggestie en het type correctie, of null. |
| search_volume | Gemiddeld maandelijks zoekvolume voor Nederland, of null. |
| clickstream_search_volume | Beschikbaar clickstream zoekvolume, of null. |
| clickstream_normalized_search_volume | Genormaliseerd clickstream zoekvolume, of null. |
| cpc | CPC in EUR, afgerond op twee decimalen, of null. |
| seo_difficulty / competition | SEO- en betaalde moeilijkheid als score van 0 tot 100, of null. |
| competition_level | Bijvoorbeeld LOW, MEDIUM of HIGH. |
| intent / secondary_intents | Primaire zoekintentie en een lijst met secundaire intenties. |
| history | Maximaal de 12 recentste Nederlandse maanden als YYYYMM: volume. |
| be_nl_search_volume / be_nl_history | Zoekvolume en maximaal 12 maanden historie voor België (Nederlands). |
Goed om te weten
De response behoudt altijd de volgorde van je request. Een onbekend zoekwoord geeft found: false en veroorzaakt geen fout voor de rest van de batch.
Keyword zoeken
Gebruik dit endpoint om nieuwe keywords te ontdekken. Het doorzoekt dezelfde keywordindex en gebruikt dezelfde full-text zoeklogica als de applicatie, met filters en cursor-paginering.
Endpoint
POST https://tool.zoekwoord.nl/api/v1/keywords/searchRequestvelden
| Veld | Type | Vereist | Standaard / validatie |
|---|---|---|---|
| keyword | string | Ja | Zoekterm van 3–255 tekens. |
| min_search_volume | integer | Nee | Minimaal 0. |
| max_search_volume | integer | Nee | Minimaal 0 en niet lager dan het minimum. |
| intents | array<string> | Nee | navigational, informational, commercial en/of transactional. |
| starts_with / ends_with | string | Nee | Filter op begin of einde; maximaal 255 tekens. |
| limit | integer | Nee | Standaard 50; minimaal 1 en maximaal 100. |
| cursor | string | Nee | next_cursor uit de vorige response; maximaal 500 tekens. |
Requestvoorbeeld
{
"keyword": "seo bureau",
"min_search_volume": 100,
"intents": ["commercial"],
"limit": 50
}Codevoorbeelden
cURL
curl --request POST 'https://tool.zoekwoord.nl/api/v1/keywords/search' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--data '{"keyword":"seo bureau","limit":50}'JavaScript
const response = await fetch('https://tool.zoekwoord.nl/api/v1/keywords/search', {
method: 'POST',
headers: {
Authorization: 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
Accept: 'application/json',
},
body: JSON.stringify({ keyword: 'seo bureau', limit: 50 }),
});
const result = await response.json();PHP
$response = Http::withToken('YOUR_API_KEY')
->acceptJson()
->post('https://tool.zoekwoord.nl/api/v1/keywords/search', [
'keyword' => 'seo bureau',
'limit' => 50,
]);
$result = $response->json();Response
{
"data": [
{
"keyword": "seo bureau",
"data_source": "Zoekwoord.nl",
"search_volume": 1000,
"be_nl_search_volume": 120,
"cpc": 2.73,
"seo_difficulty": 47,
"history": { "202501": 900, "202502": 1000 },
"be_nl_history": { "202501": 90, "202502": 120 },
"competition": 31,
"competition_level": "MEDIUM",
"intent": "commercial",
"secondary_intents": ["transactional"]
}
],
"pagination": {
"limit": 50,
"returned_results": 1,
"has_more": false,
"next_cursor": null
}
}Responsevelden
| Veld | Beschrijving |
|---|---|
| data | Matches gesorteerd op zoekvolume, daarna keyword. |
| keyword | Gevonden keyword. |
| data_source | Bron van de data; Zoekwoord.nl. |
| search_volume / be_nl_search_volume | Gemiddeld maandelijks zoekvolume voor Nederland en België (Nederlands). |
| cpc | CPC in EUR, afgerond op twee decimalen, of null. |
| seo_difficulty / competition | SEO- en betaalde moeilijkheid als score van 0 tot 100. |
| history / be_nl_history | Maximaal de 12 recentste maanden als YYYYMM: volume. |
| intent / secondary_intents | Primaire en secundaire zoekintenties. |
| pagination | limit, aantal resultaten, has_more en eventueel next_cursor. |
Volgende pagina ophalen
Stuur pagination.next_cursor mee als cursor in je volgende request. Gebruik daarbij exact dezelfde zoekterm en filters. Bij de laatste pagina zijn has_more false en next_cursor null.
Geldt voor beide endpoints
Fouten en limieten
| Status | Betekenis |
|---|---|
| 401 | De API key ontbreekt of is ongeldig. Code: UNAUTHENTICATED. |
| 403 | De key heeft geen toegang tot keyworddata of het account heeft geen actief betaald premium abonnement. Studentenaccounts hebben geen API-toegang. Code: FORBIDDEN. |
| 422 | De requestbody voldoet niet aan de validatie. De response wijst de ongeldige velden aan. |
| 429 | De limiet van 1 request per seconde per API key of 1.000 requests per dag per account is bereikt. Beide endpoints en alle keys van het account tellen samen. Code: RATE_LIMIT_EXCEEDED. |