続行 → 概要

REST API リファレンス

少数のエンドポイント、統一されたレスポンス形式。以下はすべてあなたのアカウントに対してライブです。

https://namegender.com/api/v1/gender 無料で登録
llms-full.txt

Claude Code、Cursor、Copilot などのコーディングアシスタント向けの Markdown です。チャットに貼り付けるか、アシスタントにリンクを渡してください。

クイックスタート

ダッシュボードでキーを作成し、最初のリクエストを送信します。SDK は不要です。

curl "https://namegender.com/api/v1/gender?name=Ay%C5%9Fe&country=TR" \
  -H "Authorization: Bearer YOUR_API_KEY"
<?php

$query = http_build_query(['name' => 'Ayşe', 'country' => 'TR']);

$ch = curl_init('https://namegender.com/api/v1/gender?' . $query);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer YOUR_API_KEY'],
]);

$result = json_decode(curl_exec($ch), true);

echo $result['gender'];       // female
echo $result['probability'];  // 100
const params = new URLSearchParams({ name: 'Ayşe', country: 'TR' });

const response = await fetch(`https://namegender.com/api/v1/gender?${params}`, {
  headers: { Authorization: 'Bearer YOUR_API_KEY' },
});

const result = await response.json();

console.log(result.gender);       // "female"
console.log(result.probability);  // 100
import requests

response = requests.get(
    "https://namegender.com/api/v1/gender",
    params={"name": "Ayşe", "country": "TR"},
    headers={"Authorization": "Bearer YOUR_API_KEY"},
)

result = response.json()
print(result["gender"])       # female
print(result["probability"])  # 100
require "net/http"
require "json"

uri = URI("https://namegender.com/api/v1/gender")
uri.query = URI.encode_www_form(name: "Ayşe", country: "TR")

request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer YOUR_API_KEY"

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end

puts JSON.parse(response.body)["gender"]   # female
req, _ := http.NewRequest("GET", "https://namegender.com/api/v1/gender?name=Ay%C5%9Fe&country=TR", nil)
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")

resp, err := http.DefaultClient.Do(req)
if err != nil {
    log.Fatal(err)
}
defer resp.Body.Close()

var result struct {
    Gender      string `json:"gender"`
    Probability int    `json:"probability"`
}
json.NewDecoder(resp.Body).Decode(&result)

fmt.Println(result.Gender)   // female

すべてのエンドポイントは同じ形式でレスポンスするため、パース処理を変更することなく入力を切り替えられます。

認証

すべてのリクエストは API キーをヘッダーに入れて送信します。通常は Authorization: Bearer を使用し、HTTP クライアントが Authorization ヘッダーを別の用途に使っている場合は X-Api-Key を使用してください。URL に含めたキーは拒否されます。URL はプロキシのログ、アクセス解析ツール、ブラウザ履歴にコピーされるためです。

Authorization ヘッダー(推奨)
Authorization: Bearer ng_live_xxxxxxxxxxxx

コピーできませんでした。テキストを選択してコピーしてください。

X-Api-Key ヘッダー
X-Api-Key: ng_live_xxxxxxxxxxxx

コピーできませんでした。テキストを選択してコピーしてください。

クライアント側のコードでキーを露出させないでください。ブラウザやモバイルアプリからの呼び出しは、自身のバックエンドを経由してください。

ダッシュボードからキーを特定の IP アドレスに制限できます。

クライアントライブラリ

REST API の薄いラッパーです。API キーの送信、各リクエストの組み立て、エラーレスポンスの例外への変換を行います。

JavaScript ソース
npm install namegender

コピーできませんでした。テキストを選択してコピーしてください。

Command line ソース
npm install -g namegender

コピーできませんでした。テキストを選択してコピーしてください。

composer require namegender/namegender

コピーできませんでした。テキストを選択してコピーしてください。

pip install namegender-client

コピーできませんでした。テキストを選択してコピーしてください。

gem install namegender

コピーできませんでした。テキストを選択してコピーしてください。

<repository>
  <id>jitpack.io</id>
  <url>https://jitpack.io</url>
</repository>

<dependency>
  <groupId>com.github.anpekesen</groupId>
  <artifactId>namegender-java</artifactId>
  <version>v0.9.0</version>
</dependency>

コピーできませんでした。テキストを選択してコピーしてください。

C# / .NET ソース
dotnet add package NameGender --version 0.6.0

コピーできませんでした。テキストを選択してコピーしてください。

go get github.com/anpekesen/namegender-go@v0.7.0

コピーできませんでした。テキストを選択してコピーしてください。

remotes::install_github('anpekesen/namegender-r', ref = 'v0.7.0')

コピーできませんでした。テキストを選択してコピーしてください。

PowerShell ソース
Install-Module NameGender

コピーできませんでした。テキストを選択してコピーしてください。

cargo add namegender

コピーできませんでした。テキストを選択してコピーしてください。

必須ではありません。API は少数のシンプルな JSON エンドポイントだけです。ライブラリで節約できるのは午後の数時間であり、プロジェクト全体ではありません。言語がリストにない場合は、REST リファレンスにコピー&ペーストできる例があります。

すべて表示

AI アシスタント (MCP)

Claude、Cursor をはじめ、Model Context Protocol に対応したあらゆるクライアントから NameGender を利用できます。アシスタントに名前のリストについて尋ねると、代わりに API を呼び出し、各回答の横に根拠を示します。

Claude Code
claude mcp add namegender -e NAMEGENDER_API_KEY=ng_live_... -- npx -y namegender-mcp

コピーできませんでした。テキストを選択してコピーしてください。

