Criar link curto

POSThttps://api.curtei.com/v1/links

POST /v1/links no curtei: parâmetros, exemplos em cURL, JavaScript, PHP e Python, resposta e erros. Também listar, editar e apagar links. Escopo: links:write.

Cria um link curto para uma URL. Só url é obrigatório. A conta precisa ter o e-mail confirmado.

Parâmetros do corpo

CampoTipoDescrição
url (obrigatório)stringDestino http ou https. Passa pela checagem de segurança (Google Web Risk e lista de bloqueio).
domainstringDomínio do link. Padrão: o domínio padrão da conta (l.curtei.com, se você não tiver um próprio).
slugstringCódigo personalizado (promo-natal). Só em domínio próprio; no compartilhado o código é sempre aleatório.
titlestringNome para achar o link no painel.
redirect_type301 ou 302Tipo do redirecionamento. Padrão: 302.
expires_atISO-8601Depois disso o link para de redirecionar.
max_clicksinteiroLimite de cliques; ao atingir, o link expira.
passwordstring8 a 128 caracteres. O visitante digita a senha antes de seguir; a resposta traz has_password.
utmobjetosource, medium, campaign, term, content, anexados ao destino.
tagsstring[]Etiquetas para filtrar e somar métricas.
campaign_iduuidVincula o link a uma campanha.
external_idstringSeu identificador (pedido, cliente). Buscável por GET /links/by-external-id/{external_id}.
metadataobjetoDados livres seus, até 4 KB; voltam nas respostas e nos webhooks.
track_clicksbooleanRegistrar cliques. Padrão: true.
track_conversionsbooleanRequer track_clicks. Anexa wsc_id ao destino para registrar conversões.
open_in_appbooleanNo celular, tenta abrir o app (YouTube, Instagram, WhatsApp, TikTok…) em vez do navegador.
hide_referrerbooleanO destino não fica sabendo de qual página veio o clique.
rules / variantsobjeto[]Roteamento e teste A/B.

Exemplo

curl -X POST https://api.curtei.com/v1/links \
  -H "Authorization: Bearer $CURTEI_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"url":"https://minhaloja.com.br/promo","tags":["newsletter"]}'

Resposta 201

{
  "id": "0193a0b2-7c1e-7d3a-9f10-5b2c8e4a1d22",
  "short_url": "https://l.curtei.com/aB3xK9",
  "slug": "aB3xK9",
  "domain": "l.curtei.com",
  "url": "https://minhaloja.com.br/promo",
  "status": "active",
  "has_password": false,
  "qr_code_url": "https://api.curtei.com/v1/links/0193a0b2-7c1e-7d3a-9f10-5b2c8e4a1d22/qr",
  "total_clicks": 0,
  "unique_clicks": 0,
  "external_id": null,
  "metadata": null,
  "created_at": "2026-11-13T21:30:00Z"
}

Erros comuns

HTTPcodeO que fazer
400invalid_urlEnvie uma URL completa, com https://.
403email_not_verifiedConfirme o e-mail da conta.
409slug_takenEscolha outro slug ou omita para gerar um aleatório.
422url_blockedO destino foi classificado como inseguro; details.reason diz o motivo.
422custom_slug_requires_own_domainCadastre um domínio próprio ou não envie slug.
429creation_rate_exceededEspere details.retry_after segundos.

Listar links

GET /links (escopo links:read). Filtros: tag, campaign_id, external_id, status, domain, search (título, destino ou código), created_from, created_to, sort (created_at ou total_clicks), limit (até 100) e cursor.

curl "https://api.curtei.com/v1/links?tag=newsletter&limit=50" \
  -H "Authorization: Bearer $CURTEI_TOKEN"

Obter, editar e apagar

RotaUso
GET /links/{id}Um link pelo id
GET /links/by-external-id/{external_id}Um link pelo seu identificador
PATCH /links/{id}Muda url, title, expires_at, max_clicks, status (active/disabled), tags, utm, metadata, password, rules, variants. O slug não muda.
DELETE /links/{id}Apaga. O código fica reservado por 90 dias.

Trocar a url de um link já divulgado é o jeito de mudar o destino sem trocar o link curto nem reimprimir o QR Code. A nova URL passa pela mesma checagem de segurança.