KVK API met C# en .NET: Bedrijfsgegevens Ophalen in je .NET Applicatie
Integreer de KVKBase API in je C# of .NET project. Codevoorbeelden voor HttpClient, dependency injection, foutafhandeling en caching — klaar voor productie.
C# en .NET zijn de standaard voor enterprise-softwareontwikkeling in Nederland. Van grootschalige ERP-systemen tot moderne SaaS-platforms en microservices — .NET zit overal. Als je in zo’n omgeving werkt en Nederlandse bedrijfsgegevens nodig hebt, laten we in deze gids zien hoe je de KVK API van KVKBase clean integreert in je C#-project met moderne .NET-patronen.
Vereisten
- .NET 8 of hoger (LTS)
- Een API-sleutel van KVKBase
In deze gids gebruiken we geen externe SDK — de KVKBase API werkt met standaard HTTP en geeft nette JSON terug. System.Net.Http.HttpClient en System.Text.Json zijn alles wat je nodig hebt.
Stap 1: Configuratie
Voeg je API-sleutel toe aan appsettings.json. Hardcode hem nooit rechtstreeks in je code.
{
"KVKBase": {
"ApiKey": "",
"BaseUrl": "https://api.kvkbase.nl/api/v1"
}
}
Maak daarna een strongly-typed options-klasse:
// KVKBaseOptions.cs
public class KVKBaseOptions
{
public const string SectionName = "KVKBase";
public string ApiKey { get; set; } = string.Empty;
public string BaseUrl { get; set; } = "https://api.kvkbase.nl/api/v1";
}
Registreer de opties in Program.cs:
builder.Services.Configure<KVKBaseOptions>(
builder.Configuration.GetSection(KVKBaseOptions.SectionName));
Stap 2: Response Models
Definieer C#-klassen die overeenkomen met de JSON-response van de API. Zo profiteer je van volledige type-veiligheid en IDE-autocomplete:
// Models/KvkBedrijf.cs
using System.Text.Json.Serialization;
public class KvkBedrijf
{
[JsonPropertyName("kvkNummer")]
public string KvkNummer { get; set; } = string.Empty;
[JsonPropertyName("naam")]
public string Naam { get; set; } = string.Empty;
[JsonPropertyName("rechtsvorm")]
public string Rechtsvorm { get; set; } = string.Empty;
[JsonPropertyName("actief")]
public bool Actief { get; set; }
[JsonPropertyName("adres")]
public KvkAdres? Adres { get; set; }
[JsonPropertyName("btwNummer")]
public string? BtwNummer { get; set; }
[JsonPropertyName("sbiCodes")]
public List<SbiCode> SbiCodes { get; set; } = [];
}
public class KvkAdres
{
[JsonPropertyName("straat")]
public string Straat { get; set; } = string.Empty;
[JsonPropertyName("huisnummer")]
public string Huisnummer { get; set; } = string.Empty;
[JsonPropertyName("postcode")]
public string Postcode { get; set; } = string.Empty;
[JsonPropertyName("plaats")]
public string Plaats { get; set; } = string.Empty;
}
public class SbiCode
{
[JsonPropertyName("code")]
public string Code { get; set; } = string.Empty;
[JsonPropertyName("omschrijving")]
public string Omschrijving { get; set; } = string.Empty;
}
Stap 3: HttpClient Registreren met Named Client
De aanbevolen manier in .NET is een typed of named HttpClient via IHttpClientFactory:
// Program.cs
builder.Services.AddHttpClient("KVKBase", (sp, client) =>
{
var options = sp.GetRequiredService<IOptions<KVKBaseOptions>>().Value;
client.BaseAddress = new Uri(options.BaseUrl);
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {options.ApiKey}");
client.Timeout = TimeSpan.FromSeconds(10);
});
Stap 4: KVKBase Service
Maak een service-klasse met dependency injection. Dit houdt je controllers en handlers clean:
// Services/KvkBaseService.cs
using System.Net.Http.Json;
using System.Text.Json;
using Microsoft.Extensions.Options;
public interface IKvkBaseService
{
Task<KvkBedrijf?> GetBedrijfAsync(string kvkNummer, CancellationToken ct = default);
Task<List<KvkBedrijf>> ZoekBedrijvenAsync(string query, CancellationToken ct = default);
}
public class KvkBaseService : IKvkBaseService
{
private readonly HttpClient _http;
private readonly ILogger<KvkBaseService> _logger;
public KvkBaseService(IHttpClientFactory factory, ILogger<KvkBaseService> logger)
{
_http = factory.CreateClient("KVKBase");
_logger = logger;
}
public async Task<KvkBedrijf?> GetBedrijfAsync(string kvkNummer, CancellationToken ct = default)
{
try
{
var response = await _http.GetAsync($"/api/v1/lookup/{kvkNummer}", ct);
response.EnsureSuccessStatusCode();
return await response.Content.ReadFromJsonAsync<KvkBedrijf>(cancellationToken: ct);
}
catch (HttpRequestException ex) when (ex.StatusCode == System.Net.HttpStatusCode.NotFound)
{
_logger.LogWarning("KVK nummer {KvkNummer} niet gevonden", kvkNummer);
return null;
}
catch (Exception ex)
{
_logger.LogError(ex, "Fout bij ophalen bedrijfsgegevens voor {KvkNummer}", kvkNummer);
throw;
}
}
public async Task<List<KvkBedrijf>> ZoekBedrijvenAsync(string query, CancellationToken ct = default)
{
var url = $"/api/v1/search?q={Uri.EscapeDataString(query)}";
var response = await _http.GetAsync(url, ct);
response.EnsureSuccessStatusCode();
var resultaat = await response.Content.ReadFromJsonAsync<KvkZoekResultaat>(cancellationToken: ct);
return resultaat?.Items ?? [];
}
}
public class KvkZoekResultaat
{
[System.Text.Json.Serialization.JsonPropertyName("items")]
public List<KvkBedrijf> Items { get; set; } = [];
}
Registreer de service in Program.cs:
builder.Services.AddScoped<IKvkBaseService, KvkBaseService>();
Stap 5: Gebruik in een Controller
Zo gebruik je de service in een Minimal API endpoint of MVC controller:
// Minimal API voorbeeld
app.MapGet("/api/bedrijf/{kvkNummer}", async (
string kvkNummer,
IKvkBaseService kvkService,
CancellationToken ct) =>
{
var bedrijf = await kvkService.GetBedrijfAsync(kvkNummer, ct);
return bedrijf is null ? Results.NotFound() : Results.Ok(bedrijf);
})
.WithName("GetBedrijf")
.WithOpenApi();
Voor MVC-stijl:
[ApiController]
[Route("api/[controller]")]
public class BedrijfController : ControllerBase
{
private readonly IKvkBaseService _kvk;
public BedrijfController(IKvkBaseService kvk) => _kvk = kvk;
[HttpGet("{kvkNummer}")]
public async Task<ActionResult<KvkBedrijf>> Get(string kvkNummer, CancellationToken ct)
{
var bedrijf = await _kvk.GetBedrijfAsync(kvkNummer, ct);
return bedrijf is null ? NotFound() : Ok(bedrijf);
}
}
Caching met IMemoryCache
KVK-gegevens veranderen zelden. Voeg in-memory caching toe om API-kosten te besparen en latency te verlagen:
// Voeg caching toe aan KvkBaseService
public class KvkBaseService : IKvkBaseService
{
private readonly HttpClient _http;
private readonly IMemoryCache _cache;
private readonly ILogger<KvkBaseService> _logger;
private static readonly TimeSpan CacheDuur = TimeSpan.FromHours(24);
public KvkBaseService(IHttpClientFactory factory, IMemoryCache cache, ILogger<KvkBaseService> logger)
{
_http = factory.CreateClient("KVKBase");
_cache = cache;
_logger = logger;
}
public async Task<KvkBedrijf?> GetBedrijfAsync(string kvkNummer, CancellationToken ct = default)
{
var cacheKey = $"kvk:{kvkNummer}";
if (_cache.TryGetValue(cacheKey, out KvkBedrijf? cached))
return cached;
var bedrijf = await HaalOpVanApiAsync(kvkNummer, ct);
if (bedrijf is not null)
_cache.Set(cacheKey, bedrijf, CacheDuur);
return bedrijf;
}
private async Task<KvkBedrijf?> HaalOpVanApiAsync(string kvkNummer, CancellationToken ct)
{
try
{
var response = await _http.GetAsync($"/api/v1/lookup/{kvkNummer}", ct);
response.EnsureSuccessStatusCode();
return await response.Content.ReadFromJsonAsync<KvkBedrijf>(cancellationToken: ct);
}
catch (HttpRequestException ex) when (ex.StatusCode == System.Net.HttpStatusCode.NotFound)
{
_logger.LogWarning("KVK nummer {KvkNummer} niet gevonden", kvkNummer);
return null;
}
}
}
Registreer IMemoryCache in Program.cs:
builder.Services.AddMemoryCache();
BTW-nummer Valideren
KVKBase ondersteunt ook BTW-nummervalidatie via VIES. Zo doe je dat in C#:
public async Task<bool> ValideerBtwNummerAsync(string btwNummer, CancellationToken ct = default)
{
var response = await _http.GetAsync(
$"/api/v1/vat/validate/{Uri.EscapeDataString(btwNummer)}", ct);
if (!response.IsSuccessStatusCode)
return false;
var result = await response.Content.ReadFromJsonAsync<BtwValidatieResultaat>(cancellationToken: ct);
return result?.Geldig ?? false;
}
public class BtwValidatieResultaat
{
[System.Text.Json.Serialization.JsonPropertyName("valid")]
public bool Geldig { get; set; }
}
Veelgemaakte Fouten en Oplossingen
HttpClient direct instantiëren: Doe dit nooit via new HttpClient() in een service-klasse. Gebruik altijd IHttpClientFactory. Direct instantiëren leidt tot socket exhaustion onder load.
API-sleutel in source code: Gebruik altijd appsettings.json in combinatie met environment variables of Azure Key Vault. Nooit een API-sleutel hardcoden.
Geen timeout instellen: Een externe API kan traag reageren. Stel altijd een timeout in op je HttpClient (standaard: 100 seconden, veel te lang voor een lookup).
Geen cancellation token doorgeven: In ASP.NET Core heb je altijd een CancellationToken via de request scope. Geef hem door — zo annuleer je automatisch lopende HTTP-calls als de client de verbinding verbreekt.
Volgende Stappen
Nu je de KVKBase API geïntegreerd hebt, zijn er meer mogelijkheden:
- KVK-nummers valideren — leer hoe het elfproef-algoritme werkt
- Batch-verrijking van CRM-data — loop door duizenden bedrijven en verrijk je database
- BTW-nummer validatie via VIES — volledige gids voor Europese BTW-validatie
Vraag een gratis API-sleutel aan op kvkbase.nl en ga meteen aan de slag.