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çosFicas com 70% do valor que os anunciantes do modo Connect pagam pelos seus anúncios — creditado automaticamente na sua carteira. Veja abaixo como funciona.
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/jsonAs chaves API são emitidas pela equipa do Annual Ads para as contas de parceiros aprovados.
Criar uma conta de parceiro| POST | /v1/partner/advertisersCrie 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 |
| POST | /v1/partner/adsCrie 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}/imageCarregue 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-urlDefina 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}/rankClassificação atual, categoria e âmbito geográfico de um anúncio. | ads:read |
| GET | /v1/partner/ads/{id}/statsO 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 |
| POST | /v1/partner/paymentsInicie 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 |
| POST | /v1/partner/referralsCriar um link de referência. | referrals:write |
| GET | /v1/partner/referrals/{code}/earningsGanhos acumulados com referências, discriminados por estado. | referrals:read |
| GET | /v1/partner/ad-revenue/earningsA 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 |
| GET | /v1/partner/access-logHistórico completo de chamadas para esta chave — método, caminho, IP, data e hora. | Qualquer |
| GET | /v1/rankings?category={id}&geo={scope}Classificação apenas para leitura, por categoria e área geográfica. | Público |
| GET | /v1/tiersOs 7 níveis de preços configurados (limiar, vantagens desbloqueadas). | Público |
| GET | /v1/referral-programAs percentagens de comissão atualmente em vigor para a cascata de referências e para o Leaders Pool. | Público |
| GET | /v1/partner-programA 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.
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.
| POST | /v1/advertisers/{id}/ai/assistantAsk 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-studioGerar 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/imageGerar 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-advisorUma 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-auditAnalisar o próprio site externo do anunciante e sugerir melhorias concretas em termos de SEO. | 2 crédito(s) |
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
}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.
<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>data-category | ID 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-count | Número de anúncios a apresentar. O valor predefinido é 4. |
data-columns | Número de colunas da grelha. O valor predefinido é 2. |
data-layout | grelha, 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-offset | Nú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-partner | O 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. |
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.
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.
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.succeeded | O pagamento foi confirmado. |
payment.refunded | É efetuado um reembolso. |
ad.activated | Um anúncio fica ativo, automaticamente ou após revisão por parte do administrador. |
invoice.issued | É emitida uma fatura. |
referral.payout.completed | Uma comissão de indicação passa para o estado «paga». |
referral.payout.failed | Um 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.changed | A classificação de um anúncio varia — nomeadamente quando tal se deve ao pagamento efetuado por outro anunciante. |
ad.expiring_soon | 30, 7 ou 1 dia(s) antes do termo da vigência de um anúncio. |
partner_ad_revenue.payout.completed | Um pagamento de participação nas receitas publicitárias passa para o estado «pago». |
partner_ad_revenue.payout.failed | Um 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. |
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.
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": "...",
},
)