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
Eén API key werkt voor zowel Keyword metrics als Keyword zoeken. Houd maximaal 1 request per seconde per API key aan; deze limiet wordt door beide endpoints gedeeld.
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 gedeelde limiet van 1 request per seconde per API key is bereikt. Code: RATE_LIMIT_EXCEEDED. |