สร้างระบบโดยตรงบนแพลตฟอร์ม Annual Ads — สร้างผู้โฆษณา เผยแพร่โฆษณา ดำเนินการชำระเงิน และติดตามอันดับ — ทั้งหมดผ่าน API
ดูตารางราคาทั้งหมดคุณยังคงมี 70% จากจำนวนเงินที่ผู้ลงโฆษณาในโหมด Connect จ่ายสำหรับโฆษณาของพวกเขา — ซึ่งจะถูกโอนเข้ากระเป๋าเงินของคุณโดยอัตโนมัติ ดูวิธีการทำงานด้านล่างนี้
ทุกคำขอจะได้รับการตรวจสอบความถูกต้องด้วยกุญแจลับในส่วนหัว Authorization โดยใช้รูปแบบ Bearer
POST https://api.adhub365.com/v1/partner/ads
Authorization: Bearer sk_sandbox_...
Content-Type: application/jsonทีม Annual Ads จะออกกุญแจ API ให้กับบัญชีพันธมิตรที่ได้รับการอนุมัติ
สร้างบัญชีพันธมิตร| POST | /v1/partner/advertisersสร้างบัญชีผู้ลงโฆษณาแทนผู้ใช้ของคุณคนหนึ่ง (โหมด Connect) | advertisers:write |
| GET | /v1/partner/advertisers/{id}ค้นหาบัญชีผู้ลงโฆษณาที่สร้างโดยพันธมิตรนี้ | advertisers:read |
| POST | /v1/partner/adsสร้างโฆษณา โฆษณาจะอยู่ในสถานะร่างตั้งแต่แรก สนามข้อมูล advertiser_type, promotion_type, link_type และ promoted_brand (เป็นตัวเลือก) ใช้เพื่อระบุประเภทโฆษณา เช่น โฆษณาแบบพันธมิตร (affiliate), โฆษณาแบบแนะนำ (referral), โฆษณาแบบผู้สร้างเนื้อหา (creator) หรือโฆษณาแบบบุคคล — ดูหมายเหตุด้านล่าง | 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, ขนาดสูงสุด 5 MB) ต้องทำก่อนการชำระเงินครั้งแรก — ดูส่วนการชำระเงินด้านล่าง | 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ส่วนแบ่ง 70% ของคุณจากจำนวนเงินที่ผู้โฆษณาที่คุณสร้างขึ้นในโหมด Connect จ่ายสำหรับโฆษณาของพวกเขา แบ่งตามสถานะ | ad-revenue:read |
| GET | /v1/partner/access-logประวัติการเรียกใช้ทั้งหมดสำหรับคีย์นี้ — วิธี, เส้นทาง, IP, เวลา | ที่นั่น |
| GET | /v1/rankings?category={id}&geo={scope}อันดับแบบอ่านเท่านั้น สำหรับหมวดหมู่และพื้นที่ทางภูมิศาสตร์ | สาธารณะ |
| GET | /v1/tiers7 ระดับราคาที่กำหนดไว้ (ระดับขั้นต่ำ, สิทธิประโยชน์ที่ปลดล็อกแล้ว) | สาธารณะ |
| GET | /v1/referral-programอัตราค่าคอมมิชชันที่ใช้อยู่ในปัจจุบันสำหรับระบบแนะนำแบบขั้นบันไดและ Leaders Pool | สาธารณะ |
| GET | /v1/partner-programการแบ่งรายได้จากโฆษณาในปัจจุบัน (โหมด Connect) ระหว่างคุณและ Annual Ads. | สาธารณะ |
| GET | /v1/search?q={query}การค้นหาด้วยภาษาธรรมชาติ — จะนำคำค้นหา เช่น "ผู้โฆษณาเฟอร์นิเจอร์ในเคนยา" ไปยังหมวดหมู่และพื้นที่ทางภูมิศาสตร์ที่ตรงกัน แล้วแสดงผลการจัดอันดับตามลำดับที่แท้จริง | สาธารณะ |
โฆษณาแบบพันธมิตรและระบบแนะนำ
advertiser_type, promotion_type, link_type และ promoted_brand เป็นฟิลด์ที่เลือกใช้ได้ในการส่งคำขอ POST และ PATCH ไปยัง /v1/partner/ads — Annual Ads ไม่จำกัดเฉพาะธุรกิจที่โฆษณาตัวเองเท่านั้น เมื่อ link_type เป็น affiliate_link หรือ referral_invitation_link หรือ promotion_type เป็น affiliate_offer หรือ referral_opportunity แล้ว affiliate_terms_accepted ต้องเป็น true มิฉะนั้นคำขอจะถูกปฏิเสธด้วยรหัส 422 title มีขีดจำกัดสูงสุด 35 ตัวอักษร และ description สูงสุด 80 ตัวอักษร — ทั้งสองถูกบังคับใช้ด้านเซิร์ฟเวอร์ ไม่ใช่เพียงใน UI ของแดชบอร์ดเท่านั้น
ทุกบัญชีผู้ลงโฆษณาจะได้รับชุดเครื่องมือ AI ที่มาพร้อมระบบ — ได้แก่ เครื่องสร้างเนื้อหาและภาพโฆษณา, ผู้ช่วยสนทนา, ที่ปรึกษาด้านงบประมาณ และเครื่องมือตรวจสอบ SEO จากภายนอก — ซึ่งใช้เครดิต AI ในการชำระค่าบริการ นอกเหนือจากค่าบริการรายปีแบบคงที่
| 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การคาดการณ์ทางสถิติที่แท้จริง — ไม่ใช่การคาดเดาแบบสร้างขึ้น — เกี่ยวกับโอกาสที่จะรักษาอันดับที่กำหนดไว้ที่ 30/90/365 วัน | 1 หน่วยกิต |
| POST | /v1/advertisers/{id}/ai/seo-auditวิเคราะห์เว็บไซต์ภายนอกของผู้ลงโฆษณาและเสนอแนวทางปรับปรุง SEO ที่ชัดเจน | 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 พร้อมด้วย ID ของพันธมิตร (สามารถหาได้บนหน้า Developers ในแดชบอร์ดของคุณ):
<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>ต้องการเพิ่มหน่วยแบบ footer ควบคู่กับหน่วยในเนื้อหา ซึ่งแต่ละหน่วยแสดงโฆษณาต่างกันหรือไม่? ให้เพิ่มบล็อก widget ที่สอง โดยตั้งค่า data-layout="compact" (โฆษณาเดียว ที่สามารถพับลงเป็นรูปเม็ดยาขนาดเล็ก) และตั้งค่า data-offset ให้เท่ากับจำนวนโฆษณาที่ widget ตัวแรกแสดงอยู่แล้ว:
<!-- 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 | จำนวนโฆษณาที่จะแสดง ค่าเริ่มต้นคือ 4 |
data-columns | จำนวนคอลัมน์ของตาราง ค่าเริ่มต้นคือ 2 |
data-layout | grid, list หรือ compact. ค่าเริ่มต้นคือ grid. โหมด compact จะแสดงโฆษณาเพียงชิ้นเดียว (ค่า data-count จะถูกละเว้น) พร้อมปุ่มเพื่อย่อให้เหลือเป็นรูปเม็ดยาขนาดเล็กและขยายกลับ — เป็นหน่วยแบบ footer ที่สคริปต์เองจะไม่กำหนดตำแหน่งให้คงที่ คุณจึงสามารถวางและจัดรูปแบบ div ที่บรรจุได้ตามที่ชอบบนหน้าเว็บของคุณเอง |
data-offset | จำนวนโฆษณาอันดับต้นๆ ที่ต้องการข้าม ค่าเริ่มต้นคือ 0 ช่วยให้วิดเจ็ตที่สองบนหน้าเดียวกัน (เช่น วิดเจ็ตขนาดเล็กในส่วนท้ายหน้า และวิดเจ็ตแบบกริดที่อยู่ด้านบน) แสดงโฆษณาที่แตกต่างกัน แทนที่จะแสดงโฆษณาเดียวกันซ้ำสองครั้ง — ส่งค่าจำนวนโฆษณาที่วิดเจ็ตอีกตัวหนึ่งแสดงไปแล้ว |
data-partner | ID ของพันธมิตรของคุณ (สามารถหาได้บนหน้า Developers ในแดชบอร์ดของคุณ) เป็นข้อมูลที่เลือกใช้ได้ — หากไม่ใส่ ID นี้ วิดเจ็ตจะแสดงอันดับสาธารณะทั้งหมดสำหรับหมวดหมู่นั้น รวมถึงผู้ลงโฆษณาทุกคนบนแพลตฟอร์ม แต่หากใส่ ID นี้ วิดเจ็ตจะแสดงเฉพาะโฆษณาจากผู้ลงโฆษณาที่คุณนำเข้ามาผ่านโหมด 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 | 30, 7 หรือ 1 วัน ก่อนที่โฆษณาจะหมดอายุ |
partner_ad_revenue.payout.completed | การจ่ายส่วนแบ่งรายได้จากโฆษณาได้เข้าสู่สถานะ "จ่ายแล้ว" |
partner_ad_revenue.payout.failed | การจ่ายส่วนแบ่งรายได้จากโฆษณาในชุดหนึ่งล้มเหลวที่ผู้ให้บริการ — ส่วนแบ่งดังกล่าวถูกส่งกลับไปยังสถานะ "ต้องจ่าย" และจะได้รับการลองใหม่ |
มีแผนที่จะปล่อย SDK อย่างเป็นทางการสำหรับ JavaScript/TypeScript และ Python ซึ่งถูกสร้างขึ้นจากข้อกำหนด API เดียวกันนี้ แต่ยังไม่ได้เผยแพร่ — จนกว่าจะมีการเผยแพร่ ให้เรียกใช้ HTTP API โดยตรง
ยังไม่มี SDK — ฟังก์ชันเหล่านี้เรียก HTTP API โดยตรง และสามารถใช้งานได้ทันทีในทุกภาษา
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": "...",
},
)