REST API リファレンス
少数のエンドポイント、統一されたレスポンス形式。以下はすべてあなたのアカウントに対してライブです。
https://namegender.com/api/v1/gender
無料で登録
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: Bearer ng_live_xxxxxxxxxxxx
コピーできませんでした。テキストを選択してコピーしてください。
X-Api-Key: ng_live_xxxxxxxxxxxx
コピーできませんでした。テキストを選択してコピーしてください。
ダッシュボードからキーを特定の IP アドレスに制限できます。
クライアントライブラリ
REST API の薄いラッパーです。API キーの送信、各リクエストの組み立て、エラーレスポンスの例外への変換を行います。
npm install namegender
コピーできませんでした。テキストを選択してコピーしてください。
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>
コピーできませんでした。テキストを選択してコピーしてください。
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')
コピーできませんでした。テキストを選択してコピーしてください。
Install-Module NameGender
コピーできませんでした。テキストを選択してコピーしてください。
cargo add namegender
コピーできませんでした。テキストを選択してコピーしてください。
必須ではありません。API は少数のシンプルな JSON エンドポイントだけです。ライブラリで節約できるのは午後の数時間であり、プロジェクト全体ではありません。言語がリストにない場合は、REST リファレンスにコピー&ペーストできる例があります。
すべて表示AI アシスタント (MCP)
Claude、Cursor をはじめ、Model Context Protocol に対応したあらゆるクライアントから NameGender を利用できます。アシスタントに名前のリストについて尋ねると、代わりに API を呼び出し、各回答の横に根拠を示します。
claude mcp add namegender -e NAMEGENDER_API_KEY=ng_live_... -- npx -y namegender-mcp
コピーできませんでした。テキストを選択してコピーしてください。
{
"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 パッケージ · ソース
名前から性別判定
名前またはフルネームを受け入れます。敬称、ミドルネーム、苗字は検索前に削除されるため、「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
}
メールから性別判定
メールアドレスのローカル部分から人物を抽出し、その名前を分類します。「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"
}
ユーザー名から性別判定
キャメルケース、スネークケース、末尾の数字、先頭の @ 記号に対応しています。「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"
}
一括リクエスト
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" }
]
}
結果は送信時の順序で返されます。クレジットは名前ごとに課金され、残高が不足している場合はリクエスト全体が処理前に拒否されるため、半処理のバッチは発生しません。
サマリーブロックはマッチ率が一目でわかるため、続行する前に入力をクリーニングする必要があるかどうかを判断できます。
ファイルジョブ
最大100 MB・1,000,000行のCSVまたはXLSXファイルをアップロードすると、各行に性別の列を追加したファイルが返されます。1行につき1クレジットで、ジョブが完了した場合にのみ課金されます。
-
1.
POST /batchesファイルとname_columnを送信します。ジョブはすぐにキューに入ります。 -
2.
GET /batches/{id}statusがcompletedまたはfailedになるまでジョブを取得します。poll_after_secondsは次の取得までの待ち時間を示します。 -
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件です。開始前のジョブはキャンセルでき、クレジットは返却されます。処理中のジョブは停止できません。
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回の呼び出しで行います。
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で応答し、無視してください。
国別分布
名前が記録されている国を返します。2つのリストが返され、意図的にマージされていません:`registrations` は測定ボリュームで、件数付きの名前統計を公開している11か国間でのみ比較可能です。`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` はパーセンテージを含みません。これらのレコードの背後に計算するカウントがないためです。
敬称・宛名
名前を、手紙やメールにそのまま使える宛名・敬称に変換します。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クレジットで、すべての名前に同じオプションが適用されます。
名前チェック
登録フォームやリード獲得フォームに入力された名前が実在の人の名前らしく見えるかどうかと、その理由を返します。キーボードの適当な打鍵(「asdf qwerty」)、仮の値(「Test Test」、「John Doe」、「n/a」)、架空のキャラクター(「Mickey Mouse」)、不適切な言葉、名前欄に入った数字・記号・メールアドレスを検出します。1名につき1クレジットです。
| パラメータ | 型 | 説明 |
|---|---|---|
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つの判定の集計が付きます。
名前から年齢
ある名を持つ存命の人々の年齢を返します。年齢の中央値、中央の半数(`age_range`)、中央の 80%(`age_range_80`)です。米国の Brittany の場合、中央値は 36 歳で、半数が 32 歳から 38 歳の間です。1名につき1クレジットです。
| パラメータ | 型 | 説明 |
|---|---|---|
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クレジットで、送信した順に返します。
残高
クレジット残高と、本日の無料枠の残りを確認します。この呼び出しは課金されません。
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 です。 |
ai_consent_required |
422 | ai_fallback は名前をサードパーティの AI プロバイダーに送信しますが、このアカウントはまだ同意していません。「ai」フィールドでプロバイダーを確認してから、ダッシュボード設定で AI ルックアップを有効にしてください。 |
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
コピーできませんでした。テキストを選択してコピーしてください。