Autenticação
Todas as requisições precisam de uma API key no header Authorization. As chaves seguem o padrão ctk_live_* e são geradas na aba API & Integrações do painel.
Disponível em todos os planos pagos (Basic, Pro e Business). A chave é criada em Painel → API & Integrações → Nova chave. Guarde-a — não é exibida novamente após a criação.
Base URL
Todos os endpoints seguem o padrão {base_url}/v1/{recurso}. A URL completa aparece no painel em API & Integrações.
Conexão à API
Siga os passos abaixo para obter suas credenciais e fazer a primeira chamada autenticada.
Acesse o painel
Faça login em app.cotract.app. Qualquer plano pago (Basic, Pro ou Business) já habilita acesso à API.
Crie uma API key
No painel, vá em Configurações → API & Integrações → Nova chave. Dê um nome que identifique a integração (ex.: Produção – backend).
Selecione os scopes necessários
Dê o mínimo de permissão necessário. Consulte a tabela de scopes para a lista completa.
Copie e guarde a chave
A chave é exibida apenas uma vez imediatamente após a criação. Não é possível recuperá-la depois — se perder, revogue e crie outra.
Nunca commite a chave no repositório. Use variáveis de ambiente ou um secret manager.
Teste a conexão
Faça uma requisição simples para confirmar que a chave está funcionando. Um 200 OK com a lista de contratos confirma que a autenticação está correta.
Se receber erro
401
Chave inválida ou header Authorization mal formatado. Verifique o prefixo Bearer com espaço.
403
Chave válida, mas sem o scope contracts:read. Revogue e crie uma nova com os scopes corretos.
Quick start
Da API key ao contrato gerado em 3 passos.
Crie a API key no painel
Painel → API & Integrações → Nova chave
Faça POST para criar o contrato
A geração é assíncrona — retorna 202 com job_id
Faça polling do job-status
Progresso de 0 a 100. Quando status: "completed", o contrato está pronto
Endpoints
/v1/contracts
Retorna lista paginada dos contratos da organização. Suporta If-None-Match para cache 304.
Query params
| status | string | draft · active · signed · expired |
| limit | integer | Itens por página, máx 100 (padrão: 20) |
| offset | integer | Deslocamento de paginação (padrão: 0) |
/v1/contracts
Cria um contrato e inicia a geração assíncrona com Gemini. Retorna 202 imediatamente com job_id. Use /job-status para polling. Retorna 402 se não houver créditos.
Body (JSON)
| title * | string | Título do contrato |
| description * | string | Contexto para geração de IA (mín. 10 chars) |
| type * | string | nda · employment · service_agreement · e outros |
| answers | object | Respostas de formulário customizado (opcional) |
| template_id | uuid | UUID de template específico (opcional) |
| expires_at | ISO 8601 | Data de expiração (opcional) |
/v1/contracts/:id/job-status
Retorna o progresso da geração. Faça polling a cada 2–5s. Sem cache (no-store). Quando status: "completed", o contrato está disponível via GET /v1/contracts/:id.
/v1/contracts/:id
Retorna contrato com a versão atual. Campo current_version.content contém o texto em Markdown gerado pelo Gemini. Suporta ETag para cache 304.
/v1/contracts/:id
Atualiza metadados do contrato (partial update). Não altera o conteúdo — o campo type é imutável após criação.
Body (JSON — todos opcionais)
| title | string | Novo título |
| status | string | draft · active · signed · expired · revoked |
| expires_at | ISO 8601 | null | Data de expiração |
/v1/contracts/:id/versions
Retorna todas as versões do contrato ordenadas por version_number DESC (mais recentes primeiro). Cada versão inclui o conteúdo Markdown completo.
/v1/signature-requests
Lista solicitações de assinatura da organização. Status: pending · signed · rejected · expired.
Query params
| contract_id | uuid | Filtrar por contrato |
| limit | integer | Máx 100 (padrão: 20) |
| offset | integer | Deslocamento de paginação |
/v1/signature-requests
Cria solicitação de assinatura e retorna o token de assinatura (revelado uma única vez) e o signing_url para enviar ao signatário. Formato do token: ctk_sign_<32hex>.
Body (JSON)
| contract_id * | uuid | ID do contrato |
| signer_email * | string | E-mail do signatário |
| signer_name * | string | Nome do signatário |
| expires_at | ISO 8601 | Expiração (padrão: +30 dias) |
/v1/webhook-events
Lista eventos na fila de dispatch para debugging e monitoramento. Status: pending · delivered · failed · dead_letter. Sempre retorna dados frescos (sem cache).
Query params
| status | string | pending · delivered · failed · dead_letter |
| limit | integer | Máx 100 (padrão: 20) |
| offset | integer | Deslocamento de paginação |
/v1/reviews
Lista revisões de IA da organização. Cada revisão inclui o analysis com riscos, recomendações e termos-chave identificados pelo Gemini.
Query params
| status | string | pending · processing · completed · failed |
| limit | integer | Máx 100 (padrão: 20) |
| offset | integer | Deslocamento de paginação |
/v1/reviews
Analisa um contrato com Gemini 2.5 Flash Lite. Identifica riscos, recomendações e termos-chave. Resultado é cacheado por SHA-256 do documento — enviar o mesmo documento duas vezes consome 0 créditos na segunda vez. Geração: 10–60s.
Body (JSON)
| doc_text * | string | Texto do contrato (mín. 200 chars, máx. ~200KB) |
| file_name * | string | Nome do arquivo para referência |
| questions | string[] | Perguntas customizadas para a IA (opcional) |
/v1/reviews/:id
Retorna uma revisão específica com análise completa. Suporta ETag para 304 Not Modified. Polling recomendado a cada 3–5s enquanto status: "processing".
/v1/financial-summary
Retorna KPIs financeiros e de uso de créditos da organização no período corrente. MRR/ARR expressos em créditos.
Scopes (permissões)
Cada API key tem um conjunto de scopes definidos na criação. Endpoints retornam 403 Forbidden se a chave não tiver o scope exigido.
| Scope | Endpoints cobertos |
|---|---|
contracts:read |
GET /v1/contracts, GET /v1/contracts/:id, GET /v1/contracts/:id/versions, GET /v1/contracts/:id/job-status |
contracts:write |
POST /v1/contracts, PATCH /v1/contracts/:id |
signatures:read |
GET /v1/signature-requests |
signatures:write |
POST /v1/signature-requests |
reviews:read |
GET /v1/reviews, GET /v1/reviews/:id |
reviews:write |
POST /v1/reviews |
webhooks:manage |
Gerenciar endpoints de webhook (via painel) |
analytics:read |
GET /v1/financial-summary |
Webhooks
Configure endpoints para receber eventos em tempo real. Cada entrega inclui assinatura HMAC-SHA256 no header X-Cotract-Signature. Retry automático com backoff exponencial.
contract.created
Geração de contrato iniciada/concluída
contract.updated
Status ou metadados alterados
contract.signed
Contrato totalmente assinado
contract.expired
Data de expiração atingida
signature.requested
Solicitação de assinatura criada
signature.completed
Signatário concluiu a assinatura
signature.rejected
Signatário recusou a assinatura
review.completed
Revisão de IA finalizada com resultado
review.failed
Revisão de IA falhou
webhook.test
Evento de teste disparado manualmente
Headers por entrega
| Header | Valor |
|---|---|
X-Cotract-Signature | HMAC-SHA256 — formato t=<timestamp>,v1=<hex> |
X-Cotract-Event | Tipo do evento (contract.created, etc.) |
X-Cotract-Delivery | UUID único do dispatch |
User-Agent | Cotract-Webhooks/1.0 |
Verificar assinatura HMAC
Formato compatível com Stripe. O header inclui timestamp para proteção contra replay (clock skew máx 5 min).
Retry com backoff exponencial
Máximo 5 tentativas. Timeout por entrega: 10s. Após esgotar tentativas, evento vai para dead letter.
| Tentativa | Backoff | Cron |
|---|---|---|
| 1ª | 15s | primário (1 min) |
| 2ª | 30s | primário (1 min) |
| 3ª | 5 min | retry (5 min) |
| 4ª | 30 min | retry (5 min) |
| 5ª | 2 horas | retry (5 min) |
| Dead letter | — | Sem mais retries |
Limites & Créditos
30
req / minuto por API key
Rate limit global — todas as chamadas
1
crédito por POST /contracts
Geração de contrato com IA
5
créditos por POST /reviews
0 créditos se resultado em cache (SHA-256)
∞
leituras sem custo
GET, PATCH, job-status, etc.
Créditos mensais se renovam no início de cada ciclo. Packs avulsos são descontados somente após esgotar os créditos da assinatura. Quando o limite de requisições é atingido, a API retorna 429 Too Many Requests com o header Retry-After.
Packs de Créditos via API
Para desenvolvedores que integram via POST /v1/contracts. Cada chamada consome 1 crédito. Os packs não expiram e são descontados após esgotar os créditos mensais do plano.
Packs são para integradores que fazem alto volume via API e querem previsibilidade de custo. Não há cobrança automática de excedente — quando os créditos acabam, a API retorna 402 até você adicionar mais.
R$24,90
15 chamadas POST /v1/contracts
R$1,66/contrato
R$54,90
40 chamadas POST /v1/contracts
R$1,37/contrato
R$119,90
100 chamadas POST /v1/contracts
R$1,20/contrato
Packs disponíveis na aba API & Integrações do painel após ativar qualquer plano.
Erros
Todos os erros seguem o formato {"error": "mensagem", "code": "ERROR_CODE"}.
| HTTP | Código | Causa |
|---|---|---|
401 |
UNAUTHORIZED |
API key inválida ou ausente |
402 |
INSUFFICIENT_CREDITS |
Sem créditos — adicione um pack antes de continuar |
403 |
FORBIDDEN |
API key não tem o scope exigido pelo endpoint |
404 |
NOT_FOUND |
Contrato não encontrado ou sem acesso |
413 |
PAYLOAD_TOO_LARGE |
Body da requisição excede 1 MB |
422 |
VALIDATION_ERROR |
Campos obrigatórios ausentes ou inválidos |
429 |
RATE_LIMITED |
Limite de 30 req/min atingido |
500 |
INTERNAL_ERROR |
Erro interno — tente novamente |