直接在“年度广告”平台上进行开发——通过 API 即可创建广告主、发布广告、触发支付以及追踪排名。
查看完整价格表您将获得 70% 来自您的“Connect”模式广告商为广告支付的费用中的一定比例——该款项将自动打入您的钱包。请参阅下文了解具体运作方式。
每个请求都通过在 Authorization 头中使用 Bearer 方案和密钥进行身份验证。
POST https://api.adhub365.com/v1/partner/ads
Authorization: Bearer sk_sandbox_...
Content-Type: application/jsonAPI密钥由“Annual Ads”团队发放给经批准的合作伙伴账户。
创建合作伙伴账户| POST | /v1/partner/advertisers代表您的某位用户创建广告主账户(连接模式)。 | advertisers:write |
| GET | /v1/partner/advertisers/{id}查询该合作伙伴创建的广告主账户。 | advertisers:read |
| POST | /v1/partner/ads创建广告。广告最初处于草稿状态。可选字段 advertiser_type、promotion_type、link_type 和 promoted_brand 用于描述联盟营销、推荐营销、创作者营销或个人广告——请参阅下方的说明。 | 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广告的总浏览量和点击量——已过天数/剩余天数来自 GET /{id} 请求中已有的 activated_at/expires_at 字段,而排名则来自 GET /{id}/rank 请求。 | ads:read |
| POST | /v1/partner/payments开始进行加密货币支付,用于首次购买或充值。除非广告已包含图片(参见上文的 uploadAdImage/setAdImageUrl),否则首次支付将因 422 错误而失败。 | 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您在“Connect”模式下创建的广告主为其广告支付费用的70%分成,按状态分类如下。 | ad-revenue:read |
| GET | /v1/partner/access-log该密钥的完整调用记录——方法、路径、IP 地址、时间戳。 | 任何 |
| GET | /v1/rankings?category={id}&geo={scope}某个类别和地理范围的只读排名。 | 公开 |
| GET | /v1/tiers已配置的 7 个定价层级(阈值、解锁的特权)。 | 公开 |
| GET | /v1/referral-program目前适用于推荐层级和领导者池的佣金比例。 | 公开 |
| GET | /v1/partner-program您与“Annual Ads”之间当前的广告收入分成(Connect模式)。 | 公开 |
| GET | /v1/search?q={query}自然语言搜索——将“肯尼亚的家具广告商”这样的查询路由到匹配的类别和地理范围,然后按其确切的实际排序顺序返回搜索结果。 | 公开 |
联盟与推荐广告
advertiser_type、promotion_type、link_type 和 promoted_brand 是 POST 和 PATCH /v1/partner/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/assistant咨询 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(可在您自己仪表盘的“开发者”页面中找到):
<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>想在内容中的广告单元旁边再添加一个页脚风格的广告单元,并且每个单元显示不同的广告吗?请添加第二个小部件块,并设置 data-layout="compact"(单个广告,可折叠为小型圆点),同时将 data-offset 设置为第一个小部件当前已显示的广告数量:
<!-- 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。必填项——除非已设置 data-partner,在这种情况下,省略该字段将显示该合作伙伴在所有分类中的广告。 |
data-geo | 地理范围:本地、区域或全球。默认设置为全球。 |
data-count | 要显示的广告数量。默认值为 4。 |
data-columns | 网格列数。默认值为 2。 |
data-layout | 网格、列表或紧凑模式。默认采用网格模式。紧凑模式会显示一条广告(忽略 data-count 属性),并附带一个按钮,用于将其折叠为小型圆点图标或恢复原状——这是一种页脚样式单元,脚本本身不会将其定位为固定位置,您可以根据自己的页面需求自由放置并设置容器 div 的样式。 |
data-offset | 要跳过的排名前列广告数量。默认值为 0。允许同一页面上的第二个小部件(例如页脚中的紧凑型小部件加上上方稍高处的网格型小部件)显示不同的广告,而不是重复显示同一条广告两次——请传入另一个小部件当前已显示的广告数量。 |
data-partner | 您的合作伙伴 ID(可在您个人仪表盘的“开发者”页面中找到)。此项为可选——若不填写,小工具将显示该分类下的完整公开排名,即平台上的所有广告主。若填写,则仅显示您通过“Connect”模式引入的广告主发布的广告——即实际为您带来分成的那部分广告。 |
每个密钥每分钟的请求次数设有上限。每个经过身份验证的响应都会携带 X-RateLimit-Limit、X-RateLimit-Remaining 和 X-RateLimit-Reset 头部;若超过限制,将返回 429 Too Many Requests 状态码,并附带 Retry-After 头部。
可选,按合作伙伴设置。在添加条目之前,您的密钥会接受来自任何 IP 的请求——第一个条目会将该合作伙伴的所有密钥切换为仅允许来自白名单的请求。
每个 webhook 都会使用在创建时一次性生成的密钥通过 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 | 广告收入分成支付批次在服务提供商处失败——分成金额将退回应付账款,并重新尝试支付。 |
计划发布基于此 API 规范生成的官方 JavaScript/TypeScript 和 Python SDK,但目前尚未发布——在此之前,请直接调用 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": "...",
},
)