pik.li
संस्करण 1 · स्थिर

pik.li की API

कोड से लिंक बनाएँ, संपादित करें और मापें। REST API में JSON इनपुट व आउटपुट, हर एकीकरण के लिए अलग कुंजी और प्रत्येक endpoint के अनुरोध तथा वास्तविक उत्तर के उदाहरण हैं।

परिचय

pik.li API आपके सॉफ़्टवेयर को उपयोगकर्ता क्षेत्र के काम करने देती है: लिंक बनाना व बदलना, उनके आँकड़े पढ़ना, टैग और डोमेन सूचीबद्ध करना तथा webhook प्रबंधित करना। यह HTTPS पर चलती है और हर पथ ऊपर दिए base URL से शुरू होता है।

  • अनुरोध body को Content-Type: application/json के साथ JSON में भेजें; GET अनुरोध के पैरामीटर query string में जाएँगे। उत्तर हमेशा UTF-8 JSON है, केवल QR code endpoint छवि लौटाता है।
  • संस्करण पथ में स्थिर है (/api/v1) और हर उत्तर में X-Api-Version: 1 हेडर है। v1 उत्तरों में आगे नए फ़ील्ड जुड़ सकते हैं; आपका कोड अज्ञात फ़ील्ड को अनदेखा करे।
  • तारीख और समय ISO 8601 में timezone offset सहित होते हैं (2026-09-23T10:15:42.118+02:00); केवल तारीख 2026-09-23 जैसी होती है।
  • आईडी संख्यात्मक होते हैं। एक लिंक इसके छोटे URL से भी पाया जा सकता है, जैसे GET /links/lookup।

त्वरित शुरुआत

  1. सर्वर के लिए कुंजी बनाएँ (कुंजी बनाना देखें) और उसे environment variable में सुरक्षित रखें।
  2. कनेक्शन जाँचें: GET /me आपका खाता और योजना लौटाता है।
  3. POST /links से पहला लिंक बनाएँ।
टर्मिनल
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"}'

प्रमाणीकरण

GET /ping को छोड़कर हर कॉल में API कुंजी चाहिए। इसे Authorization हेडर में Bearer token के रूप में भेजें।

हेडर
Authorization: Bearer pk_live_3kZ9vQeX1mT0bR7yNw2aLp4sUc8dHf6J

X-API-Key हेडर भी काम करता है। पुराने clients के लिए api_key query parameter समर्थित है, लेकिन उसे न इस्तेमाल करें: URL logs और browser history में आ जाते हैं।

कुंजियाँ pk_live_ से शुरू होकर 32 वर्णों के साथ समाप्त होती हैं। कुंजी आपके पूरे खाते—लिंक, डोमेन, टैग, आँकड़े और webhook—तक पहुँच देती है; खाते की सभी कुंजियों के अधिकार समान हैं।

कुंजी को पासवर्ड की तरह रखें। उसे केवल server पर सुरक्षित रखें, browser या वितरित app में नहीं। उजागर होने पर तुरंत रद्द करके नई कुंजी बनाएँ।

कुंजी बनाएं

  1. लॉग इन करें और उपयोगकर्ता क्षेत्र में API और कुंजी खोलें।
  2. कुंजी को ऐसा नाम दें जिससे उसका उपयोग याद रहे, जैसे CRM production, और कुंजी बनाएँ दबाएँ।
  3. उसे तुरंत कॉपी करें: पूरी कुंजी केवल एक बार दिखती है।
  4. आप अधिकतम 10 सक्रिय कुंजियाँ रख सकते हैं। पेज हर कुंजी का अंतिम उपयोग और अनुरोध संख्या दिखाता है। रद्द की गई कुंजी की अगली कॉल को 401 Unauthorized मिलेगा।

API का उपयोग कौन कर सकता है

API भुगतान योजनाओं (प्रीमियम और व्यापार) में शामिल है। Base योजना में यह डिफ़ॉल्ट रूप से नहीं है, लेकिन pik.li कर्मचारी इसे मुफ़्त में सक्षम कर सकते हैं। खाते का ईमेल पुष्ट होना चाहिए और खाता अवरुद्ध या निलंबित नहीं होना चाहिए।

इनमें से कोई शर्त पूरी न होने पर API api_disabled, email_unconfirmed या account_blocked लौटाती है।

आधार

कर्मचारी अनुरोध पर
प्रति मिनट अनुरोध
60
नए लिंक
1,200 प्रति महीना
बल्क लिंक
10
आँकड़ों की अवधारण
90 दिन
Webhook
नहीं

प्रीमियम

API शामिल
प्रति मिनट अनुरोध
600
नए लिंक
2,500 प्रति महीना
बल्क लिंक
100
आँकड़ों की अवधारण
730 दिन
Webhook
हाँ

व्यापार

