Short Links API

Twórz markowe krótkie linki z aliasami, datą wygaśnięcia, hasłami, limitami kliknięć i analityką.

Popularne przypadki użycia
Śledzenie kampanii

Krótkie, markowe linki do kampanii z tagami UTM. Unikalne aliasy na partnera do porównywania wyników.

Kody QR

Kody gotowe do druku, które można zmienić później.

Chronione hasłem

Chroń wrażliwe dokumenty prostym hasłem.

99.9 % Dostępność
Odpowiedź
25 req/s
0.002 Kredyty / żądanie

Create Short Link (Basic)


POST https://api.yeb.to/v1/short-links/create-basic
ParametrTypWymaganyOpis
api_key string tak Your API key
original_url string tak Target URL (scheme auto-added if missing)
alias string opcjonalny Human alias (1–100, [A-Za-z0-9\-_])
short_code string opcjonalny Custom short code (else auto 7 chars)
password string opcjonalny Optional access password
expires_at ISO 8601 opcjonalny Expiry timestamp
click_limit int opcjonalny Max total clicks
one_time bool opcjonalny Allow only a single click
settings array<{key,value}> opcjonalny Custom metadata

Przykład

curl -X POST https://api.yeb.to/v1/short-links/create-basic \
  -H "Content-Type: application/json" \
  -d '{
  "api_key": "YOUR_KEY",
  "original_url": "https://example.com/pricing",
  "alias": "docs-demo"
}'

Przykład odpowiedzi

Kody odpowiedzi

KodOpis
200 SuccessŻądanie przetworzone OK.
400 Bad RequestWalidacja danych wejściowych nie powiodła się.
401 UnauthorizedBrakujący / nieprawidłowy klucz API.
403 ForbiddenKlucz nieaktywny lub niedozwolony.
429 Rate LimitZbyt wiele żądań.
500 Server ErrorNieoczekiwany błąd.

Create Short Link (Advanced)


POST https://api.yeb.to/v1/short-links/create-advanced
ParametrTypWymaganyOpis
api_key string tak Your API key
original_url string tak Target URL (scheme auto-added if missing)
alias string opcjonalny Human alias (1–100, [A-Za-z0-9\-_])
short_code string opcjonalny Custom short code (else auto 7 chars)
password string opcjonalny Optional access password
expires_at ISO 8601 opcjonalny Expiry timestamp
click_limit int opcjonalny Max total clicks
one_time bool opcjonalny Allow only a single click
settings array<{key,value}> opcjonalny Custom metadata

Przykład

curl -X POST https://api.yeb.to/v1/short-links/create-advanced \
  -H "Content-Type: application/json" \
  -d '{
  "api_key": "YOUR_KEY",
  "original_url": "https://example.com/pricing",
  "alias": "docs-demo",
  "click_limit": 100,
  "expires_at": "2025-12-31T23:59:00Z"
}'

Przykład odpowiedzi

Kody odpowiedzi

KodOpis
200 SuccessŻądanie przetworzone OK.
400 Bad RequestWalidacja danych wejściowych nie powiodła się.
401 UnauthorizedBrakujący / nieprawidłowy klucz API.
403 ForbiddenKlucz nieaktywny lub niedozwolony.
429 Rate LimitZbyt wiele żądań.
500 Server ErrorNieoczekiwany błąd.

Get Short Link


POST https://api.yeb.to/v1/short-links/get
ParametrTypWymaganyOpis
api_key string tak Your API key
code string tak Alias or short_code

Przykład

curl -X POST https://api.yeb.to/v1/short-links/get \
  -H "Content-Type: application/json" \
  -d '{
  "api_key": "YOUR_KEY",
  "code": "docs-demo"
}'

Przykład odpowiedzi

Kody odpowiedzi

KodOpis
200 SuccessŻądanie przetworzone OK.
400 Bad RequestWalidacja danych wejściowych nie powiodła się.
401 UnauthorizedBrakujący / nieprawidłowy klucz API.
403 ForbiddenKlucz nieaktywny lub niedozwolony.
429 Rate LimitZbyt wiele żądań.
500 Server ErrorNieoczekiwany błąd.

