للمطوّرين

توثيق API

أنشئ روابطك وأدرها واسحب إحصاءاتها برمجيًا عبر REST API من Quik.mn.

كل الخدمات

كل منتجات منصّة Quik.mn — عبر REST API وعلى الويب.

رابط قصير
REST API
رمز QR
REST API
Email Counter
REST API
Countdown
REST API
Quik Bio
REST API
قائمة QR
REST API
توقيع البريد الإلكتروني
REST API
UTM builder
أدوات مجانية

العنوان الأساسي

تبدأ كل نقاط النهاية من العنوان الأساسي الآتي:

https://quik.mn/api/v1

المصادقة

أرفق مع كل طلب مفتاح API الذي حصلت عليه من لوحة التحكّم في ترويسة Authorization كما يلي:

Authorization: Bearer qk_live_...

لا تشارك مفتاحك مع أحد. وإن تسرّب، أعد إنشاءه من لوحة التحكّم.

نقاط النهاية

رابط قصير
POST /api/v1/links إنشاء رابط قصير جديد
GET /api/v1/links عرض قائمة روابطك
GET /api/v1/links/{id} جلب رابط واحد
PATCH /api/v1/links/{id} تعديل رابط
DELETE /api/v1/links/{id} حذف رابط
POST /api/v1/links/{id}/extend تمديد الصلاحية — جسم الطلب: عدد الأيام 365
رمز QR
GET /api/v1/links/{id}/qr الحصول على رمز QR — مع معاملات الصيغة والحجم ولون الرمز والخلفية
Email Counter
POST /api/v1/timers إنشاء عدّاد بريد — الاستجابة: gif_url + embed_html
GET /api/v1/timers قائمة العدّادات
GET /api/v1/timers/{id} تفاصيل عدّاد واحد
PATCH /api/v1/timers/{id} تعديل عدّاد
DELETE /api/v1/timers/{id} حذف عدّاد
صفحة عدّ تنازلي
POST /api/v1/countdowns إنشاء صفحة Countdown — الاستجابة: page_url
GET /api/v1/countdowns قائمة الصفحات
GET /api/v1/countdowns/{id} تفاصيل صفحة واحدة
PATCH /api/v1/countdowns/{id} تعديل صفحة
DELETE /api/v1/countdowns/{id} حذف صفحة
Quik Bio
POST /api/v1/bio-pages إنشاء صفحة Bio — الاستجابة: page_url (ورفع الصورة الشخصية من الويب فقط)
GET /api/v1/bio-pages عرض قائمة صفحات Bio لديك
GET /api/v1/bio-pages/{id} جلب صفحة Bio واحدة — مع روابطها
PATCH /api/v1/bio-pages/{id} تعديل صفحة Bio
DELETE /api/v1/bio-pages/{id} حذف صفحة Bio
GET /api/v1/bio-pages/{id}/stats إحصاءات Bio — المشاهدات والنقرات
GET /api/v1/bio-pages/{id}/links عرض روابط صفحة Bio
POST /api/v1/bio-pages/{id}/links إضافة رابط إلى Bio
PATCH /api/v1/bio-pages/{id}/links/{lid} تعديل رابط في Bio
DELETE /api/v1/bio-pages/{id}/links/{lid} حذف رابط من Bio
قائمة QR
POST /api/v1/menus إنشاء قائمة طعام — الاستجابة: page_url
GET /api/v1/menus عرض قوائم الطعام لديك
GET /api/v1/menus/{id} جلب قائمة طعام واحدة — مع أصنافها
PATCH /api/v1/menus/{id} تعديل قائمة الطعام
DELETE /api/v1/menus/{id} حذف قائمة الطعام
GET /api/v1/menus/{id}/stats إحصاءات المسح — الإجمالي، و30 يومًا، وبحسب الطاولة
GET /api/v1/menus/{id}/items عرض أصناف القائمة
POST /api/v1/menus/{id}/items إضافة صنف — ورفع الصورة من الويب فقط
PATCH /api/v1/menus/{id}/items/{iid} تعديل صنف
DELETE /api/v1/menus/{id}/items/{iid} حذف صنف
توقيع البريد الإلكتروني
POST /api/v1/signatures إنشاء توقيع — ولا يُقبل الشعار إلا على هيئة URL
GET /api/v1/signatures عرض تواقيعك
GET /api/v1/signatures/{id} جلب توقيع واحد — مع شيفرة HTML الخاصة به
PATCH /api/v1/signatures/{id} تعديل توقيع
DELETE /api/v1/signatures/{id} حذف توقيع
الحساب
GET /api/v1/me بيانات الحساب الحالي

المعاملات

POST /api/v1/links — حقول جسم الطلب:

url required عنوان الوجهة الطويل (بروتوكول عادي أو آمن).
alias optional الاسم المختصر المخصّص (حروف وأرقام و- و_؛ من 1 إلى 64 محرفًا). ويُقبل الاسم المرادف له أيضًا.
title optional العنوان (حتى 200 محرف).
expires_at optional وقت انتهاء الصلاحية — تاريخ في المستقبل (مثل 2026-12-31 23:59:59). الحدّ الأقصى سنة واحدة، وهو الافتراضي عند إغفاله. وإرسال null في طلب PATCH يعيده إلى سنة واحدة.
expire_days optional أو بعدد الأيام: 1/7/30/90/180/365. أسهل من expires_at.
starts_at optional وقت التفعيل — تاريخ ووقت بتوقيت UTC (مثل 2026-08-01 02:00:00). يرى الزوّار عدّادًا تنازليًا حتى الموعد المحدّد، ويجب أن يسبق expires_at. أرسل null في طلب PATCH ليُفعَّل فورًا.
on_duplicate optional عند وجود رابط نشط للعنوان نفسه، إمّا إعادة استخدامه (وهو الافتراضي — يعيد الرابط القائم ومعه حقل يحمل القيمة:true) أو إنشاء رابط جديد. ويُنشأ رابط جديد دائمًا عند تحديد اسم مخصّص.

