Dibuat untuk developer

Dokumentasi API

Buat, kelola, dan tarik statistik tautan secara terprogram lewat REST API Quik.mn.

Semua layanan

Semua produk platform Quik.mn — lewat REST API maupun web.

Tautan pendek
REST API
Kode QR
REST API
Email Counter
REST API
Countdown
REST API
Quik Bio
REST API
QR Menu
REST API
Tanda tangan email
REST API
UTM builder
Perangkat gratis

Alamat dasar

Semua endpoint diawali alamat dasar berikut:

https://quik.mn/api/v1

Autentikasi

Pada setiap permintaan, sertakan kunci API dari dasbor Anda Authorization di header berikut:

Authorization: Bearer qk_live_...

Jangan bagikan kunci Anda kepada siapa pun. Jika bocor, buat ulang dari dasbor.

Daftar endpoint

Tautan pendek
POST /api/v1/links Buat tautan pendek baru
GET /api/v1/links Ambil daftar tautan
GET /api/v1/links/{id} Detail satu tautan
PATCH /api/v1/links/{id} Edit tautan
DELETE /api/v1/links/{id} Hapus tautan
POST /api/v1/links/{id}/extend Perpanjang masa berlaku — body: {"days": 365}
Kode QR
GET /api/v1/links/{id}/qr Ambil kode QR — ?format=png|svg&size=300&fg=241210&bg=FFFFFF
Email Counter
POST /api/v1/timers Buat timer email — respons: gif_url + embed_html
GET /api/v1/timers Daftar timer
GET /api/v1/timers/{id} Detail satu timer
PATCH /api/v1/timers/{id} Edit timer
DELETE /api/v1/timers/{id} Hapus timer
Halaman countdown
POST /api/v1/countdowns Buat halaman countdown — respons: page_url
GET /api/v1/countdowns Daftar halaman
GET /api/v1/countdowns/{id} Detail satu halaman
PATCH /api/v1/countdowns/{id} Edit halaman
DELETE /api/v1/countdowns/{id} Hapus halaman
Quik Bio
POST /api/v1/bio-pages Buat halaman Bio — respons: page_url (avatar hanya lewat web)
GET /api/v1/bio-pages Daftar halaman Bio Anda
GET /api/v1/bio-pages/{id} Satu halaman Bio — beserta tautannya
PATCH /api/v1/bio-pages/{id} Edit halaman Bio
DELETE /api/v1/bio-pages/{id} Hapus halaman Bio
GET /api/v1/bio-pages/{id}/stats Statistik Bio — tampilan dan klik
GET /api/v1/bio-pages/{id}/links Daftar tautan Bio
POST /api/v1/bio-pages/{id}/links Tambah tautan Bio
PATCH /api/v1/bio-pages/{id}/links/{lid} Edit tautan Bio
DELETE /api/v1/bio-pages/{id}/links/{lid} Hapus tautan Bio
QR Menu
POST /api/v1/menus Buat menu — respons: page_url
GET /api/v1/menus Daftar menu Anda
GET /api/v1/menus/{id} Satu menu — beserta hidangannya
PATCH /api/v1/menus/{id} Edit menu
DELETE /api/v1/menus/{id} Hapus menu
GET /api/v1/menus/{id}/stats Statistik pemindaian — total, 30 hari, per meja
GET /api/v1/menus/{id}/items Daftar hidangan
POST /api/v1/menus/{id}/items Tambah hidangan — foto hanya lewat web
PATCH /api/v1/menus/{id}/items/{iid} Edit hidangan
DELETE /api/v1/menus/{id}/items/{iid} Hapus hidangan
Tanda tangan email
POST /api/v1/signatures Buat tanda tangan — logo hanya berupa URL
GET /api/v1/signatures Daftar tanda tangan Anda
GET /api/v1/signatures/{id} Satu tanda tangan — beserta signature_html
PATCH /api/v1/signatures/{id} Edit tanda tangan
DELETE /api/v1/signatures/{id} Hapus tanda tangan
Akun
GET /api/v1/me Detail akun saat ini

Parameter

POST /api/v1/links — kolom body:

