API REST v1 do SignSpry

URL base https://signspry.com/api/v1 · entrada e saída em JSON · erros retornam {"error": "…"} com 4xx/5xx.

Autenticação

Crie uma chave no console do desenvolvedor e envie-a em todas as solicitações:

curl https://signspry.com/api/v1/account \
  -H "Authorization: Bearer sk_live_YOUR_KEY"

Uma chave tem apenas os escopos marcados quando foi criada — envelopes:read (listar, status, trilha de auditoria, PDF selado), envelopes:write (criar, enviar, lembrar, anular, links de assinatura e de incorporação), templates:read, account:read. Uma chamada fora dos escopos da chave retorna 403 indicando o escopo que falta. As chaves expiram (30 dias, 90 dias, um ano ou nunca — você recebe um e-mail uma semana antes) e retornam 401 depois disso, e podem ser restritas a uma lista de IPs permitidos (endereços ou intervalos CIDR), retornando 403 de qualquer outro lugar. Dê a cada integração sua própria chave com os escopos mínimos necessários, para que revogar uma nunca quebre outra.

Criar e enviar um envelope

Uma única chamada envia os documentos (PDFs em base64), adiciona destinatários e campos e envia o envelope. As coordenadas são frações da página (0–1) a partir do canto superior esquerdo; recipient é um índice do array de destinatários; status: "sent" envia os convites por e-mail imediatamente (omita para manter como rascunho).

curl -X POST https://signspry.com/api/v1/envelopes \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Service Agreement",
    "message": "Please sign by Friday.",
    "expires_days": 15,
    "reminder_days": 2,
    "status": "sent",
    "documents": [{"name": "agreement.pdf", "content_b64": "'"$(base64 -w0 agreement.pdf)"'"}],
    "recipients": [
      {"name": "Asha Vendor", "email": "asha@vendor.in", "routing_order": 1},
      {"name": "Manu Shekhar", "email": "manu@signspry.com", "routing_order": 2},
      {"name": "Accounts",  "email": "accounts@signspry.com", "role": "cc"}
    ],
    "fields": [
      {"recipient": 0, "type": "signature", "page": 0, "x": 0.10, "y": 0.72, "w": 0.25, "h": 0.05},
      {"recipient": 0, "type": "text", "page": 0, "x": 0.10, "y": 0.60, "w": 0.20, "h": 0.04,
       "label": "PAN", "validation": {"type": "pan"}},
      {"recipient": 1, "type": "signature", "page": 1, "x": 0.10, "y": 0.72, "w": 0.25, "h": 0.05}
    ]
  }'

Tipos de campo: signature initials text date checkbox dropdown (com options) radio (com group_name) formula. Validações: email numbers letters date phone_in pincode pan gstin {"type":"custom","regex":"…"}.

Assinatura incorporada

Em vez de convites por e-mail (ou além deles), obtenha uma URL de assinatura e abra-a no seu próprio app — em iframe ou por redirecionamento. Quando o signatário termina, ele é enviado para sua return_url com ?envelope=…&event=signed (ou declined).

curl -X POST https://signspry.com/api/v1/envelopes/ENV_ID/recipients/RECIPIENT_ID/signing-link \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"return_url": "https://yourapp.com/signing-done"}'

#  {"url": "https://signspry.com/sign/…", "recipient": {…}}

Os IDs de destinatário vêm das respostas de criação/detalhe. Cada chamada gera um novo link e invalida os antigos desse destinatário. A ordem de assinatura continua valendo — um signatário bloqueado vê uma página “aguardando os outros”.

Webhooks

Adicione um endpoint no console; cada evento correspondente faz um POST de JSON para ele:

POST https://yourapp.com/webhooks/signet
X-Signet-Event: envelope.completed
X-Signet-Signature: sha256=<hex HMAC-SHA256 of raw body, keyed with your whsec_… secret>

{"id":"…","event":"envelope.completed","created_at":1787480000.1,
 "data":{"envelope":{"id":"…","title":"…","status":"completed","recipients":[…]}}}

Verificar (Python): hmac.new(secret, raw_body, hashlib.sha256).hexdigest() == header.split("sha256=")[1]. Entregas com falha são tentadas mais duas vezes; os resultados das entregas recentes aparecem no console. Eventos: envelope.sent recipient.viewed recipient.signed recipient.declined recipient.reassigned envelope.completed envelope.voided envelope.expired reminder.sent

Referência

EndpointO que faz
GET /accountDono da chave + uso.
POST /envelopesCria (e opcionalmente envia) um envelope.
GET /envelopes?status=&limit=&offset=Lista seus envelopes.
GET /envelopes/:idDetalhes completos, incl. destinatários + campos.
POST /envelopes/:id/sendEnvia um rascunho.
POST /envelopes/:id/voidAnula com um motivo.
POST /envelopes/:id/remindLembra os signatários pendentes por e-mail.
POST /envelopes/:id/recipients/:rid/signing-linkURL de assinatura incorporada (+ return_url).
GET /envelopes/:id/documentBaixa o PDF assinado e selado.
GET /envelopes/:id/auditTrilha de auditoria encadeada por hash, em JSON.