API
API pública.
REST simples, chave no header, rate limit generoso. Crie links programaticamente via CI/CD, bot de WhatsApp, webhook — qualquer coisa que fale HTTP.
01Autenticação
Todas as requests precisam incluir uma API Key no header Authorization. API Keys estão disponíveis exclusivamente no plano Business.
Gere sua key em Dashboard → API.
Authorization: Bearer lks_sua_api_key_aqui02Base URL
https://greedy-bat-366.convex.site03Criar link
POST
/api/v1/linksRequest body
{
"url": "https://example.com/minha-pagina-muito-longa",
"title": "Minha Página" // opcional
}Response (201)
{
"data": {
"id": "k97f9ja122...",
"shortCode": "kPOYCu",
"shortUrl": "https://linkshort.com.br/kPOYCu",
"originalUrl": "https://example.com/minha-pagina-muito-longa"
}
}Exemplos
cURL
curl -X POST https://greedy-bat-366.convex.site/api/v1/links \
-H "Authorization: Bearer lks_sua_key" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com"}'JavaScript
const res = await fetch("https://greedy-bat-366.convex.site/api/v1/links", {
method: "POST",
headers: {
"Authorization": "Bearer lks_sua_key",
"Content-Type": "application/json",
},
body: JSON.stringify({ url: "https://example.com" }),
});
const data = await res.json();Python
import requests
res = requests.post(
"https://greedy-bat-366.convex.site/api/v1/links",
headers={"Authorization": "Bearer lks_sua_key"},
json={"url": "https://example.com"},
)
data = res.json()04Listar links
GET
/api/v1/linksQuery params
| Param | Default | Descrição |
|---|---|---|
| limit | 20 | Quantidade de itens por página (1–100) |
| offset | 0 | Quantos itens pular (paginação) |
Response (200)
{
"data": [
{
"id": "k97f9ja122...",
"shortCode": "kPOYCu",
"shortUrl": "https://linkshort.com.br/kPOYCu",
"originalUrl": "https://example.com",
"clicks": 42,
"createdAt": 1712620800000
}
],
"meta": { "total": 42, "limit": 20, "offset": 0 }
}05Detalhes do link
GET
/api/v1/links/{linkId}Retorna detalhes completos do link incluindo estatísticas básicas (top 5 países, dispositivos e navegadores).
Response (200)
{
"data": {
"id": "k97f9ja122...",
"shortCode": "kPOYCu",
"shortUrl": "https://linkshort.com.br/kPOYCu",
"originalUrl": "https://example.com",
"title": "Minha Página",
"clicks": 42,
"isActive": true,
"createdAt": 1712620800000,
"stats": {
"totalClicks": 42,
"topCountries": [{ "key": "BR", "count": 30 }],
"topDevices": [{ "key": "mobile", "count": 25 }],
"topBrowsers": [{ "key": "Chrome", "count": 28 }]
}
}
}06Desativar link
DELETE
/api/v1/links/{linkId}Soft delete — marca o link como inativo. Redirecionamentos passam a retornar 410 Gone. Os dados ficam preservados pra histórico.
Response (200)
{ "data": { "ok": true } }07Rate limiting
Limite de 100 requests por minuto por API Key.
| Header | Valor | Descrição |
|---|---|---|
| X-RateLimit-Limit | 100 | Limite máximo na janela |
| X-RateLimit-Remaining | — | Requests restantes na janela atual |
| X-RateLimit-Reset | — | Unix timestamp do reset da janela |
08Erros
| Status | Código | Descrição |
|---|---|---|
| 400 | MISSING_URL | Campo url ausente no body |
| 401 | UNAUTHORIZED | API key ausente ou inválida |
| 403 | FORBIDDEN | Plano não permite acesso à API |
| 404 | NOT_FOUND | Link não encontrado |
| 429 | RATE_LIMITED | Limite de requests excedido |
Formato do erro
{
"error": {
"code": "UNAUTHORIZED",
"message": "Missing or invalid API key"
}
}