Pular para o conteúdo
CardSign

Documentação · versão 1.0.1

API do CardSign

API REST do CardSign para criar, enviar e acompanhar documentos para assinatura eletrônica a partir do seu sistema, baixar o PDF final selado, a trilha de auditoria e o pacote de provas, e receber webhooks assinados a cada passo.

  • Base: https://cardsign.gopixeltecnologiaa.com.br/api/v1
  • Formato: JSON UTF-8; datas ISO 8601 em UTC; ids são UUID.
  • Limite: 120 chamadas por minuto por chave (acima disso, 429 com retry-after).
  • Escrita: todo POST exige o cabeçalho Idempotency-Key.
Baixar OpenAPI 3.1
GET /api/v1200
{
  "api": "CardSign",
  "versao": "v1",
  "documentacao": "https://cardsign.gopixeltecnologiaa.com.br/docs/api",
  "rotas": [
    "GET /api/v1/eu",
    "GET /api/v1/empresas",
    "GET /api/v1/modelos",
    "GET /api/v1/pastas",
    "GET /api/v1/envelopes"
  ]
}

Autorização

Toda chamada leva a chave no cabeçalho Authorization: Bearer cs_<prefixo>_<segredo>. A chave é criada em Configurações › API e mostrada uma única vez; o CardSign guarda só o SHA-256 dela.

A chave age em nome de quem a criou: em cada chamada valem as permissões que essa pessoa tem agora no painel, empresa por empresa. Cada rota exige um escopo (x-escopo em cada operação), e cada escopo exige uma permissão do painel de quem criou a chave.

Tirar a permissão no painel leva a chave junto em até 30 s. A chave pode ter validade e lista de IPs permitidos (IPv4 ou CIDR).

Cabeçalho de autorização

Cabeçalho de autorização
CabeçalhoTipoDescrição
AuthorizationstringBearer cs_<prefixo>_<segredo> — prefixo de 8 caracteres [a-z0-9] e segredo de 40 [A-Za-z0-9].

Escopos

Escopos
EscopoPermissão do painelLibera
documentos:lerdocs.verListar e consultar documentos e envelopes.
documentos:baixardocs.baixarBaixar o PDF final selado.
trilha:leraudit.trilhaLer a trilha de auditoria.
envelopes:criardocs.criarCriar e montar rascunhos (arquivos, pessoas, campos).
envelopes:enviardocs.enviarEnviar para assinatura.
envelopes:gerirdocs.cancelarCancelar, pausar, retomar, lembrar; receber links de assinatura.
provas:baixardocs.baixarBaixar o pacote de provas (ZIP).
webhooks:gerirorg.apiCadastrar e gerir webhooks.
modelos:lerdocs.verListar modelos de documento.
Exemplo Request
curl -X GET "https://cardsign.gopixeltecnologiaa.com.br/api/v1/eu" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE"
Sem chave401
{
  "erro": {
    "codigo": "sem_chave",
    "mensagem": "Envie a chave no cabeçalho Authorization: Bearer cs_…"
  }
}

Índice da API

GET/api/v1
Escopo: sem chave

Lista as rotas, as regras de paginação e de escrita. Não exige chave.

Respostas

Respostas
CódigoTipoDescrição
200Indice

Índice.

Exemplo Request
curl -X GET "https://cardsign.gopixeltecnologiaa.com.br/api/v1"
Exemplo Resposta200
{
  "api": "CardSign",
  "versao": "v1",
  "documentacao": "https://cardsign.gopixeltecnologiaa.com.br/docs/api",
  "rotas": [
    "GET /api/v1/documentos",
    "POST /api/v1/envelopes",
    "GET /api/v1/envelopes/{id}"
  ],
  "paginacao": {
    "cursor": "Use \"depois\" com o valor de \"proximo\" da resposta anterior (ou siga \"proxima_url\"); \"proximo\" null = acabou.",
    "limite": "\"limite\" de 1 a 200 (padrão 50)."
  },
  "escrita": "Todo POST exige o cabeçalho Idempotency-Key (1 a 200 caracteres): a mesma chave com o mesmo corpo em 24 h devolve a mesma resposta.",
  "cache": "Permissões de quem criou a chave são conferidas no banco e guardadas por até 30 s."
}

Quem sou eu

GET/api/v1/eu
Escopo: qualquer chave válida

A chave (escopos, validade), o grupo e as empresas em que ela age (união de todos os escopos), e o limite por minuto. Bom para testar a chave.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.

Respostas

Respostas
CódigoTipoDescrição
200Eu

A chave e o alcance dela.

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X GET "https://cardsign.gopixeltecnologiaa.com.br/api/v1/eu" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE"
Exemplo Resposta200
{
  "chave": {
    "id": "0e1d2c3b-4a59-4687-9a8b-7c6d5e4f3a2b",
    "prefixo": "a1b2c3d4",
    "nome": "Programa DIAS — produção",
    "expira_em": "2027-10-20T02:59:59.000Z",
    "escopos": [
      "documentos:ler",
      "documentos:baixar",
      "trilha:ler",
      "envelopes:criar",
      "envelopes:enviar",
      "envelopes:gerir",
      "provas:baixar",
      "webhooks:gerir"
    ]
  },
  "grupo": {
    "id": "9a2e7c41-5d3b-4e8f-b1a6-7c0d2f9e8b13",
    "nome": "Grupo Dias"
  },
  "empresas": [
    {
      "id": "3f6c1d2a-8b4e-4f1a-9c7d-2e5b8a1f4c90",
      "nome": "Clínica Dias Saúde Ocupacional",
      "cnpj": "12345678000190"
    },
    {
      "id": "4a7d2e3b-9c5f-4a2b-8d8e-3f6c9b2a5d01",
      "nome": "Clínica Dias Ipatinga",
      "cnpj": "12345678000271"
    }
  ],
  "limite_por_minuto": 120
}

Empresas da chave

GET/api/v1/empresas
Escopo: qualquer chave válida

Empresas do grupo em que a chave age (para qualquer um dos escopos dela), por nome.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.

Respostas

Respostas
CódigoTipoDescrição
200objeto

Lista de empresas.

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X GET "https://cardsign.gopixeltecnologiaa.com.br/api/v1/empresas" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE"
Exemplo Resposta200
{
  "empresas": [
    {
      "id": "3f6c1d2a-8b4e-4f1a-9c7d-2e5b8a1f4c90",
      "nome": "Clínica Dias Saúde Ocupacional",
      "cnpj": "12345678000190"
    },
    {
      "id": "4a7d2e3b-9c5f-4a2b-8d8e-3f6c9b2a5d01",
      "nome": "Clínica Dias Ipatinga",
      "cnpj": "12345678000271"
    }
  ]
}

Modelos de documento

GET/api/v1/modelos
Escopo: modelos:ler

Modelos não arquivados das empresas liberadas (somente leitura; criar documento a partir de modelo fica para uma próxima versão).

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.

Respostas

Respostas
CódigoTipoDescrição
200objeto

Lista de modelos.

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X GET "https://cardsign.gopixeltecnologiaa.com.br/api/v1/modelos" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE"
Exemplo Resposta200
{
  "modelos": [
    {
      "id": "2b7e9c4d-1f3a-4b5c-8d6e-9f0a1b2c3d4e",
      "nome": "Termo de ciência de POP",
      "tipo_id": "6d1c8e2f-4a5b-4c3d-9e8f-0a1b2c3d4e5f",
      "versao": 3,
      "empresa_id": "3f6c1d2a-8b4e-4f1a-9c7d-2e5b8a1f4c90",
      "status": "ativo"
    }
  ]
}

Pastas

GET/api/v1/pastas
Escopo: documentos:ler

As pastas das empresas liberadas, com o caminho completo. Serve para o seu sistema ligar cada pasta do CardSign a uma pasta dele (o envelope traz pasta.id). ?empresa_id= filtra uma empresa.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.

Parâmetros

Parâmetros
ParâmetroTipoDescrição
empresa_idquerystring (uuid)

Respostas

Respostas
CódigoTipoDescrição
200objeto

Lista de pastas.

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X GET "https://cardsign.gopixeltecnologiaa.com.br/api/v1/pastas" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE"
Exemplo Resposta200
{
  "pastas": [
    {
      "id": "7a1c2d3e-4f5a-4b6c-8d7e-9f0a1b2c3d4e",
      "empresa_id": "3f6c1d2a-8b4e-4f1a-9c7d-2e5b8a1f4c90",
      "pai_id": null,
      "codigo": "01",
      "nome": "Recursos Humanos",
      "caminho": "Recursos Humanos"
    }
  ]
}

Primeiros passos

  1. Peça a um administrador uma chave da API em Conta › API e chaves do CardSign, com os escopos de que a integração precisa. Guarde-a num cofre de segredos: ela só aparece uma vez.
  2. Teste a chave com GET /eu: a resposta traz os escopos e as empresas em que ela age (use o id de uma delas como empresa_id).
  3. Crie o envelope com POST /envelopes — PDF por URL, base64 ou multipart, as pessoas e os campos. Ele nasce como rascunho.
  4. Envie com POST /envelopes/{id}/enviar. Os convites saem por e-mail, WhatsApp ou SMS (ou peça os links com devolver_links).
  5. Cadastre um webhook para saber de cada assinatura e da conclusão, e baixe o PDF final com GET /envelopes/{id}/pdf. Quer testar sem código? Use a coleção Postman abaixo.
Do zero ao PDF assinado (cURL)
export CARDSIGN_CHAVE="cs_a1b2c3d4_…"   # Conta › API e chaves
export API="https://cardsign.gopixeltecnologiaa.com.br/api/v1"

# 1. Teste a chave e pegue o id da empresa
curl -s "$API/eu" -H "Authorization: Bearer $CARDSIGN_CHAVE"

# 2. Crie o rascunho (PDF por URL; também aceita base64 ou multipart)
curl -s -X POST "$API/envelopes" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE" \
  -H "Idempotency-Key: dias-4821-criar" \
  -H "Content-Type: application/json" \
  -d '{
    "empresa_id": "3f6c1d2a-8b4e-4f1a-9c7d-2e5b8a1f4c90",
    "titulo": "POP 014 — Higienização das mãos",
    "external_id": "dias:pop:4821",
    "arquivos": [{"nome": "pop-014.pdf", "url": "https://seu-sistema.com.br/pop-014.pdf"}],
    "signatarios": [{"nome": "Mariana Costa Ribeiro", "email": "[email protected]"}]
  }'

# 3. Envie para assinatura (id = "id" da resposta anterior)
curl -s -X POST "$API/envelopes/$ID/enviar" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE" \
  -H "Idempotency-Key: dias-4821-enviar"

# 4. Acompanhe por webhook (envelope.concluido) ou consulte
curl -s "$API/envelopes/$ID" -H "Authorization: Bearer $CARDSIGN_CHAVE"

# 5. Concluído: baixe o PDF final selado
curl -s "$API/envelopes/$ID/pdf" -H "Authorization: Bearer $CARDSIGN_CHAVE"

Envelopes

Um envelope é o documento a assinar: um ou mais PDFs, as pessoas (signatários) e os campos de cada uma. Ele nasce como rascunho, vai para andamento ao ser enviado e termina como concluido, cancelado, expirado ou recusado (pausado é temporário).

Criar envelope

POST/api/v1/envelopes
Escopo: envelopes:criarExige Idempotency-Key

Cria o rascunho completo (arquivos, pessoas e campos) ou nada. Aceita JSON ou multipart/form-data (campo dados com o JSON e arquivo repetido com os PDFs). Depois, envie com POST /envelopes/{id}/enviar. external_id repetido para a mesma chave → 409 external_id_em_uso, com o envelope_id existente em detalhes.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.
Idempotency-Keyobrigatóriostring1 a 200 caracteres. A mesma chave com o mesmo corpo em 24 h devolve a mesma resposta.
Content-Typestringapplication/json multipart/form-data

Corpo da requisição

Corpo da requisição
CampoTipoDescrição
empresa_idobrigatóriostring (uuid)

Empresa liberada para envelopes:criar.

tituloobrigatóriostring

(3 a 200 caracteres)

external_idstring | null

Seu identificador; repetido para a mesma chave → 409. (1 a 200 caracteres)

external_refobjeto | null

Dados livres (até 4 KB)

prazostring | null

AAAA-MM-DD (23:59 de Brasília) ou ISO 8601; no futuro. (até 40 caracteres)

mensagemstring | null

Vai no convite. (até 2000 caracteres)

assinatura_comocpf | cnpj | misto

cpf (padrão): todo signatário precisa de CPF. cnpj: cada um assina em nome de uma empresa (CPF e CNPJ). misto: sem exigência fixa; o nível qualificado continua exigindo CPF e certificado. (padrão "cpf")