url required Alamat tujuan yang panjang (http/https).
alias optional Nama pendek kustom (huruf, angka, - dan _; 1–64 karakter). Juga diterima dengan nama "slug".
title optional Judul (hingga 200 karakter).
expires_at optional Waktu berakhir — tanggal di masa depan (mis. 2026-12-31 23:59:59). Maksimum 1 tahun; jika dikosongkan, 1 tahun. Mengirim null lewat PATCH mengembalikannya ke 1 tahun.
expire_days optional Atau dalam hari: 1/7/30/90/180/365. Lebih mudah daripada expires_at.
starts_at optional Waktu aktivasi — tanggal-waktu UTC (mis. 2026-08-01 02:00:00). Sampai waktu tersebut pengunjung melihat hitung mundur; harus lebih awal daripada expires_at. Kirim null lewat PATCH agar tautan langsung aktif.
on_duplicate optional Jika alamat itu sudah punya tautan aktif: "reuse" (bawaan — mengembalikan yang lama, dengan kolom reused:true) atau "create" (membuat baru). Bila alias ditentukan, tautan baru selalu dibuat.

GET /api/v1/links — parameter query:

limit Jumlah yang dikembalikan per halaman (1–100, bawaan 25).
offset Jumlah baris yang dilewati (paginasi).
q Pencarian — mencari pada slug, judul, dan alamat tujuan.

Format kesalahan

Setiap kesalahan dikembalikan dengan kode status HTTP (401, 404, 409, 422, 429) dan struktur JSON yang seragam:

{ "error": "alias_taken", "message": "Alias ini dicadangkan atau sudah digunakan." }

Kode yang umum: unauthorized (401), not_found (404), alias_taken (409), invalid_url / invalid_alias / invalid_expires_at / invalid_starts_at (422), rate_limited (429).

Batasan

60 permintaan per menit untuk setiap kunci API
Jika terlampaui, respons 429 rate_limited akan dikembalikan — tunggu sebentar lalu coba lagi.

Contoh permintaan

Contoh cURL membuat tautan pendek:

curl -X POST https://quik.mn/api/v1/links \
  -H "Authorization: Bearer qk_live_xxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/jalur/yang/sangat/panjang",
    "alias": "promo",
    "title": "Kampanye Ramadan",
    "expires_at": "2026-12-31 23:59:59"
  }'

Webhook

Daftarkan endpoint di bagian Webhook pada dasbor — begitu peristiwa yang dipilih terjadi, kami mengirim POST JSON ke URL Anda. Respons 2xx = berhasil; jika tidak, kami mencoba ulang hingga 3 kali dengan jeda 1 → 10 menit. Setelah 10 kegagalan berturut-turut, webhook dinonaktifkan otomatis.

link.created Saat tautan pendek baru dibuat (web + API)
link.deleted Saat tautan dihapus
link.expired Saat masa berlaku/batas tautan habis (lewat pemeriksaan harian)
link.clicks.milestone Saat klik melewati ambang 100 / 1.000 / 10.000 — payload menyertakan kolom milestone
timer.expired Saat timer Email Counter berakhir
countdown.expired Saat halaman countdown berakhir
webhook.ping Peristiwa uji yang dikirim lewat tombol "Uji"

Struktur setiap pengiriman (contoh):

{
  "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://example.com/jalur/yang/sangat/panjang", "title": "Kampanye Ramadan",
      "clicks": 0, "active": true, "state": "ok",
      "created_at": "2026-07-18 09:30:00", "expires_at": "2027-07-18 09:30:00"
    }
  }
}

Verifikasi tanda tangan

Setiap pengiriman disertai header berikut: X-Quik-Event (nama peristiwa), X-Quik-Signaturesha256=HMAC_SHA256(body, secret). Secret hanya ditampilkan sekali, saat webhook dibuat. Tanda tangan WAJIB diverifikasi pada body mentah (raw) dengan perbandingan waktu-konstan:

<?php
// PHP — verifikasi tanda tangan pada body mentah (raw)
$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) — verifikasi tanda tangan pada body mentah (raw)
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);
});

Batas: paket Free 1, Pro 3, Business 10 webhook. Endpoint harus alamat http/https yang dapat diakses publik (alamat jaringan internal dilarang).

Dapatkan kunci API Anda
Buat kunci di bagian API pada dasbor dan mulailah sekarang juga.
Dapatkan kunci API