pik.li
1. verzió · stabil

pik.li API

Hozd létre, módosítsd és mérd rövid linkjeidet saját kódodból. REST API JSON bemenettel és kimenettel, integrációnként külön kulccsal; minden végpont valós kéréssel és válasszal dokumentálva.

API-kulcs beszerzése OpenAPI 3.1
Alap URLhttps://pik.li/api/v1

Bevezetés

A pik.li API-jával szoftveredből elvégezheted mindazt, amit a felhasználói felületen: rövid linkeket hozhatsz létre és módosíthatsz, statisztikát olvashatsz, címkéket és domaineket listázhatsz, valamint webhookokat kezelhetsz. HTTPS-en működik, minden útvonal a fenti alap URL-lel kezdődik.

  • A kérések törzsét JSON-ként küldd Content-Type: application/json fejléccel; a GET kérések paraméterei a lekérdezési karakterláncba kerülnek. A válasz mindig UTF-8 JSON, kivéve a képként visszaadott QR-kódot.
  • A verzió az útvonal része (/api/v1), és minden válasz tartalmazza az X-Api-Version: 1 fejlécet. A v1 válaszok később új mezőkkel bővülhetnek; kódod hagyja figyelmen kívül az ismeretlen mezőket.
  • A dátumok és időpontok ISO 8601 karakterláncok saját eltolással (2026-09-23T10:15:42.118+02:00); az időpont nélküli dátumok formája 2026-09-23.
  • Az azonosítók egész számok. Link a rövid URL-jével is megkereshető a GET /links/lookup használatával.

Gyors kezdés

  1. Hozz létre kulcsot a felhasználói felületen (lásd Kulcs létrehozása), és mentsd környezeti változóba.
  2. Ellenőrizd működését: a GET /me válasza tartalmazza fiókodat és csomagodat.
  3. Hozd létre első rövid linkedet a POST /links használatával.
Terminál
export PIKLI_KEY="pk_live_…"

curl https://pik.li/api/v1/me \
  -H "Authorization: Bearer $PIKLI_KEY"

curl -X POST https://pik.li/api/v1/links \
  -H "Authorization: Bearer $PIKLI_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/a/very/long/page"}'

Hitelesítés

A GET /ping kivételével minden híváshoz API-kulcs szükséges, amelyet bearer tokenként az Authorization fejlécben kell küldeni.

Fejléc
Authorization: Bearer pk_live_3kZ9vQeX1mT0bR7yNw2aLp4sUc8dHf6J

Az X-API-Key fejléc is működik. Régi kliensekhez az api_key lekérdezési paraméter még elfogadott, de kerüld: a címek naplókba és böngészőelőzményekbe kerülnek.

A kulcsok pk_live_ előtaggal és 32 karakterrel folytatódnak. A kulcs pontosan azt látja, amit a fiókja: linkeket, domaineket, címkéket, statisztikát és webhookokat. Egy fiók minden kulcsa azonos műveletekre képes; nincs csak olvasható kulcs.

A kulcsot jelszóként kezeld. Tartsd a szervereden, soha ne böngészőben futó vagy terjesztett alkalmazáskódban. Ha nyilvánosságra kerül, vond vissza, és készíts újat; tíz másodperc az egész.

Kulcs létrehozása

  1. Jelentkezz be, és nyisd meg a(z) API és kulcsok részt a felhasználói felületen.
  2. Adj beszédes nevet a kulcsnak (például Éles CRM), majd kattints a Kulcs generálása gombra.
  3. Azonnal másold ki a kulcsot: a felhasználói felület csak egyszer mutatja meg.
  4. Legfeljebb 10 aktív kulcsod lehet. Az oldal mindegyiknél mutatja az utolsó használatot és a kérések számát, és lehetővé teszi a visszavonást; a következő hívástól a visszavont kulcs 401 unauthorized választ kap.

Ki használhatja az API-t?

Az API a fizetős csomagok (Premium és Business) része. A Base csomag alapból nem tartalmazza, kivéve ha a pik.li munkatársai engedélyezik az ingyenes csomaghoz vagy fiókodhoz. A fiók e-mail-címének minden esetben megerősítettnek kell lennie, és a fiók nem lehet zárolt vagy felfüggesztett.

Ha bármely feltétel hiányzik, az API válasza api_disabled, email_unconfirmed vagy account_blocked.

Base

Csak munkatársi engedéllyel
Kérés percenként
60
Új linkek
Havi 1 200
Link tömeges hívásonként
10
Statisztikamegőrzés
90 nap
Webhookok
Nem

Premium

API-val
Kérés percenként
600
Új linkek
Havi 2 500
Link tömeges hívásonként
100
Statisztikamegőrzés
730 nap
Webhookok
Igen

Business

API-val
Kérés percenként
3 000
Új linkek
Havi 10 000
Link tömeges hívásonként
100
Statisztikamegőrzés
1 095 nap
Webhookok
Igen

Ezek az egyes csomagok árbeállításaiból valós időben olvasott alapértékei. Saját, esetleges munkatársi módosításokat is tartalmazó értékeidet a(z) GET /limits és GET /me adja vissza.

Sebességkorlátok

Minden kulcs csomagtól függő számú kérést küldhet percenként (lásd a fenti táblázatot). A számláló minden perc elején újraindul.

X-RateLimit-Limit
a kulcs számára percenként engedélyezett kérések
X-RateLimit-Remaining
az adott percben fennmaradó kérések
X-RateLimit-Reset
a számláló újraindulása Unix-időbélyegként, másodpercben
Retry-After
csak 429 válaszban: ennyi másodpercet kell várni

A korlát felett az API 429 választ ad rate_limited hibával és Retry-After fejléccel. Várd meg ezt az időt; az azonnali ismétlés csak a következő percet terheli.

