---
title: "Confirmar upload pré-assinado"
method: POST
path: "/v1/transactions/{transactionId}/document/confirm"
tags: ["Documents"]
---

# Confirmar upload pré-assinado

`POST /v1/transactions/{transactionId}/document/confirm`

## Request

- Base URL: `https://api.signdocs.com.br`
- URL: `https://api.signdocs.com.br/v1/transactions/{transactionId}/document/confirm`
- Auth: HTTP bearer

Confirma que o upload via URL pré-assinada foi concluído com sucesso.
O `uploadToken` foi retornado na resposta de `presign`.

Após a confirmação, o documento é validado quanto à qualidade e integridade (validação de qualidade aplica-se apenas a PDFs). Caso não
atenda aos critérios mínimos, retorna `422 Unprocessable Entity` com detalhes do problema.

Requer scope `transactions:write`.

## Path parameters

- `transactionId` string, required

## Request body

- ConfirmDocumentRequest: Requisição de confirmação de upload pré-assinado.
  - `uploadToken` string, required: Token retornado pela operação de presign.

## Response `200`

Upload confirmado com sucesso.

- ConfirmDocumentResponse: Resposta de confirmação de upload pré-assinado.
  - `transactionId` string, required
  - `status` 'DOCUMENT_UPLOADED', required
  - `documentHash` string, required: Hash SHA-256 do documento confirmado.
  - `documentFormat` 'pdf' | 'generic': Formato detectado do documento.

## Other responses

- `400`: Requisição inválida — parâmetros ausentes ou malformados.
- `401`: Autenticação ausente ou inválida.
- `403`: Permissões insuficientes para a operação solicitada. Inclui `purpose: "ACTION_AUTHENTICATION"` sem `featureFlags.trustSessionsEnabled`. A verificação é pelo `purpose`, não pela rota: vale em `/v1/transactions`, `/v1/signing-sessions` e `/v1/envelopes/{envelopeId}/sessions`, além de `/v1/trust-sessions`. O remédio é habilitar a flag para o tenant e provisionar a cota `monthlyTrustSessions`.
- `404`: Recurso não encontrado.
- `409`: Conflito de estado — a operação não pode ser realizada no estado atual do recurso.
- `422`: Entidade não processável — a requisição é sintaticamente válida mas semanticamente incorreta. Inclui o perfil de política não autorizado para o tenant. As rotas de criação (`/v1/transactions`, `/v1/signing-sessions` e `/v1/envelopes/{envelopeId}/sessions`) verificam a mesma regra, antes de cota, convite e gravação — a recusa não consome documento. As flags envolvidas são `featureFlags.customPolicyEnabled` (perfil `CUSTOM`), `serpro.enabled` (perfis SERPRO), `featureFlags.documentExtractionEnabled` (fallback por documento; `BIOMETRIC_SERPRO_AUTO_FALLBACK` exige as duas últimas) e `featureFlags.biometricRequired`. O remédio é habilitar a flag para o tenant. `signer.cpf` e `signer.birthDate`, exigidos pelos perfis SERPRO, são validados como **400** e não aqui: requisição malformada, corrigível na mesma chamada.
- `500`: Erro interno do servidor.

---

[API](https://skmtc.dev/signdocs/apis/signdocs-brasil-external-api.md) · [All operations](https://skmtc.dev/signdocs/apis/signdocs-brasil-external-api/llms.txt) · [OpenAPI document](https://skmtc.dev/signdocs/apis/signdocs-brasil-external-api/revisions/2d3805aed161?raw)
