- FaceAuthSubmission 객체 — POST 생성 응답, 목록 조회의
items[]요소, 단건 조회 응답이 모두 사용합니다. - 오류 응답 — 모든 엔드포인트가 공통으로 사용하는 오류 형식입니다.
- 구 API에서 옮기기 —
/v3/faceauth연동을/v3/face-auth로 옮길 때의 변경 사항입니다.
FaceAuthSubmission 객체
FaceAuth 제출 한 건의 정보를 담은 객체입니다. 제출의 인증 결과, 판정에 사용한 정책, 판정 점수를 확인할 수 있습니다.최상위 field
approved, rejected 중 하나입니다.yyyy-MM-dd'T'HH:mm:ss.SSSZ RFC 3339 UTC 형식입니다. (예: 2026-08-11T10:09:14.028Z)form은 Face Auth URL 화면, api는 POST /v3/face-auth로 제출된 건입니다.null입니다.approved 제출은 null입니다.approved 제출은 null입니다.policy가 포함되지 않습니다. 나머지 field는 동일합니다.policy 항목
처리 시점의 프로젝트 설정 snapshot입니다. 이후 프로젝트 설정을 변경해도 이미 생성된 제출의 값은 바뀌지 않습니다. 6개 항목(faceSimilarity, occluded, faceCover, headCover, liveness, activeLiveness) 모두 아래 두 field를 갖습니다.
threshold 값이 아니라 이 값으로 판정합니다.enabled가 false이거나 숫자 기준을 쓰지 않는 정책이면 null입니다.enabled는 프로젝트 설정이지 실행 결과가 아닙니다.정책이 켜져 있어도 제출 방식에 따라 실행하지 않을 수 있습니다. 실제로 실행했는지는 result의 대응 field로 판단하며, null이면 실행하지 않은 것입니다. 현재 이 차이가 나타나는 곳은 activeLiveness 하나입니다. submitType: api 제출은 enabled: true여도 result.activeLivenessScore가 null이며 이는 정상입니다.result field
실행하지 않은 정책의 결과 field는null입니다. 예를 들어 policy.liveness.enabled가 false인 제출은 livenessScore가 null입니다.
submitType: api 제출은 항상 null입니다.value: true면 가려진 것으로 판정해 거절됩니다.value: false면 미착용으로 판정해 거절됩니다. 하위 field는 occluded와 같습니다.value: false면 미착용으로 판정해 거절됩니다. 하위 field는 occluded와 같습니다.occluded, faceCover, headCover 세 항목은 같은 구조를 갖습니다. 검사를 실행하지 않았으면 **객체 전체가 null**이며, 하위 field만 null인 형태로는 반환하지 않습니다.signals field
Face Auth URL 화면에서 수집한 보조 정보입니다. 수집한 값이 있는submitType: form 제출에만 값이 있고, submitType: api 제출과 수집값이 없는 제출은 **객체 전체가 null**입니다. 참고용이며 인증 결과 판정에는 사용하지 않습니다.
null입니다.rejectComment와 failCode
rejectComment는 사람이 읽는 설명이고 failCode는 분기용 코드입니다.
두 배열은 같은 index끼리 대응하며 길이가 항상 같습니다. failCode[0]의 사유가 rejectComment[0]입니다.
failCode 값 목록은 POST /v3/face-auth — 거절 코드를 참고하세요.
파싱 시 유의할 점
- 응답의 key 집합은 항상 같습니다. 값이 없어도
null로 채워져 반환되므로undefined검사나 key 존재 검사는 필요하지 않습니다. policy.*.threshold의0은 유효한 설정값입니다. falsy 검사로 설정 여부를 판정하면 안 되고enabled로 판정하세요.- 배열 field는 값이 없을 때 빈 배열이 아니라
null입니다. 순회 전에?? []로 기본값을 주거나!== null을 확인하세요. - 중첩 객체(
occluded,faceCover,headCover,signals)는 해당 없을 때 객체 전체가null입니다. 하위 field를 읽기 전에 부모가null인지 먼저 확인하세요. - threshold와 score가 같으면 해당 threshold를 충족한 것으로 판정합니다.
- 점수는 정수가 아니라 소수를 포함할 수 있습니다. 문자열이 아닌 number로 파싱하세요.
오류 응답
아르고스 애플리케이션이 반환하는 오류는 아래 형식을 사용합니다.code와 message 둘뿐입니다.
인증 계층 오류 (401, 403)
401과 인증 계층403은code기반 분기가 아니라 HTTP status로 처리하세요. 이 두 응답에는codefield가 없습니다.403은 원인이 두 가지이고 응답 형식이 다릅니다.codefield가 있으면 애플리케이션이 반환한 것이고, 없으면 인증 계층이 차단한 것입니다.- 인증 계층 오류의
message는 아르고스가 생성하지 않으며 사전 고지 없이 바뀔 수 있습니다. 문구를 파싱하지 마세요.
오류 코드 목록
구 API에서 옮기기
구 엔드포인트/v3/faceauth를 연동 중이라면 아래 변경 사항을 확인하세요. path·필드 이름·응답 봉투·오류 형식이 모두 바뀌었습니다.
엔드포인트
authId는 query parameter가 아니라 path parameter가 되었고, 목록 조회와 단건 조회가 별도 endpoint로 분리되었습니다.
응답 봉투
faceAuth_projectId와 statusCode는 응답에서 제거되었습니다.
필드 이름
구조 변경
policy — 평면 임계값에서 중첩 객체로
policy — 평면 임계값에서 중첩 객체로
faceSimilarity_threshold: 85처럼 임계값만 평면으로 담았고, occluded_threshold만 boolean이었습니다.신 API는 항목마다 { enabled, threshold } 객체를 갖습니다. 정책 사용 여부는 threshold 값이 아니라 enabled로 판정합니다. occluded는 숫자 기준을 쓰지 않으므로 threshold가 항상 null입니다.result — occluded·faceCover·headCover가 객체로
result — occluded·faceCover·headCover가 객체로
occluded: false(boolean), headCover: 0(number)처럼 값 하나만 반환했습니다. 신 API는 세 항목 모두 { value, confidence } 객체이며, 검사를 실행하지 않았으면 객체 전체가 null입니다.페이지네이션 — 복합 키에서 단일 cursor로
페이지네이션 — 복합 키에서 단일 cursor로
nextPage_key의 authId·createTime을 각각 nextKey_id·nextKey_date로 되돌려 보냈고, 조회 개수는 count(1~2,000, 기본 2,000)였습니다.신 API는 서명된 단일 문자열 nextCursor를 그대로 cursor에 전달하며, 조회 개수는 limit(10~200, 기본 100)입니다. limit은 범위를 벗어나면 무시되지 않고 400 REQUEST_INVALID가 반환됩니다.이미지 다운로드 — 바이너리 직접 반환에서 302 redirect로
이미지 다운로드 — 바이너리 직접 반환에서 302 redirect로
302 Found와 Location header로 만료 시간이 짧은 다운로드 URL을 돌려주므로, HTTP client가 redirect를 따라가도록 설정해야 합니다 (curl --location).오류 형식 — 세 가지 형식에서 하나로
오류 형식 — 세 가지 형식에서 하나로
{ message, errorCode, statusCode }, { traceId, errorCode, message }, { message, statusCode }가 섞여 있었고 이미지 endpoint만 인증 실패를 모두 403으로 반환했습니다.신 API는 애플리케이션 오류를 모두 { code, message }로 통일하고, 인증 계층 오류만 예외입니다. 위 오류 응답을 참고하세요.