Válasz
HTTP/1.1 429 Too Many Requests
Content-Type: application/json; charset=utf-8
Retry-After: 18
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1790151360

{
  "error": {
    "code": "rate_limited",
    "message": "Too many requests. Check the X-RateLimit-* headers and retry after the window resets.",
    "details": { "limit": 600, "period_seconds": 60, "resets_at": "2026-09-23T08:16:00Z" },
    "docs_url": "https://pik.li/help#error-rate_limited"
  },
  "request_id": "2b8e51d0-7a4c-4f1e-9d3b-5c6a0e8f7d21"
}
  • A kulcs nélküli hívások IP-címenként percenként 30 darabra korlátozottak (a GET /ping nem számít bele).
  • Ezenfelül minden IP-cím legfeljebb 600 kérést küldhet percenként a teljes pik.li felé, csomagtól függetlenül.

Hibák

A sikertelen kérés végponttól függetlenül mindig azonos szerkezetű választ és a problémának megfelelő HTTP-állapotot kap.

Válasz
{
  "error": {
    "code": "quota_exceeded",
    "message": "Link quota reached: 2500 links per month on your plan.",
    "details": { "limit": 2500, "used": 2500, "period": "month", "resets_at": "2026-09-30T22:00:00Z" },
    "docs_url": "https://pik.li/help#error-quota_exceeded"
  },
  "request_id": "6f1c2a9e-4b0d-4c55-9a51-8f2f0d7c1e3b"
}
code
Stabil, kódod számára készült azonosító. Soha nem változik és nem fordítjuk le.
message
Embereknek szóló mondat a kérés nyelvén (lásd Nyelvek).
details
Szükség esetén strukturált adatok: érvénytelen mezők, engedélyezett értékek, keretszámok. Nem mindig szerepel.
docs_url
Hivatkozás e kód magyarázatára ezen az oldalon.
request_id
A kérés azonosítója, amely az X-Request-Id fejlécben is szerepel. Ügyfélszolgálati megkeresésnél add meg.

Minden kulcsot igénylő végpont visszaadhatja a(z) unauthorized account_blocked email_unconfirmed api_disabled rate_limited hibákat is; ezeket nem ismételjük meg minden végpontnál.

unauthorized401
A kulcs hiányzik, hibás vagy visszavonták. Ellenőrizd az Authorization fejlécet és hogy a kulcs aktív-e a felhasználói felületen.
account_blocked403
A fiók zárolt, felfüggesztett vagy inaktív. Az API a fiók újraaktiválásáig nem érhető el.
email_unconfirmed403
A fiók e-mail-címe nincs megerősítve. Nyisd meg a megerősítő e-mail linkjét, majd próbáld újra.
api_disabled403
A fiók csomagja nem tartalmazza az API-t, vagy a fiók API-ját kikapcsolták. Lásd Ki használhatja az API-t.
forbidden403
A kulcs nem végezheti el ezt a műveletet. fenntartva
feature_required402
A csomag nem tartalmazza a végponthoz szükséges funkciót. A details.feature a funkciót, a details.plan az első azt kínáló csomagot jelöli.
quota_exceeded402
Elfogyott a napi vagy havi linkkeret. A details tartalmazza a limit, used, period és resets_at értékeket; utóbbi mutatja, mikortól hozhatsz létre ismét linket.
not_found404
Az erőforrás nem létezik, törölték, vagy másik fiókhoz tartozik.
conflict409
A kérés ütközik az erőforrás jelenlegi állapotával. fenntartva
invalid422
Egyes adatok érvénytelenek: a details.fields mezőnként felsorolja a problémákat, a details.messages kész mondatokat tartalmaz.
domain_not_allowed422
Fiókod nem használhatja ezt a domaint. A GET /domains felsorolja az elérhetőket.
bad_request400
Hiányzik egy kötelező paraméter; a details.parameter megadja, melyik.
invalid_json400
A törzs nem érvényes JSON. Ellenőrizd az idézőjeleket és a Content-Type fejlécet.
invalid_parameter400
Egy paraméter értékét a végpont nem ismeri. Az üzenet megnevezi a paramétert, a details.allowed pedig – ha szerepel – az elfogadott értékeket.
bulk_empty400
A tömeges hívás links tömbje üres vagy hiányzik.
bulk_too_many400
Túl sok link egy tömeges hívásban. A details.max a csomagod korlátja; oszd több hívásra a listát.
idempotency_key_invalid400
Az Idempotency-Key fejléc hosszabb 128 karakternél.
rate_limited429
Túl sok kérés ebben a percben. Várd meg a Retry-After szerinti másodperceket, majd folytasd.

Az 500 válasz azt jelenti, hogy nálunk történt hiba, a kérésedben nincs javítanivaló. Próbáld újra később; ha fennmarad, írj az ügyfélszolgálatnak az X-Request-Id fejléc értékével.

Lapozás

A hosszúra nyúló listák oldalakra vannak bontva: GET /links, GET /links/active és GET /links/:id/clicks.

  • page: a kívánt oldal 1-től.
  • per_page: oldalonként 1–100 elem (alapértelmezés: 50). A limit szinonimaként elfogadott.

A válasz pagination objektumot tartalmaz, a végösszeg az X-Total-Count fejlécben is szerepel. Kérd a next_page értékét, amíg null nem lesz.

Válasz
{
  "links": [],
  "pagination": { "page": 2, "per_page": 50, "total": 137, "total_pages": 3, "next_page": 3, "prev_page": 1 }
}

Idempotencia

A POST /links, POST /links/bulk és POST /links/generate elfogadja az Idempotency-Key fejlécet: műveletenként egy általad választott, legfeljebb 128 karakteres szöveget, például rendelésszámot vagy UUID-t.