Claude Desktop、Cursor、その他のクライアント
{
    "mcpServers": {
        "namegender": {
            "command": "npx",
            "args": [
                "-y",
                "namegender-mcp"
            ],
            "env": {
                "NAMEGENDER_API_KEY": "ng_live_..."
            }
        }
    }
}

コピーできませんでした。テキストを選択してコピーしてください。

これをクライアントの MCP 設定ファイルに追加し、クライアントを再起動してください。

ツール

gender_from_name
名またはフルネームから性別を判定します。
gender_from_email
メールアドレスに含まれる名前を読み取ります。info@ のような役割アドレスは「不明」を返します。
gender_from_username
ユーザー名やハンドルに含まれる名前を読み取ります。
gender_bulk
1 回のリクエストで最大 100 件の値を処理し、一致率のサマリーを返します。
name_countries
名前が記録されている国。由来を示すものではありません。
salutation
手紙の言語での書き出しの一行。性別が確かでないときはニュートラルな形。
name_check
フォームに入力された名前が実在の名前らしく見えるかどうかと、その理由。名前を偽物と判定することはありません。
age_from_name
米国、フランス、ノルウェーで、ある名を持つ人々の年齢の中央値と年齢の幅。
account_status
残りのクレジットと本日の無料枠。

各検索では、直接 API を呼び出した場合とまったく同じように、キーを所有するアカウントのクレジットが消費されます。 公式 MCP レジストリに io.github.anpekesen/namegender として掲載されています。 npm パッケージ · ソース

GET · POST https://namegender.com/api/v1/gender
Markdown

名前から性別判定

名前またはフルネームを受け入れます。敬称、ミドルネーム、苗字は検索前に削除されるため、「Dr. Ayşe Yılmaz」と「Ayşe」は同じ結果になります。

パラメータ 型 説明
name
必須
string 分類する名前。名または全名。
country
オプション
string ISO 3166-1 alpha-2 国コード。Andrea(イタリアではオス、ドイツではメス)のように、地域によって性別が異なる名前の精度を向上させます。
locale
オプション
string de-DE や en_US のような言語タグ(例:ブラウザの言語)。country を送らない場合、その地域が国として使われます。地域のないタグ(en、de)では国は設定されません。
ip
オプション
string エンドユーザーの IP アドレス。country も地域付きの locale も送らない場合、その国が使われます。保存されません。 IP geolocation by DB-IP (db-ip.com).
ai_fallback
オプション
boolean 名前が当社のデータにない場合、null を返す代わりに言語モデルに推定を依頼します。設定で AI ルックアップを有効にした後にのみ機能し、追加で 1 クレジット消費します。
best_guess
オプション
boolean 根拠が信頼度の閾値に届かない場合でも、優勢な性別を返します。デフォルトはオフです。確定的に見える 50/50 に近い回答は、null よりも大きな害をもたらします。
curl "https://namegender.com/api/v1/gender?name=Jordan" \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "credits_charged": 1,
  "credits_remaining": 49999,
  "request_id": "req_4b7e0c2d9a1f6358",
  "query": "Jordan",
  "name": "Jordan",
  "first_name": "Jordan",
  "middle_name": null,
  "last_name": null,
  "name_type": "personal",
  "gender": "male",
  "country": null,
  "sample_size": 62240,
  "probability": 84,
  "took_ms": 1,
  "confidence": "high",
  "source": "db",
  "matched_as": null
}
GET · POST https://namegender.com/api/v1/gender/email
Markdown

メールから性別判定

メールアドレスのローカル部分から人物を抽出し、その名前を分類します。「ayse.yilmaz84@example.com」は Ayşe に解析されます。

パラメータ 型 説明
email
必須
string メールアドレス。@ より前の部分のみが使用されます。
country
オプション
string ISO 3166-1 alpha-2 国コード。Andrea(イタリアではオス、ドイツではメス)のように、地域によって性別が異なる名前の精度を向上させます。
locale
オプション
string de-DE や en_US のような言語タグ(例:ブラウザの言語)。country を送らない場合、その地域が国として使われます。地域のないタグ(en、de)では国は設定されません。
ip
オプション
string エンドユーザーの IP アドレス。country も地域付きの locale も送らない場合、その国が使われます。保存されません。 IP geolocation by DB-IP (db-ip.com).
ai_fallback
オプション
boolean 名前が当社のデータにない場合、null を返す代わりに言語モデルに推定を依頼します。設定で AI ルックアップを有効にした後にのみ機能し、追加で 1 クレジット消費します。
best_guess
オプション
boolean 根拠が信頼度の閾値に届かない場合でも、優勢な性別を返します。デフォルトはオフです。確定的に見える 50/50 に近い回答は、null よりも大きな害をもたらします。

best_guess はメールアドレスそのものではなく、アドレスから読み取った名前に対して作用します。名前を読み取れない場合は強制する対象がないため、gender は null のままです。ここで強制された回答は、それ自体が誤っている可能性のある抽出結果の上に成り立っていることに注意してください。

curl "https://namegender.com/api/v1/gender/email?email=ayse.yilmaz84%40example.com" \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "credits_charged": 1,
  "credits_remaining": 49998,
  "query": "ayse.yilmaz84@example.com",
  "name": "Ayse",
  "gender": "female",
  "sample_size": 655,
  "probability": 100,
  "took_ms": 1,
  "confidence": "high",
  "source": "db"
}
GET · POST https://namegender.com/api/v1/gender/username
Markdown

ユーザー名から性別判定

キャメルケース、スネークケース、末尾の数字、先頭の @ 記号に対応しています。「AyseYilmaz84」は Ayşe に解析されます。

