Annual Ads

Documentação para programadores

Desenvolva diretamente na plataforma Annual Ads — crie anunciantes, publique anúncios, processe pagamentos e acompanhe a classificação, tudo através da API.

Consulte a tabela completa de preços

Ficas com 70% do valor que os anunciantes do modo Connect pagam pelos seus anúncios — creditado automaticamente na sua carteira. Veja abaixo como funciona.

URL de base

https://api.adhub365.com
OpenAPI 3

Autenticação

Cada pedido é autenticado com uma chave secreta no cabeçalho «Authorization», utilizando o esquema «Bearer».

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

Ambiente de teste e produção

As chaves do ambiente de teste e de produção estão totalmente isoladas umas das outras — uma chave do ambiente de teste nunca pode ler nem gravar dados criados por uma chave de produção, e vice-versa.

Âmbitos

Cada chave está limitada aos âmbitos para os quais foi emitida — uma chave nunca tem mais acesso do que a conta parceira que a criou.

As chaves API são emitidas pela equipa do Annual Ads para as contas de parceiros aprovados.

Criar uma conta de parceiro

Partilha de receitas publicitárias

Se as suas chaves API criarem contas de anunciante para os seus próprios utilizadores (modo Connect — consulte a secção «Autenticação» acima), receberá uma parte do que esses anunciantes pagam pelos seus anúncios. A repartição abaixo é lida em tempo real a partir deste mesmo ponto de extremidade, nunca é codificada de forma estática e é totalmente distinta da comissão por indicação que se encontra mais abaixo nesta página.

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

70%

É para ti

O pagamento é efetuado automaticamente para a sua carteira de pagamentos configurada — não é necessário solicitar o levantamento.

30%

Vai para os Anúncios Anuais

Aborda a moderação, o alojamento e a infraestrutura de classificação na qual os seus anúncios são exibidos.

Como funciona

  1. Um dos seus anunciantes no modo «Connect» paga por um anúncio através da sua integração.
  2. O anúncio é analisado e aprovado — automaticamente ou pela nossa equipa de moderação.
  3. A sua participação está na fila para pagamento automático na sua carteira, seguindo o mesmo mecanismo do programa de referência abaixo.
Uma quota nunca é criada antes de o anúncio ser efetivamente aprovado — se a moderação o rejeitar, não há qualquer valor a pagar relativo a esse pagamento. Um reabastecimento num anúncio já ativo não acarreta esse risco e é repartido imediatamente.

Condições de pagamento

  • Está configurada uma carteira de pagamentos em criptomoedas na sua conta de parceiro.
  • Não é necessário que faça a verificação de identidade (KYC) — a sua conta de parceiro já foi verificada no momento da criação.

Exemplo: leitura das ações acumuladas

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
}

Pontos finais

Contas

POST/v1/partner/advertisers

Crie uma conta de anunciante em nome de um dos seus utilizadores (modo «Connect»).

advertisers:write
GET/v1/partner/advertisers/{id}

Pesquisar uma conta de anunciante criada por este parceiro.

advertisers:read

Anúncios

POST/v1/partner/ads

Crie um anúncio. Este começa com o estado «rascunho». Os campos opcionais «advertiser_type», «promotion_type», «link_type» e «promoted_brand» descrevem publicidade de afiliados, de referência, de criadores ou individual — consulte a nota abaixo.

ads:write
GET/v1/partner/ads/{id}

Pesquisar um anúncio.

ads:read
PATCH/v1/partner/ads/{id}

Atualizar o conteúdo editorial — título, descrição, link, tipo de anunciante, tipo de promoção, tipo de link e marca promovida. A categoria, a localização geográfica e qualquer outro elemento analisado pelo motor de classificação nunca podem ser alterados aqui.

ads:write
POST/v1/partner/ads/{id}/image

Carregue diretamente uma imagem para o anúncio (JPEG/PNG/WebP, máximo de 5 MB). Obrigatório antes do primeiro pagamento — consulte a secção sobre pagamentos abaixo.

