본문으로 건너뛰기
GUARDIAN개발자 문서
개발자 센터 문서
GUARDIAN DEVELOPERS

결제의 흐름에,
안전한 연결을 더하세요.

첫 API 호출부터 안정적인 운영까지.
가디언과 함께 이상거래 탐지를 시작하세요.

동기 위험평가 APIREST / JSON서버 간 안전한 연동

무엇을 만들고 있나요?

전체 API 문서
GET STARTED

가맹점 정보 없이 첫 거래를 연결하세요.#

안정적인 deviceId 하나로 시작할 수 있습니다. 가디언은 거래를 저장하고, 같은 HTTP 응답에서 위험 점수와 규칙별 결과를 반환합니다.

  1. 1

    사이트와 API 키 준비

    가입·이메일 인증 후 관리자 사이트·설정에서 사이트 코드와 키를 확인하세요.

    인증 설정
  2. 2

    개발 환경에서 거래 전송

    mode: "development"를 지정하고 샘플 요청을 서버에서 실행하세요.

    요청 예제
  3. 3

    판정 확인 후 운영 전환

    score, risk, results를 확인하고 오류·재시도를 검증하세요.

    전환 체크리스트
01 / AUTHENTICATION

인증 / API 키#

모든 Gateway 요청의 x-api-key 헤더에 해당 사이트의 API 키를 전달합니다. 로그인 세션과 Gateway API 키는 용도가 다릅니다. 사이트 코드와 키가 일치해야 하며, 다른 사이트의 이벤트는 조회할 수 없습니다.

설정값 / 사용 방법
GUARDIAN_BASE_URLGateway HTTPS 주소: https://api.fdsguard.co.kr (끝의 / 제외)
GUARDIAN_SITE_CODE관리자 → 사이트·설정에 표시된 실제 사이트 코드
GUARDIAN_API_KEY해당 사이트의 API 키. 서버 환경변수 또는 비밀 저장소에 보관
환경변수 설정 · Bash / zsh
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 기준입니다.

02 / SEND A TRANSACTION

거래신호 전송#

거래신호를 전송하면 거래·단말기 연결·위험평가·사용량 저장을 완료한 뒤 결과를 반환합니다. 아래 예제는 코드 생성용이며 실제 거래를 전송하지 않습니다.

POST/api/v1/sites/{code}/api-risk-score200
개발 환경
cURL 요청 예제
curl -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"
}'

샘플 식별자를 실제 거래에 맞게 변경하세요. 취소 예제는 승인 예제를 먼저 전송한 뒤 같은 주문에 사용합니다. 재시도할 때는 키와 본문을 그대로 유지합니다.

응답 구조 확인하기
03 / REQUEST BODY

요청 필드#

Content-Type: application/json으로 전송합니다. 요청 본문은 최대 64 KiB이며, 정의되지 않은 필드는 허용하지 않습니다. 식별자는 공백을 제거한 뒤 길이를 검증합니다.

