继续 → 概览

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

每个端点返回相同的结构,因此你可以切换输入而无需修改解析代码。

身份验证

每个请求都在 header 中携带你的 API key。默认使用 Authorization: Bearer;如果你的 HTTP 客户端把 Authorization header 用于其他用途,则使用 X-Api-Key。放在 URL 中的 key 会被拒绝:URL 会被复制到代理日志、分析工具和浏览器历史中。

Authorization header(推荐)
Authorization: Bearer ng_live_xxxxxxxxxxxx

复制失败。请选择并复制文本。

X-Api-Key header
X-Api-Key: ng_live_xxxxxxxxxxxx

复制失败。请选择并复制文本。

切勿在客户端代码中暴露 key。来自浏览器或移动应用的调用应通过你自己的后端进行。

你可以从仪表板将 key 限制到特定 IP 地址。

客户端库

REST 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
单次请求最多 100 个值,并附带匹配率摘要。
name_countries
记录有该名字的国家。并非对名字来源的判断。
salutation
用信件语言写出信件的开头称呼;性别不确定时使用中性称呼。
name_check
判断表单中填写的姓名是否像真实姓名,并说明原因。绝不会称某个姓名是假的。
age_from_name
美国、法国和挪威使用某个名字的人群的年龄中位数和年龄范围。
account_status
剩余额度及今日免费额度。

每次查询都会从密钥所属账户扣除额度,与直接调用 API 完全相同。 已以 io.github.anpekesen/namegender 的名称收录于官方 MCP 注册表。 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 查询后生效,并额外消耗一个额度。
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 查询后生效,并额外消耗一个额度。
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 查询后生效,并额外消耗一个额度。
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

批量请求

一次请求最多支持 100 个名字。使用此功能而不是循环调用:一次批量调用处理 100 个名字只需一次往返和一次去重查询。

参数 类型 描述
names
必需
string[] 名字数组。最多 100 项。
type
可选
string 项目类型:name、email 或 username。默认为 name。
country
可选
string 应用于请求中的每一项。
locale
可选
string 未发送 country 时,其地区将作为每个条目国家的语言标签。
ip
可选
string 最终用户的 IP 地址;既未发送 country 也未发送带地区的 locale 时,其国家用于每个条目。不会存储。 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. 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 结果只能下载一次,之后即被删除。
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 请求头。使用相同的键重试会返回第一个任务,而不会再创建一个。

同时最多可有 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 天。每小时检查一次,并会考虑订阅续订。
credits.depleted CreditsAlert 余额已用完,请求会以 402 被拒绝。每小时检查一次。
webhook.test object 仅在控制台点击“发送测试事件”时发送,且只发给该端点。
请求头 类型 描述
NameGender-Signature
必需
string t=<Unix 秒>,v1=<十六进制>。更换密钥后的 24 小时内会附带第二个 v1。
NameGender-Event-Id
必需
string 事件 ID。同一事件的每次重试都相同。
NameGender-Delivery-Attempt
必需
integer 首次尝试为 1,最多 8。

验证每个请求

v1 是用端点密钥对“时间戳、一个点、原始请求体”计算的 HMAC-SHA256。请使用恒定时间比较,任一 v1 匹配即接受请求,并拒绝与您的时钟相差超过五分钟的时间戳。客户端库一次调用即可完成以上全部检查。

请按收到的原样验证请求体。先解析 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 次。如果端点连续三天失败,将被停用,并向您发送邮件。
  • 重试使用相同的事件 ID,且不保证顺序。请用 NameGender-Event-Id 去重;需要任务的最新状态时,请用 GET 读取。
  • 在控制台更换密钥后,旧密钥仍会在 24 小时内继续签名,您可以在不丢失事件的情况下更新服务器。
  • 以后可能会新增事件类型。对于您不处理的类型,请返回 2xx 并忽略。
GET POST https://namegender.com/api/v1/gender/countries
Markdown

国家分布

返回某个姓名被记录的国家。返回两个列表,故意不合并:`registrations` 是测量的数量,仅在发布带计数姓名统计数据的十一个国家之间可比较;`attested_in` 是存在性指标,不附加权重。

