開発者のみなさまへ

API ドキュメント

Quik.mn の REST API を使えば、リンクの作成・管理からアナリティクスの取得まで、すべてプログラムから行えます。

すべてのサービス

Quik.mn のすべての製品を、REST API とウェブの両方から。

短縮リンク
REST API
QRコード
REST API
Email Counter
REST API
Countdown
REST API
Quik Bio
REST API
メニューQRコード
REST API
メール署名
REST API
UTM builder
無料ツール

ベース URL

すべてのエンドポイントは、次のベース URL から始まります:

https://quik.mn/api/v1

認証

リクエストごとに、ダッシュボードで取得した API キーを Authorization ヘッダーに含めます:

Authorization: Bearer qk_live_...

キーは誰にも渡さないでください。漏れてしまった場合は、ダッシュボードから作り直せます。

エンドポイント一覧

短縮リンク
POST /api/v1/links 新しい短縮リンクを作成
GET /api/v1/links リンクの一覧を取得
GET /api/v1/links/{id} 1件のリンクを取得
PATCH /api/v1/links/{id} リンクを更新
DELETE /api/v1/links/{id} リンクを削除
POST /api/v1/links/{id}/extend 有効期限を延長 — body: {"days": 365}
QRコード
GET /api/v1/links/{id}/qr QRコードを取得 — ?format=png|svg&size=300&fg=241210&bg=FFFFFF
Email Counter
POST /api/v1/timers Email Counter を作成 — レスポンス:gif_url + embed_html
GET /api/v1/timers カウンターの一覧
GET /api/v1/timers/{id} 1件のカウンターの詳細
PATCH /api/v1/timers/{id} カウンターを更新
DELETE /api/v1/timers/{id} カウンターを削除
カウントダウンページ
POST /api/v1/countdowns カウントダウンページを作成 — レスポンス:page_url
GET /api/v1/countdowns ページの一覧
GET /api/v1/countdowns/{id} 1件のページの詳細
PATCH /api/v1/countdowns/{id} ページを更新
DELETE /api/v1/countdowns/{id} ページを削除
Quik Bio
POST /api/v1/bio-pages Bio ページを作成 — レスポンス:page_url(アバターの登録はウェブのみ)
GET /api/v1/bio-pages Bio ページの一覧
GET /api/v1/bio-pages/{id} 1件の bio ページを取得 — リンクも含みます
PATCH /api/v1/bio-pages/{id} Bio ページを更新
DELETE /api/v1/bio-pages/{id} Bio ページを削除
GET /api/v1/bio-pages/{id}/stats Bio の統計 — 表示数とクリック数
GET /api/v1/bio-pages/{id}/links Bio ページのリンク一覧
POST /api/v1/bio-pages/{id}/links Bio のリンクを追加
PATCH /api/v1/bio-pages/{id}/links/{lid} Bio のリンクを更新
DELETE /api/v1/bio-pages/{id}/links/{lid} Bio のリンクを削除
メニューQRコード
POST /api/v1/menus メニューを作成 — レスポンス:page_url
GET /api/v1/menus メニューの一覧
GET /api/v1/menus/{id} 1件のメニューを取得 — 品目も含みます
PATCH /api/v1/menus/{id} メニューを更新
DELETE /api/v1/menus/{id} メニューを削除
GET /api/v1/menus/{id}/stats スキャン統計 — 累計・30日間・テーブル別
GET /api/v1/menus/{id}/items メニュー品目の一覧
POST /api/v1/menus/{id}/items メニュー品目を追加 — 写真の登録はウェブのみ
PATCH /api/v1/menus/{id}/items/{iid} メニュー品目を更新
DELETE /api/v1/menus/{id}/items/{iid} メニュー品目を削除
メール署名
POST /api/v1/signatures 署名を作成 — ロゴは URL でのみ指定できます
GET /api/v1/signatures 署名の一覧
GET /api/v1/signatures/{id} 1件の署名を取得 — signature_html も含みます
PATCH /api/v1/signatures/{id} 署名を更新
DELETE /api/v1/signatures/{id} 署名を削除
アカウント
GET /api/v1/me 現在のアカウント情報

