Für Entwickler gemacht

API-Dokumentation

Erstellen und verwalten Sie Links programmatisch und rufen Sie Statistiken ab — über die Quik.mn REST API.

Alle Dienste

Alle Produkte der Quik.mn-Plattform — per REST API und im Web.

Kurzlink
REST API
QR-Code
REST API
Email Counter
REST API
Countdown
REST API
Quik Bio
REST API
Speisekarten-QR
REST API
E-Mail-Signatur
REST API
UTM builder
Kostenlose Tools

Basis-URL

Alle Endpoints beginnen mit dieser Basis-URL:

https://quik.mn/api/v1

Authentifizierung

Übergeben Sie Ihren API-Schlüssel aus dem Dashboard bei jeder Anfrage im Authorization Header:

Authorization: Bearer qk_live_...

Geben Sie Ihren Schlüssel niemals weiter. Falls er kompromittiert wurde, erstellen Sie im Dashboard einen neuen.

Endpoint-Liste

Kurzlink
POST /api/v1/links Neuen Kurzlink erstellen
GET /api/v1/links Liste der Links abrufen
GET /api/v1/links/{id} Details eines Links
PATCH /api/v1/links/{id} Link bearbeiten
DELETE /api/v1/links/{id} Link löschen
POST /api/v1/links/{id}/extend Laufzeit verlängern — body: {"days": 365}
QR-Code
GET /api/v1/links/{id}/qr QR-Code abrufen — ?format=png|svg&size=300&fg=241210&bg=FFFFFF
Email Counter
POST /api/v1/timers Email-Counter erstellen — Antwort: gif_url + embed_html
GET /api/v1/timers Liste der Countdowns
GET /api/v1/timers/{id} Details eines Countdowns
PATCH /api/v1/timers/{id} Countdown bearbeiten
DELETE /api/v1/timers/{id} Countdown löschen
Countdown-Seite
POST /api/v1/countdowns Countdown-Seite erstellen — Antwort: page_url
GET /api/v1/countdowns Liste der Seiten
GET /api/v1/countdowns/{id} Details einer Seite
PATCH /api/v1/countdowns/{id} Seite bearbeiten
DELETE /api/v1/countdowns/{id} Seite löschen
Quik Bio
POST /api/v1/bio-pages Bio-Seite erstellen — Antwort: page_url (Avatar nur über das Web)
GET /api/v1/bio-pages Liste Ihrer Bio-Seiten
GET /api/v1/bio-pages/{id} Eine Bio-Seite — samt Links
PATCH /api/v1/bio-pages/{id} Bio-Seite bearbeiten
DELETE /api/v1/bio-pages/{id} Bio-Seite löschen
GET /api/v1/bio-pages/{id}/stats Bio-Statistik — Aufrufe und Klicks
GET /api/v1/bio-pages/{id}/links Liste der Bio-Links
POST /api/v1/bio-pages/{id}/links Bio-Link hinzufügen
PATCH /api/v1/bio-pages/{id}/links/{lid} Bio-Link bearbeiten
DELETE /api/v1/bio-pages/{id}/links/{lid} Bio-Link löschen
Speisekarten-QR
POST /api/v1/menus Speisekarte erstellen — Antwort: page_url
GET /api/v1/menus Liste Ihrer Speisekarten
GET /api/v1/menus/{id} Eine Speisekarte — samt Gerichten
PATCH /api/v1/menus/{id} Speisekarte bearbeiten
DELETE /api/v1/menus/{id} Speisekarte löschen
GET /api/v1/menus/{id}/stats Scan-Statistik — gesamt, 30 Tage, nach Tisch
GET /api/v1/menus/{id}/items Liste der Gerichte
POST /api/v1/menus/{id}/items Gericht hinzufügen — Foto nur über das Web
PATCH /api/v1/menus/{id}/items/{iid} Gericht bearbeiten
DELETE /api/v1/menus/{id}/items/{iid} Gericht löschen
E-Mail-Signatur
POST /api/v1/signatures Signatur erstellen — Logo nur als URL
GET /api/v1/signatures Liste Ihrer Signaturen
GET /api/v1/signatures/{id} Eine Signatur — samt signature_html
PATCH /api/v1/signatures/{id} Signatur bearbeiten
DELETE /api/v1/signatures/{id} Signatur löschen
Konto
GET /api/v1/me Daten des aktuellen Kontos

Parameter

POST /api/v1/links — body-Felder:

