API
Een JSON-API. Lezen is open, aanmaken vraagt een sleutel.
Basis
Alle endpoints staan op api.kortste.link. De redirect is de uitzondering: die staat op het korte domein, want dat is precies waar hij voor is.
Een sleutel krijgen
Een link aanmaken vraagt een sleutel. Opvragen, een redirect volgen en misbruik melden niet.
Er is geen aanmeldformulier en geen dashboard, want er zijn geen accounts — niet voor deze API en niet voor de dienst. Mail keys@kortste.link met één regel over wat je bouwt, dan krijg je er met de hand een toegestuurd.
Een nieuwe sleutel mag vijf keer per minuut en vijftig keer per dag aanmaken. Met opzet klein: deze API is welwillendheid en geen product, en iemand betaalt hem uit eigen zak. Vraag het via de steunlink onderaan deze pagina, dan gaat de limiet omhoog.
Stuur hem mee als header, nooit in een query string. Query strings komen terecht in serverlogs, browsergeschiedenis en referrer-headers, en dat is een slechte plek om een sleutel te laten liggen — zeker bij een linkverkorter.
Authorization: Bearer kl_live_...
De sleutel is één keer te zien, bij uitgifte, en we bewaren alleen de hash. Niemand kan hem nog een keer sturen, dus een kwijtgeraakte sleutel wordt ingetrokken en vervangen, niet teruggehaald. Mail hetzelfde adres om er een te laten intrekken: hij stopt bij het volgende verzoek.
Endpoints
POST
/v1/links
Maak een korte link
sleutel
curl -X POST https://api.kortste.link/v1/links \
-H 'Authorization: Bearer kl_live_...' \
-H 'Content-Type: application/json' \
-d '{"url":"https://seznam.cz/m/sem/1345"}'
{
"code": "fp9qm3",
"shortUrl": "https://kortste.link/fp9qm3",
"url": "https://seznam.cz/m/sem/1345",
"createdAt": "2026-08-22T18:49:11.665Z"
}
- 201
- Aangemaakt. Het antwoord bevat code, shortUrl, url en createdAt.
- 400
- De body is geen geldige JSON.
- 401
- Geen sleutel, of een onbekende of ingetrokken sleutel.
- 422
- De URL is geweigerd. Het detail-veld zegt waarom.
- 429
- Over de limiet van deze sleutel. Retry-After zegt hoe lang.
GET
/v1/links/{code}
Bekijk een link zonder hem te openen
Laat zien waar een code naartoe wijst zonder er naartoe te gaan. Dat is een veiligheidsfunctie en geen vergissing: daarom vraagt hij ook geen sleutel.
curl https://api.kortste.link/v1/links/fp9qm3
- 200
- Dezelfde velden als bij aanmaken.
- 404
- Deze code bestaat niet.
- 410
- De link is offline gehaald.
GET
/{code}
De redirect zelf
curl -i https://kortste.link/fp9qm3
Met opzet 302 en niet 301: een permanente redirect blijft min of meer voor altijd in browsers hangen, en dan is een link niet meer terug te draaien.
- 302
- De Location-header bevat de bestemming.
- 404
- Deze code bestaat niet.
- 410
- De link is offline gehaald.
POST
/v1/abuse
Meld een link
Geen sleutel, met opzet. Wie een phishinglink meldt is juist degene die er het minst waarschijnlijk een heeft, en een sleutel tussen ons en die melding is een slechtere ruil dan het misbruik dat hij tegenhoudt.
curl -X POST https://api.kortste.link/v1/abuse \
-H 'Content-Type: application/json' \
-d '{"code":"fp9qm3","reason":"phishing"}'
- 202
- Ontvangen. Een mens leest het; melden alleen haalt niets weg.
- 422
- Onbekende code, of geen reden opgegeven.
GET
/healthz
Statuscheck
curl https://api.kortste.link/healthz
- 200
- Het antwoord is het woord ok.
Fouten
Fouten volgen RFC 9457 en komen terug als application/problem+json met type, title, status en detail. Eén vorm voor elke fout, dus een client schrijft één foutafhandeling.
Een ontbrekende sleutel, een verkeerd gevormde, een onbekende en een ingetrokken geven alle vier hetzelfde 401-antwoord. Met opzet: elk verschil ertussen maakt dit endpoint een orakel om af te tasten welke sleutels bestaan.
Limieten
Aanmaken via de API wordt per sleutel begrensd, dus twee gebruikers delen nooit één limiet en geen sleutel krijgt een nieuwe door van adres te wisselen. Het formulier op de voorpagina heeft geen sleutel en wordt per adres begrensd. Redirects worden nooit begrensd: dat zou de dienst zelf afknijpen.