قم بالتطوير مباشرةً على منصة Annual Ads — أنشئ حسابات المعلنين، وانشر الإعلانات، وقم بتنفيذ عمليات الدفع، وتتبّع الترتيب، كل ذلك عبر واجهة برمجة التطبيقات (API) بالكامل.
اطلع على جدول الأسعار الكاملستحتفظ بـ 70٪ من المبلغ الذي يدفعه المعلنون في وضع «Connect» مقابل إعلاناتهم — ويتم دفعه تلقائيًا إلى محفظتك. اطلع على كيفية عمل ذلك أدناه.
يتم توثيق كل طلب باستخدام مفتاح سري في رأس «Authorization»، وذلك وفقًا لنظام «Bearer».
POST https://api.adhub365.com/v1/partner/ads
Authorization: Bearer sk_sandbox_...
Content-Type: application/jsonيتم إصدار مفاتيح واجهة برمجة التطبيقات (API) لحسابات الشركاء المعتمدين من قِبل فريق الإعلانات السنوية.
إنشاء حساب شريك| POST | /v1/partner/advertisersقم بإنشاء حساب معلن نيابة عن أحد مستخدميك (وضع "الربط"). | advertisers:write |
| GET | /v1/partner/advertisers/{id}ابحث عن حساب معلن أنشأه هذا الشريك. | advertisers:read |
| POST | /v1/partner/adsأنشئ إعلانًا. يبدأ الإعلان في حالة «مسودة». تصف الحقول الاختيارية «advertiser_type» و«promotion_type» و«link_type» و«promoted_brand» الإعلانات التابعة أو الإحالة أو الخاصة بالمبدعين أو الفردية — انظر الملاحظة أدناه. | ads:write |
| GET | /v1/partner/ads/{id}ابحث عن إعلان. | ads:read |
| PATCH | /v1/partner/ads/{id}تحديث المحتوى التحريري — العنوان، والوصف، والرابط، ونوع المعلن، ونوع العرض الترويجي، ونوع الرابط، والعلامة التجارية المُروَّجة. أما الفئة، والموقع الجغرافي، وأي معلومات يقرأها محرك الترتيب، فلا يمكن تغييرها هنا أبدًا. | ads:write |
| POST | /v1/partner/ads/{id}/imageقم بتحميل صورة الإعلان مباشرةً (بصيغة JPEG/PNG/WebP، بحد أقصى 5 ميغابايت). هذا الأمر مطلوب قبل إجراء الدفعة الأولى — انظر قسم «الدفعات» أدناه. | ads:write |
| POST | /v1/partner/ads/{id}/image-urlقم بتعيين صورة الإعلان من رابط URL بدلاً من تحميل ملف — حيث يقوم الخادم باسترداد الصورة وإعادة استضافتها بنفسه. نفس الشرط: يجب القيام بذلك قبل الدفعة الأولى. | ads:write |
| GET | /v1/partner/ads/{id}/rankالترتيب الحالي، والفئة، والنطاق الجغرافي للإعلان. | ads:read |
| GET | /v1/partner/ads/{id}/statsإجمالي عدد المشاهدات والنقرات على الإعلان — عدد الأيام المنقضية/المتبقية مستمد من الحقول activated_at/expires_at الموجودة بالفعل في طلب GET /{id}، أما الترتيب فهو مستمد من طلب GET /{id}/rank. | ads:read |
| POST | /v1/partner/paymentsابدأ عملية دفع بالعملة المشفرة لإجراء عملية شراء أولية أو إعادة تعبئة الرصيد. تفشل عملية الدفع الأولية برمز الخطأ 422 ما لم تكن الإعلان يحتوي بالفعل على صورة — انظر uploadAdImage/setAdImageUrl أعلاه. | payments:write |
| GET | /v1/partner/payments/{id}التحقق من حالة الدفع. | payments:read |
| POST | /v1/partner/referralsإنشاء رابط إحالة. | referrals:write |
| GET | /v1/partner/referrals/{code}/earningsإجمالي أرباح الإحالة، موزعة حسب الحالة. | referrals:read |
| GET | /v1/partner/ad-revenue/earningsحصتك البالغة 70% من المبلغ الذي دفعه المعلنون الذين أنشأتهم في وضع «Connect» مقابل إعلاناتهم، موزعةً حسب الحالة. | ad-revenue:read |
| GET | /v1/partner/access-logسجل المكالمات الكامل لهذا المفتاح — الطريقة، المسار، عنوان IP، الطابع الزمني. | أي |
| GET | /v1/rankings?category={id}&geo={scope}تصنيف للقراءة فقط لفئة معينة ونطاق جغرافي معين. | عام |
| GET | /v1/tiersمستويات التسعير السبعة المُحدَّدة (الحد الأدنى، المزايا غير المقيدة). | عام |
| GET | /v1/referral-programنسب العمولة السارية حاليًا بالنسبة لبرنامج الإحالة المتسلسل ومجموعة القادة. | عام |
| GET | /v1/partner-programتوزيع عائدات الإعلانات الحالي (في وضع «Connect») بينك وبين «Annual Ads». | عام |
| GET | /v1/search?q={query}البحث باللغة الطبيعية — يوجه استعلامًا مثل «مُعلِنو الأثاث في كينيا» إلى الفئة والنطاق الجغرافي المطابقين، ثم يعرض نتائج الترتيب وفقًا لترتيبها الفعلي الدقيق. | عام |
الإعلانات التابعة والإحالة
تُعد الحقول advertiser_type و promotion_type و link_type و promoted_brand حقولًا اختيارية في طلبات POST و PATCH الموجهة إلى /v1/partner/ads — ولا تقتصر خدمة «Annual Ads» على الشركات التي تعلن عن نفسها. عندما يكون link_type هو affiliate_link أو referral_invitation_link، أو يكون promotion_type هو affiliate_offer أو referral_opportunity، يجب أن تكون قيمة affiliate_terms_accepted هي true وإلا سيتم رفض الطلب برمز الخطأ 422. يبلغ الحد الأقصى لعدد أحرف title 35 حرفًا و description 80 حرفًا — ويتم فرض كلاهما من جانب الخادم، وليس فقط في واجهة المستخدم الخاصة بلوحة التحكم.
يحصل كل حساب معلن على مجموعة من أدوات الذكاء الاصطناعي المدمجة — وهي أداة لتوليد محتوى الإعلانات والعناصر المرئية، ومساعد محادثة، ومستشار ميزانية، ومدقق خارجي لتحسين محركات البحث (SEO) — يتم دفع تكاليفها باستخدام أرصدة الذكاء الاصطناعي، بالإضافة إلى السعر السنوي الثابت.
| POST | /v1/advertisers/{id}/ai/assistantAsk Annual Ads — مساعد محادثة متجول، مخصص للأغراض الإعلامية فقط، ولا يمكنه سوى الاطلاع على بيانات الحساب. | عام |
| POST | /v1/advertisers/{id}/ai/creative-studioإنشاء عنوان إعلان ووصف وكلمات رئيسية استنادًا إلى وصف موجز عن النشاط التجاري. | 2 رصيد |
| POST | /v1/advertisers/{id}/ai/creative-studio/imageإنشاء صورة للإعلان (PNG) استنادًا إلى نفس وصف النشاط التجاري، تكون مستضافة وجاهزة لإرفاقها بالإعلان. | 8 رصيد |
| POST | /v1/advertisers/{id}/ai/budget-advisorتوقعات إحصائية حقيقية — وليست مجرد تخمينات — لاحتمالات الحفاظ على رتبة معينة بعد 30 و90 و365 يومًا. | 1 رصيد |
| POST | /v1/advertisers/{id}/ai/seo-auditتحليل الموقع الإلكتروني الخارجي الخاص بالمعلن واقتراح تحسينات ملموسة في مجال تحسين محركات البحث (SEO). | 2 رصيد |
وتُستخدم الفئة نفسها ووصف النشاط التجاري أيضًا لتشغيل أداة إنشاء الصور أدناه.
POST https://api.adhub365.com/v1/advertisers/{advertiser_id}/ai/creative-studio
Authorization: Bearer <session access token>
Content-Type: application/json
{
"category_name": "Furniture",
"business_description": "We sell handmade oak dining tables"
}{
"title": "Handmade Oak Dining Tables — Built to Last",
"description": "Solid oak dining tables crafted by hand, built to last a lifetime.",
"keywords": ["oak furniture", "dining table", "handmade"],
"credits_remaining": 8
}إنشاء صورة مطابقة لنفس الإعلان:
POST https://api.adhub365.com/v1/advertisers/{advertiser_id}/ai/creative-studio/image
Authorization: Bearer <session access token>
Content-Type: application/json
{
"category_name": "Furniture",
"business_description": "We sell handmade oak dining tables"
}{
"visual_url": "https://cdn.uploadscenter.com/file_01m1...",
"credits_remaining": 4
}قم بإدراج وحدة إعلانية جاهزة في موقعك — دون الحاجة إلى أي عملية إنشاء، ودون استخدام iframe. يتم عرض البرنامج النصي مباشرةً داخل الصفحة ضمن Shadow DOM معزول، لذا لا تتسرب أنماطه أبدًا إلى موقعك، كما لا تتسرب أنماط موقعك أبدًا إليه.
<div
class="annualads-widget"
data-category="YOUR_CATEGORY_ID"
data-geo="global"
data-count="4"
data-columns="2"
></div>
<script async src="https://adhub365.com/widget.js"></script>بشكل افتراضي، يعرض هذا التصنيف العام الكامل للفئة — أي جميع المعلنين على المنصة، وليس فقط أولئك الذين قمت بجلبهم. لعرض الإعلانات الصادرة عن المعلنين الذين أنشأتهم عبر وضع «Connect» (الذين يدرون حصتك) فقط، أضف «data-partner» مع معرّف شريكك (يمكنك العثور عليه في صفحة «المطورين» في لوحة التحكم الخاصة بك):
<div
class="annualads-widget"
data-category="YOUR_CATEGORY_ID"
data-geo="global"
data-partner="YOUR_PARTNER_ID"
></div>
<script async src="https://adhub365.com/widget.js"></script>إذا كان المعلنون لديك ينتمون إلى عدة فئات، فاستبعد «data-category» تمامًا — باستخدام «data-partner» وحده، تعرض الأداة كل إعلاناتك في جميع الفئات ضمن شبكة واحدة، بدلاً من الحاجة إلى كتلة أداة واحدة لكل فئة:
<div
class="annualads-widget"
data-geo="global"
data-partner="YOUR_PARTNER_ID"
></div>
<script async src="https://adhub365.com/widget.js"></script>هل تريد وحدة على غرار التذييل إلى جانب الوحدة الموجودة داخل المحتوى، بحيث تعرض كل منهما إعلانات مختلفة؟ أضف كتلة واجهة مستخدم ثانية مع data-layout="compact" (إعلان واحد، قابل للطي إلى شكل حبة صغيرة) وقم بتعيين data-offset على عدد الإعلانات التي تعرضها واجهة المستخدم الأولى بالفعل:
<!-- in your content -->
<div
class="annualads-widget"
data-category="YOUR_CATEGORY_ID"
data-geo="global"
data-count="4"
data-columns="2"
></div>
<!-- in your footer, showing different ads via data-offset -->
<div
class="annualads-widget"
data-category="YOUR_CATEGORY_ID"
data-geo="global"
data-layout="compact"
data-offset="4"
></div>
<script async src="https://adhub365.com/widget.js"></script>data-category | معرّف الفئة المراد عرضها. مطلوب — ما لم يتم تعيين «data-partner»، وفي هذه الحالة يؤدي حذفه إلى عرض إعلانات ذلك الشريك في جميع الفئات. |
data-geo | النطاق الجغرافي: محلي، أو إقليمي، أو عالمي. الإعداد الافتراضي هو «عالمي». |
data-count | عدد الإعلانات المراد عرضها. القيمة الافتراضية هي 4. |
data-columns | عدد أعمدة الشبكة. القيمة الافتراضية هي 2. |
data-layout | شبكة، أو قائمة، أو مدمجة. الإعداد الافتراضي هو «شبكة». يعرض الإعداد «مدمجة» إعلانًا واحدًا (يتم تجاهل قيمة data-count) مع زر لطي الإعلان في شكل حبة صغيرة وإعادته — وهي وحدة على غرار التذييل، ولا يتم وضعها أبدًا في موضع ثابت بواسطة البرنامج النصي نفسه، بل يمكنك وضع عنصر div الحاوية وتصميمه كما تشاء على صفحتك الخاصة. |
data-offset | عدد الإعلانات الأعلى تصنيفًا التي يجب تخطيها. القيمة الافتراضية هي 0. تتيح هذه الميزة لعنصر واجهة مستخدم ثانٍ في نفس الصفحة (مثل عنصر صغير في تذييل الصفحة بالإضافة إلى عنصر شبكي أعلى في الصفحة) عرض إعلانات مختلفة بدلاً من تكرار نفس الإعلان مرتين — قم بتمرير عدد الإعلانات التي يعرضها عنصر واجهة المستخدم الآخر بالفعل. |
data-partner | معرّف الشريك الخاص بك (يمكنك العثور عليه في صفحة «المطورين» في لوحة التحكم الخاصة بك). اختياري — في حالة عدم إدخاله، تعرض الأداة الترتيب العام الكامل لتلك الفئة، بما يشمل جميع المعلنين على المنصة. أما في حالة إدخاله، فستظهر فقط الإعلانات الصادرة عن المعلنين الذين جلبتهم عبر وضع «Connect» — أي أولئك الذين يدرون حصتك فعليًّا. |
يتم تحديد الحد الأقصى لعدد الطلبات لكل مفتاح وفي الدقيقة. تحتوي كل استجابة تم المصادقة عليها على رؤوس X-RateLimit-Limit وX-RateLimit-Remaining وX-RateLimit-Reset؛ وفي حالة تجاوز الحد الأقصى، يتم إرجاع رمز الخطأ 429 Too Many Requests مع رأس Retry-After.
اختياري، لكل شريك. إلى أن تضيف إدخالاً، تقبل مفاتيحك الطلبات الواردة من أي عنوان IP — ويؤدي الإدخال الأول إلى تحويل جميع مفاتيح ذلك الشريك إلى وضع «قائمة المسموح لهم فقط».
يتم توقيع كل ويبهوك باستخدام خوارزمية HMAC-SHA256، وذلك باستخدام مفتاح سري يتم إصداره مرة واحدة فقط عند الإنشاء — يجب التحقق من التوقيع قبل الوثوق بالحمولة. ولا يتم تسليم الأحداث إلا إلى الشريك الذي يمتلك المعلن ذي الصلة.
payment.succeeded | تم تأكيد الدفع. |
payment.refunded | تم تنفيذ عملية استرداد المبلغ. |
ad.activated | يتم تفعيل الإعلان، إما تلقائيًا أو بعد مراجعة المسؤول. |
invoice.issued | يتم إصدار فاتورة. |
referral.payout.completed | وصلت عمولة الإحالة إلى حالة «مدفوعة». |
referral.payout.failed | فشلت دفعة مدفوعات الإحالة لدى المزود — تُعاد الأرباح إلى حساب «المستحق الدفع» وتُعاد محاولة دفعها. |
rank.changed | يتغير ترتيب الإعلان — بما في ذلك عندما يكون السبب هو الدفعة التي سددها معلن آخر. |
ad.expiring_soon | قبل 30 يومًا أو 7 أيام أو يومًا واحدًا من انتهاء صلاحية الإعلان. |
partner_ad_revenue.payout.completed | وصلت عملية دفع حصة إيرادات الإعلانات إلى حالة «مدفوعة». |
partner_ad_revenue.payout.failed | فشلت عملية دفع دفعة من حصص عائدات الإعلانات لدى المزود — وعادت الحصص إلى قائمة المستحقات، وسيتم إعادة محاولة دفعها. |
من المقرر إصدار حزم SDK الرسمية لـ JavaScript/TypeScript وPython، والتي تم إنشاؤها استنادًا إلى مواصفات واجهة برمجة التطبيقات (API) هذه، ولكنها لم تُنشر بعد — لذا، يُرجى الاتصال بواجهة برمجة التطبيقات (API) عبر HTTP مباشرةً حتى ذلك الحين.
لا توجد حزمة SDK حتى الآن — فهذه الأداة تستدعي واجهة برمجة التطبيقات (API) عبر HTTP مباشرةً وتعمل حالياً بأي لغة برمجة.
cURL
curl -X POST https://api.adhub365.com/v1/partner/ads \
-H "Authorization: Bearer sk_sandbox_..." \
-H "Content-Type: application/json" \
-d '{"advertiser_id":"adv_9f2a...","category_id":"cat_furniture","geo_scope":"local","title":"..."}'JavaScript
await fetch("https://api.adhub365.com/v1/partner/ads", {
method: "POST",
headers: {
Authorization: "Bearer sk_sandbox_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
advertiser_id: "adv_9f2a...",
category_id: "cat_furniture",
geo_scope: "local",
title: "...",
}),
});Python
import requests
requests.post(
"https://api.adhub365.com/v1/partner/ads",
headers={"Authorization": "Bearer sk_sandbox_..."},
json={
"advertiser_id": "adv_9f2a...",
"category_id": "cat_furniture",
"geo_scope": "local",
"title": "...",
},
)