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. 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

Essa chave só aparece uma vez. Se perder, terá que criar outra.

Passo 2: Encurte uma URL

Abra o terminal e cole o comando abaixo (substituindo SUA_CHAVE pela chave que você copiou):

cURL
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

Não usa terminal? Você pode usar ferramentas visuais como Postman ou Insomnia — basta configurar o método como POST, colar a URL, adicionar os headers e o corpo JSON.

Passo 3: Veja o resultado

Se deu certo, você recebe uma resposta assim:

Resposta
{
  "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?

ErroSignificadoO que fazer
401 UNAUTHORIZEDChave inválida ou ausenteVerifique se copiou a chave corretamente e se o header está como `Bearer isk_...`
422 VALIDATION_ERRORURL inválidaA URL precisa começar com `http://` ou `https://`
403 PLAN_LIMIT_EXCEEDEDLimite do plano atingidoVocê já usou todas as criações do mês. Aguarde o próximo ciclo ou faça upgrade
429 RATE_LIMIT_EXCEEDEDMuitas requisiçõesAguarde alguns segundos e tente novamente

Autenticação

Todas as chamadas à API devem incluir a chave no header Authorization.

Criando uma Chave de API

  1. 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

Formato
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

EscopoPermissão
links:readListar e visualizar links
links:writeCriar, atualizar e excluir links
analytics:readConsultar estatísticas de cliques
PlanoChaves
Free1
Starter5
Pro20
BusinessIlimitado

Processo de Validação

Cada requisição passa por 7 etapas de validação:

  1. Extrai o token do header `Authorization: Bearer ...`
  2. Busca a chave pelo prefixo no banco de dados
  3. Verifica o hash bcrypt contra o token fornecido
  4. Verifica se a chave não está expirada
  5. Valida se a chave possui o escopo necessário para a rota
  6. Confirma que o time (team) associado à chave é válido
  7. Aplica rate limiting baseado no tier
Exemplo
curl -H "Authorization: Bearer isk_Ab3Cd5Ef7Gh9Ij1Kl3Mn5Op7Qr9St1Uv" \
  https://short.inovgest.com/api/v1/links

Rate Limiting

O rate limiting usa o algoritmo sliding window via Upstash Redis.

Tiers de Limite

TierLimiteIdentificador
Anônimo10 req/minIP
Sessão autenticada60 req/minUser ID
API Key120 req/minKey ID

Limites por Endpoint

Além dos limites globais, alguns endpoints possuem limites mais restritivos para prevenir abuso:

EndpointLimiteTier
POST /api/v1/links10 req/minSessão autenticada
POST /api/v1/links20 req/minAPI Key
POST /api/v1/report5 req/horaAnô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).

Resposta 429
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

Todos os IDs de recursos são strings alfanuméricas (nanoid, 21 caracteres, ex: 691NF0rKKV8KtlsxK6P4M). Nunca trate IDs como inteiros.

Montando a URL curta

A API retorna 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

Endpoints de listagem usam dois formatos: paginado (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

POST/api/v1/linkslinks:write

Criar 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

CampoTipoObrigatórioDescrição
urlstringSimURL de destino (deve começar com `http://` ou `https://`)
slugstringNãoSlug personalizado (ex: `minha-promo`)
titlestringNãoTítulo descritivo (máx. 200 caracteres)
tagsstring[]NãoTags para organização (máx. 20 tags, 50 chars cada)
expiresAtstring (ISO)NãoData 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.
passwordstringNãoSenha para proteger o link (Starter+)
domainstringNãoDomínio personalizado (padrão: `invgst.com`)
utmSourcestringNãoUTM Source (Starter+)
utmMediumstringNãoUTM Medium (Starter+)
utmCampaignstringNãoUTM Campaign (Starter+)
utmTermstringNãoUTM Term (máx. 200 caracteres, Starter+)
utmContentstringNãoUTM Content (máx. 200 caracteres, Starter+)
deviceTargetIosstringNãoURL alternativa para iOS (Starter+)
deviceTargetAndroidstringNãoURL alternativa para Android (Starter+)
deviceTargetDesktopstringNãoURL alternativa para Desktop (Starter+)
geoTargetsobject[]NãoRedirecionamento por país. Campos: `country` (ISO 2 letras), `countryName`, `url` (Starter+)
abTestEnabledbooleanNãoAtivar teste A/B (Starter+)
abTestVariantsobject[]NãoVariantes do teste A/B (min 2, máx depende do plano). Campos: `id`, `name`, `url`, `weight` (Starter+)
Requisição
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"
  }'
