مستقیماً روی پلتفرم Annual Ads بسازید — تبلیغدهندگان را ایجاد کنید، تبلیغات را منتشر کنید، پرداختها را راهاندازی کنید و رتبهبندی را پیگیری کنید، همهچیز از طریق API.
مشاهده جدول کامل قیمتهاشما 70% را نگه میدارید. از آنچه تبلیغدهندگان شما در حالت Connect برای تبلیغاتشان میپردازند — بهطور خودکار به کیف پول شما واریز میشود. در ادامه ببینید چگونه کار میکند.
هر درخواست با استفاده از طرح Bearer و با کلید مخفی در هدر Authorization احراز هویت میشود.
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، حداکثر ۵ مگابایت). این کار پیش از اولین پرداخت الزامی است — به گروه پرداختها در زیر مراجعه کنید. | 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۷۰٪ سهم شما از مبلغی که تبلیغدهندگانی که در حالت Connect ایجاد کردهاید برای تبلیغاتشان پرداختهاند، تفکیکشده بر اساس وضعیت. | ad-revenue:read |
| GET | /v1/partner/access-logتاریخچه کامل تماسها برای این کلید — متد، مسیر، آیپی، مهر زمانی. | آنجا |
| GET | /v1/rankings?category={id}&geo={scope}رتبهبندی فقط-خواندنی برای یک دستهبندی و محدوده جغرافیایی. | عمومی |
| GET | /v1/tiers۷ سطح قیمتگذاری پیکربندیشده (آستانه، مزایای آزادشده). | عمومی |
| GET | /v1/referral-programدرصد کمیسیونهای فعال فعلی برای آبشار ارجاع و استخر رهبران. | عمومی |
| GET | /v1/partner-programتقسیم فعلی درآمد تبلیغات (حالت اتصال) بین شما و تبلیغات سالانه. | عمومی |
| GET | /v1/search?q={query}جستجوی زبان طبیعی — یک پرسوجو مانند «تبلیغکنندگان مبلمان در کنیا» را به دستهبندی و محدوده جغرافیایی مطابقتدهنده هدایت میکند، سپس آن رتبهبندی را دقیقاً به ترتیب واقعیاش بازمیگرداند. | عمومی |
تبلیغات همکاری در فروش و ارجاعی
advertiser_type، promotion_type، link_type و promoted_brand فیلدهای اختیاری در POST و PATCH /v1/partner/ads هستند — تبلیغات سالانه محدود به کسبوکارهایی نیست که خودشان تبلیغ میکنند. وقتی link_type برابر affiliate_link یا referral_invitation_link باشد، یا promotion_type برابر affiliate_offer یا referral_opportunity باشد، affiliate_terms_accepted باید true باشد وگرنه درخواست با وضعیت 422 رد میشود. محدودیت عنوان ۳۵ کاراکتر و توضیحات ۸۰ کاراکتر است — این محدودیتها هم در سمت سرور اعمال میشوند و هم در رابط کاربری داشبورد.
هر حساب تبلیغدهنده مجموعهای از ابزارهای هوش مصنوعی داخلی را دریافت میکند — یک تولیدکننده محتوا و تصویر تبلیغاتی، یک دستیار مکالمهای، یک مشاور بودجه و یک حسابرس سئوی خارجی — که هزینهٔ آنها علاوه بر قیمت ثابت سالانه، با اعتبارات هوش مصنوعی پرداخت میشود.
| 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یک پیشبینی آماری واقعی — نه یک حدس تولیدشده — از احتمال حفظ یک رتبه مشخص در ۳۰/۹۰/۳۶۵ روز. | 1 واحد(ها) |
| POST | /v1/advertisers/{id}/ai/seo-auditوبسایت خارجی خودِ تبلیغدهنده را تحلیل کرده و پیشنهادهای مشخصی برای بهبود سئو ارائه دهید. | 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 | تعداد تبلیغاتی که نمایش داده میشوند. پیشفرض ۴ است. |
data-columns | تعداد ستونهای جدول. پیشفرض ۲ است. |
data-layout | شبکهای، فهرستی یا فشرده. پیشفرض روی شبکهای است. حالت فشرده یک تبلیغ واحد نمایش میدهد (تعداد دادهها نادیده گرفته میشود) همراه با دکمهای برای جمعکردن آن در قالب یک قرص کوچک و بازگرداندن آن — یک واحد به سبک فوتر که هرگز توسط خود اسکریپت ثابت قرار داده نمیشود؛ شما میتوانید div کنtejner را هر طور که میخواهید در صفحهی خود قرار داده و استایل دهید. |
data-offset | تعداد تبلیغات برتر که باید نادیده گرفته شوند. به طور پیشفرض برابر با ۰ است. اجازه میدهد ویجت دوم در همان صفحه (مثلاً یک ویجت فشرده در فوتر بهعلاوه یک ویجت شبکهای در بخش بالاتری) تبلیغات متفاوتی نمایش دهد بهجای اینکه یک تبلیغ را دو بار تکرار کند — تعداد تبلیغاتی را که ویجت دیگر در حال حاضر نمایش میدهد، ارسال کنید. |
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 | ۳۰، ۷ یا ۱ روز قبل از انقضای یک آگهی. |
partner_ad_revenue.payout.completed | پرداخت سهم درآمد تبلیغات به وضعیت پرداختشده میرسد. |
partner_ad_revenue.payout.failed | یک دسته پرداخت سهم درآمد تبلیغات در ارائهدهنده شکست میخورد — سهامها به حالت قابل پرداخت بازمیگردند و دوباره تلاش میشوند. |
SDKهای رسمی جاوااسکریپت/تایپاسکریپت و پایتون که از همین مشخصات 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": "...",
},
)