필드자료형 / 필수 여부설명
modeenum · 선택development | production. 생략 시 production. 개발 요청에 development를 명시하세요.
eventIdstring · 선택1~128자. 호출자가 지정하는 멱등 키 후보입니다. 서버가 응답하는 eventId(UUID)와는 다릅니다.
transactionobject · 필수아래 필수 필드를 담는 거래 객체입니다. 정의되지 않은 필드는 허용하지 않습니다.
transaction.deviceIdstring · 필수1~160자. 거래 간 동일하게 유지하는 단말기 식별자.
transaction.midstring · 필수1~128자. PG 채널 ID 또는 결제 시작점. deviceId를 대신할 수 없습니다.
transaction.order_nostring · 필수1~128자. PG 주문 거래 번호. 원 승인과 취소를 연결하는 기준.
transaction.tidstring · 필수1~128자. PG 거래 ID. 동일 TID의 주문·채널·단말기 정보는 일치해야 합니다.
transaction.paidAtstring · 필수한국시간(Asia/Seoul) yyyyMMddHHmmss 14자리. 예: 20260923143005. ISO 문자열·숫자·유효하지 않은 날짜는 거절됩니다.
transaction.amountnumber · 필수0 초과, 최대 999999999999. 원·엔은 정수, 달러·유로는 소수 둘째 자리까지 허용합니다.
transaction.currencyenum · 필수KRW | USD | JPY | EUR. 거래 통화의 금액을 전달합니다.
transaction.channelenum · 필수ONLINE | OFFLINE. 실제 거래 채널을 명시합니다.
transaction.paymentTypeenum · 필수AUTH | CARD_BILL | CARD_READER | MANUAL | SMS. 대소문자를 구분합니다.
transaction.paymentStatusenum · 필수APPROVED | CANCELED. 신규 동기 계약은 CANCELED(단일 L)를 사용합니다.
transaction.auth_nostring · 선택1~40자. PG 승인번호.
transaction.cardNostring · 선택앞 4~6자리 숫자 + * 4~10개 + 뒤 4자리 숫자. 예: 557042******2076. 전체 카드번호는 보내지 마세요.
transaction.dailyCountinteger · 선택0 이상의 참고 거래 건수.
transaction.settlementDaystring · 선택1~20자. 정산일 정보. 예: D+1.
merchantobject · 선택생략 가능. 제공 시 externalMerchantId와 merchantName(각 1~160자)은 필수입니다. null·빈 객체는 허용하지 않습니다.
merchant.bizNostring · 선택1~32자. 사업자 번호.
merchant.ownerName / addressstring · 선택대표자 1~80자 / 주소 1~500자. 생략하면 기존 값을 유지합니다.
merchant.bizType / phonestring · 선택업종 1~100자 / 전화번호 1~30자. 생략하면 기존 값을 유지합니다.
04 / PAYMENT CHANNELS

결제수단 / 거래 채널#

channel은 ONLINE 또는 OFFLINE을 전달합니다. mid·결제수단과는 별개이며, 가디언이 결제수단에서 채널을 추정하지 않습니다.

paymentType의미
AUTH인증 결제
CARD_BILL카드 빌링 결제
CARD_READER카드 리더기 결제
MANUAL수기 결제
SMS문자 결제

위 5개 대문자 코드만 허용합니다. 한글명·공백·CARD·SMSK 등은 422 응답으로 거절됩니다.

05 / RESPONSE

동기 응답#

HTTP 200과 status: "completed"는 위험평가와 저장 완료를 의미합니다. risk는 normal·review·high, score는 0~100입니다. 위험평가 응답 자체가 결제를 승인하거나 취소하지는 않습니다.