API शामिल
प्रति मिनट अनुरोध
3,000
नए लिंक
10,000 प्रति महीना
बल्क लिंक
100
आँकड़ों की अवधारण
1,095 दिन
Webhook
हाँ

ये प्रत्येक प्लान के मानक मान हैं, जो कि कीमतों के सेटिंग्स से रियल-टाइम में पढ़े जाते हैं। आपके मान, जिनमें अपने संहित अधिकारियों द्वारा अपने संहित अकाउंट पर किए गए किसी भी बदलाव शामिल हैं, आपको GET /limits और GET /me में वापस दिखाते हैं।

दर सीमाएँ

हर प्रमाणीकृत उत्तर बताता है कि इस मिनट में कितने अनुरोध उपलब्ध हैं और सीमा कब रीसेट होगी।

X-RateLimit-Limit
आपकी योजना के अनुसार प्रति मिनट अनुमत अनुरोध।
X-RateLimit-Remaining
मौजूदा मिनट में बचे अनुरोध।
X-RateLimit-Reset
सीमा रीसेट होने का Unix timestamp, seconds में।
Retry-After
केवल 429 उत्तर में; दिए गए seconds तक प्रतीक्षा करें।

सीमा पार होने पर 429, त्रुटि rate_limited और Retry-After हेडर मिलता है। बताए समय तक रुकें, फिर कोशिश करें।

उत्तर
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"
}
  • बिना कुंजी वाले endpoint पर हर IP से प्रति मिनट 30 अनुरोध की सीमा है; GET /ping शामिल है।
  • योजना से अलग, हर IP से प्रति मिनट अधिकतम 600 प्रमाणीकृत अनुरोध स्वीकार होते हैं।

त्रुटियाँ

हर विफल अनुरोध समान संरचना और समस्या के अनुरूप HTTP status code लौटाता है।

