API de Assinatura Eletronica
Envie documentos para assinatura via WhatsApp em 1 chamada. Integre com IA via MCP. Validade juridica no Brasil.
Base URL
https://sign.riasistemas.com.br
Fluxo
3. Assina pelo celular (sem instalar nada) → 4. PDF selado + webhook
5. Download do PDF assinado com certificado
Base Legal
- Lei 14.063/2020 — Assinatura Eletronica Simples (Art. 4, II) + Avancada (Art. 4, III)
- MP 2.200-2/2001 Art.10 §2 — Validade juridica de documentos eletronicos
Niveis de Assinatura
| Nivel | Requisitos | Quando |
|---|---|---|
| Simples | OTP, consentimento, trilha de auditoria | Default |
| Avancada | Simples + selfie + doc identidade + carimbo de tempo RFC 3161 + assinatura ECDSA P-256 | Automatico quando selfie + idPhoto habilitados |
| Qualificada (ICP-Brasil) | Certificado digital via PSC (Certillion) | Quando icp: true e signatario tem certificado |
Quick Start
Envie seu primeiro documento para assinatura em 30 segundos:
1. Obtenha sua API Key
Acesse o Painel de Integracao e copie sua chave (formato rsk_...).
2. Envie um documento
curl -X POST https://sign.riasistemas.com.br/api/v2/send \
-H "Authorization: Bearer rsk_SUA_API_KEY" \
-F "file=@contrato.pdf" \
-F 'data={
"subject": "Contrato de Servicos",
"signers": [
{
"name": "Maria Silva",
"phone": "+5541999999999"
}
]
}'
3. Pronto!
Maria recebe o documento no WhatsApp e assina pelo celular. Voce recebe o webhook envelope.completed quando todos assinarem.
// Resposta
{
"id": "env_a1b2c3d4...",
"status": "sent",
"signers": [{
"id": "sgn_x1y2z3...",
"name": "Maria Silva",
"sign_url": "https://sign.riasistemas.com.br/sign/abc123...",
"status": "sent"
}],
"document": {
"id": "doc_p1q2r3...",
"filename": "contrato.pdf",
"hash": "sha256:a1b2c3d4...",
"pages": 5
}
}
Autenticacao
Todas as rotas /api/* e /mcp requerem autenticacao via API Key no header HTTP:
Authorization: Bearer rsk_sua_api_key_aqui
As chaves sao geradas no Painel de Integracao. O prefixo rsk_ identifica chaves do RIA Sign. Apenas o hash SHA-256 da chave e armazenado.
Para clientes MCP (ChatGPT, Claude), use OAuth 2.1 com PKCE — o usuario autoriza via telefone+OTP sem expor a API Key.
Respostas de Erro
| Status | Descricao |
|---|---|
401 | API Key ausente ou invalida |
402 | Documentos com pagamento pendente (soft limit) |
403 | API Key desativada |
Enviar PDF para Assinatura
Envio completo em 1 chamada: upload do PDF + dados dos signatarios + envio automatico via WhatsApp.
Form Fields (multipart/form-data)
| Campo | Tipo | Descricao |
|---|---|---|
| file | File obrigatorio | Documento PDF ou DOCX |
| data | JSON string obrigatorio | Dados do envio (ver abaixo) |
Campos do JSON data
| Campo | Tipo | Descricao |
|---|---|---|
| subject | string obrigatorio | Titulo do documento |
| signers | array obrigatorio | Lista de signatarios (min. 1) |
| message | string opcional | Mensagem para os signatarios |
| webhookUrl | string opcional | URL para receber eventos (webhook) |
| callbackUrl | string opcional | Redirecionar signatario apos assinar |
| selfie | boolean opcional | Exigir selfie (ativa Assinatura Avancada) |
| idPhoto | boolean opcional | Exigir foto do documento de identidade (frente+verso) |
| otp | boolean opcional | Verificacao por codigo OTP de 6 digitos |
| icp | boolean opcional | Solicitar assinatura qualificada ICP-Brasil (certificado digital) |
| reminders | integer opcional | Quantidade de lembretes automaticos via WhatsApp (0=desabilitado, 3=recomendado) |
| expires | string opcional | Expiracao: "30d", "7d" ou ISO 8601 |
| metadata | object opcional | Metadados livres (retornados nos webhooks) |
Objeto signer
| Campo | Tipo | Descricao |
|---|---|---|
| name | string obrigatorio | Nome completo |
| phone | string obrigatorio* | Telefone com DDI (ex: +5541999999999). *Obrigatorio se sem email. |
| string opcional | Email (fallback se sem WhatsApp) | |
| cpf | string opcional | CPF do signatario |
| role | string opcional | Papel (ex: contratante, contratado, testemunha) |
| order | integer opcional | Ordem de assinatura (1, 2, 3...) |
Exemplo
curl -X POST https://sign.riasistemas.com.br/api/v2/send \
-H "Authorization: Bearer rsk_sua_api_key" \
-F "file=@contrato.pdf" \
-F 'data={
"subject": "Contrato de Prestacao de Servicos",
"signers": [
{"name": "Maria Silva", "phone": "+5541999999999", "role": "contratante"},
{"name": "Joao Santos", "phone": "+5541988888888", "role": "contratado"}
],
"selfie": true,
"idPhoto": true,
"reminders": 3,
"webhookUrl": "https://meusite.com/webhook"
}'
Resposta (201)
{
"id": "env_a1b2c3d4...",
"status": "sent",
"signers": [
{
"id": "sgn_x1y2z3...",
"name": "Maria Silva",
"phone": "+5541999999999",
"sign_url": "https://sign.riasistemas.com.br/sign/abc123...",
"status": "sent",
"order": 1
},
{
"id": "sgn_w4v5u6...",
"name": "Joao Santos",
"phone": "+5541988888888",
"sign_url": "https://sign.riasistemas.com.br/sign/def456...",
"status": "sent",
"order": 2
}
],
"document": {
"id": "doc_p1q2r3...",
"filename": "contrato.pdf",
"hash": "sha256:a1b2c3d4...",
"pages": 5
}
}
Enviar com Template
Envie contratos usando templates pre-criados, texto livre (analisado por IA) ou templates manuais com placeholders. Sem precisar de PDF — o documento e gerado automaticamente.
Modo 1 — Template salvo
Use um template ja criado no sistema.
{
"template_id": "tpl_abc123",
"signers": [{"name": "Maria", "phone": "+5541999999999", "role": "locatario"}],
"fields": {"VALOR_ALUGUEL": "R$ 2.500,00", "ENDERECO": "Rua das Flores, 123"}
}
Modo 2 — Texto livre (IA)
Envie o texto do contrato e a IA extrai automaticamente os placeholders e papeis dos signatarios.
{
"text": "CONTRATO DE PRESTACAO DE SERVICOS\n\nPelo presente, Maria Silva (contratante) contrata Joao Santos (contratado) para...",
"signers": [
{"name": "Maria Silva", "phone": "+5541999999999"},
{"name": "Joao Santos", "phone": "+5541988888888"}
]
}
Modo 3 — Template manual
Texto com placeholders no formato [NOME_DO_CAMPO].
{
"template_text": "Eu, [NOME_CONTRATANTE], CPF [CPF_CONTRATANTE], contrato [NOME_CONTRATADO] para...",
"signers": [
{"name": "Maria", "phone": "+5541999999999", "role": "contratante"},
{"name": "Joao", "phone": "+5541988888888", "role": "contratado"}
]
}
Campos comuns (todos os modos)
| Campo | Tipo | Descricao |
|---|---|---|
| signers | array obrigatorio | Signatarios (name, phone/email, role) |
| subject | string opcional | Titulo (inferido do template/IA) |
| fields | object opcional | Valores para preencher placeholders ({"CAMPO": "valor"}) |
| selfie | boolean opcional | Exigir selfie |
| icp | boolean opcional | Solicitar ICP-Brasil |
| reminders | integer opcional | Lembretes automaticos (0-5) |
| expires | string opcional | Expiracao ("30d" ou ISO 8601) |
Resposta (201)
{
"id": "env_a1b2c3d4...",
"status": "sent",
"subject": "Contrato de Servicos",
"template_mode": true,
"ai_analyzed": true,
"warnings": [],
"signers": [
{
"id": "sgn_x1y2z3...",
"name": "Maria Silva",
"role": "contratante",
"sign_url": "https://sign.riasistemas.com.br/sign/abc123...",
"status": "sent"
}
]
}
Nota: O campo warnings aparece quando ha papeis com campos pessoais sem signatario atribuido.
Gerar Contrato com IA
Use inteligencia artificial para gerar contratos completos com placeholders e papeis sugeridos.
Body (JSON)
| Campo | Tipo | Descricao |
|---|---|---|
| type | string obrigatorio | Tipo do contrato |
| description | string opcional | Descricao com detalhes (obrigatorio para tipo personalizado) |
Tipos disponiveis
| Tipo | Descricao |
|---|---|
| procuracao_simples | Procuracao simples |
| contrato_servicos | Contrato de prestacao de servicos |
| contrato_aluguel | Contrato de aluguel |
| contrato_compra_venda | Contrato de compra e venda |
| declaracao | Declaracao |
| autorizacao | Autorizacao |
| nda | Acordo de confidencialidade |
| recibo | Recibo |
| contrato_emprestimo | Contrato de emprestimo |
| personalizado | Tipo personalizado (descreva na descricao) |
Exemplo
curl -X POST https://sign.riasistemas.com.br/api/v2/generate \
-H "Authorization: Bearer rsk_sua_api_key" \
-H "Content-Type: application/json" \
-d '{"type": "contrato_servicos", "description": "Desenvolvimento de site institucional, valor R$5.000, prazo 30 dias"}'
Resposta (200)
{
"name": "Contrato de Prestacao de Servicos",
"template_text": "CONTRATO DE PRESTACAO DE SERVICOS\n\nPelo presente instrumento...\n[NOME_CONTRATANTE]...",
"placeholders": {
"NOME_CONTRATANTE": {"label": "Nome do Contratante", "auto": "name"},
"CPF_CONTRATANTE": {"label": "CPF do Contratante", "auto": "cpf"},
"VALOR": {"label": "Valor do Servico"}
},
"suggested_signers": [
{"role": "contratante", "description": "Parte contratante", "placeholders": ["NOME_CONTRATANTE", "CPF_CONTRATANTE"]},
{"role": "contratado", "description": "Prestador de servicos", "placeholders": ["NOME_CONTRATADO", "CPF_CONTRATADO"]}
]
}
Dica: Use o resultado com /api/v2/send-template (Modo 3) para enviar o contrato gerado.
Body (JSON)
| Campo | Tipo | Descricao |
|---|---|---|
| edit | string obrigatorio | Descricao da alteracao (ex: "Adicionar clausula de multa de 10%") |
Resposta (200)
{
"id": "tpl_a1b2c3d4...",
"name": "Contrato de Servicos",
"template_text": "...(texto atualizado)...",
"placeholders": {...},
"suggested_signers": [...],
"change_summary": "Adicionada clausula 8 com multa de 10% por atraso."
}
Gerenciamento
Endpoints para listar, consultar, baixar e gerenciar envelopes e templates.
| Query Param | Tipo | Default | Descricao |
|---|---|---|---|
| limit | integer | 20 | Maximo de resultados |
| offset | integer | 0 | Deslocamento para paginacao |
Resposta
{
"id": "env_a1b2c3d4...",
"status": "sent",
"subject": "Contrato de Servicos",
"created_at": "2026-04-15T12:00:00Z",
"signers": [
{
"id": "sgn_x1y2z3...",
"name": "Maria Silva",
"phone": "+5541999999999",
"role": "contratante",
"status": "signed",
"sign_url": "https://sign.riasistemas.com.br/sign/abc123...",
"viewed_at": "2026-04-15T12:05:00Z",
"signed_at": "2026-04-15T12:08:00Z"
}
],
"document": {
"id": "doc_p1q2r3...",
"filename": "contrato.pdf",
"hash": "sha256:a1b2c3d4...",
"signed_hash": "sha256:e5f6g7h8...",
"pages": 5
}
}
status = completed.Retorna o arquivo PDF diretamente (Content-Type: application/pdf).
Resposta (200)
{
"reminded": [
{"name": "Joao Santos", "status": "sent", "channel": "whatsapp"}
]
}
completed).Servidor MCP
O RIA Sign implementa o Model Context Protocol (MCP), permitindo que assistentes de IA como ChatGPT, Claude e outros clientes MCP enviem documentos para assinatura diretamente pela conversa.
O que e MCP?
O MCP e um protocolo padrao que conecta modelos de IA a servicos externos via JSON-RPC 2.0. O RIA Sign expoe ferramentas (tools) que qualquer cliente MCP pode chamar para criar, enviar e gerenciar documentos de assinatura.
Conexao
| Metodo | URL | Descricao |
|---|---|---|
| POST | https://sign.riasistemas.com.br/mcp | JSON-RPC 2.0 — chamadas de ferramentas |
| GET | https://sign.riasistemas.com.br/mcp | SSE — Server-Sent Events |
Autenticacao MCP
Use Authorization: Bearer rsk_... (API Key direta) ou um token obtido via OAuth 2.1. A autenticacao e necessaria apenas para tools/call — initialize e tools/list funcionam sem auth.
Protocolo
Versoes suportadas: 2025-11-25 (default) e 2025-03-26.
Exemplo — Inicializar
curl -X POST https://sign.riasistemas.com.br/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-03-26",
"clientInfo": {"name": "MeuApp", "version": "1.0"}
}
}'
Exemplo — Listar ferramentas
curl -X POST https://sign.riasistemas.com.br/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'
Exemplo — Chamar ferramenta
curl -X POST https://sign.riasistemas.com.br/mcp \
-H "Authorization: Bearer rsk_sua_api_key" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "generate_contract",
"arguments": {
"type": "contrato_servicos",
"description": "Site institucional, R$5000, 30 dias"
}
}
}'
Ferramentas MCP (19)
Todas as ferramentas disponiveis via tools/call:
Envio
Inteligencia Artificial
Gerenciamento
Templates e Contatos
Agent Skill — Authoring Playbook
O RIA Sign publica uma Skill oficial (formato Anthropic) que ensina assistentes de IA (Claude, ChatGPT) a redigir contratos com a estrutura correta para a tool send_structured_contract: como nomear placeholders, quando usar CEP+ViaCEP, regras de assinatura, anti-duplicacao, validacao de signatarios e preview obrigatorio antes do envio.
https://github.com/RIA-Sistemas/ria-sign-skill
raw.githubusercontent.com/.../SKILL.md
O que a Skill cobre
- Prime Directive: minimizar campos de digitacao manual por signatario. Hierarquia: inline → auto → CEP+ViaCEP → shared → date picker → manual (ultimo recurso).
- Placeholders: tipos (
auto,type,input_type,shared), naming UPPER_SNAKE_CASE, regras de reuso. - Enderecos: padrao de 7 placeholders com CEP unico input + auto-fill ViaCEP. Comarca/foro derivada do 1º signatario.
- Valores monetarios: 1 placeholder
[VALOR]em formato "R$ X.XXX,XX (extenso)" — nunca separar numerico e por extenso. - Datas:
auto:date(hoje, automatico) vsinput_type:date(date picker do Flow). - Signatarios: minimo de partes por tipo de documento, ordem (sequencial vs paralelo), regra do remetente, testemunhas, representante legal, tripartite.
- Pre-send safety: preview obrigatorio + confirmacao explicita antes de disparar WhatsApp irreversivel.
- 4 exemplos gold-standard (locacao, recibo, procuracao, NDA bilateral) e 18 anti-patterns categorizados.
Como usar com seu cliente MCP
Clientes MCP modernos (Claude.ai, Claude Desktop, ChatGPT) podem carregar a Skill automaticamente quando o RIA Sign for instalado pelo diretorio oficial da Anthropic. Para uso manual ou em outros clientes, baixe o SKILL.md do repositorio publico e carregue como system context antes de pedir ao LLM para redigir um documento.
OAuth 2.1
Para clientes MCP (ChatGPT, Claude, etc.), o RIA Sign suporta OAuth 2.1 com PKCE. O usuario autoriza via telefone + OTP no WhatsApp — sem precisar da API Key.
Endpoints
| Metodo | Path | Descricao |
|---|---|---|
| GET | /oauth/authorize | Pagina de autorizacao (telefone + OTP ou API Key) |
| POST | /oauth/authorize | Submit de API Key (formulario) |
| POST | /oauth/authorize-otp | Fluxo telefone + OTP (request/verify) |
| POST | /oauth/token | Troca codigo por access token |
| POST | /oauth/register | Registro dinamico de cliente (RFC 7591) |
Descoberta (Well-Known)
| URL | Descricao |
|---|---|
| /.well-known/oauth-authorization-server | Metadata do servidor OAuth (RFC 8414) |
| /.well-known/oauth-protected-resource | Metadata do recurso protegido |
Fluxo de Autorizacao
2. Redireciona usuario para /oauth/authorize?client_id=...&redirect_uri=...
3. Usuario informa telefone → Recebe OTP no WhatsApp → Digita codigo
4. Redireciona para
redirect_uri com ?code=xxx5. Cliente troca o codigo: POST /oauth/token → access_token
6. Usa o token:
Authorization: Bearer {access_token}
Exemplo — Registrar cliente
curl -X POST https://sign.riasistemas.com.br/oauth/register \
-H "Content-Type: application/json" \
-d '{"client_name": "MeuApp", "redirect_uris": ["https://meuapp.com/callback"]}'
// Resposta
{"client_id": "client_abc123...", "redirect_uris": ["https://meuapp.com/callback"]}
Exemplo — Trocar codigo por token
curl -X POST https://sign.riasistemas.com.br/oauth/token \
-H "Content-Type: application/json" \
-d '{
"grant_type": "authorization_code",
"code": "authcode_xxx...",
"client_id": "client_abc123",
"redirect_uri": "https://meuapp.com/callback",
"code_verifier": "PKCE_VERIFIER_AQUI"
}'
// Resposta
{
"access_token": "rsk_...",
"token_type": "bearer",
"expires_in": 2592000
}
PKCE (S256)
Recomendado para seguranca. Envie code_challenge na autorizacao e code_verifier na troca do token. Metodo suportado: S256 (SHA-256 + base64url).
Webhooks
Receba notificacoes em tempo real sobre eventos do envelope. Configure o webhookUrl ao criar o envelope.
Eventos
| Evento | Descricao |
|---|---|
| envelope.sent | Envelope enviado para os signatarios |
| signer.viewed | Signatario abriu o documento |
| signer.signed | Signatario assinou (inclui channel: web ou whatsapp_flow) |
| signer.declined | Signatario recusou (inclui reason) |
| signer.reminder | Lembrete automatico enviado |
| envelope.completed | Todos assinaram, PDF selado (inclui document_hash) |
Payload
Header X-RiaSign-Event indica o tipo. Header X-RiaSign-Signature contem o HMAC-SHA256 para verificacao.
{
"event": "signer.signed",
"envelope_id": "env_a1b2c3d4...",
"signer": {
"name": "Maria Silva",
"phone": "+5541999999999",
"signed_at": "2026-04-15T14:43:06Z"
},
"channel": "whatsapp_flow",
"timestamp": "2026-04-15T14:43:06Z"
}
Exemplo — envelope.completed
{
"event": "envelope.completed",
"envelope_id": "env_a1b2c3d4...",
"document_hash": "sha256:e5f6g7h8...",
"signers": [
{"name": "Maria Silva", "signed_at": "2026-04-15T14:43:06Z"},
{"name": "Joao Santos", "signed_at": "2026-04-15T15:02:18Z"}
],
"timestamp": "2026-04-15T15:02:18Z"
}
Verificacao de Assinatura
const crypto = require('crypto');
const signature = crypto
.createHmac('sha256', suaApiKey)
.update(requestBody)
.digest('hex');
if (signature === headers['x-riasign-signature']) {
// Webhook autentico
}
Retry
Em caso de falha (timeout ou status >= 400), o webhook e reenviado com backoff:
- 1a tentativa: imediato
- 2a tentativa: +2 segundos
- 3a tentativa: +5 segundos
Codigos de Erro
A API retorna erros em JSON com o campo error:
{"error": "Envelope not found"}
| Status | Descricao |
|---|---|
400 | Parametros invalidos ou faltando |
401 | API Key ausente ou invalida |
402 | Limite de uso atingido (documentos com pagamento pendente) |
403 | API Key desativada |
404 | Recurso nao encontrado |
502 | Falha na analise de IA (tente novamente) |
IDs
Todos os IDs usam prefixos para identificacao:
| Prefixo | Recurso |
|---|---|
| env_ | Envelope |
| doc_ | Documento |
| sgn_ | Signatario |
| tpl_ | Template |
| key_ | API Key |
Exemplos de Integracao
Node.js
const fs = require('fs');
const form = new FormData();
form.append('file', new Blob([fs.readFileSync('contrato.pdf')]), 'contrato.pdf');
form.append('data', JSON.stringify({
subject: 'Contrato de Servicos',
signers: [{name: 'Maria Silva', phone: '+5541999999999'}],
selfie: true,
webhookUrl: 'https://meusite.com/webhook',
}));
const res = await fetch('https://sign.riasistemas.com.br/api/v2/send', {
method: 'POST',
headers: {'Authorization': 'Bearer rsk_sua_api_key'},
body: form,
});
const envelope = await res.json();
console.log('Envelope criado:', envelope.id);
// Signatarios recebem no WhatsApp automaticamente
Python
import requests, json
with open('contrato.pdf', 'rb') as f:
res = requests.post(
'https://sign.riasistemas.com.br/api/v2/send',
headers={'Authorization': 'Bearer rsk_sua_api_key'},
files={'file': ('contrato.pdf', f, 'application/pdf')},
data={'data': json.dumps({
'subject': 'Contrato de Servicos',
'signers': [{'name': 'Maria Silva', 'phone': '+5541999999999'}],
'selfie': True,
})}
)
envelope = res.json()
print(f'Envelope criado: {envelope["id"]}')
MCP (Claude / ChatGPT)
Configure o RIA Sign como servidor MCP no seu cliente:
// claude_desktop_config.json (exemplo)
{
"mcpServers": {
"ria-sign": {
"url": "https://sign.riasistemas.com.br/mcp",
"transport": "streamable-http"
}
}
}
Depois, basta pedir ao assistente: "Gere um contrato de servicos e envie para Maria Silva (+5541999999999)".
RIA Sign — Assinatura Eletronica com Validade Juridica