Annual Ads

Dokumentasi pengembang

Bangun langsung di platform Annual Ads — buat akun pengiklan, terbitkan iklan, proses pembayaran, dan lacak peringkat, semuanya melalui API.

Lihat tabel harga selengkapnya

Anda tetap memiliki 70% dari jumlah yang dibayarkan oleh pengiklan Connect-mode Anda untuk iklan mereka — yang dibayarkan secara otomatis ke dompet Anda. Lihat cara kerjanya di bawah ini.

URL Dasar

https://api.adhub365.com
OpenAPI 3

Otentikasi

Setiap permintaan diautentikasi menggunakan kunci rahasia dalam header Authorization, dengan skema Bearer.

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

Sandbox & produksi

Kunci sandbox dan kunci produksi sepenuhnya terpisah satu sama lain — kunci sandbox tidak akan pernah dapat membaca atau menulis data yang dibuat oleh kunci produksi, dan sebaliknya.

Ruang Lingkup

Setiap kunci dibatasi pada cakupan yang ditetapkan saat diterbitkan — sebuah kunci tidak pernah memiliki akses yang lebih luas daripada akun mitra yang membuatnya.

Kunci API dikeluarkan oleh tim Annual Ads untuk akun mitra yang telah disetujui.

Buat akun mitra

Pembagian pendapatan iklan

Jika kunci API Anda digunakan untuk membuat akun pengiklan bagi pengguna Anda sendiri (mode Connect — lihat bagian Otentikasi di atas), Anda akan mendapatkan bagian dari jumlah yang dibayarkan oleh para pengiklan tersebut untuk iklan mereka. Pembagian di bawah ini diambil secara real-time dari titik akhir yang sama ini, tidak pernah ditetapkan secara permanen, dan sepenuhnya terpisah dari komisi rujukan yang dijelaskan lebih lanjut di bagian bawah halaman ini.

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

70%

Itu untukmu

Dibayarkan secara otomatis ke dompet pencairan yang telah Anda atur — tidak perlu mengajukan permintaan penarikan.

30%

Masuk ke Iklan Tahunan

Mencakup proses moderasi, layanan hosting, dan infrastruktur peringkat yang menjadi landasan penayangan iklan Anda.

Cara kerjanya

  1. Salah satu pengiklan Anda yang menggunakan mode Connect membayar biaya iklan melalui integrasi Anda.
  2. Iklan tersebut ditinjau dan disetujui — baik secara otomatis maupun oleh tim moderasi kami.
  3. Bagian Anda sedang dalam antrean untuk pembayaran otomatis ke dompet Anda, dengan mekanisme yang sama seperti program rujukan di bawah ini.
Pembagian komisi tidak akan pernah dilakukan sebelum iklan tersebut benar-benar disetujui — jika tim moderasi menolaknya, tidak ada komisi yang harus dibayarkan atas pembayaran tersebut. Pengisian ulang pada iklan yang sudah aktif tidak memiliki risiko semacam itu dan pembagian komisinya dilakukan segera.

Ketentuan pembayaran

  • Dompet pembayaran kripto telah dikonfigurasi pada akun mitra Anda.
  • Anda tidak perlu melakukan verifikasi KYC — akun mitra Anda sudah diverifikasi saat dibuat.

Contoh: membaca jumlah saham yang terkumpul

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
}

Titik akhir

Akun

POST/v1/partner/advertisers

Buat akun pengiklan atas nama salah satu pengguna Anda (mode Connect).

advertisers:write
GET/v1/partner/advertisers/{id}

Cari akun pengiklan yang dibuat oleh mitra ini.

advertisers:read

Iklan

POST/v1/partner/ads

Buat iklan. Iklan tersebut awalnya berstatus draf. Kolom-kolom yang bersifat opsional, yaitu advertiser_type, promotion_type, link_type, dan promoted_brand, menjelaskan jenis iklan afiliasi, rujukan, kreator, atau perorangan — lihat catatan di bawah ini.

ads:write
GET/v1/partner/ads/{id}

Cari iklan.

ads:read
PATCH/v1/partner/ads/{id}

Perbarui konten editorial — judul, deskripsi, tautan, jenis pengiklan, jenis promosi, jenis tautan, dan merek yang dipromosikan. Kategori, wilayah geografis, dan segala hal yang dibaca oleh mesin peringkat tidak dapat diubah di sini.

ads:write
POST/v1/partner/ads/{id}/image

Unggah gambar iklan secara langsung (JPEG/PNG/WebP, maksimal 5 MB). Harus dilakukan sebelum pembayaran pertama — lihat bagian pembayaran di bawah ini.

ads:write
POST/v1/partner/ads/{id}/image-url