उत्तर
{
  "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
आपके code के लिए स्थिर पहचानकर्ता; यह बदलता या अनुवादित नहीं होता।
message
उपयोगकर्ता के लिए अनुरोध की भाषा में संदेश; यह बदल सकता है।
details
अमान्य फ़ील्ड, अपेक्षित मान और सीमाओं जैसी संरचित जानकारी; हमेशा मौजूद नहीं।
docs_url
इस कोड के लिए स्पष्टीकरण, जो इस पृष्ठ में दिखाई देता है, के लिए लिंक।
request_id
अनुरोध की विशिष्ट पहचान, जो X-Request-Id हेडर में भी होती है। सहायता से संपर्क करते समय इसे दें।

प्रत्येक अंतरनिर्देश जो एक की अनुप्राणित करने की अनुमति देता है, प्रति मिनट unauthorized account_blocked email_unconfirmed api_disabled rate_limited की अनुप्राणित करने की सीमा देता है: यह नहीं पुनरावृत्ति की जाती है जिनके नीचे प्रत्येक अंतरनिर्देश के लिए।

unauthorized401
API कुंजी नहीं है, गलत है या रद्द हो चुकी है।
account_blocked403
अपना खाता ब्लॉक किया गया, अस्थायी रूप से रोका गया या बंद है। अपने खाते की फाइनलिशन तक तुम्हारी अपेक्षा कोई त्याग नहीं है।
email_unconfirmed403
अपने खाते का ईमेल पता अभी तक सत्यापित नहीं है। ईमेल में दिए गए लिंक को खोलें, फिर पुनः प्रयास करें।
api_disabled403
इस खाते का प्लान लिंक शामिल नहीं करता है, या लिंक इस खाते के लिए निष्क्रिय की गई है। यह देखें कि कौन से लोग लिंक का उपयोग कर सकते हैं।
forbidden403
खाते को यह कार्रवाई करने की अनुमति नहीं है। आरक्षित
feature_required402
यह योजना में उपलब्ध नहीं है जो इस सेवा के लिए आवश्यक है। विस्तारित जानकारी details.feature और details.plan में दी गई है।
quota_exceeded402
दिन की या महीने की लिंक की रिक्ती बार बार बढ़ रही है। विस्तारित जानकारी details द्वारा दी गई है, जो लिंक फिर से बनाने का समय दर्शाती है।
not_found404
संसाधन मौजूद नहीं, हटा दिया गया है या दूसरे खाते का है।
conflict409
कार्रवाई मौजूदा स्थिति से टकराती है। आरक्षित
invalid422
कुछ डेटा सत्यापन से अधिक हैं। विस्तारित जानकारी details.fields और details.messages में दी गई है।
domain_not_allowed422
यह डोमेन इस खाते में इस्तेमाल नहीं किया जा सकता। उपलब्ध डोमेन GET /domains से देखें।
bad_request400
आवश्यक पैरामीटर नहीं है।
invalid_json400
body मान्य JSON नहीं है। Syntax और Content-Type हेडर जाँचें।
invalid_parameter400
एक पैरामीटर एक मान वाला है जो इस एंडपोइंट को जानता नहीं है। जानकारी दिखाती है कि कौन सा पैरामीटर और यदि उपलब्ध है तो details.allowed में वह मान दिखाता है जो स्वीकार्य हैं।
bulk_empty400
थोक अनुरोध में links खाली है या मौजूद नहीं है।
bulk_too_many400
एक ही बार में बहुत से लिंक भेजने से बचें। डिटेल्स.मेक्स तुम्हारे प्लान का सीमित है: इस सूची को अधिक बार में विभाजित करें।
idempotency_key_invalid400
Idempotency-Key हेडर 128 वर्णों से अधिक लंबा है।
rate_limited429
इस मिनट बहुत अधिक अनुरोध हुए। Retry-After में दिए समय तक रुकें, फिर प्रयास करें।

500 उत्तर हमारी ओर की समस्या बताता है। थोड़ी देर बाद फिर कोशिश करें; जारी रहने पर सहायता को X-Request-Id हेडर का मान दें।

पृष्ठांकन

जो कि लंबे समय तक लगातार दिखाई दे सकते हैं, वे पृष्ठों में विभाजित होते हैं: GET /links, GET /links/active और GET /links/:id/clicks.

  • page: आपकी चाहिए गई पृष्ठ, जो 1 से शुरू होती है।
  • per_page: प्रति पृष्ठ कितने अवयव, 1 से 100 तक (स्टैंडर्ड 50 के अनुसार डिफ़ॉल्ट)। limit एक अनुवाद के रूप में स्वीकार किया जाता है।

उत्तर में pagination object और X-Total-Count हेडर में कुल संख्या होती है। next_page के null होने तक अगले पेज माँगते रहें।

उत्तर
{
  "links": [],
  "pagination": { "page": 2, "per_page": 50, "total": 137, "total_pages": 3, "next_page": 3, "prev_page": 1 }
}

दोहराव-रोधी अनुरोध

POST /links, POST /links/bulk और POST /links/generate Idempotency-Key हेडर स्वीकार करते हैं: अधिकतम 128 वर्णों की अपनी string, जैसे operation ID या UUID।

वही मान उसी API कुंजी के साथ 24 घंटों में फिर भेजने पर pik.li नया संसाधन नहीं बनाता; पहला उत्तर और Idempotent-Replayed: true हेडर लौटाता है। timeout के बाद सुरक्षित retry से duplicate नहीं बनता।

वही अनुरोध, वही कुंजी, 24 घंटे के भीतर
HTTP/1.1 201 Created
Idempotent-Replayed: true
Content-Type: application/json; charset=utf-8

5xx उत्तर दर्ज नहीं होते, इसलिए उसी मान से retry अनुरोध फिर चलाता है। बहुत लंबा मान idempotency_key_invalid लौटाता है।

भाषाएँ

त्रुटि संदेश नौ भाषाओं में उपलब्ध हैं: en it zh ar ru fr de es pt-BR lt hi hu। API पहले locale पैरामीटर, फिर Accept-Language हेडर और अंत में खाते की भाषा चुनती है; न मिलने पर अंग्रेज़ी। केवल संदेश अनुवादित होता है; code और फ़ील्ड नाम स्थिर रहते हैं और docs_url इसी भाषा में पृष्ठ खोलता है।

टर्मिनल
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"
}

सांख्यिकीय विवरण

सांख्यिकीय तथ्यांक एक अवधि को पढ़ते हैं और उसकी इस अवधि की तुलना करते हैं, जो उसी अवधि की है: इससे previous और delta_pct आते हैं।

period
24h, 7d, 30d, 90d, 1y या all (तुमको रखने वाले प्लान के रिकॉर्ड की कुल अवधि)। दिनों की संख्या भी काम करती है: period=45, या पुराना days=45। डिफ़ॉल्ट मूल्य खाते के लिए 7d, एक लिंक के लिए 30d और एक लिंक की लिस्ट के लिए all है।
from, to
परिसर की बदलती विधि के बजाय, एक तारिख (जैसे 2026-09-01) या ISO 8601 का समय. यदि इन्हें निर्धारित नहीं करते हैं, तो to वर्तमान समय के साथ बराबर होगा और from to से 30 दिन पहले के साथ बराबर होगा; तारिख to में वह पूरा दिन भी शामिल होगा।
interval
hour या day, एक समय अवधि का चरण। अवधियां तक 48 घंटे तक अवधि के लिए अपने डिफ़ॉल्ट मूल्य के रूप में घंटे की अवधि हैं, और उन अवधियों जो लंबी अवधि की हैं, दिन की अवधि हैं; एक घंटे की अवधि का एक चरण अधिकतम 7 दिनों को कवर करता है।
window.clamped
फ़िल्टर आपकी योजना की अवधारण अवधि (retention_days) से पीछे नहीं जा सकता। काटे जाने पर window.clamped true होता है।
bots
बॉट क्लिक छोड़ दिए गए हैं। उन्हें गणना करने के लिए bots=1 जोड़ें; एक व्यक्तिगत लिंक की टैब्लेट में उन्हें period.bots में भी अलग रखा जाता है।