パラメーター

POST /api/v1/links — body のフィールド:

url required 転送先の URL(http/https)。
alias optional カスタムの短縮名(英字・数字・- と _、1〜64文字)。「slug」という名前で送っても受け付けます。
title optional タイトル(200文字まで)。
expires_at optional 有効期限。未来の日時を指定します(例:2026-12-31 23:59:59)。最長1年、省略した場合は1年です。PATCH で null を送ると1年に戻ります。
expire_days optional 日数での指定もできます:1/7/30/90/180/365。expires_at より手軽です。
starts_at optional 公開日時。UTC の日時を指定します(例:2026-08-01 02:00:00)。指定の時刻まで、訪問者にはカウントダウンが表示されます。expires_at より前である必要があります。PATCH で null を送ると、すぐに公開されます。
on_duplicate optional 同じ URL の有効なリンクがすでにある場合の動作。"reuse"(既定 — 既存のリンクを reused:true 付きで返します)または "create"(新しく作成します)。alias を指定したときは、常に新規作成になります。

GET /api/v1/links — query パラメーター:

limit 1ページあたりの件数(1〜100、既定は25)。
offset スキップする行数(ページ送り)。
q 検索。slug、タイトル、転送先の URL から探します。

エラー形式

エラーはすべて、HTTP のステータスコード(401、404、409、422、429)と、統一された JSON 構造で返ります:

{ "error": "alias_taken", "message": "このエイリアスは予約済みか、すでに使用されています。" }

主なコード: unauthorized (401), not_found (404), alias_taken (409), invalid_url / invalid_alias / invalid_expires_at / invalid_starts_at (422), rate_limited (429).

レート制限

API キーごとに毎分60リクエスト
上限を超えると 429 rate_limited エラーが返ります。少し待ってから、もう一度お試しください。

リクエスト例

短縮リンクを作成する cURL の例:

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/とても/長い/パス",
    "alias": "promo",
    "title": "春キャンペーン",
    "expires_at": "2026-12-31 23:59:59"
  }'

Webhook

ダッシュボードのウェブフック欄でエンドポイントを登録すると、選んだイベントが起きるたびに、指定の URL へ JSON を POST します。2xx の応答が成功で、それ以外は1分→10分の間隔で最大3回まで再送します。10回続けて失敗した場合、ウェブフックは自動的に停止します。

link.created 新しい短縮リンクが作成されたとき(ウェブ・API)
link.deleted リンクが削除されたとき
link.expired リンクの有効期限が切れる、またはクリック上限に達したとき(毎日のチェック)
link.clicks.milestone クリックが 100 / 1,000 / 10,000 のしきい値を超えたとき。payload に milestone フィールドが入ります
timer.expired メールカウンターが終了したとき
countdown.expired カウントダウンページが終了したとき
webhook.ping 「テスト」ボタンから送られるテスト用のイベント

各配信の構造(例):

{
  "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/とても/長い/パス", "title": "春キャンペーン",
      "clicks": 0, "active": true, "state": "ok",
      "created_at": "2026-07-18 09:30:00", "expires_at": "2027-07-18 09:30:00"
    }
  }
}

署名の検証

どの配信にも、次のヘッダーが付きます: X-Quik-Event (イベント名), X-Quik-Signaturesha256=HMAC_SHA256(body, secret). シークレットは、ウェブフックを作成したときに一度だけ表示されます。署名は必ず生の(raw)リクエストボディに対して、一定時間比較で検証してください:

<?php
// PHP — 生のリクエストボディ(raw body)で署名を検証
$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) — 生のリクエストボディ(raw body)で署名を検証
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);
});

上限:Free は1件、Pro は3件、Business は10件のウェブフックまで。エンドポイントは外部から到達できる http/https のアドレスである必要があります(内部ネットワークのアドレスは使えません)。

APIキーを受け取りましょう
ダッシュボードの API 欄でキーを作れば、すぐに始められます。
APIキーを取得