Documentação pública da Pulei API

Base URL: https://www.pulei.com.br/api/v1

1. Começando com a Pulei API

O que você pode fazer hoje:

  • Criar e gerenciar links curtos e usar domínios próprios.
  • Aplicar regras de retargeting (Smart Links) por país, dispositivo, tempo, cliques e fallback de erro.
  • Proteção opcional por senha.
  • Coletar logs de cliques e métricas agregadas.
  • Exportar cliques em CSV.
  • Usar campanhas para UTMs padrão.

2. Autenticação

Criar API Key

https://www.pulei.com.br/dashboard/api-keys

Envie a API Key no header:

Authorization: Bearer <API-KEY>
  • A API Key é gerada no painel Pulei e está vinculada a um time.
  • Todas as operações são validadas pelo time da API Key.
  • Sem token ou token inválido: 401. Token de outro time: 403.
  • Não exponha a API Key em front-end público; rotacione se necessário.

3. Recursos disponíveis na API

3.1 Links

  • Criar: POST /links (campos: longUrl obrigatório; opcionais domainId verificado, slug customizado com domínio, expiresAt, campaignId, UTMs padrão, deep links mobile).
  • Listar: GET /links com paginação (page, perPage) e busca (search, source).
  • Detalhar: GET /links/{slug}.
  • Atualizar: PATCH /links/{slug} (URL de destino, título, domínio, expiração, desabilitar, deep links, campanha).
  • Arquivar: DELETE /links/{slug} (desabilita o link).

3.2 Retargeting (Smart Links)

  • Regras por país, dispositivo/OS/browser, janela de tempo, quantidade de cliques, fallback de erro e senha.
  • Endpoints: GET e PUT /links/{slug}/retargeting.
  • As regras são avaliadas em ordem de prioridade; o PUT substitui toda a configuração.
  • Body aceita campos singulares (legado) e listas (timeRules, geoRules, deviceRules, clicksRules, errorRules).

3.3 Logs de cliques

  • GET /links/{slug}/logs retorna eventos com data/hora, localização aproximada, dispositivo, referer.
  • Filtros: range (7d, 30d, mtd, prev_month, ytd), country, city, paginação (page, perPage).

3.4 Analytics agregados

  • GET /analytics consolida métricas do time.
  • Filtros: range, slug, q (slug ou URL), domain, country, city.
  • Retorna resumo, ranking de links, hora do dia, dia da semana, referrers, país, região, dispositivo, browser, OS.

3.5 Exportação de dados (CSV)

  • GET /analytics/export gera CSV de cliques com os mesmos filtros de analytics.
  • Colunas: slug, long_url, click_at, ip, country, region, city, device, referer.

3.6 Domínios personalizados

  • GET /domains lista domínios verificados do time.
  • Somente domínios verificados podem receber slugs customizados.

3.7 Campanhas

  • POST /campaigns cria campanhas com UTMs padrão.
  • GET /campaigns lista as últimas campanhas.
  • PATCH /campaigns/{id} atualiza nome/descrição.
  • Use campaignId ao criar ou atualizar links para aplicar UTMs automaticamente.

4. TypeScript — Exemplos completos

Todos os exemplos usam fetch com Bearer Token e a base https://www.pulei.com.br/api/v1.

Autenticação base

const API_KEY = process.env.PULEI_API_KEY!;
const BASE_URL = "https://www.pulei.com.br/api/v1";

const authHeaders = {
  Authorization: `Bearer ${API_KEY}`,
  "Content-Type": "application/json",
};

Links

// Criar um link
await fetch(`${BASE_URL}/links`, {
  method: "POST",
  headers: authHeaders,
  body: JSON.stringify({
    longUrl: "https://meusite.com/oferta",
    domainId: "dominio-verificado-id",
    expiresAt: "2025-12-31T23:59:59Z",
    deepLinkMode: "GENERIC",
    deepLinkTargetScope: "MOBILE_ONLY",
    deepLinkIosUrl: "minhaapp://oferta",
    deepLinkAndroidUrl: "minhaapp://oferta",
    campaignId: "camp-123",
    utm_source: "afiliado",
    utm_medium: "social",
    utm_campaign: "lancamento",
  }),
});

// Listar links do time
const list = await fetch(`${BASE_URL}/links?page=1&perPage=20&search=oferta`, { headers: authHeaders });

