pik.li
الإصدار 1 · مستقر

واجهة API لـ pik.li

أنشئ روابطك القصيرة وعدّلها وقِس أداءها من كودك الخاص. واجهة REST تستقبل JSON وتعيده، ومفتاح لكل تكامل، وكل نقطة نهاية موثّقة هنا بطلب واستجابة حقيقية.

احصل على مفتاح API OpenAPI 3.1
العنوان الأساسيhttps://pik.li/api/v1

مقدمة

تتيح واجهة API لـ pik.li لبرامجك أن تفعل ما تفعله أنت من لوحة التحكم: إنشاء الروابط القصيرة وتعديلها، وقراءة إحصاءاتها، وعرض وسومك ونطاقاتك، وإدارة Webhooks. تعمل الواجهة عبر HTTPS، ويبدأ كل مسار بالعنوان الأساسي الظاهر أعلاه.

  • أرسل جسم الطلب بصيغة JSON مع Content-Type: application/json، أما معلمات طلبات GET فتوضع في سلسلة الاستعلام. الاستجابات دائمًا JSON بترميز UTF-8، باستثناء رمز QR فهو صورة.
  • الإصدار جزء من المسار (/api/v1)، وكل استجابة تحمل الترويسة X-Api-Version: 1. قد تظهر حقول جديدة في استجابات v1 مع مرور الوقت: اجعل كودك يتجاهل ما لا يعرفه منها.
  • التواريخ والأوقات سلاسل ISO 8601 مع فرق التوقيت (2026-09-23T10:15:42.118+02:00)؛ أما التواريخ وحدها فتأتي بالشكل 2026-09-23.
  • المعرّفات أعداد صحيحة. ويمكن أيضًا العثور على رابط انطلاقًا من رابطه القصير عبر GET /links/lookup.

البدء السريع

  1. أنشئ مفتاحًا في لوحة التحكم (راجع إنشاء مفتاح) واحفظه في متغير بيئة.
  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.

الترويسة
Authorization: Bearer pk_live_3kZ9vQeX1mT0bR7yNw2aLp4sUc8dHf6J

تعمل الترويسة X-API-Key أيضًا. ولا تزال معلمة الاستعلام api_key مقبولة للعملاء القدامى، لكن تجنّبها: فعناوين URL ينتهي بها المطاف في السجلات وفي سجلّ التصفح.

تبدأ المفاتيح بـ pk_live_ يليها 32 حرفًا. يرى المفتاح بالضبط ما يراه حسابه — روابطه ونطاقاته ووسومه وإحصاءاته وWebhooks الخاصة به — وكل مفاتيح الحساب الواحد تستطيع فعل الأشياء نفسها: لا توجد مفاتيح للقراءة فقط.

تعامل مع المفتاح كما تتعامل مع كلمة المرور. أبقِه على خادمك، ولا تضعه أبدًا في كود يعمل في المتصفح أو في تطبيق توزّعه على الآخرين. إذا تسرّب مفتاح، فأبطله وأنشئ مفتاحًا جديدًا: الأمر لا يستغرق سوى عشر ثوانٍ.

إنشاء مفتاح

  1. سجّل الدخول وافتح API والمفاتيح في لوحة التحكم.
  2. أعطِ المفتاح اسمًا يذكّرك بمكان استخدامه (مثلًا CRM الإنتاج) ثم اضغط إنشاء مفتاح.
  3. انسخ المفتاح فورًا: لوحة التحكم تعرضه مرة واحدة فقط.
  4. يمكنك الاحتفاظ بما يصل إلى 10 مفاتيح فعّالة. تعرض الصفحة لكل مفتاح متى استُخدم آخر مرة وعدد الطلبات التي أجراها، وتتيح لك إبطاله: بدءًا من الاستدعاء التالي يتلقى المفتاح المُبطَل 401 unauthorized.

من يمكنه استخدام API

يأتي الوصول إلى API مع الخطط المدفوعة (Premium و Business). ولا تتضمنه الخطة Base، إلا إذا فعّله فريق pik.li للخطة المجانية أو لحسابك. وفي كل الأحوال يجب أن يكون عنوان البريد الإلكتروني للحساب مؤكَّدًا، وألا يكون الحساب محظورًا أو معلَّقًا.

إذا لم يتحقق أحد هذه الشروط تجيب الواجهة بـ api_disabled أو email_unconfirmed أو account_blocked.

