무엇을 만들고 있나요?
전체 API 문서가맹점 정보 없이 첫 거래를 연결하세요.#
안정적인 deviceId 하나로 시작할 수 있습니다. 가디언은 거래를 저장하고, 같은 HTTP 응답에서 위험 점수와 규칙별 결과를 반환합니다.
- 1
- 2
- 3
인증 / API 키#
모든 Gateway 요청의 x-api-key 헤더에 해당 사이트의 API 키를 전달합니다. 로그인 세션과 Gateway API 키는 용도가 다릅니다. 사이트 코드와 키가 일치해야 하며, 다른 사이트의 이벤트는 조회할 수 없습니다.
| 설정 | 값 / 사용 방법 |
|---|---|
GUARDIAN_BASE_URL | Gateway HTTPS 주소: https://api.fdsguard.co.kr (끝의 / 제외) |
GUARDIAN_SITE_CODE | 관리자 → 사이트·설정에 표시된 실제 사이트 코드 |
GUARDIAN_API_KEY | 해당 사이트의 API 키. 서버 환경변수 또는 비밀 저장소에 보관 |
export GUARDIAN_BASE_URL="https://api.fdsguard.co.kr"
export GUARDIAN_SITE_CODE="YOUR_SITE_CODE"
export GUARDIAN_API_KEY="YOUR_API_KEY"가디언 API는 위 HTTPS 주소로 호출합니다. 개발 테스트 시에는 요청 본문에 mode: "development"를 명시하세요. 아래 cURL 예제는 Bash / zsh 기준입니다.
거래신호 전송#
거래신호를 전송하면 거래·단말기 연결·위험평가·사용량 저장을 완료한 뒤 결과를 반환합니다. 아래 예제는 코드 생성용이며 실제 거래를 전송하지 않습니다.
/api/v1/sites/{code}/api-risk-score200curl -X POST "$GUARDIAN_BASE_URL/api/v1/sites/$GUARDIAN_SITE_CODE/api-risk-score" \
-H "Content-Type: application/json" \
-H "x-api-key: $GUARDIAN_API_KEY" \
-H "Idempotency-Key: T202607120001:APPROVED" \
-d '{
"transaction": {
"paidAt": "20260710091200",
"amount": 850000,
"mid": "111",
"order_no": "222",
"tid": "T202607120001",
"auth_no": "12345678",
"paymentType": "CARD_BILL",
"cardNo": "557042******2076",
"paymentStatus": "APPROVED",
"currency": "KRW",
"deviceId": "device-abc-123",
"dailyCount": 12,
"settlementDay": "D+1",
"channel": "ONLINE"
},
"mode": "development"
}'샘플 식별자를 실제 거래에 맞게 변경하세요. 취소 예제는 승인 예제를 먼저 전송한 뒤 같은 주문에 사용합니다. 재시도할 때는 키와 본문을 그대로 유지합니다.
응답 구조 확인하기요청 필드#
Content-Type: application/json으로 전송합니다. 요청 본문은 최대 64 KiB이며, 정의되지 않은 필드는 허용하지 않습니다. 식별자는 공백을 제거한 뒤 길이를 검증합니다.
| 필드 | 자료형 / 필수 여부 | 설명 |
|---|---|---|
mode | enum · 선택 | development | production. 생략 시 production. 개발 요청에 development를 명시하세요. |
eventId | string · 선택 | 1~128자. 호출자가 지정하는 멱등 키 후보입니다. 서버가 응답하는 eventId(UUID)와는 다릅니다. |
transaction | object · 필수 | 아래 필수 필드를 담는 거래 객체입니다. 정의되지 않은 필드는 허용하지 않습니다. |
transaction.deviceId | string · 필수 | 1~160자. 거래 간 동일하게 유지하는 단말기 식별자. |
transaction.mid | string · 필수 | 1~128자. PG 채널 ID 또는 결제 시작점. deviceId를 대신할 수 없습니다. |
transaction.order_no | string · 필수 | 1~128자. PG 주문 거래 번호. 원 승인과 취소를 연결하는 기준. |
transaction.tid | string · 필수 | 1~128자. PG 거래 ID. 동일 TID의 주문·채널·단말기 정보는 일치해야 합니다. |
transaction.paidAt | string · 필수 | 한국시간(Asia/Seoul) yyyyMMddHHmmss 14자리. 예: 20260923143005. ISO 문자열·숫자·유효하지 않은 날짜는 거절됩니다. |
transaction.amount | number · 필수 | 0 초과, 최대 999999999999. 원·엔은 정수, 달러·유로는 소수 둘째 자리까지 허용합니다. |
transaction.currency | enum · 필수 | KRW | USD | JPY | EUR. 거래 통화의 금액을 전달합니다. |
transaction.channel | enum · 필수 | ONLINE | OFFLINE. 실제 거래 채널을 명시합니다. |
transaction.paymentType | enum · 필수 | AUTH | CARD_BILL | CARD_READER | MANUAL | SMS. 대소문자를 구분합니다. |
transaction.paymentStatus | enum · 필수 | APPROVED | CANCELED. 신규 동기 계약은 CANCELED(단일 L)를 사용합니다. |
transaction.auth_no | string · 선택 | 1~40자. PG 승인번호. |
transaction.cardNo | string · 선택 | 앞 4~6자리 숫자 + * 4~10개 + 뒤 4자리 숫자. 예: 557042******2076. 전체 카드번호는 보내지 마세요. |
transaction.dailyCount | integer · 선택 | 0 이상의 참고 거래 건수. |
transaction.settlementDay | string · 선택 | 1~20자. 정산일 정보. 예: D+1. |
merchant | object · 선택 | 생략 가능. 제공 시 externalMerchantId와 merchantName(각 1~160자)은 필수입니다. null·빈 객체는 허용하지 않습니다. |
merchant.bizNo | string · 선택 | 1~32자. 사업자 번호. |
merchant.ownerName / address | string · 선택 | 대표자 1~80자 / 주소 1~500자. 생략하면 기존 값을 유지합니다. |
merchant.bizType / phone | string · 선택 | 업종 1~100자 / 전화번호 1~30자. 생략하면 기존 값을 유지합니다. |
결제수단 / 거래 채널#
channel은 ONLINE 또는 OFFLINE을 전달합니다. mid·결제수단과는 별개이며, 가디언이 결제수단에서 채널을 추정하지 않습니다.
| paymentType | 의미 |
|---|---|
AUTH | 인증 결제 |
CARD_BILL | 카드 빌링 결제 |
CARD_READER | 카드 리더기 결제 |
MANUAL | 수기 결제 |
SMS | 문자 결제 |
위 5개 대문자 코드만 허용합니다. 한글명·공백·CARD·SMSK 등은 422 응답으로 거절됩니다.
동기 응답#
HTTP 200과 status: "completed"는 위험평가와 저장 완료를 의미합니다. risk는 normal·review·high, score는 0~100입니다. 위험평가 응답 자체가 결제를 승인하거나 취소하지는 않습니다.
{
"eventId": "8f20a620-47a2-4f1e-a674-df0606408237",
"tid": "T202607120001",
"mode": "development",
"status": "completed",
"duplicate": false,
"score": 0,
"risk": "normal",
"results": [
{
"id": "R01",
"name": "단건 고액 거래",
"status": "clear",
"score": 0,
"threshold": 1000000,
"reason": "설정한 탐지 조건에 해당하지 않습니다.",
"version": 1
}
],
"deviceId": "device-abc-123",
"merchantIdentityStatus": "provisional",
"cancellationLinkStatus": "not_applicable",
"originalTransactionId": null,
"completedAt": "2026-07-10T00:12:00.100Z"
}results는 1개 규칙만 표시한 축약 예제입니다. 실제 응답은 전체 규칙 결과를 제공합니다. 점수·판정은 사이트 설정과 거래 이력에 따라 달라집니다.
| 필드 / 값 | 읽는 방법 |
|---|---|
eventId | 서버가 생성한 UUID. 결과 조회와 장애 추적에 저장하세요. |
duplicate | true면 이전 완료 결과를 반환한 중복 요청입니다. 사용량을 다시 부과하지 않습니다. |
results[].status | hit: 탐지 / clear: 조건 미해당 / unavailable: 평가 불가 / disabled: 규칙 비활성 |
results[].reason / version | 규칙별 판정 근거와 평가 당시 규칙 버전. observed는 선택 필드입니다. |
merchantIdentityStatus | provisional: 임시 가맹점 / identified: 식별된 가맹점 |
cancellationLinkStatus | 원 승인과 취소의 연결 상태. 위험평가 완료와 별도로 확인하세요. |
originalTransactionId | 연결된 원 승인 거래 ID. 연결이 없으면 null. |
completedAt | 동기 POST 완료 시각. UTC ISO 문자열입니다. |
이벤트 조회#
응답의 eventId를 같은 사이트 키로 조회합니다. 정상 동기 처리에는 폴링이 필요 없지만, 취소의 최신 연결 상태와 운영 복구를 확인할 때 사용할 수 있습니다.
/api/v1/sites/{code}/events/{eventId}200# EVENT_ID에는 POST 응답의 eventId(UUID)를 넣으세요.
export EVENT_ID="8f20a620-47a2-4f1e-a674-df0606408237"
curl "$GUARDIAN_BASE_URL/api/v1/sites/$GUARDIAN_SITE_CODE/events/$EVENT_ID" \
-H "x-api-key: $GUARDIAN_API_KEY"| status | score / risk / results | 의미 |
|---|---|---|
accepted / processing | null | 이전 비동기 계약에서 접수·처리 중 |
completed | 점수 / 등급 / 규칙 결과 배열 | 처리 완료 |
failed | null | 자동 재시도 소진. error_code 확인 |
이벤트가 존재하면 처리 상태와 관계없이 HTTP 200을 반환합니다. 조회 응답의 시간 필드는 received_at·completed_at(UTC ISO)이며, 완료 전에는 completed_at이 null입니다. 동기 POST의 completedAt과 필드 이름이 다릅니다. 동기 계약 이벤트에는 cancellationLinkStatus·originalTransactionId도 포함됩니다.
멱등성#
응답이 유실되어도 같은 거래를 안전하게 다시 보낼 수 있습니다. 각 거래 요청에 고유한 키를 만들고, 결과가 확정될 때까지 요청 본문과 함께 저장하세요.
Idempotency-Key본문 eventIdtid:paymentStatus위 순서로 키를 선택합니다. 헤더는 1~180자이며, 동일 사이트·mode 범위에서 적용합니다. 같은 키·같은 정규화 본문은 최초 완료 판정과 duplicate: true를 반환합니다. 다른 본문은 409입니다.
취소 거래 연결#
paymentStatus: "CANCELED"와 원 승인과 같은 order_no를 전송합니다. 승인·취소 TID는 같거나 달라도 됩니다. 현재 계약은 전체 취소만 지원하며, 금액과 통화가 일치해야 합니다.
| cancellationLinkStatus | 의미 / 대응 |
|---|---|
not_applicable | 취소 연결 대상이 아닌 승인 거래 |
linked | 원 승인에 확정 연결. 승인 한 건에 취소를 한 번 반영 |
pending | 원 승인 없음. 승인이 나중에 수신되면 다시 연결 |
ambiguous | 원 승인 후보가 여러 개. 주문 식별 정보와 거래 이력 확인 |
mismatch | 금액 또는 통화 불일치. 원 승인과 취소 데이터 확인 |
duplicate | 이미 취소된 승인에 대한 추가 취소. 중복 취소 전송 여부 확인 |
오류 / 재시도#
HTTP 상태와 응답의 code·message를 함께 확인합니다. 입력 검증 오류는 issues에 필드 경로와 이유를 제공합니다.
{
"code": "VALIDATION_ERROR",
"message": "입력 형식을 확인하세요.",
"issues": [
{
"path": [
"transaction",
"channel"
],
"message": "ONLINE 또는 OFFLINE을 입력하세요."
}
]
}| HTTP | 원인 | 대응 |
|---|---|---|
400 / 422 | JSON 형식 / 필드 검증 오류 | issues.path에 표시된 필드를 수정. 수정 없이 반복하지 않기 |
401 | API 키 인증 실패 | 사이트 코드와 x-api-key 확인 |
403 | 사이트·고객 정지 또는 접근 제한 | 관리자에게 사이트 및 계약 상태 확인 |
404 | 조회할 이벤트 없음 | 응답 eventId(UUID)와 사이트 코드 확인 |
409 | 멱등 본문 또는 거래 식별 충돌 | 원본 요청과 비교. 재시도라면 같은 본문 복원 |
413 | 요청 본문 크기 초과 | 64 KiB 이내로 요청 크기 조정 |
429 | 요청 또는 고객 수신 한도 초과 | Retry-After 이후 재시도. 고객 분당 한도 응답은 현재 60초 |
503 / 연결 단절 / 504 | 일시 장애·응답 유실·시간초과 | 저장 여부가 미확정이므로 같은 키·본문으로 백오프 재시도 |
운영 전환 체크리스트#
샘플 요청에서 확인한 흐름을 실제 연동 환경에서도 검증하세요. 아래 체크는 현재 페이지에서만 유지됩니다.
변경 이력#
입력 계약 v2 현재
모든 사이트의 신규 요청에 한국시간 14자리 paidAt과 필수 channel을 적용합니다. 예: 20260923143005 → 2026-09-23T05:30:05Z. 잘못된 날짜·윤년·시간과 신규 ISO 입력은 422로 거절됩니다. 조회 응답은 UTC ISO 형식을 유지합니다.
기존 접수 건은 동일 사이트·환경·멱등 키에서 저장된 입력 버전과 원본으로 재시도할 수 있습니다. 입력 변경이 사이트의 동기·비동기 처리 계약을 자동 전환하지는 않습니다.
이전 비동기 계약(legacy)에서 전환하기
legacy 사이트는 HTTP 202 접수와 accepted / processing / completed / failed 상태 조회를 사용합니다. 202를 최종 위험평가 결과로 처리하지 마세요. 동일 요청을 재전송해도 실패 작업을 재시작하지 않으므로 운영 재처리 기능을 사용해야 합니다.
단말기 이관과 대기 이벤트 처리를 완료한 뒤 관리자에서 동기 계약으로 전환하세요. 구 계약의 merchantNo 필수·CANCELLED 표기를 신규 동기 요청에 사용하지 마세요.