Annual Ads

مستندات توسعه‌دهنده

مستقیماً روی پلتفرم Annual Ads بسازید — تبلیغ‌دهندگان را ایجاد کنید، تبلیغات را منتشر کنید، پرداخت‌ها را راه‌اندازی کنید و رتبه‌بندی را پیگیری کنید، همه‌چیز از طریق API.

مشاهده جدول کامل قیمت‌ها

شما 70% را نگه می‌دارید. از آنچه تبلیغ‌دهندگان شما در حالت Connect برای تبلیغاتشان می‌پردازند — به‌طور خودکار به کیف پول شما واریز می‌شود. در ادامه ببینید چگونه کار می‌کند.

آدرس اینترنتی پایه

https://api.adhub365.com
OpenAPI 3

احراز هویت

هر درخواست با استفاده از طرح Bearer و با کلید مخفی در هدر Authorization احراز هویت می‌شود.

POST https://api.adhub365.com/v1/partner/ads
Authorization: Bearer sk_sandbox_...
Content-Type: application/json

محیط آزمایشی و تولید

کلیدهای sandbox و تولید کاملاً از یکدیگر جدا هستند — یک کلید sandbox هرگز نمی‌تواند داده‌های ایجادشده توسط یک کلید تولید را بخواند یا بنویسد، و بالعکس.

دامنه‌ها

هر کلید محدود به حوزه‌هایی است که با آن‌ها صادر شده — یک کلید هرگز دسترسی بیشتری نسبت به حساب شریکی که آن را ایجاد کرده است ندارد.

کلیدهای API توسط تیم تبلیغات سالانه به حساب‌های شریک تأییدشده صادر می‌شوند.

ایجاد حساب شریک

اشتراک درآمد تبلیغات

اگر کلیدهای API شما برای کاربران خودتان حساب‌های تبلیغ‌دهنده ایجاد کنند (حالت Connect — به بخش احراز هویت بالا مراجعه کنید)، شما از مبلغی که آن تبلیغ‌دهندگان بابت تبلیغاتشان می‌پردازند، سهمی دریافت می‌کنید. تقسیم‌بندی زیر به‌صورت زنده از همین نقطه پایانی خوانده می‌شود، هرگز به‌صورت کد ثابت درج نشده و کاملاً مستقل از کمیسیون ارجاعی در پایین همین صفحه است.

GET https://api.adhub365.com/v1/partner-program
{
  "partner_share_percentage": 0.7,
  "platform_share_percentage": 0.3
}

70%

مربوط به شماست

به‌طور خودکار به کیف‌پول پرداختی که تنظیم کرده‌اید واریز می‌شود — نیازی به درخواست برداشت نیست.

30%

مراجعه به تبلیغات سالانه

پوشش می‌دهد میانجی‌گری، میزبانی و زیرساخت رتبه‌بندی که تبلیغات شما روی آن اجرا می‌شوند.

نحوه کار

  1. یکی از تبلیغ‌دهندگان شما در حالت Connect-mode از طریق یکپارچه‌سازی شما برای یک آگهی هزینه می‌پردازد.
  2. این آگهی بازبینی و تأیید می‌شود — به‌طور خودکار یا توسط تیم نظارت ما.
  3. سهم شما برای پرداخت خودکار به کیف پولتان در صف قرار دارد، همان مکانیزم برنامهٔ ارجاعی زیر.
یک سهم هرگز قبل از تأیید واقعی آگهی ایجاد نمی‌شود — اگر مدیریت آن را رد کند، هیچ مبلغی بابت آن پرداخت بدهکار نخواهد بود. شارژ مجدد یک آگهی فعال چنین ریسکی ندارد و بلافاصله تقسیم می‌شود.

شرایط پرداخت

  • یک کیف‌پول پرداخت کریپتو روی حساب شریک شما پیکربندی شده است.
  • از سمت شما نیازی به احراز هویت KYC نیست — حساب شریک شما هنگام ایجاد از قبل بررسی شده است.

مثال: خواندن سهام انباشته

GET https://api.adhub365.com/v1/partner/ad-revenue/earnings
Authorization: Bearer sk_sandbox_...
{
  "shares": [
    {
      "id": "share_1a2b...",
      "payment_id": "pay_9f2a...",
      "ad_id": "ad_7c31...",
      "partner_amount_usd": 140.0,
      "platform_amount_usd": 60.0,
      "status": "paid",
      "payable_after": "2026-08-03T00:00:00Z",
      "paid_at": "2026-08-05T10:12:00Z"
    }
  ],
  "total_payable_pending_usd": 0.0,
  "total_payable_usd": 0.0,
  "total_processing_usd": 0.0,
  "total_paid_usd": 140.0
}

نقطه‌های پایانی

حساب‌ها

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 رد می‌شود. محدودیت عنوان ۳۵ کاراکتر و توضیحات ۸۰ کاراکتر است — این محدودیت‌ها هم در سمت سرور اعمال می‌شوند و هم در رابط کاربری داشبورد.

ابزارهای هوش مصنوعی