Base

فقط إذا فعّلها فريق العمل
الطلبات في الدقيقة
60
الروابط الجديدة
1,200 في الشهر
الروابط في كل استدعاء بالجملة
10
مدة حفظ الإحصاءات
بالأيام: 90
Webhooks
لا

Premium

واجهة API مضمّنة
الطلبات في الدقيقة
600
الروابط الجديدة
2,500 في الشهر
الروابط في كل استدعاء بالجملة
100
مدة حفظ الإحصاءات
بالأيام: 730
Webhooks
نعم

Business

واجهة API مضمّنة
الطلبات في الدقيقة
3,000
الروابط الجديدة
10,000 في الشهر
الروابط في كل استدعاء بالجملة
100
مدة حفظ الإحصاءات
بالأيام: 1,095
Webhooks
نعم

هذه هي القيم القياسية لكل خطة، تُقرأ مباشرة من إعدادات الأسعار. أما قيمك أنت، مع أي تعديل أجراه فريق العمل على حسابك، فتعيدها GET /limits وGET /me.

حدود معدل الطلبات

يستطيع كل مفتاح إجراء عدد من الطلبات في الدقيقة يتوقف على الخطة (راجع الجدول أعلاه). ويبدأ العدّ من جديد مع بداية كل دقيقة.

X-RateLimit-Limit
الطلبات المسموح بها لهذا المفتاح في الدقيقة
X-RateLimit-Remaining
الطلبات المتبقية في الدقيقة الحالية
X-RateLimit-Reset
موعد بدء العدّ من جديد، بتوقيت Unix بالثواني
Retry-After
في استجابة 429 فقط: عدد الثواني التي يجب انتظارها

عند تجاوز الحد تجيب الواجهة بـ 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"
}
  • الاستدعاءات بلا مفتاح محدودة بـ 30 في الدقيقة لكل عنوان IP (لا يُحتسب GET /ping).
  • وفوق ذلك، لكل عنوان IP سقفٌ للطلبات في الدقيقة إلى pik.li ككل قدره 600، أيًا كانت الخطة.

الأخطاء

الطلب الذي يفشل يتلقى دائمًا استجابة بالشكل نفسه، أيًا كانت نقطة النهاية، مع رمز حالة HTTP يطابق المشكلة.

