/api

API do time Encurtee

Integração por chave de API (Team API v1) e REST com sessão para a app (/api/v1/teams). Tudo no mesmo domínio (Nitro /api).

Exemplo: ping da Team API v1
curl -s -H "Authorization: Bearer YOUR_API_KEY" "https://encurtee.me/api/v1/teams/TEAM_ID/ping"

Visão geral

Existem duas famílias de endpoints: (1) Team API v1, para automação com chave de API e plano que inclua API; (2) rotas /api/v1/teams com sessão Supabase (cookies), usadas pelo painel após login.

Em ambas, o segmento :id do time pode ser o UUID interno ou o public_id numérico (5-12 dígitos), exceto nas rotas em que o usuário só interage com os próprios dados (ex.: listagem de times).

Mensagens de erro e sucesso seguem o cookie i18n_redirected (pt ou en), quando o servidor as traduz.

Dois tipos de integração

Team API v1

Prefixo /api/v1/teams/:id. Autenticação com Authorization: Bearer ou cabeçalhos X-Team-Api-Key / X-Encurtee-Team-Key. Hoje: GET ping e POST links (corpo mínimo: url e title opcional).

REST com sessão

Prefixo /api/v1/teams (e /api/v1/teams/:id/…). Requer usuário autenticado (mesma sessão do navegador: cookies). Permissões por função no time (owner, admin, etc.).

Parâmetro :id

Onde aparece :id nas rotas do time, aceita UUID ou public_id numérico resolvido no banco de dados.

Team API v1

Autenticação - Team API v1

Aplica-se aos endpoints sob /api/v1/teams/:id/ (recomendado).

Cabeçalho Authorization (recomendado)

Authorization: Bearer YOUR_FULL_API_KEY

Cabeçalhos alternativos

X-Team-Api-Key ou X-Encurtee-Team-Key com o valor da chave.

Comportamento com Authorization

Se Authorization estiver presente, só conta Bearer com token não vazio (sem fallback para X-*).

Modelo da chave de API do time

Hoje existe uma única chave ativa por time (salva como hash no banco de dados). Regenerar ou revogar substitui ou remove essa chave - útil para rotação e emergências.

Quem gere a chave: membros com permissão edit_team (normalmente dono ou admin). A chave permite automatizar pedidos sem cookie de sessão; trate-a como segredo (não commite em repositórios públicos).

Team API v1

Team API v1 - ping e links

Expandir para parâmetros, query e exemplos

GET/api/v1/teams/:id/pingConfirma a chave para o time. Consome tokens de utilização da API do time.

Resposta de sucesso

JSON com success: true e message traduzida.

{
  "success": true,
  "message": "Chave de API do time válida"
}
POST/api/v1/teams/:id/linksCria link no time (owner como criador). Validação de URL e duplicados no âmbito do time.
CampoOndeObrigatórioDescrição
urlCorpo (JSON)SimURL longa (v1).
titleCorpo (JSON)NãoTítulo do link (v1).

Corpo (JSON)

{
  "url": "https://example.com/article",
  "title": "Opcional"
}

Resposta de sucesso (201)

Dados do link, short_url e objeto team.

{
  "success": true,
  "statusCode": 201,
  "data": { "slug": "…", "short_url": "…", "team": { } }
}

Autenticação - REST com sessão

Envie os cookies de sessão do Supabase (como no $fetch da app com credentials: 'include'). Sem sessão válida, resposta 401.

REST /api/v1/teams (sessão)

Operações de CRUD de times, membros, convites, listagem/criação de links do time, chave API e métricas de utilização. As permissões dependem da sua função no time.

Expandir para parâmetros, query e exemplos

Criação e listagem de times

GET/api/v1/teamsLista times em que é dono ou membro aceite; inclui convites pendentes com invite_status.

Sem corpo JSON nem query string documentados para este método.

POST/api/v1/teamsCria um time; o slug é derivado do nome. Requer plano que permita criar times (ex.: Premium).
CampoOndeObrigatórioDescrição
nameCorpo (JSON)SimNome do time; o slug é derivado automaticamente.

Notas rápidas

Corpo: { "name": "Nome do time" }

Consulta, atualização e exclusão do time

GET/api/v1/teams/:idDetalhe do time se for membro; inclui is_owner, myRole e permissions.

Sem corpo JSON nem query string documentados para este método.