अंतिम बिंदु

हर endpoint के साथ उसके पैरामीटर, terminal में चिपकाने योग्य अनुरोध और वास्तविक उत्तर दिया गया है; लंबी सूचियाँ संक्षिप्त की गई हैं। त्वरित शुरुआत की तरह उदाहरण $PIKLI_KEY से कुंजी पढ़ते हैं।

सेवा

यदि आपकी API सक्रिय हैं और आपके प्लान में कितना बचा है।

GET /ping बिना कुंजी के

स्वास्थ्य जांच करें

स्वास्थ्य जांच के लिए आवश्यक नहीं: यह स्वास्थ्य जांच के लिए डिजाइन किया गया है। इससे सर्वर की समय स्थिति और यहाँ और यहाँ के फाइल डाक्ट्रेशन और ऑपन API फाइल के लिए जांच लेता है।

अनुरोध
curl https://pik.li/api/v1/ping
उत्तर · 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"
}
त्रुटियाँ कोई प्रमाणीकृत त्रुटि नहीं: इस endpoint को कुंजी नहीं चाहिए।
GET /limits

कितना बाकी है

योजना, API पहुँच, दर सीमा, लिंक कोटा, थोक सीमा, अवधारण अवधि और webhook की वास्तविक सीमाएँ। कर्मचारियों द्वारा खाते पर किए बदलाव भी शामिल हैं।

अनुरोध
curl https://pik.li/api/v1/limits \
  -H "Authorization: Bearer $PIKLI_KEY"
उत्तर · 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"]
}
त्रुटियाँ केवल वे त्रुटियाँ जो हर endpoint पर आ सकती हैं।

खाता

कुंजी किस खाते की है और उसके साथ कौन-सा खाता जुड़ा है।

GET /me

आपका खाता और योजना

प्रोफाइल, प्लान और उनकी अवधि, फंक्शन, सीमा और खपत, और जोड़ा जो आपका खाता कर रहा है, उसके गेम काउंटर।

अनुरोध
curl https://pik.li/api/v1/me \
  -H "Authorization: Bearer $PIKLI_KEY"
उत्तर · 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"
}
त्रुटियाँ केवल वे त्रुटियाँ जो हर endpoint पर आ सकती हैं।

खाता सांख्यिकी

सभी क्षेत्रों में फ़िल्टर किए गए डेटाः खिड़की, प्रशासन, विभाग, कामकाज।

GET /stats

खाता की सांख्यिकियां

खाता विवरण, अंतिम जानकारी, अवधि संबंधी जानकारी, देशों के संदर्भ, डिवाइस, ब्राउज़र और ऑपरेटिंग सिस्टम पर क्लिक किए गए लिंक। अन्य जेंडेपॉइंट/स्टेट्स अलग-अलग हिस्सों को देते हैं, और अधिक सूची प्रस्तुत करते हैं।

मापदंड
  • period string क्वेरी

    फिस्टन: 24h, 7d (स्थैतिक), 30d, 90d, 1y, all. देखें: फिस्टन रिपोर्ट।

  • from string क्वेरी

    फिस्टनेव्हर का शुरुआती तारीख या एक इसो 8601 निर्धारण, जो period का विकल्प है: एक तारीख या समय।

  • to string क्वेरी

    फिनाइल फिनाइलैफिन्स्ट्रा फिनाइलकॉर्डिफेडः

  • interval string क्वेरी

    hour या day, टाइम सीरीज का चरण।

  • domain string क्वेरी

    केवल यह डोमेन, जो होस्टनेम (उदाहरण के लिए lnkz.li) के रूप में दिखाई देता है। यह आपके में से एक होना चाहिए: देखें GET /domains।

  • tag string क्वेरी

    केवल एक ही लिंक है।

  • bots string क्वेरी

    1 बट डाउन क्लिक भी गिने जाएँ।

अनुरोध
curl "https://pik.li/api/v1/stats?period=7d" \
  -H "Authorization: Bearer $PIKLI_KEY"
उत्तर · 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
  }]
}
त्रुटियाँ invalid_parameter domain_not_allowed
GET /stats/timeseries

समय पर क्लिक करें

समय पर क्लिक और अद्वितीय दृश्यकर्ता, अपने राउंड टाइम के कुल और प्रतिशत वृद्धि/कमी के साथ।

