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.
URL de base
Tous les endpoints commencent par l'URL de base suivante :
Authentification
À chaque requête, indiquez la clé API issue de votre tableau de bord dans l'en-tête Authorization comme ceci :
Ne communiquez votre clé à personne. En cas de fuite, régénérez-la depuis votre tableau de bord.
Liste des endpoints
Paramètres
POST /api/v1/links — champs du corps de la requête :
GET /api/v1/links — paramètres de requête :
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
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é.
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-Signature — sha256=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).