AssinAPI

Integrando com FlutterFlow

Apps FlutterFlow rodam no dispositivo do usuário. A chave nunca pode ir para o app: use API Calls privadas (Cloud Function) ou seu backend.

Secret key

Guarde a chave no backend (Firebase/Supabase). No FlutterFlow, habilite "Make Private" na API Call.

Arquitetura

App → API Call privada (Firebase Cloud Function) ou Supabase Edge Function → AssinAPI.

Criar envelope

  • Cria um envelope (rascunho).
  • Apps FlutterFlow rodam no dispositivo: use "Make Private" na API Call (executa via Cloud Function) ou chame um backend próprio. Nunca coloque a chave direto no app.
text
FlutterFlow — API Calls (Private)

Método:   POST
URL:      https://sandbox.api.assinapi.com.br/v1/envelopes
Header:   Authorization: Bearer <ASSINAPI_SECRET_KEY> (privado)
Header:   Content-Type: application/json
Body (JSON):
{
  "title": "Contrato de prestação de serviços",
  "expirationDays": 7
}

Resposta de erro: { "error": { "code", "message", "hint", "requestId" } }

Enviar PDF

  • Anexa o PDF ao envelope. O SHA-256 é calculado pela AssinAPI.
  • Apps FlutterFlow rodam no dispositivo: use "Make Private" na API Call (executa via Cloud Function) ou chame um backend próprio. Nunca coloque a chave direto no app.
text
FlutterFlow — API Calls (Private)

Método:   POST
URL:      https://sandbox.api.assinapi.com.br/v1/envelopes/ENVELOPE_ID/documents
Header:   Authorization: Bearer <ASSINAPI_SECRET_KEY> (privado)
Body:     multipart/form-data — campo "file" (PDF)
          Alternativa low-code: POST /documents com JSON { "filename": "contrato.pdf", "contentBase64": "<PDF em base64>" }

Resposta de erro: { "error": { "code", "message", "hint", "requestId" } }

Adicionar signatário

  • Adiciona um signatário (CPF obrigatório na assinatura avançada).
  • Apps FlutterFlow rodam no dispositivo: use "Make Private" na API Call (executa via Cloud Function) ou chame um backend próprio. Nunca coloque a chave direto no app.
text
FlutterFlow — API Calls (Private)

Método:   POST
URL:      https://sandbox.api.assinapi.com.br/v1/envelopes/ENVELOPE_ID/signers
Header:   Authorization: Bearer <ASSINAPI_SECRET_KEY> (privado)
Header:   Content-Type: application/json
Body (JSON):
{
  "name": "João da Silva",
  "email": "joao@email.com",
  "cpf": "529.982.247-25",
  "authenticationMethod": "EMAIL_OTP"
}

Resposta de erro: { "error": { "code", "message", "hint", "requestId" } }

Enviar para assinatura

  • Envia para assinatura. A resposta traz os signingLinks.
  • Apps FlutterFlow rodam no dispositivo: use "Make Private" na API Call (executa via Cloud Function) ou chame um backend próprio. Nunca coloque a chave direto no app.
text
FlutterFlow — API Calls (Private)

Método:   POST
URL:      https://sandbox.api.assinapi.com.br/v1/envelopes/ENVELOPE_ID/send
Header:   Authorization: Bearer <ASSINAPI_SECRET_KEY> (privado)
Header:   Content-Type: application/json
Body (JSON):
{
  "notify": true
}

Resposta de erro: { "error": { "code", "message", "hint", "requestId" } }

Consultar status

  • Consulta status do envelope e dos signatários.
  • Apps FlutterFlow rodam no dispositivo: use "Make Private" na API Call (executa via Cloud Function) ou chame um backend próprio. Nunca coloque a chave direto no app.
text
FlutterFlow — API Calls (Private)

Método:   GET
URL:      https://sandbox.api.assinapi.com.br/v1/envelopes/ENVELOPE_ID
Header:   Authorization: Bearer <ASSINAPI_SECRET_KEY> (privado)

Resposta de erro: { "error": { "code", "message", "hint", "requestId" } }

Baixar documento assinado

  • Retorna URLs temporárias do PDF assinado, certificado e manifesto.
  • Apps FlutterFlow rodam no dispositivo: use "Make Private" na API Call (executa via Cloud Function) ou chame um backend próprio. Nunca coloque a chave direto no app.
text
FlutterFlow — API Calls (Private)

Método:   GET
URL:      https://sandbox.api.assinapi.com.br/v1/envelopes/ENVELOPE_ID/evidence
Header:   Authorization: Bearer <ASSINAPI_SECRET_KEY> (privado)

Resposta de erro: { "error": { "code", "message", "hint", "requestId" } }

Receber webhooks

  • Valide SEMPRE a assinatura HMAC (X-Signature) usando o corpo bruto.
  • Rejeite eventos com X-Timestamp com mais de 5 minutos e deduplique por X-Event-Id.
  • Responda 2xx rapidamente; processe de forma assíncrona. Falhas são reenviadas com backoff exponencial.
  • Plataformas low-code: receba o webhook em um backend (Supabase Edge Function, Cloudflare Worker ou n8n com Code node) para validar o HMAC.
text
1) Registre o endpoint:
curl -X POST "https://sandbox.api.assinapi.com.br/v1/webhooks" \
  -H "Authorization: Bearer $ASSINAPI_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://seu-sistema.com/api/webhooks/assinapi", "events": ["envelope.completed", "signer.signed"] }'
# Guarde o "secret" (whsec_…) retornado em ASSINAPI_WEBHOOK_SECRET

2) No receptor, calcule:
   HMAC_SHA256(secret, X-Event-Id + "." + X-Timestamp + "." + corpo_bruto)
   e compare com X-Signature (formato v1=<hex>).