Update Short Link


POST https://api.yeb.to/v1/short-links/update
ParametrTypWymaganyOpis
api_key string tak Your API key
code string tak Alias or short_code to update
original_url string opcjonalny New target URL
alias string opcjonalny New alias
short_code string opcjonalny New short code
password string opcjonalny Set password (empty string to clear)
expires_at ISO 8601 opcjonalny New expiry
click_limit int opcjonalny New limit
one_time bool opcjonalny Enable/disable single-use
advanced_analytics bool opcjonalny Enable/disable advanced analytics
settings array<{key,value}> opcjonalny Replace settings

Przykład

curl -X POST https://api.yeb.to/v1/short-links/update \
  -H "Content-Type: application/json" \
  -d '{
  "api_key": "YOUR_KEY",
  "code": "docs-demo",
  "click_limit": 100,
  "expires_at": "2025-12-31T23:59:00Z"
}'

Przykład odpowiedzi

Kody odpowiedzi

KodOpis
200 SuccessŻądanie przetworzone OK.
400 Bad RequestWalidacja danych wejściowych nie powiodła się.
401 UnauthorizedBrakujący / nieprawidłowy klucz API.
403 ForbiddenKlucz nieaktywny lub niedozwolony.
429 Rate LimitZbyt wiele żądań.
500 Server ErrorNieoczekiwany błąd.

Delete Short Link


POST https://api.yeb.to/v1/short-links/delete
ParametrTypWymaganyOpis
api_key string tak Your API key
code string tak Alias or short_code

Przykład

curl -X POST https://api.yeb.to/v1/short-links/delete \
  -H "Content-Type: application/json" \
  -d '{
  "api_key": "YOUR_KEY",
  "code": "docs-demo"
}'

Przykład odpowiedzi

Kody odpowiedzi

KodOpis
200 SuccessŻądanie przetworzone OK.
400 Bad RequestWalidacja danych wejściowych nie powiodła się.
401 UnauthorizedBrakujący / nieprawidłowy klucz API.
403 ForbiddenKlucz nieaktywny lub niedozwolony.
429 Rate LimitZbyt wiele żądań.
500 Server ErrorNieoczekiwany błąd.

Short Link Stats


POST https://api.yeb.to/v1/short-links/stats
ParametrTypWymaganyOpis
api_key string tak Your API key
code string tak Alias or short_code
period enum opcjonalny `7d` | `30d` | `90d` (default: `30d`)
tz string opcjonalny Timezone label (informational)
limit_recent int opcjonalny Recent clicks to return (0–200, default 20)

Przykład

curl -X POST https://api.yeb.to/v1/short-links/stats \
  -H "Content-Type: application/json" \
  -d '{
  "api_key": "YOUR_KEY",
  "code": "docs-demo",
  "period": "30d",
  "limit_recent": 10
}'

Przykład odpowiedzi

Kody odpowiedzi

KodOpis
200 SuccessŻądanie przetworzone OK.
400 Bad RequestWalidacja danych wejściowych nie powiodła się.
401 UnauthorizedBrakujący / nieprawidłowy klucz API.
403 ForbiddenKlucz nieaktywny lub niedozwolony.
429 Rate LimitZbyt wiele żądań.
500 Server ErrorNieoczekiwany błąd.

Short Links API — Practical Guide

Create branded short links with optional password and expiry, manage aliases/codes safely, and read rich stats — without guessing which fields matter in production.

#What this API solves

Teams usually need more than “shorten this URL”. You want safe naming (alias vs code), campaign controls (expiry, one-time, click limits, password), and readable stats that answer “what’s working?”. This suite provides exactly that — with two creation modes (basic vs advanced) so you only pay for analytics you actually use.

#Endpoints & when to use them

#POST /v1/short-links/create-basic — Create link (cheaper)

  • Best for: Operational links where you only need totals & last click (fast & low cost).
  • Output: advanced_analytics=false, total_clicks may be present; no per-country/device buckets.

#POST /v1/short-links/create-advanced — Create link with rich analytics

  • Best for: Campaigns where you’ll later slice by country, device, browser, OS.
  • Output: advanced_analytics=true. The stats endpoint returns buckets.

