Phát triển trực tiếp trên nền tảng Annual Ads — tạo tài khoản nhà quảng cáo, đăng quảng cáo, thực hiện thanh toán và theo dõi thứ hạng, hoàn toàn thông qua API.
Xem bảng giá đầy đủBạn vẫn giữ 70% từ số tiền mà các nhà quảng cáo ở chế độ Connect trả cho quảng cáo của họ — số tiền này sẽ được chuyển tự động vào ví của bạn. Hãy xem cách thức hoạt động dưới đây.
Mỗi yêu cầu đều được xác thực bằng một khóa bí mật trong tiêu đề Authorization, thông qua cơ chế Bearer.
POST https://api.adhub365.com/v1/partner/ads
Authorization: Bearer sk_sandbox_...
Content-Type: application/jsonCác khóa API được nhóm Annual Ads cấp cho các tài khoản đối tác đã được phê duyệt.
Tạo tài khoản đối tác| POST | /v1/partner/advertisersTạo tài khoản nhà quảng cáo thay mặt cho một trong những người dùng của bạn (chế độ Connect). | advertisers:write |
| GET | /v1/partner/advertisers/{id}Tra cứu tài khoản nhà quảng cáo do đối tác này tạo. | advertisers:read |
| POST | /v1/partner/adsTạo một quảng cáo. Quảng cáo sẽ bắt đầu ở trạng thái bản nháp. Các trường tùy chọn như advertiser_type, promotion_type, link_type và promoted_brand dùng để mô tả các loại quảng cáo như liên kết tiếp thị, giới thiệu, người sáng tạo nội dung hoặc cá nhân — xem lưu ý bên dưới. | ads:write |
| GET | /v1/partner/ads/{id}Tìm kiếm một quảng cáo. | ads:read |
| PATCH | /v1/partner/ads/{id}Cập nhật nội dung biên tập — tiêu đề, mô tả, liên kết, loại nhà quảng cáo, loại chương trình khuyến mãi, loại liên kết và thương hiệu được quảng bá. Danh mục, khu vực địa lý và bất kỳ thông tin nào được công cụ xếp hạng đọc đều không thể thay đổi tại đây. | ads:write |
| POST | /v1/partner/ads/{id}/imageTải lên trực tiếp hình ảnh quảng cáo (định dạng JPEG/PNG/WebP, tối đa 5 MB). Yêu cầu này phải được thực hiện trước khi thực hiện khoản thanh toán đầu tiên — xem phần “Thanh toán” bên dưới. | ads:write |
| POST | /v1/partner/ads/{id}/image-urlĐặt hình ảnh quảng cáo từ một URL thay vì tải lên tệp — máy chủ sẽ tự động tải về và lưu trữ lại hình ảnh đó. Yêu cầu tương tự: phải thực hiện trước khi thực hiện khoản thanh toán đầu tiên. | ads:write |
| GET | /v1/partner/ads/{id}/rankXếp hạng hiện tại, danh mục và phạm vi địa lý của một quảng cáo. | ads:read |
| GET | /v1/partner/ads/{id}/statsTổng số lượt xem và lượt nhấp vào quảng cáo — số ngày đã trôi qua/còn lại được lấy từ các trường `activated_at`/`expires_at` đã có sẵn trong yêu cầu GET /{id}, còn thứ hạng được lấy từ yêu cầu GET /{id}/rank. | ads:read |
| POST | /v1/partner/paymentsBắt đầu thanh toán bằng tiền điện tử cho giao dịch mua ban đầu hoặc nạp tiền. Giao dịch thanh toán ban đầu sẽ bị lỗi với mã 422 trừ khi quảng cáo đã có hình ảnh — xem phần uploadAdImage/setAdImageUrl ở trên. | payments:write |
| GET | /v1/partner/payments/{id}Kiểm tra trạng thái thanh toán. | payments:read |
| POST | /v1/partner/referralsTạo liên kết giới thiệu. | referrals:write |
| GET | /v1/partner/referrals/{code}/earningsTổng thu nhập từ giới thiệu, phân tích theo từng trạng thái. | referrals:read |
| GET | /v1/partner/ad-revenue/earnings70% phần chia của bạn từ số tiền mà các nhà quảng cáo do bạn tạo ra trong chế độ Connect đã chi trả cho quảng cáo của họ, được phân loại theo trạng thái. | ad-revenue:read |
| GET | /v1/partner/access-logLịch sử cuộc gọi đầy đủ cho khóa này — phương thức, đường dẫn, địa chỉ IP, dấu thời gian. | Ở đó |
| GET | /v1/rankings?category={id}&geo={scope}Xếp hạng chỉ đọc cho một danh mục và phạm vi địa lý. | Công khai |
| GET | /v1/tiers7 mức giá đã được thiết lập (mức ngưỡng, các quyền lợi được mở khóa). | Công khai |
| GET | /v1/referral-programCác tỷ lệ hoa hồng hiện đang áp dụng cho chương trình giới thiệu theo cấp bậc và Quỹ Lãnh đạo. | Công khai |
| GET | /v1/partner-programTỷ lệ chia sẻ doanh thu quảng cáo hiện tại (chế độ Connect) giữa bạn và Annual Ads. | Công khai |
| GET | /v1/search?q={query}Tìm kiếm bằng ngôn ngữ tự nhiên — chuyển một truy vấn như "các nhà quảng cáo đồ nội thất ở Kenya" đến danh mục và phạm vi địa lý phù hợp, sau đó trả về kết quả xếp hạng đó theo thứ tự chính xác như thực tế. | Công khai |
Quảng cáo liên kết và giới thiệu
advertiser_type, promotion_type, link_type và promoted_brand là các trường tùy chọn trong các yêu cầu POST và PATCH gửi đến /v1/partner/ads — Annual Ads không chỉ giới hạn ở các doanh nghiệp tự quảng cáo cho mình. Khi link_type là affiliate_link hoặc referral_invitation_link, hoặc promotion_type là affiliate_offer hoặc referral_opportunity, affiliate_terms_accepted phải có giá trị true, nếu không yêu cầu sẽ bị từ chối với mã trạng thái 422. "title" bị giới hạn tối đa 35 ký tự và "description" tối đa 80 ký tự — cả hai đều được áp dụng ở phía máy chủ, không chỉ trong giao diện người dùng (UI) của bảng điều khiển.
Mỗi tài khoản nhà quảng cáo đều được cung cấp một bộ công cụ AI tích hợp sẵn — bao gồm công cụ tạo nội dung và hình ảnh quảng cáo, trợ lý trò chuyện, công cụ tư vấn ngân sách và công cụ kiểm tra SEO bên ngoài — được thanh toán bằng tín dụng AI, bên cạnh mức giá cố định hàng năm.
| POST | /v1/advertisers/{id}/ai/assistantHỏi Annual Ads — một trợ lý trò chuyện ảo, chỉ mang tính chất cung cấp thông tin, chỉ có quyền truy cập đọc đối với dữ liệu tài khoản. | Công khai |
| POST | /v1/advertisers/{id}/ai/creative-studioTạo tiêu đề quảng cáo, mô tả và từ khóa dựa trên một đoạn mô tả ngắn về doanh nghiệp. | 2 tín chỉ |
| POST | /v1/advertisers/{id}/ai/creative-studio/imageTạo hình ảnh danh sách (PNG) dựa trên cùng một mô tả doanh nghiệp, đã được lưu trữ và sẵn sàng để đính kèm vào quảng cáo. | 8 tín chỉ |
| POST | /v1/advertisers/{id}/ai/budget-advisorMột dự báo thống kê thực sự — chứ không phải là một phỏng đoán mang tính suy diễn — về xác suất duy trì một thứ hạng nhất định sau 30/90/365 ngày. | 1 tín chỉ |
| POST | /v1/advertisers/{id}/ai/seo-auditPhân tích trang web bên ngoài của chính nhà quảng cáo và đề xuất các biện pháp cải thiện SEO cụ thể. | 2 tín chỉ |
Danh mục và mô tả hoạt động kinh doanh này cũng được sử dụng làm cơ sở cho công cụ tạo hình ảnh bên dưới.
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
}Tạo hình ảnh phù hợp cho quảng cáo đó:
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
}Chỉ cần kéo và thả một đơn vị quảng cáo đã được tạo sẵn vào trang web của bạn — không cần bước xây dựng, không cần iframe. Tập lệnh này được hiển thị trực tiếp trên trang trong một Shadow DOM cách ly, do đó các kiểu định dạng của nó sẽ không bao giờ ảnh hưởng đến trang web của bạn, và ngược lại, các kiểu định dạng của trang web bạn cũng sẽ không bao giờ ảnh hưởng đến nó.
<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>Theo mặc định, phần này hiển thị bảng xếp hạng công khai đầy đủ cho danh mục đó — bao gồm tất cả các nhà quảng cáo trên nền tảng, không chỉ những nhà quảng cáo do bạn giới thiệu. Để chỉ hiển thị các quảng cáo từ những nhà quảng cáo mà bạn đã tạo thông qua Chế độ Connect (những nhà quảng cáo mang lại phần chia sẻ cho bạn), hãy thêm thuộc tính `data-partner` kèm theo ID đối tác của bạn (bạn có thể tìm thấy ID này trên trang Nhà phát triển trong bảng điều khiển của chính bạn):
<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>Nếu các nhà quảng cáo của bạn thuộc nhiều danh mục khác nhau, hãy loại bỏ hoàn toàn thuộc tính `data-category` — chỉ cần giữ lại thuộc tính `data-partner`, tiện ích sẽ hiển thị tất cả các quảng cáo của bạn thuộc mọi danh mục trong một lưới duy nhất, thay vì phải tạo một khối tiện ích riêng cho từng danh mục:
<div
class="annualads-widget"
data-geo="global"
data-partner="YOUR_PARTNER_ID"
></div>
<script async src="https://adhub365.com/widget.js"></script>Bạn muốn có một đơn vị quảng cáo kiểu chân trang bên cạnh đơn vị quảng cáo trong nội dung, mỗi đơn vị hiển thị các quảng cáo khác nhau? Hãy thêm một khối widget thứ hai với thuộc tính `data-layout="compact"` (một quảng cáo duy nhất, có thể thu gọn thành ô nhỏ) và thuộc tính `data-offset` được đặt bằng số lượng quảng cáo mà widget đầu tiên của bạn đang hiển thị:
<!-- 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 danh mục cần hiển thị. Bắt buộc — trừ khi đã thiết lập thuộc tính `data-partner`; trong trường hợp đó, việc bỏ trống trường này sẽ hiển thị quảng cáo của đối tác đó trên tất cả các danh mục. |
data-geo | Phạm vi địa lý: địa phương, khu vực hoặc toàn cầu. Mặc định là toàn cầu. |
data-count | Số lượng quảng cáo sẽ hiển thị. Giá trị mặc định là 4. |
data-columns | Số cột của lưới. Giá trị mặc định là 2. |
data-layout | bố cục dạng lưới, danh sách hoặc dạng gọn. Mặc định là bố cục dạng lưới. Chế độ “compact” hiển thị một quảng cáo duy nhất (thuộc tính `data-count` sẽ bị bỏ qua) kèm theo nút để thu gọn quảng cáo thành một ô nhỏ và mở rộng lại — đây là một đơn vị kiểu chân trang, không bao giờ được skript tự động cố định vị trí; bạn có thể tự do đặt vị trí và định dạng phần tử `div` chứa quảng cáo theo ý muốn trên trang của mình. |
data-offset | Số lượng quảng cáo có thứ hạng cao nhất cần bỏ qua. Giá trị mặc định là 0. Tính năng này cho phép một widget thứ hai trên cùng một trang (ví dụ: một widget nhỏ gọn ở phần chân trang và một widget dạng lưới ở phía trên) hiển thị các quảng cáo khác nhau thay vì lặp lại cùng một quảng cáo hai lần — hãy truyền vào số lượng quảng cáo mà widget kia đã hiển thị. |
data-partner | ID đối tác của bạn (bạn có thể tìm thấy thông tin này trên trang “Developers” trong bảng điều khiển cá nhân). Tùy chọn — nếu không nhập ID này, tiện ích sẽ hiển thị bảng xếp hạng công khai đầy đủ cho danh mục đó, bao gồm tất cả các nhà quảng cáo trên nền tảng. Nếu nhập ID này, tiện ích sẽ chỉ hiển thị các quảng cáo từ những nhà quảng cáo mà bạn đã giới thiệu thông qua chế độ Connect — tức là những nhà quảng cáo thực sự mang lại phần chia sẻ hoa hồng cho bạn. |
Số lượng yêu cầu được giới hạn theo từng khóa và theo từng phút. Mỗi phản hồi đã được xác thực đều chứa các tiêu đề X-RateLimit-Limit, X-RateLimit-Remaining và X-RateLimit-Reset; nếu vượt quá giới hạn, hệ thống sẽ trả về mã trạng thái 429 Too Many Requests kèm theo tiêu đề Retry-After.
Tùy chọn, cho từng đối tác. Cho đến khi bạn thêm một mục, các khóa của bạn sẽ chấp nhận yêu cầu từ bất kỳ địa chỉ IP nào — mục đầu tiên sẽ chuyển tất cả các khóa của đối tác đó sang chế độ chỉ cho phép các địa chỉ trong danh sách cho phép.
Mỗi webhook đều được ký bằng HMAC-SHA256 bằng cách sử dụng một khóa bí mật được cấp một lần duy nhất tại thời điểm tạo — hãy xác minh chữ ký trước khi tin tưởng vào nội dung tin nhắn. Các sự kiện chỉ được gửi đến đối tác sở hữu nhà quảng cáo liên quan.
payment.succeeded | Giao dịch thanh toán đã được xác nhận. |
payment.refunded | Việc hoàn tiền đã được thực hiện. |
ad.activated | Một quảng cáo sẽ được kích hoạt, tự động hoặc sau khi được quản trị viên duyệt. |
invoice.issued | Hóa đơn đã được lập. |
referral.payout.completed | Hoa hồng giới thiệu đã đạt trạng thái đã thanh toán. |
referral.payout.failed | Một đợt thanh toán hoa hồng giới thiệu bị lỗi tại phía nhà cung cấp — số tiền thu được được chuyển trở lại vào khoản phải trả và sẽ được thực hiện lại. |
rank.changed | Thứ hạng của một quảng cáo có thể thay đổi — bao gồm cả trường hợp do khoản thanh toán của một nhà quảng cáo khác gây ra. |
ad.expiring_soon | 30, 7 hoặc 1 ngày trước khi quảng cáo hết hạn. |
partner_ad_revenue.payout.completed | Một khoản thanh toán chia sẻ doanh thu quảng cáo đã đạt trạng thái “đã thanh toán”. |
partner_ad_revenue.payout.failed | Một đợt thanh toán chia sẻ doanh thu quảng cáo không thành công tại phía nhà cung cấp — các khoản chia sẻ được chuyển trở lại danh sách phải trả và sẽ được thử lại. |
Các bộ SDK chính thức cho JavaScript/TypeScript và Python, được tạo ra dựa trên cùng một đặc tả API này, đang được lên kế hoạch nhưng chưa được công bố — cho đến khi đó, hãy gọi trực tiếp API HTTP.
Hiện chưa có SDK — các phương thức này gọi trực tiếp API HTTP và hiện đã hoạt động trên mọi ngôn ngữ lập trình.
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": "...",
},
)