Para desenvolvedores

Documentação da API

Crie, gerencie e baixe as análises dos seus links de forma programática com a REST API do Quik.mn.

Todos os serviços

Todos os produtos da plataforma Quik.mn: pela REST API e na web.

Link curto
REST API
QR code
REST API
Email Counter
REST API
Countdown
REST API
Quik Bio
REST API
Menu QR
REST API
Assinaturas de e-mail
REST API
UTM builder
Ferramentas gratuitas

URL base

Todos os endpoints partem da seguinte URL base:

https://quik.mn/api/v1

Autenticação

Em cada requisição, inclua a chave de API do seu painel no cabeçalho Authorization da seguinte forma:

Authorization: Bearer qk_live_...

Não compartilhe sua chave com ninguém. Se ela vazar, gere outra no painel.

Lista de endpoints

Link curto
POST /api/v1/links Criar um novo link curto
GET /api/v1/links Listar os links
GET /api/v1/links/{id} Dados de um link
PATCH /api/v1/links/{id} Editar um link
DELETE /api/v1/links/{id} Excluir um link
POST /api/v1/links/{id}/extend Estender a validade — body: {"days": 365}
QR code
GET /api/v1/links/{id}/qr Obter um QR code — ?format=png|svg&size=300&fg=241210&bg=FFFFFF
Email Counter
POST /api/v1/timers Criar um Email Counter — resposta: gif_url + embed_html
GET /api/v1/timers Lista de contadores
GET /api/v1/timers/{id} Detalhes do contador
PATCH /api/v1/timers/{id} Editar contador
DELETE /api/v1/timers/{id} Excluir contador
Página de contagem regressiva
POST /api/v1/countdowns Criar uma página Countdown — resposta: page_url
GET /api/v1/countdowns Lista de páginas
GET /api/v1/countdowns/{id} Detalhes da página
PATCH /api/v1/countdowns/{id} Editar página
DELETE /api/v1/countdowns/{id} Excluir página
Quik Bio
POST /api/v1/bio-pages Criar uma página Bio — resposta: page_url (o avatar só pode ser enviado pela web)
GET /api/v1/bio-pages Lista das suas páginas Bio
GET /api/v1/bio-pages/{id} Obter uma página Bio — com os links
PATCH /api/v1/bio-pages/{id} Atualizar uma página Bio
DELETE /api/v1/bio-pages/{id} Excluir uma página Bio
GET /api/v1/bio-pages/{id}/stats Estatísticas da Bio — visualizações e cliques
GET /api/v1/bio-pages/{id}/links Lista de links de uma página Bio
POST /api/v1/bio-pages/{id}/links Adicionar um link Bio
PATCH /api/v1/bio-pages/{id}/links/{lid} Atualizar um link Bio
DELETE /api/v1/bio-pages/{id}/links/{lid} Excluir um link Bio
Menu QR
POST /api/v1/menus Criar um cardápio — resposta: page_url
GET /api/v1/menus Lista dos seus cardápios
GET /api/v1/menus/{id} Obter um cardápio — com os itens
PATCH /api/v1/menus/{id} Atualizar um cardápio
DELETE /api/v1/menus/{id} Excluir um cardápio
GET /api/v1/menus/{id}/stats Estatísticas de leituras — total, 30 dias, por mesa
GET /api/v1/menus/{id}/items Lista de itens do cardápio
POST /api/v1/menus/{id}/items Adicionar um item — a foto só pode ser enviada pela web
PATCH /api/v1/menus/{id}/items/{iid} Atualizar um item do cardápio
DELETE /api/v1/menus/{id}/items/{iid} Excluir um item do cardápio
Assinaturas de e-mail
POST /api/v1/signatures Criar uma assinatura — o logo é aceito apenas como URL
GET /api/v1/signatures Lista das suas assinaturas
GET /api/v1/signatures/{id} Obter uma assinatura — com signature_html
PATCH /api/v1/signatures/{id} Atualizar uma assinatura
DELETE /api/v1/signatures/{id} Excluir uma assinatura
Conta
GET /api/v1/me Informações da conta atual

Parâmetros

POST /api/v1/links — campos do body:

url required URL de destino (http/https).
alias optional Nome curto personalizado (letras, números, - e _; 1–64 caracteres). Também é aceito se você enviar como “slug”.
title optional Título (até 200 caracteres).
expires_at optional Data de expiração: uma data futura (ex.: 2026-12-31 23:59:59). No máximo 1 ano; se omitido, 1 ano. Enviar null no PATCH redefine para 1 ano.
expire_days optional Ou em dias: 1/7/30/90/180/365. Mais simples que expires_at.
starts_at optional Horário de ativação: data e hora em UTC (ex.: 2026-08-01 02:00:00). Até o horário agendado os visitantes veem um countdown; precisa ser anterior a expires_at. Envie null no PATCH para ativar na hora.
on_duplicate optional Quando já existe um link ativo para a mesma URL: "reuse" (padrão: retorna o link existente com o campo reused:true) ou "create" (cria um novo). Se você informar um alias, um novo link é sempre criado.

