Toon Klusio blogs op je eigen website
De API is een beveiligde verbinding waarmee je website gepubliceerde blogs uit Klusio kan ophalen. Je krijgt gegevens terug in JSON. Je website bepaalt daarna zelf hoe titel, afbeelding en tekst eruitzien.
Wat gebeurt er precies?
Voor een webbouwer zijn je bedrijfs-ID, API-key en deze pagina voldoende. Deel de sleutel via een veilige wachtwoordmanager, nooit per openbare mail of in een publiek document.
Snelle start
- Maak ingelogd een API-key aan bij Instellingen → API.
- Kopieer de key meteen; Klusio toont hem maar één keer volledig.
- Laat je website de key op de server meesturen.
- Vraag eerst één artikel op en controleer daarna de vormgeving.
Basisadres
https://klusio.nl/api/v1/blogsEerste test met cURL
curl --request GET \
--url "https://klusio.nl/api/v1/blogs?company_id=JOUW_BEDRIJFS_ID&limit=1" \
--header "X-API-Key: JOUW_API_KEY"Een geslaagde request geeft HTTP-status 200 en begint met {"success":true.
API-key veilig gebruiken
Een API-key werkt als een wachtwoord voor de koppeling. Stuur hem bij voorkeur mee met de header X-API-Key. Een Bearer-header wordt ook ondersteund.
X-API-Key: JOUW_API_KEY
# Alternatief
Authorization: Bearer JOUW_API_KEYIedere bezoeker kan JavaScript en netwerkrequests bekijken. Gebruik PHP, Node.js, Python, een serverless function of de beveiligde opslag van je CMS. Zet de key ook niet als ?api_key=... in een URL; API v1 weigert dat bewust.
- Geef iedere website of koppeling een eigen key met een herkenbare naam.
- Schakel een key uit wanneer een koppeling tijdelijk stopt.
- Verwijder en vervang een key die mogelijk is uitgelekt.
- Gebruik een vervaldatum voor tijdelijke externe toegang.
Welke gegevens kun je opvragen?
Gebruik per request één hoofdkeuze: een lijst, één artikel, een topic, een pillar of gerelateerde artikelen. Combineer slug, topic_id, pillar_url en related_to niet; de API weigert zo'n dubbelzinnige request met HTTP 400.
| Doel | Voorbeeld na het basisadres | Wat je krijgt |
|---|---|---|
| Nieuwste artikelen | ?company_id=JOUW_BEDRIJFS_ID&limit=10 | Een lijst plus totaal en offset. |
| Eén volledig artikel | ?company_id=JOUW_BEDRIJFS_ID&slug=mijn-artikel | Volledige inhoud, SEO-data en tracking. |
| Eén topic | ?company_id=JOUW_BEDRIJFS_ID&topic_id=5 | Artikelen en pillar-informatie van het topic. |
| Topic bij een pillar | ?company_id=JOUW_BEDRIJFS_ID&pillar_url=https%3A%2F%2Fvoorbeeld.nl%2Fdienst | Het topic dat bij die volledige URL hoort. |
| Gerelateerde artikelen | ?company_id=JOUW_BEDRIJFS_ID&related_to=mijn-artikel&limit=3 | Maximaal drie passende artikelen. |
Parameters voor lijsten
| Parameter | Verplicht? | Betekenis |
|---|---|---|
company_id | JA | Het nummer van het Klusio-bedrijf. |
limit | Nee | Aantal artikelen, standaard 20 en maximaal 100. |
offset | Nee | Aantal over te slaan artikelen, handig voor paginering. |
search | Nee | Zoekt in titel, meta description en artikeltekst; maximaal 200 tekens. |
sort | Nee | recent, oldest, popular of reading-time. |
author_id | Nee | Toont alleen artikelen van één Klusio-auteur. |
include | Nee | topics,authors geeft ook de onderwerpen met hun hoofdpagina en de auteurs mee, zodat je artikelen op de juiste dienstpagina en auteurspagina zet. |
Elk artikel in een lijst heeft ook url (het volledige adres in de vorm van je site), updated_at, topic_id, author_id en noindex.
Lijsten bevatten alleen gepubliceerde en zichtbare artikelen die voldoen aan de bloginstellingen van het bedrijf. Een directe slug-request kan een zichtbaar gepubliceerd artikel wel altijd ophalen.
Zo ziet een response eruit
Lijst met artikelen
{
"success": true,
"total": 75,
"limit": 1,
"offset": 0,
"posts": [{
"id": 2042,
"slug": "voorbeeld-artikel",
"title": "Voorbeeldtitel",
"meta_description": "Korte omschrijving voor Google.",
"featured_image": "https://voorbeeld.nl/afbeelding.webp",
"featured_image_alt": "Beschrijving van de afbeelding",
"author": "Naam auteur",
"published_at": "2026-08-12 09:00:00",
"reading_time": 6,
"views_count": 123,
"is_indexed": true,
"content_type": "how_to_guide"
}],
"reviews": {
"google_rating": 4.8,
"total_reviews": 47,
"rating_distribution": {"5":42,"4":3,"3":1,"2":0,"1":1},
"business_name": "Voorbeeldbedrijf",
"latest_reviews": []
},
"filters_applied": {
"search": null,
"sort": "recent",
"visibility": {"min_views":0,"require_indexed":false,"hide_after_days":null}
}
}De lijst bevat bewust geen volledige artikeltekst. Vraag een artikel daarna op via slug.
Eén volledig artikel
De single-post response bevat post met onder andere content, meta_description, featured_image, cta_text, cta_link, topicvelden en eventuele FAQ-, HowTo- en claimdata. Daarnaast krijg je:
author_detailsenreviewer_detailsvoor zichtbare expertiseblokken;schema_markupenseo_headvoor correcte SEO-uitvoer;pillar_postwanneer het artikel aan een hoofdpagina is gekoppeld;tracking_scriptentracking_tokenvoor veilige paginameting;reviewsmet de laatst gesynchroniseerde Google Reviews.
post.content, seo_head, schema_markup en tracking_script bevatten HTML. Plaats deze alleen rechtstreeks als de response echt van Klusio komt en de API-request is geslaagd.
Compleet PHP-voorbeeld
Dit voorbeeld haalt op de server vijf blogs op. De API-key staat in een environment variable en komt dus niet in de browser terecht.
<?php
$apiKey = getenv('KLUSIO_API_KEY');
$url = 'https://klusio.nl/api/v1/blogs?company_id=JOUW_BEDRIJFS_ID&limit=5&sort=recent';
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 15,
CURLOPT_HTTPHEADER => [
'Accept: application/json',
'X-API-Key: ' . $apiKey,
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlError = curl_error($ch);
curl_close($ch);
if ($body === false || $curlError !== '') {
throw new RuntimeException('Klusio API is niet bereikbaar: ' . $curlError);
}
$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
if ($status !== 200 || empty($data['success'])) {
throw new RuntimeException($data['error'] ?? 'Onbekende API-fout');
}
foreach ($data['posts'] as $post) {
echo '<a href="/blog/' . rawurlencode($post['slug']) . '">';
echo htmlspecialchars($post['title'], ENT_QUOTES, 'UTF-8');
echo '</a>';
}Artikelweergaven meten
Vraag je één artikel via slug op, dan levert Klusio een kant-en-klaar tracking_script. Dat script gebruikt een kortlevend token dat alleen bij dat artikel en bedrijf past.
// Na een geslaagde single-post request:
echo $data['post']['content'];
echo $data['tracking_script']; // bij voorkeur vlak voor </body>Voor een eigen implementatie stuur je een POST naar https://klusio.nl/api/v1/track met post_id, company_id en de ontvangen tracking_token. Optioneel zijn visitor_id, time_spent, scroll_depth, referrer en converted.
Statische pagina's of een eigen cache
Bouwt je site de artikelen zelf als pagina's op de server, haal een artikel dan op met count_view=0: dat ophalen is geen lezer. Geef de meting van de lezer door vanaf je eigen server met dezelfde POST, maar met de API-key in X-API-Key in plaats van tracking_token. Klusio bewaart dan geen IP-adres en browser van je server. Zet de API-key nooit in de browser.
Heeft je site een synchronisatieadres (bijvoorbeeld /klusio/sync.php), dan roept Klusio dat aan vlak voor de controle of een nieuw of vernieuwd artikel live staat. Laat Klusio dat adres instellen.
Artikelen in andere talen
Zet het bedrijf in Klusio bij Blog › Instellingen een taal aan, dan vertaalt Klusio elk nieuw goedgekeurd artikel en zet het in de API met lang. Dat kan vanaf Groei Pro. De inhoud is dezelfde als in het Nederlands; Klusio controleert de vertaling op betekenis, cijfers, namen en links.
| Doel | Voorbeeld na het basisadres | Wat je krijgt |
|---|---|---|
| Engelse artikelen | ?company_id=JOUW_BEDRIJFS_ID&lang=en&limit=10 | De vertaalde artikelen, nieuwste eerst. sort, topic_id, author_id en related_to werken ook. |
| Eén Engels artikel | ?company_id=JOUW_BEDRIJFS_ID&lang=en&slug=engelse-slug | Hetzelfde als een Nederlands artikel, met vertaalde titel, tekst, meta en knoptekst. De slug van het Nederlandse origineel werkt ook. |
Elk artikel heeft language en translations: per vertaling de taal, slug, titel, url en live. Een los artikel heeft ook alternates (hreflang naar adres), en seo_head bevat dezelfde regels.
"language": "nl",
"translations": [
{
"language": "en",
"slug": "how-to-choose-a-roofer",
"title": "How to choose a roofer",
"url": "https://voorbeeld.nl/en/blog/how-to-choose-a-roofer/",
"live": false
}
]Zo zet je ze op je website
Toon de vertaling onder het adres dat in url staat. Dat adres kiest het bedrijf in Blog › Instellingen; standaard is het /en/blog/<slug>/. Een taalkeuze op de pagina maak je met translations.
Klusio kijkt na de publicatie of de vertaling op dat adres staat. Pas dan wordt live true en komen de hreflang-regels in seo_head van het Nederlandse artikel en in de sitemap. Zo verwijst Google nooit naar een pagina die je site nog niet toont.
Herkenbaar AI-verkeer meten
Doorkliks vanuit AI-assistenten en bezoeken van AI-crawlers geef je vanaf je eigen server door met POST /api/v1/ai-traffic. Klusio heeft hiervoor geen WordPress-plugin. Stuur de API-key via X-API-Key. Klusio accepteert alleen herkenbare AI-referrals en AI-user-agents; een gewone Googlebot, Bingbot of zoekmachinereferral telt niet als AI.
{
"event_type": "crawler",
"event_key": "unieke-idempotency-key-per-request",
"landing_url": "https://voorbeeld.nl/dienstpagina",
"user_agent": "OAI-SearchBot/1.0"
}Klusio bewaart geen IP-adres, volledige user-agent of querystring. Een crawlerhit betekent dat een verzoek een bekende AI-crawleridentiteit droeg; alleen een expliciete browserreferral is een gemeten doorklik vanuit een AI-assistent.
Google Reviews
Responses bevatten het laatst gesynchroniseerde reviewoverzicht: gemiddelde beoordeling, aantal reviews, verdeling per ster, bedrijfsnaam en maximaal tien zichtbare recente reviews. Deze gegevens zijn niet live per seconde; Klusio ververst ze periodiek, normaal dagelijks.
Wanneer Google Reviews niet gekoppeld zijn of nog niet zijn opgehaald, kan reviews leeg zijn of nulwaarden bevatten. Bouw je website zo dat het reviewblok dan netjes verborgen blijft.
Fouten begrijpen
Elke fout bevat success: false, een leesbare error, een vaste error_code en een request_id. Geef dat request-ID door aan support; technische serverdetails blijven veilig in de log.
{
"success": false,
"error": "Een geldige API-key is verplicht. Gebruik de X-API-Key-header.",
"error_code": "invalid_api_key",
"request_id": "a1b2c3d4e5f60708"
}| Status | Betekenis | Wat je doet |
|---|---|---|
400 | Request klopt niet | Controleer bedrijfs-ID, URL en parameters. |
401 | Key of trackingtoken ontbreekt/klopt niet | Controleer de header of haal een nieuw trackingtoken op. |
403 | Key is uitgeschakeld, verlopen, zonder leesrecht of van een ander bedrijf | Controleer de key in API-beheer. |
404 | Artikel of topic bestaat niet | Controleer slug/topic. Bij een verplaatst artikel staat redirect_to in de response. |
405 | Verkeerde HTTP-methode | Gebruik GET voor blogs en POST voor tracking. |
429 | Uurlimiet bereikt | Wacht volgens Retry-After en gebruik caching. |
500 | Interne fout | Bewaar request_id en neem contact op. |
Limieten en caching
Nieuwe keys starten standaard op 100 requests per uur. In API-beheer kun je per key een limiet van 1 tot 1.000 instellen. Na geldige authenticatie zie je het verbruik in deze responseheaders:
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 96
X-RateLimit-Reset: 1786525200- Cache een artikellijst 5 tot 15 minuten.
- Cache een volledig artikel tot maximaal één uur.
- Vraag Google Reviews niet vaker dan dagelijks opnieuw op.
- Gebruik bij HTTP 429 de header
Retry-After; blijf niet direct opnieuw proberen.
Bestaande koppelingen
Het oude endpoint /api/blog.php blijft voorlopig bestaan zodat huidige websites niet onverwacht uitvallen. Nieuwe koppelingen horen altijd /api/v1/blogs te gebruiken. V1 heeft verplichte authenticatie, vaste validatie en voorspelbare foutcodes.
Verander eerst het endpoint en stuur de key via X-API-Key. Test lijst, single post, redirects en tracking. Zet pas daarna de oude koppeling uit.
Kom je er niet uit?
Stuur naar support@klusio.nl: je company_id, het gebruikte endpoint, de HTTP-status, het request_id en het tijdstip. Stuur nooit je volledige API-key mee.