Ha ugyanaz az érték ugyanazzal az API-kulccsal 24 órán belül újra érkezik, a pik.li nem hoz létre semmit, hanem az első választ adja vissza Idempotent-Replayed: true fejléccel. Időtúllépés után ismételt kérés sem készít másolatot.

Azonos kérés és kulcs 24 órán belül
HTTP/1.1 201 Created
Idempotent-Replayed: true
Content-Type: application/json; charset=utf-8

Az 5xx állapotú válaszokat nem tároljuk, ezért ugyanazzal az értékkel ismételve a kérés újra lefut. Túl hosszú értéknél a válasz idempotency_key_invalid.

Nyelvek

A hibaüzenetek kilenc nyelven érhetők el: en it zh ar ru fr de es pt-BR lt hi hu. Az API először a locale paramétert, majd az Accept-Language fejlécet, végül fiókod nyelvét használja; ennek hiányában angolt. Csak az üzenet változik: a kódok és mezőnevek, valamint az ugyanezt az oldalt azonos nyelven megnyitó docs_url változatlan.

Terminál
curl "https://pik.li/api/v1/links?status=nope" \
  -H "Authorization: Bearer $PIKLI_KEY" \
  -H "Accept-Language: it"

{
  "error": {
    "code": "invalid_parameter",
    "message": "Valore non valido per il parametro status.",
    "details": { "allowed": ["all", "active", "disabled", "review", "expired"] },
    "docs_url": "https://pik.li/help?locale=it#error-invalid_parameter"
  },
  "request_id": "0d5c9b7e-1f2a-4e3b-8c6d-7a9e0f1b2c3d"
}

Statisztikai időablakok

A statisztikai végpontok egy időablakot olvasnak, és az azt közvetlenül megelőző, azonos hosszúságú ablakkal hasonlítják össze; ebből származik a previous és delta_pct.

period
24h, 7d, 30d, 90d, 1y vagy all (a csomagod által megőrzött teljes előzmény). Napok száma is használható: period=45, illetve a régi days=45. Alapértelmezés fióknál 7d, egy linknél 30d, kattintáslistánál all.
from, to
A period helyett megadható dátum (2026-09-01) vagy ISO 8601 időpont. Ha nincs megadva, a to az aktuális idő, a from pedig 30 nappal korábbi; a to dátum az egész napot magában foglalja.
interval
hour vagy day, az idősor lépésköze. A legfeljebb 48 órás ablakok alapból órásak, a hosszabbak napiak; órás sor legfeljebb 7 napot fedhet le.
window.clamped
Az ablak nem nyúlhat a csomagod által megőrzött előzményeknél (retention_days) korábbra. Levágáskor a window.clamped értéke true.
bots
A botkattintásokat kizárjuk. Számlálásukhoz add hozzá a bots=1 értéket; egyetlen link statisztikája külön is jelzi őket a period.bots mezőben.

Végpontok

Minden végpont paraméterekkel, terminálba illeszthető kéréssel és valós válasszal; a hosszú listákat rövidítettük. A példák a gyors kezdéshez hasonlóan a $PIKLI_KEY változóból olvassák a kulcsot.

Szolgáltatás

Aktív-e az API, és mennyi maradt a csomagodból.

GET /ping Kulcs nélkül

Ellenőrzi, hogy az API válaszol-e

Nem kell hozzá kulcs, állapotellenőrzéshez készült. Visszaadja a szerver idejét, e dokumentáció és az OpenAPI-fájl címét.

Kérés
curl https://pik.li/api/v1/ping
Válasz · 200
{
  "ok": true,
  "service": "pik.li",
  "version": "v1",
  "time": "2026-09-23T08:15:42Z",
  "docs": "https://pik.li/help",
  "openapi": "https://pik.li/openapi.json"
}
Hibák Nincs: ehhez a végponthoz nem kell kulcs.
GET /limits

Fennmaradó kereteid

A ma vagy ebben a hónapban létrehozható linkek, rögzített kattintások, aktuális sebességkorlát-ablak, használatban lévő kulcsok és egyéni domainek, valamint a tömeges hívás maximális mérete. Minden szám figyelembe veszi a fiókod munkatársi módosításait.

Kérés
curl https://pik.li/api/v1/limits \
  -H "Authorization: Bearer $PIKLI_KEY"
Válasz · 200
{
  "plan": "premium",
  "plan_name": "Premium",
  "links": {
    "period": "month", "limit": 2500, "used": 412, "remaining": 2088,
    "resets_at": "2026-09-30T22:00:00Z",
    "today": 9, "this_month": 412, "per_day": 0, "per_month": 2500
  },
  "clicks": { "limit": 150000, "used": 38120, "remaining": 111880, "resets_at": "2026-09-30T22:00:00Z" },
  "rate_limit": { "limit": 600, "remaining": 597, "period_seconds": 60, "resets_at": "2026-09-23T08:16:00Z" },
  "api_keys": { "used": 2, "limit": 10 },
  "custom_domains": { "used": 1, "limit": 3 },
  "bulk": { "max_items": 100 },
  "retention_days": 730,
  "link_ttl_days": 0,
  "features": ["qr", "analytics_full", "tags", "export", "custom_slug", "password", "expiry", "utm", "bulk", "api", "webhooks"]
}
Hibák Csak azok, amelyeket bármely végpont visszaadhat.

Fiók

A hívó: a kulcs tulajdonosának fiókja.

GET /me

Fiókod és a használt kulcs

Profil, csomag és lejárat, funkciók, korlátok és használat, valamint a hívást végző kulcs a kérésszámlálójával.

Kérés
curl https://pik.li/api/v1/me \
  -H "Authorization: Bearer $PIKLI_KEY"
