Klusio helpt ondernemers structureel groeien. Start vandaag
v1.7

Klusio API Documentatie

Volledige REST API voor blogs, topics, gerelateerde posts en Google Reviews

De Klusio API biedt toegang tot al je blog content, inclusief automatisch gegenereerde gerelateerde posts, topic clustering, en real-time Google Reviews data. Ideaal voor headless CMS implementaties en custom frontends.

Aan de slag

De Klusio API is een RESTful API die JSON responses retourneert. Alle endpoints vereisen authenticatie via een API key die je in je X-API-Key header meestuurt.

Base URL

https://klusio.nl/api/blog.php

Authenticatie

Elke request vereist een API key in de header:

HTTP Header
X-API-Key: jouw_api_key_hier
Belangrijk Je API key is persoonlijk en moet veilig worden bewaard. Deel deze nooit in publieke repositories of client-side code.

Endpoints Overzicht

De API biedt vier hoofdfuncties, allemaal via hetzelfde endpoint met verschillende parameters:

FunctieParametersBeschrijving
Blog Listingcompany_idHaal alle blog posts op met paginering en filters
Single Postcompany_id + slugHaal een specifieke blog post op
Topic Postscompany_id + topic_idHaal alle posts van een specifiek topic op
Related Postscompany_id + related_toHaal gerelateerde posts op basis van topic clustering
View Trackingpost_id + company_idRegistreer pageviews, tijd op pagina en conversies (POST)

1
Blog Listing

GET Haal een lijst van alle blog posts op

GET /api/blog.php?company_id=123&limit=10&offset=0

Parameters

ParameterTypeBeschrijving
company_idVERPLICHTintegerHet unieke ID van je bedrijf
limitOPTIONEELintegerAantal posts per pagina (max 100, default 20)
offsetOPTIONEELintegerAantal posts om over te slaan (voor paginering)
searchOPTIONEELstringZoekterm voor titel of content
sortOPTIONEELstringSorteer op: recent, popular, oldest

Voorbeeld Request

PHP (cURL)
$ch = curl_init('https://klusio.nl/api/blog.php?company_id=123&limit=10');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'X-API-Key: jouw_api_key_hier',
    'Content-Type: application/json'
]);

$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);

Response

JSON
{
  "success": true,
  "total": 47,
  "limit": 10,
  "offset": 0,
  "posts": [
    {
      "id": 123,
      "title": "Hoe kies je de juiste dakpannen?",
      "slug": "hoe-kies-je-de-juiste-dakpannen",
      "excerpt": "Een korte samenvatting van de post...",
      "content": "Volledige HTML content...",
      "featured_image": "https://...",
      "published_at": "2025-01-20 10:30:00",
      "views": 342,
      "topic_id": 5,
      "topic_name": "Dakbedekking"
    }
  ],
  "reviews": {
    "google_rating": 4.8,
    "total_reviews": 47,
    "rating_distribution": {
      "5": 42,
      "4": 3,
      "3": 1,
      "2": 0,
      "1": 1
    },
    "business_name": "Jouw Bedrijf BV",
    "latest_reviews": [
      {
        "reviewer_name": "Jan Janssen",
        "author_image_url": "https://...",
        "rating": 5,
        "review_text": "Uitstekende service!",
        "review_timestamp": "2025-01-15 14:30:00",
        "time_ago": "5 dagen geleden",
        "review_link": "https://g.page/..."
      }
    ]
  }
}

2
Single Post

GET Haal een specifieke blog post op via de slug

GET /api/blog.php?company_id=123&slug=mijn-blog-post

Parameters

ParameterTypeBeschrijving
company_idVERPLICHTintegerHet unieke ID van je bedrijf
slugVERPLICHTstringDe URL-vriendelijke slug van de blog post

Response

JSON
{
  "success": true,
  "post": {
    "id": 123,
    "title": "Hoe kies je de juiste dakpannen?",
    "slug": "hoe-kies-je-de-juiste-dakpannen",
    "excerpt": "Een korte samenvatting...",
    "content": "<p>Volledige HTML content...</p>",
    "featured_image": "https://...",
    "published_at": "2025-01-20 10:30:00",
    "views": 342,
    "topic_id": 5,
    "topic_name": "Dakbedekking"
  },
  "reviews": { ... },
  "tracking_script": "<script>...</script>"
}
Tracking Script De response bevat een tracking_script die automatisch pageviews registreert. Plaats deze in je HTML voor accurate statistieken.