パラメータ 型 説明
username
必須
string ユーザー名またはハンドル。先頭の @ は無視されます。
country
オプション
string ISO 3166-1 alpha-2 国コード。Andrea(イタリアではオス、ドイツではメス)のように、地域によって性別が異なる名前の精度を向上させます。
locale
オプション
string de-DE や en_US のような言語タグ(例:ブラウザの言語)。country を送らない場合、その地域が国として使われます。地域のないタグ(en、de)では国は設定されません。
ip
オプション
string エンドユーザーの IP アドレス。country も地域付きの locale も送らない場合、その国が使われます。保存されません。 IP geolocation by DB-IP (db-ip.com).
ai_fallback
オプション
boolean 名前が当社のデータにない場合、null を返す代わりに言語モデルに推定を依頼します。設定で AI ルックアップを有効にした後にのみ機能し、追加で 1 クレジット消費します。
best_guess
オプション
boolean 根拠が信頼度の閾値に届かない場合でも、優勢な性別を返します。デフォルトはオフです。確定的に見える 50/50 に近い回答は、null よりも大きな害をもたらします。
curl "https://namegender.com/api/v1/gender/username?username=AyseYilmaz84" \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "credits_charged": 1,
  "credits_remaining": 49997,
  "query": "AyseYilmaz84",
  "name": "Ayse",
  "gender": "female",
  "sample_size": 655,
  "probability": 100,
  "took_ms": 1,
  "confidence": "high",
  "source": "db"
}
POST https://namegender.com/api/v1/gender/bulk
Markdown

一括リクエスト

1 つのリクエストで最大 100 個の名前を送信します。ループの代わりにこれを使用してください。100 個の名前に対する 1 つの一括呼び出しは、単一の往復と単一の重複排除検索です。

パラメータ 型 説明
names
必須
string[] 名前の配列。最大 100 項目。
type
オプション
string 項目の内容:name、email、username。デフォルトは name。
country
オプション
string リクエスト内のすべての項目に適用されます。
locale
オプション
string country を送らない場合、その地域が全項目の国として使われる言語タグ。
ip
オプション
string country も地域付きの locale も送らない場合に、その国が全項目に使われるエンドユーザーの IP アドレス。保存されません。 IP geolocation by DB-IP (db-ip.com).
curl -X POST "https://namegender.com/api/v1/gender/bulk" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"names": ["Ayşe", "Mehmet", "Priya", "Wei"]}'
<?php

$ch = curl_init('https://namegender.com/api/v1/gender/bulk');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'names' => ['Ayşe', 'Mehmet', 'Priya', 'Wei'],
    ]),
]);

$data = json_decode(curl_exec($ch), true);

foreach ($data['results'] as $row) {
    printf("%-8s %-7s %d%%\n", $row['query'], $row['gender'] ?? '?', $row['probability']);
}
const response = await fetch('https://namegender.com/api/v1/gender/bulk', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ names: ['Ayşe', 'Mehmet', 'Priya', 'Wei'] }),
});

const { results, summary } = await response.json();

console.log(summary.match_rate);   // 100
results.forEach(r => console.log(r.query, r.gender, r.probability));
import requests

response = requests.post(
    "https://namegender.com/api/v1/gender/bulk",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json={"names": ["Ayşe", "Mehmet", "Priya", "Wei"]},
)

data = response.json()
print(data["summary"]["match_rate"])   # 100

for row in data["results"]:
    print(row["query"], row["gender"], row["probability"])
{
  "credits_charged": 4,
  "credits_remaining": 49995,
  "request_id": "req_71d0a9e3c5b24f86",
  "took_ms": 2,
  "summary": {
    "total": 4,
    "identified": 4,
    "unknown": 0,
    "match_rate": 100
  },
  "results": [
    { "query": "Ayşe",   "gender": "female", "probability": 100, "sample_size":  655, "confidence": "high", "source": "db" },
    { "query": "Mehmet", "gender": "male",   "probability": 100, "sample_size": 1130, "confidence": "high", "source": "db" },
    { "query": "Priya",  "gender": "female", "probability": 100, "sample_size": 2993, "confidence": "high", "source": "db" },
    { "query": "Wei",    "gender": "male",   "probability":  86, "sample_size":  136, "confidence": "high", "source": "db" }
  ]
}

結果は送信時の順序で返されます。クレジットは名前ごとに課金され、残高が不足している場合はリクエスト全体が処理前に拒否されるため、半処理のバッチは発生しません。

サマリーブロックはマッチ率が一目でわかるため、続行する前に入力をクリーニングする必要があるかどうかを判断できます。

POST GET DELETE https://namegender.com/api/v1/batches
Markdown

ファイルジョブ

最大100 MB・1,000,000行のCSVまたはXLSXファイルをアップロードすると、各行に性別の列を追加したファイルが返されます。1行につき1クレジットで、ジョブが完了した場合にのみ課金されます。

  1. 1. POST /batches ファイルとname_columnを送信します。ジョブはすぐにキューに入ります。
  2. 2. GET /batches/{id} statusがcompletedまたはfailedになるまでジョブを取得します。poll_after_secondsは次の取得までの待ち時間を示します。
  3. 3. GET /batches/{id}/result 結果をダウンロードします。アップロードした形式で返されます。