url required Lange Ziel-URL (http/https).
alias optional Eigener Kurzname (Buchstaben, Ziffern, - und _; 1–64 Zeichen). Wird auch unter dem Namen „slug“ akzeptiert.
title optional Titel (bis zu 200 Zeichen).
expires_at optional Ablaufdatum — ein Datum in der Zukunft (z. B. 2026-12-31 23:59:59). Maximal 1 Jahr; ohne Angabe 1 Jahr. Wird in PATCH null gesendet, wird der Zeitraum auf 1 Jahr zurückgesetzt.
expire_days optional Oder in Tagen: 1/7/30/90/180/365. Einfacher als expires_at.
starts_at optional Aktivierungszeitpunkt — Datum/Uhrzeit in UTC (z. B. 2026-08-01 02:00:00). Bis dahin sehen Besucher einen Countdown; er muss vor expires_at liegen. Wird in PATCH null gesendet, wird der Link sofort aktiv.
on_duplicate optional Falls für diese URL bereits ein aktiver Link existiert: "reuse" (Standard — der bestehende wird mit dem Feld reused:true zurückgegeben) oder "create" (neu erstellen). Bei angegebenem Alias wird immer neu erstellt.

GET /api/v1/links — query-Parameter:

limit Anzahl der Einträge pro Seite (1–100, Standard 25).
offset Anzahl zu überspringender Zeilen (Paginierung).
q Suche — in slug, Titel und Ziel-URL.

Fehlerformat

Jeder Fehler kommt mit einem HTTP-Statuscode (401, 404, 409, 422, 429) und einer einheitlichen JSON-Struktur:

{ "error": "alias_taken", "message": "Dieser Alias ist reserviert oder bereits vergeben." }

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

Limits

60 Anfragen pro Minute je API-Schlüssel
Bei Überschreitung kommt 429 rate_limited als Antwort — warten Sie kurz und versuchen Sie es erneut.

Beispielanfrage

cURL-Beispiel zum Erstellen eines Kurzlinks:

curl -X POST https://quik.mn/api/v1/links \
  -H "Authorization: Bearer qk_live_xxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://beispiel.de/ein/sehr/langer/pfad",
    "alias": "promo",
    "title": "Frühjahrskampagne",
    "expires_at": "2026-12-31 23:59:59"
  }'

Webhook

Registrieren Sie einen Endpoint im Webhook-Bereich des Dashboards — bei jedem gewählten Ereignis senden wir einen JSON-POST an Ihre URL. Eine 2xx-Antwort gilt als Erfolg; andernfalls versuchen wir es bis zu 3-mal erneut, mit 1 bis 10 Minuten Abstand. Nach 10 Fehlschlägen in Folge wird der Webhook automatisch deaktiviert.

link.created Wenn ein neuer Kurzlink erstellt wird (Web + API)
link.deleted Wenn ein Link gelöscht wird
link.expired Wenn ein Link abläuft oder sein Klicklimit erreicht (tägliche Prüfung)
link.clicks.milestone Wenn die Klicks die Schwelle von 100 / 1.000 / 10.000 überschreiten — im payload kommt das Feld milestone
timer.expired Wenn ein Email-Counter abläuft
countdown.expired Wenn eine Countdown-Seite abläuft
webhook.ping Testereignis, ausgelöst über die Schaltfläche „Testen“

Aufbau jeder Zustellung (Beispiel):

{
  "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://beispiel.de/ein/sehr/langer/pfad", "title": "Frühjahrskampagne",
      "clicks": 0, "active": true, "state": "ok",
      "created_at": "2026-07-18 09:30:00", "expires_at": "2027-07-18 09:30:00"
    }
  }
}

Signatur prüfen

Jede Zustellung kommt mit diesen Headern: X-Quik-Event (Name des Ereignisses), X-Quik-Signaturesha256=HMAC_SHA256(body, secret). Das Secret wird nur ein einziges Mal angezeigt — beim Erstellen des Webhooks. Prüfen Sie die Signatur UNBEDINGT über den rohen (raw) body und nur mit einem zeitkonstanten Vergleich:

<?php
// PHP — Signatur über den rohen (raw) body prüfen
$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) — Signatur über den rohen (raw) body prüfen
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);
});

Limits: Tarif Free 1, Pro 3, Business 10 Webhooks. Der Endpoint muss eine öffentlich erreichbare http/https-Adresse sein (interne Netzwerkadressen sind nicht erlaubt).

Holen Sie sich Ihren API-Schlüssel
Erstellen Sie im API-Bereich des Dashboards einen Schlüssel und legen Sie direkt los.
API-Schlüssel erhalten