사용자 이름 분석 가이드

Markdown으로 읽기

사용자 이름과 별명으로 성별 추정하기

V2로 사용자 이름과 별명을 분석하세요. forceToGenderize, 항목별 AI 옵션, 알 수 없는 결과와 다시 보낸 요청의 크레딧 차감을 설명합니다.

코드 없는 파일 처리

데이터셋의 별명 분석하기

Excel 또는 CSV 파일을 업로드하고 사용자 이름 열을 선택한 뒤, 레코드를 처리하기 전에 별명 해석을 켜세요.

  • Excel·CSV 파일
  • 사용자 이름·표시 이름 열
  • 내보낼 수 있는 보강 결과
Excel/CSV 도구 열기
GenderAPI 파일 워크플로의 사용자 이름과 별명 분석 옵션
GenderAPI 파일 워크플로의 별명 해석 옵션입니다.

입력 예시

별명은 신원을 확인해 주지 않습니다

@alice_smith는 이름 요소와 일치할 수 있습니다. forceToGenderize를 사용한 prenses는 이름이 null로 남아도 추정값이 반환될 수 있습니다. user47291은 알 수 없는 결과로 남을 수 있습니다. 이는 입력 예시일 뿐이며 미리 정해진 성별 결과가 없습니다.

분석 논리

사용자 이름으로 성별을 추정하는 방식

시스템은 사용자 이름이나 표시 이름에서 알아볼 수 있는 이름 요소와 그 밖의 언어적 단서를 찾습니다. 일반 AI 폴백은 사용할 수 있는 실제 이름을 찾고, forceToGenderize를 사용하면 AI가 실제 이름 없이도 별명을 해석할 수 있습니다. 결과는 컨텍스트 필드와 함께 반환됩니다. 무작위이거나 불충분한 입력에서 결과를 억지로 만들지 마세요.

01사용자 이름별명 또는 표시 이름
02신호 분석이름과 컨텍스트
03추정 결과성별과 신뢰도

이용 방법

데이터에 맞는 방법 선택하기

코드 없이 대규모 데이터셋 처리

4단계로 Excel 또는 CSV의 사용자 이름 분석하기

  1. 01

    Excel/CSV 도구 열기

    GenderAPI 파일 도구를 열고 처리할 파일을 업로드합니다.

  2. 02

    원본 열 선택

    사용자 이름, 별명 또는 표시 이름이 들어 있는 열을 지정합니다.

  3. 03

    별명 해석 켜기

    별칭과 소셜 미디어 이름을 해석하는 옵션을 활성화합니다.

  4. 04

    표본을 검토한 뒤 내보내기

    먼저 대표 표본의 레코드를 검토한 다음 전체 파일을 처리하고, 보강된 데이터를 내려받습니다.

새 계정에는 매일 200크레딧이 무료로 제공되므로, 전체 파일을 처리하기 전에 표본으로 워크플로를 테스트할 수 있습니다.

활용 분야

실제 이름이 없을 때 보조 신호로 사용하기

이름 필드가 비어 있을 때 사용자 이름 분석은 소셜 미디어, 커뮤니티, 게임과 사용자가 직접 만든 프로필 데이터에 유용할 수 있습니다. 실제 이름이나 이메일 주소처럼 더 직접적이고 신뢰할 수 있는 출처가 있다면 해당 엔드포인트를 사용하세요.

한계

결과를 확인된 신원으로 취급하지 마세요

모든 별명에 실제 이름이 들어 있지는 않으며, 문화적 연상은 서로 다르고 같은 표현도 언어에 따라 의미가 달라질 수 있습니다. 신호가 충분하지 않다면 약한 데이터에서 확정적인 결론을 끌어내기보다 빈 결과를 받아들이세요.

V2 구현 가이드

원본 데이터와 추정 결과를 따로 보관하기

레코드의 원래 식별자를 보관하세요. API는 프로필을 열람하지 않고, 계정 소유자를 확인하지 않으며, 신원을 확인하지도 않습니다. 국가 컨텍스트는 신뢰할 수 있는 정보가 있을 때만 보내고, 도메인이나 웹사이트 언어에서 추론하지 마세요.

입력 예시필드 또는 옵션해석
@alice_smithdata.name / data.match원래 사용자 이름을 보관하고, 인식된 부분을 확인된 이름으로 취급하지 마세요.
prensesforceToGenderize: true실제 이름이 없는 별명도 해석할 수 있게 합니다. data.name이 null인 상태로 성별이 반환될 수 있으며, 이 경우 사람의 이름을 임의로 만들지 마세요.
user47291data.result_status: unknown모호하거나 불충분한 입력은 알 수 없는 결과로 남을 수 있습니다. 요청을 자동으로 다시 보낼 이유가 없습니다.

프로필 URL이 아니라 사용자 이름을 type: username과 함께 보내세요. 데이터셋 조회는 맨 앞의 @를 제거하고 텍스트를 정규화한 뒤 구분 기호와 숫자를 기준으로 후보를 만듭니다. 기본 요청은 앞과 뒤에서 제한된 수의 일치 항목을 추가할 수 있지만, forceToGenderize는 이러한 추가 부분을 사용하지 않습니다. 여러 레코드가 일치하면 저장된 건수가 가장 많은 레코드가 선택됩니다. 이메일 주소에는 type: email을, 실제 이름에는 type: name을 사용하세요.