パラメータ 型 説明
file
必須
file ヘッダー行のあるCSV、TSV、またはXLSX。
name_column
必須
string 名前が入っている列の見出し(ファイル内の表記どおり)。start=falseの場合を除き必須です。
country_column
オプション
string 各行の国コードが入っている列の見出し。
country
オプション
string 国が指定されていない行に使う既定の国。
ai_fallback
オプション
boolean データセットにない名前についてAIモデルに問い合わせます。設定でAIの同意が必要です。
best_guess
オプション
boolean 根拠が弱くても、より可能性の高い性別を返します。
delete_after_download
オプション
boolean 結果は1回だけダウンロードでき、その後削除されます。
start
オプション
boolean false:アップロードと確認のみ。既定はtrueです。
# 1. Upload and start
curl -X POST "https://namegender.com/api/v1/batches" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Idempotency-Key: 6f1c2e0a-customers-2026-09" \
  -F "file=@customers.csv" \
  -F "name_column=first_name" \
  -F "country_column=country"

# 2. Poll until status is completed or failed
curl "https://namegender.com/api/v1/batches/B-7K2M9QX4TA" \
  -H "Authorization: Bearer YOUR_API_KEY"

# 3. Download the result
curl "https://namegender.com/api/v1/batches/B-7K2M9QX4TA/result" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -o customers-gender.csv
import { NameGender } from 'namegender';
import { openAsBlob } from 'node:fs';
import { writeFile } from 'node:fs/promises';

const client = new NameGender(process.env.NAMEGENDER_API_KEY);

const job = await client.batches.create(await openAsBlob('customers.csv'), {
  filename: 'customers.csv',
  name_column: 'first_name',
  country_column: 'country',
});

const done = await client.batches.wait(job.id);
if (done.status === 'failed') throw new Error(done.error.code);

const file = await client.batches.download(done.id);
await writeFile('customers-gender.csv', Buffer.from(await file.arrayBuffer()));
from namegender import NameGender

client = NameGender("YOUR_API_KEY")

job = client.batches.create("customers.csv", name_column="first_name", country_column="country")

done = client.batches.wait(job["id"])
if done["status"] == "failed":
    raise RuntimeError(done["error"]["code"])

client.batches.download(done["id"], "customers-gender.csv")
{
  "id": "B-7K2M9QX4TA",
  "status": "completed",
  "source": "api",
  "file": { "name": "customers.csv", "format": "csv" },
  "columns": { "name": "first_name", "country": "country" },
  "rows": { "total": 200000, "processed": 200000, "identified": 187412 },
  "progress": 100,
  "credits": { "reserved": 200000, "charged": 200000 },
  "summary": { "male": 96120, "female": 91292, "unknown": 12588, "from_llm": 0 },
  "error": null,
  "result": {
    "url": "https://namegender.com/api/v1/batches/B-7K2M9QX4TA/result",
    "format": "csv",
    "expires_at": "2026-10-01T10:04:12Z"
  },
  "poll_after_seconds": null
}

開始にはname_columnが必須です。推測した列が誤っていると、誤ったデータにクレジットを使ってしまいます。まずstart=falseを送って列・プレビュー・費用を確認し、その後ジョブを開始してください。

Idempotency-Keyヘッダーを送信してください。同じキーで再試行すると、2つ目のジョブは作成されず最初のジョブが返されます。

同時にキュー待ちまたは実行中にできるジョブは最大3件です。開始前のジョブはキャンセルでき、クレジットは返却されます。処理中のジョブは停止できません。

POST https://your-server.example/…
Markdown

Webhook

ダッシュボードのWebhookでエンドポイントを追加すると、ファイルジョブの完了時や失敗時に署名付きのPOSTを送信します。ステータスを問い合わせる必要はありません。

イベント 型 説明
batch.completed BatchJob ジョブが完了しました。本文には、GET /batches/{id} が返すのとまったく同じ形でジョブが含まれます。
batch.failed BatchJob ジョブが失敗しました。料金は発生していません。error.code で分岐してください。
credits.low CreditsAlert 現在のペースでは、クレジットは7日以内に尽きます。1時間ごとに確認し、サブスクリプションの更新も考慮します。
credits.depleted CreditsAlert 残高がなくなり、リクエストは402で拒否されています。1時間ごとに確認します。
webhook.test object ダッシュボードの「テストイベントを送信」からのみ、そのエンドポイントにだけ送信されます。
ヘッダー 型 説明
NameGender-Signature
必須
string t=<UNIX秒>,v1=<16進数>。シークレットを更新してから24時間は2つ目のv1が付きます。
NameGender-Event-Id
必須
string イベントID。同じイベントの再試行ではすべて同じです。
NameGender-Delivery-Attempt
必須
integer 最初の試行で1、最大8。

すべてのリクエストを検証する

v1は、タイムスタンプ、ドット、生の本文をエンドポイントのシークレットでHMAC-SHA256したものです。定数時間で比較し、いずれかのv1が一致すれば受け入れ、手元の時計と5分以上ずれたタイムスタンプは拒否してください。クライアントライブラリはこれを1回の呼び出しで行います。

本文は受け取ったまま検証してください。JSONを解析して再シリアライズするフレームワークはバイト列を変えてしまい、署名が一致しなくなります。
import express from 'express';
import { webhooks, NameGenderWebhookError } from 'namegender';

const app = express();

// express.raw, not express.json: the signature covers the exact bytes.
app.post('/namegender', express.raw({ type: 'application/json' }), async (req, res) => {
  let event;
  try {
    event = await webhooks.verify(
      req.body,
      req.get('NameGender-Signature'),
      process.env.NAMEGENDER_WEBHOOK_SECRET,
    );
  } catch (error) {
    if (error instanceof NameGenderWebhookError) return res.sendStatus(400);
    throw error;
  }

  res.sendStatus(204);   // answer first, then do the work

  if (event.type === 'batch.completed') {
    const job = event.data.object;   // same object as GET /batches/{id}
  }
});
import os
from flask import Flask, request
from namegender import webhooks, WebhookVerificationError

app = Flask(__name__)

