GenderAPI.io V2 · 가이드

이메일 주소로 성별 추정하기

GenderAPI.io V2로 이메일 주소의 이름 신호를 활용하세요. 실시간으로 요청을 보내 보고, 데이터셋과 AI 옵션을 비교하고, 알 수 없는 결과와 이메일 주소 목록을 처리하는 방법을 알아보세요.

최종 업데이트:

V2 API 사용해 보기

이메일 주소 분석하기

데이터셋 + AI

값을 하나 보내면 알 수 없는 결과와 사용한 크레딧을 포함한 전체 응답을 확인할 수 있습니다.

항상 AI(기본값): 결과가 알 수 없음이어도 2크레딧. 폴백: AI 폴백과 알 수 없는 결과를 포함해 1크레딧. 끄기, 데이터셋만(AI 미사용): 완료된 요청마다 알 수 없는 결과를 포함해 1크레딧. 별명 해석 사용 시: 데이터셋에서 결과를 얻으면 1크레딧, AI를 사용하면 결과가 알 수 없음이어도 총 2크레딧.

보내는 값(이메일 주소 전체)은 GenderAPI.io로 전송되며, 기본값인 항상 AI 모드이거나 AI 폴백이 필요하면 설정된 AI 서비스로도 전달됩니다. 끄기 모드에서는 전달되지 않습니다. 데이터 처리 방식 자세히 보기.

저장된 API 키가 없습니다. 크레딧이 남아 있는 동안 공유 IP 체험을 사용할 수 있습니다.

아래 응답은 2026년 10월 1일에 받은 실제 응답입니다. 분석을 선택하면 요청을 보냅니다.

실제 V2 응답 · 2026년 10월 1일 수집
이름Jihoon
성별남성
신뢰도98%
출처AI 모델
사용한 크레딧2

이 실제 응답은 2026년 10월 1일에 수집했으며 계정 잔액만 바꿨습니다. 실시간 값은 다를 수 있습니다. 추정 결과는 확인된 신원이 아닙니다.

이메일 주소에서 무엇을 알 수 있나요?

구문상 유효한 이메일 주소를 type: email과 함께 보내세요. GenderAPI.io는 @ 앞부분에서 이름 신호를 찾은 뒤 구조화된 추정 결과를 반환합니다. 메일함이 실제로 있는지 검증하거나, 소유자를 식별하거나, 그 사람의 성별 정체성을 확인하지는 않습니다.

데이터셋 일치에서는 주소에서 후보 토큰을 도출하고, 제한된 범위에서 부분 문자열도 시도할 수 있습니다. 별명 모드는 토큰 일치는 유지하지만 이러한 부분 문자열 후보는 추가하지 않습니다. 여러 레코드가 일치하면 저장된 합계가 가장 큰 후보가 선택되며, 그 후보가 의도한 이름이라는 보장은 없습니다. 추출된 이름을 연락처 레코드에 사용하기 전에 data.name과 data.match를 확인하세요.

입력 예시해석 방법
alice.smith@example.com로컬 파트에 이름 후보가 될 수 있는 토큰이 있습니다. 일치할 수 있지만, 입력값만으로 어떤 후보가 선택될지는 보장되지 않습니다.
alice+news@example.com데이터셋 조회에서는 후보를 만들 때 플러스 기호 뒤의 접미사를 제거합니다. AI에는 이를 무시하도록 지시하지만, AI는 제출한 값을 그대로 받습니다.
support@example.com역할 주소에는 신뢰할 수 있는 개인 이름 신호가 없습니다. 공유 메일함 전체에 한 사람의 성별을 부여하지 마세요.
prenses@example.com선택 옵션 forceToGenderize를 사용하면 데이터셋에서 결과가 없을 때 별명의 의미로 추정을 시도할 수 있습니다. 이 모드에서는 실제 이름이 필요하지 않습니다.
not-an-email구문이 잘못되면 성공한 알 수 없는 결과가 아니라 검증 오류가 반환됩니다.

애플리케이션에서 이메일 주소 조회 요청 보내기

이 예시는 기존 Bearer API 키를 사용하고 fallback을 명시합니다. 예시 주소는 처리 권한이 있는 입력값으로 바꾸세요. country는 관련된 컨텍스트가 있을 때만 지정하세요. 이메일 도메인은 그 사람의 위치를 나타내지 않습니다. 국가 정보가 없으면 이 필드를 생략하세요.