arquivosarray de ArquivoEntrada

(até 20 itens)

arquivos[].nomeobrigatóriostring

Nome do arquivo (".pdf" é acrescentado se faltar). (1 a 200 caracteres) [Por URL] · Em base64

arquivos[].urlobrigatóriostring (uri)

https pública; sem redirecionamento. (até 2000 caracteres) [Por URL]

arquivos[].base64obrigatóriostring

Conteúdo do PDF em base64. (8 a 28000000 caracteres) [Em base64]

signatariosarray de SignatarioEntrada

(até 50 itens)

signatarios[].nomeobrigatóriostring

(2 a 200 caracteres)

signatarios[].funcaoassinar | aprovar | testemunha | observador

(padrão "assinar")

signatarios[].ordeminteger

Padrão: a posição na lista. Mesma ordem = em paralelo. (de 1 a 50)

signatarios[].canalwhatsapp | sms | email | link

Por onde vai o convite. Com link, integre a assinatura no seu sistema usando devolver_links. (padrão "email")

signatarios[].emailstring (email) | null

Obrigatório para enviar (exceto observador): o código de confirmação segue por e-mail. (até 200 caracteres)

signatarios[].telefonestring | null

Com +DDI ou só DDD + número (DDI 55). (até 30 caracteres)

signatarios[].cpfstring | null

Com ou sem pontuação; 11 dígitos. (até 20 caracteres)

signatarios[].nivelsimples | avancada | qualificada

(padrão "avancada")

signatarios[].camposarray de CampoPosicao ou CampoAncora

Sem campos, quem assina ganha uma caixa automática na última página. (até 50 itens)

signatarios[].campos[].tipoobrigatórioassinatura | rubrica | data | nome | cpf

[Por posição] · Por âncora

signatarios[].campos[].arquivointeger

Índice do arquivo no envelope (1 = primeiro). (de 1 a 20; padrão 1) [Por posição]

signatarios[].campos[].paginaobrigatóriointeger

(de 1 a 5000) [Por posição]

signatarios[].campos[].xobrigatórionumber

(de 0 a 100) [Por posição]

signatarios[].campos[].yobrigatórionumber

(de 0 a 100) [Por posição]

signatarios[].campos[].larguraobrigatórionumber

[Por posição] · Por âncora

signatarios[].campos[].alturaobrigatórionumber

[Por posição] · Por âncora

signatarios[].campos[].ancoraobrigatóriostring

(2 a 100 caracteres) [Por âncora]

signatarios[].campos[].deslocamento_xnumber

% da página a partir do início do texto. (de -100 a 100) [Por âncora]

signatarios[].campos[].deslocamento_ynumber

(de -100 a 100) [Por âncora]

Respostas

Respostas
CódigoTipoDescrição
201Envelope

Rascunho criado.

400Erro

sem_idempotency_key (POST sem o cabeçalho) ou json_invalido (corpo ilegível).

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

409Erro

external_id_em_uso (o envelope_id existente vem em detalhes) ou idempotencia_em_andamento.

413Erro

grande_demais — corpo acima de 30 MB, PDF acima de 20 MB ou os PDFs do pedido somando mais de 30 MB (cada download só pode trazer o que ainda cabe).

415Erro

tipo_nao_suportado — use application/json ou multipart/form-data.

422Erro

validacao, arquivo_invalido, download_falhou, url_invalida, ancora_nao_encontrada, regra_violada ou idempotencia_conflito.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X POST "https://cardsign.gopixeltecnologiaa.com.br/api/v1/envelopes" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE" \
  -H "Idempotency-Key: minha-integracao-criarEnvelope-123" \
  -H "Content-Type: application/json" \
  -d '{
  "empresa_id": "3f6c1d2a-8b4e-4f1a-9c7d-2e5b8a1f4c90",
  "titulo": "POP 014 — Higienização das mãos (ciência do colaborador)",
  "external_id": "dias:pop:4821",
  "external_ref": {
    "origem": "programa-dias",
    "pop": "014",
    "turma": "2026-10"
  },
  "prazo": "2026-10-30",
  "mensagem": "Olá! Leia o POP de higienização das mãos e assine a ciência até sexta.",
  "arquivos": [
    {
      "nome": "POP-014-higienizacao-das-maos.pdf",
      "url": "https://treinamento.gopixeltecnologia.com/arquivos/pop-014.pdf"
    }
  ],
  "signatarios": [
    {
      "nome": "Mariana Costa Ribeiro",
      "email": "[email protected]",
      "cpf": "52998224725",
      "canal": "email",
      "nivel": "avancada",
      "campos": [
        {
          "tipo": "assinatura",
          "ancora": "{{assinatura:1}}"
        }
      ]
    },
    {
      "nome": "Rafael Almeida Pinto",
      "funcao": "testemunha",
      "ordem": 2,
      "canal": "whatsapp",
      "email": "[email protected]",
      "telefone": "+55 31 99876-5432"
    }
  ]
}'
Exemplo Resposta201
{
  "id": "7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b",
  "titulo": "POP 014 — Higienização das mãos (ciência do colaborador)",
  "status": "rascunho",
  "empresa_id": "3f6c1d2a-8b4e-4f1a-9c7d-2e5b8a1f4c90",
  "external_id": "dias:pop:4821",
  "external_ref": {
    "origem": "programa-dias",
    "pop": "014",
    "turma": "2026-10"
  },
  "origem": "api",
  "prazo": "2026-10-31T02:59:00+00:00",
  "mensagem": "Olá! Leia o POP de higienização das mãos e assine a ciência até sexta.",
  "criado_em": "2026-10-19T13:42:07.481233+00:00",
  "concluido_em": null,
  "motivo_cancelamento": null,
  "arquivos": [
    {
      "id": "2c8d5e1f-3a4b-4c6d-9e7f-8a9b0c1d2e3f",
      "nome": "POP-014-higienizacao-das-maos.pdf",
      "sha256": "3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b",
      "paginas": 3,
      "ordem": 1
    }
  ],
  "signatarios": [
    {
      "id": "4d9e6f2a-1b3c-4d5e-8f9a-0b1c2d3e4f5a",
      "nome": "Mariana Costa Ribeiro",
      "funcao": "assinar",
      "ordem": 1,
      "canal": "email",
      "nivel": "avancada",
      "status": "aguardando",
      "email_mascarado": "m***@clinicadias.com.br",
      "telefone_mascarado": null,
      "assinado_em": null,
      "motivo_recusa": null
    },
    {
      "id": "5e0f7a3b-2c4d-4e6f-9a0b-1c2d3e4f5a6b",
      "nome": "Rafael Almeida Pinto",
      "funcao": "testemunha",
      "ordem": 2,
      "canal": "whatsapp",
      "nivel": "avancada",
      "status": "aguardando",
      "email_mascarado": "r***@clinicadias.com.br",
      "telefone_mascarado": "+55 31 9****-5432",
      "assinado_em": null,
      "motivo_recusa": null
    }
  ],
  "pdfs_finais": []
}

Consultar envelope

GET/api/v1/envelopes/{id}
Escopo: documentos:ler

O envelope completo (rascunho incluído) — situação, arquivos, pessoas (contato mascarado) e PDFs finais com o link de verificação.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.

Parâmetros

Parâmetros
ParâmetroTipoDescrição
idobrigatóriocaminhostring (uuid)

UUID do envelope (ou do webhook, nas rotas /webhooks).

Respostas

Respostas
CódigoTipoDescrição
200Envelope

O envelope.

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

404Erro

documento_nao_encontrado — não existe, foi apagado ou é de uma empresa fora do alcance da chave.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X GET "https://cardsign.gopixeltecnologiaa.com.br/api/v1/envelopes/7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE"
Exemplo Resposta200
{
  "id": "7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b",
  "titulo": "POP 014 — Higienização das mãos (ciência do colaborador)",
  "status": "concluido",
  "empresa_id": "3f6c1d2a-8b4e-4f1a-9c7d-2e5b8a1f4c90",
  "external_id": "dias:pop:4821",
  "external_ref": {
    "origem": "programa-dias",
    "pop": "014",
    "turma": "2026-10"
  },
  "origem": "api",
  "prazo": "2026-10-31T02:59:00+00:00",
  "mensagem": "Olá! Leia o POP de higienização das mãos e assine a ciência até sexta.",
  "criado_em": "2026-10-19T13:42:07.481233+00:00",
  "concluido_em": "2026-10-20T11:05:31.204118+00:00",
  "motivo_cancelamento": null,
  "arquivos": [
    {
      "id": "2c8d5e1f-3a4b-4c6d-9e7f-8a9b0c1d2e3f",
      "nome": "POP-014-higienizacao-das-maos.pdf",
      "sha256": "3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b",
      "paginas": 3,
      "ordem": 1
    }
  ],
  "signatarios": [
    {
      "id": "4d9e6f2a-1b3c-4d5e-8f9a-0b1c2d3e4f5a",
      "nome": "Mariana Costa Ribeiro",
      "funcao": "assinar",
      "ordem": 1,
      "canal": "email",
      "nivel": "avancada",
      "status": "assinou",
      "email_mascarado": "m***@clinicadias.com.br",
      "telefone_mascarado": null,
      "assinado_em": "2026-10-20T10:58:12.903311+00:00",
      "motivo_recusa": null
    },
    {
      "id": "5e0f7a3b-2c4d-4e6f-9a0b-1c2d3e4f5a6b",
      "nome": "Rafael Almeida Pinto",
      "funcao": "testemunha",
      "ordem": 2,
      "canal": "whatsapp",
      "nivel": "avancada",
      "status": "assinou",
      "email_mascarado": "r***@clinicadias.com.br",
      "telefone_mascarado": "+55 31 9****-5432",
      "assinado_em": "2026-10-20T11:05:29.118024+00:00",
      "motivo_recusa": null
    }
  ],
  "pdfs_finais": [
    {
      "nome": "POP-014-higienizacao-das-maos-assinado.pdf",
      "sha256": "8e3b1f0c9d2a47b6e5f4c3d2b1a09f8e7d6c5b4a39281706f5e4d3c2b1a09f8e",
      "criado_em": "2026-10-20T11:05:40.552910+00:00",
      "verificar": "https://cardsign.gopixeltecnologiaa.com.br/verificar?h=8e3b1f0c9d2a47b6e5f4c3d2b1a09f8e7d6c5b4a39281706f5e4d3c2b1a09f8e"
    }
  ]
}

Editar rascunho

PATCH/api/v1/envelopes/{id}
Escopo: envelopes:criar

Só no rascunho. Envie ao menos um de titulo, prazo (AAAA-MM-DD = 23:59 de Brasília, ou ISO 8601) e mensagem.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.
Content-Typestringapplication/json

Parâmetros

Parâmetros
ParâmetroTipoDescrição
idobrigatóriocaminhostring (uuid)

UUID do envelope (ou do webhook, nas rotas /webhooks).

Corpo da requisição

Corpo da requisição
CampoTipoDescrição
titulostring

(3 a 200 caracteres)

prazostring | null

AAAA-MM-DD ou ISO 8601; null tira o prazo. (até 40 caracteres)

mensagemstring | null

(até 2000 caracteres)

assinatura_comocpf | cnpj | misto

—

Respostas

Respostas
CódigoTipoDescrição
200Envelope

O envelope atualizado.

400Erro

sem_idempotency_key (POST sem o cabeçalho) ou json_invalido (corpo ilegível).

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

404Erro

documento_nao_encontrado — não existe, foi apagado ou é de uma empresa fora do alcance da chave.

409Erro

estado_invalido — a situação do envelope não permite (ex.: mudar o que já foi enviado).

415Erro

tipo_nao_suportado — use application/json ou multipart/form-data.

422Erro