#POST /v1/short-links/get — Fetch by alias or short_code

  • Ownership enforced: You’ll only see links owned by your API key/user.

#POST /v1/short-links/update — Change URL/alias/code/limits

  • Conflicts handled: Server rejects duplicate alias/short_code across live & soft-deleted rows.
  • Settings: Passing settings replaces the whole key/value set (idempotent).

#POST /v1/short-links/delete — Soft delete by code

  • Tip: Deleted aliases/codes still count for conflict checks to prevent accidental reuse collisions.

#POST /v1/short-links/stats — Summary & buckets

  • Period: 7d | 30d | 90d (default 30d).
  • Recent clicks: up to 200 latest (limit_recent).
  • Buckets: Country/Device/Browser/OS (when advanced_analytics=true).
  • Password metrics: When derivable, returns password_page_views_* and password_attempts_total.
  • Debug mode: Include "debug":true to surface query diagnostics in the response.

#Quick start

# Create a basic link
curl -sX POST "https://api.yeb.to/v1/short-links/create-basic" \
 -H "Accept: application/json" -H "Content-Type: application/json" \
 -d '{ "api_key":"<YOUR_KEY>", "original_url":"https://example.com/pricing", "alias":"docs-demo" }'
# Retrieve stats (30d default) with 10 recent clicks
curl -sX POST "https://api.yeb.to/v1/short-links/stats" \
 -H "Accept: application/json" -H "Content-Type: application/json" \
 -d '{ "api_key":"<YOUR_KEY>", "code":"docs-demo", "limit_recent":10 }'

#Full “everything on” request (covers most options)

Turn features on, then trim to your needs.

POST /v1/short-links/create-advanced
{
  "api_key": "YOUR_KEY",
  "original_url": "https://example.com/launch?utm_source=short",
  "alias": "docs-advanced-demo",
  "short_code": "AB12CDE",
  "password": "letmein",
  "expires_at": "2025-12-31T23:59:00Z",
  "click_limit": 1000,
  "one_time": false,
  "advanced_analytics": true,
  "settings": [
    {"key":"campaign","value":"winter-2025"},
    {"key":"owner","value":"growth-team"}
  ]
}

#Parameters that actually matter

Create / Update

ParamTypeRequiredPractical guidance
original_urlstring (URL)Yes (create)Scheme auto-added if missing; keep UTM here for external analytics.
aliasstringNoReadable path (e.g., /l/black-friday). Great for campaigns.
short_codestringNoFixed-length code. If omitted, server generates 7 chars. Use for printed collateral.
passwordstringNoGate sensitive pages. On update, send empty string to clear.
expires_atISO 8601NoHard stop for promo windows. Combine with stats to prune stale links.
click_limitintNoCap total visits (e.g., limited seats). Pair with one_time for single-use passes.
one_timeboolNoFirst successful click consumes the link.
advanced_analyticsboolNoEnable per-country/device/browser/OS buckets in /stats.
settingsarray<{key,value}>NoFree-form metadata. On update, the set is replaced atomically.

Stats request

ParamTypeRequiredNotes
codestringYesEither the alias or the short_code.
periodenumNo7d | 30d | 90d (default 30d).
limit_recentintNo0–200 (default 20). Returns latest clicks with IP/UA timestamped.
tzstringNoInformational field echoed back (visualization hint).
debugboolNotrue adds query diagnostics to response (helpful in staging).

#Reading & acting on responses

Create (basic vs advanced)

{
  "data": {
    "original_url": "https://example.com/pricing",
    "short_code": "AB12CDE",
    "alias": "docs-demo",
    "public_url": "https://yeb.to/l/docs-demo",
    "expires_at": null,
    "click_limit": null,
    "one_time": false,
    "advanced_analytics": false,
    "total_clicks": 0,
    "created_at": "2025-01-01T12:00:00Z",
    "updated_at": "2025-01-01T12:00:00Z"
  }
}
  • Print/embed: Use public_url on sites or QR codes.
  • Auditing: Keep alias and short_code in your DB for future updates.

Get / Update

