API 문서
Quik.mn REST API로 링크를 프로그래밍 방식으로 만들고 관리하며 통계를 내려받으세요.
전체 서비스
Quik.mn 플랫폼의 모든 제품 — REST API와 웹에서 함께 씁니다.
기본 주소
모든 엔드포인트는 아래 기본 주소에서 시작합니다:
인증
요청마다 대시보드에서 발급받은 API 키를 Authorization 헤더에 담아 보내세요:
키는 누구에게도 공유하지 마세요. 유출됐다면 대시보드에서 다시 발급하세요.
엔드포인트 목록
매개변수
POST /api/v1/links — 요청 본문 필드:
GET /api/v1/links — 쿼리 매개변수:
오류 형식
모든 오류는 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).
요청 제한
요청 예시
짧은 링크를 만드는 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 설정이 자동으로 꺼집니다.
모든 전송에 공통으로 쓰이는 구조(예시):
{
"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-Signature — sha256=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개의 웹훅. 엔드포인트는 외부에서 접근할 수 있는 공개 주소여야 합니다(내부 네트워크 주소는 막혀 있습니다).