validacao (campos inválidos, veja detalhes) ou idempotencia_conflito.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X PATCH "https://cardsign.gopixeltecnologiaa.com.br/api/v1/envelopes/7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
  "titulo": "POP 014 — Higienização das mãos (revisão 2)",
  "prazo": "2026-11-07"
}'
Exemplo Resposta200
{
  "id": "7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b",
  "titulo": "POP 014 — Higienização das mãos (ciência do colaborador)",
  "status": "rascunho",
  "empresa_id": "3f6c1d2a-8b4e-4f1a-9c7d-2e5b8a1f4c90",
  "external_id": "dias:pop:4821",
  "external_ref": {
    "origem": "programa-dias",
    "pop": "014",
    "turma": "2026-10"
  },
  "origem": "api",
  "prazo": "2026-10-31T02:59:00+00:00",
  "mensagem": "Olá! Leia o POP de higienização das mãos e assine a ciência até sexta.",
  "criado_em": "2026-10-19T13:42:07.481233+00:00",
  "concluido_em": null,
  "motivo_cancelamento": null,
  "arquivos": [
    {
      "id": "2c8d5e1f-3a4b-4c6d-9e7f-8a9b0c1d2e3f",
      "nome": "POP-014-higienizacao-das-maos.pdf",
      "sha256": "3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b",
      "paginas": 3,
      "ordem": 1
    }
  ],
  "signatarios": [
    {
      "id": "4d9e6f2a-1b3c-4d5e-8f9a-0b1c2d3e4f5a",
      "nome": "Mariana Costa Ribeiro",
      "funcao": "assinar",
      "ordem": 1,
      "canal": "email",
      "nivel": "avancada",
      "status": "aguardando",
      "email_mascarado": "m***@clinicadias.com.br",
      "telefone_mascarado": null,
      "assinado_em": null,
      "motivo_recusa": null
    },
    {
      "id": "5e0f7a3b-2c4d-4e6f-9a0b-1c2d3e4f5a6b",
      "nome": "Rafael Almeida Pinto",
      "funcao": "testemunha",
      "ordem": 2,
      "canal": "whatsapp",
      "nivel": "avancada",
      "status": "aguardando",
      "email_mascarado": "r***@clinicadias.com.br",
      "telefone_mascarado": "+55 31 9****-5432",
      "assinado_em": null,
      "motivo_recusa": null
    }
  ],
  "pdfs_finais": []
}

Arquivos

PDFs do envelope (até 20 MB cada, 20 por envelope). Mande por URL https pública (o CardSign baixa, sem seguir redirecionamento), em base64 ou como multipart (arquivo). O servidor confere a assinatura %PDF, conta as páginas e calcula o SHA-256.

Adicionar arquivo

POST/api/v1/envelopes/{id}/arquivos
Escopo: envelopes:criarExige Idempotency-Key

Só no rascunho. Um PDF por chamada — JSON {nome, url} ou {nome, base64}, ou multipart com o campo arquivo.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.
Idempotency-Keyobrigatóriostring1 a 200 caracteres. A mesma chave com o mesmo corpo em 24 h devolve a mesma resposta.
Content-Typestringapplication/json multipart/form-data

Parâmetros

Parâmetros
ParâmetroTipoDescrição
idobrigatóriocaminhostring (uuid)

UUID do envelope (ou do webhook, nas rotas /webhooks).

Corpo da requisição

Corpo da requisição
CampoTipoDescrição
nomeobrigatóriostring

Nome do arquivo (".pdf" é acrescentado se faltar). (1 a 200 caracteres) [Por URL] · Em base64

urlobrigatóriostring (uri)

https pública; sem redirecionamento. (até 2000 caracteres) [Por URL]

base64obrigatóriostring

Conteúdo do PDF em base64. (8 a 28000000 caracteres) [Em base64]

Respostas

Respostas
CódigoTipoDescrição
201Arquivo

Arquivo guardado.

400Erro

sem_idempotency_key (POST sem o cabeçalho) ou json_invalido (corpo ilegível).

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

404Erro

documento_nao_encontrado — não existe, foi apagado ou é de uma empresa fora do alcance da chave.

409Erro

estado_invalido (a situação do envelope não permite) ou idempotencia_em_andamento (a mesma Idempotency-Key ainda está sendo processada; veja retry-after).

413Erro

grande_demais — corpo acima de 30 MB, PDF acima de 20 MB ou os PDFs do pedido somando mais de 30 MB (cada download só pode trazer o que ainda cabe).

415Erro

tipo_nao_suportado — use application/json ou multipart/form-data.

422Erro

validacao, arquivo_invalido, download_falhou, url_invalida, ancora_nao_encontrada, regra_violada ou idempotencia_conflito.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X POST "https://cardsign.gopixeltecnologiaa.com.br/api/v1/envelopes/7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b/arquivos" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE" \
  -H "Idempotency-Key: minha-integracao-adicionarArquivo-123" \
  -H "Content-Type: application/json" \
  -d '{
  "nome": "Anexo-I-checklist.pdf",
  "base64": "JVBERi0xLjQKMSAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZyAuLi4="
}'
Exemplo Resposta201
{
  "id": "9d4e1f6a-2b3c-4d5e-8f9a-1b2c3d4e5f60",
  "nome": "Anexo-I-checklist.pdf",
  "sha256": "4f1c9a2b7d3e8f60a1b2c3d4e5f60718293a4b5c6d7e8f9012a3b4c5d6e7f809",
  "paginas": 1,
  "ordem": 2
}

Signatários

Pessoas do envelope. Campos por posição (em % da página, y a partir do topo) ou por âncora (texto procurado nos PDFs, mesmo invisível; cada ocorrência vira um campo). Quem assina sem campos ganha uma caixa de assinatura automática na última página (até 30 pessoas, empilhadas por ordem).

Adicionar signatário

POST/api/v1/envelopes/{id}/signatarios
Escopo: envelopes:criarExige Idempotency-Key

Só no rascunho. Mesmo formato de cada item de signatarios em POST /envelopes. Sem ordem, entra no fim.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.
Idempotency-Keyobrigatóriostring1 a 200 caracteres. A mesma chave com o mesmo corpo em 24 h devolve a mesma resposta.
Content-Typestringapplication/json

Parâmetros

Parâmetros
ParâmetroTipoDescrição
idobrigatóriocaminhostring (uuid)

UUID do envelope (ou do webhook, nas rotas /webhooks).

Corpo da requisição

Corpo da requisição
CampoTipoDescrição
nomeobrigatóriostring

(2 a 200 caracteres)

funcaoassinar | aprovar | testemunha | observador

(padrão "assinar")

ordeminteger

Padrão: a posição na lista. Mesma ordem = em paralelo. (de 1 a 50)

canalwhatsapp | sms | email | link

Por onde vai o convite. Com link, integre a assinatura no seu sistema usando devolver_links. (padrão "email")

emailstring (email) | null

Obrigatório para enviar (exceto observador): o código de confirmação segue por e-mail. (até 200 caracteres)

telefonestring | null

Com +DDI ou só DDD + número (DDI 55). (até 30 caracteres)

cpfstring | null

Com ou sem pontuação; 11 dígitos. (até 20 caracteres)

nivelsimples | avancada | qualificada

(padrão "avancada")

camposarray de CampoPosicao ou CampoAncora

Sem campos, quem assina ganha uma caixa automática na última página. (até 50 itens)

campos[].tipoobrigatórioassinatura | rubrica | data | nome | cpf

[Por posição] · Por âncora

campos[].arquivointeger

Índice do arquivo no envelope (1 = primeiro). (de 1 a 20; padrão 1) [Por posição]

campos[].paginaobrigatóriointeger

(de 1 a 5000) [Por posição]

campos[].xobrigatórionumber

(de 0 a 100) [Por posição]

campos[].yobrigatórionumber

(de 0 a 100) [Por posição]

campos[].larguraobrigatórionumber

[Por posição] · Por âncora

campos[].alturaobrigatórionumber

[Por posição] · Por âncora

campos[].ancoraobrigatóriostring

(2 a 100 caracteres) [Por âncora]

campos[].deslocamento_xnumber

% da página a partir do início do texto. (de -100 a 100) [Por âncora]

campos[].deslocamento_ynumber

(de -100 a 100) [Por âncora]

Respostas

Respostas
CódigoTipoDescrição
201Signatario

A pessoa criada.

400Erro

sem_idempotency_key (POST sem o cabeçalho) ou json_invalido (corpo ilegível).

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

404Erro

documento_nao_encontrado — não existe, foi apagado ou é de uma empresa fora do alcance da chave.

409Erro

estado_invalido (a situação do envelope não permite) ou idempotencia_em_andamento (a mesma Idempotency-Key ainda está sendo processada; veja retry-after).

415Erro

tipo_nao_suportado — use application/json ou multipart/form-data.

422Erro

validacao, ancora_nao_encontrada, regra_violada ou idempotencia_conflito.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X POST "https://cardsign.gopixeltecnologiaa.com.br/api/v1/envelopes/7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b/signatarios" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE" \
  -H "Idempotency-Key: minha-integracao-adicionarSignatario-123" \
  -H "Content-Type: application/json" \
  -d '{
  "nome": "Juliana Ferreira Lopes",
  "funcao": "aprovar",
  "canal": "email",
  "email": "[email protected]",
  "nivel": "simples",
  "campos": [
    {
      "tipo": "assinatura",
      "pagina": 1,
      "x": 60,
      "y": 82,
      "largura": 26,
      "altura": 7
    },
    {
      "tipo": "data",
      "arquivo": 1,
      "pagina": 1,
      "x": 60,
      "y": 90,
      "largura": 14,
      "altura": 3.5
    }
  ]
}'
Exemplo Resposta201
{
  "id": "6f1a8b4c-3d5e-4f7a-9b0c-2d3e4f5a6b7c",
  "nome": "Juliana Ferreira Lopes",
  "funcao": "aprovar",
  "ordem": 3,
  "canal": "email",
  "nivel": "simples",
  "status": "aguardando",
  "email_mascarado": "j***@clinicadias.com.br",
  "telefone_mascarado": null,
  "assinado_em": null,
  "motivo_recusa": null
}

Remover signatário

DELETE/api/v1/envelopes/{id}/signatarios/{sid}
Escopo: envelopes:criar

Só no rascunho. Remove a pessoa e os campos dela.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.

Parâmetros

Parâmetros
ParâmetroTipoDescrição
idobrigatóriocaminhostring (uuid)

UUID do envelope (ou do webhook, nas rotas /webhooks).

sidobrigatóriocaminhostring (uuid)

UUID do signatário.

Respostas

Respostas
CódigoTipoDescrição
204—

Removida (sem corpo).

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

404Erro

signatario_nao_encontrado (pessoa que não é deste envelope) ou documento_nao_encontrado.

409Erro

estado_invalido — a situação do envelope não permite (ex.: mudar o que já foi enviado).

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X DELETE "https://cardsign.gopixeltecnologiaa.com.br/api/v1/envelopes/7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b/signatarios/5e0f7a3b-2c4d-4e6f-9a0b-1c2d3e4f5a6b" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE"
Exemplo Resposta204
(sem corpo)

Ações

Mudanças de situação do envelope. Todas passam pelas mesmas conferências do painel e ficam na trilha de auditoria.

Enviar envelope

POST/api/v1/envelopes/{id}/enviar
Escopo: envelopes:enviarExige Idempotency-Key

As mesmas conferências do painel (e-mail ou telefone de quem assina, campo de assinatura, CPF…; falhou → 422 regra_violada com a explicação) e os convites. Com {"devolver_links": true} e uma chave que também tem envelopes:gerir, a resposta traz links de quem está na vez, para abrir a assinatura no seu sistema (fica registrado na trilha).

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.
Idempotency-Keyobrigatóriostring1 a 200 caracteres. A mesma chave com o mesmo corpo em 24 h devolve a mesma resposta.
Content-Typestringapplication/json

Parâmetros

Parâmetros
ParâmetroTipoDescrição
idobrigatóriocaminhostring (uuid)

UUID do envelope (ou do webhook, nas rotas /webhooks).

Corpo da requisição

Corpo da requisição
CampoTipoDescrição
devolver_linksboolean

Devolve os links de assinatura (exige também envelopes:gerir).

Respostas

Respostas
CódigoTipoDescrição
200Envelope + objeto

Enviado. Com devolver_links, inclui links.

202Envelope

Guardado para revisão (chave com "Revisar no CardSign antes de enviar"). O documento continua em rascunho, com revisao_pendente true e url_painel; uma pessoa revisa e envia no painel, e o envio chega pelo webhook envelope.enviado.

400Erro

sem_idempotency_key (POST sem o cabeçalho) ou json_invalido (corpo ilegível).

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

404Erro

documento_nao_encontrado — não existe, foi apagado ou é de uma empresa fora do alcance da chave.

409Erro

estado_invalido (a situação do envelope não permite) ou idempotencia_em_andamento (a mesma Idempotency-Key ainda está sendo processada; veja retry-after).

415Erro

tipo_nao_suportado — use application/json ou multipart/form-data.

422Erro

