Pular para o conteúdo

Registrar um ato

POST
/notices
curl --request POST \
--url https://api.emmaos.com.br/notices \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: 7f1c9f2e-2d55-4d0a-9a7f-2f1e6a3c1b04' \
--data '{ "noticeType": "SUMMONS", "recipient": { "name": "Maria de Souza", "cpf": "12345678909", "phone": "5571999998888" }, "case": { "number": "0801234-56.2026.8.05.0001", "courtDivision": "1ª Vara Cível", "subjectMatter": "Cobrança", "plaintiffName": "Município de Sítio Novo", "plaintiffLawyer": null, "defendantName": "Maria de Souza", "defendantLawyer": null }, "sourceDocument": { "key": "tenants/demo/notices/2026/019928f4-3c21-7a4b-8f0e-6c2d5b1a9f78.pdf", "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "customFields": { "processoOrigem": { "label": "Processo de origem", "type": "TEXT", "value": "0801111-22.2025.8.05.0001" } }, "deadlineAt": "2026-10-01T02:59:59.999Z" }'

Registra o ato e o evento NOTICE_CREATED na mesma transação, e devolve o protocolo: o identificador legível do ato, formado pelo ano de Brasília e uma sequência do banco.

Idempotência

O header Idempotency-Key é obrigatório e é único por tribunal. Repetir a mesma chave com o mesmo pedido (mesmo destinatário, processo, tipo, documento, prazo e campos personalizados, pelo mesmo servidor) devolve o mesmo registro com 200 em vez de 201: é seguro repetir depois de um timeout de rede. A chave do upload pode mudar entre as tentativas; o sha256 do documento é que conta.

Repetir a chave com um pedido diferente, ou vindo de outro servidor, é 409 IDEMPOTENCY_KEY_CONFLICT: a resposta não traz o id nem o protocolo do ato guardado. Use uma chave nova para o ato novo.

A validação do corpo (tipos, CPF, telefone, tipo de ato) roda antes de reservar o protocolo: um 400 não consome número. Entra nela a conferência dos customFields contra a definição do tribunal (ver GET /custom-field-definitions): a chave de um campo arquivado é 400 em customFields.<chave>.

O protocolo é monotônico, mas não promete contiguidade: tanto uma transação abortada quanto a repetição de uma chave já usada consomem um número (um 400 de validação não consome). O protocolo identifica o ato, não conta atos.

Documento selado

Antes de gravar o ato, a API gera o documento selado: o documento-fonte com uma página de conferência acrescentada, com o protocolo, o QR do endereço de conferência do tribunal e o sha256 do fonte. É ele, e não o fonte, que o cidadão recebe. O selado não aparece na resposta. Por isso esta rota lê o PDF inteiro e pode levar mais tempo com documentos grandes.

Idempotency-Key
required
string
>= 1 characters

Chave única por tribunal que torna a repetição segura. Gere um valor novo por ato (um UUID serve).

Example
7f1c9f2e-2d55-4d0a-9a7f-2f1e6a3c1b04
Media typeapplication/json
object
noticeType
required

Natureza do ato a comunicar.

string
Allowed values: SUMMONS NOTICE NOTIFICATION
recipient
required
object
name
required

Nome do destinatário.

string
cpf
required

CPF, só dígitos (11), com os dígitos verificadores corretos. Um CPF com dígito errado ou de dígitos repetidos (00000000000) é recusado com INVALID_REQUEST em recipient.cpf.

string
phone
required

Telefone em E.164 brasileiro, só dígitos: 55 + DDD existente + número. Celular tem 9 dígitos e começa em 9 (5571999998888); fixo tem 8 dígitos e começa de 2 a 5 (557132345678). Número estrangeiro é recusado. Por compatibilidade, a API aceita o número nacional de 10 ou 11 dígitos, com ou sem máscara e +, e acrescenta o 55; o que não fecha o formato é recusado com INVALID_REQUEST em recipient.phone.

string
/^55(?:11|12|13|14|15|16|17|18|19|21|22|24|27|28|31|32|33|34|35|37|38|41|42|43|44|45|46|47|48|49|51|53|54|55|61|62|63|64|65|66|67|68|69|71|73|74|75|77|79|81|82|83|84|85|86|87|88|89|91|92|93|94|95|96|97|98|99)(?:9[0-9]{8}|[2-5][0-9]{7})$/
email