3
Topic Posts

GET Haal alle blog posts van een specifiek topic/cluster op

GET /api/blog.php?company_id=123&topic_id=5

Parameters

ParameterTypeBeschrijving
company_idVERPLICHTintegerHet unieke ID van je bedrijf
topic_idVERPLICHTintegerHet ID van het topic/cluster
limitOPTIONEELintegerAantal posts (default 20)
offsetOPTIONEELintegerOffset voor paginering

Response

JSON
{
  "success": true,
  "total": 8,
  "posts": [ ... ],
  "topic": {
    "id": 5,
    "name": "Dakbedekking",
    "slug": "dakbedekking",
    "status": "active",
    "pillar_type": "pillar"
  },
  "pillar": {
    "url": "https://voorbeeld.nl/dakbedekking",
    "title": "Alles over dakbedekking",
    "type": "page"
  },
  "reviews": { ... }
}

Blog View Tracking

De Klusio API biedt ingebouwde view tracking voor blog posts. Hiermee worden pageviews, unieke bezoekers, tijd op pagina, scroll diepte en conversies automatisch bijgehouden in je Klusio dashboard.

Methode 1: Automatisch via tracking_script (aanbevolen)

Wanneer je een single post ophaalt via de API (met slug parameter), bevat de response een tracking_script veld. Dit is een kant-en-klare <script> tag die je direct in je blog detail pagina kunt plaatsen.

HTML / PHP
// Haal single post op
$response = file_get_contents('https://klusio.nl/api/blog.php?company_id=123&slug=mijn-post', false,
    stream_context_create(['http' => ['header' => 'X-API-Key: jouw_key']])
);
$data = json_decode($response, true);

// Toon de post content
echo $data['post']['content'];

// Plaats het tracking script voor </body>
echo $data['tracking_script'];
Automatisch inbegrepen Het tracking script genereert automatisch een uniek visitor_id (opgeslagen in localStorage), meet de tijd op de pagina, en stuurt de data via sendBeacon bij het verlaten van de pagina. Er wordt exact 1 view per paginabezoek geregistreerd.

Wat het tracking script meet

MetricBeschrijving
PageviewEenmalige registratie per paginabezoek
Unieke bezoekerOp basis van visitor_id per dag (eerste bezoek = uniek)
Tijd op paginaSeconden doorgebracht op de pagina (gemeten bij verlaten)
Scroll diepteMaximaal scroll percentage (0-100%)
BounceAutomatisch berekend: bezoek < 10 seconden = bounce
ReferrerDe pagina van waaruit de bezoeker kwam

Methode 2: Handmatig via Track API endpoint

POST Voor eigen implementaties kun je views ook handmatig registreren via het tracking endpoint.

POST https://klusio.nl/api/track-blog-view.php

Request Body (JSON)

ParameterTypeBeschrijving
post_idVERPLICHTintegerHet ID van de blog post
company_idVERPLICHTintegerHet ID van het bedrijf
visitor_idOPTIONEELstringUniek bezoeker ID (voor unieke bezoeker tracking)
time_spentOPTIONEELintegerTijd op pagina in seconden
scroll_depthOPTIONEELintegerMaximale scroll diepte in procenten (0-100)
referrerOPTIONEELstringReferrer URL
convertedOPTIONEELbooleanOf de bezoeker een conversie heeft gedaan (bijv. contactformulier)

Voorbeeld: Handmatige tracking met JavaScript

JavaScript
// Genereer of hergebruik een uniek visitor ID
let visitorId = localStorage.getItem('klusio_visitor_id');
if (!visitorId) {
    visitorId = 'v_' + Math.random().toString(36).substr(2, 12)
                + '_' + Date.now().toString(36);
    localStorage.setItem('klusio_visitor_id', visitorId);
}

// Track de view bij het verlaten van de pagina
const startTime = Date.now();
let maxScroll = 0;

window.addEventListener('scroll', () => {
    const pct = Math.round(
        (window.scrollY + window.innerHeight)
        / document.documentElement.scrollHeight * 100
    );
    if (pct > maxScroll) maxScroll = pct;
});