Válasz · 200
{
  "id": 1042,
  "username": "anna",
  "email": "[email protected]",
  "name": "Anna Rossi",
  "status": "active",
  "confirmed": true,
  "locale": "it",
  "plan": "premium",
  "plan_name": "Premium",
  "interval": "monthly",
  "plan_expires_at": "2026-10-14T23:59:59.000+02:00",
  "api_enabled": true,
  "features": ["qr", "analytics_full", "tags", "export", "custom_slug", "password", "expiry", "utm", "bulk", "api", "webhooks"],
  "limits": {
    "links_per_day": 0, "links_per_month": 2500, "clicks_per_month": 150000,
    "retention_days": 730, "link_ttl_days": 0, "custom_domains": 3, "api_rpm": 600
  },
  "usage": {
    "links_today": 9, "links_this_month": 412, "clicks_this_month": 38120,
    "links_quota_used": 412, "links_quota_limit": 2500, "links_total": 3187
  },
  "api_key": {
    "id": 55, "name": "CRM production", "prefix": "pk_live_Xq3v",
    "created_at": "2026-09-02T16:40:10.311+02:00", "last_used_at": "2026-09-23T10:15:42.020+02:00", "requests_count": 18230
  },
  "created_at": "2026-03-11T09:12:47.664+01:00"
}
Hibák Csak azok, amelyeket bármely végpont visszaadhat.

Fiókstatisztika

Linkjeid összesített számai a felhasználói felület szűrőivel: ablak, domain, címke, bot. A közös paraméterekhez lásd Statisztikai időablakok.

GET /stats

Fiókstatisztika egy hívásban

Fiókösszesítők, az előzővel összehasonlított ablak, idősor, az első 10 hivatkozó és ország, az első 6 eszköz, böngésző és operációs rendszer, valamint a 10 legkattintottabb link. A többi /stats végpont külön, hosszabb listákkal adja vissza a részeket.

Paraméterek
  • period string lekérdezési karakterlánc

    Ablak: 24h, 7d (alapértelmezés), 30d, 90d, 1y, all.

  • from string lekérdezési karakterlánc

    Az ablak kezdete a period helyett: dátum vagy ISO 8601 időpont.

  • to string lekérdezési karakterlánc

    Az ablak vége (alapértelmezés: most).

  • interval string lekérdezési karakterlánc

    hour vagy day, az idősor lépésköze.

  • domain string lekérdezési karakterlánc

    Csak ez a hostname-ként megadott domain (például lnkz.li). Sajátodnak kell lennie; lásd GET /domains.

  • tag string lekérdezési karakterlánc

    Csak e címkével rendelkező linkek.

  • bots string lekérdezési karakterlánc

    1 a botkattintások számlálásához.

Kérés
curl "https://pik.li/api/v1/stats?period=7d" \
  -H "Authorization: Bearer $PIKLI_KEY"
Válasz · 200
{
  "window": {
    "from": "2026-09-17T00:00:00+02:00",
    "to": "2026-09-23T10:15:42+02:00",
    "days": 7,
    "interval": "day",
    "period": "7d",
    "clamped": false,
    "retention_days": 730,
    "previous": { "from": "2026-09-10T00:00:00+02:00", "to": "2026-09-17T00:00:00+02:00" }
  },
  "filters": { "bots": false },
  "totals": {
    "links": 3187, "active_links": 2954, "clicks": 402118, "unique_clicks": 288930,
    "clicks_today": 1204, "links_active_24h": 214, "links_created_in_window": 61
  },
  "period": { "clicks": 21480, "uniques": 15522, "links_clicked": 690, "clicks_per_link": 31.1 },
  "previous": { "clicks": 19870, "uniques": 14410, "links_clicked": 655, "clicks_per_link": 30.3, "delta_pct": 8.1, "uniques_delta_pct": 7.7 },
  "timeseries": {
    "interval": "day",
    "points": [
      { "at": "2026-09-17", "clicks": 2890, "uniques": 2104 },
      { "at": "2026-09-18", "clicks": 3120, "uniques": 2240 }
    ]
  },
  "referrers": [{ "referrer": "instagram.com", "clicks": 5210, "share": 24.3 }],
  "direct": 8740,
  "countries": [{ "country": "IT", "clicks": 12877, "share": 59.9 }],
  "devices": [{ "device": "mobile", "clicks": 14002, "share": 65.2 }],
  "browsers": [{ "browser": "Chrome", "clicks": 9406, "share": 43.8 }],
  "os": [{ "os": "iOS", "clicks": 7340, "share": 34.2 }],
  "top_links": [{
    "id": 4821,
    "short_url": "https://lnkz.li/spring-sale",
    "slug": "spring-sale",
    "domain": "lnkz.li",
    "target_url": "https://example.com/shop/spring-sale",
    "target_host": "example.com",
    "title": "Spring sale",
    "description": null,
    "tags": ["promo", "newsletter"],
    "status": "active",
    "moderation": "allowed",
    "active": true,
    "expired": false,
    "password_protected": false,
    "clicks": 1284,
    "unique_clicks": 902,
    "last_clicked_at": "2026-09-23T09:58:12.431+02:00",
    "expires_at": null,
    "max_clicks": null,
    "disabled_reason": null,
    "utm": { "source": "newsletter", "medium": "email", "campaign": "spring" },
    "preview_url": "https://lnkz.li/spring-sale+",
    "qr_url": "https://pik.li/api/v1/links/4821/qr",
    "created_at": "2026-09-01T08:30:05.117+02:00",
    "updated_at": "2026-09-01T08:30:05.117+02:00",
    "clicks_in_window": 311,
    "uniques_in_window": 240
  }]
}
GET /stats/timeseries

Kattintások időben

Kattintások és egyedi látogatók óránként vagy naponta, az előző ablak összegével és százalékos változásával.

