skracarka.

Dla programistów

API

Trzy punkty końcowe JSON: skracanie, sprawdzanie slugu i zgłoszenia. Do tego kod QR i strona statystyk. Bez kluczy i bez rejestracji.

Skracanie adresu

POST https://skracarka.com/api/shorten

Treść żądania jako JSON (Content-Type: application/json) albo zwykły formularz (application/x-www-form-urlencoded).

PoleWymaganeOpis
urltakAdres do skrócenia. Bez schematu dopisujemy https://. Tylko http i https, do 2048 bajtów po zakodowaniu procentowym (znak spoza ASCII zajmuje kilka bajtów).
slugnieWłasna końcówka: 3–32 znaki, litery, cyfry, - i _ (nie na początku ani końcu). Wielkość liter nie ma znaczenia przy sprawdzaniu zajętości.
expiresnieTermin ważności w dniach: 7, 30 albo 365. Pusty = bezterminowo.

Przykład

curl -X POST https://skracarka.com/api/shorten \
  -H "Content-Type: application/json" \
  -d '{
        "url":  "https://example.com/bardzo/dlugi/adres",
        "slug": "wrzesien",
        "expires": "30"
      }'

Odpowiedź 201 Created

{
  "ok": true,
  "slug": "wrzesien",
  "short_url": "https://skracarka.com/wrzesien",
  "target": "https://example.com/bardzo/dlugi/adres",
  "stats_url": "https://skracarka.com/wrzesien+",
  "qr_url": "https://skracarka.com/qr/wrzesien.svg",
  "created_at": "2026-09-06T10:15:00Z",
  "expires_at": "2026-10-06T10:15:00Z",
  "existing": false
}

Gdy ten sam adres był już skrócony bez własnego slugu i bez terminu, dostaniesz istniejący link ze statusem 200 i polem "existing": true.

Błędy

{
  "ok": false,
  "error": "Ten slug jest już zajęty — wybierz inny.",
  "field": "slug",
  "code": "slug_taken"
}

Pole field wskazuje pole z błędem (url, slug, expires). Przy błędach ogólnych ma wartość null albo go nie ma.

StatuscodeZnaczenie
422emptyPuste pole url.
422invalidAdres nie daje się przetworzyć albo przysłano wartość, która nie jest tekstem.
422schemeSchemat inny niż http i https.
422hostZła nazwa domeny albo adres niepubliczny (pętla zwrotna, sieć prywatna, zapis liczbowy).
422portPo dwukropku nie ma poprawnego numeru portu.
422userinfoAdres zawiera dane logowania (login:hasło@host).
422idnDomena ze znakami spoza ASCII, a serwer nie ma rozszerzenia intl.
422selfAdres prowadzi do tej skracarki — to byłaby pętla.
422too_longAdres dłuższy niż 2048 bajtów.
422slug_invalid, slug_takenProblem z własnym slugiem.
422expires_invalidNieznana wartość expires.
422collisionNie udało się wylosować wolnego adresu — powtórz żądanie.
400spamWypełnione pole-pułapka.
403originZgłoszenie nadużycia wysłane z obcej strony.
404not_foundNieznany punkt końcowy.
422not_foundNieznany slug w zgłoszeniu nadużycia.
422reasonBrak albo nieznany powód zgłoszenia.
405methodZła metoda — użyj POST.
429rate_limitedZa dużo żądań — czas oczekiwania w sekundach podaje nagłówek Retry-After.
500serverBłąd po naszej stronie.
503unavailableBaza chwilowo nie odpowiada — ponów za kilkadziesiąt sekund.

Sprawdzanie slugu

GET https://skracarka.com/api/check?slug=wrzesien

{
  "ok": true,
  "slug": "wrzesien",
  "available": false,
  "code": "taken",
  "label": "zajęty",
  "reason": "Ten slug jest już zajęty."
}

Pole available mówi, czy slug jest wolny. Przy odmowie code podaje powód w formie nadającej się do porównania w kodzie, label to krótka etykieta do pokazania przy polu, a reason — pełne zdanie dla użytkownika.

codeZnaczenie
takenSlug jest już zajęty.
reservedSlug zarezerwowany przez serwis.
syntaxNiedozwolone znaki albo myślnik na początku lub końcu.
too_short, too_longPoza zakresem 3–32 znaków.
nullSlug jest wolny (available: true).

Kod QR

GET https://skracarka.com/qr/{slug}.svg — kod QR krótkiego linku jako SVG (skalowalny, nadaje się do druku).

Statystyki

GET https://skracarka.com/{slug}+ — strona HTML z podglądem celu, liczbą kliknięć i kodem QR. Dopisz plus do krótkiego linku w przeglądarce, aby sprawdzić cel bez przekierowania.

Zgłoszenie nadużycia

POST https://skracarka.com/api/report

Pola: slug (wymagany), powod (phishing, malware, spam, oszustwo, inne) oraz opis (opcjonalny, do 500 znaków).

Odpowiedź jest JSON-em, gdy wyślesz Content-Type: application/json albo Accept: application/json — wtedy 202 i {"ok": true}. Zwykły formularz (bez tych nagłówków) dostaje przekierowanie 303 z powrotem na stronę statystyk z komunikatem. Zgłoszenia przyjmujemy tylko z tej witryny: żądanie z nagłówkiem Origin wskazującym inną domenę dostaje 403 i code: "origin".

Limity i zasady

  • do 30 nowych linków na 10 minut z jednego adresu (dla IPv6 liczymy prefiks /64);
  • osobne liczniki na minutę: 60 wywołań /api/shorten, 180 wywołań /api/check, 10 wywołań /api/report oraz 30 wysłań formularza na stronie głównej;
  • CORS włączony — API można wywołać bezpośrednio z przeglądarki;
  • obowiązuje regulamin: żadnych linków do phishingu, złośliwego oprogramowania i spamu.