Annual Ads platformunda doğrudan çalışma — reklamverenler oluşturun, reklamları yayınlayın, ödemeleri başlatın ve sıralamayı takip edin; tüm bunları tamamen API aracılığıyla gerçekleştirin.
Fiyat tablosunun tamamını inceleyin70%’si sizde kalır Connect modundaki reklamverenlerin reklamları için ödediği tutarın bir kısmı — otomatik olarak cüzdanınıza yatırılır. Nasıl çalıştığını aşağıda görebilirsiniz.
Her istek, Bearer şeması kullanılarak Authorization başlığındaki gizli anahtarla doğrulanır.
POST https://api.adhub365.com/v1/partner/ads
Authorization: Bearer sk_sandbox_...
Content-Type: application/jsonAPI anahtarları, Annual Ads ekibi tarafından onaylanmış iş ortağı hesaplarına verilir.
Ortak hesabı oluşturun| POST | /v1/partner/advertisersKullanıcılarınızdan birinin adına bir reklamveren hesabı oluşturun (Bağlantı modu). | advertisers:write |
| GET | /v1/partner/advertisers/{id}Bu iş ortağı tarafından oluşturulan bir reklamveren hesabını arayın. | advertisers:read |
| POST | /v1/partner/adsBir reklam oluşturun. Reklam, taslak durumunda başlar. İsteğe bağlı olan advertiser_type, promotion_type, link_type ve promoted_brand alanları, ortaklık, yönlendirme, içerik üreticisi veya bireysel reklamcılığı tanımlar — aşağıdaki nota bakınız. | ads:write |
| GET | /v1/partner/ads/{id}Bir ilanı inceleyin. | ads:read |
| PATCH | /v1/partner/ads/{id}Yayın içeriğini güncelleyin — başlık, açıklama, bağlantı, reklamveren türü, tanıtım türü, bağlantı türü ve tanıtılan marka. Kategori, coğrafi bölge ve sıralama motoru tarafından okunan diğer tüm bilgiler buradan asla değiştirilemez. | ads:write |
| POST | /v1/partner/ads/{id}/imageBir reklam görselini doğrudan yükleyin (JPEG/PNG/WebP, en fazla 5 MB). İlk ödeme yapılmadan önce zorunludur — aşağıdaki “Ödemeler” bölümüne bakınız. | ads:write |
| POST | /v1/partner/ads/{id}/image-urlBir dosyayı yüklemek yerine bir reklamın görselini bir URL'den ayarlayın — sunucu görseli kendisi alır ve yeniden barındırır. Aynı şart geçerlidir: ilk ödemeden önce yapılması gerekir. | ads:write |
| GET | /v1/partner/ads/{id}/rankBir reklamın mevcut sıralaması, kategorisi ve coğrafi kapsamı. | ads:read |
| GET | /v1/partner/ads/{id}/statsBir reklamın toplam görüntüleme ve tıklama sayısı ile geçmiş/kalan gün sayısı, GET /{id} isteğinde zaten bulunan activated_at/expires_at alanlarından alınır; sıralama ise GET /{id}/rank isteğinden alınır. | ads:read |
| POST | /v1/partner/paymentsİlk satın alma işlemi veya bakiye yüklemesi için bir kripto ödemesi başlatın. Reklamda halihazırda bir resim bulunmuyorsa, ilk ödeme 422 hatasıyla başarısız olur — yukarıdaki uploadAdImage/setAdImageUrl bölümüne bakın. | payments:write |
| GET | /v1/partner/payments/{id}Bir ödemenin durumunu kontrol edin. | payments:read |
| POST | /v1/partner/referralsBir yönlendirme bağlantısı oluşturun. | referrals:write |
| GET | /v1/partner/referrals/{code}/earningsDuruma göre ayrılmış toplam tavsiye gelirleri. | referrals:read |
| GET | /v1/partner/ad-revenue/earningsConnect modunda oluşturduğunuz reklamverenlerin reklamları için ödedikleri tutarın %70’lik payınız, duruma göre ayrıntılı olarak. | ad-revenue:read |
| GET | /v1/partner/access-logBu anahtara ait tam çağrı geçmişi — yöntem, yol, IP, zaman damgası. | Orada |
| GET | /v1/rankings?category={id}&geo={scope}Bir kategori ve coğrafi kapsam için salt okunur sıralama. | Genel |
| GET | /v1/tiersYapılandırılmış 7 fiyatlandırma kademesi (eşik değer, kilidi açılmış avantajlar). | Genel |
| GET | /v1/referral-programŞu anda yönlendirme zinciri ve Liderler Havuzu için geçerli olan komisyon yüzdeleri. | Genel |
| GET | /v1/partner-programSizinle Annual Ads arasındaki mevcut reklam geliri dağılımı (Connect modu). | Genel |
| GET | /v1/search?q={query}Doğal dil araması — "Kenya'daki mobilya reklamcıları" gibi bir sorguyu uygun kategoriye ve coğrafi alana yönlendirir, ardından sıralamayı tam olarak gerçek sırasına göre döndürür. | Genel |
Ortaklık ve tavsiye reklamcılığı
advertiser_type, promotion_type, link_type ve promoted_brand, /v1/partner/ads adresine yapılan POST ve PATCH isteklerinde isteğe bağlı alanlardır — Annual Ads, yalnızca kendi reklamlarını veren işletmelerle sınırlı değildir. link_type değeri affiliate_link veya referral_invitation_link olduğunda ya da promotion_type değeri affiliate_offer veya referral_opportunity olduğunda, affiliate_terms_accepted değeri true olmalıdır; aksi takdirde istek 422 hatasıyla reddedilir. title alanı en fazla 35 karakter, description alanı ise en fazla 80 karakter olabilir — her ikisi de sadece kontrol paneli kullanıcı arayüzünde değil, sunucu tarafında da uygulanır.
Her reklamveren hesabına, sabit yıllık ücretin yanı sıra, AI kredileriyle ödenen bir dizi yerleşik AI aracı sunulur: bir reklam içeriği ve görsel oluşturucu, bir sohbet asistanı, bir bütçe danışmanı ve bir harici SEO denetçisi.
| POST | /v1/advertisers/{id}/ai/assistantAsk Annual Ads — hesap verileri üzerinde yalnızca okuma erişimine sahip, sadece bilgi amaçlı çalışan bir yüzen konuşma asistanı. | Genel |
| POST | /v1/advertisers/{id}/ai/creative-studioKısa bir işletme tanımından bir reklam başlığı, açıklaması ve anahtar kelimeler oluşturun. | 2 kredi |
| POST | /v1/advertisers/{id}/ai/creative-studio/imageAynı işletme açıklamasından, barındırılmış ve bir ilana eklenmeye hazır bir ilan görseli (PNG) oluşturun. | 8 kredi |
| POST | /v1/advertisers/{id}/ai/budget-advisor30/90/365 gün sonra belirli bir sıralamayı koruma olasılığına ilişkin gerçek bir istatistiksel tahmin — asla keyfi bir tahminden ibaret değil. | 1 kredi |
| POST | /v1/advertisers/{id}/ai/seo-auditReklamverenin kendi harici web sitesini analiz edin ve somut SEO iyileştirmeleri önerin. | 2 kredi |
Aşağıdaki resim oluşturucuya da aynı kategori ve işletme açıklaması temel alınarak oluşturulmuştur.
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
}Aynı reklam için uygun bir görsel oluşturun:
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
}Hazır bir reklam birimini kendi sitenize sürükleyip bırakın — kurulum gerektirmez, iframe kullanmaya gerek yoktur. Komut dosyası, izole edilmiş bir Shadow DOM içinde doğrudan sayfaya yüklenir; bu sayede, reklam biriminin stilleri asla sitenize sızmaz ve sitenizin stilleri de reklam birimine sızmaz.
<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>Varsayılan olarak bu, kategorinin tam genel sıralamasını gösterir — sadece sizin platforma kazandırdıklarınız değil, platformdaki tüm reklamverenler. Yalnızca Connect modu aracılığıyla oluşturduğunuz reklamverenlerin reklamlarını (payınızı oluşturan reklamları) göstermek için, ortak kimliğinizi içeren “data-partner” özniteliğini ekleyin (bu kimliği kendi kontrol panelinizin Geliştiriciler sayfasında bulabilirsiniz):
<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>Reklamverenleriniz birkaç kategoriye yayılıyorsa, “data-category” özniteliğini tamamen kaldırın — sadece “data-partner” özniteliği kullanıldığında, widget tüm kategorilerdeki reklamlarınızın her birini tek bir ızgarada gösterir; böylece her kategori için ayrı bir widget bloğu kullanmanıza gerek kalmaz:
<div
class="annualads-widget"
data-geo="global"
data-partner="YOUR_PARTNER_ID"
></div>
<script async src="https://adhub365.com/widget.js"></script>İçerik içi reklam bloğunuzun yanında, her biri farklı reklamlar gösteren bir altbilgi tarzı reklam bloğu mu istiyorsunuz? data-layout="compact" (tek bir reklam, küçük bir hap şeklinde daraltılabilir) ve data-offset değeri ilk widget’ınızın halihazırda gösterdiği reklam sayısına ayarlanmış ikinci bir widget bloğu ekleyin:
<!-- 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 | Görüntülenecek kategori kimliği. Zorunlu — “data-partner” ayarı yapılmamışsa; bu ayar yapıldığında ise bu alanın boş bırakılması, söz konusu iş ortağının reklamlarının tüm kategorilerde gösterileceği anlamına gelir. |
data-geo | Coğrafi kapsam: yerel, bölgesel veya küresel. Varsayılan ayar küreseldir. |
data-count | Gösterilecek reklam sayısı. Varsayılan değer 4’tür. |
data-columns | Tablonun sütun sayısı. Varsayılan değer 2’dir. |
data-layout | ızgara, liste veya kompakt. Varsayılan ayar ızgaradır. “Kompakt” seçeneği, reklamı küçük bir hap şeklinde daraltıp geri getirmek için bir düğme içeren tek bir reklam gösterir (data-count değeri göz ardı edilir) — bu, altbilgi tarzında bir birimdir ve komut dosyası tarafından asla sabit konumlandırılmaz; konteyner div’ini kendi sayfanızda istediğiniz gibi yerleştirip stil verebilirsiniz. |
data-offset | Atlanacak en üst sıradaki reklamların sayısı. Varsayılan değer 0’dır. Aynı sayfadaki ikinci bir widget’ın (örneğin, altbilgide yer alan kompakt bir widget ile daha yukarıda bulunan ızgara biçimindeki bir widget), aynı reklamı iki kez tekrarlamak yerine farklı reklamlar göstermesini sağlar — diğer widget’ın halihazırda gösterdiği reklam sayısını belirtin. |
data-partner | Ortaklık kimliğiniz (kendi kontrol panelinizin “Geliştiriciler” sayfasında bulabilirsiniz). İsteğe bağlı — bu bilgi girilmezse, widget o kategorideki tam genel sıralamayı, yani platformdaki tüm reklamverenleri gösterir. Bu bilgi girildiğinde ise, yalnızca Connect modu aracılığıyla platforma kazandırdığınız reklamverenlerin reklamları gösterilir — yani size pay kazandıran reklamverenler. |
İstekler, anahtar başına ve dakika başına bir sınırla kısıtlanmaktadır. Kimliği doğrulanmış her yanıtta X-RateLimit-Limit, X-RateLimit-Remaining ve X-RateLimit-Reset başlıkları bulunur; sınırın aşılması durumunda, Retry-After başlığı içeren 429 Too Many Requests hatası döndürülür.
İsteğe bağlı, her bir iş ortağı için. Bir kayıt ekleyene kadar, anahtarlarınız herhangi bir IP adresinden gelen istekleri kabul eder — ilk kayıt, o iş ortağının tüm anahtarlarını yalnızca izin verilenler listesine göre çalışacak şekilde değiştirir.
Her webhook, oluşturulduğu anda tek seferlik olarak verilen bir gizli anahtar kullanılarak HMAC-SHA256 ile imzalanır — yük bilgisine güvenmeden önce imzayı doğrulayın. Olaylar, yalnızca ilgili reklamverenin sahibi olan iş ortağına iletilir.
payment.succeeded | Ödeme onaylandı. |
payment.refunded | Geri ödeme gerçekleştirilmiştir. |
ad.activated | Bir ilan, otomatik olarak ya da yönetici tarafından incelenmesinin ardından yayına girer. |
invoice.issued | Bir fatura düzenlenir. |
referral.payout.completed | Bir tavsiye komisyonu “ödenmiş” durumuna ulaşır. |
referral.payout.failed | Bir tavsiye ödemesi toplu işlemi sağlayıcıda başarısız olur — kazançlar “ödenecekler” hesabına geri döner ve işlem yeniden denenir. |
rank.changed | Bir reklamın sıralaması değişebilir — başka bir reklamverenin yaptığı ödeme nedeniyle de dahil olmak üzere. |
ad.expiring_soon | Bir ilanın süresinin dolmasından 30, 7 veya 1 gün önce. |
partner_ad_revenue.payout.completed | Bir reklam gelir payı ödemesi, “ödenmiş” durumuna ulaşır. |
partner_ad_revenue.payout.failed | Bir reklam gelir payı ödemesi, sağlayıcı tarafında başarısız olur — paylar “ödenecekler” listesine geri döner ve işlem yeniden denenir. |
Aynı API spesifikasyonundan oluşturulan resmi JavaScript/TypeScript ve Python SDK’ları planlanmaktadır ancak henüz yayınlanmamıştır — o zamana kadar HTTP API’sini doğrudan çağırınız.
Henüz bir SDK yok — bunlar HTTP API’sini doğrudan çağırıyor ve şu anda herhangi bir programlama dilinde çalışıyor.
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": "...",
},
)