Paraméterek
  • period string lekérdezési karakterlánc

    Ablak: 24h, 7d (alapértelmezés), 30d, 90d, 1y, all.

  • from string lekérdezési karakterlánc

    Az ablak kezdete a period helyett: dátum vagy ISO 8601 időpont.

  • to string lekérdezési karakterlánc

    Az ablak vége (alapértelmezés: most).

  • interval string lekérdezési karakterlánc

    hour vagy day, az idősor lépésköze.

  • domain string lekérdezési karakterlánc

    Csak ez a hostname-ként megadott domain (például lnkz.li). Sajátodnak kell lennie; lásd GET /domains.

  • tag string lekérdezési karakterlánc

    Csak e címkével rendelkező linkek.

  • bots string lekérdezési karakterlánc

    1 a botkattintások számlálásához.

Kérés
curl "https://pik.li/api/v1/stats/timeseries?period=24h" \
  -H "Authorization: Bearer $PIKLI_KEY"
Válasz · 200
{
  "window": {
    "from": "2026-09-22T10:15:42+02:00",
    "to": "2026-09-23T10:15:42+02:00",
    "days": 1,
    "interval": "hour",
    "period": "24h",
    "clamped": false,
    "retention_days": 730,
    "previous": { "from": "2026-09-21T10:15:42+02:00", "to": "2026-09-22T10:15:42+02:00" }
  },
  "filters": { "bots": false },
  "interval": "hour",
  "clicks": 3308,
  "previous_clicks": 2977,
  "delta_pct": 11.1,
  "points": [
    { "at": "2026-09-22T08:00:00Z", "clicks": 131, "uniques": 97 },
    { "at": "2026-09-22T09:00:00Z", "clicks": 158, "uniques": 120 }
  ]
}
GET /stats/referrers

A kattintások forrása

A legtöbb kattintást hozó oldalak, részesedésükkel együtt, valamint a hivatkozó nélküli (direct) kattintások.

Paraméterek
  • period string lekérdezési karakterlánc

    Ablak: 24h, 7d (alapértelmezés), 30d, 90d, 1y, all.

  • from string lekérdezési karakterlánc

    Az ablak kezdete a period helyett: dátum vagy ISO 8601 időpont.

  • to string lekérdezési karakterlánc

    Az ablak vége (alapértelmezés: most).

  • domain string lekérdezési karakterlánc

    Csak ez a hostname-ként megadott domain (például lnkz.li). Sajátodnak kell lennie; lásd GET /domains.

  • tag string lekérdezési karakterlánc

    Csak e címkével rendelkező linkek.

  • bots string lekérdezési karakterlánc

    1 a botkattintások számlálásához.

  • limit integer lekérdezési karakterlánc

    Listánként 1–50 sor (alapértelmezés: 10).

Kérés
curl "https://pik.li/api/v1/stats/referrers?period=30d&limit=5" \
  -H "Authorization: Bearer $PIKLI_KEY"
Válasz · 200
{
  "window": {
    "from": "2026-09-17T00:00:00+02:00",
    "to": "2026-09-23T10:15:42+02:00",
    "days": 7,
    "interval": "day",
    "period": "7d",
    "clamped": false,
    "retention_days": 730,
    "previous": { "from": "2026-09-10T00:00:00+02:00", "to": "2026-09-17T00:00:00+02:00" }
  },
  "filters": { "bots": false },
  "clicks": 21480,
  "direct": 8740,
  "referrers": [
    { "referrer": "instagram.com", "clicks": 5210, "share": 24.3 },
    { "referrer": "google.com", "clicks": 3011, "share": 14.0 }
  ]
}
GET /stats/countries

Országok és városok

Országok ISO-kóddal és részesedéssel; a cities a teljes statisztikát tartalmazó csomagokban érhető el.

Paraméterek
  • period string lekérdezési karakterlánc

    Ablak: 24h, 7d (alapértelmezés), 30d, 90d, 1y, all.

  • from string lekérdezési karakterlánc

    Az ablak kezdete a period helyett: dátum vagy ISO 8601 időpont.

  • to string lekérdezési karakterlánc

    Az ablak vége (alapértelmezés: most).

  • domain string lekérdezési karakterlánc

    Csak ez a hostname-ként megadott domain (például lnkz.li). Sajátodnak kell lennie; lásd GET /domains.

  • tag string lekérdezési karakterlánc

    Csak e címkével rendelkező linkek.

  • bots string lekérdezési karakterlánc

    1 a botkattintások számlálásához.

  • limit integer lekérdezési karakterlánc

    Listánként 1–50 sor (alapértelmezés: 10).

Kérés
curl "https://pik.li/api/v1/stats/countries?period=30d" \
  -H "Authorization: Bearer $PIKLI_KEY"
Válasz · 200
{
  "window": {
    "from": "2026-09-17T00:00:00+02:00",
    "to": "2026-09-23T10:15:42+02:00",
    "days": 7,
    "interval": "day",
    "period": "7d",
    "clamped": false,
    "retention_days": 730,
    "previous": { "from": "2026-09-10T00:00:00+02:00", "to": "2026-09-17T00:00:00+02:00" }
  },
  "filters": { "bots": false },
  "clicks": 21480,
  "countries": [
    { "country": "IT", "clicks": 12877, "share": 59.9 },
    { "country": "DE", "clicks": 2630, "share": 12.2 }
  ],
  "cities": [
    { "city": "Milano", "clicks": 3120, "share": 14.5 },
    { "city": "Roma", "clicks": 2210, "share": 10.3 }
  ]
}
GET /stats/devices

Eszközök, böngészők, rendszerek és nyelvek

Négy lista egy hívásban, mindegyik kattintásszámmal és összesített részesedéssel.

