JSON 응답 이해하기
성공한 단일 응답에는 data와 meta가 포함됩니다. 다음 데이터셋 예시는 2026년 10월 1일에 API 키로 받은 실제 응답이며, 계정 잔액만 바꿨습니다. 측정된 제품 정확도를 나타내지 않으며, 실제 요청에서는 다른 결과가 반환될 수 있습니다. API 키 요청에서는 access.mode: api_key와 null인 IP 체험 전용 한도 필드가 반환되고, IP 체험 요청에서는 체험 한도 및 초기화 시각과 함께 ip_trial이 반환됩니다.
{
"data": {
"input": {
"type": "name",
"value": "Jihoon",
"country": "KR"
},
"name": "jihoon",
"gender": "male",
"country": "KR",
"confidence": 0.9693877551020408,
"confidence_kind": "observed_frequency",
"sample_count": 196,
"source": "dataset",
"result_status": "identified",
"reason": null,
"country_source": "dataset",
"match": {
"name": "jihoon",
"method": "normalized",
"scope": "country",
"country": "KR"
}
},
"meta": {
"request_id": "81a126a7-5333-4023-ada5-19823d8e9bf4",
"duration_ms": 8,
"access": {
"mode": "api_key",
"reason": null
},
"usage": {
"charged_credits": 1,
"remaining_credits": 49999,
"billing_status": "confirmed",
"resets_at": null,
"limit": null,
"period_seconds": null
}
}
}추정 응답 필드
| 필드 | 유형 | null 허용 | 예시 | 설명 |
|---|---|---|---|---|
data.input | object | 아니요 | {"type":"name","value":"Jihoon","country":"KR"} | 입력 유형, 값과 국가입니다. forceToGenderize가 true이면 함께 포함됩니다. |
data.name | string | 예 | "jihoon" | 일치하거나 추출된 이름이며, 없으면 null입니다. |
data.gender | string | 예 | "male" | male, female 또는 JSON null. 확인된 개인 신원이 아닌 추정입니다. |
data.result_status | string | 아니요 | "identified" | 성별이 반환되면 identified, 그렇지 않으면 unknown입니다. |
data.reason | string | 예 | null | identified 결과에서는 null입니다. 알 수 없는 결과의 사유: not_found, no_name_candidate, ambiguous 또는 insufficient_evidence. |
data.confidence | number | 예 | 0.95 | 0~1 점수 또는 null. 성별이 null이면 신뢰도도 null입니다. |
data.confidence_kind | string | 예 | "observed_frequency" | observed_frequency: 가장 많은 성별의 데이터셋 건수 / 전체 건수. model_reported: 보정된 확률이 아닌 AI 점수. 확인할 수 없으면 null입니다. |
data.sample_count | integer | 예 | 1200 | 데이터셋 표본 수 또는 null. AI는 표본 수를 만들어 내지 않습니다. |
data.source | string | 아니요 | "dataset" | dataset, ai 또는 none. |
data.country | string | 예 | "KR" | dataset 또는 ai_association에서 나온 국가 연관성, 또는 null. 국적, 거주지, 민족을 나타내지 않습니다. |
data.country_source | string | 예 | "dataset" | 국가 연관성의 출처: dataset, ai_association 또는 null. |
data.match | object | 아니요 | {"name":"jihoon","method":"normalized","scope":"country","country":"KR"} | 일치한 데이터셋 이름, 일치 방법(normalized, token, substring 또는 model_inference), 국가/전역 범위와 일치한 국가입니다. 확인할 수 없는 근거는 null입니다. |
반환되는 입력 필드
| 필드 | 유형 | null 허용 | 예시 | 설명 |
|---|---|---|---|---|
data.input.type | string | 아니요 | "name" | 입력 종류: name, email 또는 username. |
data.input.value | string | 아니요 | "Jihoon" | 제출한 추정 입력값입니다. |
data.input.country | string | 예 | "KR" | 제출한 국가 컨텍스트이며, 생략하면 null입니다. |
data.input.forceToGenderize | boolean | 아니요 | true | 별명 모드를 활성화한 경우에만 포함되며, 그 외에는 생략됩니다. |
데이터셋 일치 필드
| 필드 | 유형 | null 허용 | 예시 | 설명 |
|---|---|---|---|---|
data.match.name | string | 예 | "jihoon" | 선택된 데이터셋 후보이며, 선택된 데이터셋 행이 없으면 null입니다. |
data.match.method | string | 예 | "normalized" | normalized, token, substring 또는 model_inference. 확인할 수 없으면 null입니다. |
data.match.scope | string | 예 | "country" | 데이터셋 조회에서는 country 또는 global이며, AI이거나 근거가 없으면 null입니다. |
data.match.country | string | 예 | "KR" | 선택된 데이터셋 행의 국가이며, 전역 행이나 AI이면 null입니다. |
접근, 과금과 요청 메타데이터
| 필드 | 유형 | null 허용 | 예시 | 설명 |
|---|---|---|---|---|
meta.request_id | string | 아니요 | "550e8400-e29b-41d4-a716-446655440000" | 이 HTTP 시도의 고유 식별자이며 X-Request-ID로도 전송됩니다. |
meta.duration_ms | integer | 아니요 | 42 | 요청 처리 시간(밀리초)입니다. |
meta.access.mode | string | 아니요 | "api_key" | api_key, ip_trial 또는 unauthenticated. 유료 계정을 사용할 때는 api_key인지 확인하세요. |
meta.access.reason | string | 예 | null | IP 체험으로 전환된 사유: api_key_missing, api_key_invalid 또는 api_key_not_found. 그 외에는 null입니다. |
meta.usage.charged_credits | integer | 예 | 1 | 차감된 순 크레딧입니다. 차감 전이나 전액 반환이 확인된 뒤에는 0이며, 과금이 미확정이면 null입니다. |
meta.usage.remaining_credits | integer | 예 | 99 | 작업 완료 시점의 잔액입니다. 음수일 수 있으며, 확인할 수 없거나 과금이 미확정이면 null입니다. |
meta.usage.billing_status | string | 아니요 | "confirmed" | not_charged, confirmed 또는 unconfirmed. 실패한 추정을 재시도하기 전에 확인하세요. |
meta.usage.resets_at | string | 예 | "2026-09-27T12:00:00.000Z" | IP 체험 초기화 시각(UTC, ISO 8601)입니다. API 키 계정이거나 알 수 없으면 null입니다. |
meta.usage.limit | integer | 예 | 10 | IP 체험 크레딧 한도이며, API 키 계정에서는 null입니다. |
meta.usage.period_seconds | integer | 예 | 86400 | IP 체험 기간(초)이며, API 키 계정에서는 null입니다. |
성공한 알 수 없는 결과
HTTP 200은 작업이 완료되었다는 뜻이며 성별을 보장하지 않습니다. JSON null을 male, female, 빈 문자열 또는 신뢰도 0으로 바꾸지 말고 그대로 유지하세요. data.result_status와 data.reason은 HTTP 오류와 별도로 확인하세요.
2026년 10월 1일에 받은 이 데이터셋 전용 실제 예시는 source: none과 reason: not_found를 반환하며, 이 경우에도 1크레딧이 차감됩니다. 두 성별의 건수가 같은 데이터셋 행은 sample_count를 유지한 채 reason: ambiguous를 반환할 수 있습니다. AI의 알 수 없는 결과는 source: ai와 reason: insufficient_evidence를 사용합니다.
{
"data": {
"input": {
"type": "name",
"value": "zzzxxyy",
"country": null
},
"name": null,
"gender": null,
"country": null,
"confidence": null,
"confidence_kind": null,
"sample_count": null,
"source": "none",
"result_status": "unknown",
"reason": "not_found",
"country_source": null,
"match": {
"name": null,
"method": null,
"scope": null,
"country": null
}
},
"meta": {
"request_id": "54fdcd4e-f8bc-4224-918f-3a5732e08b9c",
"duration_ms": 10,
"access": {
"mode": "api_key",
"reason": null
},
"usage": {
"charged_credits": 1,
"remaining_credits": 49999,
"billing_status": "confirmed",
"resets_at": null,
"limit": null,
"period_seconds": null
}
}
}신뢰도와 일치 근거 해석하기
신뢰도 0.9는 0~1 척도의 값입니다. observed_frequency에서는 선택된 데이터셋의 전체 건수 중 가장 많은 성별의 건수가 차지하는 비율을 뜻하며, 제품 전체의 정확도를 측정한 값이 아닙니다. model_reported 점수는 AI가 제공하며 데이터셋 빈도에 맞춰 보정되지 않았습니다.
애플리케이션의 임계값은 자체 평가 데이터와 confidence_kind를 바탕으로 정하세요. 데이터셋 점수와 AI 점수가 같은 것을 측정하는 것처럼 직접 비교해 순위를 매기지 마세요. AI 결과에서는 선택된 데이터셋 행이 없으므로 match.name, match.scope, match.country가 null이며 match.method는 model_inference입니다.
전체 이름의 경우 데이터셋 결과는 전체 문자열이 아니라 그 일부에서 나올 수 있습니다. data.input은 제출한 값을 그대로 유지하고, data.name은 반환된 이름을, data.match는 후보와 조회 범위를 설명합니다.
애플리케이션에서 다음에 할 일 정하기
먼저 요청 오류와 항목 오류를 처리한 다음 result_status를 확인하세요. 단일 추정에서는 data를 읽고, 일괄 요청에서는 성공한 각 항목의 data에 같은 판단을 적용합니다. male이나 female 레이블을 억지로 붙이지 말고 알 수 없는 결과를 애플리케이션에 그대로 남겨 두세요.
| 결과 | 의미 | 권장 처리 |
|---|---|---|
| identified; gender: male 또는 female | 데이터셋 또는 AI 근거를 바탕으로 추정에서 성별이 나왔습니다. | 해당 confidence_kind에 맞게 평가한 기준을 적용하고, source와 일치 근거를 보존합니다. |
| unknown; reason: not_found | 파싱된 후보와 일치하는 데이터셋 레코드가 저장되어 있지 않습니다. | gender는 null로 유지합니다. AI 옵션을 바꿔 의도적으로 다시 요청하면 새로 과금되는 작업입니다. |
| unknown; reason: no_name_candidate | 데이터셋 파싱에서 사용할 수 있는 이름 후보가 나오지 않았습니다. | null을 유지하고, 추가 추정을 선택하기 전에 입력 유형과 값을 확인합니다. |
| unknown; reason: ambiguous | 선택된 데이터셋 행의 남성과 여성 건수가 같습니다. sample_count는 여전히 포함될 수 있습니다. | 직접 한쪽으로 결정하거나 null 신뢰도를 0으로 바꾸지 마세요. |
| unknown; reason: insufficient_evidence | AI 처리는 완료되었지만 성별을 반환할 만큼 근거가 충분하지 않았습니다. | 완료된 알 수 없는 결과로 처리하고, 제공업체 오류나 자동 재시도 대상으로 보지 마세요. |
| Problem Details 또는 항목의 error | ai_upstream_error나 prediction_timeout 등으로 실행이 실패했습니다. | 오류 코드와 요청 ID를 보관하고 과금을 확인한 뒤 재시도 가이드를 따릅니다. |
자체 평가를 바탕으로 임계값 정하기
추정을 항상 정확하게 만드는 보편적인 신뢰도 기준값은 없습니다. 사용 사례를 대표하면서 독립적으로 레이블이 지정된 예시로 observed_frequency와 model_reported를 따로 평가하세요. 데이터셋 빈도와 AI가 스스로 보고한 점수는 둘 다 0.9이더라도 서로 다른 신호입니다. 기준이 얼마나 자주 답을 내는지, 답을 낸 추정이 얼마나 자주 맞는지 측정하고, 나머지는 알 수 없는 결과로 두거나 검토 절차로 넘기세요.
예를 들어 result_status가 identified이지만 confidence_kind가 model_reported이면 데이터셋 임계값이 아니라 평가를 거친 AI 기준을 적용하세요. forceToGenderize를 사용했다면 name: null과 null이 아닌 성별이 함께 반환되는 것은 유효한 결과입니다. 실제 이름을 추출하지 않아도 별칭으로 추정할 수 있기 때문입니다. 추정이 답을 냈는지는 name만 보지 말고 gender와 result_status로 판단하세요. 이는 여전히 추정일 뿐 개인의 신원 확인이 아닙니다.