PUT/api/v1/teams/:idAtualiza nome, slug e/ou settings. Requer permissão edit_team (dono ou admin).
CampoOndeObrigatórioDescrição
nameCorpo (JSON)NãoNovo nome do time.
slugCorpo (JSON)NãoNovo slug (identificador na URL).
settingsCorpo (JSON)NãoObjeto JSON de configurações do time.

Notas rápidas

Corpo (opcional): { "name", "slug", "settings" }

DELETE/api/v1/teams/:idExclui o time. Apenas o dono (owner).

Sem corpo JSON nem query string documentados para este método.

Membros - listar, convidar, função e remoção

GET/api/v1/teams/:id/membersLista membros e estados de convite (quando aplicável).

Sem corpo JSON nem query string documentados para este método.

POST/api/v1/teams/:id/membersConvida por email (usuário cadastrado). Permissão invite_members. Roles: admin, moderator, user, viewer.
CampoOndeObrigatórioDescrição
emailCorpo (JSON)SimEmail do usuário cadastrado na plataforma.
roleCorpo (JSON)Nãoadmin | moderator | user | viewer (predefinido: user).

Notas rápidas

Corpo: { "email": "…", "role?": "user" }

PUT/api/v1/teams/:id/members/:userIdAltera a função de um membro. Não aplicável ao dono do time.
CampoOndeObrigatórioDescrição
userIdPathSimUUID do usuário membro.
roleCorpo (JSON)Simadmin | moderator | user | viewer.

Notas rápidas

Corpo: { "role": "admin" | "moderator" | "user" | "viewer" }

DELETE/api/v1/teams/:id/members/:userIdRemove membro (dono/admin) ou sair do time (próprio userId). Não remove o dono.
CampoOndeObrigatórioDescrição
userIdPathSimUUID do membro a remover ou o seu para sair.

Convites - aceitar

POST/api/v1/teams/:id/accept-inviteO usuário autenticado aceita um convite pendente para esse time.

Sem corpo JSON nem query string documentados para este método.

Chave API do time - consultar, gerar e revogar

GET/api/v1/teams/:id/api-keyEstado da chave (hint, datas) e se o plano permite API. Membro do time; gestão só com edit_team.

Sem corpo JSON nem query string documentados para este método.

POST/api/v1/teams/:id/api-keyGera ou regera a chave completa (mostrada uma vez). Dono/admin + plano com API.

Sem corpo JSON nem query string documentados para este método.

DELETE/api/v1/teams/:id/api-keyRevoga a chave do time. Dono/admin.

Sem corpo JSON nem query string documentados para este método.

Utilização (painel)

GET/api/v1/teams/:id/usage-dashboardEstatísticas do time: links totais e no mês, membros, tokens API no mês e política de rate. Não inclui quota de URLs do plano pessoal do dono. Membro do time.

Sem corpo JSON nem query string documentados para este método.

Erros frequentes - Team API v1

HTTPSituaçãoDescrição
400Pedido inválidoid em falta; corpo sem url; validação de URL; duplicado no time; etc.
401Auth v1Chave em falta, Bearer inválido ou chave revogada.
403PlanoPlano do dono sem acesso à API.
404TimeTime não encontrado ou :id inválido.
429LimitesLimite mensal de links do dono.
500ServidorErro interno.

Erros frequentes - REST com sessão

HTTPSituaçãoDescrição
401SessãoNão autenticado.
403Permissão / planoSem permissão no time, limite de membros, ou plano sem API ao gerar chave.
404Não encontradoTime, membro ou usuário por email inexistente.
409ConflitoSlug de time já usado; convite/migração em conflito.
500ServidorErro interno.

Exemplos cURL - Team API v1

Substitua YOUR_API_KEY e TEAM_ID. O domínio base é o da coluna de exemplos (site público).

Para /api/v1/teams com sessão, o curl precisa do cookie de sessão (copiar do navegador) ou usar o app; não é o mesmo fluxo que a chave v1.

Ping

curl -s -H "Authorization: Bearer YOUR_API_KEY" "https://encurtee.me/api/v1/teams/TEAM_ID/ping"

Criar link (v1)

curl -s -X POST -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" -d '{"url":"https://example.com/path"}' "https://encurtee.me/api/v1/teams/TEAM_ID/links"

Novos endpoints serão documentados aqui à medida que forem adicionados.