الاستجابة
{
  "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
معرّف ثابت موجّه لكودك. لا يتغير أبدًا ولا يُترجَم أبدًا.
message
جملة موجّهة للبشر، بلغة الطلب (راجع «اللغات»).
details
بيانات منظّمة عندما تفيد: الحقول غير الصالحة، والقيم المسموح بها، وأرقام الحصة. ليست موجودة دائمًا.
docs_url
رابط شرح هذا الرمز، في هذه الصفحة.
request_id
معرّف الطلب، ويُرسَل أيضًا في الترويسة X-Request-Id. اذكره عندما تراسل الدعم.

كل نقطة نهاية تحتاج إلى مفتاح قد تجيب أيضًا بـ unauthorized account_blocked email_unconfirmed api_disabled rate_limited: لذلك لا تتكرر هذه الأخطاء تحت كل نقطة نهاية.

unauthorized401
المفتاح مفقود أو خاطئ أو مُبطَل. تحقّق من الترويسة Authorization ومن أن المفتاح لا يزال يظهر نشطًا في لوحة التحكم.
account_blocked403
الحساب محظور أو معلَّق أو معطّل. تبقى الواجهة مغلقة إلى أن يعود الحساب نشطًا.
email_unconfirmed403
لم يُؤكَّد عنوان البريد الإلكتروني للحساب بعد. اتبع الرابط في رسالة التأكيد، ثم أعد المحاولة.
api_disabled403
لا تتضمن خطة هذا الحساب الوصول إلى API، أو أنه أُوقف لهذا الحساب. راجع «من يمكنه استخدام API».
forbidden403
لا يستطيع المفتاح تنفيذ هذا الإجراء. محجوز
feature_required402
لا تتضمن الخطة الميزة التي تحتاجها نقطة النهاية هذه. يذكر details.feature اسمها، ويذكر details.plan أول خطة تتضمنها.
quota_exceeded402
استُنفدت حصة الروابط لليوم أو للشهر. يحتوي details على limit وused وperiod وresets_at، أي موعد إمكان إنشاء روابط جديدة من جديد.
not_found404
المورد غير موجود، أو حُذف، أو يخص حسابًا آخر.
conflict409
يتعارض الطلب مع الحالة الحالية للمورد. محجوز
invalid422
لم تجتز بعض البيانات التحقق: يسرد details.fields المشكلات حقلًا بحقل، ويسردها details.messages في جمل جاهزة.
domain_not_allowed422
لا يستطيع حسابك استخدام هذا النطاق. يسرد GET /domains النطاقات المتاحة له.
bad_request400
إحدى المعلمات الإلزامية مفقودة، ويذكر details.parameter اسمها.
invalid_json400
جسم الطلب ليس JSON صالحًا. تحقّق من علامات الاقتباس ومن الترويسة Content-Type.
invalid_parameter400
لإحدى المعلمات قيمة لا تعرفها نقطة النهاية. تذكر الرسالة اسم المعلمة، ويسرد details.allowed، عند وجوده، القيم المقبولة.
bulk_empty400
المصفوفة links في الاستدعاء بالجملة فارغة أو مفقودة.
bulk_too_many400
عدد الروابط كبير جدًا في استدعاء واحد بالجملة. details.max هو حد خطتك: قسّم القائمة على عدة استدعاءات.
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، والعدد الإجمالي موجود أيضًا في الترويسة 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 حرفًا، واحد لكل عملية — رقم طلبية، أو UUID.

عندما تصل القيمة نفسها مرة أخرى، بمفتاح API نفسه، خلال 24 ساعة، لا يُنشئ pik.li شيئًا، بل يعيد الاستجابة الأولى مع الترويسة Idempotent-Replayed: true. وهكذا لا ينتج عن طلب مكرر بعد انتهاء المهلة أي نسخة مكررة.

الطلب نفسه، بالمفتاح نفسه، خلال 24 ساعة
HTTP/1.1 201 Created
Idempotent-Replayed: true
Content-Type: application/json; charset=utf-8

الاستجابات ذات الحالة 5xx لا تُحفظ، لذا فإن تكرار الطلب بالقيمة نفسها ينفّذه من جديد. والقيمة الأطول من اللازم تتلقى idempotency_key_invalid.

اللغات

تُكتب رسائل الخطأ بتسع لغات: en it zh ar ru fr de es pt-BR lt hi hu. تختار الواجهة اللغة من المعلمة locale، ثم من الترويسة Accept-Language، ثم من لغة حسابك، وإلا فالإنجليزية. الرسالة وحدها هي التي تتغير: الرموز وأسماء الحقول تبقى كما هي، وكذلك 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
بدلًا من period: تاريخ (2026-09-01) أو وقت بصيغة ISO 8601. القيمة الافتراضية لـ to هي الآن، ولـ from هي 30 يومًا قبل to؛ والتاريخ في to يُحتسب حتى نهاية ذلك اليوم.
interval
hour أو day، خطوة السلسلة الزمنية. النوافذ حتى 48 ساعة تكون بالساعة افتراضيًا، والأطول منها باليوم؛ والسلسلة بالساعة تغطي 7 أيام كحد أقصى.
window.clamped
لا تمتد النافذة أبدًا إلى ما قبل السجل الذي تحتفظ به خطتك (retention_days). وعندما تُقتطع، تكون قيمة window.clamped هي true.
bots
تُستبعد نقرات الروبوتات. أضف bots=1 لاحتسابها أيضًا؛ كما تعرضها إحصاءات الرابط الواحد منفصلة في period.bots.

نقاط النهاية

كل نقطة نهاية مع معلماتها، وطلب يمكنك لصقه في الطرفية، واستجابة حقيقية، مختصرة حيث تكون القائمة طويلة. تقرأ الأمثلة المفتاح من $PIKLI_KEY، كما في البدء السريع.

الخدمة

هل الواجهة تعمل، وكم تبقّى من خطتك.

GET /ping بلا مفتاح

التحقق من أن الواجهة تعمل

لا تحتاج إلى مفتاح: مخصّصة لفحوص الصحة. تعيد وقت الخادم وعنوانَي هذا التوثيق وملف OpenAPI.

الطلب
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"
}
الأخطاء لا شيء: نقطة النهاية هذه لا تحتاج إلى مفتاح.
GET /limits

ما تبقّى من حصصك