Tentukan gambar iklan dari URL, bukan dengan mengunggah file — server akan mengambil dan menghosting ulang gambar tersebut secara otomatis. Persyaratannya sama: harus dilakukan sebelum pembayaran pertama.

ads:write
GET/v1/partner/ads/{id}/rank

Peringkat, kategori, dan cakupan geografis terkini untuk sebuah iklan.

ads:read
GET/v1/partner/ads/{id}/stats

Jumlah tayangan dan klik untuk sebuah iklan — jumlah hari yang telah berlalu/masih tersisa — diambil dari kolom `activated_at`/`expires_at` yang sudah ada di GET /{id}, sedangkan peringkat diambil dari GET /{id}/rank.

ads:read

Pembayaran

POST/v1/partner/payments

Lakukan pembayaran kripto untuk pembelian pertama atau pengisian ulang. Pembayaran pertama akan gagal dengan kode kesalahan 422 kecuali iklan tersebut sudah memiliki gambar — lihat uploadAdImage/setAdImageUrl di atas.

payments:write
GET/v1/partner/payments/{id}

Periksa status pembayaran.

payments:read

Rujukan

POST/v1/partner/referrals

Buat tautan rujukan.

referrals:write
GET/v1/partner/referrals/{code}/earnings

Penghasilan rujukan kumulatif, dirinci berdasarkan status.

referrals:read

Pembagian pendapatan iklan

GET/v1/partner/ad-revenue/earnings

Bagian Anda sebesar 70% dari jumlah yang dibayarkan oleh pengiklan yang Anda buat dalam mode Connect untuk iklan mereka, dirinci berdasarkan status.

ad-revenue:read

Catatan akses

GET/v1/partner/access-log

Riwayat panggilan lengkap untuk kunci ini — metode, jalur, alamat IP, cap waktu.

Di sana

Titik akhir publik

GET/v1/rankings?category={id}&geo={scope}

Peringkat hanya baca untuk suatu kategori dan cakupan geografis.

Umum
GET/v1/tiers

7 tingkatan harga yang telah dikonfigurasi (ambang batas, manfaat yang tidak terkunci).

Umum
GET/v1/referral-program

Persentase komisi yang saat ini berlaku untuk sistem rujukan berjenjang dan Leaders Pool.

Umum
GET/v1/partner-program

Pembagian pendapatan iklan saat ini (mode Connect) antara Anda dan Annual Ads.

Umum
GET/v1/search?q={query}

Pencarian dengan bahasa alami — mengarahkan kueri seperti "pengiklan furnitur di Kenya" ke kategori dan cakupan geografis yang sesuai, lalu menampilkan hasil peringkat tersebut sesuai urutan aslinya.

Umum

Iklan afiliasi & rujukan

advertiser_type, promotion_type, link_type, dan promoted_brand adalah kolom opsional pada permintaan POST dan PATCH ke /v1/partner/ads — Annual Ads tidak terbatas pada bisnis yang mengiklankan diri mereka sendiri. Jika `link_type` bernilai `affiliate_link` atau `referral_invitation_link`, atau `promotion_type` bernilai `affiliate_offer` atau `referral_opportunity`, maka `affiliate_terms_accepted` harus bernilai `true`; jika tidak, permintaan akan ditolak dengan kode status 422. title dibatasi hingga 35 karakter dan description hingga 80 — keduanya diterapkan di sisi server, bukan hanya di antarmuka dasbor.

Alat AI

Setiap akun pengiklan mendapatkan serangkaian alat AI bawaan — generator konten dan visual iklan, asisten percakapan, penasihat anggaran, serta auditor SEO eksternal — yang dibayar menggunakan kredit AI, di luar biaya tahunan tetap.

Fungsi-fungsi ini dijalankan melalui login dasbor milik pengiklan sendiri (token akses sesi), bukan melalui kunci API mitra — integrasi pihak ketiga tidak dapat memanggil fungsi-fungsi tersebut atas nama pengiklan.
POST/v1/advertisers/{id}/ai/assistant

Tanyakan kepada Annual Ads — asisten percakapan yang dapat berpindah-pindah, hanya untuk tujuan informasional, dan hanya dapat membaca data akun.

Umum
POST/v1/advertisers/{id}/ai/creative-studio

Buat judul iklan, deskripsi, dan kata kunci berdasarkan deskripsi singkat tentang bisnis tersebut.

2 kredit
POST/v1/advertisers/{id}/ai/creative-studio/image

Buat gambar daftar (PNG) berdasarkan deskripsi bisnis yang sama, yang sudah di-hosting dan siap dilampirkan ke iklan.

