Documentação
API Reference v1
Tudo que você precisa para integrar o Inovgest Short à sua aplicação. Endpoints, autenticação, exemplos em múltiplas linguagens e referência completa.
Início Rápido
Crie seu primeiro link encurtado em 3 passos simples.
Passo 1: Crie sua chave
- 1
Crie sua conta e gere uma chave de API
Acesse o site e crie sua conta. Vá em Painel → Configurações → Chaves de API, clique em "Criar Nova Chave", dê um nome (ex: "Meu Teste"), marque os escopos links:read e links:write, e copie a chave imediatamente — ela começa com
isk_.
Atenção
Passo 2: Encurte uma URL
Abra o terminal e cole o comando abaixo (substituindo SUA_CHAVE pela chave que você copiou):
curl -X POST https://short.inovgest.com/api/v1/links \
-H "Authorization: Bearer isk_SUA_CHAVE_AQUI" \
-H "Content-Type: application/json" \
-d '{"url": "https://google.com"}'Dica
Passo 3: Veja o resultado
Se deu certo, você recebe uma resposta assim:
{
"data": {
"id": "691NF0rKKV8KtlsxK6P4M",
"slug": "aB3cD5e",
"url": "https://google.com",
"title": "",
"clicks": 0,
"tags": [],
"archived": false,
"hasPassword": false,
"domain": "invgst.com",
"createdAt": "2026-02-26T12:00:00.000Z",
"expiresAt": null
}
}A URL curta é montada como https://{domain}/{slug}. Exemplo: https://invgst.com/aB3cD5e. Abra no navegador e ele redireciona para o destino.
E se deu erro?
| Erro | Significado | O que fazer |
|---|---|---|
401 UNAUTHORIZED | Chave inválida ou ausente | Verifique se copiou a chave corretamente e se o header está como `Bearer isk_...` |
422 VALIDATION_ERROR | URL inválida | A URL precisa começar com `http://` ou `https://` |
403 PLAN_LIMIT_EXCEEDED | Limite do plano atingido | Você já usou todas as criações do mês. Aguarde o próximo ciclo ou faça upgrade |
429 RATE_LIMIT_EXCEEDED | Muitas requisições | Aguarde alguns segundos e tente novamente |
Autenticação
Todas as chamadas à API devem incluir a chave no header Authorization.
Criando uma Chave de API
- 1
Via Painel
Acesse Painel → Configurações → Chaves de API, clique em "Criar Nova Chave", defina um nome descritivo e selecione os escopos desejados. Copie a chave imediatamente — ela não será exibida novamente.
Formato da Chave
isk_Ab3Cd5Ef7Gh9Ij1Kl3Mn5Op7Qr9St1Uv
│ └──────── 32 caracteres Base62 ────────┘
└── prefixo fixo- Prefixo
isk_(Inovgest Short Key) - 32 caracteres aleatórios em Base62 (
0-9,A-Z,a-z) - Armazenada como hash bcrypt — a chave bruta não pode ser recuperada
Escopos Disponíveis
| Escopo | Permissão |
|---|---|
links:read | Listar e visualizar links |
links:write | Criar, atualizar e excluir links |
analytics:read | Consultar estatísticas de cliques |
| Plano | Chaves |
|---|---|
| Free | 1 |
| Starter | 5 |
| Pro | 20 |
| Business | Ilimitado |
Processo de Validação
Cada requisição passa por 7 etapas de validação:
- Extrai o token do header `Authorization: Bearer ...`
- Busca a chave pelo prefixo no banco de dados
- Verifica o hash bcrypt contra o token fornecido
- Verifica se a chave não está expirada
- Valida se a chave possui o escopo necessário para a rota
- Confirma que o time (team) associado à chave é válido
- Aplica rate limiting baseado no tier
curl -H "Authorization: Bearer isk_Ab3Cd5Ef7Gh9Ij1Kl3Mn5Op7Qr9St1Uv" \
https://short.inovgest.com/api/v1/linksRate Limiting
O rate limiting usa o algoritmo sliding window via Upstash Redis.
Tiers de Limite
| Tier | Limite | Identificador |
|---|---|---|
| Anônimo | 10 req/min | IP |
| Sessão autenticada | 60 req/min | User ID |
| API Key | 120 req/min | Key ID |
Limites por Endpoint
Além dos limites globais, alguns endpoints possuem limites mais restritivos para prevenir abuso:
| Endpoint | Limite | Tier |
|---|---|---|
POST /api/v1/links | 10 req/min | Sessão autenticada |
POST /api/v1/links | 20 req/min | API Key |
POST /api/v1/report | 5 req/hora | Anônimo (IP) |
Resposta 429
Quando o limite é excedido, a API retorna um header Retry-After com um valor inteiro em segundos indicando quanto tempo aguardar (ex: 45).
HTTP/1.1 429 Too Many Requests
Retry-After: 45
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Muitas requisições. Tente novamente em 45 segundos."
}
}API de Links
Endpoints para criar, listar, obter, atualizar e excluir links encurtados.
Identificadores
691NF0rKKV8KtlsxK6P4M). Nunca trate IDs como inteiros.Montando a URL curta
domain e slug separados. A URL curta completa é https://{domain}/{slug}. Exemplo: com domain: "invgst.com" e slug: "verao-2026", a URL curta é https://invgst.com/verao-2026.Padrões de resposta em listagens
GET /links, GET /tags/{tag}/links, GET /domains) retorna data.items[] com data.pagination {page, perPage, total, totalPages}. Array direto (GET /tags, GET /campaigns, GET /campaigns/{id}/links) retorna data como array, sem paginação.Criar Link
/api/v1/linkslinks:writeCriar Link
Cria um novo link encurtado. Segmentação geográfica, por dispositivo e teste A/B são mutuamente exclusivos — apenas um pode ser usado por link.
Corpo da Requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
url | string | Sim | URL de destino (deve começar com `http://` ou `https://`) |
slug | string | Não | Slug personalizado (ex: `minha-promo`) |
title | string | Não | Título descritivo (máx. 200 caracteres) |
tags | string[] | Não | Tags para organização (máx. 20 tags, 50 chars cada) |
expiresAt | string (ISO) | Não | Data de expiração (deve ser no futuro). Aceita qualquer formato ISO 8601 válido: 2026-03-31T23:59:59.000Z, 2026-03-31T23:59, 2026-03-31. Datas sem timezone são interpretadas como UTC. |
password | string | Não | Senha para proteger o link (Starter+) |
domain | string | Não | Domínio personalizado (padrão: `invgst.com`) |
utmSource | string | Não | UTM Source (Starter+) |
utmMedium | string | Não | UTM Medium (Starter+) |
utmCampaign | string | Não | UTM Campaign (Starter+) |
utmTerm | string | Não | UTM Term (máx. 200 caracteres, Starter+) |
utmContent | string | Não | UTM Content (máx. 200 caracteres, Starter+) |
deviceTargetIos | string | Não | URL alternativa para iOS (Starter+) |
deviceTargetAndroid | string | Não | URL alternativa para Android (Starter+) |
deviceTargetDesktop | string | Não | URL alternativa para Desktop (Starter+) |
geoTargets | object[] | Não | Redirecionamento por país. Campos: `country` (ISO 2 letras), `countryName`, `url` (Starter+) |
abTestEnabled | boolean | Não | Ativar teste A/B (Starter+) |
abTestVariants | object[] | Não | Variantes do teste A/B (min 2, máx depende do plano). Campos: `id`, `name`, `url`, `weight` (Starter+) |
curl -X POST https://short.inovgest.com/api/v1/links \
-H "Authorization: Bearer isk_SuaChaveAqui" \
-H "Content-Type: application/json" \
-d '{
"url": "https://meusite.com.br/campanha-verao",
"slug": "verao-2026",
"title": "Campanha de Verão 2026",
"tags": ["marketing", "verao"],
"expiresAt": "2026-03-31T23:59:59.000Z",
"utmSource": "newsletter",
"utmMedium": "email",
"utmCampaign": "verao-2026"
}'{
"data": {
"id": "q0RSLVoQ7ZeML95GmaxuI",
"slug": "verao-2026",
"url": "https://meusite.com.br/campanha-verao",
"title": "Campanha de Verão 2026",
"tags": ["marketing", "verao"],
"clicks": 0,
"archived": false,
"hasPassword": false,
"domain": "invgst.com",
"expiresAt": "2026-03-31T23:59:59.000Z",
"createdAt": "2026-02-26T12:00:00.000Z",
"utm": {
"source": "newsletter",
"medium": "email",
"campaign": "verao-2026"
}
}
}Regras do Slug
^[a-z0-9]+(-[a-z0-9]+)*$. Se omitido, um código de 7 caracteres Base62 é gerado automaticamente.Com Segmentação Geográfica
/api/v1/linkslinks:writeCriar Link com Segmentação Geográfica
Redireciona visitantes para URLs diferentes com base no país de origem. Visitantes de países não listados usam a URL principal.
curl -X POST https://short.inovgest.com/api/v1/links \
-H "Authorization: Bearer isk_SuaChaveAqui" \
-H "Content-Type: application/json" \
-d '{
"url": "https://store.example.com",
"title": "Loja Global",
"geoTargets": [
{ "country": "BR", "countryName": "Brasil", "url": "https://loja.example.com.br" },
{ "country": "PT", "countryName": "Portugal", "url": "https://loja.example.pt" }
]
}'{
"data": {
"id": "Kt7mNpR2vXwL8dFhYs3qJ",
"slug": "Kx9mRtP",
"url": "https://store.example.com",
"title": "Loja Global",
"tags": [],
"clicks": 0,
"archived": false,
"hasPassword": false,
"domain": "invgst.com",
"createdAt": "2026-03-23T14:00:00.000Z",
"geoTargets": [
{ "country": "BR", "countryName": "Brasil", "url": "https://loja.example.com.br" },
{ "country": "PT", "countryName": "Portugal", "url": "https://loja.example.pt" }
]
}
}Com Segmentação por Dispositivo
/api/v1/linkslinks:writeCriar Link com Segmentação por Dispositivo
Redireciona visitantes para URLs diferentes com base no dispositivo (iOS, Android, Desktop). Campos não preenchidos usam a URL principal.
curl -X POST https://short.inovgest.com/api/v1/links \
-H "Authorization: Bearer isk_SuaChaveAqui" \
-H "Content-Type: application/json" \
-d '{
"url": "https://meuapp.com",
"title": "Download do App",
"deviceTargetIos": "https://apps.apple.com/app/meuapp/id123",
"deviceTargetAndroid": "https://play.google.com/store/apps/details?id=com.meuapp",
"deviceTargetDesktop": "https://meuapp.com/download"
}'{
"data": {
"id": "Wn5bHcT9kRzP4mJvAs6xQ",
"slug": "Qw7nBvL",
"url": "https://meuapp.com",
"title": "Download do App",
"tags": [],
"clicks": 0,
"archived": false,
"hasPassword": false,
"domain": "invgst.com",
"createdAt": "2026-03-23T14:00:00.000Z",
"deviceTargets": {
"ios": "https://apps.apple.com/app/meuapp/id123",
"android": "https://play.google.com/store/apps/details?id=com.meuapp",
"desktop": "https://meuapp.com/download"
}
}
}Com Teste A/B
/api/v1/linkslinks:writeCriar Link com Teste A/B
Distribui o tráfego entre variantes para comparar desempenho. Cada variante precisa de `id`, `name`, `url` e `weight` (soma dos pesos = 100%).
curl -X POST https://short.inovgest.com/api/v1/links \
-H "Authorization: Bearer isk_SuaChaveAqui" \
-H "Content-Type: application/json" \
-d '{
"url": "https://meusite.com.br/landing",
"title": "Teste Landing Page",
"abTestEnabled": true,
"abTestVariants": [
{ "id": "a1", "name": "Variante A", "url": "https://meusite.com.br/landing-v1", "weight": 50 },
{ "id": "b2", "name": "Variante B", "url": "https://meusite.com.br/landing-v2", "weight": 50 }
]
}'{
"data": {
"id": "Fy8dKwM3nQtR6pLxBv2jH",
"slug": "Zt2pHcW",
"url": "https://meusite.com.br/landing",
"title": "Teste Landing Page",
"tags": [],
"clicks": 0,
"archived": false,
"hasPassword": false,
"domain": "invgst.com",
"createdAt": "2026-03-23T14:00:00.000Z",
"abTestEnabled": true,
"abTestVariants": [
{ "id": "a1", "name": "Variante A", "url": "https://meusite.com.br/landing-v1", "weight": 50 },
{ "id": "b2", "name": "Variante B", "url": "https://meusite.com.br/landing-v2", "weight": 50 }
]
}
}Listar Links
/api/v1/linkslinks:readListar Links
Lista links com filtros e paginação.
Parâmetros de Query
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
q | string | Não | Busca por texto (máx. 100 caracteres) |
status | enum | Não | Filtro: `all`, `active`, `archived`, `expired`(padrão: all) |
sort | enum | Não | Ordenar por: `createdAt`, `clicks`, `title`(padrão: createdAt) |
order | enum | Não | Direção: `asc`, `desc`(padrão: desc) |
page | number | Não | Página (mínimo 1)(padrão: 1) |
perPage | number | Não | Itens por página (1-100)(padrão: 20) |
curl "https://short.inovgest.com/api/v1/links?status=active&sort=clicks&order=desc" \
-H "Authorization: Bearer isk_SuaChaveAqui"{
"data": {
"items": [
{
"id": "q0RSLVoQ7ZeML95GmaxuI",
"slug": "verao-2026",
"url": "https://meusite.com.br/campanha-verao",
"title": "Campanha de Verão 2026",
"clicks": 142,
"tags": ["marketing", "verao"],
"archived": false,
"hasPassword": false,
"domain": "invgst.com",
"expiresAt": "2026-03-31T23:59:59.000Z",
"createdAt": "2026-02-26T12:00:00.000Z"
}
],
"pagination": {
"page": 1,
"perPage": 10,
"total": 45,
"totalPages": 5
}
}
}Obter Link
/api/v1/links/{id}links:readObter Link
Retorna os detalhes completos de um link pelo seu ID.
curl https://short.inovgest.com/api/v1/links/q0RSLVoQ7ZeML95GmaxuI \
-H "Authorization: Bearer isk_SuaChaveAqui"{
"data": {
"id": "q0RSLVoQ7ZeML95GmaxuI",
"slug": "verao-2026",
"url": "https://meusite.com.br/campanha-verao",
"title": "Campanha de Verão 2026",
"tags": ["marketing", "verao"],
"clicks": 142,
"archived": false,
"hasPassword": false,
"domain": "invgst.com",
"expiresAt": "2026-03-31T23:59:59.000Z",
"createdAt": "2026-02-26T12:00:00.000Z"
}
}Atualizar Link
/api/v1/links/{id}links:writeAtualizar Link
Atualização parcial — envie apenas os campos que deseja alterar. Aceita os mesmos campos do Criar Link, incluindo segmentação e teste A/B.
Corpo da Requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
url | string | Sim | URL de destino (deve começar com `http://` ou `https://`) |
slug | string | Não | Slug personalizado (ex: `minha-promo`) |
title | string | Não | Título descritivo (máx. 200 caracteres) |
tags | string[] | Não | Tags para organização (máx. 20 tags, 50 chars cada) |
expiresAt | string (ISO) | Não | Data de expiração (deve ser no futuro). Aceita qualquer formato ISO 8601 válido: 2026-03-31T23:59:59.000Z, 2026-03-31T23:59, 2026-03-31. Datas sem timezone são interpretadas como UTC. |
password | string | Não | Senha para proteger o link (Starter+) |
domain | string | Não | Domínio personalizado (padrão: `invgst.com`) |
utmSource | string | Não | UTM Source (Starter+) |
utmMedium | string | Não | UTM Medium (Starter+) |
utmCampaign | string | Não | UTM Campaign (Starter+) |
utmTerm | string | Não | UTM Term (máx. 200 caracteres, Starter+) |
utmContent | string | Não | UTM Content (máx. 200 caracteres, Starter+) |
deviceTargetIos | string | Não | URL alternativa para iOS (Starter+) |
deviceTargetAndroid | string | Não | URL alternativa para Android (Starter+) |
deviceTargetDesktop | string | Não | URL alternativa para Desktop (Starter+) |
geoTargets | object[] | Não | Redirecionamento por país. Campos: `country` (ISO 2 letras), `countryName`, `url` (Starter+) |
abTestEnabled | boolean | Não | Ativar teste A/B (Starter+) |
abTestVariants | object[] | Não | Variantes do teste A/B (min 2, máx depende do plano). Campos: `id`, `name`, `url`, `weight` (Starter+) |
curl -X PATCH https://short.inovgest.com/api/v1/links/q0RSLVoQ7ZeML95GmaxuI \
-H "Authorization: Bearer isk_SuaChaveAqui" \
-H "Content-Type: application/json" \
-d '{
"url": "https://meusite.com.br/nova-pagina",
"title": "Novo Título"
}'{
"data": {
"id": "q0RSLVoQ7ZeML95GmaxuI",
"slug": "verao-2026",
"url": "https://meusite.com.br/nova-pagina",
"title": "Novo Título",
"tags": ["marketing", "verao"],
"clicks": 142,
"archived": false,
"hasPassword": false,
"domain": "invgst.com",
"expiresAt": "2026-03-31T23:59:59.000Z",
"createdAt": "2026-02-26T12:00:00.000Z"
}
}Remover campos opcionais
null. Exemplo: { "title": null, "password": null, "expiresAt": null }Excluir Link
/api/v1/links/{id}links:writeExcluir Link
Remove permanentemente um link. Retorna `204 No Content`.
curl -X DELETE https://short.inovgest.com/api/v1/links/q0RSLVoQ7ZeML95GmaxuI \
-H "Authorization: Bearer isk_SuaChaveAqui"HTTP/1.1 204 No ContentImportação em Massa
Disponibilidade
Limites por Plano
| Plano | Máx. Linhas |
|---|---|
| Free | Não disponível |
| Starter | 100 linhas |
| Pro | 500 linhas |
| Business | 1.000 linhas |
Formato da Requisição
/api/v1/links/bulklinks:writeImportação em Massa
Cria múltiplos links em uma única requisição. Disponível a partir do plano Starter. Processamento em lotes de 20 linhas.
curl -X POST https://short.inovgest.com/api/v1/links/bulk \
-H "Authorization: Bearer isk_SuaChaveAqui" \
-H "Content-Type: application/json" \
-d '{
"rows": [
{ "url": "https://site1.com", "slug": "site-um", "title": "Site Um" },
{ "url": "https://site2.com", "title": "Site Dois" },
{ "url": "https://site3.com", "tags": ["campanha"] }
]
}'{
"data": {
"total": 3,
"success": 2,
"errors": 1,
"rows": [
{ "url": "https://site1.com", "slug": "site-um", "status": "success" },
{ "url": "https://site2.com", "slug": "aB3cD5e", "status": "success" },
{ "url": "https://site3.com", "slug": null, "status": "error", "errorMessage": "Este slug já está em uso" }
]
}
}Analytics
Consultar Estatísticas
/api/v1/links/{id}/statsanalytics:readEstatísticas do Link
Consulta as estatísticas de cliques de um link.
Parâmetros de Query
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
period | enum | Não | Período: `7d`, `30d`, `90d`(padrão: 30d) |
type | enum | Não | Use `ab-test` para analytics de teste A/B |
curl https://short.inovgest.com/api/v1/links/q0RSLVoQ7ZeML95GmaxuI/stats?period=30d \
-H "Authorization: Bearer isk_SuaChaveAqui"{
"data": {
"totalClicks": 1284,
"uniqueVisitors": 943,
"clicksOverTime": [
{ "date": "2026-02-01", "clicks": 42 },
{ "date": "2026-02-02", "clicks": 58 },
{ "date": "2026-02-03", "clicks": 37 }
],
"referrers": [
{ "source": "(Direto)", "count": 456, "percentage": 35.5 },
{ "source": "google.com", "count": 312, "percentage": 24.3 },
{ "source": "twitter.com", "count": 198, "percentage": 15.4 }
],
"locations": [
{ "country": "BR", "city": "São Paulo", "count": 542 },
{ "country": "BR", "city": "Rio de Janeiro", "count": 350 },
{ "country": "PT", "city": "Lisboa", "count": 187 }
],
"devices": [
{ "device": "Mobile", "count": 680, "percentage": 53.0 },
{ "device": "Desktop", "count": 542, "percentage": 42.2 },
{ "device": "Tablet", "count": 62, "percentage": 4.8 }
]
}
}Analytics de Teste A/B
/api/v1/links/{id}/stats?type=ab-testanalytics:readAnalytics de Teste A/B
Retorna estatísticas detalhadas por variante, incluindo significância estatística (chi-squared, p<0.05) e identificação do vencedor.
Parâmetros de Query
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
period | enum | Não | Período: `7d`, `30d`, `90d`(padrão: 30d) |
curl "https://short.inovgest.com/api/v1/links/clx2xyz9k8lmn/stats?period=30d&type=ab-test" \
-H "Authorization: Bearer isk_SuaChaveAqui"{
"data": {
"variants": [
{
"variantId": "a1",
"variantName": "Variante A",
"variantUrl": "https://meusite.com.br/landing-v1",
"weight": 50,
"totalClicks": 320,
"uniqueVisitors": 280,
"clicksOverTime": [{ "date": "2026-03-20", "clicks": 45 }],
"devices": [{ "device": "Mobile", "count": 200, "percentage": 62.5 }],
"locations": [{ "country": "BR", "city": "São Paulo", "count": 150 }]
},
{
"variantId": "b2",
"variantName": "Variante B",
"variantUrl": "https://meusite.com.br/landing-v2",
"weight": 50,
"totalClicks": 350,
"uniqueVisitors": 310,
"clicksOverTime": [{ "date": "2026-03-20", "clicks": 52 }],
"devices": [{ "device": "Mobile", "count": 220, "percentage": 62.9 }],
"locations": [{ "country": "BR", "city": "São Paulo", "count": 170 }]
}
],
"totalClicks": 670,
"isSignificant": false,
"winnerVariantId": null
}
}Retenção de Dados
| Plano | Retenção |
|---|---|
| Free | 30 dias |
| Starter | 60 dias |
| Pro | Ilimitada |
| Business | Ilimitada |
API de Campanhas
Agrupe links em campanhas para organizar e acompanhar métricas consolidadas.
Listar Campanhas
/api/v1/campaignslinks:readListar Campanhas
Lista campanhas com filtros e paginação.
Parâmetros de Query
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
q | string | Não | Busca por nome (máx. 100 caracteres) |
sort | enum | Não | Ordenar por: `createdAt`, `name`(padrão: createdAt) |
order | enum | Não | Direção: `asc`, `desc`(padrão: desc) |
page | number | Não | Página (mínimo 1)(padrão: 1) |
perPage | number | Não | Itens por página (1-100)(padrão: 20) |
curl "https://short.inovgest.com/api/v1/campaigns?sort=name&order=asc" \
-H "Authorization: Bearer isk_SuaChaveAqui"{
"data": [
{
"id": "691NF0rKKV8KtlsxK6P4M",
"name": "Campanha de Verão 2026",
"description": "Links promocionais para a temporada de verão",
"linkCount": 12,
"totalClicks": 3847,
"createdAt": "2026-02-15T10:00:00.000Z",
"updatedAt": "2026-02-15T10:00:00.000Z"
}
]
}Criar Campanha
/api/v1/campaignslinks:writeCriar Campanha
Cria uma nova campanha para agrupar links.
Corpo da Requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
name | string | Sim | Nome da campanha (1-200 caracteres) |
description | string | Não | Descrição (máx. 2000 caracteres) |
curl -X POST https://short.inovgest.com/api/v1/campaigns \
-H "Authorization: Bearer isk_SuaChaveAqui" \
-H "Content-Type: application/json" \
-d '{
"name": "Campanha de Verão 2026",
"description": "Links promocionais para a temporada de verão"
}'{
"data": {
"id": "691NF0rKKV8KtlsxK6P4M",
"name": "Campanha de Verão 2026",
"description": "Links promocionais para a temporada de verão",
"linkCount": 0,
"totalClicks": 0,
"createdAt": "2026-02-15T10:00:00.000Z",
"updatedAt": "2026-02-15T10:00:00.000Z"
}
}Obter Campanha
/api/v1/campaigns/{id}links:readObter Campanha
Retorna os detalhes de uma campanha, incluindo contagem de links e total de cliques.
curl https://short.inovgest.com/api/v1/campaigns/691NF0rKKV8KtlsxK6P4M \
-H "Authorization: Bearer isk_SuaChaveAqui"{
"data": {
"id": "691NF0rKKV8KtlsxK6P4M",
"name": "Campanha de Verão 2026",
"description": "Links promocionais para a temporada de verão",
"linkCount": 12,
"totalClicks": 3847,
"createdAt": "2026-02-15T10:00:00.000Z",
"updatedAt": "2026-02-15T10:00:00.000Z"
}
}Atualizar Campanha
/api/v1/campaigns/{id}links:writeAtualizar Campanha
Atualização parcial — envie apenas os campos que deseja alterar.
curl -X PATCH https://short.inovgest.com/api/v1/campaigns/691NF0rKKV8KtlsxK6P4M \
-H "Authorization: Bearer isk_SuaChaveAqui" \
-H "Content-Type: application/json" \
-d '{"name": "Campanha Verão 2026 — Atualizada"}'{
"data": {
"id": "691NF0rKKV8KtlsxK6P4M",
"name": "Campanha Verão 2026 — Atualizada",
"description": "Links promocionais para a temporada de verão",
"linkCount": 12,
"totalClicks": 3847,
"createdAt": "2026-02-15T10:00:00.000Z",
"updatedAt": "2026-03-10T14:30:00.000Z"
}
}Excluir Campanha
/api/v1/campaigns/{id}links:writeExcluir Campanha
Remove uma campanha. Os links associados não são excluídos, apenas desvinculados.
curl -X DELETE https://short.inovgest.com/api/v1/campaigns/691NF0rKKV8KtlsxK6P4M \
-H "Authorization: Bearer isk_SuaChaveAqui"HTTP/1.1 204 No ContentExclusão de campanhas
Links da Campanha
/api/v1/campaigns/{id}/linkslinks:readLinks da Campanha
Lista os links associados a uma campanha.
curl https://short.inovgest.com/api/v1/campaigns/691NF0rKKV8KtlsxK6P4M/links \
-H "Authorization: Bearer isk_SuaChaveAqui"{
"data": [
{
"id": "q0RSLVoQ7ZeML95GmaxuI",
"slug": "verao-2026",
"url": "https://meusite.com.br/campanha-verao",
"title": "Campanha de Verão 2026",
"clicks": 142,
"domain": "invgst.com",
"createdAt": "2026-02-26T12:00:00.000Z"
}
]
}Adicionar Link à Campanha
/api/v1/campaigns/{id}/linkslinks:writeAdicionar Link à Campanha
Adiciona um link existente a uma campanha.
Corpo da Requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
linkId | string | Sim | ID do link a adicionar |
curl -X POST https://short.inovgest.com/api/v1/campaigns/691NF0rKKV8KtlsxK6P4M/links \
-H "Authorization: Bearer isk_SuaChaveAqui" \
-H "Content-Type: application/json" \
-d '{"linkId": "q0RSLVoQ7ZeML95GmaxuI"}'{
"data": {
"id": "q0RSLVoQ7ZeML95GmaxuI",
"slug": "verao-2026",
"url": "https://meusite.com.br/campanha-verao",
"title": "Campanha de Verão 2026",
"clicks": 142,
"domain": "invgst.com",
"createdAt": "2026-02-26T12:00:00.000Z"
}
}Remover Link da Campanha
/api/v1/campaigns/{id}/links/{linkId}links:writeRemover Link da Campanha
Remove um link de uma campanha (sem excluir o link).
curl -X DELETE https://short.inovgest.com/api/v1/campaigns/691NF0rKKV8KtlsxK6P4M/links/q0RSLVoQ7ZeML95GmaxuI \
-H "Authorization: Bearer isk_SuaChaveAqui"HTTP/1.1 204 No ContentAnalytics da Campanha
/api/v1/campaigns/{id}/statsanalytics:readAnalytics da Campanha
Consulta estatísticas consolidadas de todos os links da campanha.
Parâmetros de Query
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
period | enum | Não | Período: `7d`, `30d`, `90d`, `all`(padrão: 30d) |
curl https://short.inovgest.com/api/v1/campaigns/691NF0rKKV8KtlsxK6P4M/stats?period=30d \
-H "Authorization: Bearer isk_SuaChaveAqui"{
"data": {
"totalClicks": 3847,
"uniqueVisitors": 2891,
"clicksOverTime": [
{ "date": "2026-02-01", "clicks": 120 },
{ "date": "2026-02-02", "clicks": 145 }
],
"referrers": [
{ "source": "(Direto)", "count": 1200, "percentage": 31.2 }
],
"locations": [
{ "country": "BR", "city": "São Paulo", "count": 1542 }
],
"devices": [
{ "device": "Mobile", "count": 2100, "percentage": 54.6 }
]
}
}API de Tags
Consulte tags existentes e acesse links e analytics filtrados por tag.
URL Encoding
{tag} precisa de URL encoding (encodeURIComponent). Exemplo: a tag verão 2026 deve ser acessada como /api/v1/tags/ver%C3%A3o%202026/links.Listar Tags
/api/v1/tagslinks:readListar Tags
Lista todas as tags do time, com contagem de links e total de cliques.
curl https://short.inovgest.com/api/v1/tags \
-H "Authorization: Bearer isk_SuaChaveAqui"{
"data": [
{
"tag": "marketing",
"linkCount": 24,
"totalClicks": 5672
},
{
"tag": "verao",
"linkCount": 8,
"totalClicks": 1234
}
]
}Links de uma Tag
/api/v1/tags/{tag}/linkslinks:readLinks de uma Tag
Lista links paginados que possuem uma tag específica.
Parâmetros de Query
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
page | number | Não | Página (mínimo 1)(padrão: 1) |
perPage | number | Não | Itens por página (1-100)(padrão: 20) |
curl "https://short.inovgest.com/api/v1/tags/marketing/links?page=1&perPage=10" \
-H "Authorization: Bearer isk_SuaChaveAqui"{
"data": {
"items": [
{
"id": "q0RSLVoQ7ZeML95GmaxuI",
"slug": "verao-2026",
"url": "https://meusite.com.br/campanha-verao",
"title": "Campanha de Verão 2026",
"clicks": 142,
"tags": ["marketing", "verao"],
"domain": "invgst.com",
"createdAt": "2026-02-26T12:00:00.000Z"
}
],
"pagination": {
"page": 1,
"perPage": 10,
"total": 24,
"totalPages": 3
}
}
}Analytics de uma Tag
/api/v1/tags/{tag}/statsanalytics:readAnalytics de uma Tag
Consulta estatísticas consolidadas de todos os links com uma tag específica.
Parâmetros de Query
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
period | enum | Não | Período: `7d`, `30d`, `90d`, `all`(padrão: 30d) |
curl "https://short.inovgest.com/api/v1/tags/marketing/stats?period=30d" \
-H "Authorization: Bearer isk_SuaChaveAqui"{
"data": {
"totalClicks": 5672,
"uniqueVisitors": 4103,
"clicksOverTime": [
{ "date": "2026-02-01", "clicks": 185 },
{ "date": "2026-02-02", "clicks": 210 }
],
"referrers": [
{ "source": "(Direto)", "count": 1890, "percentage": 33.3 }
],
"locations": [
{ "country": "BR", "city": "São Paulo", "count": 2341 }
],
"devices": [
{ "device": "Mobile", "count": 3100, "percentage": 54.7 }
]
}
}Domínios Personalizados
Use seu próprio domínio nos links encurtados em vez do domínio padrão invgst.com. Exemplo: link.suaempresa.com.br/abc1234
Início Rápido
- 1
Cadastrar o domínio
Acesse Painel → Domínios → Adicionar Domínio e digite o domínio (ex:
link.suaempresa.com.br). O sistema gera os registros DNS necessários. - 2
Configurar o DNS
No provedor do seu domínio, adicione um registro CNAME apontando para
invgst.come um registro TXT para comprovar a propriedade. - 3
Verificar no painel
Clique em Verificar Domínio. O sistema consulta o DNS para confirmar que a configuração está correta.
- 4
Usar nos seus links
Ao criar um novo link, selecione seu domínio personalizado. Links existentes podem ser atualizados.
curl -X POST https://short.inovgest.com/api/v1/domains \
-H "Authorization: Bearer isk_SuaChaveAqui" \
-H "Content-Type: application/json" \
-d '{"domain": "link.suaempresa.com.br"}'{
"data": {
"id": "Xp3rTkW8mNqL5vBhYs9dF",
"domain": "link.suaempresa.com.br",
"status": "pending",
"createdAt": "2026-03-23T14:00:00.000Z",
"updatedAt": "2026-03-23T14:00:00.000Z",
"verifiedAt": null,
"dnsRecords": [
{ "type": "CNAME", "name": "link.suaempresa.com.br", "value": "invgst.com", "verified": false },
{ "type": "TXT", "name": "_inovgest.link.suaempresa.com.br", "value": "ivg_verify_abc123...", "verified": false }
],
"linkCount": 0
}
}| Plano | Domínios |
|---|---|
| Free | 0 |
| Starter | 1 |
| Pro | 5 |
| Business | 8 |
Configuração DNS
Ao cadastrar um domínio, o sistema gera dois registros DNS que precisam ser criados no seu provedor:
Registro 1: CNAME (roteamento)
| Tipo | CNAME |
|---|---|
| Nome | seu domínio (ex: `link.suaempresa.com.br`) |
| Valor | `invgst.com` |
| TTL | Automático (ou 3600) |
Registro 2: TXT (verificação)
| Tipo | TXT |
|---|---|
| Nome | `_inovgest.link.suaempresa.com.br` |
| Valor | *(token de 32 caracteres gerado pelo sistema)* |
| TTL | Automático (ou 3600) |
Exemplos por Provedor
Cloudflare
- Acesse o dashboard → selecione o domínio → DNS
- Clique em Adicionar registro
- CNAME: Nome
link, Destinoinvgst.com, Proxy Desligado (nuvem cinza) - TXT: Nome
_inovgest.link, Conteúdo: *(cole o token)*
Importante no Cloudflare
Registro.br
- Acesse Registro.br → selecione o domínio → DNS
- CNAME: Nome
link, Tipo CNAME, Dadosinvgst.com.(com ponto final) - TXT: Nome
_inovgest.link, Tipo TXT, Dados *(cole o token)*
GoDaddy
- Acesse My Products → domínio → DNS → Add Record
- CNAME: Host
link, Points toinvgst.com, TTL1 Hour - TXT: Host
_inovgest.link, TXT Value *(cole o token)*, TTL1 Hour
Hostinger
- Acesse hPanel → Domínios → DNS / Nameservers
- CNAME: Nome
link, Aponta parainvgst.com - TXT: Nome
_inovgest.link, Valor TXT *(cole o token)*
Verificação
O sistema verifica o CNAME e o TXT simultaneamente. Ambos precisam estar corretos.
| Status | Significado |
|---|---|
pending | Domínio cadastrado, aguardando verificação |
verified | DNS configurado corretamente, domínio pronto para uso |
error | Verificação falhou — um ou ambos os registros DNS não foram encontrados |
Dica
Usando nos Links
Após a verificação, selecione o domínio no painel ao criar um link, ou passe o campo domain via API:
curl -X POST https://short.inovgest.com/api/v1/links \
-H "Authorization: Bearer isk_SuaChaveAqui" \
-H "Content-Type: application/json" \
-d '{
"url": "https://exemplo.com/pagina-destino",
"domain": "link.suaempresa.com.br"
}'Gerenciamento
Listar domínios
curl https://short.inovgest.com/api/v1/domains \
-H "Authorization: Bearer isk_SuaChaveAqui"{
"data": {
"items": [
{
"id": "dfKIYmP9rfaugV2sZjJ1d",
"domain": "link.suaempresa.com.br",
"status": "verified",
"createdAt": "2026-02-20T10:00:00.000Z",
"updatedAt": "2026-02-20T10:35:00.000Z",
"verifiedAt": "2026-02-20T10:35:00.000Z",
"dnsRecords": [
{ "type": "CNAME", "name": "link.suaempresa.com.br", "value": "invgst.com", "verified": true },
{ "type": "TXT", "name": "_inovgest.link.suaempresa.com.br", "value": "ivg_verify_abc123...", "verified": true }
]
}
]
}
}Verificar novamente (sem limite de tentativas)
curl -X POST https://short.inovgest.com/api/v1/domains/dfKIYmP9rfaugV2sZjJ1d/verify \
-H "Authorization: Bearer isk_SuaChaveAqui" \
-d ''{
"data": {
"id": "dfKIYmP9rfaugV2sZjJ1d",
"domain": "link.suaempresa.com.br",
"status": "verified",
"createdAt": "2026-02-20T10:00:00.000Z",
"updatedAt": "2026-02-20T10:35:00.000Z",
"verifiedAt": "2026-02-20T10:35:00.000Z",
"dnsRecords": [
{ "type": "CNAME", "name": "link.suaempresa.com.br", "value": "invgst.com", "verified": true },
{ "type": "TXT", "name": "_inovgest.link.suaempresa.com.br", "value": "ivg_verify_abc123...", "verified": true }
]
}
}Remover domínio
curl -X DELETE https://short.inovgest.com/api/v1/domains/dfKIYmP9rfaugV2sZjJ1d \
-H "Authorization: Bearer isk_SuaChaveAqui"HTTP/1.1 204 No ContentAtenção
invgst.com. Isso garante que nenhum link quebre.Perguntas Frequentes
Quanto tempo leva para o DNS propagar?
Normalmente entre 5 e 30 minutos. Em casos raros, pode levar até 48 horas. Se após 1 hora a verificação ainda falhar, revise a configuração dos registros.
Posso usar o domínio raiz (suaempresa.com.br) em vez de um subdomínio?
Registros CNAME no domínio raiz (apex) não são suportados pelo padrão DNS. Recomendamos usar um subdomínio como link., go., url. ou l. para evitar problemas.
Posso adicionar vários domínios?
Sim, de acordo com o limite do seu plano. O plano Pro permite até 5, e o Business até 8.
O que acontece com meus links se eu fizer downgrade?
Os domínios existentes continuam funcionando, mas você não poderá adicionar novos até estar dentro do limite do plano.
Preciso de certificado SSL?
Não. O Inovgest Short gerencia automaticamente os certificados SSL. Seus links funcionam com HTTPS sem configuração adicional.
Posso usar o mesmo domínio em mais de um time?
Não. Cada domínio é único no sistema — ele só pode pertencer a um time por vez.
Planos e Limites
Tabela Comparativa
| Funcionalidade | Free | Starter | Pro | Business |
|---|---|---|---|---|
| Links/mês | 50 | 1.000 | 10.000 | 100.000 |
| Domínios customizados | 0 | 1 | 5 | 8 |
| Chaves de API | 1 | 5 | 20 | Ilimitadas |
| Retenção de analytics | 30 dias | 60 dias | Ilimitada | Ilimitada |
| Membros na equipe | 1 | 3 | 10 | Ilimitados |
| Proteção por senha | — | |||
| Parâmetros UTM | — | |||
| Segmentação por dispositivo | — | |||
| Segmentação geográfica | — | 2 alvos | 5 alvos | 10 alvos |
| Teste A/B | — | 3 variantes | 5 variantes | 10 variantes |
| Importação em massa | — | 100 linhas | 500 linhas | 1.000 linhas |
Features Avançadas
Parâmetros UTM estão disponíveis a partir do plano Starter. Segmentação por dispositivo e segmentação geográfica requerem o plano Pro ou superior. Tentativas de uso no plano errado retornam erro 403 FEATURE_NOT_AVAILABLE.
Geo-Targeting
Device Targeting
Equipe
| Papel | Permissões |
|---|---|
| Owner | Controle total, gerência de cobrança e exclusão do time |
| Admin | Gerência de membros, links e configurações |
| Member | Criar e editar links próprios, acessar analytics |
Cobrança
Ciclo mensal ou anual (~17% de desconto). Pagamento via Stripe (cartão) ou PIX via AbacatePay.
| Plano | Mensal | Anual (por mês) |
|---|---|---|
| Free | R$ 0/mês | R$ 0/ano |
| Starter | R$ 29/mês | R$ 249/ano |
| Pro | R$ 79/mês | R$ 679/ano |
| Business | R$ 199/mês | R$ 1.699/ano |
Tratamento de Erros
Formato Padrão
{
"error": {
"code": "ERROR_CODE",
"message": "Descrição legível do erro"
}
}Erros de Validação
Erros de validação (422) incluem um array details com o campo e a mensagem de cada erro:
{
"error": {
"code": "VALIDATION_ERROR",
"details": [
{ "field": "url", "message": "URL é obrigatória" },
{ "field": "slug", "message": "Slug inválido: use apenas letras minúsculas, números e hífens" }
]
}
}O campo error.message está sempre presente em todas as respostas de erro. O campo error.details aparece apenas em erros VALIDATION_ERROR (422). Os demais erros (incluindo UNSAFE_URL, BLOCKED_URL, PHISHING_DETECTED) retornam apenas code e message:
{
"error": {
"code": "UNSAFE_URL",
"message": "A URL fornecida foi detectada como potencialmente maliciosa pelo Google Web Risk."
}
}Tabela de Códigos
| HTTP | Código | Descrição |
|---|---|---|
| 400 | VALIDATION_ERROR | Corpo da requisição inválido |
| 401 | UNAUTHORIZED | Chave de API ausente ou inválida |
| 403 | FORBIDDEN | Sem permissão (escopo insuficiente) |
| 403 | PLAN_LIMIT_EXCEEDED | Limite do plano atingido |
| 403 | FEATURE_NOT_AVAILABLE | Funcionalidade não disponível no plano |
| 404 | NOT_FOUND | Recurso não encontrado |
| 409 | CONFLICT | Slug já está em uso |
| 422 | VALIDATION_ERROR | Erros de validação detalhados |
| 422 | UNSAFE_URL | URL detectada como potencialmente maliciosa |
| 422 | BLOCKED_URL | URL bloqueada por violar políticas de uso |
| 422 | PHISHING_DETECTED | URL identificada como potencial phishing |
| 429 | RATE_LIMIT_EXCEEDED | Limite de requisições excedido |
| 500 | INTERNAL_ERROR | Erro interno do servidor |
Exemplos Práticos
Exemplos completos em cURL, JavaScript e Python para todas as operações.
Links
# Definir variável de ambiente
export API_KEY="isk_SuaChaveAqui"
BASE_URL="https://short.inovgest.com/api/v1"
# Criar um link
curl -X POST "$BASE_URL/links" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://exemplo.com.br", "slug": "meu-link", "title": "Meu Link"}'
# Listar links ativos
curl "$BASE_URL/links?status=active&sort=clicks&order=desc" \
-H "Authorization: Bearer $API_KEY"
# Atualizar um link
curl -X PATCH "$BASE_URL/links/ID_DO_LINK" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"title": "Novo Título", "tags": ["atualizado"]}'
# Excluir um link
curl -X DELETE "$BASE_URL/links/ID_DO_LINK" \
-H "Authorization: Bearer $API_KEY"
# Ver analytics
curl "$BASE_URL/links/ID_DO_LINK/stats?period=30d" \
-H "Authorization: Bearer $API_KEY"Domínios via API
# Cadastrar um novo domínio
curl -X POST https://short.inovgest.com/api/v1/domains \
-H "Authorization: Bearer isk_SuaChaveAqui" \
-H "Content-Type: application/json" \
-d '{"domain": "link.suaempresa.com.br"}'
# Listar todos os domínios
curl -s https://short.inovgest.com/api/v1/domains \
-H "Authorization: Bearer isk_SuaChaveAqui"
# Verificar um domínio
curl -X POST https://short.inovgest.com/api/v1/domains/DOMAIN_ID/verify \
-H "Authorization: Bearer isk_SuaChaveAqui" \
-d ''
# Remover um domínio
curl -X DELETE https://short.inovgest.com/api/v1/domains/DOMAIN_ID \
-H "Authorization: Bearer isk_SuaChaveAqui"Agentes de IA
O Inovgest Short disponibiliza um arquivo llms.txt com a documentação completa da API em texto puro, otimizado para consumo por agentes de IA como Claude, GPT, Gemini e outros. Você pode delegar a implementação de clientes inteiros a um agente — basta fornecer a URL do arquivo no prompt.
llms.txt
https://short.inovgest.com/llms.txt — uma referência completa da API em texto puro, otimizada para consumo por agentes de IA.Como Usar
- 1
Copie a URL do arquivo
O endereço é
https://short.inovgest.com/llms.txt. Ele contém toda a documentação da API em formato texto puro. - 2
Cole no prompt do agente
Inclua a URL no início do seu prompt junto com a instrução: "Leia a documentação completa antes de começar."
- 3
Execute e revise
O agente vai ler a documentação, elaborar um plano e implementar o cliente. Revise o código gerado antes de usar em produção.
Prompts Prontos
Copie um dos prompts abaixo e cole diretamente no seu agente de IA favorito. Cada prompt já inclui a URL da documentação e os requisitos para gerar um cliente funcional.
Prompt Universal
Funciona com qualquer stack ou linguagem.
Usando a documentação da API disponível em:
https://short.inovgest.com/llms.txt
Crie um cliente web para encurtar URLs usando esta API.
Requisitos:
- A chave da API deve ser lida de uma variável de ambiente (crie um arquivo .env.example)
- Implemente: criar link, listar links, editar link, excluir link e ver analytics
- Na criação de links, permita selecionar o domínio (invgst.com ou domínio personalizado)
- Adicione tratamento de erros baseado nos códigos documentados na API
- Não é necessário autenticação de usuário — será usado localmente
Leia a documentação completa antes de começar. Elabore um plano e implemente.Python + Django
Webapp com Django e templates para gerenciar links.
Usando a documentação da API disponível em:
https://short.inovgest.com/llms.txt
Crie um webapp com Python e Django para gerenciar links encurtados via API do Inovgest Short.
Requisitos:
- Django com templates para a interface
- Chave da API em arquivo .env (use python-dotenv)
- Funcionalidades: criar link (com seleção de domínio), listar links com paginação, editar, excluir e visualizar analytics de cada link
- Trate os erros da API (401, 403, 422, 429) com mensagens amigáveis
- Sem autenticação de usuário — uso local
Leia a documentação completa antes de começar. Elabore um plano e implemente.Next.js + TypeScript
App Router com Server Actions e Tailwind CSS.
Usando a documentação da API disponível em:
https://short.inovgest.com/llms.txt
Crie um webapp com Next.js (App Router) e TypeScript para gerenciar links encurtados via API do Inovgest Short.
Requisitos:
- Next.js 15+ com App Router e Server Actions
- Chave da API em .env.local (INOVGEST_API_KEY)
- Funcionalidades: criar link (com seleção de domínio e tags), listar links com busca e paginação, editar, excluir e dashboard de analytics por link
- Use fetch nativo com tratamento dos códigos de erro documentados
- Estilize com Tailwind CSS
- Sem autenticação de usuário — uso local
Leia a documentação completa antes de começar. Elabore um plano e implemente.PHP + Laravel
Laravel com Blade templates e Http facade.
Usando a documentação da API disponível em:
https://short.inovgest.com/llms.txt
Crie um webapp com PHP e Laravel para gerenciar links encurtados via API do Inovgest Short.
Requisitos:
- Laravel 11+ com Blade templates
- Chave da API em .env (INOVGEST_API_KEY)
- Use Http facade do Laravel para as chamadas à API
- Funcionalidades: criar link (com seleção de domínio), listar links com paginação, editar, excluir e visualizar analytics de cada link
- Trate os erros da API (401, 403, 422, 429) com mensagens amigáveis
- Sem autenticação de usuário — uso local
Leia a documentação completa antes de começar. Elabore um plano e implemente.Personalização
Referência Rápida de Endpoints
| Método | Endpoint | Escopo | Descrição |
|---|---|---|---|
| GET | /api/v1/links | links:read | Listar links |
| POST | /api/v1/links | links:write | Criar link |
| GET | /api/v1/links/{id} | links:read | Obter link |
| PATCH | /api/v1/links/{id} | links:write | Atualizar link |
| DELETE | /api/v1/links/{id} | links:write | Excluir link |
| POST | /api/v1/links/bulk | links:write | Importação em massa |
| GET | /api/v1/links/{id}/stats | analytics:read | Analytics do link |
| GET | /api/v1/links/{id}/qr | links:read | QR Code do link |
| GET | /api/v1/domains | links:read | Listar domínios |
| POST | /api/v1/domains | links:write | Cadastrar domínio |
| GET | /api/v1/domains/{id} | links:read | Obter domínio |
| POST | /api/v1/domains/{id}/verify | links:write | Verificar domínio |
| DELETE | /api/v1/domains/{id} | links:write | Remover domínio |
| GET | /api/v1/campaigns | links:read | Listar campanhas |
| POST | /api/v1/campaigns | links:write | Criar campanha |
| GET | /api/v1/campaigns/{id} | links:read | Obter campanha |
| PATCH | /api/v1/campaigns/{id} | links:write | Atualizar campanha |
| DELETE | /api/v1/campaigns/{id} | links:write | Excluir campanha |
| GET | /api/v1/campaigns/{id}/links | links:read | Links da campanha |
| POST | /api/v1/campaigns/{id}/links | links:write | Adicionar link à campanha |
| DELETE | /api/v1/campaigns/{id}/links/{linkId} | links:write | Remover link da campanha |
| GET | /api/v1/campaigns/{id}/stats | analytics:read | Analytics da campanha |
| GET | /api/v1/tags | links:read | Listar tags |
| GET | /api/v1/tags/{tag}/links | links:read | Links de uma tag |
| GET | /api/v1/tags/{tag}/stats | analytics:read | Analytics de uma tag |