Bangun langsung di platform Annual Ads — buat akun pengiklan, terbitkan iklan, proses pembayaran, dan lacak peringkat, semuanya melalui API.
Lihat tabel harga selengkapnyaAnda 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.
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/jsonKunci API dikeluarkan oleh tim Annual Ads untuk akun mitra yang telah disetujui.
Buat akun mitra| POST | /v1/partner/advertisersBuat 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 |
| POST | /v1/partner/adsBuat 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}/imageUnggah 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-urlTentukan 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}/rankPeringkat, kategori, dan cakupan geografis terkini untuk sebuah iklan. | ads:read |
| GET | /v1/partner/ads/{id}/statsJumlah 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 |
| POST | /v1/partner/paymentsLakukan 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 |
| POST | /v1/partner/referralsBuat tautan rujukan. | referrals:write |
| GET | /v1/partner/referrals/{code}/earningsPenghasilan rujukan kumulatif, dirinci berdasarkan status. | referrals:read |
| GET | /v1/partner/ad-revenue/earningsBagian Anda sebesar 70% dari jumlah yang dibayarkan oleh pengiklan yang Anda buat dalam mode Connect untuk iklan mereka, dirinci berdasarkan status. | ad-revenue:read |
| GET | /v1/partner/access-logRiwayat panggilan lengkap untuk kunci ini — metode, jalur, alamat IP, cap waktu. | Di sana |
| GET | /v1/rankings?category={id}&geo={scope}Peringkat hanya baca untuk suatu kategori dan cakupan geografis. | Umum |
| GET | /v1/tiers7 tingkatan harga yang telah dikonfigurasi (ambang batas, manfaat yang tidak terkunci). | Umum |
| GET | /v1/referral-programPersentase komisi yang saat ini berlaku untuk sistem rujukan berjenjang dan Leaders Pool. | Umum |
| GET | /v1/partner-programPembagian 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.
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.
| POST | /v1/advertisers/{id}/ai/assistantTanyakan 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-studioBuat judul iklan, deskripsi, dan kata kunci berdasarkan deskripsi singkat tentang bisnis tersebut. | 2 kredit |
| POST | /v1/advertisers/{id}/ai/creative-studio/imageBuat 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-advisorProyeksi 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-auditAnalisis situs web eksternal milik pengiklan tersebut dan berikan saran perbaikan SEO yang konkret. | 2 kredit |
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
}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.
<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>data-category | ID 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-geo | Cakupan geografis: lokal, regional, atau global. Pengaturan defaultnya adalah global. |
data-count | Jumlah iklan yang akan ditampilkan. Nilai defaultnya adalah 4. |
data-columns | Jumlah kolom kisi. Nilai defaultnya adalah 2. |
data-layout | grid, 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-offset | Jumlah 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-partner | ID 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. |
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.
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.
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.succeeded | Pembayaran telah dikonfirmasi. |
payment.refunded | Pengembalian dana telah dilakukan. |
ad.activated | Sebuah iklan mulai ditayangkan, baik secara otomatis maupun setelah ditinjau oleh admin. |
invoice.issued | Sebuah faktur telah diterbitkan. |
referral.payout.completed | Komisi rujukan telah mencapai status "telah dibayarkan". |
referral.payout.failed | Sebuah batch pembayaran rujukan gagal di pihak penyedia — penghasilan dikembalikan ke status "terutang" dan akan dicoba kembali. |
rank.changed | Peringkat iklan dapat berubah — termasuk ketika hal itu disebabkan oleh pembayaran dari pengiklan lain. |
ad.expiring_soon | 30, 7, atau 1 hari sebelum iklan berakhir. |
partner_ad_revenue.payout.completed | Pembayaran bagi hasil pendapatan iklan telah mencapai status "dibayarkan". |
partner_ad_revenue.payout.failed | Sebuah batch pembayaran bagi hasil pendapatan iklan mengalami kegagalan di pihak penyedia — bagian-bagian tersebut dikembalikan ke daftar yang harus dibayarkan dan akan dicoba kembali. |
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.
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": "...",
},
)