GENDERAPI_API_KEY를 설정한 서버에서 예시를 실행하세요. POST를 사용하면 이메일 값이 요청 URL에 포함되지 않습니다. 실제 결과는 데모의 설명용 응답과 다를 수 있습니다.

프로그래밍 언어를 선택하세요. API 키 설정하기, 그다음 서버에서 예시를 실행하세요.

재시도를 포함해 모든 추정 요청은 새로 과금되는 작업입니다. 이 예시는 자동으로 재시도하지 않습니다. 다른 요청을 보내기 전에 과금 상태를 확인하세요.

실행하기 전에: 접근과 오류 처리

이 예시는 서버에서 실행하세요. 프로세스 환경 변수 GENDERAPI_API_KEY에 기존 API 키를 설정하세요. 인식되지 않는 키는 IP 체험으로 전환될 수 있으므로 meta.access.mode가 api_key인지 확인하세요.

HTTP 4xx 및 5xx JSON 응답에서는 오류 본문을 그대로 출력하고 0이 아닌 종료 코드를 반환합니다. 재시도하기 전에 code, action과 meta.usage.billing_status를 확인하세요.

오류와 재시도 가이드 →
cURL
curl --silent --show-error --fail-with-body --max-time 30 \
  --request POST 'https://api.genderapi.io/api/v2/gender' \
  --header "Authorization: Bearer ${GENDERAPI_API_KEY:?Set GENDERAPI_API_KEY}" \
  --header 'Content-Type: application/json' \
  --data '{
  "type": "email",
  "value": "alice.smith@example.com",
  "country": "US",
  "options": {
    "ai_mode": "fallback"
  }
}'

POSIX 셸의 cURL 7.76+. 터미널에서 실행하세요. 런타임 문서

JavaScript / Node.js
// Server-side Node.js. Save as example.mjs.
const apiKey = process.env.GENDERAPI_API_KEY;
if (!apiKey) throw new Error("Set GENDERAPI_API_KEY");
const body = {
  "type": "email",
  "value": "alice.smith@example.com",
  "country": "US",
  "options": {
    "ai_mode": "fallback"
  }
};

const response = await fetch("https://api.genderapi.io/api/v2/gender", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify(body),
  signal: AbortSignal.timeout(30_000),
  redirect: "error",
});
const raw = await response.text();
if (!(response.headers.get("content-type") ?? "").includes("json")) {
  throw new Error(`HTTP ${response.status}: expected JSON; request ID ${response.headers.get("x-request-id")}`);
}
const result = JSON.parse(raw); // Also accepts application/problem+json.
if (!response.ok) {
  console.error(`HTTP ${response.status}`, result);
  process.exitCode = 1; // A retry is a new operation; inspect billing first.
} else {
  console.log(JSON.stringify(result, null, 2));
  // For batches, inspect every item: HTTP 200 may contain item errors.
}

Node.js 22+, 내장 fetch. example.mjs로 저장하고 node example.mjs를 실행하세요. 런타임 문서

Python
import json
import os
import sys
import urllib.error
import urllib.request

api_key = os.environ.get("GENDERAPI_API_KEY")
if not api_key:
    raise RuntimeError("Set GENDERAPI_API_KEY")
body = json.loads("{\"type\":\"email\",\"value\":\"alice.smith@example.com\",\"country\":\"US\",\"options\":{\"ai_mode\":\"fallback\"}}")

class NoRedirect(urllib.request.HTTPRedirectHandler):
    def redirect_request(self, req, fp, code, msg, headers, newurl):
        return None

request = urllib.request.Request(
    "https://api.genderapi.io/api/v2/gender",
    method="POST",
    data=json.dumps(body).encode("utf-8"),
    headers={
        "Authorization": "Bearer " + api_key,
        "Content-Type": "application/json",
    },
)
opener = urllib.request.build_opener(NoRedirect())
try:
    response = opener.open(request, timeout=30)
except urllib.error.HTTPError as error:
    response = error  # Keep the Problem Details body on non-2xx responses.
with response:
    status = response.status
    raw = response.read().decode("utf-8")
    if "json" not in response.headers.get("Content-Type", ""):
        raise RuntimeError(f"HTTP {status}: expected a JSON response")
    result = json.loads(raw)
print(json.dumps(result, indent=2), file=sys.stderr if status >= 300 else sys.stdout)
if not 200 <= status < 300:
    sys.exit(1)  # Inspect code, action and billing before retrying.
# For batches, inspect every item even when HTTP status is 200.