الروابط التي لا تزال متاحة اليوم أو هذا الشهر، والنقرات المسجَّلة، ونافذة حد المعدّل الجارية، والمفاتيح والنطاقات المخصّصة المستخدمة، والحجم الأقصى للاستدعاء بالجملة. كل رقم يشمل التعديلات التي قد يكون فريق العمل أجراها على حسابك.

الطلب
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"]
}
الأخطاء فقط الأخطاء التي قد تعيدها كل نقاط النهاية.

الحساب

من يُجري الاستدعاء: الحساب الذي يملك المفتاح.

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"
}
الأخطاء فقط الأخطاء التي قد تعيدها كل نقاط النهاية.

إحصاءات الحساب

أرقام كل روابطك مجتمعة، مع عوامل التصفية في لوحة التحكم: النافذة، والنطاق، والوسم، والروبوتات. راجع «نوافذ الإحصاءات» للمعلمات المشتركة.

GET /stats

إحصاءات الحساب في استدعاء واحد

إجماليات الحساب، والنافذة مقارنة بالسابقة، والسلسلة الزمنية، وأول 10 مُحيلين وبلدان، وأول 6 أجهزة ومتصفحات وأنظمة تشغيل، وأكثر 10 روابط نقرًا. أما نقاط النهاية الأخرى تحت /stats فتعيد كل جزء منفردًا، بقوائم أطول.

المعلمات
  • period string سلسلة الاستعلام

    النافذة: 24h، 7d (الافتراضي)، 30d، 90d، 1y، all. راجع «نوافذ الإحصاءات».

  • from string سلسلة الاستعلام

    بداية النافذة، بدلًا من period: تاريخ أو وقت بصيغة ISO 8601.

  • 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
  }]
}
GET /stats/timeseries

النقرات عبر الزمن

النقرات والزوار الفريدون لكل ساعة أو لكل يوم، مع إجمالي النافذة السابقة ونسبة التغيّر المئوية.

المعلمات
  • period string سلسلة الاستعلام

    النافذة: 24h، 7d (الافتراضي)، 30d، 90d، 1y، all. راجع «نوافذ الإحصاءات».

  • from string سلسلة الاستعلام

    بداية النافذة، بدلًا من period: تاريخ أو وقت بصيغة ISO 8601.

  • 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 }
  ]
}
GET /stats/referrers

من أين تأتي النقرات

المواقع التي أرسلت أكثر النقرات، ولكل منها حصتها من الإجمالي، والنقرات بلا مُحيل (direct).

المعلمات
  • period string سلسلة الاستعلام

    النافذة: 24h، 7d (الافتراضي)، 30d، 90d، 1y، all. راجع «نوافذ الإحصاءات».

  • from string سلسلة الاستعلام

    بداية النافذة، بدلًا من period: تاريخ أو وقت بصيغة ISO 8601.

  • 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 }
  ]
}
GET /stats/countries

البلدان والمدن

البلدان برموز ISO، مع حصة كل منها؛ وتتوفر cities مع الخطط التي تتضمن الإحصاءات الكاملة.

المعلمات
  • period string سلسلة الاستعلام

    النافذة: 24h، 7d (الافتراضي)، 30d، 90d، 1y، all. راجع «نوافذ الإحصاءات».

  • from string سلسلة الاستعلام

    بداية النافذة، بدلًا من period: تاريخ أو وقت بصيغة ISO 8601.

  • 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 }
  ]
}
GET /stats/devices

الأجهزة والمتصفحات والأنظمة واللغات

أربع قوائم في استدعاء واحد، لكل عنصر فيها النقرات وحصته من الإجمالي.

المعلمات
  • period string سلسلة الاستعلام

    النافذة: 24h، 7d (الافتراضي)، 30d، 90d، 1y، all. راجع «نوافذ الإحصاءات».

  • from string سلسلة الاستعلام

    بداية النافذة، بدلًا من period: تاريخ أو وقت بصيغة ISO 8601.

  • 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 }]
}
GET /stats/top

الروابط الأكثر نقرًا

الروابط التي حصدت أكثر النقرات في النافذة، ولكل منها clicks_in_window وuniques_in_window.

المعلمات
  • period string سلسلة الاستعلام

    النافذة: 24h، 7d (الافتراضي)، 30d، 90d، 1y، all. راجع «نوافذ الإحصاءات».

  • from string سلسلة الاستعلام

    بداية النافذة، بدلًا من period: تاريخ أو وقت بصيغة ISO 8601.

  • 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
  }]
}

