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

pik.li API

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

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

مقدمة

تتيح واجهة pik.li API لبرامجك أن تفعل ما تفعله لوحة التحكم: إنشاء الروابط القصيرة وتعديلها، وقراءة إحصاءاتها، وعرض وسومك ونطاقاتك، وإدارة الـ 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
الروابط الجديدة
3 في اليوم
الروابط في كل استدعاء بالجملة
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 سقف قدره 600 طلب في الدقيقة إلى pik.li ككل، أيًا كانت الخطة.

الأخطاء

الطلب الذي يفشل يتلقى دائمًا استجابة بالشكل نفسه، أيًا كانت نقطة النهاية، مع رمز حالة 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. تختار الواجهة اللغة من المعامل 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].