Python 3.10+, 표준 라이브러리. example.py로 저장하고 python3 example.py를 실행하세요. 런타임 문서

PHP
<?php
$apiKey = getenv('GENDERAPI_API_KEY');
if (!$apiKey) {
    throw new RuntimeException('Set GENDERAPI_API_KEY');
}
$body = json_decode('{"type":"email","value":"alice.smith@example.com","country":"US","options":{"ai_mode":"fallback"}}', true, 512, JSON_THROW_ON_ERROR);

$ch = curl_init('https://api.genderapi.io/api/v2/gender');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => false,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode($body, JSON_THROW_ON_ERROR),
]);
$raw = curl_exec($ch);
if ($raw === false) {
    throw new RuntimeException(curl_error($ch));
}
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE) ?: '';
curl_close($ch);
if (strpos($contentType, 'json') === false) {
    throw new RuntimeException("HTTP $status: expected a JSON response");
}
$result = json_decode($raw, true, 512, JSON_THROW_ON_ERROR);
$output = json_encode($result, JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR) . PHP_EOL;
if ($status < 200 || $status >= 300) {
    fwrite(STDERR, $output); // Preserve the Problem Details body.
    exit(1);
}
echo $output;
// For batches, inspect every item; HTTP 200 can contain item errors.

PHP 8+, cURL 확장. example.php로 저장하고 php example.php를 실행하세요. 런타임 문서

Java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.time.Duration;

public class GenderApiExample {
    private static String requiredEnv(String name) {
        String value = System.getenv(name);
        if (value == null || value.isBlank()) throw new IllegalStateException("Set " + name);
        return value;
    }

    public static void main(String[] args) throws Exception {
        String apiKey = requiredEnv("GENDERAPI_API_KEY");
        String body = "{\"type\":\"email\",\"value\":\"alice.smith@example.com\",\"country\":\"US\",\"options\":{\"ai_mode\":\"fallback\"}}";
        HttpClient client = HttpClient.newBuilder()
            .connectTimeout(Duration.ofSeconds(10))
            .followRedirects(HttpClient.Redirect.NEVER)
            .build();
        HttpRequest request = HttpRequest.newBuilder(URI.create("https://api.genderapi.io/api/v2/gender"))
            .timeout(Duration.ofSeconds(30))
            .header("Authorization", "Bearer " + apiKey)
            .header("Content-Type", "application/json")
            .POST(HttpRequest.BodyPublishers.ofString(body, StandardCharsets.UTF_8))
            .build();
        HttpResponse<String> response = client.send(request,
            HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
        if (!response.headers().firstValue("content-type").orElse("").contains("json")) {
            throw new IllegalStateException("HTTP " + response.statusCode() + ": expected JSON");
        }
        // JSON text; parse with your application's JSON library when integrating.
        if (response.statusCode() < 200 || response.statusCode() >= 300) {
            System.err.println(response.body()); // Includes Problem Details.
            System.exit(1);
        }
        System.out.println(response.body());
        // For batches, inspect each item's data or error, including on HTTP 200.
    }
}

Java 17+, 표준 HTTP 클라이언트. GenderApiExample.java로 저장하고 java GenderApiExample.java를 실행하세요. 런타임 문서

C# / .NET
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;

string RequiredEnv(string name) =>
    !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable(name))
        ? Environment.GetEnvironmentVariable(name)!
        : throw new InvalidOperationException($"Set {name}");

var apiKey = RequiredEnv("GENDERAPI_API_KEY");
using var handler = new HttpClientHandler { AllowAutoRedirect = false };
using var client = new HttpClient(handler) { Timeout = TimeSpan.FromSeconds(30) };
using var request = new HttpRequestMessage(HttpMethod.Post, "https://api.genderapi.io/api/v2/gender");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
request.Content = new StringContent("{\"type\":\"email\",\"value\":\"alice.smith@example.com\",\"country\":\"US\",\"options\":{\"ai_mode\":\"fallback\"}}", Encoding.UTF8, "application/json");

using var response = await client.SendAsync(request);
var raw = await response.Content.ReadAsStringAsync();
if (!(response.Content.Headers.ContentType?.MediaType?.Contains("json") ?? false))
    throw new InvalidOperationException($"HTTP {(int)response.StatusCode}: expected JSON");
using var result = JsonDocument.Parse(raw);
if (!response.IsSuccessStatusCode)
{
    Console.Error.WriteLine(result.RootElement); // Preserve Problem Details.
    Environment.ExitCode = 1;
}
else
{
    Console.WriteLine(result.RootElement);
    // For batches, inspect every item even on HTTP 200.
}

