오류와 HTTP 상태 코드
애플리케이션 오류는 application/problem+json(RFC 9457)을 사용합니다. 사람이 읽는 detail이 아니라 안정적인 code와 action을 기준으로 분기하세요. 검증 오류에서는 errors에 JSON Pointer 위치가 포함됩니다. 지원팀에 문의할 때는 request_id를 함께 알려 주세요. 프록시나 전송 오류는 다른 본문을 반환할 수 있으므로 JSON을 파싱하기 전에 Content-Type을 확인하세요.
다음 합성 422 예시는 과금 전에 발견된 잘못된 이메일 구문을 보여 줍니다. 공개 오류 카탈로그에는 모든 코드, 상태, 설명과 권장 조치가 나와 있습니다.
| HTTP 상태 | 일반적인 의미 | 다음 단계 |
|---|---|---|
| 400 / 413 / 415 | 잘못된 JSON, 너무 큰 본문 또는 지원되지 않는 미디어 유형. | 요청을 수정하세요. |
| 401 / 403 | 접근 거부, 계정 제한 또는 크레딧 부족. | code를 확인하세요. 접근 정보를 수정하거나 크레딧을 충전하거나 IP 체험 초기화를 기다리세요. |
| 422 | 잘못된 입력 또는 함께 쓸 수 없는 옵션. | errors에 표시된 필드를 수정하세요. |
| 404 / 405 | 알 수 없는 경로 또는 지원되지 않는 HTTP 메서드. | 엔드포인트 경로와 Allow 응답 헤더를 확인하세요. |
| 429 | 요청 빈도 또는 동시 작업 한도 초과. | Retry-After만큼 기다린 뒤 다음 요청을 보내세요. |
| 500 | 예기치 않은 서버 오류. | request_id와 함께 지원팀에 문의하고, 재시도하기 전에 과금을 확인하세요. |
| 502 / 503 / 504 | 제공업체, 종속 서비스, 과금 또는 시간 초과 오류. | 재시도하기 전에 code, action과 billing_status를 확인하세요. |
{
"type": "urn:genderapi:problem:validation_error",
"title": "validation error",
"status": 422,
"detail": "A valid email address is required.",
"instance": "urn:uuid:11111111-1111-4111-8111-111111111111",
"code": "validation_error",
"request_id": "11111111-1111-4111-8111-111111111111",
"documentation": "https://api.genderapi.io/api/v2/errors",
"action": "correct_request",
"errors": [
{
"pointer": "/value",
"message": "Invalid email address."
}
],
"meta": {
"request_id": "11111111-1111-4111-8111-111111111111",
"duration_ms": 12,
"access": {
"mode": "ip_trial",
"reason": "api_key_missing"
},
"usage": {
"charged_credits": 0,
"remaining_credits": null,
"billing_status": "not_charged",
"resets_at": "2026-09-26T12:00:00.000Z",
"limit": 10,
"period_seconds": 86400
}
}
}오류 응답 필드
| 필드 | 유형 | null 허용 | 예시 | 설명 |
|---|---|---|---|---|
type | string | 아니요 | "urn:genderapi:problem:validation_error" | 문제 유형을 식별하는 URI입니다. |
title | string | 아니요 | "validation error" | 사람이 읽을 수 있는 짧은 오류 제목입니다. |
status | integer | 아니요 | 422 | HTTP 상태 코드입니다. |
detail | string | 아니요 | "The request does not match the schema." | 이 실패에 대한 구체적인 설명입니다. |
instance | string | 아니요 | "urn:uuid:550e8400-e29b-41d4-a716-446655440000" | 실패한 요청의 식별자입니다. |
code | string | 아니요 | "validation_error" | 기계가 읽을 수 있는 안정적인 오류 코드입니다. |
request_id | string | 아니요 | "550e8400-e29b-41d4-a716-446655440000" | 이 HTTP 시도의 고유 식별자이며 X-Request-ID로도 전송됩니다. |
documentation | string | 아니요 | "https://api.genderapi.io/api/v2/errors" | 제공되는 경우 오류 카탈로그 링크입니다. |
action | string | 아니요 | "correct_request" | 권장 복구 조치이며, 오류 카탈로그에 정의된 경우에만 포함됩니다. |
errors | array<object> | 아니요 | [{"pointer":"/value","message":"must NOT have fewer than 1 characters"}] | 검증 문제 목록이며, 확인할 수 있는 경우에만 포함됩니다. 각 항목에는 pointer와 message가 들어 있습니다. |
errors[].pointer | string | 아니요 | "/value" | 잘못된 입력을 가리키는 JSON Pointer입니다. |
errors[].message | string | 아니요 | "must NOT have fewer than 1 characters" | 검증 문제에 대한 설명입니다. |
접근, 과금과 요청 메타데이터
| 필드 | 유형 | 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입니다. |
재시도와 과금
같은 요청을 다시 보내는 경우를 포함해 모든 추정 요청은 새 작업입니다. 각 요청에는 일반 크레딧 규칙이 적용됩니다. 중복 요청 방지 기능이 없으므로 연결이 끊기거나 결과를 알 수 없을 때 자동으로 재시도하지 마세요.
429 응답을 받으면 Retry-After만큼 기다린 뒤 다음 요청을 보내세요. 추정 요청이 실패하면 먼저 code, action과 meta.usage.billing_status를 확인하세요. billing_reconciliation_required이거나 과금이 미확정이면 재시도하기 전에 request_id와 함께 지원팀에 문의하세요.
일부만 성공한 일괄 요청도 HTTP 200을 반환할 수 있습니다. 각 항목을 확인하고, 과금이 확정된 뒤 실패한 항목만 다시 제출하세요. 성공한 항목을 다시 제출하면 다시 과금됩니다.
X-Request-ID와 meta.request_id는 현재 HTTP 시도를 식별합니다. 현재 잔액은 /usage에서 확인하세요. HEAD는 과금되는 추정을 시작하지 않습니다. 추정 응답과 계정 응답은 캐시할 수 없습니다.
클라이언트는 응답에 필드가 추가되어도 처리할 수 있어야 하며, 정보가 없을 때의 null 값을 그대로 유지해야 합니다.
요청 한도
이 상한까지는 요청이 항상 받아들여진다고 가정하지 말고 HTTP 429와 Retry-After를 처리하세요. 서비스 용량은 공유됩니다. 표시된 값은 현재 서비스 기본값입니다. 요청 한도 응답에는 X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset(Unix 초)이 포함됩니다. Retry-After는 초 단위 대기 시간입니다. 이 헤더는 남은 크레딧이 아니라 요청 한도를 나타냅니다. 무료인 /usage 조회도 요청 한도에 포함됩니다.
| 한도 | 값 |
|---|---|
| JSON 요청 본문 | 최대 64 KiB |
| 추정 입력값 | 1~254자 |
| 일괄 요청 | API 키 사용 시 50개 항목, IP 체험은 10개 |
| 계정별 요청 한도 | 분당 120회 요청 |
| IP별 요청 한도 | 분당 600회 요청 |
| 동시 작업 | 계정당 2개, 서비스 전체 16개 |