GET /api/v1/links — parâmetros de query:

limit Quantidade de itens por página (1–100, padrão 25).
offset Quantidade de linhas a pular (paginação).
q Busca: procura no slug, no título e na URL de destino.

Formato de erro

Todo erro retorna um código de status HTTP (401, 404, 409, 422, 429) e uma estrutura JSON padronizada:

{ "error": "alias_taken", "message": "Esse alias está reservado ou já em uso." }

Códigos comuns: unauthorized (401), not_found (404), alias_taken (409), invalid_url / invalid_alias / invalid_expires_at / invalid_starts_at (422), rate_limited (429).

Limites de uso

60 requisições por minuto por chave de API
Se você exceder, retornamos um 429 rate_limited como resposta: aguarde um instante e tente de novo.

Exemplo de requisição

Exemplo em cURL para criar um link curto:

curl -X POST https://quik.mn/api/v1/links \
  -H "Authorization: Bearer qk_live_xxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://exemplo.com/caminho/muito/longo",
    "alias": "promo",
    "title": "Campanha de primavera",
    "expires_at": "2026-12-31 23:59:59"
  }'

Webhook

Cadastre um endpoint na seção Webhook do painel e enviaremos um POST com JSON para a sua URL sempre que um evento selecionado acontecer. Uma resposta 2xx conta como sucesso; caso contrário, tentamos de novo até 3 vezes, com intervalos de 1 min a 10 min. Depois de 10 falhas seguidas, o webhook é desativado automaticamente.

link.created Dispara quando um novo link curto é criado (web + API)
link.deleted Dispara quando um link é excluído
link.expired Dispara quando um link expira ou atinge o limite de cliques (verificação diária)
link.clicks.milestone Dispara quando os cliques passam de 100 / 1.000 / 10.000: o payload inclui o campo milestone
timer.expired Dispara quando um contador de e-mail termina
countdown.expired Dispara quando uma página de countdown termina
webhook.ping Evento de teste enviado pelo botão “Testar”

Estrutura de cada envio (exemplo):

{
  "event": "link.created",
  "created_at": "2026-07-18T09:30:00+00:00",
  "data": {
    "link": {
      "id": 42, "slug": "promo", "short_url": "https://quik.mn/promo",
      "long_url": "https://exemplo.com/caminho/muito/longo", "title": "Campanha de primavera",
      "clicks": 0, "active": true, "state": "ok",
      "created_at": "2026-07-18 09:30:00", "expires_at": "2027-07-18 09:30:00"
    }
  }
}

Verificar a assinatura

Cada envio chega com estes cabeçalhos: X-Quik-Event (o nome do evento), X-Quik-Signaturesha256=HMAC_SHA256(body, secret). O secret é exibido uma única vez, na criação do webhook. Verifique SEMPRE a assinatura sobre o corpo bruto (raw) da requisição, usando comparação de tempo constante:

<?php
// PHP — verifique a assinatura sobre o corpo bruto (raw) da requisição
$payload   = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_QUIK_SIGNATURE'] ?? '';
$expected  = 'sha256=' . hash_hmac('sha256', $payload, $secret);

if (!hash_equals($expected, $signature)) {
    http_response_code(401);
    exit('invalid signature');
}
$event = json_decode($payload, true);
// $event['event'], $event['data'] ...
http_response_code(200);
// Node.js (Express) — verifique a assinatura sobre o corpo bruto (raw) da requisição
const crypto = require('crypto');

app.post('/quik-webhook', express.raw({ type: 'application/json' }), (req, res) => {
  const signature = req.get('X-Quik-Signature') || '';
  const expected  = 'sha256=' +
    crypto.createHmac('sha256', secret).update(req.body).digest('hex');

  const a = Buffer.from(expected), b = Buffer.from(signature);
  if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) {
    return res.status(401).send('invalid signature');
  }
  const event = JSON.parse(req.body); // event.event, event.data ...
  res.sendStatus(200);
});

Limites: 1 webhook no Free, 3 no Pro e 10 no Business. O endpoint precisa ser uma URL http/https acessível publicamente (endereços de rede interna são bloqueados).

Pegue sua chave de API
Crie uma chave na seção API do painel e comece agora mesmo.
Obter chave de API