API para desenvolvedores
Uma API REST que cobre tudo o que o painel faz
Crie links, leia estatísticas, conecte domínios e administre espaços de trabalho de clientes por HTTP com uma chave bearer. A API é gerada a partir dos mesmos esquemas de validação que o produto usa, publicada como OpenAPI e congelada na versão um — mudanças incompatíveis só chegam como uma versão nova.
Dois escopos de chave, porque existem dois tipos de chamador
Uma chave de espaço de trabalho age dentro de um espaço de trabalho: links, estatísticas, domínios disponíveis para ele e o próprio consumo. Uma chave de parceiro age no negócio inteiro: clientes e suas assinaturas, os planos que você vende, todos os domínios, pagamentos com a composição das taxas, repasses e uma visão agregada de estatísticas. Os dois prefixos são visivelmente diferentes, então uma chave colada no serviço errado falha na hora em vez de fazer algo surpreendente.
As chaves são criadas no painel, exibidas uma única vez e guardadas só como hash. Cada chave carrega a própria lista de escopos, então uma integração que só precisa ler estatísticas pode receber uma chave incapaz de criar ou apagar qualquer coisa. As chaves podem receber data de expiração e ser revogadas na hora, e a última vez em que cada uma foi usada fica visível, que é como se encontra aquela integração que ninguém lembra de ter montado.
- POST /links, GET /links, GET /links/{id}, PATCH /links/{id}, DELETE /links/{id}
- POST /links/bulk — até cem links por chamada
- GET /links/{id}/qr — PNG ou SVG, com um preset e um tamanho
- GET /analytics/summary, /timeseries, /breakdown, /links/top, /export.csv
- GET e POST /domains — conecte um domínio e leia os registros DNS de que ele precisa
- GET /workspace — limites do plano e consumo atual
- GET /partner/clients, /partner/plans, /partner/payments, /partner/payouts
Previsível naquilo que importa às três da manhã
Todo erro tem o mesmo formato — um código, uma mensagem legível por humanos e uma URL de documentação — para que uma biblioteca cliente possa ramificar pelo código e uma pessoa possa ler a mensagem. As listas são paginadas por cursor em vez de números de página, o que mantém os resultados estáveis enquanto links são criados por baixo de você.
O limite de requisições é de seiscentas por minuto em uma chave de espaço de trabalho e o dobro disso em uma chave de parceiro, com o limite, o saldo restante e o horário de reinício devolvidos como cabeçalhos em cada resposta. Ultrapassá-lo devolve 429 com o cabeçalho Retry-After em vez de derrubar a conexão, para que clientes bem-comportados recuem do jeito certo. As exportações de estatísticas são em streaming, então cem mil linhas não exigem segurar um relatório em memória de nenhum dos dois lados.
Webhooks para os eventos que você ficaria consultando em loop
Registre um endpoint e receba criações, atualizações e exclusões de links; eventos do ciclo de vida de domínio conforme um hostname passa de SSL pendente para ativo ou para erro; e, em chaves de parceiro, eventos de assinatura e pagamento de clientes. Consultar um endpoint de status de domínio uma vez por minuto é exatamente o tipo de código que ninguém deveria estar escrevendo.
Cada entrega leva um cabeçalho de assinatura HMAC-SHA256 com marca de tempo, para que o seu receptor possa verificar que o payload veio de nós e não é uma repetição. Entregas que falham são retentadas cinco vezes com intervalos crescentes — um minuto, cinco, trinta, duas horas, doze — depois das quais o endpoint é marcado como falho e um e-mail é enviado. Um evento de teste pode ser disparado do painel, então a integração é verificável antes que algo real dependa dela.
Documentação gerada a partir do código que roda
A especificação OpenAPI é construída a partir dos mesmos esquemas contra os quais a API valida, o que significa que ela não pode se desviar da implementação como acontece com uma referência escrita à mão. É publicada como arquivo que você pode passar a um gerador de clientes e renderizada como documentação de referência navegável neste site, ao lado de guias escritos à mão de início rápido, paginação, erros, webhooks e limites de requisições.
A versão um está congelada. Campos novos podem ser acrescentados, o comportamento existente não vai mudar, e qualquer coisa que quebrasse um chamador espera por uma versão dois em outro caminho. Se você está escolhendo um encurtador para construir em cima, e não apenas para usar, essa promessa vale mais que qualquer endpoint específico.
Código que fala por si
curl -X POST https://api.linkprofit.com/v1/links \
-H 'Authorization: Bearer lp_live_XXXXXXXX' \
-H 'Content-Type: application/json' \
-d '{
"url": "https://example.com/spring-collection",
"domain_id": "dom_8kq2vn41",
"slug": "spring",
"title": "Spring collection",
"utm": {
"utm_source": "newsletter",
"utm_medium": "email",
"utm_campaign": "spring-2026"
}
}'const response = await fetch("https://api.linkprofit.com/v1/links", {
method: "POST",
headers: {
Authorization: "Bearer lp_live_XXXXXXXX",
"Content-Type": "application/json",
},
body: JSON.stringify({
url: "https://example.com/spring-collection",
domain_id: "dom_8kq2vn41",
slug: "spring",
}),
});
if (!response.ok) {
const { error } = await response.json();
throw new Error(error.code + ": " + error.message);
}
const link = await response.json();
console.log(link, response.headers.get("X-RateLimit-Remaining"));import requests
response = requests.post(
"https://api.linkprofit.com/v1/links",
headers={"Authorization": "Bearer lp_live_XXXXXXXX"},
json={
"url": "https://example.com/spring-collection",
"domain_id": "dom_8kq2vn41",
"slug": "spring",
},
timeout=10,
)
if response.status_code == 429:
raise SystemExit("rate limited, retry after " + response.headers["Retry-After"])
response.raise_for_status()
print(response.json())Perguntas frequentes
Quais planos incluem acesso à API?
Para parceiros, o acesso à API começa no plano Growth e está incluído em tudo acima dele. Para os seus próprios clientes, quem decide é você: o acesso à API é uma das chaves de cada plano que você cria, então pode ser um nível premium do seu serviço ou estar incluído em todos.
A API pode rodar no meu próprio hostname?
Na versão um, não. A API é servida em api.linkprofit.com, e os parceiros a documentam para os seus clientes como a API do serviço deles. Tudo o que um cliente vê no navegador — painel, links, e-mails, checkout — está nos seus domínios; o hostname da API é a única exceção honesta.
Existe um sandbox para testes?
Use um espaço de trabalho dedicado e uma chave com escopo nele. Os links criados ali resolvem em um domínio real e produzem estatísticas reais, o que é mais útil que um ambiente simulado quando você está verificando se redirecionamentos, segmentação e webhooks se comportam como documentado.
Lance o seu encurtador de links com a sua marca
Conecte um domínio, publique os seus preços e convide o primeiro cliente — a maioria dos parceiros entra no ar em uma noite.
Sem cartão para o teste.