ads:write
POST/v1/partner/ads/{id}/image-url

Defina a imagem de um anúncio a partir de um URL, em vez de carregar um ficheiro — o servidor irá buscá-la e alojá-la novamente por conta própria. O requisito é o mesmo: tem de ser feito antes do primeiro pagamento.

ads:write
GET/v1/partner/ads/{id}/rank

Classificação atual, categoria e âmbito geográfico de um anúncio.

ads:read
GET/v1/partner/ads/{id}/stats

O total de visualizações e cliques de um anúncio — os dias decorridos/restantes — provêm dos campos `activated_at`/`expires_at` já presentes em GET /{id}, e a classificação provém de GET /{id}/rank.

ads:read

Pagamentos

POST/v1/partner/payments

Inicie um pagamento com criptomoeda para uma compra inicial ou uma recarga. Um pagamento inicial falha com o código de erro 422, a menos que o anúncio já tenha uma imagem — consulte uploadAdImage/setAdImageUrl acima.

payments:write
GET/v1/partner/payments/{id}

Verificar o estado de um pagamento.

payments:read

Recomendações

POST/v1/partner/referrals

Criar um link de referência.

referrals:write
GET/v1/partner/referrals/{code}/earnings

Ganhos acumulados com referências, discriminados por estado.

referrals:read

Partilha de receitas publicitárias

GET/v1/partner/ad-revenue/earnings

A sua quota de 70 % do valor que os anunciantes que criou no modo «Connect» pagaram pelos seus anúncios, discriminada por estado.

ad-revenue:read

Registo de acesso

GET/v1/partner/access-log

Histórico completo de chamadas para esta chave — método, caminho, IP, data e hora.

Qualquer

Pontos finais públicos

GET/v1/rankings?category={id}&geo={scope}

Classificação apenas para leitura, por categoria e área geográfica.

Público
GET/v1/tiers

Os 7 níveis de preços configurados (limiar, vantagens desbloqueadas).

Público
GET/v1/referral-program

As percentagens de comissão atualmente em vigor para a cascata de referências e para o Leaders Pool.

Público
GET/v1/partner-program

A repartição atual das receitas publicitárias (modo Connect) entre si e a Annual Ads.

Público
GET/v1/search?q={query}

Pesquisa em linguagem natural — encaminha uma consulta como «anunciantes de mobiliário no Quénia» para a categoria e o âmbito geográfico correspondentes e, em seguida, apresenta essa classificação, na sua ordem exata.

Público

Publicidade de afiliados e de recomendação

advertiser_type, promotion_type, link_type e promoted_brand são campos opcionais nas solicitações POST e PATCH para /v1/partner/ads — O Annual Ads não se limita a empresas que se anunciam a si próprias. Quando link_type for affiliate_link ou referral_invitation_link, ou promotion_type for affiliate_offer ou referral_opportunity, affiliate_terms_accepted deve ser true; caso contrário, o pedido é rejeitado com um código de erro 422. O título tem um limite máximo de 35 caracteres e a descrição de 80 — ambos aplicados do lado do servidor, e não apenas na interface do painel de controlo.

Ferramentas de IA

Cada conta de anunciante dispõe de um conjunto de ferramentas de IA integradas — um gerador de conteúdo e elementos visuais para anúncios, um assistente conversacional, um consultor de orçamento e um auditor externo de SEO — pagas com créditos de IA, para além do preço fixo anual.

Estas funções são executadas através do login no painel de controlo do próprio anunciante (um token de acesso de sessão), e não através de uma chave de API de parceiro — uma integração de terceiros não pode aceder a elas em nome do anunciante.
POST/v1/advertisers/{id}/ai/assistant

Ask Annual Ads — um assistente conversacional flutuante, apenas informativo, com acesso apenas para leitura aos dados da conta.

Público
POST/v1/advertisers/{id}/ai/creative-studio

Gerar um título, uma descrição e palavras-chave para um anúncio a partir de uma breve descrição da empresa.

2 crédito(s)
POST/v1/advertisers/{id}/ai/creative-studio/image