regra_violada (conferência do painel não passou — a mensagem explica), validacao ou idempotencia_conflito.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X POST "https://cardsign.gopixeltecnologiaa.com.br/api/v1/envelopes/7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b/enviar" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE" \
  -H "Idempotency-Key: minha-integracao-enviarEnvelope-123" \
  -H "Content-Type: application/json" \
  -d '{
  "devolver_links": true
}'
Exemplo Resposta200
{
  "id": "7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b",
  "titulo": "POP 014 — Higienização das mãos (ciência do colaborador)",
  "status": "andamento",
  "empresa_id": "3f6c1d2a-8b4e-4f1a-9c7d-2e5b8a1f4c90",
  "external_id": "dias:pop:4821",
  "external_ref": {
    "origem": "programa-dias",
    "pop": "014",
    "turma": "2026-10"
  },
  "origem": "api",
  "prazo": "2026-10-31T02:59:00+00:00",
  "mensagem": "Olá! Leia o POP de higienização das mãos e assine a ciência até sexta.",
  "criado_em": "2026-10-19T13:42:07.481233+00:00",
  "concluido_em": null,
  "motivo_cancelamento": null,
  "arquivos": [
    {
      "id": "2c8d5e1f-3a4b-4c6d-9e7f-8a9b0c1d2e3f",
      "nome": "POP-014-higienizacao-das-maos.pdf",
      "sha256": "3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b",
      "paginas": 3,
      "ordem": 1
    }
  ],
  "signatarios": [
    {
      "id": "4d9e6f2a-1b3c-4d5e-8f9a-0b1c2d3e4f5a",
      "nome": "Mariana Costa Ribeiro",
      "funcao": "assinar",
      "ordem": 1,
      "canal": "email",
      "nivel": "avancada",
      "status": "na_vez",
      "email_mascarado": "m***@clinicadias.com.br",
      "telefone_mascarado": null,
      "assinado_em": null,
      "motivo_recusa": null
    },
    {
      "id": "5e0f7a3b-2c4d-4e6f-9a0b-1c2d3e4f5a6b",
      "nome": "Rafael Almeida Pinto",
      "funcao": "testemunha",
      "ordem": 2,
      "canal": "whatsapp",
      "nivel": "avancada",
      "status": "aguardando",
      "email_mascarado": "r***@clinicadias.com.br",
      "telefone_mascarado": "+55 31 9****-5432",
      "assinado_em": null,
      "motivo_recusa": null
    }
  ],
  "pdfs_finais": [],
  "links": [
    {
      "signatario_id": "4d9e6f2a-1b3c-4d5e-8f9a-0b1c2d3e4f5a",
      "url": "https://cardsign.gopixeltecnologiaa.com.br/assinar/EXEMPLO-token-de-assinatura",
      "expira_em": "2026-10-31T02:59:00+00:00"
    }
  ]
}

Cancelar envelope

POST/api/v1/envelopes/{id}/cancelar
Escopo: envelopes:gerirExige Idempotency-Key

Exige motivo (5 a 500 caracteres), que vai para a trilha e para motivo_cancelamento.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.
Idempotency-Keyobrigatóriostring1 a 200 caracteres. A mesma chave com o mesmo corpo em 24 h devolve a mesma resposta.
Content-Typestringapplication/json

Parâmetros

Parâmetros
ParâmetroTipoDescrição
idobrigatóriocaminhostring (uuid)

UUID do envelope (ou do webhook, nas rotas /webhooks).

Corpo da requisição

Corpo da requisição
CampoTipoDescrição
motivoobrigatóriostring

(5 a 500 caracteres)

Respostas

Respostas
CódigoTipoDescrição
200Envelope

Cancelado.

400Erro

sem_idempotency_key (POST sem o cabeçalho) ou json_invalido (corpo ilegível).

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

404Erro

documento_nao_encontrado — não existe, foi apagado ou é de uma empresa fora do alcance da chave.

409Erro

estado_invalido (a situação do envelope não permite) ou idempotencia_em_andamento (a mesma Idempotency-Key ainda está sendo processada; veja retry-after).

415Erro

tipo_nao_suportado — use application/json ou multipart/form-data.

422Erro

validacao (campos inválidos, veja detalhes) ou idempotencia_conflito.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X POST "https://cardsign.gopixeltecnologiaa.com.br/api/v1/envelopes/7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b/cancelar" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE" \
  -H "Idempotency-Key: minha-integracao-cancelarEnvelope-123" \
  -H "Content-Type: application/json" \
  -d '{
  "motivo": "POP substituído pela revisão 2; nova ciência será enviada."
}'
Exemplo Resposta200
{
  "id": "7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b",
  "titulo": "POP 014 — Higienização das mãos (ciência do colaborador)",
  "status": "cancelado",
  "empresa_id": "3f6c1d2a-8b4e-4f1a-9c7d-2e5b8a1f4c90",
  "external_id": "dias:pop:4821",
  "external_ref": {
    "origem": "programa-dias",
    "pop": "014",
    "turma": "2026-10"
  },
  "origem": "api",
  "prazo": "2026-10-31T02:59:00+00:00",
  "mensagem": null,
  "criado_em": "2026-10-19T13:42:07.481233+00:00",
  "concluido_em": null,
  "motivo_cancelamento": "POP substituído pela revisão 2; nova ciência será enviada.",
  "arquivos": [
    {
      "id": "2c8d5e1f-3a4b-4c6d-9e7f-8a9b0c1d2e3f",
      "nome": "POP-014-higienizacao-das-maos.pdf",
      "sha256": "3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b",
      "paginas": 3,
      "ordem": 1
    }
  ],
  "signatarios": [
    {
      "id": "4d9e6f2a-1b3c-4d5e-8f9a-0b1c2d3e4f5a",
      "nome": "Mariana Costa Ribeiro",
      "funcao": "assinar",
      "ordem": 1,
      "canal": "email",
      "nivel": "avancada",
      "status": "aguardando",
      "email_mascarado": "m***@clinicadias.com.br",
      "telefone_mascarado": null,
      "assinado_em": null,
      "motivo_recusa": null
    }
  ],
  "pdfs_finais": []
}

Pausar envelope

POST/api/v1/envelopes/{id}/pausar
Escopo: envelopes:gerirExige Idempotency-Key

Suspende as assinaturas de um envelope em andamento. Sem corpo.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.
Idempotency-Keyobrigatóriostring1 a 200 caracteres. A mesma chave com o mesmo corpo em 24 h devolve a mesma resposta.

Parâmetros

Parâmetros
ParâmetroTipoDescrição
idobrigatóriocaminhostring (uuid)

UUID do envelope (ou do webhook, nas rotas /webhooks).

Respostas

Respostas
CódigoTipoDescrição
200Envelope

Pausado.

400Erro

sem_idempotency_key (POST sem o cabeçalho) ou json_invalido (corpo ilegível).

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

404Erro

documento_nao_encontrado — não existe, foi apagado ou é de uma empresa fora do alcance da chave.

409Erro

estado_invalido (a situação do envelope não permite) ou idempotencia_em_andamento (a mesma Idempotency-Key ainda está sendo processada; veja retry-after).

422Erro

idempotencia_conflito — Idempotency-Key repetida com outro corpo (ou outra rota) em 24 h.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X POST "https://cardsign.gopixeltecnologiaa.com.br/api/v1/envelopes/7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b/pausar" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE" \
  -H "Idempotency-Key: minha-integracao-pausarEnvelope-123"
Exemplo Resposta200
{
  "id": "7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b",
  "titulo": "POP 014 — Higienização das mãos (ciência do colaborador)",
  "status": "pausado",
  "empresa_id": "3f6c1d2a-8b4e-4f1a-9c7d-2e5b8a1f4c90",
  "external_id": "dias:pop:4821",
  "external_ref": {
    "origem": "programa-dias",
    "pop": "014",
    "turma": "2026-10"
  },
  "origem": "api",
  "prazo": "2026-10-31T02:59:00+00:00",
  "mensagem": null,
  "criado_em": "2026-10-19T13:42:07.481233+00:00",
  "concluido_em": null,
  "motivo_cancelamento": null,
  "arquivos": [
    {
      "id": "2c8d5e1f-3a4b-4c6d-9e7f-8a9b0c1d2e3f",
      "nome": "POP-014-higienizacao-das-maos.pdf",
      "sha256": "3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b",
      "paginas": 3,
      "ordem": 1
    }
  ],
  "signatarios": [
    {
      "id": "4d9e6f2a-1b3c-4d5e-8f9a-0b1c2d3e4f5a",
      "nome": "Mariana Costa Ribeiro",
      "funcao": "assinar",
      "ordem": 1,
      "canal": "email",
      "nivel": "avancada",
      "status": "na_vez",
      "email_mascarado": "m***@clinicadias.com.br",
      "telefone_mascarado": null,
      "assinado_em": null,
      "motivo_recusa": null
    }
  ],
  "pdfs_finais": []
}

Retomar envelope

POST/api/v1/envelopes/{id}/retomar
Escopo: envelopes:gerirExige Idempotency-Key

Volta um envelope pausado para andamento. Sem corpo.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.
Idempotency-Keyobrigatóriostring1 a 200 caracteres. A mesma chave com o mesmo corpo em 24 h devolve a mesma resposta.

Parâmetros

Parâmetros
ParâmetroTipoDescrição
idobrigatóriocaminhostring (uuid)

UUID do envelope (ou do webhook, nas rotas /webhooks).

Respostas

Respostas
CódigoTipoDescrição
200Envelope

Retomado.

400Erro

sem_idempotency_key (POST sem o cabeçalho) ou json_invalido (corpo ilegível).

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

404Erro

documento_nao_encontrado — não existe, foi apagado ou é de uma empresa fora do alcance da chave.

409Erro

estado_invalido (a situação do envelope não permite) ou idempotencia_em_andamento (a mesma Idempotency-Key ainda está sendo processada; veja retry-after).

422Erro

idempotencia_conflito — Idempotency-Key repetida com outro corpo (ou outra rota) em 24 h.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X POST "https://cardsign.gopixeltecnologiaa.com.br/api/v1/envelopes/7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b/retomar" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE" \
  -H "Idempotency-Key: minha-integracao-retomarEnvelope-123"
Exemplo Resposta200
{
  "id": "7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b",
  "titulo": "POP 014 — Higienização das mãos (ciência do colaborador)",
  "status": "andamento",
  "empresa_id": "3f6c1d2a-8b4e-4f1a-9c7d-2e5b8a1f4c90",
  "external_id": "dias:pop:4821",
  "external_ref": {
    "origem": "programa-dias",
    "pop": "014",
    "turma": "2026-10"
  },
  "origem": "api",
  "prazo": "2026-10-31T02:59:00+00:00",
  "mensagem": "Olá! Leia o POP de higienização das mãos e assine a ciência até sexta.",
  "criado_em": "2026-10-19T13:42:07.481233+00:00",
  "concluido_em": null,
  "motivo_cancelamento": null,
  "arquivos": [
    {
      "id": "2c8d5e1f-3a4b-4c6d-9e7f-8a9b0c1d2e3f",
      "nome": "POP-014-higienizacao-das-maos.pdf",
      "sha256": "3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b",
      "paginas": 3,
      "ordem": 1
    }
  ],
  "signatarios": [
    {
      "id": "4d9e6f2a-1b3c-4d5e-8f9a-0b1c2d3e4f5a",
      "nome": "Mariana Costa Ribeiro",
      "funcao": "assinar",
      "ordem": 1,
      "canal": "email",
      "nivel": "avancada",
      "status": "na_vez",
      "email_mascarado": "m***@clinicadias.com.br",
      "telefone_mascarado": null,
      "assinado_em": null,
      "motivo_recusa": null
    },
    {
      "id": "5e0f7a3b-2c4d-4e6f-9a0b-1c2d3e4f5a6b",
      "nome": "Rafael Almeida Pinto",
      "funcao": "testemunha",
      "ordem": 2,
      "canal": "whatsapp",
      "nivel": "avancada",
      "status": "aguardando",
      "email_mascarado": "r***@clinicadias.com.br",
      "telefone_mascarado": "+55 31 9****-5432",
      "assinado_em": null,
      "motivo_recusa": null
    }
  ],
  "pdfs_finais": [],
  "links": [
    {
      "signatario_id": "4d9e6f2a-1b3c-4d5e-8f9a-0b1c2d3e4f5a",
      "url": "https://cardsign.gopixeltecnologiaa.com.br/assinar/EXEMPLO-token-de-assinatura",
      "expira_em": "2026-10-31T02:59:00+00:00"
    }
  ]
}

Lembrar quem assina

POST/api/v1/envelopes/{id}/lembrete
Escopo: envelopes:gerirExige Idempotency-Key

Gera link novo e reenvia o convite a quem está na vez, ou só à pessoa indicada em signatario_id. Só em andamento.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.
Idempotency-Keyobrigatóriostring1 a 200 caracteres. A mesma chave com o mesmo corpo em 24 h devolve a mesma resposta.
Content-Typestringapplication/json

Parâmetros

Parâmetros
ParâmetroTipoDescrição
idobrigatóriocaminhostring (uuid)

