SignXP Docs

Cancelar um documento

POST /api/v1/documents/{id}/cancel
{
  "reason": "Contrato substituído pela revisão 2."
}

O reason é opcional (texto livre, até 500 caracteres), mas escreva-o. Meses depois, um cancelled sem motivo é indistinguível de um cancelamento feito por engano — e como o documento continua consultável, o motivo passa a fazer parte do registro.

O que o cancelamento faz

Derruba os links de assinatura que ainda estão pendentes. É o efeito principal. Quem recebeu o convite antes do cancelamento e abrir o link agora vê "documento cancelado" em vez do fluxo de assinatura, e nenhuma assinatura é mais aceita naquele documento.

Isso resolve o caso real: o contrato foi substituído, ou foi assinado por outro caminho, e o link que já saiu por e-mail continuaria valendo.

Muda o status para cancelled e dispara o callback document.cancelled.

Encerra as assinaturas que ainda não aconteceram. Quem estava pending ou opened passa a cancelled. Sem isso, a assinatura ficaria "pendente" para sempre — e a página de verificação seguiria prometendo uma assinatura que nunca viria.

Quem já assinou ou já recusou não é tocado. Aquilo aconteceu, está no Termo de Evidências, e reescrever apagaria o que a pessoa fez.

Não apaga o documento. Ele continua no acervo, continua aparecendo na listagem e a URL de verificação continua respondendo. Cancelar é registrar que a tentativa terminou, não sumir com ela — inclusive porque quem já assinou antes do cancelamento tem o direito de encontrar o que assinou.

A resposta

Devolve o documento no mesmo formato da consulta de status, acrescido do bloco de quota:

{
  "id": 128,
  "status": "cancelled",
  "cancelled_at": "2026-08-04T16:22:41-03:00",
  "cancellation_reason": "Contrato substituído pela revisão 2.",
  "verification_url": "https://app.signxp.com.br/validar/9f2c...",
  "quota": {
    "refunded": false,
    "limit": 500,
    "used": 139,
    "period": "2026-08"
  }
}

cancelled_at e cancellation_reason também vêm na consulta de status e na listagem do acervo — você não precisa guardar a resposta desta chamada para saber depois por que o documento foi cancelado.

O cancelamento não devolve a quota

quota.refunded é sempre false. O consumo é contado no momento do envio, no período do envio, e não volta.

São duas razões, e as duas importam:

  • Devolver creditaria o mês errado. Um documento enviado em julho e cancelado em agosto abateria a quota de agosto, que não foi onde ele foi gasto.
  • Quota que volta é quota que se contorna. Enviar e cancelar em sequência permitiria disparar convites sem limite — e o convite é e-mail que já saiu, com o link e o seu nome dentro.

Se isso apertar o seu volume, o caminho é rever a quota do plano com o time SignXP, não cancelar para reciclar.

Envios no ambiente de teste (sk_test_) nunca consumiram quota, então aqui não há o que devolver.

Quando o cancelamento é recusado

Status do documento Resposta
draft, awaiting_placement, pending 200 — cancelado.
cancelled 200 — idempotente (veja abaixo).
completed 409 — assinatura concluída não se cancela.
awaiting_review 409 — use a reprovação da validação por IA.
rejected, failed 409 — a tentativa já terminou por outro motivo.

Um documento completed já foi selado, e a via com validade jurídica pode já estar na mão das partes. Mudar o status aqui não desassinaria nada — só faria o seu acervo mentir. Se o contrato assinado precisa ser desfeito, isso é um distrato, e um distrato é um documento novo.

Em awaiting_review todos já assinaram e o documento espera a conferência de uma pessoa. A saída dali é reprovar a validação, que encerra o documento com o motivo ligado à assinatura reprovada — cancelar por fora apagaria essa ligação.

Em rejected e failed a tentativa já acabou, e a causa está registrada. Sobrescrever com "cancelado" perderia a informação de que houve uma recusa ou uma falha.

Repetir é seguro

Cancelar um documento que já está cancelled devolve 200 com o mesmo corpo — inclusive o cancelled_at e o reason do cancelamento original, que não são reescritos.

A repetição também não dispara o callback de novo: quem recebe document.cancelled vê o evento uma vez por documento. Isso torna a chamada segura para reenviar quando você perdeu a resposta e não sabe se ela chegou.

Cancelar não é arquivar

Cancelar encerra a tentativa; arquivar apenas tira o documento das telas do dia a dia. São coisas diferentes:

  • Um documento completed pode ser arquivado, mas nunca cancelado.
  • Um documento ainda aberto pode ser arquivado sem ser cancelado: o link segue valendo e a assinatura ainda pode acontecer — ele só saiu da lista de trabalho.

O arquivamento é uma ação do portal, feita pelo licenciado. Na listagem do acervo, status=cancelled filtra pelo cancelamento, e phase separa o dia a dia do histórico olhando o status e o arquivamento juntos. Um documento cancelado já sai do active por causa do status, sem precisar ser arquivado.

Erros

Vale a tabela de erros e limites. Específico daqui:

Código Quando acontece
404 O id não existe ou é de outro licenciado. Nunca revelamos qual dos dois.
409 O documento está num estado que não aceita cancelamento (tabela acima). O motivo vem em message.
422 reason acima de 500 caracteres.

Esta chamada continua funcionando com a licença fora de vigência ou com a quota esgotada — o que fica bloqueado nessa situação é o envio, não o cancelamento. É deliberado: quem está assim é justamente quem mais precisa conseguir derrubar um link pendente, e recusar aqui manteria vivos os links que você está tentando matar.

A exceção é o cliente inativo, que recebe 403 em toda a API, aqui como em qualquer outra rota.

Testar agora

Execute a chamada de verdade contra o ambiente de teste, com dados fictícios já preenchidos.

Encerra a tentativa e derruba os links de assinatura pendentes. Depois de rodar, consulte o status: ele volta como `cancelled`, e o link do signatário deixa de abrir o fluxo.

Só chaves de teste (sk_test_) são aceitas aqui: elas não enviam e-mail ao signatário nem consomem a sua quota. A chave fica apenas nesta aba do navegador.

Esta não parece uma chave de teste. Emita uma em Chaves de API.

O pdf_base64 já vem preenchido com um contrato de exemplo de uma página.