Reservar o destino do documento-fonte
const url = 'https://api.emmaos.com.br/source-documents';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","byteSize":184320}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.emmaos.com.br/source-documents \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "byteSize": 184320 }'Reserva um documento-fonte e devolve uma URL assinada para o painel escrever o PDF direto no armazenamento do tribunal. O arquivo não passa pela API.
O rito
- O painel calcula o
sha256do arquivo e chama esta rota. - Faz
PUTnaurl, repetindo osheadersexatamente. - Chama
POST /noticescom akeyrecebida aqui e o mesmosha256.
A chave é cunhada pelo servidor: o cliente não escolhe onde escrever.
O que acontece se o ato não for criado
O objeto nasce marcado como pendente e é removido automaticamente se nenhum ato o reivindicar. Subir e desistir não deixa lixo permanente, e também não cria ato nenhum.
Authorizations
Seção intitulada “Authorizations”Request Bodyrequired
Seção intitulada “Request Bodyrequired”O que o painel declara sobre o arquivo que vai subir.
object
Digest SHA-256 do arquivo, em hexadecimal minúsculo, calculado pelo painel antes de subir. Entra na URL assinada: o armazenamento recusa a gravação de um corpo que não o produza.
Tamanho exato do arquivo. Também entra na assinatura, então a mesma URL não serve para subir outro arquivo.
Example
{ "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "byteSize": 184320}Responses
Seção intitulada “Responses”Destino reservado
O destino de escrita. Vale por minutos.
object
Cunhada pelo servidor. É esta chave que vai no POST /notices.
URL assinada, para um PUT direto no armazenamento.
Quando a URL deixa de valer. Vencida é caso normal, não erro: peça outra.
Os cabeçalhos que o PUT tem que repetir exatamente. Eles estão
na assinatura; mudar qualquer um invalida a URL.
object
Example
{ "key": "tenants/demo/notices/2026/019928f4-3c21-7a4b-8f0e-6c2d5b1a9f78.pdf", "url": "https://sid-prod-demo-documents.s3.sa-east-1.amazonaws.com/tenants/demo/notices/2026/019928f4-3c21-7a4b-8f0e-6c2d5b1a9f78.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&...", "expiresAt": "2026-09-19T12:10:00.000Z", "headers": { "content-type": "application/pdf", "content-length": "184320", "x-amz-checksum-sha256": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=", "x-amz-tagging": "state=pending" }}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.
Arquivo acima do limite de 19 MB (o teto de 20 MB do documento selado, menos a sobra da página de conferência). Nada foi reservado.
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": "INVALID_REQUEST", "missing": [ "displayName" ]}Erro interno
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": "INTERNAL_ERROR"}