الوسوم

الوسوم التي تضعها على روابطك.

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
}
الأخطاء فقط الأخطاء التي قد تعيدها كل نقاط النهاية.

النطاقات

أين يمكن أن تُستضاف روابطك القصيرة.

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 }
}
الأخطاء فقط الأخطاء التي قد تعيدها كل نقاط النهاية.

Webhooksالخطط: Premium · Business

أدِر من كودك Webhooks التي تُعدّها عادةً في صفحة Webhooks في لوحة التحكم. وتجد شرح آلية التسليم في قسم Webhooks أدناه.

GET /webhooks

عرض Webhooks الخاصة بك

Webhooks الخاصة بك والأحداث التي يمكنك الاشتراك فيها. لا يُعرض السر مرة أخرى أبدًا بعد الإنشاء.

الطلب
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 واحد

Webhook مع آخر 20 عملية تسليم والحالة التي أجاب بها خادمك على كل منها.

المعلمات
  • id integer في المسار إلزامي

    قيمة id لـ Webhook.

الطلب
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 لإيقاف عمليات التسليم مؤقتًا واستئنافها.

يُقبل PUT أيضًا، بالمعلمات نفسها.

المعلمات
  • id integer في المسار إلزامي

    قيمة id لـ Webhook.

  • 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 لـ Webhook.

الطلب
curl -X DELETE https://pik.li/api/v1/webhooks/17 \
  -H "Authorization: Bearer $PIKLI_KEY"
الاستجابة · 204
لا محتوى في الاستجابة: رمز الحالة يكفي.
الأخطاء feature_required not_found
POST /webhooks/:id/test

إرسال تسليم تجريبي

يضع ping في قائمة الانتظار إلى عنوان Webhook، موقّعًا مثل كل تسليم: إنها أسرع طريقة لاختبار كود التحقق من التوقيع لديك. يُرسَل بعد لحظات ويظهر في GET /webhooks/:id.

المعلمات
  • id integer في المسار إلزامي

    قيمة id لـ Webhook.

الطلب
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

Webhooksالخطط: Premium · Business

Webhook عنوان على خادمك يستدعيه pik.li بطلب POST عندما يحدث شيء في حسابك. يمكنك إنشاؤه من صفحة Webhooks في لوحة التحكم أو عبر نقاط نهاية Webhooks.

الأحداث

ping
التسليم التجريبي، يُرسَل عندما تضغط «اختبار» في لوحة التحكم أو تستدعي POST /webhooks/:id/test.
link.created
أُنشئ رابط، من لوحة التحكم أو من الواجهة. قريبًا
link.clicked
نقر أحدهم على أحد روابطك. قريبًا
link.disabled
عُطّل رابط، سواء عطّلته أنت أو عطّله الإشراف. قريبًا
link.deleted
حُذف رابط. قريبًا
يمكن من الآن اختيار أحداث الروابط في Webhook، لكن تسليمها لم يبدأ بعد: لا يرسل pik.li حاليًا سوى ping الاختبار.

كيف يبدو التسليم

طلب 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
sha256= متبوعًا بتوقيع الجسم، كما هو موضّح أدناه.

التحقق من التوقيع

كل تسليم موقّع بسرّ Webhook الخاص به، الذي تتلقاه مرة واحدة عند إنشائه. تحمل الترويسة X-Pikli-Signature القيمة sha256= متبوعة بـ HMAC-SHA256 للجسم الخام، بالنظام الست عشري. احسب HMAC نفسه على البايتات التي تلقيتها — قبل تحويلها إلى JSON، لأن ذلك قد يغيّرها — وقارن السلسلتين في زمن ثابت. إذا اختلفتا، فأجب بـ 401 وتجاهل الطلب.

لاختبار كودك: مع السر 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 وفي صفحة Webhooks في لوحة التحكم.
  • يجب أن يكون العنوان عامًا: لا يستدعي pik.li الشبكات الخاصة أو المحلية. استخدم https:// كي تنتقل عمليات التسليم مشفّرة.

OpenAPI

المرجع نفسه بصيغة قابلة للقراءة آليًا منشور على /openapi.json (OpenAPI 3.1). استورده في Postman أو Insomnia أو Bruno، أو ولّد عميلًا باستخدام openapi-generator.

هل ينقص شيء، أو لا يعمل كما تقول هذه الصفحة؟ راسلنا على [email protected].