{
  "data": {
    "original_url": "https://example.com/pricing",
    "short_code": "AB12CDE",
    "alias": "docs-demo",
    "public_url": "https://yeb.to/l/docs-demo",
    "expires_at": "2025-12-31T23:59:00Z",
    "click_limit": 100,
    "one_time": false,
    "advanced_analytics": false,
    "total_clicks": 0,
    "created_at": "2025-01-01T12:00:00Z",
    "updated_at": "2025-01-10T12:00:00Z"
  }
}
  • Conflicts: If you change alias or short_code to one that exists (even soft-deleted), you’ll get a 422 explaining the conflict.
  • Password: On update, send empty string to clear. Non-empty strings are stored hashed.

Stats

{
  "data": {
    "code": "docs-demo",
    "from": "2025-01-01T00:00:00Z",
    "to":   "2025-01-31T00:00:00Z",
    "tz": "UTC",
    "summary": {
      "total_clicks": 42,
      "last_click_at": "2025-01-30T20:05:00Z",
      "unique_countries": 8,
      "password_page_views_total": 12,
      "password_page_views_unique": 10,
      "password_attempts_total": 3
    },
    "recent_clicks": [
      {"ip":"1.2.3.4","user_agent":"...","ts":"2025-01-30T20:05:00Z"}
    ],
    "by_country": [{"key":"US","count":20}],
    "by_device":  [{"key":"mobile","count":30}],
    "by_browser": [{"key":"Chrome","count":25}],
    "by_os":      [{"key":"Android","count":18}]
  }
}
  • Basic vs Advanced: Buckets populate only when the link was created with advanced_analytics=true and underlying tables exist.
  • Recent list: Use it for moderation/debugging; don’t store full UA/IP long-term if you don’t need them.

#Practical recipes

  • Campaign naming: Use alias for human-readable slugs (/l/summer-sale), keep short_code for printed QR where length matters.
  • Time-boxed promos: Set expires_at and click_limit. After the window, update the link to a “campaign over” page.
  • Single-use access: Combine one_time=true with a password. Track attempts via /stats password metrics.
  • Attribution: Include UTMs in original_url. The API doesn’t change your query string.
  • Governance: Store settings like campaign, owner, cost_center for internal reporting.

#Errors & safeguards

  • 422 — Validation (missing original_url, code, or alias/code conflict).
  • 404 — Not found (wrong code or not owned by your key/user).
  • Ownership: All read/write endpoints scope by API key/user; non-owned links behave as “not found”.

#API Changelog (Short Links)

2025-11-05
Stats diagnostics. Added optional debug flag to /stats response for query introspection.
2025-11-03
Password telemetry. Surfacing password_page_views_* and password_attempts_total when derivable.
2025-10-28
Conflict hardening. Update now checks duplicates across live & soft-deleted links; clearer 422 messages.
2025-10-20
Advanced analytics path. Split creation into create-basic and create-advanced with bucketed stats support.

Use the endpoint playgrounds on this page to test payloads and lock defaults (alias pattern, expiry policy, analytics mode).

#Copy-ready cURL (common flows)

# Create (basic)
curl -sX POST "https://api.yeb.to/v1/short-links/create-basic" -H "Content-Type: application/json" \
 -d '{"api_key":"YOUR_KEY","original_url":"https://example.com/pricing","alias":"docs-demo"}'

# Create (advanced)
curl -sX POST "https://api.yeb.to/v1/short-links/create-advanced" -H "Content-Type: application/json" \
 -d '{"api_key":"YOUR_KEY","original_url":"https://example.com/pricing","alias":"docs-demo","click_limit":100,"expires_at":"2025-12-31T23:59:00Z"}'

# Get
curl -sX POST "https://api.yeb.to/v1/short-links/get" -H "Content-Type: application/json" \
 -d '{"api_key":"YOUR_KEY","code":"docs-demo"}'

# Update
curl -sX POST "https://api.yeb.to/v1/short-links/update" -H "Content-Type: application/json" \
 -d '{"api_key":"YOUR_KEY","code":"docs-demo","click_limit":100,"expires_at":"2025-12-31T23:59:00Z"}'