GET /api/v1/links — معاملات الاستعلام:

limit عدد العناصر في الصفحة الواحدة (من 1 إلى 100، والافتراضي 25).
offset عدد الصفوف المُتجاوَزة (لتصفّح النتائج).
q البحث — يشمل الاسم المختصر والعنوان ورابط الوجهة.

صيغة الخطأ

يعود كل خطأ برمز حالة HTTP (401 أو 404 أو 409 أو 422 أو 429) وببنية JSON موحّدة:

{ "error": "alias_taken", "message": "هذا الاسم المستعار محجوز أو مستخدم بالفعل." }

الرموز الشائعة: unauthorized (401), not_found (404), alias_taken (409), invalid_url / invalid_alias / invalid_expires_at / invalid_starts_at (422), rate_limited (429).

حدود الاستخدام

60 طلبًا في الدقيقة لكل مفتاح API
عند التجاوز يصلك الرمز 429 rate_limited في الاستجابة — انتظر قليلًا ثم أعد المحاولة.

مثال على الطلب

مثال cURL لإنشاء رابط قصير:

curl -X POST https://quik.mn/api/v1/links \
  -H "Authorization: Bearer qk_live_xxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/مسار/طويل/جدا",
    "alias": "promo",
    "title": "حملة الربيع",
    "expires_at": "2026-12-31 23:59:59"
  }'

Webhook

سجّل endpoint في قسم Webhook داخل لوحة التحكّم، وسنرسل طلب POST بصيغة JSON إلى عنوان URL الخاص بك فور وقوع أي حدث تختاره. الاستجابة 2xx تعني النجاح، وإلا أعدنا المحاولة حتى ثلاث مرات بفاصل يتدرّج من دقيقة واحدة إلى عشر دقائق. وبعد عشرة إخفاقات متتالية يُعطَّل webhook تلقائيًا.

link.created عند إنشاء رابط قصير جديد (من الويب أو عبر API)
link.deleted عند حذف رابط
link.expired عند انتهاء صلاحية الرابط أو بلوغه حدّ النقرات (بالفحص اليومي)
link.clicks.milestone عند تجاوز النقرات عتبة 100 أو 1,000 أو 10,000 — وتتضمّن الحمولة حقل المرحلة
timer.expired عند انتهاء عدّاد البريد
countdown.expired عند انتهاء صفحة العدّ التنازلي
webhook.ping حدث تجريبي يُرسَل بزرّ «تجربة»

بنية كل عملية إرسال (مثال):

{
  "event": "link.created",
  "created_at": "2026-07-18T09:30:00+00:00",
  "data": {
    "link": {
      "id": 42, "slug": "promo", "short_url": "https://quik.mn/promo",
      "long_url": "https://example.com/مسار/طويل/جدا", "title": "حملة الربيع",
      "clicks": 0, "active": true, "state": "ok",
      "created_at": "2026-07-18 09:30:00", "expires_at": "2027-07-18 09:30:00"
    }
  }
}

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

يصل كل إرسال مصحوبًا بالترويسات الآتية: X-Quik-Event (اسم الحدث), X-Quik-Signaturesha256=HMAC_SHA256(body, secret). يظهر المفتاح السري مرة واحدة فقط عند إنشاء الخطاف. وتحقّق من التوقيع دائمًا على جسم الطلب الخام وبمقارنة ثابتة الزمن:

<?php
// PHP — تحقق من التوقيع على جسم الطلب الخام (raw)
$payload   = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_QUIK_SIGNATURE'] ?? '';
$expected  = 'sha256=' . hash_hmac('sha256', $payload, $secret);

if (!hash_equals($expected, $signature)) {
    http_response_code(401);
    exit('invalid signature');
}
$event = json_decode($payload, true);
// $event['event'], $event['data'] ...
http_response_code(200);
// Node.js (Express) — تحقق من التوقيع على جسم الطلب الخام (raw)
const crypto = require('crypto');

app.post('/quik-webhook', express.raw({ type: 'application/json' }), (req, res) => {
  const signature = req.get('X-Quik-Signature') || '';
  const expected  = 'sha256=' +
    crypto.createHmac('sha256', secret).update(req.body).digest('hex');

  const a = Buffer.from(expected), b = Buffer.from(signature);
  if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) {
    return res.status(401).send('invalid signature');
  }
  const event = JSON.parse(req.body); // event.event, event.data ...
  res.sendStatus(200);
});

الحدود: باقة Free خطاف واحد، وباقة Pro ثلاثة، وباقة Business عشرة. ويجب أن تكون نقطة النهاية عنوانًا عامًّا متاحًا على الإنترنت (عناوين الشبكات الداخلية محظورة).

احصل على مفتاح API الخاص بك
أنشئ مفتاحًا من قسم API في لوحة التحكّم وابدأ فورًا.
الحصول على مفتاح API