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
每个端点返回相同的结构,因此你可以切换输入而无需修改解析代码。
身份验证
每个请求都在 header 中携带你的 API key。默认使用 Authorization: Bearer;如果你的 HTTP 客户端把 Authorization header 用于其他用途,则使用 X-Api-Key。放在 URL 中的 key 会被拒绝:URL 会被复制到代理日志、分析工具和浏览器历史中。
Authorization: Bearer ng_live_xxxxxxxxxxxx
复制失败。请选择并复制文本。
X-Api-Key: ng_live_xxxxxxxxxxxx
复制失败。请选择并复制文本。
你可以从仪表板将 key 限制到特定 IP 地址。
客户端库
REST 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- 单次请求最多 100 个值,并附带匹配率摘要。
name_countries- 记录有该名字的国家。并非对名字来源的判断。
salutation- 用信件语言写出信件的开头称呼;性别不确定时使用中性称呼。
name_check- 判断表单中填写的姓名是否像真实姓名,并说明原因。绝不会称某个姓名是假的。
age_from_name- 美国、法国和挪威使用某个名字的人群的年龄中位数和年龄范围。
account_status- 剩余额度及今日免费额度。
每次查询都会从密钥所属账户扣除额度,与直接调用 API 完全相同。 已以 io.github.anpekesen/namegender 的名称收录于官方 MCP 注册表。 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 查询后生效,并额外消耗一个额度。 |
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 查询后生效,并额外消耗一个额度。 |
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 查询后生效,并额外消耗一个额度。 |
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"
}
批量请求
一次请求最多支持 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" }
]
}
结果按发送顺序返回。积分按名字数计费,如果余额不足,整个请求在任何处理前会被拒绝,所以你永远不会得到半处理的批次。
摘要区块一目了然地显示匹配率,让你决定是否需要在处理其余数据前清洗输入数据。
文件任务
上传不超过 100 MB、1,000,000 行的 CSV 或 XLSX 文件,返回的文件会在每一行添加性别列。每行 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
|
结果只能下载一次,之后即被删除。 |
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 个任务在排队或运行。尚未开始的任务可以取消,积分会退回;正在处理的任务无法停止。
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 匹配即接受请求,并拒绝与您的时钟相差超过五分钟的时间戳。客户端库一次调用即可完成以上全部检查。
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 并忽略。
国家分布
返回某个姓名被记录的国家。返回两个列表,故意不合并:`registrations` 是测量的数量,仅在发布带计数姓名统计数据的十一个国家之间可比较;`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` 不包含百分比,因为这些记录后面没有计数可用于计算。
称呼
将姓名转换为可直接用于信件或邮件的称呼,支持十种语言:“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 个点数,所有姓名使用相同的选项。
姓名检查
判断注册表单或销售线索表单中填写的姓名是否像真实人物的姓名,并说明原因。可识别随手乱敲的键盘输入(“asdf qwerty”)、占位内容(“Test Test”、“John Doe”、“n/a”)、虚构角色(“Mickey Mouse”)、脏话,以及姓名栏中的数字、符号或电子邮件地址。每个姓名 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 }
}
存在高严重度信号(键盘序列、重复字母、占位内容、脏话、电子邮件或 URL)时,`assessment` 为 `implausible`;存在一个中等信号(虚构角色、数字、符号、公司名称、没有元音、过长)或两个低信号时为 `suspicious`;其余情况为 `plausible`。`score` 范围为 0 到 100,便于你自定阈值。在官方出生记录中找到的名字会提高分数;我们从未见过的名字本身不会降低分数。姓氏仅按其形式判断:此端点背后没有姓氏数据集。
已在九种文字的 4,610 个真实名字上测试,包括单独使用和与姓氏搭配:没有一个被标记为可疑或不合理。像 Null、Test 或 Cockburn 这样的姓氏、像 Ng 这样的两个字母的名字以及单名,都有意不作标记。
POST /api/v1/name-check/bulk 在 `names` 中最多接受 100 个姓名,每个 1 个点数,并附三种评估结果的汇总。
按名字推测年龄
使用某个名字的在世人群有多大年龄:年龄中位数、中间一半人群(`age_range`)和中间 80%(`age_range_80`)。美国的 Brittany:中位数 36 岁,一半人在 32 到 38 岁之间。每个姓名 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 个点数,按发送顺序返回。
余额
查看你的额度余额以及今日免费额度的剩余量。此调用不计费。
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 项。 |
ai_consent_required |
422 | ai_fallback 会将姓名发送给第三方 AI 提供商,但该账户尚未同意此操作。查看"ai"字段了解提供商信息,然后在仪表板设置中启用 AI 查询功能。 |
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
复制失败。请选择并复制文本。