मापदंड
  • period string क्वेरी

    फिस्टन: 24h, 7d (स्थैतिक), 30d, 90d, 1y, all. देखें: फिस्टन रिपोर्ट।

  • from string क्वेरी

    फिस्टनेव्हर का शुरुआती तारीख या एक इसो 8601 निर्धारण, जो period का विकल्प है: एक तारीख या समय।

  • to string क्वेरी

    फिनाइल फिनाइलैफिन्स्ट्रा फिनाइलकॉर्डिफेडः

  • interval string क्वेरी

    hour या day, टाइम सीरीज का चरण।

  • domain string क्वेरी

    केवल यह डोमेन, जो होस्टनेम (उदाहरण के लिए lnkz.li) के रूप में दिखाई देता है। यह आपके में से एक होना चाहिए: देखें GET /domains।

  • tag string क्वेरी

    केवल एक ही लिंक है।

  • bots string क्वेरी

    1 बट डाउन क्लिक भी गिने जाएँ।

अनुरोध
curl "https://pik.li/api/v1/stats/timeseries?period=24h" \
  -H "Authorization: Bearer $PIKLI_KEY"
उत्तर · 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 }
  ]
}
त्रुटियाँ invalid_parameter domain_not_allowed
GET /stats/referrers

वे कहाँ से आए

साइटों की सूची जो अधिक बार जाएंगी, प्रत्येक के साथ कुल अनुपात, और अनुपात निर्धारित नहीं किए गए क्लिक (direct)।

मापदंड
  • period string क्वेरी

    फिस्टन: 24h, 7d (स्थैतिक), 30d, 90d, 1y, all. देखें: फिस्टन रिपोर्ट।

  • from string क्वेरी

    फिस्टनेव्हर का शुरुआती तारीख या एक इसो 8601 निर्धारण, जो period का विकल्प है: एक तारीख या समय।

  • to string क्वेरी

    फिनाइल फिनाइलैफिन्स्ट्रा फिनाइलकॉर्डिफेडः

  • domain string क्वेरी

    केवल यह डोमेन, जो होस्टनेम (उदाहरण के लिए lnkz.li) के रूप में दिखाई देता है। यह आपके में से एक होना चाहिए: देखें GET /domains।

  • tag string क्वेरी

    केवल एक ही लिंक है।

  • bots string क्वेरी

    1 बट डाउन क्लिक भी गिने जाएँ।

  • limit integer क्वेरी

    सूची में पंक्तियों की संख्या, 1 से 50 तक (पूर्वनिर्धारित 10)।

अनुरोध
curl "https://pik.li/api/v1/stats/referrers?period=30d&limit=5" \
  -H "Authorization: Bearer $PIKLI_KEY"
उत्तर · 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 }
  ]
}
त्रुटियाँ invalid_parameter domain_not_allowed
GET /stats/countries

देश

देश जैसे ISO कोड, उनके साथ कुल अनुपात; cities पूर्ण सांख्यिकियों को शामिल करने वाले प्लानों के साथ उपलब्ध है।

मापदंड
  • period string क्वेरी

    फिस्टन: 24h, 7d (स्थैतिक), 30d, 90d, 1y, all. देखें: फिस्टन रिपोर्ट।

  • from string क्वेरी

    फिस्टनेव्हर का शुरुआती तारीख या एक इसो 8601 निर्धारण, जो period का विकल्प है: एक तारीख या समय।

  • to string क्वेरी

    फिनाइल फिनाइलैफिन्स्ट्रा फिनाइलकॉर्डिफेडः

  • domain string क्वेरी

    केवल यह डोमेन, जो होस्टनेम (उदाहरण के लिए lnkz.li) के रूप में दिखाई देता है। यह आपके में से एक होना चाहिए: देखें GET /domains।

  • tag string क्वेरी

    केवल एक ही लिंक है।

  • bots string क्वेरी

    1 बट डाउन क्लिक भी गिने जाएँ।

  • limit integer क्वेरी

    सूची में पंक्तियों की संख्या, 1 से 50 तक (पूर्वनिर्धारित 10)।

अनुरोध
curl "https://pik.li/api/v1/stats/countries?period=30d" \
  -H "Authorization: Bearer $PIKLI_KEY"
उत्तर · 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 }
  ]
}
त्रुटियाँ invalid_parameter domain_not_allowed
GET /stats/devices

उपकरण, ब्राउज़र, भाषा प्रणाली

चार जने एक दूसरे को बुलाए, और किसी ने उन्हें नहीं बताया।