UUID do envelope (ou do webhook, nas rotas /webhooks).

Corpo da requisição

Corpo da requisição
CampoTipoDescrição
signatario_idstring (uuid)

Só esta pessoa (sem ele

Respostas

Respostas
CódigoTipoDescrição
200objeto

Quantos convites saíram.

400Erro

sem_idempotency_key (POST sem o cabeçalho) ou json_invalido (corpo ilegível).

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

404Erro

signatario_nao_encontrado (pessoa que não é deste envelope) ou documento_nao_encontrado.

409Erro

estado_invalido (a situação do envelope não permite) ou idempotencia_em_andamento (a mesma Idempotency-Key ainda está sendo processada; veja retry-after).

415Erro

tipo_nao_suportado — use application/json ou multipart/form-data.

422Erro

validacao (campos inválidos, veja detalhes) ou idempotencia_conflito.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X POST "https://cardsign.gopixeltecnologiaa.com.br/api/v1/envelopes/7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b/lembrete" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE" \
  -H "Idempotency-Key: minha-integracao-lembrete-123" \
  -H "Content-Type: application/json" \
  -d '{
  "signatario_id": "4d9e6f2a-1b3c-4d5e-8f9a-0b1c2d3e4f5a"
}'
Exemplo Resposta200
{
  "enviados": 1,
  "nao_enviados": []
}

Consultas, trilha, PDF e provas

Leitura: listas paginadas, detalhe, trilha de auditoria encadeada, PDF final selado e pacote de provas. Os links de download valem 5 minutos.

Listar envelopes

GET/api/v1/envelopes
Escopo: documentos:ler

Envelopes das empresas liberadas, mais recentes primeiro (criado_em desc, id desc). Igual a GET /documentos, com external_id em cada item e o filtro external_id. Rascunhos só aparecem com status=rascunho.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.

Parâmetros

Parâmetros
ParâmetroTipoDescrição
limitequeryinteger

Itens por página, de 1 a 200. (de 1 a 200; padrão 50)

depoisquerystring

Cursor — o valor de proximo da resposta anterior (<criado_em>,<id>). Ignora pagina.

paginaqueryinteger

Número da página (compatibilidade). Só até pagina × limite ≤ 10000; além disso use depois. (padrão 1)

contarquery1

1 para trazer total também fora da primeira página.

statusqueryrascunho | andamento | pausado | concluido | cancelado | expirado | recusado

Filtra pela situação.

empresaquerystring (uuid)

UUID de uma empresa liberada.

desdequerystring

Criados a partir de (AAAA-MM-DD = 00:00 de Brasília, ou ISO 8601).

atequerystring

Criados antes de (AAAA-MM-DD = 00:00 de Brasília, ou ISO 8601).

external_idquerystring

O external_id exato informado na criação (1 a 200 caracteres). (1 a 200 caracteres)

Respostas

Respostas
CódigoTipoDescrição
200ListaEnvelopes

Uma página de envelopes.

400Erro

Filtro ou paginação inválidos: parametro_invalido, cursor_invalido, pagina_alta_demais.

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X GET "https://cardsign.gopixeltecnologiaa.com.br/api/v1/envelopes?desde=2026-10-01" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE"
Exemplo Resposta200
{
  "pagina": null,
  "limite": 50,
  "total": null,
  "proximo": "2026-10-19T13:42:07.481233+00:00,7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b",
  "proxima_url": "https://cardsign.gopixeltecnologiaa.com.br/api/v1/envelopes?limite=50&depois=2026-10-19T13%3A42%3A07.481233%2B00%3A00%2C7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b",
  "envelopes": [
    {
      "id": "7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b",
      "titulo": "POP 014 — Higienização das mãos (ciência do colaborador)",
      "status": "andamento",
      "empresa_id": "3f6c1d2a-8b4e-4f1a-9c7d-2e5b8a1f4c90",
      "criado_em": "2026-10-19T13:42:07.481233+00:00",
      "concluido_em": null,
      "prazo": "2026-10-31T02:59:00+00:00",
      "external_id": "dias:pop:4821",
      "origem": "api"
    }
  ]
}

Trilha de auditoria do envelope

GET/api/v1/envelopes/{id}/trilha
Escopo: trilha:ler

Igual a GET /documentos/{id}/trilha.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.

Parâmetros

Parâmetros
ParâmetroTipoDescrição
idobrigatóriocaminhostring (uuid)

UUID do envelope (ou do webhook, nas rotas /webhooks).

Respostas

Respostas
CódigoTipoDescrição
200Trilha

A trilha inteira, conferida.

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

404Erro

documento_nao_encontrado — não existe, foi apagado ou é de uma empresa fora do alcance da chave.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

trilha_indisponivel — não deu para ler a trilha inteira; indisponivel ao conferir o acesso.

Exemplo Request
curl -X GET "https://cardsign.gopixeltecnologiaa.com.br/api/v1/envelopes/7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b/trilha" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE"
Exemplo Resposta200
{
  "documento": "7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b",
  "integra": true,
  "total": 3,
  "eventos": [
    {
      "id": 18231,
      "tipo": "enviado",
      "criado_em": "2026-10-19T13:42:31.002914+00:00",
      "hash_anterior": null,
      "hash": "a1f0c3d2e5b4a7968f0e1d2c3b4a59687f6e5d4c3b2a19087f6e5d4c3b2a1908",
      "dados": {}
    },
    {
      "id": 18240,
      "tipo": "assinou",
      "criado_em": "2026-10-20T10:58:12.903311+00:00",
      "hash_anterior": "a1f0c3d2e5b4a7968f0e1d2c3b4a59687f6e5d4c3b2a19087f6e5d4c3b2a1908",
      "hash": "b2e1d4c3f6a5b8079e1f2d3c4b5a6978e7f6d5c4b3a2918e7f6d5c4b3a291807",
      "dados": {
        "nome": "Mariana Costa Ribeiro",
        "funcao": "assinar",
        "nivel": "avancada",
        "metodo": "email"
      }
    },
    {
      "id": 18247,
      "tipo": "concluido",
      "criado_em": "2026-10-20T11:05:31.204118+00:00",
      "hash_anterior": "b2e1d4c3f6a5b8079e1f2d3c4b5a6978e7f6d5c4b3a2918e7f6d5c4b3a291807",
      "hash": "c3d2e5f4a7b6c9180f2a3e4d5c6b7a89f8e7d6c5b4a3920f8e7d6c5b4a392018",
      "dados": {
        "sha256": "8e3b1f0c9d2a47b6e5f4c3d2b1a09f8e7d6c5b4a39281706f5e4d3c2b1a09f8e"
      }
    }
  ]
}

PDF final do envelope

GET/api/v1/envelopes/{id}/pdf
Escopo: documentos:baixar

Igual a GET /documentos/{id}/pdf.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.

Parâmetros

Parâmetros
ParâmetroTipoDescrição
idobrigatóriocaminhostring (uuid)

UUID do envelope (ou do webhook, nas rotas /webhooks).

Respostas

Respostas
CódigoTipoDescrição
200PdfFinal

Links do PDF final selado.

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

404Erro

documento_nao_encontrado — não existe, foi apagado ou é de uma empresa fora do alcance da chave.

409Erro

nao_concluido — o PDF final e o pacote de provas só existem depois que todos assinam.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X GET "https://cardsign.gopixeltecnologiaa.com.br/api/v1/envelopes/7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b/pdf" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE"
Exemplo Resposta200
{
  "documento": "7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b",
  "arquivos": [
    {
      "nome": "POP-014-higienizacao-das-maos-assinado.pdf",
      "sha256": "8e3b1f0c9d2a47b6e5f4c3d2b1a09f8e7d6c5b4a39281706f5e4d3c2b1a09f8e",
      "url": "https://wkkkfrcjotsbyfggcwro.supabase.co/storage/v1/object/sign/documentos/final.pdf?token=exemplo",
      "expira_em_segundos": 300
    }
  ]
}

Pacote de provas

GET/api/v1/envelopes/{id}/provas
Escopo: provas:baixar

ZIP com o PDF final, os originais, o carimbo do tempo, as assinaturas digitais e a trilha. Só para concluídos; link de 5 minutos.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.

Parâmetros

Parâmetros
ParâmetroTipoDescrição
idobrigatóriocaminhostring (uuid)

UUID do envelope (ou do webhook, nas rotas /webhooks).

Respostas

Respostas
CódigoTipoDescrição
200objeto

Link do pacote.

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

404Erro

documento_nao_encontrado — não existe, foi apagado ou é de uma empresa fora do alcance da chave.

409Erro

nao_concluido — o PDF final e o pacote de provas só existem depois que todos assinam.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X GET "https://cardsign.gopixeltecnologiaa.com.br/api/v1/envelopes/7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b/provas" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE"
Exemplo Resposta200
{
  "documento": "7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b",
  "arquivo": {
    "nome": "provas-7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b.zip",
    "sha256": "c0ffee12ab34cd56ef7890ab12cd34ef567890ab12cd34ef567890ab12cd34ef",
    "url": "https://wkkkfrcjotsbyfggcwro.supabase.co/storage/v1/object/sign/documentos/provas.zip?token=exemplo",
    "expira_em_segundos": 300
  }
}

Listar documentos

GET/api/v1/documentos
Escopo: documentos:ler

A lista da API de leitura (formato de antes, sem external_id). Sem rascunhos.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.

Parâmetros

Parâmetros
ParâmetroTipoDescrição
limitequeryinteger

Itens por página, de 1 a 200. (de 1 a 200; padrão 50)

depoisquerystring

Cursor — o valor de proximo da resposta anterior (<criado_em>,<id>). Ignora pagina.

paginaqueryinteger

Número da página (compatibilidade). Só até pagina × limite ≤ 10000; além disso use depois. (padrão 1)

contarquery1

1 para trazer total também fora da primeira página.

statusqueryrascunho | andamento | pausado | concluido | cancelado | expirado | recusado

Filtra pela situação.

empresaquerystring (uuid)

UUID de uma empresa liberada.

desdequerystring

Criados a partir de (AAAA-MM-DD = 00:00 de Brasília, ou ISO 8601).

atequerystring

Criados antes de (AAAA-MM-DD = 00:00 de Brasília, ou ISO 8601).

Respostas

Respostas
CódigoTipoDescrição
200ListaDocumentos

Uma página de documentos.

400Erro

Filtro ou paginação inválidos: parametro_invalido, cursor_invalido, pagina_alta_demais.

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X GET "https://cardsign.gopixeltecnologiaa.com.br/api/v1/documentos?desde=2026-10-01" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE"
Exemplo Resposta200
{
  "pagina": 1,
  "limite": 50,
  "total": 1,
  "proximo": null,
  "proxima_url": null,
  "documentos": [
    {
      "id": "7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b",
      "titulo": "POP 014 — Higienização das mãos (ciência do colaborador)",
      "status": "concluido",
      "empresa_id": "3f6c1d2a-8b4e-4f1a-9c7d-2e5b8a1f4c90",
      "criado_em": "2026-10-19T13:42:07.481233+00:00",
      "concluido_em": "2026-10-20T11:05:31.204118+00:00",
      "prazo": "2026-10-31T02:59:00+00:00"
    }
  ]
}

Consultar documento (formato de leitura)

GET/api/v1/documentos/{id}
Escopo: documentos:ler

O detalhe da API de leitura, com a empresa, as pessoas e os PDFs finais. Para o objeto Envelope completo, use GET /envelopes/{id}.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.

Parâmetros

Parâmetros
ParâmetroTipoDescrição
idobrigatóriocaminhostring (uuid)

UUID do envelope (ou do webhook, nas rotas /webhooks).

Respostas

Respostas
CódigoTipoDescrição
200DocumentoDetalhe

O documento.

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

404Erro