Paraméterek
  • period string lekérdezési karakterlánc

    Ablak: 24h, 7d (alapértelmezés), 30d, 90d, 1y, all.

  • from string lekérdezési karakterlánc

    Az ablak kezdete a period helyett: dátum vagy ISO 8601 időpont.

  • to string lekérdezési karakterlánc

    Az ablak vége (alapértelmezés: most).

  • domain string lekérdezési karakterlánc

    Csak ez a hostname-ként megadott domain (például lnkz.li). Sajátodnak kell lennie; lásd GET /domains.

  • tag string lekérdezési karakterlánc

    Csak e címkével rendelkező linkek.

  • bots string lekérdezési karakterlánc

    1 a botkattintások számlálásához.

  • limit integer lekérdezési karakterlánc

    Listánként 1–50 sor (alapértelmezés: 10).

Kérés
curl "https://pik.li/api/v1/stats/devices?period=30d" \
  -H "Authorization: Bearer $PIKLI_KEY"
Válasz · 200
{
  "window": {
    "from": "2026-09-17T00:00:00+02:00",
    "to": "2026-09-23T10:15:42+02:00",
    "days": 7,
    "interval": "day",
    "period": "7d",
    "clamped": false,
    "retention_days": 730,
    "previous": { "from": "2026-09-10T00:00:00+02:00", "to": "2026-09-17T00:00:00+02:00" }
  },
  "filters": { "bots": false },
  "clicks": 21480,
  "devices": [{ "device": "mobile", "clicks": 14002, "share": 65.2 }, { "device": "desktop", "clicks": 7100, "share": 33.1 }],
  "browsers": [{ "browser": "Chrome", "clicks": 9406, "share": 43.8 }],
  "os": [{ "os": "iOS", "clicks": 7340, "share": 34.2 }],
  "languages": [{ "language": "it", "clicks": 12690, "share": 59.1 }]
}
GET /stats/top

Legkattintottabb linkek

Az ablak legtöbbet kattintott linkjei, mindegyiknél clicks_in_window és uniques_in_window.

Paraméterek
  • period string lekérdezési karakterlánc

    Ablak: 24h, 7d (alapértelmezés), 30d, 90d, 1y, all.

  • from string lekérdezési karakterlánc

    Az ablak kezdete a period helyett: dátum vagy ISO 8601 időpont.

  • to string lekérdezési karakterlánc

    Az ablak vége (alapértelmezés: most).

  • domain string lekérdezési karakterlánc

    Csak ez a hostname-ként megadott domain (például lnkz.li). Sajátodnak kell lennie; lásd GET /domains.

  • tag string lekérdezési karakterlánc

    Csak e címkével rendelkező linkek.

  • bots string lekérdezési karakterlánc

    1 a botkattintások számlálásához.

  • limit integer lekérdezési karakterlánc

    Listánként 1–50 sor (alapértelmezés: 10).

Kérés
curl "https://pik.li/api/v1/stats/top?period=7d&limit=10" \
  -H "Authorization: Bearer $PIKLI_KEY"
Válasz · 200
{
  "window": {
    "from": "2026-09-17T00:00:00+02:00",
    "to": "2026-09-23T10:15:42+02:00",
    "days": 7,
    "interval": "day",
    "period": "7d",
    "clamped": false,
    "retention_days": 730,
    "previous": { "from": "2026-09-10T00:00:00+02:00", "to": "2026-09-17T00:00:00+02:00" }
  },
  "filters": { "bots": false },
  "clicks": 21480,
  "links": [{
    "id": 4821,
    "short_url": "https://lnkz.li/spring-sale",
    "slug": "spring-sale",
    "domain": "lnkz.li",
    "target_url": "https://example.com/shop/spring-sale",
    "target_host": "example.com",
    "title": "Spring sale",
    "description": null,
    "tags": ["promo", "newsletter"],
    "status": "active",
    "moderation": "allowed",
    "active": true,
    "expired": false,
    "password_protected": false,
    "clicks": 1284,
    "unique_clicks": 902,
    "last_clicked_at": "2026-09-23T09:58:12.431+02:00",
    "expires_at": null,
    "max_clicks": null,
    "disabled_reason": null,
    "utm": { "source": "newsletter", "medium": "email", "campaign": "spring" },
    "preview_url": "https://lnkz.li/spring-sale+",
    "qr_url": "https://pik.li/api/v1/links/4821/qr",
    "created_at": "2026-09-01T08:30:05.117+02:00",
    "updated_at": "2026-09-01T08:30:05.117+02:00",
    "clicks_in_window": 311,
    "uniques_in_window": 240
  }]
}

Címkék

A linkjeidre helyezett címkék.

GET /tags

Címkéid

Linkjeid minden címkéje, a címkét viselő linkek és kattintásaik számával, a leggyakoribbal kezdve.

Paraméterek
  • q string lekérdezési karakterlánc

    Csak az ezt a szöveget tartalmazó címkék.

Kérés
curl https://pik.li/api/v1/tags \
  -H "Authorization: Bearer $PIKLI_KEY"
Válasz · 200
{
  "tags": [
    { "name": "promo", "links": 214, "clicks": 90211 },
    { "name": "newsletter", "links": 58, "clicks": 20473 }
  ],
  "total": 2
}
Hibák Csak azok, amelyeket bármely végpont visszaadhat.

Domainek

A rövid linkjeid lehetséges helyei.

GET /domains

Használható domainjeid

A csomagodban engedélyezett pik.li-domainek és ellenőrzött egyéni domainjeid, az alapértelmezett megjelölésével és az egyéni domainkorláttal. Link létrehozásakor a hostname értékét add át domain néven.

Kérés
curl https://pik.li/api/v1/domains \
  -H "Authorization: Bearer $PIKLI_KEY"