@app.post("/namegender")
def namegender_webhook():
    try:
        event = webhooks.verify(
            request.get_data(),   # raw bytes, not request.json
            request.headers.get("NameGender-Signature"),
            os.environ["NAMEGENDER_WEBHOOK_SECRET"],
        )
    except WebhookVerificationError:
        return "", 400

    if event["type"] == "batch.completed":
        job = event["data"]["object"]   # same object as GET /batches/{id}
    return "", 204
<?php

$body   = file_get_contents('php://input');   // raw body, before json_decode
$header = $_SERVER['HTTP_NAMEGENDER_SIGNATURE'] ?? '';
$secret = getenv('NAMEGENDER_WEBHOOK_SECRET');

parse_str(str_replace(',', '&', $header), $parts);   // t=…&v1=…
preg_match_all('/v1=([0-9a-f]{64})/', $header, $m);

$t = (int) ($parts['t'] ?? 0);
$expected = hash_hmac('sha256', $t . '.' . $body, $secret);
$valid = abs(time() - $t) <= 300
    && array_filter($m[1], fn ($sig) => hash_equals($expected, $sig));

if (! $valid) {
    http_response_code(400);
    exit;
}

http_response_code(204);
$event = json_decode($body, true);
{
  "id": "evt_16f7c01502fda5436e8b7c4e",
  "type": "batch.completed",
  "created_at": "2026-09-24T10:04:12Z",
  "api_version": "v1",
  "data": {
    "object": {
      "id": "B-7K2M9QX4TA",
      "status": "completed",
      "rows": { "total": 200000, "processed": 200000, "identified": 187412 },
      "credits": { "reserved": 200000, "charged": 200000 },
      "result": { "url": "…/api/v1/batches/B-7K2M9QX4TA/result", "format": "csv" }
    }
  }
}
  • 10秒以内に任意の2xxで応答し、処理はその後で行ってください。
  • リダイレクトを含むそれ以外の応答は、約45時間にわたり最大7回再試行されます。エンドポイントが3日間失敗し続けると停止され、メールでお知らせします。
  • 再試行は同じイベントIDを持ち、順序は保証されません。NameGender-Event-Idで重複を除き、最新の状態が必要な場合はGETでジョブを取得してください。
  • ダッシュボードでシークレットを更新しても、古いシークレットで24時間署名が続くため、イベントを取りこぼさずにサーバーを更新できます。
  • 新しいイベント種別が追加されることがあります。処理しない種別には2xxで応答し、無視してください。
GET POST https://namegender.com/api/v1/gender/countries
Markdown

国別分布

名前が記録されている国を返します。2つのリストが返され、意図的にマージされていません:`registrations` は測定ボリュームで、件数付きの名前統計を公開している11か国間でのみ比較可能です。`attested_in` は存在を示すもので、重み付けはありません。

これは出身国または民族性の推測ではなく、そのように使用してはいけません。件数付きの統計が存在するのは11か国のみです:US、UK、フランス、カナダ、スペイン、アイルランド、ノルウェー、オーストリア、イスラエル、ポーランド、スイス。そのため「Mehmet」のクエリではスイスとフランスがそれぞれ約29%で最初にランク付けされ、トルコはランキングにまったく表示されません。トルコは統計を公開していないためです。トルコは `attested_in` に表示されます。
パラメータ 型 説明
name
必須
string 検索する名前。
limit
オプション
integer `registrations` に表示する統計のある国の数。1–100、デフォルト25。リストが短くなってもシェアは再計算されません。
curl "https://namegender.com/api/v1/gender/countries?name=Mehmet" \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "credits_charged": 1,
  "credits_remaining": 49994,
  "took_ms": 3,
  "name": "Mehmet",
  "basis": {
    "counted_sources": ["ssa", "ons", "nrs", "nisra", "insee", "statcan", "ine", "cso", "ssb", "statat", "pesel", "bfs"],
    "counted_countries": 8,
    "attested_countries": 16,
    "note": "Shares are calculated only across countries that publish counted name statistics…"
  },
  "registrations": [
    { "country": "CH", "count": 3890, "share": 29.45, "gender": "male", "source": "bfs"    },
    { "country": "FR", "count": 3775, "share": 28.58, "gender": "male", "source": "insee"  },
    { "country": "PL", "count": 1808, "share": 13.69, "gender": "male", "source": "pesel"  }
  ],
  "attested_in": ["AL","AT","AU","BE","CA","CH","ES","FR","GB","KS","MK","NO","PL","SE","TR","US"]
}

リクエストあたり1クレジット。`share` は統計のあるすべての国を対象に計算されるため、合計が100になるのは `limit` でリストが切り詰められない場合のみです。`counted_countries` も切り詰め前の数です。`attested_in` はパーセンテージを含みません。これらのレコードの背後に計算するカウントがないためです。

GET POST https://namegender.com/api/v1/salutation
Markdown

敬称・宛名

名前を、手紙やメールにそのまま使える宛名・敬称に変換します。10言語に対応:「Sehr geehrte Frau Dr. Müller,」、「Sayın Ahmet Bey,」、「Madame,」、「山田様」。性別判定も含まれ、料金は同じ1クレジットです。各レスポンスにはフォーマル、インフォーマル、ニュートラルの3行と、フォーマル行の構成要素が含まれます。