# Stats
curl -sX POST "https://api.yeb.to/v1/short-links/stats" -H "Content-Type: application/json" \
 -d '{"api_key":"YOUR_KEY","code":"docs-demo","period":"30d","limit_recent":10}'

# Delete
curl -sX POST "https://api.yeb.to/v1/short-links/delete" -H "Content-Type: application/json" \
 -d '{"api_key":"YOUR_KEY","code":"docs-demo"}'

Często zadawane pytania

Dane MaxMind GeoLite2 są zwykle dokładne na poziomie miasta dla 65–70% adresów IPv4 na całym świecie.

Ze względu na prywatność i prostotę normalizujemy wszystkie stany „niedostępne" (wygasłe, zużyte, wyłączone, osiągnięty limit kliknięć) do 404.

Tak, jeśli nowy alias/short_code jest unikalny w obu kolumnach. API wymusza globalną unikalność.

Domyślny burst to 20 żądań/s na klucz API (może się różnić w zależności od planu). Mogą obowiązywać również limity dzienne i miesięczne.

Tworzenie linku zużywa kredyty. Przeglądanie statystyk również. Wyświetlenia/próby hasła są rejestrowane, ale nie są rozliczane indywidualnie.

Unikalne kliknięcia są szacowane na podstawie różnych adresów IP zaobserwowanych przed bieżącym zdarzeniem.

Tylko Ty. Kontrole dostępu dopasowują Twoje user_id (web) lub dowolny klucz API, który posiadasz (API). Żądania od innych są wyświetlane jako 404.

Tak. Każde żądanie, nawet te zakończone błędem, zużywa kredyty. Twoje kredyty są powiązane z liczbą żądań, niezależnie od sukcesu lub niepowodzenia. Jeśli błąd jest wyraźnie spowodowany problemem platformy po naszej stronie, przywrócimy dotknięte kredyty (bez zwrotów gotówkowych).

Skontaktuj się z nami pod adresem [email protected]. Traktujemy opinie poważnie—jeśli Twój raport o błędzie lub prośba o funkcję jest sensowna, możemy szybko naprawić lub ulepszyć API i przyznać Ci 50 darmowych kredytów w podziękowaniu.

Zależy od API, a czasem nawet od endpointu. Niektóre endpointy korzystają z danych ze źródeł zewnętrznych, które mogą mieć surowsze limity. Wprowadzamy też limity, aby zapobiec nadużyciom i utrzymać stabilność platformy. Sprawdź dokumentację, aby poznać konkretny limit dla każdego endpointu.

Działamy w systemie kredytowym. Kredyty to przedpłacone, bezzwrotne jednostki, które wydajesz na wywołania API i narzędzia. Kredyty są zużywane metodą FIFO (najstarsze najpierw) i są ważne przez 12 miesięcy od daty zakupu. Panel wyświetla datę każdego zakupu i jego wygaśnięcia.

Tak. Wszystkie zakupione kredyty (w tym ułamkowe salda) są ważne przez 12 miesięcy od zakupu. Niewykorzystane kredyty automatycznie wygasają i są trwale usuwane na koniec okresu ważności. Wygasłych kredytów nie można przywrócić ani zamienić na gotówkę lub inną wartość. Reguła przejściowa: kredyty zakupione przed 22 wrz. 2025 traktowane są jako zakupione 22 wrz. 2025 i wygasają 22 wrz. 2026 (chyba że przy zakupie podano wcześniejszą datę wygaśnięcia).

Tak—w ramach okresu ważności. Niewykorzystane kredyty pozostają dostępne i są przenoszone z miesiąca na miesiąc, aż wygasną 12 miesięcy po zakupie.

Kredyty są bezzwrotne. Kupuj tylko to, czego potrzebujesz—zawsze możesz doładować później. Jeśli błąd platformy spowoduje nieudane obciążenie, możemy przywrócić dotknięte kredyty po zbadaniu sprawy. Bez zwrotów gotówkowych.

Ceny są ustalane w kredytach, nie w dolarach. Każdy endpoint ma własną cenę—zobacz odznakę „Kredyty / żądanie" powyżej. Zawsze będziesz dokładnie wiedzieć, ile wydajesz.
← Powrót do API