window.addEventListener('beforeunload', () => {
    const data = JSON.stringify({
        post_id: 123,        // ID van de blog post
        company_id: 456,     // Jouw company ID
        visitor_id: visitorId,
        time_spent: Math.round((Date.now() - startTime) / 1000),
        scroll_depth: maxScroll,
        referrer: document.referrer || ''
    });

    navigator.sendBeacon(
        'https://klusio.nl/api/track-blog-view.php',
        data
    );
});

Response

JSON
{
  "success": true,
  "message": "View succesvol geregistreerd",
  "is_unique": true
}
Best Practice Gebruik Methode 1 (tracking_script) als je de API gebruikt om single posts op te halen. Gebruik Methode 2 alleen als je een volledig eigen tracking implementatie nodig hebt. Stuur de data bij voorkeur via navigator.sendBeacon() bij het verlaten van de pagina voor betrouwbare registratie zonder de gebruiker te vertragen.

Google Reviews Data

Nieuw in v1.7! Alle API responses bevatten nu automatisch Google Reviews data. Dit stelt je in staat om je Google beoordeling en reviews te tonen op je website.

Reviews Object Structuur

JSON
{
  "reviews": {
    "google_rating": 4.8,
    "total_reviews": 47,
    "rating_distribution": {
      "5": 42,
      "4": 3,
      "3": 1,
      "2": 0,
      "1": 1
    },
    "business_name": "Jouw Bedrijf BV",
    "latest_reviews": [
      {
        "reviewer_name": "Jan Janssen",
        "author_image_url": "https://lh3.googleusercontent.com/...",
        "rating": 5,
        "review_text": "Uitstekende service! Zeer professioneel.",
        "review_timestamp": "2025-01-15 14:30:00",
        "time_ago": "5 dagen geleden",
        "review_link": "https://g.page/..."
      }
    ]
  }
}

Velden Uitleg

VeldTypeBeschrijving
google_ratingfloatGemiddelde Google rating (0-5)
total_reviewsintegerTotaal aantal Google reviews
rating_distributionobjectVerdeling van ratings per sterren (1-5)
business_namestringBedrijfsnaam zoals vermeld op Google
latest_reviewsarrayMaximaal 10 meest recente zichtbare reviews

Frontend Implementatie

JavaScript
// Fetch blog posts met reviews
const response = await fetch('https://klusio.nl/api/blog.php?company_id=123');
const data = await response.json();

if (data.reviews) {
  const rating = data.reviews.google_rating;
  const totalReviews = data.reviews.total_reviews;

  // Toon rating
  document.getElementById('rating').textContent = `${rating}/5`;
  document.getElementById('count').textContent = `${totalReviews} reviews`;

  // Toon reviews
  data.reviews.latest_reviews.forEach(review => {
    console.log(`${review.reviewer_name}: ${review.review_text}`);
  });
}

Error Handling

De API gebruikt standaard HTTP status codes en retourneert error responses in JSON formaat.

HTTP Status Codes

CodeBetekenisBeschrijving
200OKRequest succesvol verwerkt
400Bad RequestVerplichte parameters ontbreken
401UnauthorizedOngeldige of ontbrekende API key
404Not FoundBlog post niet gevonden
405Method Not AllowedAlleen GET requests zijn toegestaan
500Internal Server ErrorServer error opgetreden

Error Response Format

JSON
{
  "error": "company_id is required",
  "success": false
}

Rate Limiting

De API heeft momenteel geen harde rate limits, maar we raden aan om response caching te implementeren voor optimale performance.

Aanbevolen Caching Strategie

  • Blog Listing: Cache voor 5-15 minuten
  • Single Post: Cache voor 1 uur (of tot content update)
  • Related Posts: Cache voor 30 minuten
  • Google Reviews: Cache voor 1 dag (updates dagelijks)
Performance Tip Gebruik If-Modified-Since headers en implementeer client-side caching voor de beste performance.

Geen resultaten gevonden

Probeer andere zoektermen of gebruik de snelle links in de sidebar.

Laatste artikelen

Tips, inzichten en updates over SEO, AI en online groei.

Sicco Bel mij terug

We bellen je terug om de groeikansen voor jouw bedrijf te bespreken.

Bedankt!

We bellen je zo snel mogelijk.