اربط نظامك برودكس
واجهة برمجية بسيطة لربط متجرك أو تطبيقك أو نظام التوصيل أو أي نظام داخلي بالمحاسبة والفوترة الإلكترونية في رودكس.
المصادقة
كل شركة على رودكس لها نظام مستقل برابط خاص، مثل https://mycompany.rowdx.com. من داخل النظام: الإعدادات ← المطورون (API) أنشئ مفتاحًا، واختر صلاحيته (قراءة فقط، أو قراءة وكتابة). السر يظهر مرة واحدة.
Authorization: token <api_key>:<api_secret>
احفظ السر في الخادم عندك فقط، ولا تضعه في تطبيق جوال أو صفحة ويب يراها العميل. ويمكنك إلغاء أي مفتاح في أي وقت من نفس الصفحة.
أول طلب
كل نقاط الوصول بالشكل: https://<company>.rowdx.com/api/method/rowdx.v1.<resource>.<action>، والرد JSON داخل المفتاح message.
curl https://mycompany.rowdx.com/api/method/rowdx.v1.me \
-H "Authorization: token KEY:SECRET"
{"message": {"company": "شركة الأفق", "currency": "SAR", "country": "Saudi Arabia", "scope": "write", "version": "1"}}نقاط الوصول
طلبات GET بباراميترات في الرابط، وطلبات POST بجسم JSON (أو form). القوائم ترجع {"data": [...], "limit", "offset"}.
| الطريقة | الوصف | الباراميترات | |
|---|---|---|---|
| GET | rowdx.v1.me | بيانات الشركة والمفتاح (لاختبار الاتصال) | |
| GET | rowdx.v1.customers.list | قائمة العملاء | q, limit (حتى 200), offset, modified_since |
| GET | rowdx.v1.customers.get | عميل واحد مع المستحق عليه | id |
| POST | rowdx.v1.customers.create | إضافة عميل | name, mobile, email, vat_number, type (individual | company) |
| POST | rowdx.v1.customers.update | تعديل عميل | id + الحقول المراد تعديلها |
| GET | rowdx.v1.items.list | قائمة الأصناف | q, limit, offset, modified_since |
| GET | rowdx.v1.items.get | صنف واحد مع كمياته في المستودعات | code |
| POST | rowdx.v1.items.create | إضافة صنف | code, name, price, unit, group, is_stock, barcode |
| POST | rowdx.v1.items.update | تعديل صنف | code + الحقول |
| GET | rowdx.v1.items.stock | الكميات في المستودعات | code (اختياري) |
| GET | rowdx.v1.invoices.list | فواتير المبيعات | customer, from_date, to_date, status, limit, offset, modified_since |
| GET | rowdx.v1.invoices.get | فاتورة بالأصناف وحالة الفوترة الإلكترونية | id |
| POST | rowdx.v1.invoices.create | إنشاء فاتورة (واعتمادها) | items*, customer أو customer_name, date, due_date, submit, reference, taxes_included, paid, mode_of_payment |
| POST | rowdx.v1.invoices.submit | اعتماد فاتورة مسودة | id |
| POST | rowdx.v1.invoices.cancel | إلغاء فاتورة | id |
| GET | rowdx.v1.invoices.link | رابط عرض الفاتورة وPDF والدفع | id |
| POST | rowdx.v1.payments.create | سند قبض على فاتورة | invoice*, amount, mode_of_payment, reference |
| GET | rowdx.v1.webhooks.list | الـ Webhooks المسجلة والأحداث المتاحة | |
| POST | rowdx.v1.webhooks.create | تسجيل Webhook | event*, url* (https), secret |
| POST | rowdx.v1.webhooks.delete | حذف Webhook | id |
إنشاء فاتورة
أرسل الأصناف بالكود (SKU) أو بالاسم، والعميل بالمعرّف أو بالاسم (يُنشأ تلقائيًا لو غير موجود). reference رقم الطلب عندك، ويمنع إنشاء نفس الفاتورة مرتين. الضريبة تُحسب من قالب الضريبة الافتراضي للشركة.
curl -X POST https://mycompany.rowdx.com/api/method/rowdx.v1.invoices.create \
-H "Authorization: token KEY:SECRET" -H "Content-Type: application/json" \
-d '{
"customer_name": "مؤسسة الأفق التجارية",
"reference": "ORDER-10045",
"items": [
{"code": "COF-250", "qty": 2, "rate": 35},
{"name": "خدمة توصيل", "qty": 1, "rate": 15, "service": 1}
],
"taxes_included": 0,
"paid": 1,
"mode_of_payment": "Cash"
}'
الرد: الفاتورة بالأصناف والإجماليات وحالة الفوترة الإلكترونية (einvoice.status). ولرابط PDF للعميل: rowdx.v1.invoices.link?id=...
الفاتورة المعتمدة والمبلّغة للجهة الضريبية لا تُلغى؛ لتصحيحها أصدر إشعارًا دائنًا من النظام.
Webhooks
سجّل رابطًا (https) لحدث، وسيصلك طلب POST بجسم JSON عند وقوعه. لو أرسلت secret، يُوقَّع الجسم بـ HMAC-SHA256 (base64) في الترويسة X-Frappe-Webhook-Signature.
الأحداث: invoice.submitted invoice.cancelled payment.created customer.created customer.updated item.created item.updated
curl -X POST https://mycompany.rowdx.com/api/method/rowdx.v1.webhooks.create \
-H "Authorization: token KEY:SECRET" -H "Content-Type: application/json" \
-d '{"event": "invoice.submitted", "url": "https://example.com/rowdx", "secret": "my-secret"}'
// ما يصلك:
{"event": "invoice.submitted", "data": {"id": "ACC-SINV-2026-00042", "date": "2026-10-23",
"customer": "مؤسسة الأفق", "currency": "SAR", "net": 85.0, "tax": 12.75, "total": 97.75, "outstanding": 0, "reference": "ORDER-10045"}}الأخطاء والحدود
401 | مفتاح غير صحيح أو ملغي |
403 | المفتاح للقراءة فقط، أو المستخدم ليس له الصلاحية |
404 | السجل غير موجود |
417 | خطأ في البيانات (الرسالة بالعربي في _server_messages) |
429 | تجاوزت الحد: 600 طلب في الدقيقة لكل مفتاح |
JavaScript (Node.js)
const BASE = "https://mycompany.rowdx.com/api/method/rowdx.v1.";
const H = { Authorization: `token ${process.env.ROWDX_KEY}:${process.env.ROWDX_SECRET}`, "Content-Type": "application/json" };
const r = await fetch(BASE + "invoices.create", { method: "POST", headers: H, body: JSON.stringify({
customer_name: "محمد أحمد", reference: "ORDER-1", items: [{ code: "COF-250", qty: 1, rate: 35 }], paid: 1 }) });
const { message: invoice } = await r.json();
console.log(invoice.id, invoice.total);Python
import os, requests
BASE = "https://mycompany.rowdx.com/api/method/rowdx.v1."
H = {"Authorization": f"token {os.environ['ROWDX_KEY']}:{os.environ['ROWDX_SECRET']}"}
items = requests.get(BASE + "items.list", headers=H, params={"limit": 100}).json()["message"]["data"]
for it in items:
print(it["code"], it["name"], it["price"])
رودكس للمطورين