documento_nao_encontrado — não existe, foi apagado ou é de uma empresa fora do alcance da chave.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X GET "https://cardsign.gopixeltecnologiaa.com.br/api/v1/documentos/7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE"
Exemplo Resposta200
{
  "id": "7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b",
  "titulo": "POP 014 — Higienização das mãos (ciência do colaborador)",
  "status": "concluido",
  "empresa_id": "3f6c1d2a-8b4e-4f1a-9c7d-2e5b8a1f4c90",
  "criado_em": "2026-10-19T13:42:07.481233+00:00",
  "concluido_em": "2026-10-20T11:05:31.204118+00:00",
  "prazo": "2026-10-31T02:59:00+00:00",
  "tipo_id": null,
  "valor_mensal": null,
  "empresa": {
    "nome": "Clínica Dias Saúde Ocupacional",
    "cnpj": "12345678000190"
  },
  "signatarios": [
    {
      "nome": "Mariana Costa Ribeiro",
      "funcao": "assinar",
      "status": "assinou",
      "nivel": "avancada",
      "ordem": 1,
      "assinado_em": "2026-10-20T10:58:12.903311+00:00"
    },
    {
      "nome": "Rafael Almeida Pinto",
      "funcao": "testemunha",
      "status": "assinou",
      "nivel": "avancada",
      "ordem": 2,
      "assinado_em": "2026-10-20T11:05:29.118024+00:00"
    }
  ],
  "pdfs_finais": [
    {
      "nome": "POP-014-higienizacao-das-maos-assinado.pdf",
      "sha256": "8e3b1f0c9d2a47b6e5f4c3d2b1a09f8e7d6c5b4a39281706f5e4d3c2b1a09f8e",
      "criado_em": "2026-10-20T11:05:40.552910+00:00"
    }
  ],
  "verificar": "https://cardsign.gopixeltecnologiaa.com.br/verificar?h=8e3b1f0c9d2a47b6e5f4c3d2b1a09f8e7d6c5b4a39281706f5e4d3c2b1a09f8e"
}

Trilha de auditoria

GET/api/v1/documentos/{id}/trilha
Escopo: trilha:ler

A trilha inteira (lida em páginas e conferida com a cadeia de hashes): tipo, data, hash e hash_anterior de cada evento, e integra (true/false). Sem IP, aparelho, CPF ou destino de código.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.

Parâmetros

Parâmetros
ParâmetroTipoDescrição
idobrigatóriocaminhostring (uuid)

UUID do envelope (ou do webhook, nas rotas /webhooks).

Respostas

Respostas
CódigoTipoDescrição
200Trilha

A trilha.

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

404Erro

documento_nao_encontrado — não existe, foi apagado ou é de uma empresa fora do alcance da chave.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

trilha_indisponivel — não deu para ler a trilha inteira; indisponivel ao conferir o acesso.

Exemplo Request
curl -X GET "https://cardsign.gopixeltecnologiaa.com.br/api/v1/documentos/7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b/trilha" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE"
Exemplo Resposta200
{
  "documento": "7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b",
  "integra": true,
  "total": 3,
  "eventos": [
    {
      "id": 18231,
      "tipo": "enviado",
      "criado_em": "2026-10-19T13:42:31.002914+00:00",
      "hash_anterior": null,
      "hash": "a1f0c3d2e5b4a7968f0e1d2c3b4a59687f6e5d4c3b2a19087f6e5d4c3b2a1908",
      "dados": {}
    },
    {
      "id": 18240,
      "tipo": "assinou",
      "criado_em": "2026-10-20T10:58:12.903311+00:00",
      "hash_anterior": "a1f0c3d2e5b4a7968f0e1d2c3b4a59687f6e5d4c3b2a19087f6e5d4c3b2a1908",
      "hash": "b2e1d4c3f6a5b8079e1f2d3c4b5a6978e7f6d5c4b3a2918e7f6d5c4b3a291807",
      "dados": {
        "nome": "Mariana Costa Ribeiro",
        "funcao": "assinar",
        "nivel": "avancada",
        "metodo": "email"
      }
    },
    {
      "id": 18247,
      "tipo": "concluido",
      "criado_em": "2026-10-20T11:05:31.204118+00:00",
      "hash_anterior": "b2e1d4c3f6a5b8079e1f2d3c4b5a6978e7f6d5c4b3a2918e7f6d5c4b3a291807",
      "hash": "c3d2e5f4a7b6c9180f2a3e4d5c6b7a89f8e7d6c5b4a3920f8e7d6c5b4a392018",
      "dados": {
        "sha256": "8e3b1f0c9d2a47b6e5f4c3d2b1a09f8e7d6c5b4a39281706f5e4d3c2b1a09f8e"
      }
    }
  ]
}

PDF final selado

GET/api/v1/documentos/{id}/pdf
Escopo: documentos:baixar

Links de 5 minutos para o PDF final selado, com o SHA-256. Só depois que todos assinam (409 nao_concluido).

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.

Parâmetros

Parâmetros
ParâmetroTipoDescrição
idobrigatóriocaminhostring (uuid)

UUID do envelope (ou do webhook, nas rotas /webhooks).

Respostas

Respostas
CódigoTipoDescrição
200PdfFinal

Links.

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

404Erro

documento_nao_encontrado — não existe, foi apagado ou é de uma empresa fora do alcance da chave.

409Erro

nao_concluido — o PDF final e o pacote de provas só existem depois que todos assinam.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X GET "https://cardsign.gopixeltecnologiaa.com.br/api/v1/documentos/7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b/pdf" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE"
Exemplo Resposta200
{
  "documento": "7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b",
  "arquivos": [
    {
      "nome": "POP-014-higienizacao-das-maos-assinado.pdf",
      "sha256": "8e3b1f0c9d2a47b6e5f4c3d2b1a09f8e7d6c5b4a39281706f5e4d3c2b1a09f8e",
      "url": "https://wkkkfrcjotsbyfggcwro.supabase.co/storage/v1/object/sign/documentos/final.pdf?token=exemplo",
      "expira_em_segundos": 300
    }
  ]
}

Webhooks

Destinos que recebem um POST a cada evento. No máximo 20 por grupo. O segredo whsec_… volta só na criação (e quando é trocado): guarde-o para conferir o cabeçalho CardSign-Signature.

Gerir webhooks exige o escopo webhooks:gerir e que quem criou a chave tenha org.api com alcance de grupo. Cada destino tem um responsável: ele só recebe eventos das empresas em que o responsável vê os documentos. Mudar url ou empresas faz do dono da chave o novo responsável e troca o segredo (que volta na resposta); as entregas pendentes que o novo responsável não poderia receber são descartadas.

A cada evento o CardSign faz um POST JSON para a URL cadastrada. Sucesso é qualquer 2xx em até 10 s. Falhou? Novo envio em 1 min, 5 min, 30 min, 2 h, 12 h e 24 h; depois a entrega fica falhou (dá para reenviar). 50 falhas seguidas pausam o destino.

No receptor: confira a assinatura em tempo constante, recuse se |agora − t| > 300 s, ignore CardSign-Event-Id já processado e só então busque GET /envelopes/{id}. envelope.concluido só sai depois que o PDF final selado existe.

Cabeçalhos enviados

Cabeçalhos enviados
CabeçalhoTipoDescrição
CardSign-Event-IdstringUUID do evento. Igual em todas as tentativas e reenvios — use para ignorar repetições.
CardSign-EventstringTipo do evento.
CardSign-Signaturestringt=<unix>,v1=<hex HMAC-SHA256(segredo, t + "." + corpo_bruto)>. A chave do HMAC é o segredo inteiro (whsec_…) em UTF-8.
User-AgentstringSempre CardSign-Webhooks/1.

Corpo do evento

Corpo do evento
CampoTipoDescrição
idstring (uuid)Igual ao cabeçalho CardSign-Event-Id.
tipostringUm de TipoWebhook, ou ping.
criado_emstring (date-time)—
grupo_idstring (uuid)—
envelopeobjetoAusente no ping.
envelope.idstring (uuid)—
envelope.external_idstring | null—
envelope.statusrascunho | andamento | pausado | concluido | cancelado | expirado | recusado—
envelope.empresa_idstring (uuid)—
signatarioobjetoSó nos eventos signatario.* e convite.falhou.
signatario.idstring (uuid)—
signatario.nomestring—
signatario.funcaostring—
signatario.statusstring—

Eventos

Eventos
EventoQuandoDescrição
envelope.enviadoDocumento enviadoO envelope saiu do rascunho e os convites foram disparados.
signatario.visualizouPessoa abriu o linkUma pessoa abriu o link de assinatura. Traz signatario.
signatario.assinouPessoa assinouUma pessoa assinou. Traz signatario.
signatario.aprovouPessoa aprovouUma pessoa com a função aprovar aprovou. Traz signatario.
signatario.testemunhouTestemunha assinouUma testemunha assinou. Traz signatario.
signatario.recusouPessoa recusouUma pessoa recusou; o motivo está em GET /envelopes/{id} (signatarios[].motivo_recusa). Traz signatario.
convite.falhouConvite não saiuO convite (e-mail, WhatsApp ou SMS) de uma pessoa falhou de vez. Traz signatario.
envelope.concluidoDocumento concluídoTodos assinaram. Só sai depois que o PDF final selado existe — pode baixar com GET /envelopes/{id}/pdf.
envelope.canceladoDocumento canceladoO envelope foi cancelado (pelo painel ou pela API).
envelope.expiradoPrazo vencidoO prazo passou sem todas as assinaturas.
envelope.pausadoDocumento pausadoO envelope foi pausado.
envelope.retomadoDocumento retomadoO envelope pausado voltou para andamento.
envelope.exportarMarcado para a sua integraçãoAlguém marcou no painel "Enviar a" a sua integração. Vai só para o destino da chave marcada. Busque GET /envelopes/{id}: com status concluido, baixe o PDF (/pdf) e as provas e guarde na pasta que você ligou a pasta.id; antes disso, espere o envelope.concluido (confira exportar.marcado).
pingTeste (ping)Enviado por POST /webhooks/{id}/testar. Não traz envelope.
POST no seu sistema · signatario.assinou
{
  "id": "7b6c5d4e-3f2a-4b1c-8d9e-0f1a2b3c4d5e",
  "tipo": "signatario.assinou",
  "criado_em": "2026-10-20T10:58:12.903Z",
  "grupo_id": "9a2e7c41-5d3b-4e8f-b1a6-7c0d2f9e8b13",
  "envelope": {
    "id": "7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b",
    "external_id": "dias:pop:4821",
    "status": "andamento",
    "empresa_id": "3f6c1d2a-8b4e-4f1a-9c7d-2e5b8a1f4c90"
  },
  "signatario": {
    "id": "4d9e6f2a-1b3c-4d5e-8f9a-0b1c2d3e4f5a",
    "nome": "Mariana Costa Ribeiro",
    "funcao": "assinar",
    "status": "assinou"
  }
}
Conferir a assinatura · Node
// Node (Express): confira a assinatura com o corpo BRUTO, antes de interpretar o JSON
import express from "express";
import { createHmac, timingSafeEqual } from "node:crypto";

const app = express();
const vistos = new Set(); // em produção: tabela com CardSign-Event-Id único

app.post("/api/webhooks/cardsign", express.raw({ type: "application/json" }), (req, res) => {
  const corpo = req.body.toString("utf8");
  const p = Object.fromEntries(
    String(req.get("CardSign-Signature")).split(",").map((x) => x.trim().split("=")),
  );
  const agora = Math.floor(Date.now() / 1000);
  if (!p.t || Math.abs(agora - Number(p.t)) > 300) return res.sendStatus(401);
  const esperado = createHmac("sha256", process.env.CARDSIGN_WEBHOOK_SECRET)
    .update(`${p.t}.${corpo}`)
    .digest();
  const recebido = Buffer.from(p.v1 ?? "", "hex");
  if (recebido.length !== esperado.length || !timingSafeEqual(recebido, esperado))
    return res.sendStatus(401);
  const id = req.get("CardSign-Event-Id");
  if (vistos.has(id)) return res.sendStatus(200); // repetição: já processado
  vistos.add(id);
  const evento = JSON.parse(corpo);
  // responda rápido (até 10 s) e processe depois: busque GET /envelopes/{id}
  res.sendStatus(200);
});
Conferir a assinatura · Python
# Python (Flask)
import hmac, hashlib, os, time
from flask import Flask, request, abort

app = Flask(__name__)
SEGREDO = os.environ["CARDSIGN_WEBHOOK_SECRET"].encode()

@app.post("/api/webhooks/cardsign")
def cardsign():
    corpo = request.get_data()  # bytes brutos
    p = dict(x.strip().split("=", 1) for x in request.headers["CardSign-Signature"].split(","))
    if abs(time.time() - int(p["t"])) > 300:
        abort(401)
    esperado = hmac.new(SEGREDO, p["t"].encode() + b"." + corpo, hashlib.sha256).hexdigest()
    if not hmac.compare_digest(esperado, p.get("v1", "")):
        abort(401)
    # ignore CardSign-Event-Id repetido e busque GET /envelopes/{id}
    return "", 200

Listar webhooks

GET/api/v1/webhooks
Escopo: webhooks:gerir

Os destinos do grupo da chave.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.

Respostas

Respostas
CódigoTipoDescrição
200objeto