मापदंड
  • period string क्वेरी

    फिस्टन: 24h, 7d (स्थैतिक), 30d, 90d, 1y, all. देखें: फिस्टन रिपोर्ट।

  • from string क्वेरी

    फिस्टनेव्हर का शुरुआती तारीख या एक इसो 8601 निर्धारण, जो period का विकल्प है: एक तारीख या समय।

  • to string क्वेरी

    फिनाइल फिनाइलैफिन्स्ट्रा फिनाइलकॉर्डिफेडः

  • domain string क्वेरी

    केवल यह डोमेन, जो होस्टनेम (उदाहरण के लिए lnkz.li) के रूप में दिखाई देता है। यह आपके में से एक होना चाहिए: देखें GET /domains।

  • tag string क्वेरी

    केवल एक ही लिंक है।

  • bots string क्वेरी

    1 बट डाउन क्लिक भी गिने जाएँ।

  • limit integer क्वेरी

    सूची में पंक्तियों की संख्या, 1 से 50 तक (पूर्वनिर्धारित 10)।

अनुरोध
curl "https://pik.li/api/v1/stats/devices?period=30d" \
  -H "Authorization: Bearer $PIKLI_KEY"
उत्तर · 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 }]
}
त्रुटियाँ invalid_parameter domain_not_allowed
GET /stats/top

लिंक जोड़े गए

क्लिक अधिक वाले लिंक, प्रत्येक के साथ clicks_in_window और uniques_in_window।

मापदंड
  • period string क्वेरी

    फिस्टन: 24h, 7d (स्थैतिक), 30d, 90d, 1y, all. देखें: फिस्टन रिपोर्ट।

  • from string क्वेरी

    फिस्टनेव्हर का शुरुआती तारीख या एक इसो 8601 निर्धारण, जो period का विकल्प है: एक तारीख या समय।

  • to string क्वेरी

    फिनाइल फिनाइलैफिन्स्ट्रा फिनाइलकॉर्डिफेडः

  • domain string क्वेरी

    केवल यह डोमेन, जो होस्टनेम (उदाहरण के लिए lnkz.li) के रूप में दिखाई देता है। यह आपके में से एक होना चाहिए: देखें GET /domains।

  • tag string क्वेरी

    केवल एक ही लिंक है।

  • bots string क्वेरी

    1 बट डाउन क्लिक भी गिने जाएँ।

  • limit integer क्वेरी

    सूची में पंक्तियों की संख्या, 1 से 50 तक (पूर्वनिर्धारित 10)।

अनुरोध
curl "https://pik.li/api/v1/stats/top?period=7d&limit=10" \
  -H "Authorization: Bearer $PIKLI_KEY"
उत्तर · 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
  }]
}
त्रुटियाँ invalid_parameter domain_not_allowed

टैग

आपने लिंक पर लगाए गए टैग।

GET /tags

आपके टैग

आपके लिंक पर उपयोग किए गए टैग, जिन लिंकों के द्वारा उन्हें जोड़ा गया है और उन्हें जोड़ने वाले क्लिक, जैसे कि सबसे अधिक उपयोग किए गए टैग से शुरू किया जाता है।

मापदंड
  • q string क्वेरी

    केवल ऐसे टैग जो यह टेक्स्ट को शामिल करते हैं।

अनुरोध
curl https://pik.li/api/v1/tags \
  -H "Authorization: Bearer $PIKLI_KEY"
उत्तर · 200
{
  "tags": [
    { "name": "promo", "links": 214, "clicks": 90211 },
    { "name": "newsletter", "links": 58, "clicks": 20473 }
  ],
  "total": 2
}
त्रुटियाँ केवल वे त्रुटियाँ जो हर endpoint पर आ सकती हैं।

डोमेन

आपके लिंक के लिए उपलब्ध जगह।

GET /domains

आप का प्रयोग कर सकने वाले डोमेन

प्लान द्वारा अनुमोदित pik.li डोमेन और पहचान की जाने वाले आपके आदेश डोमेन, डोमेन का मूल डोमेन क्या है और आपके प्लान द्वारा कितने प्रत्यक्ष डोमेन अनुमोदित किए गए हैं। जब आप एक लिंक बनाते हैं, तो आपको hostname को domain के रूप में पास करना होगा।

अनुरोध
curl https://pik.li/api/v1/domains \
  -H "Authorization: Bearer $PIKLI_KEY"
उत्तर · 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 }
}
त्रुटियाँ केवल वे त्रुटियाँ जो हर endpoint पर आ सकती हैं।

वेबहॉकयोजनाएँ: प्रीमियम · व्यापार

वेबहॉक को आपके कोड से प्रबंधित करें। वेबहॉक कैसे काम करते हैं यह नीचे वेबहॉक भाग में बताया गया है।

GET /webhooks

आपके webhook की सूची

आपके webhook और आप इनमें से किन घटनाओं को सदस्यता दे सकते हैं। घटना का रहस्य बनाने के बाद इसे दिखाया जाता नहीं है।

अनुरोध
curl https://pik.li/api/v1/webhooks \
  -H "Authorization: Bearer $PIKLI_KEY"
उत्तर · 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"]
}
त्रुटियाँ feature_required
GET /webhooks/:id

एक webhook पढ़ें

