KVK API met PHP en Laravel: Bedrijfsgegevens Ophalen in je Webshop of SaaS
KVKBase Team

KVK API met PHP en Laravel: Bedrijfsgegevens Ophalen in je Webshop of SaaS

Integreer de KVKBase API in je PHP of Laravel project. Met codevoorbeelden voor Guzzle, WooCommerce en Laravel — inclusief formulier auto-fill en foutafhandeling.

kvkapiphplaravelwoocommercedevelopers

PHP is nog steeds de ruggengraat van het web. Van WordPress-plugins tot Laravel SaaS-platforms en WooCommerce-webshops, miljoenen Nederlandse developers werken dagelijks met PHP. Als je zakelijke klanten hebt die hun bedrijfsgegevens willen invoeren, is de KVKBase API de snelste manier om dat proces te automatiseren. In deze gids laten we je zien hoe je de KVK API integreert in je PHP of Laravel project.

Waarom PHP voor KVK-integraties?

PHP domineert het CMS- en e-commerce landschap. Meer dan 70% van alle websites draait op PHP, en een groot deel daarvan is WooCommerce of een custom Laravel-applicatie. Voor B2B webshops en SaaS-platforms is automatisch invullen van bedrijfsgegevens een enorme tijdsbesparing voor zakelijke klanten. Met KVKBase heb je met één API-call toegang tot bedrijfsnaam, adres, rechtsvorm en meer.

Installatie

Voeg KVKBase toe aan je project via Composer, of gebruik de ingebouwde file_get_contents functie van PHP. We raden aan om Guzzle te gebruiken voor een betrouwbare HTTP-client:

composer require guzzlehttp/guzzle

Sla je API-key op als omgevingsvariabele. In Laravel gebruik je het .env bestand:

KVKBASE_API_KEY=jouw_api_key_hier

Haal je API-key op via het KVKBase dashboard.

Basisintegratie met PHP (zonder framework)

Hieronder staat een minimale implementatie met curl voor PHP-projecten zonder framework, zoals WordPress-plugins:

<?php

function kvkbase_zoek_bedrijf(string $kvkNummer): ?array {
    $apiKey = getenv('KVKBASE_API_KEY');
    $url    = "https://api.kvkbase.nl/api/v1/kvk/" . urlencode($kvkNummer);

    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER     => [
            "X-Api-Key: {$apiKey}",
            "Content-Type: application/json",
        ],
        CURLOPT_TIMEOUT        => 10,
    ]);

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($httpCode !== 200 || !$response) {
        return null;
    }

    $data = json_decode($response, true);
    return $data['succes'] ? $data['data'] : null;
}

Gebruik je WordPress? Voeg deze functie toe aan functions.php en roep hem aan via een REST endpoint of AJAX-handler.

Integratie met Laravel (Guzzle + Service Class)

In een Laravel-project maak je een nette service class aan. Zo blijft je code testbaar en gemakkelijk te mocken:

<?php

namespace App\Services;

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use Illuminate\Support\Facades\Cache;

class KvkBaseService
{
    protected Client $client;

    public function __construct()
    {
        $this->client = new Client([
            'base_uri' => 'https://api.kvkbase.nl/api/v1/',
            'timeout'  => 10,
            'headers'  => [
                'X-Api-Key'    => config('services.kvkbase.api_key'),
                'Content-Type' => 'application/json',
            ],
        ]);
    }

    public function zoekBedrijf(string $kvkNummer): ?array
    {
        // Cache resultaten voor 1 uur
        return Cache::remember("kvk:{$kvkNummer}", 3600, function () use ($kvkNummer) {
            try {
                $response = $this->client->get("kvk/{$kvkNummer}");
                $data     = json_decode($response->getBody(), true);
                return $data['succes'] ? $data['data'] : null;
            } catch (RequestException $e) {
                if ($e->hasResponse() && $e->getResponse()->getStatusCode() === 404) {
                    return null;
                }
                throw $e;
            }
        });
    }
}

Registreer de API-key in config/services.php:

'kvkbase' => [
    'api_key' => env('KVKBASE_API_KEY'),
],

Laravel Controller en Route

Maak een controller aan die de service gebruikt:

<?php

namespace App\Http\Controllers;