8 kredit
POST/v1/advertisers/{id}/ai/budget-advisor

Proyeksi statistik yang sesungguhnya — bukan sekadar perkiraan generatif — mengenai peluang untuk mempertahankan peringkat tertentu pada hari ke-30, ke-90, dan ke-365.

1 kredit
POST/v1/advertisers/{id}/ai/seo-audit

Analisis situs web eksternal milik pengiklan tersebut dan berikan saran perbaikan SEO yang konkret.

2 kredit

Contoh — membuat konten iklan

Kategori dan deskripsi bisnis yang sama juga menjadi dasar bagi generator gambar di bawah ini.

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
}

Buat gambar yang sesuai untuk iklan yang sama:

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
}

Widget

Letakkan unit iklan siap pakai ke situs Anda — tanpa perlu proses pembuatan, tanpa iframe. Skrip tersebut ditampilkan langsung di halaman dalam Shadow DOM yang terisolasi, sehingga gaya (style) skrip tersebut tidak akan merembes ke situs Anda, dan gaya situs Anda juga tidak akan merembes ke dalamnya.

Tambahkan ke halaman Anda

<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>

Secara default, ini menampilkan peringkat publik lengkap untuk kategori tersebut — semua pengiklan di platform ini, bukan hanya yang Anda bawa. Untuk menampilkan hanya iklan dari pengiklan yang Anda buat melalui mode Connect (yang menghasilkan bagian Anda), tambahkan atribut `data-partner` dengan ID mitra Anda (dapat ditemukan di halaman Pengembang pada dasbor Anda sendiri):

<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>

Jika pengiklan Anda mencakup beberapa kategori, hapus atribut `data-category` sepenuhnya — dengan hanya menggunakan atribut `data-partner`, widget akan menampilkan semua iklan Anda dari seluruh kategori dalam satu kisi, alih-alih memerlukan satu blok widget per kategori:

<div
  class="annualads-widget"
  data-geo="global"
  data-partner="YOUR_PARTNER_ID"
></div>
<script async src="https://adhub365.com/widget.js"></script>

Ingin menampilkan unit bergaya footer di samping unit yang ada di dalam konten, dengan masing-masing menampilkan iklan yang berbeda? Tambahkan blok widget kedua dengan atribut data-layout="compact" (satu iklan, dapat dilipat menjadi kotak kecil) dan atribut data-offset disesuaikan dengan jumlah iklan yang sudah ditampilkan oleh widget pertama Anda:

<!-- 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>

Atribut

data-categoryID kategori yang akan ditampilkan. Wajib diisi — kecuali jika atribut `data-partner` telah ditetapkan; dalam hal ini, jika atribut tersebut diabaikan, iklan dari mitra tersebut akan ditampilkan di semua kategori.
data-geoCakupan geografis: lokal, regional, atau global. Pengaturan defaultnya adalah global.
data-countJumlah iklan yang akan ditampilkan. Nilai defaultnya adalah 4.
data-columnsJumlah kolom kisi. Nilai defaultnya adalah 2.
data-layoutgrid, list, atau compact. Pengaturan defaultnya adalah grid. Opsi compact menampilkan satu iklan (nilai data-count diabaikan) beserta tombol untuk menyembunyikannya ke dalam kotak kecil dan menampilkannya kembali — unit bergaya footer yang tidak pernah diposisikan secara tetap oleh skrip itu sendiri; Anda dapat menempatkan dan menyesuaikan gaya div wadahnya sesuka hati di halaman Anda sendiri.
data-offsetJumlah iklan teratas yang akan dilewati. Nilai defaultnya adalah 0. Fitur ini memungkinkan widget kedua di halaman yang sama (misalnya, widget ringkas di bagian footer dan widget kisi di bagian atas halaman) menampilkan iklan yang berbeda, alih-alih mengulang iklan yang sama dua kali — masukkan jumlah iklan yang sudah ditampilkan oleh widget lainnya.
data-partnerID mitra Anda (dapat ditemukan di halaman Pengembang pada dasbor Anda). Opsional — tanpa ID tersebut, widget akan menampilkan peringkat publik lengkap untuk kategori tersebut, yang mencakup semua pengiklan di platform. Dengan ID tersebut, hanya iklan dari pengiklan yang Anda bawa melalui mode Connect — yaitu yang benar-benar menghasilkan bagian Anda.

Bagi hasil

Bagaimana komisi rujukan mitra sebenarnya diterima oleh mereka — persentasenya, mekanisme pembayarannya, dan syarat-syaratnya.

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
}

Bukan angka tetap

Persentase komisi diatur oleh pihak kami dan dapat berubah — selalu periksa nilainya secara real-time dari titik akhir ini, bukan dengan menetapkan nilai secara tetap.

