Pular para o conteúdo

Linha do tempo do ato

GET
/notices/{id}/events
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.

id
required
string format: uuid

UUIDv7 do ato.

Example
019928f4-3c21-7a4b-8f0e-6c2d5b1a9f77

A linha do tempo do ato

Media typeapplication/json
object
items
required

Eventos em ordem de occurredAt, do mais antigo ao mais recente.

Array<object>

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

UUIDv7 do evento.

string format: uuid
noticeId
required
string format: uuid
type
required

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.

string
occurredAt
required

Quando aconteceu, segundo a origem. ISO 8601 UTC com milissegundos.

string format: date-time
recordedAt
required

Quando o emMãos registrou. Capturado pelo banco, nunca derivado de occurredAt.

string format: date-time
actorType
required

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.

string
Allowed values: SYSTEM CITIZEN PARTNER AUTOMATIC VERIFIER
actorId

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

string | null
description
string | null
reason

Justificativa digitada por uma pessoa; só existe com actorId.

string | null
correctsEventId

O evento que este corrige, quando é uma correção.

string | null format: uuid
webhookInboxId
string | null format: uuid
artifactSha256

SHA-256 do artefato ligado ao evento, quando há um. É o que o anexo de evidências imprime.

string | null
messageKind
One of:

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.

string
Allowed values: INVITE VERIFICATION_LINK CLOSING DOCUMENT DOCUMENT_READY EMAIL_COPY
Example
{
"items": [
{
"type": "NOTICE_CREATED",
"actorType": "SYSTEM",
"messageKind": "INVITE"
}
]
}

Requisição inválida

Media typeapplication/json
object
error
required

Código estável do erro. É por ele que se programa.

string
Allowed values: INVALID_REQUEST INVALID_JSON NOT_FOUND NOT_IMPLEMENTED TIMELINE_TOO_LONG DATABASE_RESUMING INTERNAL_ERROR SEALED_DOCUMENT_MISSING DISPATCH_IN_PROGRESS IDEMPOTENCY_KEY_CONFLICT SEALED_DOCUMENT_TOO_LARGE SOURCE_DOCUMENT_TOO_MANY_PAGES SOURCE_DOCUMENT_UNREADABLE STORAGE_LIMIT_REACHED TENANT_NOT_CONFIGURED
field

Campo que causou a recusa, quando aplicável.

string
message

Texto em português para diagnóstico. Não programe contra ele: pode mudar sem aviso.

string
missing

Só com TENANT_NOT_CONFIGURED: o que falta na configuração do tribunal.

Array<string>
Allowed values: displayName publicPhone whatsappSender
Examples

Campo obrigatório ausente ou malformado

{
"error": "INVALID_REQUEST",
"field": "noticeType",
"message": "noticeType é obrigatório"
}

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

Media typeapplication/json
object
error
required

Código estável do erro. É por ele que se programa.

string
Allowed values: INVALID_REQUEST INVALID_JSON NOT_FOUND NOT_IMPLEMENTED TIMELINE_TOO_LONG DATABASE_RESUMING INTERNAL_ERROR SEALED_DOCUMENT_MISSING DISPATCH_IN_PROGRESS IDEMPOTENCY_KEY_CONFLICT SEALED_DOCUMENT_TOO_LARGE SOURCE_DOCUMENT_TOO_MANY_PAGES SOURCE_DOCUMENT_UNREADABLE STORAGE_LIMIT_REACHED TENANT_NOT_CONFIGURED
field

Campo que causou a recusa, quando aplicável.

string
message

Texto em português para diagnóstico. Não programe contra ele: pode mudar sem aviso.

string
missing

Só com TENANT_NOT_CONFIGURED: o que falta na configuração do tribunal.

Array<string>
Allowed values: displayName publicPhone whatsappSender
Example
{
"error": "NOT_FOUND"
}

Erro interno, ou recusa deliberada de responder pela metade

Media typeapplication/json
object
error
required

Código estável do erro. É por ele que se programa.

string
Allowed values: INVALID_REQUEST INVALID_JSON NOT_FOUND NOT_IMPLEMENTED TIMELINE_TOO_LONG DATABASE_RESUMING INTERNAL_ERROR SEALED_DOCUMENT_MISSING DISPATCH_IN_PROGRESS IDEMPOTENCY_KEY_CONFLICT SEALED_DOCUMENT_TOO_LARGE SOURCE_DOCUMENT_TOO_MANY_PAGES SOURCE_DOCUMENT_UNREADABLE STORAGE_LIMIT_REACHED TENANT_NOT_CONFIGURED
field

Campo que causou a recusa, quando aplicável.

string
message

Texto em português para diagnóstico. Não programe contra ele: pode mudar sem aviso.

string
missing

Só com TENANT_NOT_CONFIGURED: o que falta na configuração do tribunal.

Array<string>
Allowed values: displayName publicPhone whatsappSender
Examples

Defeito nosso

{
"error": "INTERNAL_ERROR"
}

O banco do tribunal estava pausado e não retomou dentro do orçamento da requisição. Repita.

Media typeapplication/json
object
error
required

Código estável do erro. É por ele que se programa.

string
Allowed values: INVALID_REQUEST INVALID_JSON NOT_FOUND NOT_IMPLEMENTED TIMELINE_TOO_LONG DATABASE_RESUMING INTERNAL_ERROR SEALED_DOCUMENT_MISSING DISPATCH_IN_PROGRESS IDEMPOTENCY_KEY_CONFLICT SEALED_DOCUMENT_TOO_LARGE SOURCE_DOCUMENT_TOO_MANY_PAGES SOURCE_DOCUMENT_UNREADABLE STORAGE_LIMIT_REACHED TENANT_NOT_CONFIGURED
field

Campo que causou a recusa, quando aplicável.

string
message

Texto em português para diagnóstico. Não programe contra ele: pode mudar sem aviso.

string
missing

Só com TENANT_NOT_CONFIGURED: o que falta na configuração do tribunal.

Array<string>
Allowed values: displayName publicPhone whatsappSender
Example
{
"error": "DATABASE_RESUMING",
"message": "Banco de dados está retomando. Tente novamente."
}
Retry-After
integer

Segundos a esperar antes de repetir.