यह एक बहुत ही महत्वपूर्ण विषय है जो हमें इस बारे में पता चलता है कि आपका सर्वर इन घटनाओं के लिए कैसे प्रतिक्रिया देता है। इसमें अंतिम 20 भेजी गई घटनाएँ और घटनाओं के साथ आपके सर्वर का जवाब शामिल हैं।

मापदंड
  • id integer पथ में अनिवार्य

    वेबहॉक का id।

अनुरोध
curl https://pik.li/api/v1/webhooks/17 \
  -H "Authorization: Bearer $PIKLI_KEY"
उत्तर · 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" }
  ]
}
त्रुटियाँ feature_required not_found
POST /webhooks

एक webhook बनाएँ

उत्तर में secret शामिल है, जिसे घटनाओं को ऑफ़र्सियल करने के लिए उपयोग किया जाता है, इस बार केवल इसके लिए: इसे तुरंत संरक्षित करें।

मापदंड
  • url string JSON बॉडी अनिवार्य

    संपत्ति लेने का एडर, http:// या https://, इंटरनेट से अनुस्यर्णित।

  • events array | string JSON बॉडी

    जो घटनाएँ लेनी चाहिए, जैसे एरे या चिह्नित विराम से अलग। अगर नहीं दिखाए जाएँ: सभी। नीचे घटनाओं की सूची देखें।

  • active boolean JSON बॉडी

    false एक रिक्वाइर्ड रिकॉर्ड बनाने के लिए। प्रतिनिधित्व करता है true।

अनुरोध
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"]}'
उत्तर · 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 संशोधित करें

केवल बदलने वाली चीजें भेजें: आドレス, घटनाएँ, या active को रोकने और फिर से शुरू करने के लिए उपयोग किया जाता है।

यही endpoint उन्हीं पैरामीटरों के साथ PUT भी स्वीकार करता है।

मापदंड
  • id integer पथ में अनिवार्य

    वेबहॉक का id।

  • url string JSON बॉडी

    एक नया एडर।

  • events array | string JSON बॉडी

    नया घटनाएँ की सूची; यह खाली नहीं हो सकता।

  • active boolean JSON बॉडी

    false लिंक की रोकथाम को रोकता है, true लिंक की रोकथाम को सुधारता है।

अनुरोध
curl -X PATCH https://pik.li/api/v1/webhooks/17 \
  -H "Authorization: Bearer $PIKLI_KEY" \
  -H "Content-Type: application/json" \
  -d '{"active":false}'
उत्तर · 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 हटाएँ

घटनाएँ बंद हो जाती हैं और उनका इतिहास उससे एक हटाया जाता है।

मापदंड
  • id integer पथ में अनिवार्य

    वेबहॉक का id।

अनुरोध
curl -X DELETE https://pik.li/api/v1/webhooks/17 \
  -H "Authorization: Bearer $PIKLI_KEY"
उत्तर · 204
सफल होने पर खाली body लौटाता है।
त्रुटियाँ feature_required not_found
POST /webhooks/:id/test

एक परीक्षण भेजें

कोई ping webhook के एडर्स की ओर रिक्वेस्ट किया जाता है, जिसे जैसे हर भेजी गई घटना के रूप में ऑफ़र्सियल किया जाता है: यह रहस्य की जांच करने का सबसे तेज़ तरीका है। यह तेज़ी से शुरू होता है और इसे GET /webhooks/:id में देखा जा सकता है।

मापदंड
  • id integer पथ में अनिवार्य

    वेबहॉक का id।

अनुरोध
curl -X POST https://pik.li/api/v1/webhooks/17/test \
  -H "Authorization: Bearer $PIKLI_KEY"
उत्तर · 202
{
  "queued": true,
  "event": "ping",
  "webhook_id": 17
}
त्रुटियाँ feature_required not_found

वेबहॉकयोजनाएँ: प्रीमियम · व्यापार

एक webhook आपके सर्वर पर एक यूरल है जिसे pik.li अपने खाते में कुछ घटनाओं के दौरान POST रूपांतरण के रूप में अपने सर्वर पर कॉल करता है। आप उसे उपयोगकर्ता क्षेत्र की webhook पृष्ठ से या गैर-प्रोसेस्ड डेटा के माध्यम से भी बना सकते हैं।पॉइंट

विंटलेटर