Resposta 201
{
  "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

Apenas letras minúsculas, números e hífens. Não pode começar ou terminar com hífen. Hífens consecutivos não são permitidos. Máximo 128 caracteres. Regex: ^[a-z0-9]+(-[a-z0-9]+)*$. Se omitido, um código de 7 caracteres Base62 é gerado automaticamente.

Com Segmentação Geográfica

POST/api/v1/linkslinks:write

Criar 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.

Requisição
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" }
    ]
  }'
Resposta 201
{
  "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

POST/api/v1/linkslinks:write

Criar 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.

Requisição
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"
  }'
Resposta 201
{
  "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

POST/api/v1/linkslinks:write

Criar 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%).

Requisição
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 }
    ]
  }'
Resposta 201
{
  "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

GET/api/v1/linkslinks:read

Listar Links

Lista links com filtros e paginação.

Parâmetros de Query

CampoTipoObrigatórioDescrição
qstringNãoBusca por texto (máx. 100 caracteres)
statusenumNãoFiltro: `all`, `active`, `archived`, `expired`(padrão: all)
sortenumNãoOrdenar por: `createdAt`, `clicks`, `title`(padrão: createdAt)
orderenumNãoDireção: `asc`, `desc`(padrão: desc)
pagenumberNãoPágina (mínimo 1)(padrão: 1)
perPagenumberNãoItens por página (1-100)(padrão: 20)
Requisição
curl "https://short.inovgest.com/api/v1/links?status=active&sort=clicks&order=desc" \
  -H "Authorization: Bearer isk_SuaChaveAqui"
Resposta
{
  "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

GET/api/v1/links/{id}links:read

Obter Link

Retorna os detalhes completos de um link pelo seu ID.

Requisição
curl https://short.inovgest.com/api/v1/links/q0RSLVoQ7ZeML95GmaxuI \
  -H "Authorization: Bearer isk_SuaChaveAqui"
Resposta 200
{
  "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

PATCH/api/v1/links/{id}links:write

Atualizar 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

CampoTipoObrigatórioDescrição
urlstringSimURL de destino (deve começar com `http://` ou `https://`)
slugstringNãoSlug personalizado (ex: `minha-promo`)
titlestringNãoTítulo descritivo (máx. 200 caracteres)
tagsstring[]NãoTags para organização (máx. 20 tags, 50 chars cada)
expiresAtstring (ISO)NãoData 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.
passwordstringNãoSenha para proteger o link (Starter+)
domainstringNãoDomínio personalizado (padrão: `invgst.com`)
utmSourcestringNãoUTM Source (Starter+)
utmMediumstringNãoUTM Medium (Starter+)
utmCampaignstringNãoUTM Campaign (Starter+)
utmTermstringNãoUTM Term (máx. 200 caracteres, Starter+)
utmContentstringNãoUTM Content (máx. 200 caracteres, Starter+)
deviceTargetIosstringNãoURL alternativa para iOS (Starter+)
deviceTargetAndroidstringNãoURL alternativa para Android (Starter+)
deviceTargetDesktopstringNãoURL alternativa para Desktop (Starter+)
geoTargetsobject[]NãoRedirecionamento por país. Campos: `country` (ISO 2 letras), `countryName`, `url` (Starter+)
abTestEnabledbooleanNãoAtivar teste A/B (Starter+)
abTestVariantsobject[]NãoVariantes do teste A/B (min 2, máx depende do plano). Campos: `id`, `name`, `url`, `weight` (Starter+)
Requisição
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"
  }'
Resposta 200
{
  "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

Para limpar um campo opcional, envie null. Exemplo: { "title": null, "password": null, "expiresAt": null }

Excluir Link

DELETE/api/v1/links/{id}links:write

Excluir Link

Remove permanentemente um link. Retorna `204 No Content`.

Requisição
curl -X DELETE https://short.inovgest.com/api/v1/links/q0RSLVoQ7ZeML95GmaxuI \
  -H "Authorization: Bearer isk_SuaChaveAqui"
Resposta 204
HTTP/1.1 204 No Content

Importação em Massa

Disponibilidade

Disponível a partir do plano Starter. Processamento em lotes de 20 linhas.

Limites por Plano

PlanoMáx. Linhas
FreeNão disponível
Starter100 linhas
Pro500 linhas
Business1.000 linhas

Formato da Requisição

POST/api/v1/links/bulklinks:write

Importaçã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.

Requisição
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"] }
    ]
  }'
Resposta
{
  "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

GET/api/v1/links/{id}/statsanalytics:read

Estatísticas do Link

Consulta as estatísticas de cliques de um link.

Parâmetros de Query

CampoTipoObrigatórioDescrição
periodenumNãoPeríodo: `7d`, `30d`, `90d`(padrão: 30d)
typeenumNãoUse `ab-test` para analytics de teste A/B
Requisição
curl https://short.inovgest.com/api/v1/links/q0RSLVoQ7ZeML95GmaxuI/stats?period=30d \
  -H "Authorization: Bearer isk_SuaChaveAqui"
Resposta 200
{
  "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

GET/api/v1/links/{id}/stats?type=ab-testanalytics:read

Analytics 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

CampoTipoObrigatórioDescrição
periodenumNãoPeríodo: `7d`, `30d`, `90d`(padrão: 30d)
Requisição
curl "https://short.inovgest.com/api/v1/links/clx2xyz9k8lmn/stats?period=30d&type=ab-test" \
  -H "Authorization: Bearer isk_SuaChaveAqui"
Resposta 200
{
  "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

PlanoRetenção
Free30 dias
Starter60 dias
ProIlimitada
BusinessIlimitada

API de Campanhas

Agrupe links em campanhas para organizar e acompanhar métricas consolidadas.

Listar Campanhas

GET/api/v1/campaignslinks:read

Listar Campanhas

Lista campanhas com filtros e paginação.

Parâmetros de Query

CampoTipoObrigatórioDescrição
qstringNãoBusca por nome (máx. 100 caracteres)
sortenumNãoOrdenar por: `createdAt`, `name`(padrão: createdAt)
orderenumNãoDireção: `asc`, `desc`(padrão: desc)
pagenumberNãoPágina (mínimo 1)(padrão: 1)
perPagenumberNãoItens por página (1-100)(padrão: 20)
Requisição
curl "https://short.inovgest.com/api/v1/campaigns?sort=name&order=asc" \
  -H "Authorization: Bearer isk_SuaChaveAqui"
Resposta 200
{
  "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

POST/api/v1/campaignslinks:write

Criar Campanha

Cria uma nova campanha para agrupar links.

Corpo da Requisição

CampoTipoObrigatórioDescrição
namestringSimNome da campanha (1-200 caracteres)
descriptionstringNãoDescrição (máx. 2000 caracteres)
Requisição
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"
  }'
Resposta 201
{
  "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

GET/api/v1/campaigns/{id}links:read

Obter Campanha

Retorna os detalhes de uma campanha, incluindo contagem de links e total de cliques.

Requisição
curl https://short.inovgest.com/api/v1/campaigns/691NF0rKKV8KtlsxK6P4M \
  -H "Authorization: Bearer isk_SuaChaveAqui"
Resposta 200
{
  "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

PATCH/api/v1/campaigns/{id}links:write

Atualizar Campanha

Atualização parcial — envie apenas os campos que deseja alterar.

Requisição
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"}'
Resposta 200
{
  "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

DELETE/api/v1/campaigns/{id}links:write

Excluir Campanha

Remove uma campanha. Os links associados não são excluídos, apenas desvinculados.

Requisição
curl -X DELETE https://short.inovgest.com/api/v1/campaigns/691NF0rKKV8KtlsxK6P4M \
  -H "Authorization: Bearer isk_SuaChaveAqui"
Resposta 204
HTTP/1.1 204 No Content

Exclusão de campanhas

Ao excluir uma campanha, os links associados não são excluídos. Eles apenas perdem o vínculo com a campanha.

Links da Campanha

GET/api/v1/campaigns/{id}/linkslinks:read

Links da Campanha

Lista os links associados a uma campanha.

Requisição
curl https://short.inovgest.com/api/v1/campaigns/691NF0rKKV8KtlsxK6P4M/links \
  -H "Authorization: Bearer isk_SuaChaveAqui"
Resposta 200
{
  "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

POST/api/v1/campaigns/{id}/linkslinks:write

Adicionar Link à Campanha

Adiciona um link existente a uma campanha.

Corpo da Requisição

CampoTipoObrigatórioDescrição
linkIdstringSimID do link a adicionar
Requisição
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"}'
Resposta 201
{
  "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

DELETE/api/v1/campaigns/{id}/links/{linkId}links:write

Remover Link da Campanha

Remove um link de uma campanha (sem excluir o link).

Requisição
curl -X DELETE https://short.inovgest.com/api/v1/campaigns/691NF0rKKV8KtlsxK6P4M/links/q0RSLVoQ7ZeML95GmaxuI \
  -H "Authorization: Bearer isk_SuaChaveAqui"
Resposta 204
HTTP/1.1 204 No Content

Analytics da Campanha

GET/api/v1/campaigns/{id}/statsanalytics:read

Analytics da Campanha

Consulta estatísticas consolidadas de todos os links da campanha.

Parâmetros de Query

CampoTipoObrigatórioDescrição
periodenumNãoPeríodo: `7d`, `30d`, `90d`, `all`(padrão: 30d)
Requisição
curl https://short.inovgest.com/api/v1/campaigns/691NF0rKKV8KtlsxK6P4M/stats?period=30d \
  -H "Authorization: Bearer isk_SuaChaveAqui"
Resposta 200
{
  "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

O parâmetro {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

GET/api/v1/tagslinks:read

Listar Tags

Lista todas as tags do time, com contagem de links e total de cliques.

Requisição
curl https://short.inovgest.com/api/v1/tags \
  -H "Authorization: Bearer isk_SuaChaveAqui"
Resposta 200
{
  "data": [
    {
      "tag": "marketing",
      "linkCount": 24,
      "totalClicks": 5672
    },
    {
      "tag": "verao",
      "linkCount": 8,
      "totalClicks": 1234
    }
  ]
}

Links de uma Tag

GET/api/v1/tags/{tag}/linkslinks:read

Links de uma Tag

Lista links paginados que possuem uma tag específica.

Parâmetros de Query

CampoTipoObrigatórioDescrição
pagenumberNãoPágina (mínimo 1)(padrão: 1)
perPagenumberNãoItens por página (1-100)(padrão: 20)
Requisição
curl "https://short.inovgest.com/api/v1/tags/marketing/links?page=1&perPage=10" \
  -H "Authorization: Bearer isk_SuaChaveAqui"
Resposta 200
{
  "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

GET/api/v1/tags/{tag}/statsanalytics:read

Analytics de uma Tag

Consulta estatísticas consolidadas de todos os links com uma tag específica.

Parâmetros de Query

CampoTipoObrigatórioDescrição
periodenumNãoPeríodo: `7d`, `30d`, `90d`, `all`(padrão: 30d)
Requisição
curl "https://short.inovgest.com/api/v1/tags/marketing/stats?period=30d" \
  -H "Authorization: Bearer isk_SuaChaveAqui"
Resposta 200
{
  "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. 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. 2

    Configurar o DNS

    No provedor do seu domínio, adicione um registro CNAME apontando para invgst.com e um registro TXT para comprovar a propriedade.

  3. 3

    Verificar no painel

    Clique em Verificar Domínio. O sistema consulta o DNS para confirmar que a configuração está correta.

  4. 4

    Usar nos seus links

    Ao criar um novo link, selecione seu domínio personalizado. Links existentes podem ser atualizados.

Cadastrar 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"}'
Resposta 201
{
  "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
  }
}
PlanoDomínios
Free0
Starter1
Pro5
Business8

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)

TipoCNAME
Nomeseu domínio (ex: `link.suaempresa.com.br`)
Valor`invgst.com`
TTLAutomático (ou 3600)

Registro 2: TXT (verificação)

TipoTXT
Nome`_inovgest.link.suaempresa.com.br`
Valor*(token de 32 caracteres gerado pelo sistema)*
TTLAutomático (ou 3600)

Exemplos por Provedor

Cloudflare

  1. Acesse o dashboard → selecione o domínio → DNS
  2. Clique em Adicionar registro
  3. CNAME: Nome link, Destino invgst.com, Proxy Desligado (nuvem cinza)
  4. TXT: Nome _inovgest.link, Conteúdo: *(cole o token)*

Importante no Cloudflare

Desative o proxy (nuvem laranja) para o registro CNAME. O proxy ativo impede a verificação.

Registro.br

  1. Acesse Registro.br → selecione o domínio → DNS
  2. CNAME: Nome link, Tipo CNAME, Dados invgst.com. (com ponto final)
  3. TXT: Nome _inovgest.link, Tipo TXT, Dados *(cole o token)*

GoDaddy

  1. Acesse My Products → domínio → DNSAdd Record
  2. CNAME: Host link, Points to invgst.com, TTL 1 Hour
  3. TXT: Host _inovgest.link, TXT Value *(cole o token)*, TTL 1 Hour

Hostinger

  1. Acesse hPanelDomíniosDNS / Nameservers
  2. CNAME: Nome link, Aponta para invgst.com
  3. TXT: Nome _inovgest.link, Valor TXT *(cole o token)*

Verificação

O sistema verifica o CNAME e o TXT simultaneamente. Ambos precisam estar corretos.

StatusSignificado
pendingDomínio cadastrado, aguardando verificação
verifiedDNS configurado corretamente, domínio pronto para uso
errorVerificação falhou — um ou ambos os registros DNS não foram encontrados

Dica

Propagação DNS normalmente leva de 5 a 30 minutos. Em casos raros, pode levar até 48 horas.

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:

Criar link com domínio personalizado
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

Requisição
curl https://short.inovgest.com/api/v1/domains \
  -H "Authorization: Bearer isk_SuaChaveAqui"
Resposta 200
{
  "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)

Requisição
curl -X POST https://short.inovgest.com/api/v1/domains/dfKIYmP9rfaugV2sZjJ1d/verify \
  -H "Authorization: Bearer isk_SuaChaveAqui" \
  -d ''
Resposta 200
{
  "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

Requisição
curl -X DELETE https://short.inovgest.com/api/v1/domains/dfKIYmP9rfaugV2sZjJ1d \
  -H "Authorization: Bearer isk_SuaChaveAqui"
Resposta 204
HTTP/1.1 204 No Content

Atenção

Ao remover um domínio personalizado, todos os links que usavam esse domínio são automaticamente migrados para o domínio padrã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

FuncionalidadeFreeStarterProBusiness
Links/mês501.00010.000100.000
Domínios customizados0158
Chaves de API1520Ilimitadas
Retenção de analytics30 dias60 diasIlimitadaIlimitada
Membros na equipe1310Ilimitados
Proteção por senha
Parâmetros UTM
Segmentação por dispositivo
Segmentação geográfica2 alvos5 alvos10 alvos
Teste A/B3 variantes5 variantes10 variantes
Importação em massa100 linhas500 linhas1.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

Redireciona visitantes para URLs diferentes baseado no país. Até 25 regras por link (Pro+).

Device Targeting

Redireciona para URLs diferentes por plataforma: iOS, Android, Desktop (Pro+).

Equipe

PapelPermissões
OwnerControle total, gerência de cobrança e exclusão do time
AdminGerência de membros, links e configurações
MemberCriar 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.

PlanoMensalAnual (por mês)
FreeR$ 0/mêsR$ 0/ano
StarterR$ 29/mêsR$ 249/ano
ProR$ 79/mêsR$ 679/ano
BusinessR$ 199/mêsR$ 1.699/ano

Tratamento de Erros

Formato Padrão

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:

Erro de validação (422)
{
  "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:

Erro de segurança (422)
{
  "error": {
    "code": "UNSAFE_URL",
    "message": "A URL fornecida foi detectada como potencialmente maliciosa pelo Google Web Risk."
  }
}

Tabela de Códigos

HTTPCódigoDescrição
400VALIDATION_ERRORCorpo da requisição inválido
401UNAUTHORIZEDChave de API ausente ou inválida
403FORBIDDENSem permissão (escopo insuficiente)
403PLAN_LIMIT_EXCEEDEDLimite do plano atingido
403FEATURE_NOT_AVAILABLEFuncionalidade não disponível no plano
404NOT_FOUNDRecurso não encontrado
409CONFLICTSlug já está em uso
422VALIDATION_ERRORErros de validação detalhados
422UNSAFE_URLURL detectada como potencialmente maliciosa
422BLOCKED_URLURL bloqueada por violar políticas de uso
422PHISHING_DETECTEDURL identificada como potencial phishing
429RATE_LIMIT_EXCEEDEDLimite de requisições excedido
500INTERNAL_ERRORErro 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

O arquivo está disponível em 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. 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. 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. 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.

Prompt
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.

Prompt
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.

Prompt
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.

Prompt
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

Esses prompts são pontos de partida. Adapte conforme sua stack, adicione requisitos específicos do seu projeto, ou peça ao agente para usar bibliotecas que você já conhece.

Referência Rápida de Endpoints

MétodoEndpointEscopoDescrição
GET/api/v1/linkslinks:readListar links
POST/api/v1/linkslinks:writeCriar link
GET/api/v1/links/{id}links:readObter link
PATCH/api/v1/links/{id}links:writeAtualizar link
DELETE/api/v1/links/{id}links:writeExcluir link
POST/api/v1/links/bulklinks:writeImportação em massa
GET/api/v1/links/{id}/statsanalytics:readAnalytics do link
GET/api/v1/links/{id}/qrlinks:readQR Code do link
GET/api/v1/domainslinks:readListar domínios
POST/api/v1/domainslinks:writeCadastrar domínio
GET/api/v1/domains/{id}links:readObter domínio
POST/api/v1/domains/{id}/verifylinks:writeVerificar domínio
DELETE/api/v1/domains/{id}links:writeRemover domínio
GET/api/v1/campaignslinks:readListar campanhas
POST/api/v1/campaignslinks:writeCriar campanha
GET/api/v1/campaigns/{id}links:readObter campanha
PATCH/api/v1/campaigns/{id}links:writeAtualizar campanha
DELETE/api/v1/campaigns/{id}links:writeExcluir campanha
GET/api/v1/campaigns/{id}/linkslinks:readLinks da campanha
POST/api/v1/campaigns/{id}/linkslinks:writeAdicionar link à campanha
DELETE/api/v1/campaigns/{id}/links/{linkId}links:writeRemover link da campanha
GET/api/v1/campaigns/{id}/statsanalytics:readAnalytics da campanha
GET/api/v1/tagslinks:readListar tags
GET/api/v1/tags/{tag}/linkslinks:readLinks de uma tag
GET/api/v1/tags/{tag}/statsanalytics:readAnalytics de uma tag