Destinos.

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X GET "https://cardsign.gopixeltecnologiaa.com.br/api/v1/webhooks" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE"
Exemplo Resposta200
{
  "webhooks": [
    {
      "id": "8c3f0a6b-4d2e-4f7a-b9c1-6d5e4f3a2b1c",
      "url": "https://treinamento.gopixeltecnologia.com/api/webhooks/cardsign",
      "eventos": [
        "envelope.concluido",
        "envelope.cancelado",
        "signatario.recusou"
      ],
      "empresas": [
        "3f6c1d2a-8b4e-4f1a-9c7d-2e5b8a1f4c90"
      ],
      "descricao": "Programa DIAS — treinamentos",
      "ativo": true,
      "falhas_seguidas": 0,
      "pausado_em": null,
      "pausado_motivo": null,
      "segredo_fim": "x9Qk",
      "criado_em": "2026-10-20T12:00:03.118204+00:00"
    }
  ]
}

Criar webhook

POST/api/v1/webhooks
Escopo: webhooks:gerirExige Idempotency-Key

Cadastra um destino https:// público. O segredo (whsec_…) volta só nesta resposta.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.
Idempotency-Keyobrigatóriostring1 a 200 caracteres. A mesma chave com o mesmo corpo em 24 h devolve a mesma resposta.
Content-Typestringapplication/json

Corpo da requisição

Corpo da requisição
CampoTipoDescrição
urlobrigatóriostring (uri)

https:// pública (IP conferido na conexão). (até 500 caracteres)

eventosobrigatórioarray de envelope.enviado | signatario.visualizou | signatario.assinou | signatario.aprovou | signatario.testemunhou | signatario.recusou | convite.falhou | envelope.concluido | envelope.cancelado | envelope.expirado | envelope.pausado | envelope.retomado | envelope.exportar

(até 12 itens)

empresasarray de string (uuid)

(até 200 itens)

descricaostring | null

(até 120 caracteres)

Respostas

Respostas
CódigoTipoDescrição
201WebhookCriado

Criado (com o segredo).

400Erro

sem_idempotency_key (POST sem o cabeçalho) ou json_invalido (corpo ilegível).

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

409Erro

idempotencia_em_andamento — a mesma Idempotency-Key ainda está sendo processada.

415Erro

tipo_nao_suportado — use application/json ou multipart/form-data.

422Erro

validacao (inclui o teto de 20 destinos por grupo), url_invalida (não é https pública) ou idempotencia_conflito.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X POST "https://cardsign.gopixeltecnologiaa.com.br/api/v1/webhooks" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE" \
  -H "Idempotency-Key: minha-integracao-criarWebhook-123" \
  -H "Content-Type: application/json" \
  -d '{
  "url": "https://treinamento.gopixeltecnologia.com/api/webhooks/cardsign",
  "eventos": [
    "envelope.enviado",
    "signatario.assinou",
    "signatario.recusou",
    "convite.falhou",
    "envelope.concluido",
    "envelope.cancelado",
    "envelope.expirado"
  ],
  "empresas": [
    "3f6c1d2a-8b4e-4f1a-9c7d-2e5b8a1f4c90"
  ],
  "descricao": "Programa DIAS — treinamentos"
}'
Exemplo Resposta201
{
  "id": "8c3f0a6b-4d2e-4f7a-b9c1-6d5e4f3a2b1c",
  "url": "https://treinamento.gopixeltecnologia.com/api/webhooks/cardsign",
  "eventos": [
    "envelope.enviado",
    "signatario.assinou",
    "signatario.recusou",
    "convite.falhou",
    "envelope.concluido",
    "envelope.cancelado",
    "envelope.expirado"
  ],
  "empresas": [
    "3f6c1d2a-8b4e-4f1a-9c7d-2e5b8a1f4c90"
  ],
  "descricao": "Programa DIAS — treinamentos",
  "ativo": true,
  "falhas_seguidas": 0,
  "pausado_em": null,
  "pausado_motivo": null,
  "segredo_fim": "x9Qk",
  "criado_em": "2026-10-20T12:00:03.118204+00:00",
  "segredo": "whsec_EXEMPLO-nao-use-3kP9vT2mQ8wR5yL1zN7bX4cF6hJ0dA9sx9Qk"
}

Alterar webhook

PATCH/api/v1/webhooks/{id}
Escopo: webhooks:gerir

Altere url, eventos, empresas, descricao ou ativo (reativar zera as falhas seguidas). Se url ou empresas mudarem, o dono da chave passa a ser o responsável pelo destino e o segredo é trocado: a resposta traz o segredo novo só nessa vez (o antigo para de valer na hora).

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.
Content-Typestringapplication/json

Parâmetros

Parâmetros
ParâmetroTipoDescrição
idobrigatóriocaminhostring (uuid)

UUID do envelope (ou do webhook, nas rotas /webhooks).

Corpo da requisição

Corpo da requisição
CampoTipoDescrição
urlstring (uri)

(até 500 caracteres)

eventosarray de envelope.enviado | signatario.visualizou | signatario.assinou | signatario.aprovou | signatario.testemunhou | signatario.recusou | convite.falhou | envelope.concluido | envelope.cancelado | envelope.expirado | envelope.pausado | envelope.retomado | envelope.exportar

(até 12 itens)

empresasarray de string (uuid)

(até 200 itens)

descricaostring | null

(até 120 caracteres)

ativoboolean

—

Respostas

Respostas
CódigoTipoDescrição
200WebhookAlterado

O destino atualizado (com segredo quando url ou empresas mudaram).

400Erro

sem_idempotency_key (POST sem o cabeçalho) ou json_invalido (corpo ilegível).

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

404Erro

webhook_nao_encontrado — destino de outro grupo ou removido.

415Erro

tipo_nao_suportado — use application/json ou multipart/form-data.

422Erro

validacao (inclui o teto de 20 destinos por grupo), url_invalida (não é https pública) ou idempotencia_conflito.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X PATCH "https://cardsign.gopixeltecnologiaa.com.br/api/v1/webhooks/7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
  "ativo": true,
  "eventos": [
    "envelope.concluido",
    "envelope.cancelado",
    "signatario.recusou"
  ]
}'
Exemplo Resposta200
{
  "id": "8c3f0a6b-4d2e-4f7a-b9c1-6d5e4f3a2b1c",
  "url": "https://treinamento.gopixeltecnologia.com/api/webhooks/cardsign",
  "eventos": [
    "envelope.concluido",
    "envelope.cancelado",
    "signatario.recusou"
  ],
  "empresas": [
    "3f6c1d2a-8b4e-4f1a-9c7d-2e5b8a1f4c90"
  ],
  "descricao": "Programa DIAS — treinamentos",
  "ativo": true,
  "falhas_seguidas": 0,
  "pausado_em": null,
  "pausado_motivo": null,
  "segredo_fim": "x9Qk",
  "criado_em": "2026-10-20T12:00:03.118204+00:00"
}

Remover webhook

DELETE/api/v1/webhooks/{id}
Escopo: webhooks:gerir

Remove o destino e as entregas pendentes dele.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.

Parâmetros

Parâmetros
ParâmetroTipoDescrição
idobrigatóriocaminhostring (uuid)

UUID do envelope (ou do webhook, nas rotas /webhooks).

Respostas

Respostas
CódigoTipoDescrição
204—

Removido (sem corpo).

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

404Erro

webhook_nao_encontrado — destino de outro grupo ou removido.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X DELETE "https://cardsign.gopixeltecnologiaa.com.br/api/v1/webhooks/7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE"
Exemplo Resposta204
(sem corpo)

Trocar o segredo do webhook

POST/api/v1/webhooks/{id}/segredo
Escopo: webhooks:gerirExige Idempotency-Key

Gera um segredo novo (o antigo para de valer na hora) e o devolve só nesta resposta. O dono da chave passa a ser o responsável pelo destino. Sem corpo.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.
Idempotency-Keyobrigatóriostring1 a 200 caracteres. A mesma chave com o mesmo corpo em 24 h devolve a mesma resposta.

Parâmetros

Parâmetros
ParâmetroTipoDescrição
idobrigatóriocaminhostring (uuid)

UUID do envelope (ou do webhook, nas rotas /webhooks).

Respostas

Respostas
CódigoTipoDescrição
200WebhookCriado

O destino, com o segredo novo.

400Erro

sem_idempotency_key (POST sem o cabeçalho) ou json_invalido (corpo ilegível).

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

404Erro

webhook_nao_encontrado — destino de outro grupo ou removido.

409Erro

idempotencia_em_andamento — a mesma Idempotency-Key ainda está sendo processada.

422Erro

idempotencia_conflito — Idempotency-Key repetida com outro corpo (ou outra rota) em 24 h.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X POST "https://cardsign.gopixeltecnologiaa.com.br/api/v1/webhooks/7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b/segredo" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE" \
  -H "Idempotency-Key: minha-integracao-trocarSegredoWebhook-123"
Exemplo Resposta200
{
  "id": "8c3f0a6b-4d2e-4f7a-b9c1-6d5e4f3a2b1c",
  "url": "https://treinamento.gopixeltecnologia.com/api/webhooks/cardsign",
  "eventos": [
    "envelope.concluido",
    "envelope.cancelado",
    "signatario.recusou"
  ],
  "empresas": [
    "3f6c1d2a-8b4e-4f1a-9c7d-2e5b8a1f4c90"
  ],
  "descricao": "Programa DIAS — treinamentos",
  "ativo": true,
  "falhas_seguidas": 0,
  "pausado_em": null,
  "pausado_motivo": null,
  "segredo_fim": "m4Zt",
  "criado_em": "2026-10-20T12:00:03.118204+00:00",
  "segredo": "whsec_EXEMPLO-nao-use-9bW2qL7xT4nR1vK8sD5fG3hJ6pA0cZ2em4Zt"
}

Testar webhook

POST/api/v1/webhooks/{id}/testar
Escopo: webhooks:gerirExige Idempotency-Key

Enfileira um evento ping para o destino (entregue em até 1 minuto). Sem corpo.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.
Idempotency-Keyobrigatóriostring1 a 200 caracteres. A mesma chave com o mesmo corpo em 24 h devolve a mesma resposta.

Parâmetros

Parâmetros
ParâmetroTipoDescrição
idobrigatóriocaminhostring (uuid)

UUID do envelope (ou do webhook, nas rotas /webhooks).

Respostas

Respostas
CódigoTipoDescrição
202objeto

Na fila.

400Erro

sem_idempotency_key (POST sem o cabeçalho) ou json_invalido (corpo ilegível).

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

404Erro

webhook_nao_encontrado — destino de outro grupo ou removido.

409Erro

idempotencia_em_andamento — a mesma Idempotency-Key ainda está sendo processada.

422Erro

idempotencia_conflito — Idempotency-Key repetida com outro corpo (ou outra rota) em 24 h.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X POST "https://cardsign.gopixeltecnologiaa.com.br/api/v1/webhooks/7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b/testar" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE" \
  -H "Idempotency-Key: minha-integracao-testarWebhook-123"
Exemplo Resposta202
{
  "entrega_id": "1f2e3d4c-5b6a-4978-8a9b-0c1d2e3f4a5b",
  "evento_id": "6a5b4c3d-2e1f-4a0b-9c8d-7e6f5a4b3c2d"
}

Entregas do webhook

GET/api/v1/webhooks/{id}/entregas
Escopo: webhooks:gerir

As últimas 100 entregas do destino, mais recentes primeiro.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.

Parâmetros

Parâmetros
ParâmetroTipoDescrição
idobrigatóriocaminhostring (uuid)

UUID do envelope (ou do webhook, nas rotas /webhooks).

Respostas

Respostas
CódigoTipoDescrição
200objeto

Entregas.

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

404Erro

webhook_nao_encontrado — destino de outro grupo ou removido.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X GET "https://cardsign.gopixeltecnologiaa.com.br/api/v1/webhooks/7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b/entregas" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE"
Exemplo Resposta200
{
  "entregas": [
    {
      "id": "1f2e3d4c-5b6a-4978-8a9b-0c1d2e3f4a5b",
      "evento_id": "6a5b4c3d-2e1f-4a0b-9c8d-7e6f5a4b3c2d",
      "tipo": "envelope.concluido",
      "status": "entregue",
      "tentativas": 1,
      "http_status": 200,
      "ms": 184,
      "erro": null,
      "criado_em": "2026-10-20T11:05:40.912003+00:00",
      "proxima_em": null
    },
    {
      "id": "2a3b4c5d-6e7f-4a8b-9c0d-1e2f3a4b5c6d",
      "evento_id": "7b6c5d4e-3f2a-4b1c-8d9e-0f1a2b3c4d5e",
      "tipo": "signatario.assinou",
      "status": "pendente",
      "tentativas": 2,
      "http_status": 503,
      "ms": 10012,
      "erro": "HTTP 503",
      "criado_em": "2026-10-20T10:58:13.004417+00:00",
      "proxima_em": "2026-10-20T11:34:13.004417+00:00"
    }
  ]
}