Gerar um elemento visual para o anúncio (PNG) a partir da mesma descrição da empresa, já alojado e pronto a ser anexado a um anúncio.

8 crédito(s)
POST/v1/advertisers/{id}/ai/budget-advisor

Uma projeção estatística real — nunca uma estimativa aleatória — das probabilidades de manter uma determinada classificação aos 30, 90 e 365 dias.

1 crédito(s)
POST/v1/advertisers/{id}/ai/seo-audit

Analisar o próprio site externo do anunciante e sugerir melhorias concretas em termos de SEO.

2 crédito(s)

Exemplo — gerar conteúdo publicitário

A mesma categoria e descrição da empresa também servem de base para o gerador de imagens abaixo.

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
}

Criar um elemento visual correspondente para o mesmo anúncio:

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
}

Widget

Insira um bloco de anúncios já pronto no seu próprio site — sem necessidade de criação, sem iframe. O script é renderizado diretamente na página, dentro de um Shadow DOM isolado, pelo que os seus estilos nunca interferem no seu site e os estilos do seu site nunca interferem nele.

Adiciona-o à tua página

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

Por predefinição, isto apresenta a classificação pública completa da categoria — todos os anunciantes da plataforma, e não apenas aqueles que angariou. Para mostrar apenas os anúncios dos anunciantes que criou através do modo Connect (aqueles que geram a sua comissão), adicione «data-partner» com o seu ID de parceiro (encontra-o na página «Desenvolvedores» do seu próprio painel de controlo):

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

Se os seus anunciantes abrangerem várias categorias, elimine completamente o atributo «data-category» — ao utilizar apenas o atributo «data-partner», o widget mostra todos os seus anúncios de todas as categorias numa única grelha, em vez de ser necessário um bloco de widget por categoria:

<div
  class="annualads-widget"
  data-geo="global"
  data-partner="YOUR_PARTNER_ID"
></div>
<script async src="https://adhub365.com/widget.js"></script>

Queres uma unidade do tipo rodapé a acompanhar a que está no corpo do conteúdo, cada uma a mostrar anúncios diferentes? Adiciona um segundo bloco de widget com data-layout="compact" (um único anúncio, que pode ser recolhido num pequeno «pill») e data-offset definido para o número de anúncios que o teu primeiro widget já mostra:

<!-- 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>

Atributos

data-categoryID da categoria a apresentar. Obrigatório — a menos que a opção «data-partner» esteja definida; nesse caso, a sua omissão faz com que sejam apresentados os anúncios desse parceiro em todas as categorias.
data-geoÂmbito geográfico: local, regional ou global. O valor predefinido é «global».
data-countNúmero de anúncios a apresentar. O valor predefinido é 4.
data-columnsNúmero de colunas da grelha. O valor predefinido é 2.
data-layoutgrelha, lista ou compacto. O valor predefinido é «grelha». A opção «compacto» apresenta um único anúncio (o atributo «data-count» é ignorado) com um botão para o recolher num pequeno bloco e o voltar a exibir — trata-se de uma unidade ao estilo de rodapé, que nunca é posicionada de forma fixa pelo próprio script; pode colocar e definir o estilo da div do contentor como preferir na sua própria página.
data-offsetNúmero de anúncios com melhor classificação a ignorar. O valor predefinido é 0. Permite que um segundo widget na mesma página (por exemplo, um widget compacto no rodapé e outro em formato de grelha mais acima) mostre anúncios diferentes, em vez de repetir o mesmo anúncio duas vezes — indique o número de anúncios que o outro widget já apresenta.
data-partnerO teu ID de parceiro (podes encontrá-lo na página «Desenvolvedores» do teu painel de controlo). Opcional — sem ele, o widget mostra a classificação pública completa dessa categoria, incluindo todos os anunciantes da plataforma. Com ele, apenas são apresentados os anúncios dos anunciantes que angariaste através do modo «Connect» — aqueles que realmente geram a tua quota.

Partilha de receitas

