Annual Ads

开发者文档

直接在“年度广告”平台上进行开发——通过 API 即可创建广告主、发布广告、触发支付以及追踪排名。

查看完整价格表

您将获得 70% 来自您的“Connect”模式广告商为广告支付的费用中的一定比例——该款项将自动打入您的钱包。请参阅下文了解具体运作方式。

基础网址

https://api.adhub365.com
OpenAPI 3

身份验证

每个请求都通过在 Authorization 头中使用 Bearer 方案和密钥进行身份验证。

POST https://api.adhub365.com/v1/partner/ads
Authorization: Bearer sk_sandbox_...
Content-Type: application/json

沙箱与生产环境

沙箱密钥与生产环境密钥之间完全隔离——沙箱密钥绝不能读取或写入由生产环境密钥创建的数据,反之亦然。

范围

每个密钥仅限于其签发时所指定的作用域——密钥的访问权限绝不会超过创建它的合作伙伴账户的权限。

API密钥由“Annual Ads”团队发放给经批准的合作伙伴账户。

创建合作伙伴账户

广告收入分成

如果您的 API 密钥为您的用户创建了广告主账户(连接模式——参见上文“身份验证”部分),您将获得这些广告主为广告支付费用的部分分成。下方的分成比例是实时从该端点读取的,绝非硬编码,且与本页面下方所述的推荐佣金完全无关。

GET https://api.adhub365.com/v1/partner-program
{
  "partner_share_percentage": 0.7,
  "platform_share_percentage": 0.3
}

70%

轮到你了

款项将自动支付到您设置的提现钱包中——无需提交提现申请。

30%

进入“年度广告”栏目

涵盖内容审核、托管以及广告运行所依托的排名基础设施。

工作原理

  1. 您的某位“Connect”模式广告主通过您的集成渠道支付了广告费用。
  2. 该广告已通过审核并获批准——无论是自动审核,还是由我们的审核团队审核。
  3. 您的分红已加入队列,即将自动发放至您的钱包,其机制与下方的推荐计划相同。
在广告实际获得批准之前,绝不会产生任何分成——如果审核人员将其驳回,则无需就该笔付款支付任何费用。对已上线广告的充值不存在此类风险,且分成将立即发放。

赔付条件

  • 您的合作伙伴账户上已配置了一个加密货币支付钱包。
  • 您无需进行KYC认证——您的合作伙伴账户在创建时已经过审核。

示例:读取累计股数

GET https://api.adhub365.com/v1/partner/ad-revenue/earnings
Authorization: Bearer sk_sandbox_...
{
  "shares": [
    {
      "id": "share_1a2b...",
      "payment_id": "pay_9f2a...",
      "ad_id": "ad_7c31...",
      "partner_amount_usd": 140.0,
      "platform_amount_usd": 60.0,
      "status": "paid",
      "payable_after": "2026-08-03T00:00:00Z",
      "paid_at": "2026-08-05T10:12:00Z"
    }
  ],
  "total_payable_pending_usd": 0.0,
  "total_payable_usd": 0.0,
  "total_processing_usd": 0.0,
  "total_paid_usd": 140.0
}

端点

账户

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 工具

每个广告主账户都配备了一套内置的AI工具——包括广告内容和视觉生成器、对话助手、预算顾问以及外部SEO审计工具——这些工具的费用需使用AI积分支付,此外还需支付固定的年度费用。

这些操作是通过广告主自己的控制台登录(会话访问令牌)进行的,而非通过合作伙伴的 API 密钥——第三方集成无法代表广告主调用这些功能。
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”模式引入的广告主发布的广告——即实际为您带来分成的那部分广告。

收入分成

合作伙伴的推荐佣金究竟是如何到手的——具体比例、支付机制以及先决条件。

GET https://api.adhub365.com/v1/referral-program
{
  "levels": [
    {
      "level": 1,
      "percentage": 0.1
    }
  ],
  "leaders_pool_percentage_of_gmv": 0.05,
  "founding_advertiser_pool_percentage_of_gmv": 0.05,
  "payout_verification_window_hours": 48,
  "min_payout_usd": 1
}

不是一个固定数字

佣金比例由我们这边的系统配置,可能会发生变化——请务必从该端点实时读取该值,而不是将数值硬编码进去。

全自动

没有提现截止时间。定时任务会计算应付收益,按广告主进行分批处理,并在满足以下所有条件后自动支付。

赔付条件

  • 广告主的应付总收益已达到最低支付金额。
  • 他们的账户上已配置了一个加密货币提现钱包。
  • 他们的KYC状态已通过验证。

示例:读取累计收益

GET https://api.adhub365.com/v1/partner/referrals/{code}/earnings
Authorization: Bearer sk_sandbox_...
{
  "code": "ann-2f8c",
  "earnings": [
    {
      "id": "earn_1a2b...",
      "payment_id": "pay_9f2a...",
      "amount_usd": 30.0,
      "status": "paid",
      "payable_after": "2026-08-01T00:00:00Z",
      "paid_at": "2026-08-03T14:22:00Z"
    }
  ],
  "total_payable_pending_usd": 0.0,
  "total_payable_usd": 0.0,
  "total_processing_usd": 0.0,
  "total_paid_usd": 30.0
}

定价档位(已上线)

请从该接口实时读取数据——切勿将这些值硬编码,因为这些值可能会由我们进行调整。 请为您的用户构建一个档位选择器,而非设置“免费金额”字段:显示的每个价格在创建支付时即为需发送的确切金额,且此处显示的解锁权益能让用户清楚了解该价格能获得什么,这样他们就能选择自己理解的价格,而不是凭空猜测一个数字。

层级价格解锁
Bronze$50.00

Basic visibility

Silver$300.00

Clickable link unlocked

可点击的链接
Gold$500.00

Animation unlocked

可点击的链接动画
Platinum$1,000.00

Enhanced exposure

可点击的链接动画
Diamond$2,500.00

Premium placement

可点击的链接动画
Elite$5,000.00

Top-tier visibility

可点击的链接动画
Legendary$10,000.00

Maximum visibility & branding

可点击的链接动画

速率限制

每个密钥每分钟的请求次数设有上限。每个经过身份验证的响应都会携带 X-RateLimit-Limit、X-RateLimit-Remaining 和 X-RateLimit-Reset 头部;若超过限制,将返回 429 Too Many Requests 状态码,并附带 Retry-After 头部。

IP白名单

可选,按合作伙伴设置。在添加条目之前,您的密钥会接受来自任何 IP 的请求——第一个条目会将该合作伙伴的所有密钥切换为仅允许来自白名单的请求。

Webhooks

每个 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广告收入分成支付批次在服务提供商处失败——分成金额将退回应付账款,并重新尝试支付。

SDK

计划发布基于此 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": "...",
    },
)