Pour les développeurs

Documentation API

Créez, gérez et récupérez les statistiques de vos liens par programmation avec l'API REST de Quik.mn.

Tous les services

Tous les produits de la plateforme Quik.mn : via l'API REST et sur le web.

Lien court
REST API
QR code
REST API
Email Counter
REST API
Countdown
REST API
Quik Bio
REST API
Menu QR
REST API
Signatures e-mail
REST API
UTM builder
Outils gratuits

URL de base

Tous les endpoints commencent par l'URL de base suivante :

https://quik.mn/api/v1

Authentification

À chaque requête, indiquez la clé API issue de votre tableau de bord dans l'en-tête Authorization comme ceci :

Authorization: Bearer qk_live_...

Ne communiquez votre clé à personne. En cas de fuite, régénérez-la depuis votre tableau de bord.

Liste des endpoints

Lien court
POST /api/v1/links Créer un lien court
GET /api/v1/links Lister vos liens
GET /api/v1/links/{id} Obtenir un lien
PATCH /api/v1/links/{id} Modifier un lien
DELETE /api/v1/links/{id} Supprimer un lien
POST /api/v1/links/{id}/extend Prolonger l'expiration — body : {"days": 365}
QR code
GET /api/v1/links/{id}/qr Obtenir un code QR — ?format=png|svg&size=300&fg=241210&bg=FFFFFF
Email Counter
POST /api/v1/timers Créer un Email Counter — réponse : gif_url + embed_html
GET /api/v1/timers Liste des compteurs
GET /api/v1/timers/{id} Détails d'un compteur
PATCH /api/v1/timers/{id} Modifier un compteur
DELETE /api/v1/timers/{id} Supprimer un compteur
Page de compte à rebours
POST /api/v1/countdowns Créer une page Countdown — réponse : page_url
GET /api/v1/countdowns Liste des pages
GET /api/v1/countdowns/{id} Détails d'une page
PATCH /api/v1/countdowns/{id} Modifier une page
DELETE /api/v1/countdowns/{id} Supprimer une page
Quik Bio
POST /api/v1/bio-pages Créer une page Bio — réponse : page_url (l'avatar s'ajoute uniquement depuis le web)
GET /api/v1/bio-pages Liste de vos pages Bio
GET /api/v1/bio-pages/{id} Obtenir une page Bio — liens inclus
PATCH /api/v1/bio-pages/{id} Modifier une page Bio
DELETE /api/v1/bio-pages/{id} Supprimer une page Bio
GET /api/v1/bio-pages/{id}/stats Statistiques Bio — vues et clics
GET /api/v1/bio-pages/{id}/links Liste des liens d'une page Bio
POST /api/v1/bio-pages/{id}/links Ajouter un lien Bio
PATCH /api/v1/bio-pages/{id}/links/{lid} Modifier un lien Bio
DELETE /api/v1/bio-pages/{id}/links/{lid} Supprimer un lien Bio
Menu QR
POST /api/v1/menus Créer un menu — réponse : page_url
GET /api/v1/menus Liste de vos menus
GET /api/v1/menus/{id} Obtenir un menu — plats inclus
PATCH /api/v1/menus/{id} Modifier un menu
DELETE /api/v1/menus/{id} Supprimer un menu
GET /api/v1/menus/{id}/stats Statistiques de scan — total, 30 jours, par table
GET /api/v1/menus/{id}/items Liste des plats
POST /api/v1/menus/{id}/items Ajouter un plat — la photo s'ajoute uniquement depuis le web
PATCH /api/v1/menus/{id}/items/{iid} Modifier un plat
DELETE /api/v1/menus/{id}/items/{iid} Supprimer un plat
Signatures e-mail
POST /api/v1/signatures Créer une signature — le logo est accepté uniquement sous forme d'URL
GET /api/v1/signatures Liste de vos signatures
GET /api/v1/signatures/{id} Obtenir une signature — signature_html inclus
PATCH /api/v1/signatures/{id} Modifier une signature
DELETE /api/v1/signatures/{id} Supprimer une signature
Compte
GET /api/v1/me Informations du compte actuel

Paramètres

POST /api/v1/links — champs du corps de la requête :