Como é que a comissão por indicação de um parceiro chega efetivamente até ele — a percentagem, o mecanismo de pagamento e as condições prévias.

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
}

Não é um número fixo

A percentagem da comissão é configurada por nós e pode sofrer alterações — consulte-a sempre em tempo real neste ponto de acesso, em vez de codificar um valor fixo.

Totalmente automático

Não existe um prazo limite para o levantamento. Uma tarefa agendada calcula os ganhos a pagar, agrupa-os por anunciante e efetua o pagamento automaticamente assim que todas as condições abaixo forem cumpridas.

Condições de pagamento

  • Os ganhos totais a pagar ao anunciante atingem o montante mínimo de pagamento.
  • Foi configurada uma carteira de pagamentos em criptomoedas na conta deles.
  • O seu estatuto KYC foi verificado.

Exemplo: leitura dos resultados acumulados

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
}

Níveis de preços (em vigor)

Leia os dados em tempo real a partir deste ponto de acesso — nunca codifique estes valores de forma estática, pois podem sofrer alterações da nossa parte. Crie um seletor de planos para os seus próprios utilizadores, em vez de um campo de valor livre: cada preço apresentado já corresponde ao montante exato a enviar ao efetuar o pagamento, e os benefícios desbloqueados aqui apresentados indicam aos utilizadores exatamente o que esse preço lhes proporciona, para que escolham um preço que compreendam, em vez de adivinharem um valor.

NívelPreçoDesbloqueios
Bronze$50.00

Basic visibility

Silver$300.00

Clickable link unlocked

Link clicável
Gold$500.00

Animation unlocked

Link clicávelAnimação
Platinum$1,000.00

Enhanced exposure

Link clicávelAnimação
Diamond$2,500.00

Premium placement

Link clicávelAnimação
Elite$5,000.00

Top-tier visibility

Link clicávelAnimação
Legendary$10,000.00

Maximum visibility & branding

Link clicávelAnimação

Limites de taxa

O número de pedidos está limitado por chave, por minuto. Cada resposta autenticada inclui os cabeçalhos X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset; se o limite for ultrapassado, é devolvido o código de erro 429 Too Many Requests com o cabeçalho Retry-After.

Lista de endereços IP autorizados

Opcional, por parceiro. Até adicionar uma entrada, as suas chaves aceitam pedidos de qualquer endereço IP — a primeira entrada altera todas as chaves desse parceiro para que só aceitem endereços da lista de permissões.

Webhooks

Cada webhook é assinado com HMAC-SHA256 utilizando um segredo emitido uma única vez, no momento da criação — verifique a assinatura antes de confiar na carga útil. Os eventos são enviados apenas ao parceiro a quem pertence o anunciante em questão.

payment.succeededO pagamento foi confirmado.
payment.refundedÉ efetuado um reembolso.
ad.activatedUm anúncio fica ativo, automaticamente ou após revisão por parte do administrador.
invoice.issuedÉ emitida uma fatura.
referral.payout.completedUma comissão de indicação passa para o estado «paga».
referral.payout.failedUm lote de pagamentos de comissões por indicação falha no lado do prestador — os rendimentos voltam para a conta de contas a pagar e são novamente processados.
rank.changedA classificação de um anúncio varia — nomeadamente quando tal se deve ao pagamento efetuado por outro anunciante.
ad.expiring_soon30, 7 ou 1 dia(s) antes do termo da vigência de um anúncio.
partner_ad_revenue.payout.completedUm pagamento de participação nas receitas publicitárias passa para o estado «pago».
partner_ad_revenue.payout.failedUm lote de pagamentos de partilha de receitas publicitárias falha no fornecedor — os montantes voltam para a conta de contas a pagar e são novamente processados.

SDKs

Estão previstos SDKs oficiais para JavaScript/TypeScript e Python, gerados a partir desta mesma especificação da API, mas ainda não foram publicados — até lá, aceda diretamente à API HTTP.

Introdução rápida

Ainda não existe um SDK — estas chamam diretamente a API HTTP e funcionam já em qualquer linguagem de programação.

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": "...",
    },
)