Linha do tempo do ato
const url = 'https://api.emmaos.com.br/notices/019928f4-3c21-7a4b-8f0e-6c2d5b1a9f77/events';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://api.emmaos.com.br/notices/019928f4-3c21-7a4b-8f0e-6c2d5b1a9f77/events \ --header 'Authorization: Bearer <token>'Devolve os eventos do ato em ordem de acontecimento (occurredAt), sem
interpretá-los em etapas: a leitura é probatória, e agrupar aqui
esconderia correção e anulação. Sempre limitada ao tribunal do token:
um id que exista em outro tribunal responde 404, não 403.
Não pagina. Um ato tem dezenas de eventos, não milhares. Acima de 500
eventos a resposta é recusada inteira, com 500 e o código
TIMELINE_TOO_LONG no corpo, nunca truncada em silêncio. Quem integra
precisa saber distinguir isso de um defeito nosso: TIMELINE_TOO_LONG
significa que nada foi omitido porque nada foi devolvido; repetir a
chamada dá o mesmo resultado.
O que hoje existe é pouco. O produto grava um único tipo de evento,
NOTICE_CREATED, no momento da criação do ato; SENT, VIEWED e
CONFIRMED ainda não são gravados por ninguém. Até que sejam, esta rota
devolve uma linha por ato.
Authorizations
Seção intitulada “Authorizations”Parameters
Seção intitulada “Parameters”Path Parameters
Seção intitulada “Path Parameters”UUIDv7 do ato.
Example
019928f4-3c21-7a4b-8f0e-6c2d5b1a9f77Responses
Seção intitulada “Responses”A linha do tempo do ato
object
Eventos em ordem de occurredAt, do mais antigo ao mais recente.
Um evento do ledger, sem interpretação. Os dois tempos são distintos e
continuam distintos: occurredAt é o que a origem afirma, recordedAt
é o instante da custódia pelo emMãos.
Não é o espelho da tabela: o payload verbatim da origem, a chave de
armazenamento do artefato e o id da mensagem no provedor ficam no
ledger e fora deste contrato. O primeiro e o último poriam o formato
do fornecedor dentro da nossa API; a chave, o layout do armazenamento.
O artifactSha256 fica porque é o que identifica o artefato sem
revelar onde ele mora.
object
UUIDv7 do evento.
Tipo do evento. Sem enum de propósito: a coluna não tem CHECK no
banco, e fechar aqui prometeria o que o dado não garante. Os tipos
gravados hoje: NOTICE_CREATED (cadastro), MESSAGE_SENT (a
plataforma aceitou a mensagem), MESSAGE_DELIVERED (chegou ao
aparelho), MESSAGE_READ (lida), DOCUMENT_FETCHED (a plataforma
buscou o PDF selado), INVITE_ACCEPTED (o destinatário tocou em
“Quero receber”), RECIPIENT_DENIED (tocou em “Não sou eu”) e
MESSAGE_RECEIVED (respondeu a uma mensagem do ato sem mudar o
andamento). MESSAGE_BOUNCED (o servidor de e-mail do
destinatário devolveu a cópia) e MESSAGE_SUPPRESSED (a cópia não
foi entregue porque o endereço está bloqueado pelo serviço de
e-mail); nenhum dos dois muda o andamento. MESSAGE_UNDELIVERED
(a plataforma de mensagens informou falha na entrega, com os
grupos UNDELIVERABLE, REJECTED ou EXPIRED do relatório; é o que a
plataforma relata, sem causa afirmada, e não muda o andamento: o
prazo corre mesmo sem entrega). VERIFICATION_STARTED e VERIFICATION_APPROVED (o verificador de
identidade começou e aprovou), VERIFICATION_DECLINED e VERIFICATION_EXPIRED
(recusou ou a sessão expirou: o ato fecha em FAILED) e VERIFICATION_MISMATCH
(a pessoa não é a do documento: fecha em RECIPIENT_MISMATCH). Tipo novo pode aparecer sem mudança de versão; quem lê
ignora o que não conhece.
Quando aconteceu, segundo a origem. ISO 8601 UTC com milissegundos.
Quando o emMãos registrou. Capturado pelo banco, nunca derivado de occurredAt.
Quem provocou o evento: o sistema a pedido de alguém do tribunal
(SYSTEM), o destinatário (CITIZEN), a plataforma de mensagens
(PARTNER), o próprio emMãos sem pedido de ninguém (AUTOMATIC) ou o
verificador de identidade (VERIFIER). Pode ganhar valor sem mudança
de versão; quem lê ignora o que não conhece.
Usuário do tribunal, quando houve um. null quando quem afirma o
fato é o destinatário (CITIZEN), a plataforma (PARTNER) ou o
verificador de identidade (VERIFIER).
Justificativa digitada por uma pessoa; só existe com actorId.
O evento que este corrige, quando é uma correção.
SHA-256 do artefato ligado ao evento, quando há um. É o que o anexo de evidências imprime.
Qual das mensagens do ato o evento cita: a primeira mensagem (INVITE), o link
de verificação de identidade (VERIFICATION_LINK), o documento
(DOCUMENT) ou a mensagem que reabre a conversa para entregar o
documento (DOCUMENT_READY). Cada uma existe no máximo uma vez por
ato. EMAIL_COPY é a cópia do documento por e-mail: nunca move o
andamento e só existe com a cópia ligada para o tribunal. CLOSING é o encerramento depois de um desfecho negativo da
verificação de identidade (recusa, pessoa diferente ou sessão expirada),
e só sai com a janela de 24 h aberta. No “Não sou eu” ele não sai: o ato
se encerra sem mensagem de volta. Pode ganhar valor
sem mudança de versão; quem lê ignora o que não conhece.
Example
{ "items": [ { "type": "NOTICE_CREATED", "actorType": "SYSTEM", "messageKind": "INVITE" } ]}Requisição inválida
object
Código estável do erro. É por ele que se programa.
Campo que causou a recusa, quando aplicável.
Texto em português para diagnóstico. Não programe contra ele: pode mudar sem aviso.
Só com TENANT_NOT_CONFIGURED: o que falta na configuração do
tribunal.
Examples
Campo obrigatório ausente ou malformado
{ "error": "INVALID_REQUEST", "field": "noticeType", "message": "noticeType é obrigatório"}Corpo não é JSON válido
{ "error": "INVALID_JSON", "message": "corpo JSON inválido"}Sem header Authorization. Recusado pelo API Gateway antes de chegar à
aplicação.
Token inválido, expirado, ou de um emissor que não é tribunal conhecido neste stage. Recusado pelo authorizer.
Não existe neste tribunal
object
Código estável do erro. É por ele que se programa.
Campo que causou a recusa, quando aplicável.
Texto em português para diagnóstico. Não programe contra ele: pode mudar sem aviso.
Só com TENANT_NOT_CONFIGURED: o que falta na configuração do
tribunal.
Example
{ "error": "NOT_FOUND"}Erro interno, ou recusa deliberada de responder pela metade
object
Código estável do erro. É por ele que se programa.
Campo que causou a recusa, quando aplicável.
Texto em português para diagnóstico. Não programe contra ele: pode mudar sem aviso.
Só com TENANT_NOT_CONFIGURED: o que falta na configuração do
tribunal.
Examples
Defeito nosso
{ "error": "INTERNAL_ERROR"}A linha do tempo passou do teto e não foi truncada
{ "error": "TIMELINE_TOO_LONG", "message": "A linha do tempo deste ato não cabe numa resposta. Nenhum evento foi omitido: a resposta foi recusada inteira."}O banco do tribunal estava pausado e não retomou dentro do orçamento da requisição. Repita.
object
Código estável do erro. É por ele que se programa.
Campo que causou a recusa, quando aplicável.
Texto em português para diagnóstico. Não programe contra ele: pode mudar sem aviso.
Só com TENANT_NOT_CONFIGURED: o que falta na configuração do
tribunal.
Example
{ "error": "DATABASE_RESUMING", "message": "Banco de dados está retomando. Tente novamente."}Headers
Seção intitulada “Headers”Segundos a esperar antes de repetir.