هر حساب تبلیغ‌دهنده مجموعه‌ای از ابزارهای هوش مصنوعی داخلی را دریافت می‌کند — یک تولیدکننده محتوا و تصویر تبلیغاتی، یک دستیار مکالمه‌ای، یک مشاور بودجه و یک حسابرس سئوی خارجی — که هزینهٔ آن‌ها علاوه بر قیمت ثابت سالانه، با اعتبارات هوش مصنوعی پرداخت می‌شود.

این‌ها از طریق ورود به داشبورد خود تبلیغ‌دهنده (توکن دسترسی جلسه) اجرا می‌شوند، نه از طریق کلید API شریک — یکپارچه‌سازی شخص ثالث نمی‌تواند به نمایندگی از تبلیغ‌دهنده آن‌ها را فراخوانی کند.
POST/v1/advertisers/{id}/ai/assistant

Ask 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 وارد کرده‌اید — همان‌هایی که در واقع سهم شما را تولید می‌کنند.

سهم درآمد

چگونه کمیسیون ارجاع یک شریک در واقع به او می‌رسد — درصد، سازوکار پرداخت و پیش‌نیازها.

GET https://api.adhub365.com/v1/referral-program
{
  "levels": [
    {
      "level": 1,
      "percentage": 0.1
    }
  ],
  "leaders_pool_percentage_of_gmv": 0.05,
  "founding_advertiser_pool_percentage_of_gmv": 0.05,
  "payout_verification_window_hours": 48,
  "min_payout_usd": 1
}

عدد ثابتی نیست

درصد کمیسیون از سمت ما پیکربندی شده و ممکن است تغییر کند — همیشه آن را به‌صورت زنده از این نقطه پایانی بخوانید، نه اینکه یک مقدار را به‌صورت سخت‌کد وارد کنید.

کاملاً خودکار

هیچ نقطه پایانی برداشت وجود ندارد. یک شغل زمان‌بندی‌شده درآمدهای قابل پرداخت را محاسبه می‌کند، آن‌ها را برای هر تبلیغ‌دهنده دسته‌بندی می‌کند و به محض برآورده شدن همه شرایط زیر، به‌طور خودکار پرداخت می‌کند.

شرایط پرداخت

  • مجموع درآمد قابل پرداخت تبلیغ‌دهنده به حداقل مبلغ پرداختی می‌رسد.
  • یک کیف‌پول پرداخت رمزارزی روی حساب کاربری آن‌ها پیکربندی شده است.
  • وضعیت KYC آنها تأیید شده است.

مثال: خواندن درآمدهای انباشته

GET https://api.adhub365.com/v1/partner/referrals/{code}/earnings
Authorization: Bearer sk_sandbox_...
{
  "code": "ann-2f8c",
  "earnings": [
    {
      "id": "earn_1a2b...",
      "payment_id": "pay_9f2a...",
      "amount_usd": 30.0,
      "status": "paid",
      "payable_after": "2026-08-01T00:00:00Z",
      "paid_at": "2026-08-03T14:22:00Z"
    }
  ],
  "total_payable_pending_usd": 0.0,
  "total_payable_usd": 0.0,
  "total_processing_usd": 0.0,
  "total_paid_usd": 30.0
}

سطوح قیمت‌گذاری (زنده)

مستقیماً از این نقطه پایانی بخوانید — هرگز این مقادیر را به‌صورت کد سخت‌کد نکنید، ممکن است در سمت ما تغییر کنند. به جای فیلد مقدار رایگان، یک انتخابگر پلن برای کاربران خود بسازید: هر قیمتی که نمایش داده می‌شود، دقیقاً همان مبلغی است که هنگام ایجاد پرداخت باید ارسال شود، و مزایای بازشده‌ای که اینجا نشان داده می‌شوند، به کاربران دقیقاً می‌گویند آن قیمت چه چیزی را برایشان فراهم می‌کند، تا به جای حدس زدن یک عدد، قیمتی را انتخاب کنند که درک می‌کنند.

سطحقیمتباز کردن
Bronze$50.00

Basic visibility

Silver$300.00

Clickable link unlocked

لینک قابل کلیک
Gold$500.00

Animation unlocked

لینک قابل کلیکانیمیشن
Platinum$1,000.00

Enhanced exposure

لینک قابل کلیکانیمیشن
Diamond$2,500.00

Premium placement

لینک قابل کلیکانیمیشن
Elite$5,000.00

Top-tier visibility

لینک قابل کلیکانیمیشن
Legendary$10,000.00

Maximum visibility & branding

لینک قابل کلیکانیمیشن

محدودیت‌های نرخ

درخواست‌ها به‌ازای هر کلید در هر دقیقه محدود شده‌اند. هر پاسخ احرازشده شامل سربرگ‌های X-RateLimit-Limit، X-RateLimit-Remaining و X-RateLimit-Reset است؛ فراتر رفتن از حد مجاز، کد خطای 429 Too Many Requests همراه با سربرگ Retry-After را بازمی‌گرداند.

فهرست مجاز IP

اختیاری، برای هر شریک. تا زمانی که یک مورد اضافه نکنید، کلیدهای شما درخواست‌ها را از هر 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": "...",
    },
)