E-mail do destinatário, para a cópia do documento por e-mail. Opcional. Só é gravado se o tribunal estiver com a cópia ligada; com ela desligada o campo é aceito e descartado sem conferir, e o ato nasce com null. Ligada, o endereço é conferido (ASCII, sem espaço, vírgula, ponto e vírgula nem <>()"\) e um endereço inválido é recusado com INVALID_REQUEST em recipient.email. A resposta de GET /notices/{id} devolve o endereço; a listagem nunca devolve.

string | null
<= 254 characters
case
required
object
number
required

Número do processo.

string
courtDivision
required

Vara. É propriedade do ato, não do usuário.

string
subjectMatter
string | null
plaintiffName
string | null
plaintiffLawyer
string | null
defendantName
string | null
defendantLawyer
string | null
sourceDocument
required

O documento que o tribunal manda comunicar.

A key não é escolhida pelo cliente: ela vem de POST /source-documents, que a cunha no servidor. Enviar uma chave que não veio de lá é recusado com 400.

object
key
required

Chave do objeto, na forma tenants/{tenant}/notices/{ano}/{uuidv7}.pdf, devolvida por POST /source-documents. O tenant na chave tem que ser o do token.

string
/^tenants/([a-z0-9-]{1,32})/notices/([0-9]{4})/[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\.pdf$/
sha256
required

Digest SHA-256 do arquivo, em hexadecimal minúsculo. Conferido contra o que o armazenamento calculou na gravação: se divergir, o ato não é criado.

string
/^[0-9a-f]{64}$/
customFields

Campos personalizados, indexados pelo nome do campo. A chave que o tribunal definiu (GET /custom-field-definitions) é conferida e leva o rótulo da definição; a chave que ninguém definiu passa como veio.

object
key
additional properties

Campo específico do tribunal, congelado no ato no momento do registro: mudar o formulário depois não altera atos já criados.

object
label
required
string
type
required

Tipo de um campo personalizado do tribunal.

string
Allowed values: TEXT DATE CPF SELECT
value
required
string | number | boolean | null
optionLabel

Só em campo SELECT definido pelo tribunal: o rótulo da opção cujo value o ato guardou, carimbado pelo servidor a partir da definição do dia. Ignorado no pedido. Ato antigo pode não tê-lo; a tela então mostra o value.

string
deadlineAt

Prazo do ato, se houver.

string | null format: date-time
Example
{
"noticeType": "SUMMONS",
"recipient": {
"name": "Maria de Souza",
"cpf": "12345678909",
"phone": "5571999998888"
},
"case": {
"number": "0801234-56.2026.8.05.0001",
"courtDivision": "1ª Vara Cível",
"subjectMatter": "Cobrança",
"plaintiffName": "Município de Sítio Novo",
"plaintiffLawyer": null,
"defendantName": "Maria de Souza",
"defendantLawyer": null
},
"sourceDocument": {
"key": "tenants/demo/notices/2026/019928f4-3c21-7a4b-8f0e-6c2d5b1a9f78.pdf",
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"customFields": {
"processoOrigem": {
"label": "Processo de origem",
"type": "TEXT",
"value": "0801111-22.2025.8.05.0001"
}
},
"deadlineAt": "2026-10-01T02:59:59.999Z"
}

Repetição de uma Idempotency-Key já usada. Devolve o registro original, sem criar nada.

Media typeapplication/json
object
id
required

UUIDv7 gerado pela aplicação.

string format: uuid
protocol
required

Identificador legível do ato: ano de Brasília e sequência do banco.

string
status
required

Progresso operacional do ato.

string
Allowed values: PENDING SENT VIEWED CONFIRMED IDENTITY_STARTED COMPLETED FAILED TIMED_OUT CANCELLED RECIPIENT_MISMATCH
Example
{
"protocol": "2026.0000.0001",
"status": "PENDING"
}

Ato criado

Media typeapplication/json
object
id
required

UUIDv7 gerado pela aplicação.

string format: uuid
protocol
required

Identificador legível do ato: ano de Brasília e sequência do banco.

string
status
required

Progresso operacional do ato.

string
Allowed values: PENDING SENT VIEWED CONFIRMED IDENTITY_STARTED COMPLETED FAILED TIMED_OUT CANCELLED RECIPIENT_MISMATCH
Example
{
"id": "019928f4-3c21-7a4b-8f0e-6c2d5b1a9f77",
"protocol": "2026.0000.0001",
"status": "PENDING"
}

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.

IDEMPOTENCY_KEY_CONFLICT: a Idempotency-Key já guarda um ato diferente deste pedido (outro corpo, ou outro servidor). Nada foi criado e o corpo não revela o ato guardado.

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": "IDEMPOTENCY_KEY_CONFLICT",
"message": "Esta Idempotency-Key já foi usada para um ato diferente. Use outra chave para registrar este ato."
}

O documento passa de um dos tetos. Nenhum ato foi criado e nada foi gravado, mas um número de protocolo foi consumido (ver acima: o protocolo não promete contiguidade). O código diz qual teto:

  • SOURCE_DOCUMENT_TOO_MANY_PAGES: o documento-fonte tem mais de 100 páginas. É preciso subir um documento menor.
  • SEALED_DOCUMENT_TOO_LARGE: o documento selado passaria de 20 MB.
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

Fonte acima do teto de páginas

{
"error": "SOURCE_DOCUMENT_TOO_MANY_PAGES",
"field": "sourceDocument.key",
"message": "documento-fonte tem 101 páginas; o limite é 100"
}

O pedido está bem formado, mas não pode ser atendido. O código diz por quê:

  • SOURCE_DOCUMENT_UNREADABLE: o documento-fonte não abre como PDF, ou é criptografado. Nenhum ato foi criado, mas um número de protocolo foi consumido: o selo roda depois de reservar o protocolo (ver acima: o protocolo não promete contiguidade). Repetir dá o mesmo resultado: é preciso subir o documento sem senha, por um novo POST /source-documents.
  • STORAGE_LIMIT_REACHED: o tribunal atingiu o limite de armazenamento configurado, e o modo dele é recusar atos novos. Nada foi criado nem gravado, e nenhum número de protocolo foi consumido. Repetir não resolve até o limite ser alterado ou o consumo baixar. Só acontece em tribunal que tem limite configurado; o padrão é não ter. Um retry de Idempotency-Key de um ato que já existe não é recusado: volta 200 com o ato.
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

Fonte que não abre como PDF

{
"error": "SOURCE_DOCUMENT_UNREADABLE",
"field": "sourceDocument.key",
"message": "o documento-fonte é criptografado; o tribunal precisa enviá-lo sem senha"
}

Erro interno

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": "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.