처리 모드와 크레딧 비용 선택하기

옵션처리 방식정상 처리된 항목당 크레딧
options.ai_mode: off데이터셋만 사용1크레딧
options.ai_mode: fallback먼저 데이터셋을 조회하고, 성별을 판단할 수 없으면 일반 AI 폴백 사용AI 포함 총 1크레딧
options.ai_mode: alwaysAI로 바로 요청2크레딧
forceToGenderize: true먼저 데이터셋을 조회한 뒤, 실제 이름이 없어도 별명을 해석데이터셋으로 충분하면 1, AI를 사용하면 총 2

단일 요청의 기본값은 fallback이고, 일괄 요청 항목의 기본값은 off입니다. forceToGenderize는 이름, 이메일 주소, 사용자 이름에 선택적으로 사용할 수 있으며, off 및 always와 함께 쓸 수 없으므로 ai_mode를 생략하거나 fallback을 사용하세요. 정상 처리된 unknown 결과도 과금됩니다. 시작 잔액이 0보다 크면 요청을 시작할 수 있고, 처리가 끝난 뒤 잔액이 마이너스가 될 수 있습니다.

일괄 요청의 각 항목에 옵션 지정하기

입력 예시가 특정 추정 결과를 보장하지는 않습니다. GENDERAPI_API_KEY는 서버 환경에 설정하고, 공개 클라이언트 코드에 키를 넣지 마세요. V1과 V2는 같은 API 키와 같은 계정 잔액을 사용합니다. /api/v2/usage로 키를 확인하고 meta.access.mode가 api_key인지 확인하세요.

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

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

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

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

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

오류와 재시도 가이드 →
cURL
curl --silent --show-error --fail-with-body --max-time 30 \
  --request POST 'https://api.genderapi.io/api/v2/gender/batch' \
  --header "Authorization: Bearer ${GENDERAPI_API_KEY:?Set GENDERAPI_API_KEY}" \
  --header 'Content-Type: application/json' \
  --data '{
  "items": [
    {
      "id": "profile-001",
      "type": "username",
      "value": "@alice_smith",
      "options": {
        "ai_mode": "off"
      }
    },
    {
      "id": "profile-002",
      "type": "username",
      "value": "alexriver",
      "options": {
        "ai_mode": "fallback"
      }
    },
    {
      "id": "profile-003",
      "type": "username",
      "value": "prenses",
      "country": "TR",
      "forceToGenderize": true
    }
  ]
}'

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 = {
  "items": [
    {
      "id": "profile-001",
      "type": "username",
      "value": "@alice_smith",
      "options": {
        "ai_mode": "off"
      }
    },
    {
      "id": "profile-002",
      "type": "username",
      "value": "alexriver",
      "options": {
        "ai_mode": "fallback"
      }
    },
    {
      "id": "profile-003",
      "type": "username",
      "value": "prenses",
      "country": "TR",
      "forceToGenderize": true
    }
  ]
};