パラメータ 型 説明
name
必須
string 肩書きを含むフルネーム(「Dr. Anna Müller」)。これか、`first_name` と `last_name` を送信してください。
first_name, last_name
オプション
string CRM が名前を別々のフィールドで保持している場合は、`name` の代わりにこれらを使用します。解析は行いません。
email
オプション
string 名前を送らない場合に使うメールアドレス。名前は @ より前の部分から読み取り、アクセント記号は付きません(Müller ではなく Mueller)。info@ などの役割アドレスには組織向けの宛名が返ります。
language
オプション
string 敬称の言語:en, en-US, en-GB, de, de-AT, de-CH, fr, es, it, pt, pt-PT, pt-BR, nl, tr, pl, ja。指定がない場合は `locale` の言語、次に国の主要言語、次に英語の順です。未対応の言語はエラーになり、黙って英語に切り替わることはありません。
country, locale, ip
オプション
string 性別判定用の国のヒント。性別エンドポイントと同じです。`language` が送信されていない場合にのみ言語を決定します。
gender
オプション
string すでに分かっている場合は `male`、`female`、`neutral`。判定結果より優先され、`neutral` は常にニュートラルな形になります。
min_probability
オプション
integer 性別に応じた敬称を使う最低確率。50–100、デフォルト90。
title
オプション
string 別フィールドで保持している学位・肩書き(`Dr.` など)。ドイツ語と英語の敬称で使用されます。
curl -X POST "https://namegender.com/api/v1/salutation" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "Dr. Anna Müller", "language": "de"}'
{
  "credits_charged": 1,
  "credits_remaining": 49993,
  "language": "de",
  "form": "gendered",
  "reason": null,
  "salutation": {
    "formal": "Sehr geehrte Frau Dr. Müller,",
    "informal": "Liebe Anna,",
    "neutral": "Guten Tag Dr. Anna Müller,"
  },
  "parts": { "opening": "Sehr geehrte", "courtesy": "Frau", "academic": "Dr.", "name": "Müller" },
  "gender": "female",
  "gender_source": "lookup",
  "probability": 99,
  "first_name": "Anna",
  "last_name": "Müller",
  "name_type": "personal"
}

誤った性別は性別なしより悪いため、性別に応じた形は、性別が `min_probability` 以上の確率で分かり、かつその言語に必要な名前の部分がある場合にのみ使われます。それ以外では `form` が `neutral` になり、`reason` が理由を示します。企業や役割アドレスには `form: organization` が返ります。`best_guess` と `ai_fallback` はここでは適用されません。

POST /api/v1/salutation/bulk は `names` で最大 100 件の名前を受け付けます。1件につき1クレジットで、すべての名前に同じオプションが適用されます。

GET POST https://namegender.com/api/v1/name-check
Markdown

名前チェック

登録フォームやリード獲得フォームに入力された名前が実在の人の名前らしく見えるかどうかと、その理由を返します。キーボードの適当な打鍵(「asdf qwerty」)、仮の値(「Test Test」、「John Doe」、「n/a」)、架空のキャラクター(「Mickey Mouse」)、不適切な言葉、名前欄に入った数字・記号・メールアドレスを検出します。1名につき1クレジットです。

これは本人確認ではなく、名前を偽物と判定することもありません。`implausible` と `suspicious` は、レコードに印を付けたり追加情報を求めたりするために使い、人を自動的に拒否するためには使わないでください。
パラメータ 型 説明
name
必須
string フォームに入力されたままの名前。これか、`first_name` と `last_name` を送信してください。
first_name, last_name
オプション
string フォームの入力欄が分かれている場合は、`name` の代わりにこれらを使用します。
country, locale, ip
オプション
string 国のヒント。性別エンドポイントと同じです。名前の分解と記録の照合に役立ちます。
curl -X POST "https://namegender.com/api/v1/name-check" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "asdf qwerty"}'
{
  "credits_charged": 1,
  "credits_remaining": 49992,
  "query": "asdf qwerty",
  "assessment": "implausible",
  "score": 0,
  "signals": [
    { "code": "placeholder", "severity": "high", "part": "first_name", "value": "asdf" },
    { "code": "keyboard_pattern", "severity": "high", "part": "first_name", "value": "asdf" },
    { "code": "keyboard_pattern", "severity": "high", "part": "last_name", "value": "qwerty" }
  ],
  "first_name": "Asdf",
  "last_name": "Qwerty",
  "name_type": "personal",
  "evidence": { "first_name_status": "not_found", "first_name_counted_records": 0 }
}

`assessment` は、重大度の高いシグナル(キーボードの並び、文字の繰り返し、仮の値、不適切な言葉、メールアドレスや URL)があると `implausible`、中程度のシグナル(架空のキャラクター、数字、記号、会社名、母音がない、非常に長い)が1つか低いシグナルが2つあると `suspicious`、それ以外は `plausible` になります。`score` は 0 から 100 で、独自のしきい値に使えます。公的な出生記録に見つかった名はスコアを上げますが、見たことのない名前というだけでは下げません。姓は形だけで判断します。このエンドポイントの背後に姓のデータセットはありません。

9種類の文字体系による実在の名 4,610 件で、単独でも姓と組み合わせてもテストしました。疑わしい、またはありそうにないと判定されたものはありませんでした。Null、Test、Cockburn のような姓、Ng のような2文字の名前、単一の名前は意図的に問題なしとしています。

POST /api/v1/name-check/bulk は `names` で最大 100 件の名前を受け付けます。1件につき1クレジットで、3つの判定の集計が付きます。

GET POST https://namegender.com/api/v1/age
Markdown

名前から年齢

ある名を持つ存命の人々の年齢を返します。年齢の中央値、中央の半数(`age_range`)、中央の 80%(`age_range_80`)です。米国の Brittany の場合、中央値は 36 歳で、半数が 32 歳から 38 歳の間です。1名につき1クレジットです。

