/v1, autenticada com um JWT do plugin-auth. Esta página cobre o modelo e os fluxos de onboarding; os formatos exatos de requisição e resposta estão na referência da API (comece pela introdução da referência).
O modelo de assinatura
Uma assinatura registra:
name— um rótulo legível (obrigatório, não vazio).sink_kind— um entrewebhook,pull,sqs,rabbitmq,eventbridge.endpoint— para onde as entregas vão, em um formato que depende do tipo de sink (veja abaixo).event_types— chaves<resource>.<event>sem a fonte que devem ser entregues. O hub aceita qualquer chave bem formada, então uma lacuna no catálogo nunca trava o onboarding. Uma chave que nenhum produtor emite não dá match. Pegue cada chave nas páginas por produto em Streaming de eventos.origin— um pin opcional que deve ser exatamente igual ace-source. Omita-o para aceitar a mesma chave de qualquer aplicação produtora.schema_major— a versão major do payload que a assinatura segue.plan_tier— o tier de entrega sob o qual a assinatura roda.
Dois campos de status ortogonais
Toda assinatura carrega dois campos de status independentes. Confundi-los é a fonte mais comum de perguntas do tipo “por que a entrega parou”, então mantenha-os separados:
verification_stateé a prova de que o destino consegue de fato receber eventos. Ele se move porpending_verification→active→degraded, guiado por sondagens. Somente uma assinaturaactiveé entregável.enabledé a chave de entregabilidade. É o que a desativação automática desliga, e o que um re-enable liga de novo.
enabled e verification_state = active. A desativação automática vive inteiramente em enabled e nunca muda verification_state, então uma assinatura desativada automaticamente aparece como enabled = false, verification_state = active. Veja desativando automaticamente um destino quebrado para como os dois interagem.
Criando uma assinatura de webhook
Uma assinatura de webhook é a mais simples de fazer o onboarding — ela não precisa de credencial, apenas de uma sondagem:
- Create —
POST /v1/subscriptionscomsink_kind: "webhook"e seu endpointhttps://. Envie o cabeçalhoX-Idempotencycom um valor único: o hub rejeita um create que o omite, antes de qualquer gravação. A URL de destino é validada contra faixas de endereço privadas, de loopback e de metadados de nuvem antes de qualquer linha ser gravada, de modo que um alvo privado ou de metadados nunca possa ser armazenado. A resposta retorna a nova assinatura empending_verification, e o segredo de assinatura exatamente uma vez. - Salve o segredo de assinatura — ele é mostrado apenas nesta resposta, armazenado apenas como texto cifrado e nunca retornado por nenhuma leitura. Salve-o ao recebê-lo; se você o perder, só é possível rotacionar para um novo.
- Ative o destino —
POST /v1/subscriptions/:id/pingenvia uma sondagem sintética e assinada pelo caminho real de entrega e reporta o resultado classificado. Uma sondagem bem-sucedida move a assinatura paraactive, e é isso que a torna entregável. Faça o deploy do seu endpoint antes do ping: ele precisa responder2xx.
Fazendo o onboarding de uma assinatura de fila
As assinaturas de fila (
sqs, rabbitmq, eventbridge) nascem pending_verification e não entregam nada até que seu destino seja verificado. Como você verifica depende do tipo:
- RabbitMQ — forneça uma credencial de broker, verificada na escrita (abaixo).
- SQS e EventBridge — forneça uma credencial de saída, verificada na escrita (abaixo), ou conecte um grant delegado da AWS (próxima seção) sem armazenar uma credencial.
- Create —
POST /v1/subscriptionscom osink_kindda fila e seu endpoint, e nenhuma credencial inline (umsink_configoucredentialinline é rejeitado). Envie o cabeçalhoX-Idempotencycom um valor único, como em qualquer create. A assinatura é armazenada comopending_verification; o match a exclui, então ela ainda não produz jobs de entrega. - Forneça a credencial —
PUT /v1/subscriptions/:id/credentialcom a credencial write-only de saída. O hub a mantém em memória, a sonda imediatamente (conecta e autentica contra o destino), e a persiste como texto cifrado somente se a sondagem tiver sucesso — uma sondagem que falha não armazena nada. Os endereços de destino são validados contra faixas bloqueadas antes do armazenamento. Uma sondagem bem-sucedida vira a assinatura depending_verification → activena mesma transação. - Active — uma vez
active, o match admite a assinatura e ela começa a receber eventos.
PUT de uma nova — a mesma sondagem-na-escrita se aplica.
Conectando um grant delegado da AWS
Para o caminho AWS sem credenciais (
sqs, eventbridge), o hub entrega assumindo uma role na sua conta AWS. Você conecta essa confiança em vez de fornecer uma credencial de saída:
- Busque os artefatos de setup —
GET /v1/subscriptions/:id/setup-artifactsretorna uma trust policy IAM cross-account, um link de criação rápida do CloudFormation e umExternalIdnão secreto que o hub cunha para esta assinatura. - Aplique-os na sua conta AWS — crie a role de entrega a partir da trust policy (o link de criação rápida a monta). A role confia no principal do hub somente sob a condição do
ExternalIdcunhado, o que fecha a brecha de confused-deputy: uma trust policy sem essa condição é tratada como falha de verificação, nunca como verificada. - Registre o grant —
PUT /v1/subscriptions/:id/delegated-grantcom o ARN da role de entrega, a região e o destino. Isso registra apenas coordenadas não secretas; não roda sondagem alguma e não mudaverification_state. - Verify —
POST /v1/subscriptions/:id/verifyroda a sondagem endurecida de assunção de role e, em caso de sucesso, vira a assinatura paraactive.
ExternalId.
Rotacionando um segredo de assinatura
POST /v1/subscriptions/:id/secret/rotate cunha um novo segredo de assinatura de webhook, o retorna uma vez e inicia uma sobreposição de assinatura dupla de 24 horas. Durante a sobreposição, o hub assina cada entrega com ambos os segredos — o novo e o anterior — e envia dois cabeçalhos de assinatura, para que o seu consumidor possa migrar para o novo segredo em qualquer ponto da janela sem perder entregas.
Rotacione de forma limpa assim:
- Chame o rotate e salve o novo segredo da resposta (junto com o timestamp
overlapUntil). - Faça o deploy do novo segredo no seu consumidor dentro da janela de sobreposição. Enquanto os dois estiverem configurados, o seu verificador aceita uma entrega se qualquer uma das assinaturas validar.
- Depois da sobreposição, aposente o segredo antigo.
pull — que não tem segredo de assinatura — é rejeitado. Veja lidando com duas assinaturas durante a rotação para a verificação do lado do consumidor.
Recuperando uma assinatura desativada automaticamente
Quando um destino permanece quebrado por tempo suficiente, o hub desativa automaticamente a assinatura virando
enabled = false. Para recuperá-la:
- Conserte o destino (o endpoint, a fila ou o grant).
- Chame
POST /v1/subscriptions/:id/verify. Ele re-sonda o destino e, em uma sondagem bem-sucedida, reabilita a assinatura e limpa a marca de desativação automática — no lugar, mantendo o mesmo id e o mesmo segredo de assinatura.
GET /v1/subscriptions/:id/health fornece o resumo de saúde de entrega — resultados recentes, contagens de dead-letter e o veredicto de desativação automática — para você confirmar que o destino está saudável antes e depois.
Refixando o schema major
PATCH /v1/subscriptions/:id refixa o schema_major da assinatura — o único campo mutável:
{"schema_major": 2}fixa a assinatura naquela versão major.{"schema_major": null}limpa a fixação para seguir a versão base.
1 é rejeitado (não é silenciosamente ignorado), para que você nunca acredite que uma mudança proibida tenha surtido efeito. event_types e origin são imutáveis; crie uma nova assinatura quando precisar mudar um desses filtros. Alterar o endpoint, o tipo de sink ou o segredo também fica fora do escopo do PATCH. Uma refixação do major não muda o destino — ela não redefine verification_state nem expõe um segredo.
Idempotência
As rotas mutáveis — create, delete,
PATCH, secret rotate e registro de grant delegado — exigem uma chave de idempotência:
400 missing_idempotency_key. O store é fail-closed: se o store de idempotência estiver inacessível, a requisição falha em vez de arriscar uma gravação dupla — isso garante que um create ou rotate reexecutado sirva de novo o segredo original mostrado uma única vez, em vez de cunhar um novo.
- Reexecutar uma chave já confirmada retorna a resposta original byte a byte, com
X-Idempotency-Replayed: true. - Reutilizar uma chave com um corpo de requisição diferente retorna
409 idempotency_conflict— cunhe uma nova chave para uma requisição corrigida.
ping, verify, PUT /credential, GET /setup-artifacts) são naturalmente idempotentes e não exigem chave. Veja a orientação de toda a plataforma sobre retentativas e idempotência.
Próximos passos
Consumindo eventos
Verifique assinaturas de webhook, deduplique entregas e consuma eventos por pull.
Como o Streaming Hub funciona
Match, despacho, retentativas e desativação automática em detalhe.

