مرجع للمطورين
مرجع تقني لبناء سكريبت Deluge مخصص يرسل بيانات الفاتورة أو الإيصال إلى TaxBridge بالصيغة التي تحددها أنت.
رابط أساسي
https://taxbridge-backend.biinnovate.com/apiكل المسارات في هذه الصفحة نسبية لهذا الرابط.
كل طلب يتطلب عنصرين معًا:
| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
X-TaxBridge-Token | هيدر | نعم | كود سري 64 حرفًا، خاص بشركتك — يُنسخ من الإعدادات |
organization_id | حقل في الجسم | نعم | رقم مؤسسة Zoho — يجب أن يطابق الحساب المربوط بشركتك |
توكن مفقود أو غير صحيح يُرجع 401 — وعدم تطابق organization_id يُرجع 401 كمان، بنفس الرسالة بالظبط. الاختلاف بينهم مقصود إنه مايبانش: لو رجّعنا كود مختلف، الكود نفسه كان هيبقى دليل إن التوكن صحيح. لا يوجد طبقة مصادقة أخرى (لا JWT ولا صفحة API keys).
حدود معدل الطلبات (rate limit) تُطبَّق لكل توكن، وليس لكل IP — نظرًا لأن خوادم Zoho تشارك نفس عناوين الـ IP بين شركات متعددة.
النموذج الأساسي: سكريبت الـ Deluge الخاص بك يبني ويرسل العقد كاملًا — أنت من يحدد المستلم وتاريخ الإصدار والبنود، بدلًا من إرسال رقم الفاتورة وترك TaxBridge يستعلم من Zoho مرة أخرى. هذا يوفر نداءات API على حسابك وحساب Zoho، ويتيح لك تشكيل بياناتك كما تريد. يتحقق TaxBridge من العقد ويحوّله مباشرة إلى نفس الصيغة التي يستهلكها محرّك بناء المستند الضريبي — دون إعادة تفسير.
| الـ Endpoint | موديول Zoho |
|---|---|
POST /zoho/invoice-payload[-bulk] | الفواتير |
POST /zoho/creditnote-payload[-bulk] | إشعارات الدائن |
POST /zoho/debitnote-payload[-bulk] | الفواتير (type = debit_note) |
الحقول المشتركة
| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
contract_version | integer | نعم | ثابت = 1 |
organization_id | string | نعم | رقم مؤسسة Zoho |
zoho_invoice_id | string | نعم | معرّف Zoho — للإشعارات: zoho_creditnote_id |
invoice_number | string | نعم | رقم المستند — للإشعارات: creditnote_number |
issue_date | string | نعم | YYYY-MM-DD — لا يكون مستقبليًا ولا أقدم من 7 أيام |
currency_code | string | نعم | EGP, USD, ... |
exchange_rate | number | إذا لم تكن العملة EGP | سعر الصرف مقابل الجنيه |
receiver.id | string | لا | 9 أرقام = رقم ضريبي، 14 = رقم قومي، فارغ = مجهول |
receiver.name | string | نعم | اسم المستلِم — إجباري للفواتير والإشعارات (اختياري للإيصالات فقط). خُذه من كارت العميل، لا من النسخة المخزّنة على المستند |
receiver.address | object | لا | governate, regionCity, street, postalCode (الرقم البريدي)؛ buildingNumber اختياري — لو مبعتّهوش تاكس بريدج بيحط placeholder |
customer_id | string | لا | معرّف العميل في Zoho — للتدقيق فقط. TaxBridge لا يستعلم من Zoho إطلاقًا: الرقم الضريبي/القومي والعنوان يجب أن يصلا في receiver |
lines[] | array | نعم | description, quantity, unit_price (الثلاثة إجبارية، والكمية والسعر أكبر من صفر) + discount, discount_rate, unit_type, eta_item_code (اختيارية). 200 بند كحد أقصى |
lines[].discount | number | لا | قيمة الخصم على البند بالعملة (مش نسبة). لو أغفلته يُرفع البند بسعره قبل الخصم. ولا ترسل خصمًا يساوي قيمة البند بالضبط — بند صافيه صفر يُرفع حاليًا بسعره الكامل |
lines[].discount_rate | number | لو فيه discount | ⚠️ نسبة الخصم المئوية. لو بعتّ discount من غيره، القيمة نفسها تُرفع كنسبة — خصم 50 جنيه يُرفع كـ "خصم 50%". ابعت الاتنين دائمًا |
lines[].unit_type | string | لا | كود وحدة القياس لدى الضرائب. الافتراضي EA (قطعة) — لو بتبيع بالوزن أو الحجم ابعت الكود الصحيح |
lines[].eta_item_code | string | لا | كود GS1/EGS للصنف. لو أغفلته يُستخدم الكود المسجَّل للصنف في TaxBridge (مطابقة بالاسم)، ثم كود الشركة الافتراضي |
extra_discount | number | لا | خصم على مستوى المستند كله. افتراضي 0 — القوالب الجاهزة لا ترسله |
po_reference | string | لا | رقم أمر الشراء (Order Number) — يترفع كـ purchaseOrderReference |
resubmit | boolean | لا | true = إعادة رفع متعمَّدة لمستند سبق إلغاؤه لدى الضرائب. بدونه يُرد resubmit_required بدل الرفع. في الإرسال الجماعي يوضع مرة واحدة في جذر الطلب، لا داخل كل مستند |
triggered_by | string | لا | للتدقيق فقط — انظر أدناه |
{
"contract_version": 1,
"organization_id": "20012345678",
"zoho_invoice_id": "123456",
"invoice_number": "INV-001",
"issue_date": "2026-07-19",
"currency_code": "EGP",
"exchange_rate": 1,
"receiver": {
"name": "شركة العميل",
"id": "123456789",
"address": { "governate": "Cairo", "regionCity": "Nasr City",
"street": "١٢ شارع الطيران", "postalCode": "11765" }
},
"customer_id": "3616396000000392101",
"lines": [
{ "description": "خدمة", "quantity": 2, "unit_price": 250,
"discount": 50, "discount_rate": 10,
"eta_item_code": "EG-XXXXXXXXX-001", "unit_type": "EA" }
],
"extra_discount": 0,
"po_reference": "PO-2026-01",
"triggered_by": "user@company.com"
}إشعارات المدين تتطلب إضافيًا referenced_invoice_number (الفاتورة الأصلية — يجب أن تكون مقبولة على الضرائب مسبقًا). إشعارات الدائن تقبله اختياريًا — يمكن إرسال إشعار دائن مستقل بدون فاتورة مرجعية (ETA تعتبره optional لنوع "C"). إشعارات المدين وحدها تقبل أيضًا reason اختياريًا.
ما الذي يوقف المستند قبل رفعه
المستند المرفوع للضرائب لا يمكن تصحيحه — يحتاج إلغاءً أو إشعار خصم. لذلك تُرفض هذه الحالات قبل الرفع، لا بعده:
| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
| نص متكسّر | كل الحسابات | يرفض | وجود "؟؟" أو حرف الاستبدال في اسم أو عنوان المستلِم — النص يُرفع للضرائب حرفيًا |
| رقم مستلِم غير صالح | كل الحسابات | يرفض | receiver.id ليس 9 أرقام ولا 14 |
| رقم مستلِم فارغ | اختياري لكل حساب | يرفض إذا فُعِّل | الافتراضي مسموح (بيع تجزئة حقيقي). فعّله لو كل عملائك شركات مسجّلة — يمنع رفع شركة كمستهلك مجهول |
| عملة غير الجنيه بلا سعر صرف | كل الحسابات | يرفض | currency_code ≠ EGP بدون exchange_rate موجب |
| تاريخ خارج النطاق | كل الحسابات | يرفض | issue_date مستقبلي أو أقدم من 7 أيام |
| بند بكمية أو سعر صفر | كل الحسابات | يرفض | أي بند بـ quantity ≤ 0 أو unit_price ≤ 0 |
| حقل غير معروف | كل الحسابات | يرفض | أي مفتاح خارج الجدول أعلاه — خطأ إملائي في السكريبت يُرفض بدل أن يُتجاهل بصمت |
| أكثر من 200 بند | كل الحسابات | يرفض | الحد الأقصى 200 بند في المستند الواحد |
نظام منفصل تمامًا عن الفواتير — بلا توقيع رقمي (الضرائب أجّلت التحقق من التوقيع للإيصالات). العقد مشابه لكن أبسط:
| الـ Endpoint | السلوك |
|---|---|
POST /zoho/receipt-payload | إرسال فوري، يُرجع نتيجة الضرائب الفعلية |
POST /zoho/receipt-payload-bulk | تسجيل الإيصالات وإرسالها تدريجيًا في الخلفية |
| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
zoho_receipt_id | string | نعم | معرّف Zoho |
receipt_number | string | نعم | رقم الإيصال |
buyer.id / buyer.name | string | لا | قد تكون فارغة — بيع نقدي مجهول الهوية صالح |
payment_method | string | نعم | قيمة Zoho الخام لطريقة الدفع |
lines[] | array | نعم | description, quantity, unit_price |
{
"contract_version": 1,
"organization_id": "20012345678",
"zoho_receipt_id": "789012",
"receipt_number": "RC-001",
"issue_date": "2026-07-19",
"currency_code": "EGP",
"buyer": { "id": "", "name": "" },
"payment_method": "cash",
"lines": [
{ "description": "قهوة", "quantity": 2, "unit_price": 25 }
]
}مستند مرفوض يُرجع ردًا عاديًا (وليس خطأ HTTP) لكي تستمر الدفعة — كل رسالة رفض تأتي ثنائية اللغة:
{
"zoho_id": "12345",
"status": "validation_error",
"reasons": [
"الحقل 'receiver' مطلوب / Field 'receiver' is required"
]
}كل قيم status
عالِج القيم دي كلها — القيمة اللي مش في القائمة دي لا يُرجعها الـ API. الأربعة الأولى فقط تعني «وصل للضرائب».
| القيمة | المعنى |
|---|---|
| queued | ✅ نجاح — في طريقه إلى الضرائب |
| queued_receipt | ✅ إيصال سُجّل وسيُرسل في الخلفية (الإرسال الجماعي للإيصالات) |
| requeued_after_cancel | ✅ نجاح — إعادة رفع بعد إلغاء مؤكَّد لدى الضرائب |
| requeued_while_cancel_pending | ✅ نجاح — إعادة رفع وطلب الإلغاء لا يزال معلَّقًا (متاح للحسابات المفعَّل لها ذلك فقط) |
| validation_error | ⛔ بيانات ناقصة أو غير صحيحة — التفاصيل في reasons |
| subscription_or_quota_blocked | ⛔ الاشتراك منتهٍ أو تم بلوغ الحد الشهري |
| plan_upgrade_required | ⛔ إشعارات الدائن/المدين تتطلب باقة مدفوعة |
| limit_reached | ⛔ الحد اليومي لباقة التجربة |
| skipped | ⛔ الفاتورة المرجعية لم تُقبل على الضرائب بعد |
| data_refreshed | ℹ️ المستند مرفوع بالفعل أو قيد الرفع — حُدِّثت بياناته محليًا ولم يُرفع مرة أخرى |
| cancel_pending | ℹ️ طلب إلغاء بانتظار رد المستلم — المستند لا يزال صالحًا لدى الضرائب |
| resubmit_required | ℹ️ ألغته الضرائب — استخدم زر «إعادة الإرسال» (resubmit) لرفعه من جديد |
| locked | ℹ️ إيصال آخر لنفس الشركة قيد الإرسال — أعد المحاولة بعد لحظات (الإيصالات فقط) |
كل رد — سواء نجح أو رُفض — يحمل جزء usage يوضح استهلاكك الحالي:
"usage": {
"plan": "starter",
"daily_used": 2, "daily_limit": 20,
"receipt_daily_used": 0, "receipt_daily_limit": 20,
"monthly_used": 4, "monthly_limit": null,
"receipt_monthly_used": 1, "receipt_monthly_limit": null
}الحد اليومي هو القيد الوحيد المطبَّق. الفواتير والإيصالات لكل منهما عدّاد يومي مستقل بنفس رقم الباقة (تجربة 5 · Starter 20 · Professional 100 · Enterprise 500) — فالإيصالات لا تستهلك رصيد الفواتير. يُحسب بالمستندات الفعلية لا بضغطات الزر، فيمكنك استخدام أي عدد من ضغطات الإرسال الجماعي. إشعارات الدائن والمدين لا تُحتسب على أي عدّاد. الحدود الشهرية لم تعد مطبَّقة (monthly_limit = null) وتُرسل للعلم فقط.
كل الـ endpoints الجماعية تقبل حتى 50 مستندًا في الطلب الواحد. عند بناء تكامل مخصص بأكثر من 50 مستندًا، قسّمها إلى دفعات بنفسك — تمامًا كما تفعل سكريبتات TaxBridge الجاهزة (تقسّم أي عدد تلقائيًا إلى دفعات من 50 وتُجمّع نتيجة واحدة).
{ "total": 42, "queued": 40, "results": [ /* one entry per document */ ] }عندك سؤال أو محتاج مساعدة في التكامل؟
تواصل عبر واتساب