Reseller API
Registreer, verhuis en beheer domeinnamen voor je eigen klanten, tegen wholesale-prijzen, vanuit je eigen systeem. De opbouw volgt gangbare registrar-API's: REST, JSON, vaste foutcodes.
Authenticatie
Stuur bij elk verzoek je sleutel mee als Bearer-token. Een sleutel zie je één keer bij het aanmaken; bewaar hem veilig. Je kunt per sleutel een IP-whitelist instellen (aanbevolen) en een sleutel op elk moment intrekken.
curl https://api.knippin.eu/v1/user/permissions \
-H "Authorization: Bearer kn_live_xxxxxxxx_…" \
-H "Accept: application/json"
Verzoeken met een body stuur je als JSON (Content-Type: application/json). Maximaal 120 verzoeken per minuut per sleutel; daarboven krijg je HTTP 429.
Live en test
https://api.knippin.eu/v1Sleutels
kn_live_…. Echte registraties, kosten worden verrekend.https://api-test.knippin.eu/v1Sleutels
kn_test_…. Registraties gaan naar een testregistry, zonder kosten. Testdomeinen zijn alleen via de test-API zichtbaar.De beschikbaarheidscheck geeft ook in de testomgeving actuele gegevens.
Kosten en saldo
Alle bedragen zijn in euro, exclusief btw. Je prijzen haal je op met /tlds/pricing. Hoe je betaalt, staat per account ingesteld:
- Prepaid: je waardeert je tegoed op via /finance/deposits (factuur met betaallink). Elke actie wordt direct van je tegoed afgeschreven. Bij onvoldoende tegoed krijg je HTTP 402 en wordt er niets uitgevoerd.
- Achteraf: je afname komt op een maandelijkse verzamelfactuur, eventueel met een kredietlimiet.
Domeinen met auto_renewal worden op de vervaldatum automatisch verlengd en dan verrekend. Wil je een domein niet verlengen, zet auto_renewal dan tijdig uit of hef het domein op. Een mislukte verhuizing wordt automatisch teruggeboekt.
Fouten
Bij een fout krijg je een HTTP-status van 400 of hoger en een lijst fouten:
{
"errors": [
{ "error": "VA-PR01", "parameter": "period", "message": "Invalid parameter", "details": "The selected period is invalid." }
]
}
| HTTP | Code | Betekenis |
|---|---|---|
| 400 | VA-PR01 | Ongeldige parameter; parameter noemt het veld, details de reden. |
| 401 | AU-KY01 | Ontbrekende of ongeldige API-sleutel. |
| 402 | FN-BL01 | Onvoldoende saldo of kredietlimiet bereikt. |
| 403 | AU-IP01 | Je IP-adres staat niet op de whitelist van de sleutel. |
| 403 | AU-KY02 / AU-KY03 | Livesleutel op de testomgeving of andersom. |
| 403 | AU-RS01 | Je account is (nog) niet vrijgegeven voor de API. |
| 400 | DN-EX01 | Het domein staat al in ons systeem. |
| 400 | DN-TL01 / DN-PR01 | Extensie niet beschikbaar of geen prijs bekend. |
| 400 | CT-HL01 / CT-HL02 | Ongeldige of al bestaande handle. |
| 400 | CT-IU01 | Contact is nog aan een domein gekoppeld. |
| 404 | GN-NF01, DN-NF01, CT-NF01, TR-NF01 | Niet gevonden (of niet van jou). |
| 429 | GN-RL01 | Meer dan 120 verzoeken per minuut. |
| 400/502 | RG-ER01 en registry-codes | De registry weigerde de actie; de code van de registry wordt doorgegeven. |
| 500 | GN-SY01 | Onverwachte fout aan onze kant. |
Lijsten zijn gepagineerd met page en per_page en bevatten een pagination-object (current_page, per_page, total_pages, total_results).
Account en saldo
Gegevens van je sleutel, je saldo en alle afname. Bedragen zijn in euro, exclusief btw.
Sleutel en rechten
Geeft je account, de gebruikte sleutel (omgeving, IP-whitelist) en de rechten terug. Handig om je koppeling te testen.
curl -X GET https://api.knippin.eu/v1/user/permissions \
-H "Authorization: Bearer $KEY"
{
"account": {
"customer_id": 1042,
"name": "Voorbeeld Hosting B.V.",
"billing": "prepaid",
"price_group": "Reseller Brons"
},
"key": {
"name": "Productie",
"prefix": "a1b2c3d4",
"environment": "live",
"allowed_ips": [
"203.0.113.10"
],
"created_at": "2026-11-03T10:00:00+01:00"
},
"permissions": {
"domains": [
"read",
"register",
"renew",
"transfer",
"delete",
"restore",
"update"
],
"contacts": [
"read",
"create",
"delete"
],
"finance": [
"read",
"deposit"
]
}
}
Saldo
Prepaid: je tegoed. Achteraf betalen: de nog niet gefactureerde afname (negatief) en wat er binnen je kredietlimiet nog beschikbaar is (null = geen limiet).
curl -X GET https://api.knippin.eu/v1/finance/balance \
-H "Authorization: Bearer $KEY"
{
"currency": "EUR",
"billing": "prepaid",
"vat_included": false,
"balance": "184.50",
"available": "184.50",
"credit_limit": null,
"pending_deposits": "0.00",
"sandbox": false
}
Transacties
Alle afname en opwaarderingen, nieuwste eerst. Filter optioneel op type (registration, renewal, transfer, restore, trade, deposit, refund, correction) of object (domeinnaam).
page |
integer | Pagina, standaard 1. |
per_page |
integer | Resultaten per pagina, 1-100 (standaard 25). |
type |
string | Filter op soort. |
object |
string | Filter op domeinnaam. |
curl -X GET https://api.knippin.eu/v1/finance/transactions \
-H "Authorization: Bearer $KEY"
{
"data": [
{
"id": 311,
"type": "registration",
"description": "Registratie",
"object": "voorbeeld.nl",
"amount": "-4.95",
"period": 12,
"status": "booked",
"invoice": null,
"created_at": "2026-11-03T10:12:00+01:00"
}
],
"pagination": {
"current_page": 1,
"per_page": 25,
"total_pages": 1,
"total_results": 1
}
}
Tegoed opwaarderen
Alleen voor prepaid. Maakt een factuur (bedrag + btw) en geeft een betaallink. Zodra de factuur betaald is, staat het tegoed op je saldo.
amount verplicht |
number | Bedrag excl. btw, minimaal 25. |
curl -X POST https://api.knippin.eu/v1/finance/deposits \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"amount":250}'
{
"invoice": "F2026-0412",
"amount": "250.00",
"amount_incl_vat": "302.50",
"status": "pending",
"payment_url": "https://mijn.knippin.eu/betalen/…"
}
Extensies en prijzen
Jouw wholesale-prijzen per extensie (per jaar, excl. btw) en de technische eigenschappen van een extensie.
Prijslijst
Jouw prijzen voor registratie, verlenging en verhuizing. Zonder filter krijg je alle extensies (gepagineerd).
page |
integer | Pagina, standaard 1. |
per_page |
integer | Resultaten per pagina, 1-100 (standaard 25). |
tld |
string | Kommagescheiden, bv. nl,com,eu. |
curl -X GET https://api.knippin.eu/v1/tlds/pricing \
-H "Authorization: Bearer $KEY"
{
"data": [
{
"tld": "nl",
"currency": "EUR",
"vat_included": false,
"pricing_standard": [
{
"period": 12,
"register": "4.95",
"renew": "4.95",
"transfer": "4.95"
}
]
}
],
"pagination": {
"current_page": 1,
"per_page": 25,
"total_pages": 1,
"total_results": 1
}
}
Eigenschappen extensie
Ondersteunde periodes, IDN, DNSSEC en het aantal nameservers.
curl -X GET https://api.knippin.eu/v1/tlds/info/{tld} \
-H "Authorization: Bearer $KEY"
{
"tld": "nl",
"category": "country",
"continent": "europe",
"country_code": "NL",
"syntax_idn_supported": true,
"dnssec_supported": true,
"periods_create_months": [
12
],
"periods_renew_months": [
12
],
"nameservers_min": 2,
"nameservers_max": 13
}
Beschikbaarheid
Controleer tot 50 domeinnamen tegelijk. Werkt ook met een testsleutel (altijd actuele gegevens).
Beschikbaarheid controleren
status is free, active of een andere registry-status. Premiumdomeinen hebben geen vaste prijs en kunnen niet via de API geregistreerd worden.
domain_names verplicht |
array | Lijst domeinnamen (max. 50). |
curl -X POST https://api.knippin.eu/v1/domain-availability \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"domain_names":["voorbeeld.nl","voorbeeld.com"]}'
{
"data": [
{
"domain_name": "voorbeeld.nl",
"status": "free",
"premium": false,
"price_register": "4.95",
"price_transfer": "4.95",
"currency": "EUR"
}
]
}
Domeinen
Registreren, verlengen, opheffen en beheren. Kosten worden direct van je saldo afgeschreven (of op je maandfactuur gezet); bij onvoldoende saldo krijg je HTTP 402 en gebeurt er niets.
Domeinen in je portfolio
Alle domeinen die je via de API beheert.
page |
integer | Pagina, standaard 1. |
per_page |
integer | Resultaten per pagina, 1-100 (standaard 25). |
status |
string | registered of deleted. |
search |
string | Deel van de domeinnaam. |
expires_before |
date | Alleen domeinen die vóór deze datum (YYYY-MM-DD) verlopen. |
curl -X GET https://api.knippin.eu/v1/domains \
-H "Authorization: Bearer $KEY"
{
"data": [
{
"domain_name": "voorbeeld.nl",
"status": "registered",
"registrant": "klant-001",
"contacts": [
{
"type": "admin",
"handle": "klant-001"
},
{
"type": "tech",
"handle": "mijn-tech"
},
{
"type": "billing",
"handle": "klant-001"
}
],
"dns_hosted": false,
"nameservers": [
"ns1.mijnhosting.nl",
"ns2.mijnhosting.nl"
],
"auto_renewal": true,
"registered_at": "2026-11-03",
"expires_at": "2027-11-03",
"paid_until": "2027-11-03"
}
],
"pagination": {
"current_page": 1,
"per_page": 25,
"total_pages": 1,
"total_results": 1
}
}
Domeingegevens
Gegevens van één domein uit je portfolio.
curl -X GET https://api.knippin.eu/v1/domains/{domain} \
-H "Authorization: Bearer $KEY"
{
"domain_name": "voorbeeld.nl",
"status": "registered",
"registrant": "klant-001",
"contacts": [
{
"type": "admin",
"handle": "klant-001"
},
{
"type": "tech",
"handle": "mijn-tech"
},
{
"type": "billing",
"handle": "klant-001"
}
],
"dns_hosted": false,
"nameservers": [
"ns1.mijnhosting.nl",
"ns2.mijnhosting.nl"
],
"auto_renewal": true,
"registered_at": "2026-11-03",
"expires_at": "2027-11-03",
"paid_until": "2027-11-03"
}
Domein registreren
Registreert het domein. Het antwoord bevat ook het afgeschreven bedrag (charged).
registrant verplicht |
string | Handle van de houder (eerst aanmaken via /contacts). |
contacts |
array | Lijst {type, handle} voor admin, tech en billing. Ontbrekende rollen krijgen de houder. |
nameservers |
array | 2 tot 13 hostnamen. Leeg = DNS bij ons (dns_hosted). |
auto_renewal |
boolean | Automatisch verlengen, standaard true (voor .nl verplicht). |
period |
integer | Periode in maanden (12, 24, … 120), standaard 12. |
curl -X POST https://api.knippin.eu/v1/domains/{domain} \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"registrant":"klant-001","contacts":[{"type":"tech","handle":"mijn-tech"}],"nameservers":["ns1.mijnhosting.nl","ns2.mijnhosting.nl"],"period":12}'
{
"domain_name": "voorbeeld.nl",
"status": "registered",
"registrant": "klant-001",
"contacts": [
{
"type": "admin",
"handle": "klant-001"
},
{
"type": "tech",
"handle": "mijn-tech"
},
{
"type": "billing",
"handle": "klant-001"
}
],
"dns_hosted": false,
"nameservers": [
"ns1.mijnhosting.nl",
"ns2.mijnhosting.nl"
],
"auto_renewal": true,
"registered_at": "2026-11-03",
"expires_at": "2027-11-03",
"paid_until": "2027-11-03",
"charged": "4.95"
}
Verlengen
Verlengt het domein extra. Domeinen met auto_renewal worden ook automatisch verlengd; die verlenging wordt op de vervaldatum verrekend.
period verplicht |
integer | Periode in maanden (12, 24, …). |
curl -X POST https://api.knippin.eu/v1/domains/{domain}/renew \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"period":12}'
{
"domain_name": "voorbeeld.nl",
"status": "registered",
"registrant": "klant-001",
"contacts": [
{
"type": "admin",
"handle": "klant-001"
},
{
"type": "tech",
"handle": "mijn-tech"
},
{
"type": "billing",
"handle": "klant-001"
}
],
"dns_hosted": false,
"nameservers": [
"ns1.mijnhosting.nl",
"ns2.mijnhosting.nl"
],
"auto_renewal": true,
"registered_at": "2026-11-03",
"expires_at": "2027-11-03",
"paid_until": "2027-11-03",
"charged": "4.95"
}
Opheffen
Heft het domein op. Het gaat bij de registry in quarantaine en kan daar nog worden hersteld. Er volgt geen terugbetaling.
curl -X DELETE https://api.knippin.eu/v1/domains/{domain} \
-H "Authorization: Bearer $KEY"
204 No Content
Herstellen uit quarantaine
Herstelt een opgeheven domein. Kosten: verlengprijs plus eventuele hersteltoeslag.
curl -X POST https://api.knippin.eu/v1/domains/{domain}/restore \
-H "Authorization: Bearer $KEY"
{
"domain_name": "voorbeeld.nl",
"status": "registered",
"registrant": "klant-001",
"contacts": [
{
"type": "admin",
"handle": "klant-001"
},
{
"type": "tech",
"handle": "mijn-tech"
},
{
"type": "billing",
"handle": "klant-001"
}
],
"dns_hosted": false,
"nameservers": [
"ns1.mijnhosting.nl",
"ns2.mijnhosting.nl"
],
"auto_renewal": true,
"registered_at": "2026-11-03",
"expires_at": "2027-11-03",
"paid_until": "2027-11-03",
"charged": "4.95"
}
Automatisch verlengen
Zet automatisch verlengen aan of uit. Uit = het domein vervalt op de vervaldatum.
auto_renewal verplicht |
boolean | true of false. |
curl -X PATCH https://api.knippin.eu/v1/domains/{domain}/auto_renewal \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"auto_renewal":false}'
{
"domain_name": "voorbeeld.nl",
"status": "registered",
"registrant": "klant-001",
"contacts": [
{
"type": "admin",
"handle": "klant-001"
},
{
"type": "tech",
"handle": "mijn-tech"
},
{
"type": "billing",
"handle": "klant-001"
}
],
"dns_hosted": false,
"nameservers": [
"ns1.mijnhosting.nl",
"ns2.mijnhosting.nl"
],
"auto_renewal": true,
"registered_at": "2026-11-03",
"expires_at": "2027-11-03",
"paid_until": "2027-11-03"
}
Verhuiscode opvragen
Geeft de auth-/EPP-code. Bij sommige extensies stuurt de registry de code rechtstreeks naar de houder (sent_to_registrant = true).
curl -X POST https://api.knippin.eu/v1/domains/{domain}/auth_code \
-H "Authorization: Bearer $KEY"
{
"domain_name": "voorbeeld.nl",
"auth_code": "Xk7-p2Qa-9fRt",
"expiry": "2026-11-10",
"sent_to_registrant": false
}
Contacten wijzigen
Wijzigt admin-, tech- en/of billing-contact. De houder wijzig je met /trade.
contacts verplicht |
array | Lijst {type, handle}; type is admin, tech of billing. |
curl -X PUT https://api.knippin.eu/v1/domains/{domain}/contacts \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"contacts":[{"type":"tech","handle":"mijn-tech"}]}'
{
"domain_name": "voorbeeld.nl",
"status": "registered",
"registrant": "klant-001",
"contacts": [
{
"type": "admin",
"handle": "klant-001"
},
{
"type": "tech",
"handle": "mijn-tech"
},
{
"type": "billing",
"handle": "klant-001"
}
],
"dns_hosted": false,
"nameservers": [
"ns1.mijnhosting.nl",
"ns2.mijnhosting.nl"
],
"auto_renewal": true,
"registered_at": "2026-11-03",
"expires_at": "2027-11-03",
"paid_until": "2027-11-03"
}
Houderwijziging
Zet het domein op een andere houder.
registrant verplicht |
string | Handle van de nieuwe houder. |
auth_code |
string | Verplicht bij sommige extensies. |
curl -X PUT https://api.knippin.eu/v1/domains/{domain}/trade \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"registrant":"nieuwe-houder"}'
{
"domain_name": "voorbeeld.nl",
"status": "registered",
"registrant": "klant-001",
"contacts": [
{
"type": "admin",
"handle": "klant-001"
},
{
"type": "tech",
"handle": "mijn-tech"
},
{
"type": "billing",
"handle": "klant-001"
}
],
"dns_hosted": false,
"nameservers": [
"ns1.mijnhosting.nl",
"ns2.mijnhosting.nl"
],
"auto_renewal": true,
"registered_at": "2026-11-03",
"expires_at": "2027-11-03",
"paid_until": "2027-11-03"
}
Nameservers wijzigen
Eigen nameservers instellen, of dns_hosted: true voor DNS bij ons.
nameservers |
array | 2 tot 13 hostnamen. |
dns_hosted |
boolean | true = DNS bij ons (in plaats van nameservers). |
curl -X PATCH https://api.knippin.eu/v1/domains/{domain}/ns \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"nameservers":["ns1.mijnhosting.nl","ns2.mijnhosting.nl"]}'
{
"domain_name": "voorbeeld.nl",
"status": "registered",
"registrant": "klant-001",
"contacts": [
{
"type": "admin",
"handle": "klant-001"
},
{
"type": "tech",
"handle": "mijn-tech"
},
{
"type": "billing",
"handle": "klant-001"
}
],
"dns_hosted": false,
"nameservers": [
"ns1.mijnhosting.nl",
"ns2.mijnhosting.nl"
],
"auto_renewal": true,
"registered_at": "2026-11-03",
"expires_at": "2027-11-03",
"paid_until": "2027-11-03"
}
Contacten
Houders en contactpersonen. Je kiest zelf de handle (5-20 tekens: letters, cijfers en streepjes); daarmee verwijs je ernaar bij registraties.
Contacten
Al je contacten.
page |
integer | Pagina, standaard 1. |
per_page |
integer | Resultaten per pagina, 1-100 (standaard 25). |
search |
string | Zoek op naam, bedrijf, e-mail of handle. |
curl -X GET https://api.knippin.eu/v1/contacts \
-H "Authorization: Bearer $KEY"
{
"data": [
{
"handle": "klant-001",
"name": "Jan Jansen",
"company_name": "Jansen B.V.",
"address_1": "Dorpsstraat 1",
"address_2": null,
"postal_code": "1234 AB",
"city": "Amsterdam",
"state": null,
"country": "NL",
"phone": "+31.201234567",
"email": "jan@jansen.nl",
"created_at": "2026-11-03T10:00:00+01:00"
}
],
"pagination": {
"current_page": 1,
"per_page": 25,
"total_pages": 1,
"total_results": 1
}
}
Contactgegevens
Eén contact.
curl -X GET https://api.knippin.eu/v1/contacts/{handle} \
-H "Authorization: Bearer $KEY"
Zie de lijst/het object hierboven.
Contact aanmaken
Maakt het contact aan onder de gekozen handle. Een contact wijzigen kan niet: maak een nieuw contact aan en koppel dat.
name verplicht |
string | Volledige naam van de contactpersoon. |
company_name |
string | Bedrijfsnaam (leeg voor particulieren). |
address_1 verplicht |
string | Straat en huisnummer. |
address_2 |
string | Tweede adresregel. |
postal_code verplicht |
string | Postcode. |
city verplicht |
string | Plaats. |
state |
string | Provincie/staat. |
country verplicht |
string | Landcode ISO 3166-1 alpha-2, bv. NL. |
phone verplicht |
string | Telefoon als +CC.NUMMER, bv. +31.201234567. |
email verplicht |
string | E-mailadres. |
curl -X POST https://api.knippin.eu/v1/contacts/{handle} \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Jan Jansen","company_name":"Jansen B.V.","address_1":"Dorpsstraat 1","postal_code":"1234 AB","city":"Amsterdam","country":"NL","phone":"+31.201234567","email":"jan@jansen.nl"}'
Zie de lijst/het object hierboven.
Contact verwijderen
Alleen als het contact niet meer aan een domein gekoppeld is.
curl -X DELETE https://api.knippin.eu/v1/contacts/{handle} \
-H "Authorization: Bearer $KEY"
204 No Content
Registry-gegevens
Extra gegevens die een registry vraagt, bv. voor SIDN (.nl) de rechtsvorm van een bedrijf: registry = sidn.
legal_form |
string | Bv. BV, EENMANSZAAK, PERSOON. |
legal_form_regno |
string | KvK-nummer. |
curl -X POST https://api.knippin.eu/v1/contacts/{handle}/tlddata/{registry} \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"legal_form":"BV","legal_form_regno":"12345678"}'
Zie de lijst/het object hierboven.
Verhuizingen
Een domein van een andere registrar naar jouw portfolio verhuizen. De verhuisprijs wordt bij de aanvraag afgeschreven en teruggeboekt als de verhuizing mislukt. Na afronding staat het domein in /domains.
Verhuizing aanvragen
Start de verhuizing.
auth_code verplicht |
string | Verhuiscode van de huidige registrar. |
registrant verplicht |
string | Handle van de houder (eerst aanmaken via /contacts). |
contacts |
array | Lijst {type, handle} voor admin, tech en billing. Ontbrekende rollen krijgen de houder. |
nameservers |
array | 2 tot 13 hostnamen. Leeg = DNS bij ons (dns_hosted). |
auto_renewal |
boolean | Automatisch verlengen, standaard true (voor .nl verplicht). |
curl -X POST https://api.knippin.eu/v1/transfers/{domain} \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"auth_code":"Xk7-p2Qa-9fRt","registrant":"klant-001"}'
{
"id": 18,
"domain_name": "voorbeeld.com",
"status": "pending",
"message": null,
"created_at": "2026-11-03T10:20:00+01:00",
"completed_at": null,
"charged": "8.95"
}
Verhuizingen
Al je verhuizingen.
page |
integer | Pagina, standaard 1. |
per_page |
integer | Resultaten per pagina, 1-100 (standaard 25). |
status |
string | pending, completed of failed. |
curl -X GET https://api.knippin.eu/v1/transfers \
-H "Authorization: Bearer $KEY"
Zie de lijst/het object hierboven.
Status verhuizing
Haalt de actuele status op bij de registry (id is optioneel: zonder id de laatste aanvraag).
curl -X GET https://api.knippin.eu/v1/transfers/{domain}/{id} \
-H "Authorization: Bearer $KEY"
{
"id": 18,
"domain_name": "voorbeeld.com",
"status": "completed",
"message": null,
"created_at": "2026-11-03T10:20:00+01:00",
"completed_at": "2026-11-08T03:00:00+01:00"
}
Knippin ICT · Reseller API v1 · Vragen? Mail info@knippin.eu.
