---
title: "Concluir assinatura digital"
method: POST
path: "/v1/transactions/{transactionId}/signing/complete"
tags: ["Signing"]
---

# Concluir assinatura digital

`POST /v1/transactions/{transactionId}/signing/complete`

## Request

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

Submete a assinatura digital bruta (raw signature) gerada pelo certificado A1 do cliente.

- Para documentos PDF: o servidor injeta a assinatura no PDF (PAdES).
- Para documentos genéricos: o servidor gera um arquivo `.p7s` CAdES com o conteúdo do documento anexado (enveloping).

Conclui a etapa `DIGITAL_SIGN_A1`.

**Carimbo do tempo (opcional, por contrato):** com o recurso habilitado no tenant, o servidor
solicita um carimbo do tempo RFC 3161 a uma Autoridade de Carimbo do Tempo (ACT) credenciada na
ICP-Brasil sobre o valor da assinatura e o embute nela (atributo não assinado
`id-aa-signatureTimeStampToken`, PAdES-B-T / CAdES-T). A resposta traz então
`result.digitalSignature.signatureTimestamp`. Se a ACT estiver indisponível, a resposta é `503`
com `code: TIMESTAMP_UNAVAILABLE`: a solicitação de assinatura continua pendente e pode ser
reenviada com a mesma `rawSignatureBase64` até expirar.

Requer scope `transactions:write`.

## Path parameters

- `transactionId` string, required

## Request body

- CompleteSigningRequest: Requisição de conclusão de assinatura digital.
  - `signatureRequestId` string, required: Identificador da requisição de assinatura (retornado por `/signing/prepare`).
  - `rawSignatureBase64` string, required: Assinatura digital bruta codificada em base64.

## Response `200`

Assinatura digital concluída com sucesso.

- SigningCompleteResponse: Resposta de conclusão de assinatura digital. Para PDF: inclui `signedPdfHash` e `signatureFieldName`. Para genérico: inclui `signedP7sHash` e `documentFormat`.
  - `stepId` string
  - `status` 'COMPLETED', required
  - `result` object, required
    - `digitalSignature` object, required
      - `certificateSubject` string
      - `certificateSerial` string
      - `certificateIssuer` string
      - `algorithm` string
      - `signedAt` string, date-time
      - `signedPdfHash` string: Hash SHA-256 do PDF assinado (apenas para documentos PDF).
      - `signatureFieldName` string: Nome do campo de assinatura no PDF (apenas para documentos PDF).
      - `signedP7sHash` string: Hash SHA-256 do arquivo .p7s (apenas para documentos genéricos).
      - `documentFormat` 'pdf' | 'generic': Formato do documento assinado.
      - `signatureTimestamp` SignatureTimestamp: Carimbo do tempo ICP-Brasil embutido na assinatura (token RFC 3161 emitido por uma ACT credenciada, gravado como `id-aa-signatureTimeStampToken`). Presente apenas quando o recurso está habilitado no tenant. `signedAt` continua sendo a hora do servidor SignDocs; `genTime` é a hora atestada pela ACT.
        - `genTime` string, date-time, required: Data e hora atestadas pela ACT.
        - `tsaName` string, required: Nome distinto (DN) do certificado do servidor de carimbo do tempo.
        - `serial` string, required: Número de série do carimbo (hexadecimal).
        - `policyOid` string, required: OID da política de carimbo do tempo ICP-Brasil.
        - `tokenSha256` string, required: SHA-256 (hex) do token de carimbo do tempo, para conferência com o embutido no 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.
- `503`: Carimbo do tempo indisponível (`code: TIMESTAMP_UNAVAILABLE`, `retryable: true`). Só ocorre em tenants com carimbo do tempo habilitado. A solicitação de assinatura continua pendente: reenvie a mesma assinatura após `Retry-After` segundos.

---

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