.NET 8+ 콘솔 애플리케이션. 콘솔 프로젝트의 Program.cs로 사용한 다음 dotnet run을 실행하세요. 런타임 문서

Go
package main

import (
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "os"
    "strings"
    "time"
)

func requiredEnv(name string) string {
    value := os.Getenv(name)
    if value == "" { panic("Set " + name) }
    return value
}

func run() error {
    apiKey := requiredEnv("GENDERAPI_API_KEY")
    body := "{\"type\":\"email\",\"value\":\"alice.smith@example.com\",\"country\":\"US\",\"options\":{\"ai_mode\":\"fallback\"}}"
    request, err := http.NewRequest("POST", "https://api.genderapi.io/api/v2/gender", strings.NewReader(body))
    if err != nil { return err }
    request.Header.Set("Authorization", "Bearer " + apiKey)
    request.Header.Set("Content-Type", "application/json")
    client := &http.Client{
        Timeout: 30 * time.Second,
        CheckRedirect: func(req *http.Request, via []*http.Request) error {
            return http.ErrUseLastResponse
        },
    }
    response, err := client.Do(request)
    if err != nil { return err }
    defer response.Body.Close()
    raw, err := io.ReadAll(response.Body)
    if err != nil { return err }
    if !strings.Contains(response.Header.Get("Content-Type"), "json") || !json.Valid(raw) {
        return fmt.Errorf("HTTP %d: expected a JSON response", response.StatusCode)
    }
    if response.StatusCode < 200 || response.StatusCode >= 300 {
        return fmt.Errorf("HTTP %d: %s", response.StatusCode, raw)
    }
    fmt.Println(string(raw))
    // For batches, inspect every item even on HTTP 200.
    return nil
}

func main() {
    if err := run(); err != nil {
        fmt.Fprintln(os.Stderr, err) // Keep Problem Details for error handling.
        os.Exit(1)
    }
}

Go 1.22+, 표준 라이브러리. main.go로 저장하고 go run main.go를 실행하세요. 런타임 문서

결과와 근거를 함께 보관하기

추정된 연관성은 본인이 밝힌 성별이 아닙니다. 원래 입력값, 반환된 근거, 본인이 제공한 정보는 서로 구분해 보관하세요. 알 수 없는 결과도 유효한 결과이므로 애플리케이션에서 추측한 범주로 바꾸지 마세요.

필드사용 방법
data.gender / data.result_statusmale 또는 female은 identified일 때만 사용하세요. 결과가 알 수 없음이면 원래의 JSON null을 그대로 유지하세요.
data.name / data.match반환된 이름과 선택된 후보를 확인하세요. 부분 문자열이 일치했다고 해서 입력값이 그 이름을 가진 사람의 것이라는 증거가 되지는 않습니다.
data.confidence / data.confidence_kind신뢰도는 0~1 척도의 값 또는 null입니다. observed_frequency는 저장된 건수에서 나오고, model_reported는 AI 점수입니다. 임계값은 종류별로 따로 평가하세요.
data.source / data.sample_countdataset, ai, none을 구분하세요. AI 결과에는 저장된 표본 수가 없습니다. 표본 수는 측정된 정확도가 아닙니다.
meta.access.mode계정 연동에서는 api_key인지 확인하세요. 키가 없거나 인식되지 않으면 대신 공유 IP 체험이 사용될 수 있습니다.
meta.usagecharged_credits와 billing_status를 확인하세요. 성공한 알 수 없는 결과도 과금됩니다. 응답을 받지 못했다고 해서 요청이 무료였다는 뜻은 아닙니다.

AI를 사용할 시점 선택하기

forceToGenderize는 이름, 이메일 주소, 사용자 이름에 선택적으로 사용할 수 있습니다. 이 옵션을 켜면 ai_mode를 생략하거나 fallback을 사용하세요. off와 always는 함께 쓸 수 없으며 422를 반환합니다. 최종 차감으로 잔액이 0 아래로 내려가더라도 시작 잔액이 0보다 크면 요청을 시작할 수 있습니다.

별명 모드는 name: null과 함께 성별을 반환할 수 있으며, 알 수 없는 결과를 반환할 수도 있습니다. 일반 AI 폴백도 별명 추정도 정확하거나 null이 아닌 답을 보장하지 않습니다.