// Atualizar um link
await fetch(`${BASE_URL}/links/meu-slug`, {
  method: "PATCH",
  headers: authHeaders,
  body: JSON.stringify({
    longUrl: "https://meusite.com/oferta-atualizada",
    title: "Oferta Black Friday",
    disabled: false,
    disabledUntil: null,
    deepLinkMode: "PER_PLATFORM",
    deepLinkTargetScope: "ALWAYS",
    deepLinkIosUrl: "minhaapp://oferta-ios",
    deepLinkAndroidUrl: "minhaapp://oferta-android",
  }),
});

Retargeting

await fetch(`${BASE_URL}/links/meu-slug/retargeting`, {
  method: "PUT",
  headers: authHeaders,
  body: JSON.stringify({
    timeRules: [
      { startsAt: "2025-11-25T00:00:00Z", targetUrl: "https://meusite.com/pre-black" },
      { startsAt: "2025-11-29T00:00:00Z", targetUrl: "https://meusite.com/black-friday" },
    ],
    geoRules: [
      { country: "BR", targetUrl: "https://meusite.com/br" },
      { country: "US", targetUrl: "https://meusite.com/en" },
    ],
    deviceRules: [
      { device: "MOBILE", targetUrl: "https://m.meusite.com" },
      { device: "DESKTOP", targetUrl: "https://meusite.com/desktop" },
    ],
    clicksRules: [{ threshold: 1000, targetUrl: "https://meusite.com/backup" }],
    errorRules: [{ targetUrl: "https://meusite.com/offline" }],
    passwordRule: { enabled: false },
  }),
});

O PUT sobrescreve toda a configuração de retargeting do link.

Logs e Analytics

// Logs de cliques
await fetch(`${BASE_URL}/links/meu-slug/logs?range=30d&country=BR&page=1&perPage=50`, {
  headers: authHeaders,
});

// Analytics agregados
await fetch(`${BASE_URL}/analytics?range=7d&domain=pulei.com.br&country=BR`, {
  headers: authHeaders,
});

// Exportar CSV
const csv = await fetch(`${BASE_URL}/analytics/export?range=30d&slug=meu-slug`, {
  headers: authHeaders,
});

Domínios e campanhas

// Domínios verificados
await fetch(`${BASE_URL}/domains`, { headers: authHeaders });

// Criar campanha
await fetch(`${BASE_URL}/campaigns`, {
  method: "POST",
  headers: authHeaders,
  body: JSON.stringify({
    name: "Campanha SaaS",
    description: "UTMs padrão para lançamentos",
    defaultUtmSource: "afiliado",
    defaultUtmMedium: "email",
    defaultUtmCampaign: "sprint-1",
  }),
});

// Atualizar campanha
await fetch(`${BASE_URL}/campaigns/camp-123`, {
  method: "PATCH",
  headers: authHeaders,
  body: JSON.stringify({ name: "Campanha SaaS (Q4)" }),
});

5. Swagger / OpenAPI

Use o Swagger para importar em Postman/Insomnia ou gerar SDKs.

  • Swagger UI: /docs/api-docs
  • Arquivo OpenAPI: https://www.pulei.com.br/openapi.yaml

Aqui você vê o “como”; esta página explica o “o quê” e “por quê”.

6. Como testar a API (sem código)

  1. Gerar uma API Key no painel. https://www.pulei.com.br/dashboard/api-keys
  2. Testar autenticação com GET /domains (deve retornar 200).
  3. Criar um link com POST /links.
  4. Consultar detalhes com GET /links/{slug}.
  5. Criar regras em PUT /links/{slug}/retargeting.
  6. Clicar no link curto (mobile e desktop) para gerar eventos.
  7. Ver logs em GET /links/{slug}/logs.
  8. Ver métricas em GET /analytics.
  9. Exportar CSV em GET /analytics/export.

7. Erros comuns e comportamentos esperados

  • 401: autenticação ausente ou inválida.
  • 403: tentativa de usar recurso de outro time.
  • 404: slug inexistente ou recurso não encontrado.
  • 409: conflito de slug ou domínio não verificado.
  • Boas práticas: valide URLs, use domínios verificados para slugs customizados, aplique campanhas para UTMs consistentes e use PUT de retargeting com atenção (é substitutivo).