Reenviar entrega

POST/api/v1/webhooks/{id}/entregas/{eid}/reenviar
Escopo: webhooks:gerirExige Idempotency-Key

Põe a entrega de novo na fila agora, com o mesmo evento_id (o receptor reconhece a repetição). Sem corpo.

Cabeçalhos

Cabeçalhos
CabeçalhoTipoDescrição
AuthorizationobrigatóriostringBearer cs_… — a chave da API.
Idempotency-Keyobrigatóriostring1 a 200 caracteres. A mesma chave com o mesmo corpo em 24 h devolve a mesma resposta.

Parâmetros

Parâmetros
ParâmetroTipoDescrição
idobrigatóriocaminhostring (uuid)

UUID do envelope (ou do webhook, nas rotas /webhooks).

eidobrigatóriocaminhostring (uuid)

UUID da entrega.

Respostas

Respostas
CódigoTipoDescrição
202objeto

Na fila.

400Erro

sem_idempotency_key (POST sem o cabeçalho) ou json_invalido (corpo ilegível).

401Erro

Chave ausente ou inválida: sem_chave, chave_invalida, chave_revogada, chave_expirada, chave_sem_responsavel.

403Erro

Sem acesso: sem_escopo, sem_permissao, ip_nao_autorizado.

404Erro

entrega_nao_encontrada (entrega de outro destino) ou webhook_nao_encontrado.

409Erro

idempotencia_em_andamento — a mesma Idempotency-Key ainda está sendo processada.

422Erro

idempotencia_conflito — Idempotency-Key repetida com outro corpo (ou outra rota) em 24 h.

429Erro

limite — mais de 120 chamadas por minuto.

503Erro

indisponivel — não deu para conferir o acesso agora, o servidor está ocupado lendo PDFs de outros pedidos ou o pedido passou de 90 s baixando/lendo PDFs (veja retry-after); erro_interno (500) em falha inesperada. Tente de novo (com a mesma Idempotency-Key).

Exemplo Request
curl -X POST "https://cardsign.gopixeltecnologiaa.com.br/api/v1/webhooks/7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b/entregas/2a3b4c5d-6e7f-4a8b-9c0d-1e2f3a4b5c6d/reenviar" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE" \
  -H "Idempotency-Key: minha-integracao-reenviarEntrega-123"
Exemplo Resposta202
{
  "reenviada": true
}

Idempotência

Todo POST exige o cabeçalho Idempotency-Key (1 a 200 caracteres ASCII visíveis). Com ele, repetir um pedido depois de uma queda de rede é seguro: o CardSign guarda a resposta por 24 horas. Use uma chave por ação do seu sistema, por exemplo dias-<id do envio>-criar e dias-<id do envio>-enviar.

Só o sucesso fica guardado: recusas (4xx) e falhas (5xx) não ficam, então corrija o que faltava e tente de novo com a mesma chave.

O que acontece

O que acontece
CódigoTipoDescrição
status originalidempotent-replayed: trueMesma chave + mesmo corpo (SHA-256) em 24 h: a resposta guardada, sem refazer nada.
422idempotencia_conflitoMesma chave com outro corpo (ou outra rota).
409idempotencia_em_andamentoO primeiro pedido com essa chave ainda está rodando; tente de novo após retry-after (2 s).
400sem_idempotency_keyPOST sem o cabeçalho.
Exemplo Request
curl -X POST "https://cardsign.gopixeltecnologiaa.com.br/api/v1/envelopes/7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b/enviar" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE" \
  -H "Idempotency-Key: minha-integracao-enviarEnvelope-123" \
  -H "Content-Type: application/json" \
  -d '{
  "devolver_links": true
}'
Exemplo Resposta422
{
  "erro": {
    "codigo": "idempotencia_conflito",
    "mensagem": "Esta Idempotency-Key já foi usada com outro corpo (ou outra rota) nas últimas 24 h."
  }
}

Paginação

GET /documentos e GET /envelopes voltam em páginas, mais recentes primeiro (criado_em desc, id desc).

  • Cursor (recomendado): cada resposta traz proximo e proxima_url; mande depois=<proximo> para a página seguinte. proximo: null = acabou. Sem teto.
  • `pagina` continua valendo, mas só até pagina × limite ≤ 10000 (além disso, 400 pagina_alta_demais).
  • `total` só vem na primeira página sem cursor; nas outras é null (peça com contar=1).

Parâmetros

Parâmetros
ParâmetroTipoDescrição
limiteintegerItens por página, de 1 a 200. (de 1 a 200; padrão 50)
depoisstringCursor — o valor de proximo da resposta anterior (<criado_em>,<id>). Ignora pagina.
paginaintegerNúmero da página (compatibilidade). Só até pagina × limite ≤ 10000; além disso use depois. (padrão 1)
contar11 para trazer total também fora da primeira página.
statusrascunho | andamento | pausado | concluido | cancelado | expirado | recusadoFiltra pela situação.
empresastring (uuid)UUID de uma empresa liberada.
desdestringCriados a partir de (AAAA-MM-DD = 00:00 de Brasília, ou ISO 8601).
atestringCriados antes de (AAAA-MM-DD = 00:00 de Brasília, ou ISO 8601).
external_idstringO external_id exato informado na criação (1 a 200 caracteres). (1 a 200 caracteres)
Exemplo Request
curl -X GET "https://cardsign.gopixeltecnologiaa.com.br/api/v1/envelopes?desde=2026-10-01" \
  -H "Authorization: Bearer $CARDSIGN_CHAVE"
Exemplo Resposta200
{
  "pagina": null,
  "limite": 50,
  "total": null,
  "proximo": "2026-10-19T13:42:07.481233+00:00,7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b",
  "proxima_url": "https://cardsign.gopixeltecnologiaa.com.br/api/v1/envelopes?limite=50&depois=2026-10-19T13%3A42%3A07.481233%2B00%3A00%2C7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b",
  "envelopes": [
    {
      "id": "7b1e4c2d-9f3a-4d6e-8a5b-1c2d3e4f5a6b",
      "titulo": "POP 014 — Higienização das mãos (ciência do colaborador)",
      "status": "andamento",
      "empresa_id": "3f6c1d2a-8b4e-4f1a-9c7d-2e5b8a1f4c90",
      "criado_em": "2026-10-19T13:42:07.481233+00:00",
      "concluido_em": null,
      "prazo": "2026-10-31T02:59:00+00:00",
      "external_id": "dias:pop:4821",
      "origem": "api"
    }
  ]
}

Erros

Todo erro tem o mesmo formato: codigo estável (para o seu código decidir), mensagem em português (para pessoas) e, quando ajuda, detalhes com o campo exato (ex.: signatarios[0].email). Cada chamada fica registrada na aba Chamadas de Conta › API e chaves.

Códigos de erro

Códigos de erro
CódigoTipoDescrição
400sem_idempotency_keyPOST de escrita sem o cabeçalho Idempotency-Key
400json_invalidoCorpo que não é JSON (ou multipart sem o campo dados)
400parametro_invalidoFiltro da lista inválido
400cursor_invalido"depois" que não veio de "proximo"
400pagina_alta_demaispagina × limite acima de 10.000 (use o cursor)
401sem_chaveSem Authorization: Bearer cs_…
401chave_invalidaChave que não existe
401chave_revogadaChave revogada
401chave_expiradaChave vencida
401chave_sem_responsavelQuem criou a chave saiu do grupo
403ip_nao_autorizadoIP fora da lista da chave
403sem_escopoA chave não tem o escopo da rota
403sem_permissaoQuem criou a chave não tem a permissão (nesta empresa)
404nao_encontradoRota que não existe
404documento_nao_encontradoDocumento/envelope fora do alcance da chave
404signatario_nao_encontradoPessoa que não é deste envelope
404webhook_nao_encontradoDestino de webhook de outro grupo ou removido
404entrega_nao_encontradaEntrega de outro destino
405metodoMétodo não aceito nesta rota (veja Allow)
409nao_concluidoPDF final ou provas antes da conclusão
409estado_invalidoAção que a situação do envelope não permite
409external_id_em_usoexternal_id já usado por esta chave (detalhes traz o envelope_id)
409idempotencia_em_andamentoA mesma Idempotency-Key ainda está sendo processada
413grande_demaisCorpo acima de 30 MB, PDF acima de 20 MB ou PDFs do pedido somando mais de 30 MB
415tipo_nao_suportadoContent-Type que não é JSON nem multipart/form-data
422validacaoCampos inválidos (veja detalhes)
422idempotencia_conflitoIdempotency-Key repetida com outro corpo
422arquivo_invalidoArquivo que não é PDF (%PDF) ou está corrompido
422download_falhouNão deu para baixar o PDF da URL informada
422url_invalidaURL que não é https pública
422ancora_nao_encontradaTexto da âncora não está no PDF
422regra_violadaRegra do CardSign (ex.: falta e-mail, falta campo de assinatura)
429limiteMais de 120 chamadas por minuto (veja retry-after)
500erro_internoErro inesperado
503indisponivelNão deu para conferir o acesso agora, servidor ocupado lendo PDFs ou pedido acima de 90 s (veja retry-after)
503trilha_indisponivelNão deu para ler a trilha inteira agora
Exemplo Resposta422
{
  "erro": {
    "codigo": "validacao",
    "mensagem": "Corpo inválido.",
    "detalhes": [
      {
        "campo": "signatarios[0].email",
        "mensagem": "Invalid email address"
      },
      {
        "campo": "prazo",
        "mensagem": "O prazo já passou."
      }
    ]
  }
}

Postman

Coleções prontas para testar a API sem escrever código: cada requisição tem descrição, testes automáticos e guarda os ids nas variáveis da coleção. A coleção põe uma Idempotency-Key nova em todo POST.

  1. Baixe a coleção e um ambiente. No Postman, Import › arraste os arquivos (ou File › Import).
  2. Escolha o ambiente no canto superior direito e preencha api_key (é secreta), email_signatario (seu e-mail, para receber os convites de teste) e, se quiser, empresa_id e webhook_url.
  3. Rode 00 Autorização › Quem sou eu — se empresa_id estiver vazio, ele é preenchido com a primeira empresa da chave.
  4. Rode as pastas na ordem, ou a coleção inteira no Runner (botão Run). Os resultados dos testes aparecem na aba Test Results.
  5. Para testar o receptor do Programa DIAS, use o Simulador de webhooks: defina webhook_segredo (o whsec_…) e envie cada evento, assinado como o CardSign assina.
Pré-requisição da coleção
// Idempotency-Key em todo POST que ainda não tem uma
if (pm.request.method === "POST" && !pm.request.headers.has("Idempotency-Key")) {
  pm.request.headers.add({
    key: "Idempotency-Key",
    value: pm.variables.replaceIn("{{$guid}}"),
  });
}

Changelog

  1. 1.0.1 · 21/10/2026

    • Webhooks: mudar url ou empresas (PATCH /webhooks/{id}) faz do dono da chave o responsável pelo destino e troca o segredo, que volta na resposta (campo segredo) só nessa vez. Novo POST /webhooks/{id}/segredo para trocar o segredo.
    • Webhooks: gerir pela API exige que quem criou a chave tenha org.api com alcance de grupo (a mesma regra da tela). Reenvio só de entregas que o responsável de agora poderia receber; pendentes há mais de 72 h viram falhou.
    • PDFs: no máximo 30 MB somando todos os arquivos de um pedido (413 grande_demais) e 90 s para baixar e ler (503 indisponivel com retry-after). Com o servidor ocupado lendo PDFs de outros pedidos, 503 indisponivel com retry-after.
    • Idempotency-Key no multipart: o hash é do campo dados (JSON canônico) e do nome + SHA-256 de cada arquivo, não do corpo bruto (o boundary não conta). Reserva sem resposta só é liberada depois de 10 min.
  2. 1.0.0 · 20/10/2026

    • API de escrita: criar envelope (JSON ou multipart), arquivos por URL ou base64, signatários com campos por posição ou âncora, enviar (com devolver_links), cancelar, pausar, retomar e lembrete.
    • Webhooks assinados (HMAC-SHA256) com reenvio automático, teste (ping), histórico de entregas e reenvio manual.
    • Novas leituras: /eu, /empresas, /modelos, /envelopes (com external_id) e /envelopes/{id}/provas.
    • Idempotency-Key obrigatória em todo POST; paginação por cursor em /documentos e /envelopes.
    • Documentação pública em /docs/api, OpenAPI 3.1 e coleções Postman.
  3. 0.9.0 · 01/09/2026

    • API de leitura: /documentos, /documentos/{id}, /documentos/{id}/trilha e /documentos/{id}/pdf.