ping
परीक्षण करते समय, एक परीक्षण लिंक को एक उपयोगकर्ता के वेबहॉक पॉइंट के लिए भेजा जाता है। यह आपके अपलोगी अकाउंट में कुछ घटना के दौरान भेजा जाता है। आप इसे उपयोगकर्ता क्षेत्र के वेबहॉक पॉइंट या API के माध्यम से बनाएं सकते हैं।
link.created
एक लिंक बनाया गया है, या अपलोगी अकाउंट या API के माध्यम से। आ रहा हूँ
link.clicked
किसी ने एक लिंक पर क्लिक किया। आ रहा हूँ
link.disabled
एक लिंक निष्क्रिय है, और एक मॉडरेशन है। आ रहा हूँ
link.deleted
एक लिंक हटा दिया गया है। आ रहा हूँ
लिंक के घटनाएँ वेबहॉक में चुनाव कर सकते हैं, लेकिन उनकी रोकथाम अभी तक शुरू नहीं हुई है: अब तक pik.li केवल परीक्षण पिंग को भेजता है।

कैसे किया गया है

एक POST जो तीन क्षेत्रों का एक JSON शरीर जुड़ा है: event, घटना का नाम; created_at, जब इसे भेजा गया था; data, घटना के विवरण। इसके साथ ये हेडर आते हैं:

आपके सर्वर को क्या मिलता है
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
सदैव application/json।
X-Pikli-Event
घटना का नाम, जो शरीर का स्थिति है। यह आपको रिक्वेस्ट को पहले से ही विभाजित करने में मदद करता है।
X-Pikli-Signature
और उसके बाद शरीर के अंगों का एक चिन्ह, जैसा कि लिखा है,

हस्ताक्षर की जाँच करें

प्रत्येक लॉन्च के साथ, आपके webhook का secret एकल रूप से जब आप उसे बनाते हैं तब ही प्राप्त होता है। शीर्षक X-Pikli-Signature में sha256= फिर बाकी काल्पनिक शरीक के अम्लीय रूप में ग्राउंड बॉडी के HMAC-SHA256 का उपयोग किया जाता है। आपके रिसीव्ड बायट्स पर उसी HMAC का निर्धारण करें — JSON डिकोडिंग से पहले, जो उन्हें परिवर्तित कर देता है — और दोनों शब्दों को अच्छी तरह से तुलना करें। अगर वे अलग हैं, 401 कोड दें और आपकी अनुरोध को नज़रअंदाज करें।

यहाँ ऊपर दिखाए गए उदाहरण के secret ec307f56cfac71856a10d641eee7dd58e0eb8286 का उपयोग करके आपका कोड पर टेस्ट करें: यहाँ दिखाए गए लॉन्च का शरीक दिखाए गए उदाहरण के उपरांत उत्पन्न शायद उत्पन्न हस्ताक्षर को उपलब्ध शीर्षक में दिखाया गया है।

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);

नए प्रयास और असफलता

  • किसी भी स्थिति में, आपको जल्दी से किसी भी रिस्पोन्स के साथ जवाब दें जिसका स्टेट 2xx हो, और धीमी गति से लंबे समय तक अपनी कार्यक्रम को देखें।
  • अगर pik.li आपके एड्रेस पर वास्तव में योग्य रूप से अवश्य नहीं पहुंच सकता — नेटवर्क त्रुटि, जोड़ी निरस्त की गई, या एक निर्यातित एड्रेस — तो लॉन्च तक 5 बार प्रयास किए जाते हैं, जिनमें प्रत्येक प्रयास के बीच अधिक देरी होती है: अंतिम प्रयास पहले प्रयास के लगभग छह मिनट बाद होता है।
  • किसी भी रिस्पोन्स का स्टेट 400 या उससे अधिक होने पर, यह नोट किया जाता है और फिर दोहराया जाता है। failures_count का मूल्य webhook में एक बढ़ता है, जो आपकी पहली रिस्पोन्स के साथ शून्य हो जाता है।
  • क्षेत्र उत्तराधिकारी की उपलब्ध रिकॉर्ड्स के लिए अंतिम 20 लॉन्च का अवलोकन करें, जिसमें आपका सर्वर द्वारा दिया गया स्टेट शामिल है। यह डेटाबेस रिकॉर्ड के लिए GET /webhooks/:id और उपयोगकर्ता क्षेत्र की Webhook पृष्ठ में उपलब्ध है।
  • इंडर्शियल रिक्वाइर्ड होना चाहिए: pik.li लोकाल या इंटरनेट के बाहर की रिक्वाइर्ड को अप्लाइ नहीं करता है। इसलिए इसे https:// का उपयोग करें, ताकि डेटा उपलब्ध रूप से भेजे जाएं।

ओपनएपीआई

इसी समान संदर्भ, एक मशीन पढ़ने वाले फॉर्मेट में, पब्लिक लिंक /openapi.json (OpenAPI 3.1) पर प्रकाशित किया गया है। इसे पोस्टमन, इंसोम्निया या ब्रॉनो में इंपोर्ट करें, या एक क्लाइंट बनाएं जिसके लिए उपयोग किया गया ओपनएपीआई-गनरेटर है।

यदि कुछ अज्ञात है या कुछ यह नहीं काम कर रहा है जैसा कि यह पेज कहता है, तो [email protected] पर लिखें।