Status de Erros
A API do TapSign utiliza codigos de status HTTP padrao combinados com codigos de erro internos para indicar o resultado de cada requisicao. Este guia detalha todos os cenarios de erro e como trata-los.
Codigos de Status HTTP
| Codigo | Status | Descricao |
|---|---|---|
200 | OK | Requisicao processada com sucesso |
201 | Created | Recurso criado com sucesso |
204 | No Content | Requisicao processada, sem conteudo na resposta (ex: DELETE) |
400 | Bad Request | Requisicao invalida -- parametros ausentes ou incorretos |
401 | Unauthorized | Nao autenticado -- token ausente, invalido ou expirado |
402 | Payment Required | Pagamento necessario -- limite do plano atingido |
403 | Forbidden | Nao autorizado -- sem permissao para acessar este recurso |
404 | Not Found | Recurso nao encontrado |
409 | Conflict | Conflito -- o recurso ja existe ou esta em estado incompativel |
422 | Unprocessable Entity | Entidade nao processavel -- dados validos sintaticamente mas invalidos semanticamente |
429 | Too Many Requests | Rate limit excedido -- consulte Politicas de Rate Limit |
500 | Internal Server Error | Erro interno do servidor -- tente novamente ou contate o suporte |
Formato padrao de erro
Todas as respostas de erro seguem um formato JSON consistente:
{
"error": {
"code": "CODIGO_DO_ERRO",
"message": "Descricao legivel do erro.",
"details": {}
}
}
| Campo | Tipo | Descricao |
|---|---|---|
code | string | Codigo de erro interno para tratamento programatico |
message | string | Mensagem legivel descrevendo o erro |
details | object ou array ou null | Informacoes adicionais sobre o erro (pode ser nulo) |
Dica
Sempre utilize o campo code para tratamento programatico de erros, nao o campo message. As mensagens podem mudar sem aviso, mas os codigos sao estaveis.
Codigos de erro internos
Erros de validacao
| Codigo | HTTP | Descricao |
|---|---|---|
VALIDATION_ERROR | 400 | Um ou mais campos da requisicao sao invalidos |
INVALID_PARAMETER | 400 | Parametro com formato ou valor invalido |
MISSING_REQUIRED_FIELD | 400 | Campo obrigatorio ausente na requisicao |
INVALID_FILE_FORMAT | 400 | Formato de arquivo nao suportado |
FILE_TOO_LARGE | 400 | Arquivo excede o tamanho maximo permitido |
Erros de autenticacao e autorizacao
| Codigo | HTTP | Descricao |
|---|---|---|
AUTHENTICATION_ERROR | 401 | Token ausente ou invalido |
TOKEN_EXPIRED | 401 | Token JWT expirado -- utilize o refresh token |
INVALID_API_KEY | 401 | API Key invalida ou revogada |
FORBIDDEN | 403 | Sem permissao para acessar este recurso |
ORGANIZATION_SUSPENDED | 403 | Organizacao suspensa -- entre em contato com o suporte |
Erros de plano e limites
| Codigo | HTTP | Descricao |
|---|---|---|
PLAN_LIMIT_EXCEEDED | 402 | Limite de documentos do plano atingido |
FEATURE_NOT_AVAILABLE | 402 | Funcionalidade nao disponivel no seu plano |
RATE_LIMIT_EXCEEDED | 429 | Limite de requisicoes por minuto excedido |
Erros de recurso
| Codigo | HTTP | Descricao |
|---|---|---|
RESOURCE_NOT_FOUND | 404 | O recurso solicitado nao foi encontrado |
ENVELOPE_NOT_FOUND | 404 | Envelope nao encontrado |
DOCUMENT_NOT_FOUND | 404 | Documento nao encontrado |
SIGNER_NOT_FOUND | 404 | Signatario nao encontrado |
TEMPLATE_NOT_FOUND | 404 | Modelo nao encontrado |
WEBHOOK_NOT_FOUND | 404 | Webhook nao encontrado |
Erros de conflito e estado
| Codigo | HTTP | Descricao |
|---|---|---|
RESOURCE_ALREADY_EXISTS | 409 | O recurso ja existe (ex: webhook duplicado) |
ENVELOPE_ALREADY_SENT | 409 | Envelope ja foi enviado para assinatura |
ENVELOPE_ALREADY_CANCELED | 409 | Envelope ja foi cancelado |
ENVELOPE_ALREADY_COMPLETED | 409 | Envelope ja foi completado (todos assinaram) |
INVALID_ENVELOPE_STATE | 422 | Acao invalida para o estado atual do envelope |
SIGNER_ALREADY_SIGNED | 409 | Signatario ja assinou este envelope |
Erros internos
| Codigo | HTTP | Descricao |
|---|---|---|
INTERNAL_ERROR | 500 | Erro interno inesperado |
SERVICE_UNAVAILABLE | 503 | Servico temporariamente indisponivel |
Exemplos de respostas de erro
400 - Erro de validacao
{
"error": {
"code": "VALIDATION_ERROR",
"message": "A requisicao contem campos invalidos.",
"details": [
{
"field": "signers[0].email",
"message": "Email invalido"
},
{
"field": "signers[0].name",
"message": "O campo 'name' e obrigatorio"
}
]
}
}
401 - Token expirado
{
"error": {
"code": "TOKEN_EXPIRED",
"message": "O token de acesso expirou. Utilize o refresh token para obter um novo.",
"details": {
"expired_at": "2026-03-29T14:30:00Z"
}
}
}
402 - Limite do plano
{
"error": {
"code": "PLAN_LIMIT_EXCEEDED",
"message": "Voce atingiu o limite de documentos do seu plano.",
"details": {
"plan": "Profissional",
"limit": 100,
"used": 100,
"upgrade_url": "https://app.tapsign.com.br/settings/billing"
}
}
}
403 - Sem permissao
{
"error": {
"code": "FORBIDDEN",
"message": "Voce nao tem permissao para acessar este recurso.",
"details": {
"required_permission": "envelopes:write",
"your_permissions": ["envelopes:read", "documents:read"]
}
}
}
404 - Recurso nao encontrado
{
"error": {
"code": "ENVELOPE_NOT_FOUND",
"message": "Envelope nao encontrado.",
"details": {
"envelope_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
}
}
409 - Conflito de estado
{
"error": {
"code": "ENVELOPE_ALREADY_SENT",
"message": "Este envelope ja foi enviado para assinatura e nao pode ser modificado.",
"details": {
"envelope_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"sent_at": "2026-03-29T10:00:00Z",
"status": "sent"
}
}
}
422 - Estado invalido
{
"error": {
"code": "INVALID_ENVELOPE_STATE",
"message": "Nao e possivel enviar um envelope sem signatarios.",
"details": {
"envelope_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"current_status": "draft",
"required": "Adicione pelo menos um signatario antes de enviar"
}
}
}
429 - Rate limit
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Limite de requisicoes excedido. Tente novamente em 32 segundos.",
"details": {
"limit": 300,
"remaining": 0,
"reset_at": "2026-03-29T14:01:00Z",
"retry_after": 32
}
}
}
500 - Erro interno
{
"error": {
"code": "INTERNAL_ERROR",
"message": "Ocorreu um erro interno. Tente novamente em alguns instantes.",
"details": {
"request_id": "req_abc123def456"
}
}
}
Erros 500
Se voce receber um erro 500, inclua o request_id ao entrar em contato com o suporte pelo email suporte@tapsign.com.br. Isso nos ajuda a investigar o problema rapidamente.
Tratamento de erros
Exemplo em JavaScript
async function createEnvelope(data) {
const response = await fetch('https://api.tapsign.com.br/v1/envelopes', {
method: 'POST',
headers: {
'Authorization': 'Bearer tsk_live_abc123def456',
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
});
if (!response.ok) {
const body = await response.json();
const error = body.error;
switch (error.code) {
case 'VALIDATION_ERROR':
// Tratar campos invalidos
console.error('Campos invalidos:', error.details);
break;
case 'TOKEN_EXPIRED':
// Renovar token e tentar novamente
await refreshToken();
return createEnvelope(data);
case 'PLAN_LIMIT_EXCEEDED':
// Notificar usuario sobre limite do plano
console.error('Limite do plano atingido');
break;
case 'RATE_LIMIT_EXCEEDED':
// Aguardar e tentar novamente
const retryAfter = error.details.retry_after;
await new Promise(r => setTimeout(r, retryAfter * 1000));
return createEnvelope(data);
default:
console.error(`Erro ${error.code}: ${error.message}`);
}
throw new Error(error.message);
}
return response.json();
}
Exemplo em Python
import requests
import time
def create_envelope(data):
response = requests.post(
"https://api.tapsign.com.br/v1/envelopes",
headers={
"Authorization": "Bearer tsk_live_abc123def456",
"Content-Type": "application/json"
},
json=data
)
if not response.ok:
error = response.json()["error"]
if error["code"] == "VALIDATION_ERROR":
print(f"Campos invalidos: {error['details']}")
elif error["code"] == "TOKEN_EXPIRED":
refresh_token()
return create_envelope(data)
elif error["code"] == "PLAN_LIMIT_EXCEEDED":
print("Limite do plano atingido")
elif error["code"] == "RATE_LIMIT_EXCEEDED":
retry_after = error["details"]["retry_after"]
time.sleep(retry_after)
return create_envelope(data)
raise Exception(f"{error['code']}: {error['message']}")
return response.json()
Boas praticas
- Sempre verifique o campo
codepara tratamento programatico -- nao dependa da mensagem - Implemente retry para erros 429 e 500 -- use backoff exponencial
- Logue o
request_idde erros 500 para facilitar o suporte - Trate erros 401 renovando o token automaticamente quando possivel
- Valide dados localmente antes de enviar para a API para reduzir erros 400
Proxima secao: Documentos -- Crie documentos via API.