Autenticação e API Keys
🔐 Segurança primeiro: Como proteger suas chamadas à API e evitar duplicidades
Toda requisição à API Notifica precisa de autenticação. Este guia cobre:
- Como funcionam as API keys
- Criar, listar e revogar chaves
- Chaves de idempotência
- Boas práticas de segurança
Como funciona a autenticação
A Notifica usa Bearer Token no header Authorization:
Authorization: Bearer nk_live_xxxxx
Formato das chaves:
nk_live_— Chave de produção (envia notificações reais)nk_test_— Chave de sandbox (para desenvolvimento)
Criando API Keys
Via Dashboard (recomendado)
- Acesse Configurações → API Keys
- Clique em Nova API Key
- Defina:
- Nome: identificação (ex: "Backend Produção")
- Permissões: leitura, escrita ou ambas
- IPs permitidos (opcional): whitelist de IPs
- Copie a chave imediatamente — ela não aparece novamente!
Via API
curl -X POST https://app.usenotifica.com.br/api-keys \
-H "Authorization: Bearer nk_live_sua_chave_atual" \
-H "Content-Type: application/json" \
-d '{
"name": "Backend - Serviço de Cobrança",
"permissions": ["write", "read"],
"allowed_ips": ["201.45.123.0/24"]
}'
Resposta:
{
"id": "key_abc123",
"name": "Backend - Serviço de Cobrança",
"key": "nk_live_nova_chave_aqui_somente_uma_vez",
"permissions": ["write", "read"],
"allowed_ips": ["201.45.123.0/24"],
"created_at": "2024-01-15T14:30:00Z",
"last_used_at": null
}
Listando API Keys
curl https://app.usenotifica.com.br/api-keys \
-H "Authorization: Bearer nk_live_sua_chave"
Resposta:
{
"data": [
{
"id": "key_abc123",
"name": "Backend Produção",
"permissions": ["write", "read"],
"created_at": "2024-01-10T09:00:00Z",
"last_used_at": "2024-01-15T16:45:00Z"
}
],
"meta": {
"total": 1,
"page": 1
}
}
⚠️ Atenção: A chave real (key) nunca é retornada na listagem por segurança.
Revogando API Keys
Se uma chave for comprometida ou não for mais necessária:
curl -X DELETE https://app.usenotifica.com.br/api-keys/key_abc123 \
-H "Authorization: Bearer nk_live_sua_chave"
✅ Revogação imediata: Todas as requisições com essa chave falharão instantaneamente.
Idempotência (Evite duplicatas)
O header Idempotency-Key garante que a mesma requisição POST não execute duas vezes.
Quando usar:
- Envio de notificações críticas (faturas, alertas)
- Retry automático em caso de timeout
- Webhooks que podem disparar múltiplas vezes
Como funciona
# Primeira requisição
IDEMPOTENCY_KEY="$(uuidgen)"
curl -X POST https://app.usenotifica.com.br/v1/notifications \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: $IDEMPOTENCY_KEY" \
-d '{...}'
# → 201 Created, notificação enviada
# Segunda requisição (mesmo idempotency key)
curl -X POST https://app.usenotifica.com.br/v1/notifications \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: $IDEMPOTENCY_KEY" \
-d '{...}'
# → 200 OK, retorna a mesma resposta sem criar duplicata
Implementação em código
Node.js:
const { randomUUID } = require('crypto');
async function enviarComIdempotencia(payload) {
const idempotencyKey = randomUUID(); // ou use ID do seu banco
return fetch('https://app.usenotifica.com.br/v1/notifications', {
method: 'POST',
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Idempotency-Key': idempotencyKey,
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
});
}
Python:
import uuid
idempotency_key = str(uuid.uuid4())
# ou use: idempotency_key = f"payment-{payment_id}"
response = requests.post(
f'{BASE_URL}/notifications',
headers={
'Authorization': f'Bearer {API_KEY}',
'Idempotency-Key': idempotency_key
},
json=payload
)
Dicas:
- Reutilize IDs do seu sistema (ex:
payment-12345) - Chaves ficam em cache por 24 horas
- Apenas POST requests suportam idempotência
Segurança: Boas Práticas
✅ Faça
- Use variáveis de ambiente para API keys
- Crie chaves separadas por ambiente (dev/staging/prod)
- Restrinja por IP quando possível
- Use idempotency keys em operações críticas
- Rotacione chaves periodicamente (a cada 90 dias)
❌ Nunca
- Commite chaves em repositórios
- Compartilhe chaves entre equipes
- Use chaves de produção em localhost
- Logue chaves em sistemas de monitoramento
Código completo: Segurança na prática
Node.js (com dotenv)
require('dotenv').config();
const API_KEY = process.env.NOTIFICA_API_KEY;
if (!API_KEY) {
throw new Error('NOTIFICA_API_KEY não configurada');
}
async function notificaRequest(endpoint, options = {}) {
const url = `https://app.usenotifica.com.br/v1${endpoint}`;
const response = await fetch(url, {
...options,
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
...options.headers
}
});
if (!response.ok) {
const error = await response.json().catch(() => ({}));
throw new Error(error.message || `HTTP ${response.status}`);
}
return response.json();
}
// Uso
notificaRequest('/notifications', {
method: 'POST',
headers: { 'Idempotency-Key': crypto.randomUUID() },
body: JSON.stringify({ to: { email: '[email protected]' }, ... })
});
Python (com python-dotenv)
import os
from dotenv import load_dotenv
import requests
load_dotenv()
API_KEY = os.getenv('NOTIFICA_API_KEY')
if not API_KEY:
raise ValueError('NOTIFICA_API_KEY não configurada')
class NotificaClient:
BASE_URL = 'https://app.usenotifica.com.br/v1'
def __init__(self, api_key):
self.api_key = api_key
self.session = requests.Session()
self.session.headers.update({
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
})
def request(self, method, endpoint, **kwargs):
url = f'{self.BASE_URL}{endpoint}'
response = self.session.request(method, url, **kwargs)
response.raise_for_status()
return response.json()
def send_notification(self, payload, idempotency_key=None):
headers = {}
if idempotency_key:
headers['Idempotency-Key'] = idempotency_key
return self.request('POST', '/notifications',
headers=headers, json=payload)
# Uso
client = NotificaClient(API_KEY)
client.send_notification(
payload={'to': {'email': '[email protected]'}, ...},
idempotency_key=str(uuid.uuid4())
)
Variáveis de ambiente (.env)
# .env (nunca commit!)
NOTIFICA_API_KEY=nk_live_sua_chave_secreta
NOTIFICA_API_KEY_TEST=nk_test_chave_sandbox
# Opcional: para webhook verification
NOTIFICA_WEBHOOK_SECRET=whsec_xxx
Troubleshooting
401 Unauthorized
{"error": "invalid_api_key", "message": "API key inválida ou revogada"}
Causas comuns:
- Chave copiada incompleta (faltou
nk_live_) - Chave foi revogada
- Header mal formatado (esqueceu "Bearer")
403 Forbidden
{"error": "insufficient_permissions", "message": "Chave só tem permissão de leitura"}
Causas comuns:
- Chave criada apenas com permissão
read - IP não está na whitelist configurada
FAQ
Q: Posso ter múltiplas chaves ativas?
A: Sim! Recomendamos criar chaves separadas por serviço/equipe.
Q: As chaves expiram?
A: Não automaticamente. Revogue manualmente quando não for mais necessária.
Q: Como descubro qual chave fez uma requisição?
A: No dashboard, em Logs de API, você vê a chave ID (últimos 4 caracteres).
Q: Posso restringir chaves por endpoint?
A: Por enquanto, apenas por permissão (read/write) e IP. Granularidade por endpoint em breve!
Próximo passo
Agora que você domina autenticação, aprenda a gerenciar Assinantes — a base de qualquer sistema de notificações.