const response = await fetch("https://api.genderapi.io/api/v2/gender/batch", {
  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("{\"items\":[{\"id\":\"profile-001\",\"type\":\"username\",\"value\":\"@alice_smith\",\"options\":{\"ai_mode\":\"off\"}},{\"id\":\"profile-002\",\"type\":\"username\",\"value\":\"alexriver\",\"options\":{\"ai_mode\":\"fallback\"}},{\"id\":\"profile-003\",\"type\":\"username\",\"value\":\"prenses\",\"country\":\"TR\",\"forceToGenderize\":true}]}")

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/batch",
    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('{"items":[{"id":"profile-001","type":"username","value":"@alice_smith","options":{"ai_mode":"off"}},{"id":"profile-002","type":"username","value":"alexriver","options":{"ai_mode":"fallback"}},{"id":"profile-003","type":"username","value":"prenses","country":"TR","forceToGenderize":true}]}', true, 512, JSON_THROW_ON_ERROR);

$ch = curl_init('https://api.genderapi.io/api/v2/gender/batch');
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 = "{\"items\":[{\"id\":\"profile-001\",\"type\":\"username\",\"value\":\"@alice_smith\",\"options\":{\"ai_mode\":\"off\"}},{\"id\":\"profile-002\",\"type\":\"username\",\"value\":\"alexriver\",\"options\":{\"ai_mode\":\"fallback\"}},{\"id\":\"profile-003\",\"type\":\"username\",\"value\":\"prenses\",\"country\":\"TR\",\"forceToGenderize\":true}]}";
        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/batch"))
            .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/batch");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
request.Content = new StringContent("{\"items\":[{\"id\":\"profile-001\",\"type\":\"username\",\"value\":\"@alice_smith\",\"options\":{\"ai_mode\":\"off\"}},{\"id\":\"profile-002\",\"type\":\"username\",\"value\":\"alexriver\",\"options\":{\"ai_mode\":\"fallback\"}},{\"id\":\"profile-003\",\"type\":\"username\",\"value\":\"prenses\",\"country\":\"TR\",\"forceToGenderize\":true}]}", 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 := "{\"items\":[{\"id\":\"profile-001\",\"type\":\"username\",\"value\":\"@alice_smith\",\"options\":{\"ai_mode\":\"off\"}},{\"id\":\"profile-002\",\"type\":\"username\",\"value\":\"alexriver\",\"options\":{\"ai_mode\":\"fallback\"}},{\"id\":\"profile-003\",\"type\":\"username\",\"value\":\"prenses\",\"country\":\"TR\",\"forceToGenderize\":true}]}"
    request, err := http.NewRequest("POST", "https://api.genderapi.io/api/v2/gender/batch", 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를 실행하세요. 런타임 문서

목록 결과와 재시도 처리하기

POST /api/v2/gender/batch는 API 키를 사용하면 최대 50개 항목, IP 체험에서는 최대 10개 항목을 받습니다. 항목마다 type, value와 options를 따로 지정하세요. 일반 AI 폴백을 사용하려면 각 항목에 fallback을 명시해야 합니다. id는 일괄 요청 안에서 고유해야 하며, index는 제출한 일괄 요청에서 0부터 시작합니다. 자체 작업 ID와 원본 행 ID는 따로 저장하세요.

HTTP 200이 모든 항목이 정상 처리되었다는 뜻은 아닙니다. identified, unknown, error 결과를 각각 처리하세요. meta.summary.succeeded에는 identified와 unknown이 모두 포함됩니다. data.gender, source, confidence_kind, confidence, match와 reason을 함께 평가하고, AI 점수와 데이터셋 빈도를 같은 것으로 취급하지 마세요.

meta.usage.billing_status가 confirmed이면 재시도가 허용된 오류만 다시 보내세요. 상태가 unconfirmed이거나 응답을 받지 못했다면 중단하고 과금 여부를 확인하세요. 정상 처리된 unknown 결과를 포함해 같은 항목을 다시 보내면 새 작업으로 과금되므로, 확인 없이 목록 전체를 다시 보내지 마세요.

일괄 요청 규칙 · 응답 필드 · AI 옵션 · 정확도와 신뢰도 평가 · 개인정보 처리방침

Excel과 Google Sheets 부가기능 및 그 밖의 기성 연동은 자체 연결 방식과 결과 형식을 사용할 수 있습니다. 이러한 도구의 출력이 이 V2 JSON 스키마를 따른다고 가정하지 말고, 해당 연동의 최신 가이드를 확인하세요.

자주 묻는 질문

사용자 이름과 별명으로 성별 찾기

사용자 이름으로 성별을 추정할 수 있나요?

V2에서 forceToGenderize를 켜면 먼저 데이터셋을 확인합니다. 성별을 판단할 수 없으면 AI가 실제 이름 없이도 별명을 해석할 수 있습니다. 결과는 여전히 unknown일 수 있으며 확인된 신원이 아닙니다. 반면 일반 AI 폴백에는 사용할 수 있는 실제 이름이 필요합니다.

어떤 사용자 이름에서 유용한 결과가 나오나요?

실제 이름, 흔한 별명 형태 또는 뚜렷한 이름 요소가 들어 있는 값에서 유용한 신호가 더 자주 나옵니다. 무작위 문자열과 브랜드명에서는 결과가 나오지 않을 수 있습니다.

API로 사용자 이름 하나를 분석할 수 있나요?

네. 단일 요청 엔드포인트는 값 하나를 분석하고, 별도의 일괄 요청 엔드포인트는 여러 항목을 처리합니다.

Excel 또는 CSV 파일을 업로드할 수 있나요?

네. 파일 도구에서 사용자 이름이나 표시 이름이 들어 있는 열을 선택하고 별명 해석을 켜세요.

V2의 신뢰도 필드와 출처 필드를 함께 저장해야 하는 이유는 무엇인가요?

V2의 data.confidence는 0에서 1 사이의 값입니다. AI 점수와 데이터셋 빈도는 서로 다른 것을 측정하므로 source, confidence_kind와 함께 읽어야 합니다. unknown 결과와 reason 필드도 함께 보관하세요.

이 결과를 고객 세분화에 사용할 수 있나요?

집계 분석이나 데이터 보강의 보조 신호로는 사용할 수 있지만, 개인에게 중대한 영향을 미치는 문제를 이 신호만으로 결정하거나 누군가의 신원을 확정하는 데 사용해서는 안 됩니다.

무료로 테스트할 수 있나요?

새 GenderAPI 계정에는 매일 200크레딧이 무료로 제공되며, API나 파일 도구로 대표 표본을 테스트하는 데 사용할 수 있습니다.

게시일: 2025년 7월 17일최종 검토일:

연동 테스트

알맞은 API로 사용자 이름 분석하기

매일 제공되는 무료 200크레딧으로 시작하고, 워크플로에 맞는 엔드포인트를 연결하세요.