개발자를 위한 도구

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
무료 도구

기본 주소

모든 엔드포인트는 아래 기본 주소에서 시작합니다:

https://quik.mn/api/v1

인증

요청마다 대시보드에서 발급받은 API 키를 Authorization 헤더에 담아 보내세요:

Authorization: Bearer qk_live_...

키는 누구에게도 공유하지 마세요. 유출됐다면 대시보드에서 다시 발급하세요.

엔드포인트 목록

짧은 링크
POST /api/v1/links 새 짧은 링크 만들기
GET /api/v1/links 링크 목록 가져오기
GET /api/v1/links/{id} 링크 하나의 정보
PATCH /api/v1/links/{id} 링크 수정
DELETE /api/v1/links/{id} 링크 삭제
POST /api/v1/links/{id}/extend 유효기간 연장 — 본문에 연장 일수를 지정합니다(예: 365)
QR 코드
GET /api/v1/links/{id}/qr QR 코드 가져오기 — 형식(PNG·SVG), 크기, 전경·배경 색상을 쿼리 값으로 지정합니다
Email Counter
POST /api/v1/timers 이메일 카운터 만들기 — 응답: gif_url + embed_html
GET /api/v1/timers 카운터 목록
GET /api/v1/timers/{id} 카운터 하나의 정보
PATCH /api/v1/timers/{id} 카운터 수정
DELETE /api/v1/timers/{id} 카운터 삭제
카운트다운 페이지
POST /api/v1/countdowns Countdown 페이지 만들기 — 응답: page_url
GET /api/v1/countdowns 페이지 목록
GET /api/v1/countdowns/{id} 페이지 하나의 정보
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} 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} 메뉴 하나 — 항목까지 함께
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 서명 만들기 — 로고는 주소 형태로만 받습니다
GET /api/v1/signatures 서명 목록
GET /api/v1/signatures/{id} 서명 하나 — 완성된 HTML까지 함께
PATCH /api/v1/signatures/{id} 서명 수정
DELETE /api/v1/signatures/{id} 서명 삭제
계정
GET /api/v1/me 현재 계정 정보

매개변수

POST /api/v1/links — 요청 본문 필드:

url required 이동할 대상 주소(웹 주소).
alias optional 맞춤 짧은 이름(영문자, 숫자, - 와 _, 1~64자). 슬러그 필드로 보내도 인식합니다.
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 같은 주소를 가진 활성 링크가 이미 있을 때의 동작입니다. 재사용(기본값 — 기존 링크를 그대로 돌려주며 재사용 표시 필드가 :true 로 옵니다) 또는 새로 만들기. 별칭을 지정하면 항상 새 링크를 만듭니다.

GET /api/v1/links — 쿼리 매개변수:

limit 한 페이지에 반환할 개수(1~100, 기본값 25).
offset 건너뛸 행의 수(페이지 나누기).
q 검색 — 짧은 이름, 제목, 대상 주소에서 찾습니다.

오류 형식

모든 오류는 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

대시보드의 Webhook 메뉴에서 엔드포인트를 등록하면 선택한 이벤트가 일어날 때마다 지정한 URL 주소로 JSON 데이터를 POST 요청으로 보내 드립니다. 2xx 응답이면 성공으로 보고, 그렇지 않으면 1분 → 10분 간격으로 최대 3회까지 다시 시도합니다. 연속 10회 실패하면 Webhook 설정이 자동으로 꺼집니다.

link.created 새 짧은 링크가 만들어질 때(웹 + API)
link.deleted 링크가 삭제될 때
link.expired 링크가 만료되거나 클릭 한도에 도달할 때(매일 점검)
link.clicks.milestone 클릭 수가 100 / 1,000 / 10,000을 넘을 때 — 페이로드에 마일스톤 필드가 함께 옵니다
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). 시크릿은 웹훅을 만들 때 딱 한 번만 표시됩니다. 서명은 반드시 가공하지 않은 원본 본문을 기준으로, 상수 시간 비교 방식으로 확인하세요:

<?php
// PHP — 원본(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) — 원본(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);
});

제한: Free 요금제 1개, Pro 요금제 3개, Business 요금제 10개의 웹훅. 엔드포인트는 외부에서 접근할 수 있는 공개 주소여야 합니다(내부 네트워크 주소는 막혀 있습니다).

API 키를 받아 보세요
대시보드의 API 메뉴에서 키를 만들고 바로 시작하세요.
API 키 받기