Sepenuhnya otomatis

Tidak ada batas waktu penarikan. Tugas terjadwal akan menghitung penghasilan yang dapat dicairkan, mengelompokkannya berdasarkan pengiklan, dan membayarkannya secara otomatis setelah semua syarat di bawah ini terpenuhi.

Ketentuan pembayaran

  • Total penghasilan yang harus dibayarkan kepada pengiklan telah mencapai jumlah pembayaran minimum.
  • Dompet pembayaran kripto telah dikonfigurasi pada akun mereka.
  • Status KYC mereka telah diverifikasi.

Contoh: membaca laba yang terakumulasi

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
}

Tingkat harga (sudah aktif)

Baca data secara langsung dari titik akhir ini — jangan pernah menetapkan nilai-nilai ini secara permanen, karena nilai-nilai tersebut dapat berubah dari pihak kami. Buatlah pemilih tingkatan untuk pengguna Anda sendiri, bukan kolom jumlah gratis: setiap harga yang ditampilkan sudah merupakan jumlah pasti yang harus dikirim saat membuat pembayaran, dan manfaat yang telah dibuka yang ditampilkan di sini memberi tahu pengguna secara tepat apa yang mereka dapatkan dari harga tersebut, sehingga mereka memilih harga yang mereka pahami, bukan menebak-nebak angka.

TingkatHargaMembuka kunci
Bronze$50.00

Basic visibility

Silver$300.00

Clickable link unlocked

Tautan yang dapat diklik
Gold$500.00

Animation unlocked

Tautan yang dapat diklikAnimasi
Platinum$1,000.00

Enhanced exposure

Tautan yang dapat diklikAnimasi
Diamond$2,500.00

Premium placement

Tautan yang dapat diklikAnimasi
Elite$5,000.00

Top-tier visibility

Tautan yang dapat diklikAnimasi
Legendary$10,000.00

Maximum visibility & branding

Tautan yang dapat diklikAnimasi

Batas frekuensi

Jumlah permintaan dibatasi per kunci, per menit. Setiap respons yang terotentikasi menyertakan header X-RateLimit-Limit, X-RateLimit-Remaining, dan X-RateLimit-Reset; jika melebihi batas, sistem akan mengembalikan kode status 429 Too Many Requests beserta header Retry-After.

Daftar putih IP

Opsional, per mitra. Sampai Anda menambahkan entri, kunci-kunci Anda akan menerima permintaan dari alamat IP mana pun — entri pertama akan mengubah semua kunci mitra tersebut menjadi hanya menerima alamat IP yang ada dalam daftar putih.

Webhook

Setiap webhook ditandatangani dengan HMAC-SHA256 menggunakan kunci rahasia yang diterbitkan satu kali, pada saat pembuatan — verifikasi tanda tangan tersebut sebelum mempercayai muatan pesan. Peristiwa hanya dikirimkan kepada mitra yang memiliki pengiklan terkait.

payment.succeededPembayaran telah dikonfirmasi.
payment.refundedPengembalian dana telah dilakukan.
ad.activatedSebuah iklan mulai ditayangkan, baik secara otomatis maupun setelah ditinjau oleh admin.
invoice.issuedSebuah faktur telah diterbitkan.
referral.payout.completedKomisi rujukan telah mencapai status "telah dibayarkan".
referral.payout.failedSebuah batch pembayaran rujukan gagal di pihak penyedia — penghasilan dikembalikan ke status "terutang" dan akan dicoba kembali.
rank.changedPeringkat iklan dapat berubah — termasuk ketika hal itu disebabkan oleh pembayaran dari pengiklan lain.
ad.expiring_soon30, 7, atau 1 hari sebelum iklan berakhir.
partner_ad_revenue.payout.completedPembayaran bagi hasil pendapatan iklan telah mencapai status "dibayarkan".
partner_ad_revenue.payout.failedSebuah batch pembayaran bagi hasil pendapatan iklan mengalami kegagalan di pihak penyedia — bagian-bagian tersebut dikembalikan ke daftar yang harus dibayarkan dan akan dicoba kembali.

Perangkat Pengembangan Perangkat Lunak

SDK resmi untuk JavaScript/TypeScript dan Python, yang dihasilkan berdasarkan spesifikasi API yang sama ini, sedang direncanakan namun belum dirilis — silakan akses API HTTP secara langsung sampai saat itu.

Panduan Cepat

Belum ada SDK — fitur-fitur ini memanggil API HTTP secara langsung dan sudah dapat digunakan saat ini dalam bahasa pemrograman apa pun.

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": "...",
    },
)