Válasz · 200
{
  "domains": [
    { "id": 1, "hostname": "lnkz.li", "base_url": "https://lnkz.li", "kind": "system", "min_plan": "free", "status": "active", "verified": true, "default": true },
    { "id": 318, "hostname": "go.example.com", "base_url": "https://go.example.com", "kind": "custom", "min_plan": "free", "status": "active", "verified": true, "default": false }
  ],
  "default": "lnkz.li",
  "custom_domains": { "used": 1, "limit": 3 }
}
Hibák Csak azok, amelyeket bármely végpont visszaadhat.

WebhookokCsomagok: Premium · Business

A felhasználói felület Webhook oldalán beállítható webhookok kezelése kódból. A kézbesítést az alábbi Webhook rész ismerteti.

GET /webhooks

Webhookjaid listázása

Webhookjaid és a feliratkozható események. A secret létrehozás után többé nem látható.

Kérés
curl https://pik.li/api/v1/webhooks \
  -H "Authorization: Bearer $PIKLI_KEY"
Válasz · 200
{
  "webhooks": [{
    "id": 17,
    "url": "https://example.com/hooks/pikli",
    "events": ["link.created", "link.disabled"],
    "active": true,
    "failures_count": 0,
    "last_delivered_at": "2026-09-22T18:04:11.520+02:00",
    "created_at": "2026-09-10T11:20:33.004+02:00",
    "updated_at": "2026-09-10T11:20:33.004+02:00",
    "signature_header": "X-Pikli-Signature"
  }],
  "events": ["link.created", "link.clicked", "link.disabled", "link.deleted"]
}
GET /webhooks/:id

Webhook lekérése

A webhook utolsó 20 kézbesítésével és a szervered által visszaadott állapottal.

Paraméterek
  • id integer az útvonalban kötelező

    A webhook id értéke.

Kérés
curl https://pik.li/api/v1/webhooks/17 \
  -H "Authorization: Bearer $PIKLI_KEY"
Válasz · 200
{
  "id": 17,
  "url": "https://example.com/hooks/pikli",
  "events": ["link.created", "link.disabled"],
  "active": true,
  "failures_count": 0,
  "last_delivered_at": "2026-09-22T18:04:11.520+02:00",
  "created_at": "2026-09-10T11:20:33.004+02:00",
  "updated_at": "2026-09-10T11:20:33.004+02:00",
  "signature_header": "X-Pikli-Signature",
  "deliveries": [
    { "id": 903, "event": "ping", "response_code": 200, "attempts": 1, "delivered_at": "2026-09-22T18:04:11.520+02:00", "created_at": "2026-09-22T18:04:11.520+02:00" }
  ]
}
POST /webhooks

Webhook létrehozása

A válasz csak ekkor tartalmazza a kézbesítések aláírásához használt secret értéket; azonnal mentsd el.

Paraméterek
  • url string JSON-törzs kötelező

    A kézbesítést fogadó, internetről elérhető http:// vagy https:// cím.

  • events array | string JSON-törzs

    Fogadandó események tömbként vagy vesszővel elválasztva; hiányában mind.

  • active boolean JSON-törzs

    false a szüneteltetett létrehozáshoz; alapból true.

Kérés
curl -X POST https://pik.li/api/v1/webhooks \
  -H "Authorization: Bearer $PIKLI_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/hooks/pikli","events":["link.created","link.disabled"]}'
Válasz · 201
{
  "id": 17,
  "url": "https://example.com/hooks/pikli",
  "events": ["link.created", "link.disabled"],
  "active": true,
  "failures_count": 0,
  "last_delivered_at": null,
  "created_at": "2026-09-10T11:20:33.004+02:00",
  "updated_at": "2026-09-10T11:20:33.004+02:00",
  "signature_header": "X-Pikli-Signature",
  "secret": "ec307f56cfac71856a10d641eee7dd58e0eb8286"
}
PATCH /webhooks/:id

Webhook módosítása

Csak a változásokat küldd: címet, eseményeket vagy az active értéket a kézbesítések szüneteltetéséhez és folytatásához.

A(z) PUT is használható, azonos paraméterekkel.

Paraméterek
  • id integer az útvonalban kötelező

    A webhook id értéke.

  • url string JSON-törzs

    Új cím.

  • events array | string JSON-törzs

    Az események új, nem üres listája.

  • active boolean JSON-törzs

    false szünetelteti, true folytatja a kézbesítést.

Kérés
curl -X PATCH https://pik.li/api/v1/webhooks/17 \
  -H "Authorization: Bearer $PIKLI_KEY" \
  -H "Content-Type: application/json" \
  -d '{"active":false}'
Válasz · 200
{
  "id": 17,
  "url": "https://example.com/hooks/pikli",
  "events": ["link.created", "link.disabled"],
  "active": false,
  "failures_count": 0,
  "last_delivered_at": "2026-09-22T18:04:11.520+02:00",
  "created_at": "2026-09-10T11:20:33.004+02:00",
  "updated_at": "2026-09-23T10:15:42.118+02:00",
  "signature_header": "X-Pikli-Signature"
}
DELETE /webhooks/:id

Webhook törlése

A kézbesítések leállnak, előzményeik a webhookkal együtt törlődnek.

Paraméterek
  • id integer az útvonalban kötelező

    A webhook id értéke.

Kérés
curl -X DELETE https://pik.li/api/v1/webhooks/17 \
  -H "Authorization: Bearer $PIKLI_KEY"
Válasz · 204
Nincs törzs: az állapotkód mindent elmond.
POST /webhooks/:id/test

Próbakézbesítés küldése

Egy ping eseményt állít sorba a webhook címére, minden kézbesítéshez hasonlóan aláírva. Ez az aláírás-ellenőrző kód leggyorsabb próbája. Rövidesen elindul, majd megjelenik a GET /webhooks/:id válaszában.

Paraméterek
  • id integer az útvonalban kötelező

    A webhook id értéke.