url required L'URL de destination (http/https).
alias optional Nom court personnalisé (lettres, chiffres, - et _ ; 1 à 64 caractères). Également accepté s'il est envoyé sous le nom « slug ».
title optional Titre (200 caractères maximum).
expires_at optional Date d'expiration : une date future (ex. 2026-12-31 23:59:59). Un an au maximum ; un an par défaut si le champ est omis. Envoyer null dans un PATCH la réinitialise à un an.
expire_days optional Ou en jours : 1/7/30/90/180/365. Plus simple qu'expires_at.
starts_at optional Date d'activation : date et heure UTC (ex. 2026-08-01 02:00:00). Jusqu'à l'heure programmée, les visiteurs voient un compte à rebours ; elle doit précéder expires_at. Envoyez null dans un PATCH pour activer immédiatement.
on_duplicate optional Si un lien actif vers la même adresse existe déjà : « reuse » (par défaut : renvoie l'ancien lien, avec un champ reused:true) ou « create » (en crée un nouveau). Lorsqu'un alias est indiqué, un nouveau lien est toujours créé.

GET /api/v1/links — paramètres de requête :

limit Nombre d'éléments renvoyés par page (1 à 100, 25 par défaut).
offset Nombre de lignes à ignorer (pagination).
q Recherche : porte sur le slug, le titre et l'URL de destination.

Format des erreurs

Chaque erreur renvoie un code d'état HTTP (401, 404, 409, 422, 429) et une structure JSON uniforme :

{ "error": "alias_taken", "message": "Cet alias est réservé ou déjà utilisé." }

Codes courants : unauthorized (401), not_found (404), alias_taken (409), invalid_url / invalid_alias / invalid_expires_at / invalid_starts_at (422), rate_limited (429).

Limites de débit

60 requêtes par minute et par clé API
En cas de dépassement, une réponse 429 rate_limited est renvoyée : patientez un instant, puis réessayez.

Exemple de requête

Exemple cURL pour créer un lien court :

curl -X POST https://quik.mn/api/v1/links \
  -H "Authorization: Bearer qk_live_xxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://exemple.com/chemin/tres/long",
    "alias": "promo",
    "title": "Campagne de printemps",
    "expires_at": "2026-12-31 23:59:59"
  }'

Webhook

Enregistrez un endpoint dans la section Webhook du tableau de bord : dès qu'un événement sélectionné se produit, nous envoyons un POST JSON à votre URL. Une réponse 2xx vaut succès ; sinon, nous réessayons jusqu'à 3 fois avec un délai de 1 min → 10 min. Après 10 échecs consécutifs, le webhook est automatiquement désactivé.

link.created Lorsqu'un nouveau lien court est créé (web + API)
link.deleted Lorsqu'un lien est supprimé
link.expired Lorsqu'un lien expire ou atteint sa limite de clics (vérification quotidienne)
link.clicks.milestone Lorsque les clics franchissent le seuil de 100 / 1 000 / 10 000 : la charge utile contient un champ milestone
timer.expired Lorsqu'un compte à rebours e-mail se termine
countdown.expired Lorsqu'une page de compte à rebours se termine
webhook.ping Événement de test envoyé par le bouton « Tester »

Structure de chaque envoi (exemple) :

{
  "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://exemple.com/chemin/tres/long", "title": "Campagne de printemps",
      "clicks": 0, "active": true, "state": "ok",
      "created_at": "2026-07-18 09:30:00", "expires_at": "2027-07-18 09:30:00"
    }
  }
}

Vérifier la signature

Chaque envoi comporte les en-têtes suivants : X-Quik-Event (le nom de l'événement), X-Quik-Signaturesha256=HMAC_SHA256(body, secret). Le secret n'est affiché qu'une seule fois, à la création du webhook. Vérifiez TOUJOURS la signature sur le corps brut (raw) de la requête, avec une comparaison à temps constant :

<?php
// PHP — vérifier la signature sur le corps brut (raw) de la requête
$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) — vérifier la signature sur le corps brut (raw) de la requête
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 pour l'offre Free, 3 pour Pro, 10 pour Business. L'endpoint doit être une URL http/https accessible publiquement (les adresses de réseau privé sont interdites).

Obtenez votre clé API
Créez une clé dans la section API de votre tableau de bord et lancez-vous sans attendre.
Obtenir une clé API