200 OK · 응답 예제
{
  "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. 결과 조회와 장애 추적에 저장하세요.
duplicatetrue면 이전 완료 결과를 반환한 중복 요청입니다. 사용량을 다시 부과하지 않습니다.
results[].statushit: 탐지 / clear: 조건 미해당 / unavailable: 평가 불가 / disabled: 규칙 비활성
results[].reason / version규칙별 판정 근거와 평가 당시 규칙 버전. observed는 선택 필드입니다.
merchantIdentityStatusprovisional: 임시 가맹점 / identified: 식별된 가맹점
cancellationLinkStatus원 승인과 취소의 연결 상태. 위험평가 완료와 별도로 확인하세요.
originalTransactionId연결된 원 승인 거래 ID. 연결이 없으면 null.
completedAt동기 POST 완료 시각. UTC ISO 문자열입니다.
06 / RETRIEVE AN EVENT

이벤트 조회#

응답의 eventId를 같은 사이트 키로 조회합니다. 정상 동기 처리에는 폴링이 필요 없지만, 취소의 최신 연결 상태와 운영 복구를 확인할 때 사용할 수 있습니다.

GET/api/v1/sites/{code}/events/{eventId}200
이벤트 조회 · cURL
# 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"
statusscore / risk / results의미
accepted / processingnull이전 비동기 계약에서 접수·처리 중
completed점수 / 등급 / 규칙 결과 배열처리 완료
failednull자동 재시도 소진. error_code 확인

이벤트가 존재하면 처리 상태와 관계없이 HTTP 200을 반환합니다. 조회 응답의 시간 필드는 received_at·completed_at(UTC ISO)이며, 완료 전에는 completed_at이 null입니다. 동기 POST의 completedAt과 필드 이름이 다릅니다. 동기 계약 이벤트에는 cancellationLinkStatus·originalTransactionId도 포함됩니다.

07 / IDEMPOTENCY

멱등성#

응답이 유실되어도 같은 거래를 안전하게 다시 보낼 수 있습니다. 각 거래 요청에 고유한 키를 만들고, 결과가 확정될 때까지 요청 본문과 함께 저장하세요.

Idempotency-Key본문 eventIdtid:paymentStatus

위 순서로 키를 선택합니다. 헤더는 1~180자이며, 동일 사이트·mode 범위에서 적용합니다. 같은 키·같은 정규화 본문은 최초 완료 판정과 duplicate: true를 반환합니다. 다른 본문은 409입니다.

08 / CANCELLATIONS

취소 거래 연결#

paymentStatus: "CANCELED"와 원 승인과 같은 order_no를 전송합니다. 승인·취소 TID는 같거나 달라도 됩니다. 현재 계약은 전체 취소만 지원하며, 금액과 통화가 일치해야 합니다.

cancellationLinkStatus의미 / 대응
not_applicable취소 연결 대상이 아닌 승인 거래
linked원 승인에 확정 연결. 승인 한 건에 취소를 한 번 반영
pending원 승인 없음. 승인이 나중에 수신되면 다시 연결
ambiguous원 승인 후보가 여러 개. 주문 식별 정보와 거래 이력 확인
mismatch금액 또는 통화 불일치. 원 승인과 취소 데이터 확인
duplicate이미 취소된 승인에 대한 추가 취소. 중복 취소 전송 여부 확인
09 / ERROR HANDLING

오류 / 재시도#

HTTP 상태와 응답의 code·message를 함께 확인합니다. 입력 검증 오류는 issues에 필드 경로와 이유를 제공합니다.

422 · 입력 오류 응답 예제
{
  "code": "VALIDATION_ERROR",
  "message": "입력 형식을 확인하세요.",
  "issues": [
    {
      "path": [
        "transaction",
        "channel"
      ],
      "message": "ONLINE 또는 OFFLINE을 입력하세요."
    }
  ]
}
HTTP원인대응
400 / 422JSON 형식 / 필드 검증 오류issues.path에 표시된 필드를 수정. 수정 없이 반복하지 않기
401API 키 인증 실패사이트 코드와 x-api-key 확인
403사이트·고객 정지 또는 접근 제한관리자에게 사이트 및 계약 상태 확인
404조회할 이벤트 없음응답 eventId(UUID)와 사이트 코드 확인
409멱등 본문 또는 거래 식별 충돌원본 요청과 비교. 재시도라면 같은 본문 복원
413요청 본문 크기 초과64 KiB 이내로 요청 크기 조정
429요청 또는 고객 수신 한도 초과Retry-After 이후 재시도. 고객 분당 한도 응답은 현재 60초
503 / 연결 단절 / 504일시 장애·응답 유실·시간초과저장 여부가 미확정이므로 같은 키·본문으로 백오프 재시도
10 / GO LIVE

운영 전환 체크리스트#

샘플 요청에서 확인한 흐름을 실제 연동 환경에서도 검증하세요. 아래 체크는 현재 페이지에서만 유지됩니다.

연동 준비 확인0 / 6
CHANGELOG

변경 이력#

2026.09.23

입력 계약 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 표기를 신규 동기 요청에 사용하지 마세요.

이제 연결할 준비가 되었나요?

첫 번째 API 요청을 만들어 보세요.

요청 예제로 이동