نظرة سريعة
العنوان الأساسي للـAPI:
https://api.ecord.app/api/public/v1
- كل الطلبات والردود بصيغة JSON (UTF-8).
- كل مفتاح معزول تماماً داخل مؤسسة واحدة — لا يرى ولا يؤثّر إلا على بيانات مؤسستك.
- المرجع التفاعلي الكامل (كل المسارات والحقول + «جرّبها الآن») على docs.ecord.app/reference.
المصادقة — كيف تحصل على مفتاح API؟
- ادخل لوحة التحكم على app.ecord.app بحساب مدير المؤسسة.
- اذهب إلى الإعدادات ← مفاتيح API.
- اضغط إنشاء مفتاح، اختر الصلاحيات (scopes) المطلوبة، ثم احفظ.
- ⚠️ المفتاح الكامل يظهر مرة واحدة فقط عند الإنشاء. انسخه وخزّنه بأمان — لا يمكن استرجاعه لاحقاً (يُخزَّن مُشفّراً). لو ضاع، ألغِه وأنشئ غيره.
إرسال المفتاح مع كل طلب
بأي من الطريقتين:
Authorization: Bearer <API_KEY>
# أو
X-API-Key: <API_KEY>
اختبار سريع
curl https://api.ecord.app/api/public/v1/ping \
-H "Authorization: Bearer <API_KEY>"
# 200 OK
# { "ok": true, "tenant_id": "...", "scopes": ["orders:read", ...] }
429 — انتظر قليلاً وأعد المحاولة.الصلاحيات (scopes)
كل مفتاح يُمنح صلاحية أو أكثر. الطلب على مسار بدون الصلاحية المطلوبة يرجع 403.
| الصلاحية | تمنح |
|---|---|
| orders:read | قراءة الطلبات |
| customers:read | قراءة العملاء |
| customers:write | إنشاء/تحديث العملاء (upsert) |
| products:read | قراءة المنتجات |
| products:write | إنشاء/تحديث المنتجات (upsert) |
| sales:read | تصدير فواتير المبيعات (للمحاسبة) |
| delivery:write | أفعال مندوب شركة الشحن (مرتبط بمفتاح الشركة) |
الأسطح
الطلبات orders:read
GET /orders — قائمة (فلترة بالحالة + ترقيم صفحات).
GET /orders/{id} — طلب واحد.
العملاء customers:*
GET /customers · GET /customers/{id}
POST /customers — upsert بالـexternal_id أو الهاتف.
PATCH /customers/{id}
المنتجات products:*
GET /products · GET /products/{id}
POST /products — upsert بالـexternal_id.
PATCH /products/{id}
المبيعات sales:read
GET /sales-invoices — فواتير موحّدة (مناديب + شركات) مع فلترة تاريخ.
GET /sales-invoices/{id} — الفاتورة + بنودها.
شركات الشحن delivery:write
GET /driver/orders — الطلبات المُسلَّمة عهدة للشركة.
PATCH /driver/orders/{id}/status
POST /driver/orders/{id}/deliver
Webhooks
اشترك في الأحداث لتصلك تحديثات فورية بدل الاستعلام المتكرر. راجع قسم الـWebhooks.
التفاصيل الكاملة لكل حقل ومَعامِل في المرجع التفاعلي.
أمثلة عملية
1) متجر يزامن عملاءه ومنتجاته
أنشئ/حدّث عميلاً (idempotent — لو موجود بنفس external_id أو الهاتف يُدمج):
curl -X POST https://api.ecord.app/api/public/v1/customers \
-H "Authorization: Bearer <KEY>" -H "Content-Type: application/json" \
-d '{
"external_id": "shopify-88",
"external_platform": "shopify",
"name": "أحمد علي",
"phone": "201000000000"
}'
أنشئ/حدّث منتجاً:
curl -X POST https://api.ecord.app/api/public/v1/products \
-H "Authorization: Bearer <KEY>" -H "Content-Type: application/json" \
-d '{ "external_id": "sku-123", "name": "قميص", "sku": "SH-123", "price": "250.00" }'
2) شركة شحن تحدّث حالة الطلبات
تُنشئ المؤسسة «شركة شحن» من الإعدادات ← مفاتيح API ← شركة شحن جديدة، فينتج مفتاح بصلاحية delivery:write. الشركة ترى فقط الطلبات التي سُلّمت لها عهدةً:
# الطلبات المسلَّمة للشركة
curl https://api.ecord.app/api/public/v1/driver/orders \
-H "Authorization: Bearer <COMPANY_KEY>"
# تحديث الحالة
curl -X PATCH https://api.ecord.app/api/public/v1/driver/orders/<id>/status \
-H "Authorization: Bearer <COMPANY_KEY>" -H "Content-Type: application/json" \
-d '{ "status": "out_for_delivery" }'
# تأكيد التسليم (تحصيل نقدي)
curl -X POST https://api.ecord.app/api/public/v1/driver/orders/<id>/deliver \
-H "Authorization: Bearer <COMPANY_KEY>" -H "Content-Type: application/json" \
-d '{ "type": "full" }'
3) نظام محاسبي يصدّر المبيعات
فاتورة المبيعات = ما تم تحصيله فعلاً للتاجر (من المناديب أو شركات الشحن، موحّد). فلترة بتاريخ التحصيل:
curl "https://api.ecord.app/api/public/v1/sales-invoices?date_from=2026-07-01&date_to=2026-07-31&limit=100" \
-H "Authorization: Bearer <KEY>"
# تفاصيل فاتورة (رأس + بنود فرعية لكل طلب: الإجمالي، العمولة، الصافي)
curl https://api.ecord.app/api/public/v1/sales-invoices/<id> \
-H "Authorization: Bearer <KEY>"
Webhooks
بدل الاستعلام المتكرر، اشترك في الأحداث لتصلك رسالة POST على رابطك فور حدوث الحدث. تُدار من الإعدادات ← Webhooks.
أهم الأحداث
| الحدث | متى |
|---|---|
order.created | إنشاء طلب |
order.status_changed | أي تغيّر حالة (عام) |
order.out_for_delivery | خرج للتوصيل |
order.delivered | تم التسليم |
order.returned / order.cancelled | مرتجع / ملغي |
عند تغيّر الحالة نرسل الحدثين معاً: العام order.status_changed والمحدّد (مثل order.delivered).
التحقق من التوقيع
كل رسالة تحمل ترويسات X-Ecord-Event وX-Ecord-Delivery وX-Ecord-Signature. التوقيع هو "sha256=" + HMAC_SHA256(secret, raw_body):
import hmac, hashlib
def verify(raw_body: bytes, header_sig: str, secret: str) -> bool:
expected = "sha256=" + hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, header_sig or "")
- ردّ بـ
2xxبسرعة (خلال ~10 ثوانٍ). - الفشل/التأخّر يُعاد بتراجع أُسّي (حتى 6 محاولات).
- التسليم at-least-once: قد يصل الحدث أكثر من مرة — أزِل التكرار باستخدام
X-Ecord-Delivery.
الأخطاء
| الرمز | المعنى |
|---|---|
400 | طلب غير صالح |
401 | مفتاح مفقود/غير صالح |
403 | صلاحية ناقصة / غير مسموح |
404 | غير موجود (أو ليس ضمن مؤسستك) |
422 | خطأ تحقق / انتقال حالة غير صالح |
429 | تجاوز حد المعدّل |
جسم الخطأ بالشكل { "detail": "..." }.