Kérés
curl -X POST https://pik.li/api/v1/webhooks/17/test \
  -H "Authorization: Bearer $PIKLI_KEY"
Válasz · 202
{
  "queued": true,
  "event": "ping",
  "webhook_id": 17
}

WebhookokCsomagok: Premium · Business

A webhook a szervered címe, amelyet a pik.li POST kéréssel hív meg fiókeseménykor. Létrehozhatod a felhasználói felület Webhook oldalán vagy a(z) webhook-végpontok használatával.

Események

ping
Próbakézbesítés a felhasználói felület Teszt gombjával vagy POST /webhooks/:id/test hívással.
link.created
Link készült a felhasználói felületen vagy API-n keresztül. hamarosan
link.clicked
Valaki rákattintott egyik linkedre. hamarosan
link.disabled
Egy linket te vagy a moderáció letiltott. hamarosan
link.deleted
Egy linket töröltek. hamarosan
A linkesemények már kiválaszthatók, de kézbesítésük még nem indult; jelenleg csak a próba-pinget küldjük.

A kézbesítés felépítése

POST kérés hárommezős JSON-törzzsel: event, az esemény neve; created_at, a küldés ideje; data, az esemény részletei. Fejlécei:

Ezt kapja a szervered
POST /hooks/pikli HTTP/1.1
Content-Type: application/json
X-Pikli-Event: ping
X-Pikli-Signature: sha256=bdaf35d42413498dab7fea8be1f292c36b690152e5ec7d66e6dd2c2cd0b2d61c

{"event":"ping","created_at":"2026-09-23T10:15:42+02:00","data":{"message":"pik.li webhook test","at":"2026-09-23T10:15:42+02:00","via":"api"}}
Content-Type
mindig application/json.
X-Pikli-Event
az esemény törzzsel egyező neve, amely alapján olvasás előtt irányíthatod a kérést.
X-Pikli-Signature
sha256= és a törzs aláírása az alábbiak szerint.

Aláírás ellenőrzése

Minden kézbesítést a webhook csak létrehozáskor megkapott secret értéke ír alá. Az X-Pikli-Signature fejlécben sha256= után a nyers törzs HMAC-SHA256 értéke áll hexadecimálisan. Számítsd ki ugyanezt a fogadott bájtokon, még JSON-dekódolás előtt, és állandó idejű összehasonlítást használj. Eltéréskor válaszolj 401-gyel, és hagyd figyelmen kívül a kérést.

Teszteléshez: a fenti példa ec307f56cfac71856a10d641eee7dd58e0eb8286 secret értékével a bemutatott törzs pontosan a fejlécben látható aláírást adja.

Node.js
import crypto from "node:crypto";
import express from "express";

const app = express();

app.post("/hooks/pikli", express.raw({ type: "application/json" }), (req, res) => {
  const expected = "sha256=" + crypto
    .createHmac("sha256", process.env.PIKLI_WEBHOOK_SECRET)
    .update(req.body)
    .digest("hex");
  const received = req.get("X-Pikli-Signature") || "";
  const valid = received.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(received), Buffer.from(expected));
  if (!valid) return res.sendStatus(401);

  const event = JSON.parse(req.body);
  res.sendStatus(204);
});
Python
import hashlib, hmac, os
from flask import Flask, abort, request

app = Flask(__name__)
SECRET = os.environ["PIKLI_WEBHOOK_SECRET"].encode()

@app.post("/hooks/pikli")
def pikli_hook():
    body = request.get_data()
    expected = "sha256=" + hmac.new(SECRET, body, hashlib.sha256).hexdigest()
    if not hmac.compare_digest(expected, request.headers.get("X-Pikli-Signature", "")):
        abort(401)
    event = request.get_json()
    return "", 204
Ruby
class PikliHooksController < ActionController::API
  def create
    body = request.raw_post
    expected = "sha256=" + OpenSSL::HMAC.hexdigest("SHA256", ENV.fetch("PIKLI_WEBHOOK_SECRET"), body)
    received = request.headers["X-Pikli-Signature"].to_s
    return head(:unauthorized) unless ActiveSupport::SecurityUtils.secure_compare(expected, received)

    event = JSON.parse(body)
    head :no_content
  end
end
PHP
<?php
$body = file_get_contents('php://input');
$expected = 'sha256=' . hash_hmac('sha256', $body, getenv('PIKLI_WEBHOOK_SECRET'));
$received = $_SERVER['HTTP_X_PIKLI_SIGNATURE'] ?? '';
if (!hash_equals($expected, $received)) {
    http_response_code(401);
    exit;
}
$event = json_decode($body, true);
http_response_code(204);

Válaszok, újrapróbálás és hibák

  • A lehető leghamarabb válaszolj bármely 2xx állapottal, a lassú műveleteket végezd később.
  • Ha a pik.li nem éri el a címedet – hálózati hiba, elutasított kapcsolat vagy nem nyilvános cím miatt –, legfeljebb 5 kísérlet történik növekvő szünetekkel; az utolsó körülbelül hat perccel az első után.
  • A 400 vagy nagyobb válasz rögzítésre kerül, de nem ismételjük. A webhook failures_count értéke eggyel nő, sikeres kézbesítéskor nullázódik.
  • Az utolsó 20 kézbesítés és szervered válaszállapota a GET /webhooks/:id válaszában és a Webhook oldalon található.
  • A címnek nyilvánosnak kell lennie; a pik.li nem hív magán- vagy helyi hálózatot. Használj https:// címet a titkosított kézbesítéshez.

OpenAPI

Ugyanez a referencia géppel olvasható formában a(z) /openapi.json címen érhető el (OpenAPI 3.1). Importáld Postmanbe, Insomniába vagy Brunóba, illetve készíts klienst az openapi-generatorral.

Hiányzik valami, vagy eltérően működik? Írj a(z) [email protected] címre.