kortste.link

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.