これは集団を表すもので、個人を表すものではありません。ほとんどの名前で、中央の半数は 10 年から 25 年の幅に広がります。オーディエンス分析、セグメント、調査に使い、与信、採用、住宅、保険、資格審査、年齢確認など、個人について何かを決めるためには決して使わないでください。
パラメータ 型 説明
name
必須
string 名またはフルネーム。名が使われます。
gender
オプション
string `male` または `female` を指定すると、その性別の記録だけを使います。男性の Leslie は女性の Leslie より 16 歳年上です。
country, locale, ip
オプション
string 国のヒント。性別エンドポイントと同じです。対象は US、FR、NO です。ヒントがない場合は米国の系列を使い、`country_source` は `default` になります。それ以外の国では `reason: country_not_covered` が返り、料金はかかりません。
curl "https://namegender.com/api/v1/age?name=Brittany" \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "credits_charged": 1,
  "credits_remaining": 49991,
  "request_id": "req_8f2c1a",
  "name": "Brittany",
  "first_name": "Brittany",
  "gender": null,
  "age": 36,
  "age_range": { "low": 32, "high": 38 },
  "age_range_80": { "low": 28, "high": 41 },
  "birth_year": 1990,
  "sample_size": 353775,
  "births": 361434,
  "country": "US",
  "country_source": "default",
  "source": "ssa",
  "series": "1880-2024",
  "reference_year": 2026,
  "reason": null
}

方法:名・性別・年ごとの登録出生数を使い、各年をその出生コーホートのうち現在も生存している割合で重み付けします(SSA のコーホート生命表)。出典:SSA 出生データ 1880–2024(US)、INSEE 1900–2025(フランス)、SSB 1945–2025(ノルウェー)。系列にない名前では `reason` が `not_found`、存命者が 100 人未満では `insufficient_data` になります。

国外での出生はどの系列にも含まれないため、移民に多い名前は実際より若く見えます。ノルウェーの系列は 1945 年から始まるため、それ以前に生まれた人は含まれません。フランスとノルウェーにも米国の生命表を使っています。

POST /api/v1/age/bulk は `names` で最大 100 件の名前を受け付けます。1件につき1クレジットで、送信した順に返します。

GET https://namegender.com/api/v1/me
Markdown

残高

クレジット残高と、本日の無料枠の残りを確認します。この呼び出しは課金されません。

curl "https://namegender.com/api/v1/me" \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "email": "you@example.com",
  "credits_remaining": 50099,
  "purchased_credits": 50000,
  "free_today": 99,
  "free_daily_limit": 100,
  "lifetime_requests": 12480
}

非ラテン文字

名前を独自の文字で送信すると、参照データにブリッジします。追加パラメータはありません。文字を自動検出し、最適な方法を選択します。

サポート済み
アラビア文字

アラビア語は短い母音を省略するため、محمد は "mhmd" に音訳されますが、データは "muhammed" を保持しています。代わりに子音パターンでマッチングを行い、女性形マーカー ة を保持するため、خالد (Khalid) と خالدة (Khalida) は区別されます。ペルシア語とウルドゥー語の名前もアラビア文字で対応します。

中国語文字

ピンイン に変換されます。中国語では姓が最初に来るため、李明 は姓 李 (Li) 、名前 明 (Ming) です。検索前に姓を削除します。1文字の名前は完全な名前として処理されます。

韓国語

中国語と同じく姓が最初に来る処理を行い、一般的な韓国の姓を使用します。

日本語仮名

ひらがなとカタカナは正しく読み取られます (ひろし → Hiroshi)。

キリル文字

ロシア語、ウクライナ語、ブルガリア語、セルビア語の名前は直接音訳されます。

デーヴァナーガリー文字

ヒンディー語、マラーティー語、ネパール語の名前。内在する語尾の母音は処理されます (राहुल → Rahul、「Rahula」ではなく)。

非対応
日本語漢字

日本の漢字と中国の文字は同じUnicode範囲を占めるため、文字だけからは区別できません。Han入力は中国語として読まれます。すでに正確に保持していない漢字の名前はその標準中国語の読み方が適用されますが、日本の名前にはふつう不正確です(健太は「jian tai」と読まれますが、実際の名前はKentaです)。保持している名前は完全一致し、正確です。確実にするため、日本の名前をひらがな・カタカナまたはラテン文字で送信してください。

タイ語

タイ語はアラビア語のように母音を省略し、独自のマッチングレイヤーが必要です。まだ実装されていないため、null を返します。

# Arap yazısı — ünsüz iskeleti üzerinden eşleşir
curl "https://namegender.com/api/v1/gender?name=%D9%85%D8%AD%D9%85%D8%AF" -H "Authorization: Bearer KEY"
# -> { "gender": "male", "probability": 100, "source": "script", "matched_as": "mahamad" }

# Çince — soyadı ayıklanır, verilen ad sorgulanır
curl "https://namegender.com/api/v1/gender?name=%E6%9D%8E%E6%98%8E" -H "Authorization: Bearer KEY"
# -> { "gender": "male", "probability": 92, "source": "db" }

コピーできませんでした。テキストを選択してコピーしてください。

スクリプトをまったく変換できない場合、レスポンスはgender: null、source: noneになります。sourceフィールドを確認してください。scriptは音訳したこと、dbは送信した文字を直接照合したことを意味します。この2つは信頼度が異なり、どちらを得たかが表示されます。

レスポンスフィールド

すべてのエンドポイント共通です。