요청 옵션동작성공한 조회의 크레딧
options.ai_mode: off데이터셋만 사용합니다.1(알 수 없는 결과 포함)
options.ai_mode: fallback먼저 데이터셋을 조회하고, 성별이 반환되지 않으면 일반 AI를 사용합니다. 단일 요청의 기본값입니다.총 1(AI 폴백 포함)
options.ai_mode: alwaysAI에 직접 요청합니다.2
forceToGenderize: true먼저 데이터셋을 조회한 다음, 실제 이름이 없어도 AI가 개인의 별명이나 별칭을 해석할 수 있게 합니다.데이터셋에서 결과를 얻으면 1, AI를 사용하면 총 2

이메일 주소 목록을 일괄 요청으로 처리하기

type: email 항목이 담긴 items 배열과 함께 POST /api/v2/gender/batch를 사용하세요. 등록된 API 키로는 최대 50개 항목, IP 체험에서는 최대 10개 항목을 보낼 수 있습니다. 결과를 원래 행과 다시 연결할 수 있도록 항목마다 고유한 id를 유지하세요. 응답은 입력 순서도 유지하며 index를 알려 줍니다.

일괄 요청 항목의 기본값은 데이터셋 전용 모드입니다. 일반 AI 폴백이 필요한 항목마다 options.ai_mode: fallback을 설정하세요. fallback을 사용해 성공한 항목 두 개는 알 수 없는 결과를 포함해 총 2크레딧입니다. HTTP 요청 한 번이 추정 1크레딧에 해당하는 것은 아닙니다.

일괄 요청이 HTTP 200을 반환해도 모든 항목을 확인하세요. 성공한 결과와 알 수 없는 결과를 저장한 다음, 실패한 항목을 다시 제출하기 전에 오류와 확정된 과금을 확인하세요. 시간 초과가 발생한 뒤 과금 결과를 확인하지 않고 성공한 일괄 요청 전체를 다시 보내지 마세요.

보내는 데이터 이해하기

실시간 데모는 사용자가 직접 제출할 때만 입력한 값을 GenderAPI.io로 보냅니다. AI가 사용되면 제출한 type, value와 국가 컨텍스트가 추정용으로 설정된 서비스에 전송됩니다. 데이터셋만으로 추정하려면 연동에서 forceToGenderize 없이 options.ai_mode: off를 사용하세요.

개인정보 처리방침, 데이터 처리 계약, 하위 처리자 목록에 공개된 처리 조건이 설명되어 있습니다. 결과는 추정된 연관성이므로 본인이 제공한 정보를 우선하세요. 개인에게 중대한 영향을 미치는 결정의 근거로 사용하지 마세요.

자주 묻는 질문

API가 이메일 주소에서 이름을 추출할 수 있나요?

로컬 파트에 사용할 수 있는 신호가 있으면 이름 후보를 반환할 수 있습니다. 토큰 일치와 부분 문자열 일치가 모두 가능하므로 data.match를 확인하세요. 이 결과가 메일함 소유자의 이름을 증명하지는 않습니다.

info@나 support@ 같은 주소도 성별을 반환하나요?

공유 역할 주소에는 일반적으로 개인 이름의 근거가 없습니다. 알 수 없는 결과도 유효합니다. AI나 별명 모드의 결과를 공유 메일함을 쓰는 사람들에 대한 확인으로 여기지 마세요.

이메일 주소의 결과가 알 수 없음이어도 크레딧이 차감되나요?

예. 성공한 일반 이메일 주소 조회는 AI 폴백과 알 수 없는 결과를 포함해 1크레딧입니다. 별명 추정을 강제하면 데이터셋에서 결과를 얻을 때 1크레딧, AI를 사용하면 총 2크레딧입니다. 오류의 과금 결과는 meta.usage에 따로 표시됩니다.

AI가 처리하기 전에 이메일 도메인이 제거되나요?

그렇게 제거된다고 보장하지 않습니다. 데이터셋 후보는 로컬 파트에서 나오지만, AI는 제출한 값을 그대로 받고 도메인과 플러스 기호 뒤의 접미사를 무시하도록 지시받습니다. 업무 흐름에서 필요하다면 데이터셋 전용 모드를 사용하세요.

계속 테스트하기

GenderAPI 키 사용

공유 IP 체험의 24시간 크레딧을 모두 사용한 뒤에도 테스트하려면 GenderAPI 계정의 API 키를 입력하세요. 키를 저장해도 요청은 전송되지 않으므로 준비되면 다시 제출하세요.

현재 브라우저 탭에만 저장되며 탭을 닫으면 삭제됩니다.