这不是原籍国或族裔推断,也不得作为此类用途。只有十一个国家公布带计数的统计数据:美国、英国、法国、加拿大、西班牙、爱尔兰、挪威、奥地利、以色列、波兰和瑞士。因此查询“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` 基于所有有计数的国家计算,因此只有当 `limit` 未截断列表时,其总和才为 100;`counted_countries` 同样统计截断前的数量。`attested_in` 不包含百分比,因为这些记录后面没有计数可用于计算。

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

称呼

将姓名转换为可直接用于信件或邮件的称呼,支持十种语言:“Sehr geehrte Frau Dr. Müller,”、“Sayın Ahmet Bey,”、“Madame,”、“山田様”。包含性别查询,费用仍为 1 个点数。每个响应包含正式、非正式和中性三行称呼,以及正式称呼的组成部分。

参数 类型 描述
name
必需
string 包含头衔的全名(“Dr. Anna Müller”)。发送此项,或发送 `first_name` 和 `last_name`。
first_name, last_name
可选
string 当你的 CRM 将姓名存放在不同字段时,用它们代替 `name`。不做任何解析。
email
可选
string 未发送姓名时使用的电子邮件地址。姓名从 @ 之前的部分读取,不带重音符号(Mueller 而不是 Müller);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 个点数,所有姓名使用相同的选项。

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

姓名检查

判断注册表单或销售线索表单中填写的姓名是否像真实人物的姓名,并说明原因。可识别随手乱敲的键盘输入(“asdf qwerty”)、占位内容(“Test Test”、“John Doe”、“n/a”)、虚构角色(“Mickey Mouse”)、脏话,以及姓名栏中的数字、符号或电子邮件地址。每个姓名 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 }
}

存在高严重度信号(键盘序列、重复字母、占位内容、脏话、电子邮件或 URL)时,`assessment` 为 `implausible`;存在一个中等信号(虚构角色、数字、符号、公司名称、没有元音、过长)或两个低信号时为 `suspicious`;其余情况为 `plausible`。`score` 范围为 0 到 100,便于你自定阈值。在官方出生记录中找到的名字会提高分数;我们从未见过的名字本身不会降低分数。姓氏仅按其形式判断:此端点背后没有姓氏数据集。

已在九种文字的 4,610 个真实名字上测试,包括单独使用和与姓氏搭配:没有一个被标记为可疑或不合理。像 Null、Test 或 Cockburn 这样的姓氏、像 Ng 这样的两个字母的名字以及单名,都有意不作标记。

POST /api/v1/name-check/bulk 在 `names` 中最多接受 100 个姓名,每个 1 个点数,并附三种评估结果的汇总。

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

按名字推测年龄

使用某个名字的在世人群有多大年龄:年龄中位数、中间一半人群(`age_range`)和中间 80%(`age_range_80`)。美国的 Brittany:中位数 36 岁,一半人在 32 到 38 岁之间。每个姓名 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 个点数,按发送顺序返回。

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) — 我们在查询前会去除姓氏。单个字符作为完整的名字进行处理。

韩文

与中文相同的姓氏优先处理方式,使用常见的韩国姓氏。

日文假名

平假名和片假名正确识别(ひろし → Hiroshi)。

西里尔字母

俄语、乌克兰语、保加利亚语和塞尔维亚语名字可直接音译。

天城文

印地语、马拉地语和尼泊尔语名字。已正确处理固有的末尾元音(राहुल → Rahul,而非 "Rahula")。

不支持
日文汉字

日语汉字和中文字符占据相同的 Unicode 范围,因此我们无法仅从字符本身区分它们。汉字输入被识别为中文:我们未曾精确保存的汉字名字会被给予普通话读音,但对于日语名字通常是错误的(健太被读作「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 表示我们直接匹配了您发送的字符。这两种方式的 confidence 不同,我们会向您显示您获得的是哪一种。

响应字段

在所有端点中保持一致。

字段 类型 描述
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 我们解析这次查询所用的时间,以整毫秒计。不包括你这一侧的网络时间。

其他服务不提供的两个字段

source 告诉你答案的来源:参考数据库、模糊匹配或 AI 备选方案。matched_as 显示模糊匹配命中的条目。通过这两个字段,你可以决定对单个结果的信任程度,而不是盲目接受。

字段 类型 描述
source string db、script、fuzzy、llm 或 none。
confidence string 高、中、低、未验证或未知,基于样本证据。
matched_as string 模糊匹配时,匹配到的数据库条目。否则为 null。

错误代码

HTTP 状态码表明调用失败。JSON 响应体随后在 error 中给出原因,在 message 中加以说明,并提供可向支持团队出示的 request_id,以及指向下表对应行的文档链接。请根据 error 分支处理,切勿依据 message:消息会被翻译,措辞也可能调整。

代码 HTTP 含义
missing_key 401 未发送 API key。请在请求中添加 Authorization: Bearer header 或 X-Api-Key header。
invalid_key 401 此 API key 无效。
revoked_key 401 此 API key 已被撤销。
blocked 403 账户已被冻结。请联系支持团队。
email_not_verified 403 该账户的邮箱地址尚未确认。请打开我们发送的确认链接,或在控制台重新申请。
ip_not_allowed 403 不允许从此 IP 地址对此 key 发起请求。
proxy_secret_required 403 此密钥仅适用于其 API 市场,该市场会对每个请求进行签名。请使用在那里为您颁发的密钥。
forbidden 403 您无权执行此操作。
no_credits 402 您的额度已耗尽。请购买更多或等待每日免费额度重置。
missing_input 400 "name" 参数为必填项。
invalid_input 422 "name" 参数无效。
too_many_items 422 单次请求最多可发送 100 项。
unknown_endpoint 404 此路径没有 endpoint。请根据 API 文档检查 URL。
method_not_allowed 405 此 endpoint 不接受 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 此任务没有可下载的结果。它可能已失败、已取消、已过期,或其一次性下载结果已被获取。
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"
}

复制失败。请选择并复制文本。

速率限制

正常使用不会触及限制。该上限用于防止泄露的密钥被滥用,限制按 API 密钥而非 IP 计算,这样多个客户共用同一服务器时不会相互消耗配额。

当前限制:每个密钥每分钟 1,200 个请求。需要更高限制?告诉我们,我们会为你的账户提升。

每个响应都包含标准的 X-RateLimit-Limit 和 X-RateLimit-Remaining header。

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

复制失败。请选择并复制文本。