use App\Services\KvkBaseService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class BedrijfController extends Controller
{
    public function __construct(protected KvkBaseService $kvkBase) {}

    public function zoek(Request $request): JsonResponse
    {
        $request->validate([
            'kvk_nummer' => 'required|digits:8',
        ]);

        $bedrijf = $this->kvkBase->zoekBedrijf($request->kvk_nummer);

        if (!$bedrijf) {
            return response()->json(['fout' => 'Bedrijf niet gevonden'], 404);
        }

        return response()->json($bedrijf);
    }
}

Voeg de route toe in routes/api.php:

Route::get('/bedrijf/{kvkNummer}', [BedrijfController::class, 'zoek']);

Formulier auto-fill in Blade + Alpine.js

De meest waardevolle use case is het automatisch invullen van formuliervelden zodra een gebruiker zijn KVK-nummer invoert. Hier is een Blade-component met Alpine.js:

<div x-data="{
    kvkNummer: '',
    bedrijf: null,
    laden: false,
    async zoek() {
        if (this.kvkNummer.length !== 8) return;
        this.laden = true;
        const res = await fetch('/api/bedrijf/' + this.kvkNummer);
        if (res.ok) this.bedrijf = await res.json();
        this.laden = false;
    }
}">
    <input
        x-model="kvkNummer"
        @blur="zoek"
        type="text"
        name="kvk_nummer"
        placeholder="KVK-nummer (8 cijfers)"
        maxlength="8"
    />

    <span x-show="laden">Gegevens ophalen...</span>

    <template x-if="bedrijf">
        <div>
            <input name="bedrijfsnaam" :value="bedrijf.naam" readonly />
            <input name="straat" :value="bedrijf.adres.straat + ' ' + bedrijf.adres.huisnummer" readonly />
            <input name="postcode" :value="bedrijf.adres.postcode" readonly />
            <input name="stad" :value="bedrijf.adres.plaats" readonly />
        </div>
    </template>
</div>

Dit werkt zonder extra dependencies als Alpine.js al geladen is, wat het geval is in de meeste moderne Laravel-projecten met Livewire.

WooCommerce B2B checkout

Heb je een WooCommerce-webshop met zakelijke klanten? Voeg een KVK-veld toe aan de checkout en vul automatisch de factuurgegevens in:

<?php
// Voeg toe aan functions.php van je WooCommerce-thema

add_action('woocommerce_before_checkout_billing_form', function ($checkout) {
    woocommerce_form_field('billing_kvk', [
        'type'        => 'text',
        'class'       => ['form-row-wide'],
        'label'       => 'KVK-nummer',
        'placeholder' => '12345678',
        'required'    => false,
    ], $checkout->get_value('billing_kvk'));
});

add_action('woocommerce_checkout_update_order_meta', function ($order_id) {
    if (!empty($_POST['billing_kvk'])) {
        update_post_meta($order_id, '_billing_kvk', sanitize_text_field($_POST['billing_kvk']));
    }
});

Combineer dit met de JavaScript auto-fill hierboven en je zakelijke klanten hoeven nog maar één veld in te vullen bij de checkout.

KVK-nummer validatie

Valideer het KVK-nummer al server-side voordat je de API aanroept. Een geldig KVK-nummer bestaat altijd uit precies 8 cijfers. Meer over de validatieregels lees je in ons artikel over KVK nummer validatie en checksum.

function isGeldigKvkNummer(string $kvk): bool
{
    return (bool) preg_match('/^\d{8}$/', $kvk);
}

In Laravel heb je ook een handige validatieregel beschikbaar:

$request->validate([
    'kvk_nummer' => ['required', 'regex:/^\d{8}$/'],
]);

Caching in Laravel

KVK-gegevens veranderen zelden. Gebruik Laravel’s cache om onnodige API-calls te vermijden:

$bedrijf = Cache::remember("kvk:{$kvkNummer}", now()->addHours(6), function () use ($kvkNummer) {
    return $this->kvkBase->zoekBedrijf($kvkNummer);
});

Voor high-traffic sites gebruik je Redis als cache-driver. Dit versnelt je checkout aanzienlijk en verlaagt je API-kosten.

Volgende stappen

Met deze integratie heb je alles wat je nodig hebt om de KVKBase API te gebruiken in je PHP of Laravel project. Vanuit hier kun je verder gaan met:

Klaar om te starten? Maak een gratis account aan op kvkbase.nl en je hebt binnen een paar minuten toegang tot de API.