フィールド 型 説明
credits_charged integer この呼び出しで差し引かれたクレジット数。
credits_remaining integer この呼び出しの支払い後に使える残高。購入済みクレジットと本日の無料枠の残りの合計です。
query string 送信した入力そのもの。クリーニング前の値です。
name string 敬称と姓を削除した後の実際に検索した名前。
first_name string 入力から取り出した名。gender が null の場合も返され、追加のクレジットはかかりません。
middle_name string 名と姓の間にあるその他の名前。イニシャルは含まれません。
last_name string 姓。van や de la などの前置詞を含みます。中国語・韓国語・日本語の表記では先頭の姓がここに入ります。ユーザー名では常に null です。
name_type string personal、organization(Acme LLC など)、role(info@、カスタマーサービスなど)のいずれか。組織と役割アカウントには性別を返しません。
gender string 男性、女性、または判定の確度が足りない場合は null。
country string 統計の対象国、またはグローバル集計の場合は null。
country_source string 国の出どころ:country、locale、ip、または全世界の回答の場合は null。
sample_size integer この回答の基となる記録上の人数。0 の場合は、ソースが監査可能な件数ではなく、比率や出現記録のみを公開していることを意味します。
probability integer 指定された性別の確度、50~100。性別が null の場合は 0。
took_ms integer ルックアップの解決にかかった時間(ミリ秒単位の整数)。お客様側のネットワーク時間は含まれません。

他のサービスにはない2つのフィールド

source は回答がどこから来たかを示します:リファレンスデータベース、ファジーマッチ、またはAIフォールバック。matched_as はファジーマッチが該当したエントリの名前を示します。この2つにより、単一の結果をそのまま信じるのではなく、信頼度を判断できます。

フィールド 型 説明
source string db、script、fuzzy、llm、または none。
confidence string サンプル証拠に基づいて、高、中、低、未検証、または不明。
matched_as string ファジーマッチの場合、該当したデータベースエントリ。それ以外は null。

エラーコード

呼び出しの失敗は HTTP ステータスコードでわかります。JSON ボディでは error に理由、message に説明が入り、サポートへの問い合わせ時に伝える request_id と、下表の該当行へのドキュメントリンクも含まれます。分岐は必ず error で行い、message では行わないでください。message は翻訳され、文言が変わることがあります。

コード HTTP 意味
missing_key 401 APIキーが送信されていません。リクエストに Authorization: Bearer ヘッダーまたは X-Api-Key ヘッダーを追加してください。
invalid_key 401 このAPIキーは有効ではありません。
revoked_key 401 このAPIキーは取り消されています。
blocked 403 このアカウントは停止されています。サポートにお問い合わせください。
email_not_verified 403 このアカウントのメールアドレスはまだ確認されていません。お送りした確認リンクを開くか、ダッシュボードから新しいリンクをリクエストしてください。
ip_not_allowed 403 このIPアドレスからのリクエストはこのキーでは許可されていません。
proxy_secret_required 403 このキーはAPIマーケットプレイスを通じてのみ機能し、すべてのリクエストに署名が付与されます。そこで発行されたキーを使用してください。
forbidden 403 このアクションを実行する権限がありません。
no_credits 402 クレジットが不足しています。追加購入するか、毎日のフリークォータがリセットされるまでお待ちください。
missing_input 400 "name" パラメータは必須です。
invalid_input 422 "name" パラメータが無効です。
too_many_items 422 1つのリクエストで送信できる最大アイテム数は 100 です。
unknown_endpoint 404 このパスにはエンドポイントがありません。URLをAPI ドキュメントと照合してください。
method_not_allowed 405 このエンドポイントは DELETE リクエストを受け付けていません。
payload_too_large 413 リクエストボディが大きすぎます。
rate_limited 429 リクエストが多すぎます。少し間隔を空けてもう一度お試しください。
batch_not_found 404 このアカウントには、このIDのファイルジョブはありません。
batch_not_startable 409 このジョブはすでに開始済み、または終了しています。
batch_not_finished 409 このジョブはまだ完了していません。ステータスを確認し、完了後に結果をダウンロードしてください。
batch_in_progress 409 このジョブは処理中のため、現在キャンセルできません。完了後に削除してください。
result_gone 410 このジョブにはダウンロードできる結果がありません。失敗した、キャンセルされた、期限切れになった、または1回限りの結果がすでにダウンロードされています。
too_many_batches 429 実行中のファイルジョブがすでに100件あります。新しいジョブを開始する前に、いずれかの完了をお待ちください。
not_ready 503 名前データベースが再構築中です。しばらくしてからお試しください。
server_error 500 サーバー側でエラーが発生しました。確認させていただきます。
{
  "error": "no_credits",
  "message": "You are out of credits. Buy more or wait for your daily free quota to reset.",
  "request_id": "req_9c1f5b2a7e0d4a13",
  "docs": "https://namegender.com/docs#error-no_credits"
}

コピーできませんでした。テキストを選択してコピーしてください。

レート制限

通常の使用ではレート制限に達しません。この上限は、流出したキーの悪用を防ぐために存在し、IP ではなく API キー単位で計測されるため、同一サーバー上の複数の顧客の割り当てが互いに消費されることはありません。

現在の制限:キーあたり 1 分間あたり 1,200 リクエスト。より多くが必要な場合は、お知らせいただければアカウントで引き上げます。

すべてのレスポンスに標準の X-RateLimit-Limit および X-RateLimit-Remaining ヘッダーが含まれます。

GET リクエストでのスペースと非ラテン文字

Ayşe Yılmaz や 中村 のような名前は、入力したままでは URL に載せられません。GET で呼び出す場合は値をパーセントエンコードするか、POST で JSON ボディに入れて送信すればエンコードは一切不要です。

Ayşe Yılmaz  ->  Ay%C5%9Fe%20Y%C4%B1lmaz
محمد          ->  %D9%85%D8%AD%D9%85%D8%AF
中村           ->  %E4%B8%AD%E6%9D%91

コピーできませんでした。テキストを選択してコピーしてください。