Referência da REST API
Poucos endpoints, um formato de resposta. Tudo abaixo é executado em tempo real em sua conta.
https://namegender.com/api/v1/gender
Criar conta grátis
Markdown para assistentes de código como Claude Code, Cursor e Copilot. Cole no chat ou envie o link ao assistente.
Início rápido
Crie uma chave no seu dashboard e envie sua primeira requisição. Nenhum SDK necessário.
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
Cada endpoint retorna o mesmo formato, então você pode alternar entradas sem alterar seu código de análise.
Autenticação
Toda requisição leva sua chave de API em um header. Use Authorization: Bearer por padrão, ou X-Api-Key quando seu cliente HTTP reserva o header Authorization para outra coisa. Uma chave colocada na URL é rejeitada: URLs acabam copiadas em logs de proxy, ferramentas de analytics e no histórico do navegador.
Authorization: Bearer ng_live_xxxxxxxxxxxx
Falha ao copiar. Selecione e copie o texto.
X-Api-Key: ng_live_xxxxxxxxxxxx
Falha ao copiar. Selecione e copie o texto.
Você pode restringir uma chave a endereços IP específicos no dashboard.
Bibliotecas cliente
Wrappers finos sobre a API REST. Enviam sua chave, montam cada requisição e transformam respostas de erro em exceções.
npm install namegender
Falha ao copiar. Selecione e copie o texto.
npm install -g namegender
Falha ao copiar. Selecione e copie o texto.
composer require namegender/namegender
Falha ao copiar. Selecione e copie o texto.
pip install namegender-client
Falha ao copiar. Selecione e copie o texto.
gem install namegender
Falha ao copiar. Selecione e copie o texto.
<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>
Falha ao copiar. Selecione e copie o texto.
dotnet add package NameGender --version 0.6.0
Falha ao copiar. Selecione e copie o texto.
go get github.com/anpekesen/namegender-go@v0.7.0
Falha ao copiar. Selecione e copie o texto.
remotes::install_github('anpekesen/namegender-r', ref = 'v0.7.0')
Falha ao copiar. Selecione e copie o texto.
Install-Module NameGender
Falha ao copiar. Selecione e copie o texto.
cargo add namegender
Falha ao copiar. Selecione e copie o texto.
Você não precisa de uma. A API é só um punhado de endpoints de JSON simples; uma biblioteca economiza uma tarde, não um projeto. Se sua linguagem não está listada, a referência REST tem exemplos para copiar e colar.
Ver tudoAssistentes de IA (MCP)
Use o NameGender no Claude, no Cursor e em qualquer outro cliente compatível com o Model Context Protocol. Pergunte ao assistente sobre uma lista de nomes e ele chama a API para você, com as evidências ao lado de cada resposta.
claude mcp add namegender -e NAMEGENDER_API_KEY=ng_live_... -- npx -y namegender-mcp
Falha ao copiar. Selecione e copie o texto.
{
"mcpServers": {
"namegender": {
"command": "npx",
"args": [
"-y",
"namegender-mcp"
],
"env": {
"NAMEGENDER_API_KEY": "ng_live_..."
}
}
}
}
Falha ao copiar. Selecione e copie o texto.
Adicione isto ao arquivo de configuração MCP do cliente e reinicie-o.
Ferramentas
gender_from_name- Gênero a partir de um primeiro nome ou nome completo.
gender_from_email- Lê o nome em um endereço de email; endereços genéricos como info@ retornam desconhecido.
gender_from_username- Lê o nome em um nome de usuário ou handle.
gender_bulk- Até 100 valores em uma requisição, com um resumo da taxa de correspondência.
name_countries- Países onde um nome está registrado. Não é uma afirmação sobre a origem.
salutation- Linha de abertura de uma carta no idioma da carta; a forma neutra quando o gênero não é certo.
name_check- Se um nome digitado em um formulário parece real, com os motivos. Nunca chama um nome de falso.
age_from_name- Idade mediana e faixas etárias das pessoas com um primeiro nome nos Estados Unidos, na França e na Noruega.
account_status- Créditos restantes e a cota gratuita de hoje.
Cada consulta usa créditos da conta dona da chave, exatamente como uma chamada direta à API. Listado no registro oficial do MCP como io.github.anpekesen/namegender. Pacote npm · Código-fonte
Gênero a partir do nome
Aceita um primeiro nome ou nome completo. Títulos, nomes do meio e sobrenomes são removidos antes da consulta, então "Dr. Ayşe Yılmaz" e "Ayşe" geram a mesma resposta.
| Parâmetro | Tipo | Descrição |
|---|---|---|
name
obrigatório
|
string
|
O nome a classificar. Primeiro nome ou nome completo. |
country
opcional
|
string
|
Código de país ISO 3166-1 alpha-2. Melhora a precisão para nomes cujo gênero varia por região, como Andrea (masculino na Itália, feminino na Alemanha). |
locale
opcional
|
string
|
Uma etiqueta de idioma como de-DE ou en_US, por exemplo o idioma do navegador. A região dela vira o país quando country não é enviado. Uma etiqueta sem região (en, de) não define país. |
ip
opcional
|
string
|
O endereço IP do usuário final. O país dele é usado quando não se envia country nem um locale com região. Não é armazenado. IP geolocation by DB-IP (db-ip.com). |
ai_fallback
opcional
|
boolean
|
Se o nome não tiver registro em nossos dados, peça uma estimativa a um modelo de linguagem em vez de retornar null. Só funciona depois que as consultas de IA forem ativadas nas suas configurações, e custa um crédito extra. |
best_guess
opcional
|
boolean
|
Retorne o gênero predominante mesmo quando as evidências não atingem o limite de confiança. Desativado por padrão: uma resposta perto de 50/50 que parece definitiva causa mais estrago do que um 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
}
Gênero a partir do email
Extrai a pessoa da parte local do endereço e então classifica isso. "ayse.yilmaz84@example.com" resolve para Ayşe.
| Parâmetro | Tipo | Descrição |
|---|---|---|
email
obrigatório
|
string
|
O endereço de email. Apenas a parte anterior a @ é usada. |
country
opcional
|
string
|
Código de país ISO 3166-1 alpha-2. Melhora a precisão para nomes cujo gênero varia por região, como Andrea (masculino na Itália, feminino na Alemanha). |
locale
opcional
|
string
|
Uma etiqueta de idioma como de-DE ou en_US, por exemplo o idioma do navegador. A região dela vira o país quando country não é enviado. Uma etiqueta sem região (en, de) não define país. |
ip
opcional
|
string
|
O endereço IP do usuário final. O país dele é usado quando não se envia country nem um locale com região. Não é armazenado. IP geolocation by DB-IP (db-ip.com). |
ai_fallback
opcional
|
boolean
|
Se o nome não tiver registro em nossos dados, peça uma estimativa a um modelo de linguagem em vez de retornar null. Só funciona depois que as consultas de IA forem ativadas nas suas configurações, e custa um crédito extra. |
best_guess
opcional
|
boolean
|
Retorne o gênero predominante mesmo quando as evidências não atingem o limite de confiança. Desativado por padrão: uma resposta perto de 50/50 que parece definitiva causa mais estrago do que um null. |
best_guess atua sobre o primeiro nome lido do endereço, não sobre o endereço em si. Quando nenhum primeiro nome pode ser lido, não há nada a forçar e gender continua null. Lembre-se de que uma resposta forçada aqui se apoia em uma extração que também pode estar errada.
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"
}
Gênero a partir do nome de usuário
Lida com camelCase, snake_case, dígitos à direita e sinais @ à esquerda. "AyseYilmaz84" resolve para Ayşe.
| Parâmetro | Tipo | Descrição |
|---|---|---|
username
obrigatório
|
string
|
O nome de usuário ou handle. Um @ à esquerda é ignorado. |
country
opcional
|
string
|
Código de país ISO 3166-1 alpha-2. Melhora a precisão para nomes cujo gênero varia por região, como Andrea (masculino na Itália, feminino na Alemanha). |
locale
opcional
|
string
|
Uma etiqueta de idioma como de-DE ou en_US, por exemplo o idioma do navegador. A região dela vira o país quando country não é enviado. Uma etiqueta sem região (en, de) não define país. |
ip
opcional
|
string
|
O endereço IP do usuário final. O país dele é usado quando não se envia country nem um locale com região. Não é armazenado. IP geolocation by DB-IP (db-ip.com). |
ai_fallback
opcional
|
boolean
|
Se o nome não tiver registro em nossos dados, peça uma estimativa a um modelo de linguagem em vez de retornar null. Só funciona depois que as consultas de IA forem ativadas nas suas configurações, e custa um crédito extra. |
best_guess
opcional
|
boolean
|
Retorne o gênero predominante mesmo quando as evidências não atingem o limite de confiança. Desativado por padrão: uma resposta perto de 50/50 que parece definitiva causa mais estrago do que um 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"
}
Requisição em lote
Envie até 100 nomes em uma requisição. Use isso em vez de fazer loop: uma chamada em lote para 100 nomes é uma única viagem de ida e volta e uma consulta única desduplicada.
| Parâmetro | Tipo | Descrição |
|---|---|---|
names
obrigatório
|
string[]
|
Array de nomes. Máximo de 100 itens. |
type
opcional
|
string
|
O que os itens são: name, email ou username. Padrão é name. |
country
opcional
|
string
|
Aplicado a cada item na requisição. |
locale
opcional
|
string
|
Etiqueta de idioma cuja região vira o país de cada item quando country não é enviado. |
ip
opcional
|
string
|
Endereço IP do usuário final cujo país vale para cada item quando não se envia country nem um locale com região. Não é armazenado. 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" }
]
}
Os resultados retornam na mesma ordem em que você os enviou. Créditos são cobrados por nome, e toda a requisição é rejeitada antes de qualquer trabalho se seu saldo for insuficiente, então você nunca recebe um lote parcialmente processado.
O bloco de resumo mostra a taxa de correspondência de forma clara, para que você possa decidir se a entrada precisa de limpeza antes de processar o resto.
Tarefas de arquivo
Envie um arquivo CSV ou XLSX de até 100 MB e 1.000.000 linhas e receba-o com colunas de gênero adicionadas a cada linha. Um crédito por linha, cobrado apenas se a tarefa for concluída.
-
1.
POST /batchesEnvie o arquivo e name_column. A tarefa entra na fila imediatamente. -
2.
GET /batches/{id}Consulte a tarefa até que status seja completed ou failed. poll_after_seconds indica quanto esperar entre as consultas. -
3.
GET /batches/{id}/resultBaixe o resultado. Ele volta no formato enviado.
| Parâmetro | Tipo | Descrição |
|---|---|---|
file
obrigatório
|
file
|
CSV, TSV ou XLSX com linha de cabeçalho. |
name_column
obrigatório
|
string
|
Cabeçalho da coluna com os nomes, exatamente como no arquivo. Obrigatório, exceto com start=false. |
country_column
opcional
|
string
|
Cabeçalho de uma coluna com um código de país por linha. |
country
opcional
|
string
|
País padrão para linhas sem país. |
ai_fallback
opcional
|
boolean
|
Consultar um modelo de IA para nomes que não estão no conjunto de dados. Requer o consentimento de IA em Configurações. |
best_guess
opcional
|
boolean
|
Retornar o gênero mais provável mesmo quando a evidência é fraca. |
delete_after_download
opcional
|
boolean
|
O resultado pode ser baixado uma vez e depois é excluído. |
start
opcional
|
boolean
|
false: apenas enviar e inspecionar. O padrão é 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 é obrigatório para iniciar: uma coluna adivinhada que se revele errada gastaria créditos com os dados errados. Envie start=false para ver primeiro as colunas, uma prévia e o custo, e depois inicie a tarefa.
Envie um cabeçalho Idempotency-Key. Uma nova tentativa com a mesma chave retorna a primeira tarefa em vez de abrir uma segunda.
Até 3 tarefas podem estar na fila ou em execução ao mesmo tempo. Uma tarefa não iniciada pode ser cancelada e seu crédito é devolvido; uma tarefa em processamento não pode ser interrompida.
Webhooks
Adicione um endpoint em Webhooks no seu painel e enviaremos a ele um POST assinado quando uma tarefa de arquivo terminar ou falhar, sem que você precise consultar.
| Evento | Tipo | Descrição |
|---|---|---|
batch.completed
|
BatchJob
|
A tarefa terminou. O corpo traz a tarefa exatamente como GET /batches/{id} a retorna. |
batch.failed
|
BatchJob
|
A tarefa falhou e não foi cobrada. Decida com base em error.code. |
credits.low
|
CreditsAlert
|
No ritmo atual, os créditos duram 7 dias ou menos. Verificado a cada hora; renovações de assinatura são consideradas. |
credits.depleted
|
CreditsAlert
|
O saldo acabou e as requisições são recusadas com 402. Verificado a cada hora. |
webhook.test
|
object
|
Enviado apenas por "Enviar evento de teste" no painel e apenas para esse endpoint. |
| Cabeçalho | Tipo | Descrição |
|---|---|---|
NameGender-Signature
obrigatório
|
string
|
t=<segundos unix>,v1=<hex>. Um segundo v1 aparece por 24 horas após renovar o segredo. |
NameGender-Event-Id
obrigatório
|
string
|
O id do evento. É o mesmo em cada nova tentativa do mesmo evento. |
NameGender-Delivery-Attempt
obrigatório
|
integer
|
1 na primeira tentativa, até 8. |
Verifique cada requisição
v1 é o HMAC-SHA256 do timestamp, um ponto e o corpo bruto, com o segredo do seu endpoint. Compare em tempo constante, aceite a requisição se algum v1 conferir e rejeite um timestamp a mais de cinco minutos do seu relógio. As bibliotecas cliente fazem tudo isso em uma chamada.
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" }
}
}
}
- Responda com qualquer 2xx em até 10 segundos e faça o trabalho depois.
- Qualquer outra resposta, incluindo redirecionamentos, é tentada novamente até 7 vezes ao longo de cerca de 45 horas. Se um endpoint continuar falhando por três dias, ele é desativado e você recebe um e-mail.
- Uma nova tentativa leva o mesmo id e a ordem não é garantida. Elimine duplicatas por NameGender-Event-Id e leia a tarefa com GET quando precisar do estado atual.
- Renovar o segredo no painel mantém o antigo assinando por 24 horas, para você atualizar seu servidor sem perder eventos.
- Novos tipos de evento podem ser adicionados. Responda 2xx a um tipo que você não trata e ignore-o.
Distribuição por país
Retorna os países onde um nome está registrado. Duas listas são retornadas e não são propositalmente mescladas: `registrations` é o volume medido, comparável apenas entre os onze países que publicam estatísticas de nomes contabilizadas, e `attested_in` é presença, sem peso atribuído.
| Parâmetro | Tipo | Descrição |
|---|---|---|
name
obrigatório
|
string
|
O nome para consultar. |
limit
opcional
|
integer
|
Quantos países contados listar em `registrations`. 1–100, padrão 25. As participações não são recalculadas para a lista mais curta. |
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"]
}
Um crédito por requisição. `share` é calculado sobre todos os países com contagem, então soma 100 apenas quando `limit` não corta a lista; `counted_countries` também conta antes do corte. `attested_in` não contém percentuais porque não há contagem por trás desses registros para calcular um.
Saudação
Transforma um nome em uma saudação pronta para carta ou e-mail, em dez idiomas: “Sehr geehrte Frau Dr. Müller,”, “Sayın Ahmet Bey,”, “Madame,”, “山田様”. A consulta de gênero está incluída e custa o mesmo crédito. Cada resposta traz uma linha formal, uma informal e uma neutra, além das partes da linha formal.
| Parâmetro | Tipo | Descrição |
|---|---|---|
name
obrigatório
|
string
|
Nome completo, com títulos (“Dr. Anna Müller”). Envie este ou `first_name` e `last_name`. |
first_name, last_name
opcional
|
string
|
Use estes no lugar de `name` quando seu CRM guarda os nomes em campos separados. Nada é analisado. |
email
opcional
|
string
|
Endereço de e-mail, usado quando nenhum nome é enviado. O nome é lido da parte antes do @, sem acentos (Mueller, não Müller); info@ e outros endereços de função recebem a saudação para organizações. |
language
opcional
|
string
|
Idioma da saudação: en, en-US, en-GB, de, de-AT, de-CH, fr, es, it, pt, pt-PT, pt-BR, nl, tr, pl, ja. Sem ele: o idioma de `locale`, depois o idioma principal do país, depois inglês. Um idioma não suportado é um erro, nunca uma troca silenciosa para inglês. |
country, locale, ip
opcional
|
string
|
Dica de país para a consulta de gênero, como nos endpoints de gênero. Só escolhe o idioma quando `language` não é enviado. |
gender
opcional
|
string
|
`male`, `female` ou `neutral`, quando você já sabe. Substitui a consulta; `neutral` sempre gera a forma neutra. |
min_probability
opcional
|
integer
|
Probabilidade mínima para uma saudação com gênero, 50–100. Padrão 90. |
title
opcional
|
string
|
Título acadêmico guardado em um campo separado, como `Dr.` Usado nas saudações em alemão e inglês. |
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"
}
Um gênero errado é pior do que nenhum, então a forma com gênero só é usada quando o gênero é conhecido com pelo menos `min_probability` e o idioma tem a parte do nome de que precisa. Caso contrário, `form` é `neutral` e `reason` diz o motivo. Empresas e endereços de função recebem `form: organization`. `best_guess` e `ai_fallback` não se aplicam aqui.
POST /api/v1/salutation/bulk aceita até 100 nomes em `names`, um crédito cada, com as mesmas opções aplicadas a todos os nomes.
Verificação de nome
Diz se um nome digitado em um formulário de cadastro ou de captação parece o nome de uma pessoa real, e por quê. Detecta digitação aleatória no teclado (“asdf qwerty”), valores de preenchimento (“Test Test”, “John Doe”, “n/a”), personagens fictícios (“Mickey Mouse”), palavrões e dígitos, símbolos ou endereços de e-mail no campo do nome. Um crédito por nome.
| Parâmetro | Tipo | Descrição |
|---|---|---|
name
obrigatório
|
string
|
O nome como foi digitado no formulário. Envie este ou `first_name` e `last_name`. |
first_name, last_name
opcional
|
string
|
Use estes no lugar de `name` quando seu formulário tem campos separados. |
country, locale, ip
opcional
|
string
|
Dica de país, como nos endpoints de gênero. Ajuda a separar o nome e a buscá-lo nos registros. |
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` é `implausible` quando há um sinal de gravidade alta (padrão de teclado, letras repetidas, valor de preenchimento, palavrão, e-mail ou URL), `suspicious` com um sinal médio (personagem fictício, dígitos, símbolos, nome de empresa, sem vogais, muito longo) ou dois baixos, e `plausible` nos demais casos. `score` vai de 0 a 100 para o seu próprio limite. Um primeiro nome encontrado em registros oficiais de nascimento o aumenta; um nome que nunca vimos não o reduz por si só. Os sobrenomes são avaliados apenas pela forma: não há um conjunto de dados de sobrenomes por trás deste endpoint.
Testado com 4.610 primeiros nomes reais em nove escritas, sozinhos e junto com um sobrenome: nenhum foi marcado como suspeito ou improvável. Sobrenomes como Null, Test ou Cockburn, nomes de duas letras como Ng e nomes únicos são deixados de lado de propósito.
POST /api/v1/name-check/bulk aceita até 100 nomes em `names`, um crédito cada, com um resumo das três avaliações.
Idade pelo nome
Quantos anos têm as pessoas vivas com um primeiro nome: a idade mediana, a metade central (`age_range`) e os 80% centrais (`age_range_80`). Brittany nos Estados Unidos: mediana 36, metade entre 32 e 38. Um crédito por nome.
| Parâmetro | Tipo | Descrição |
|---|---|---|
name
obrigatório
|
string
|
Um primeiro nome ou um nome completo; usa-se o primeiro nome. |
gender
opcional
|
string
|
`male` ou `female` para usar apenas os registros desse sexo. Os homens chamados Leslie são 16 anos mais velhos que as mulheres chamadas Leslie. |
country, locale, ip
opcional
|
string
|
Dica de país, como nos endpoints de gênero. Cobertos: US, FR e NO. Sem dica, usa-se a série dos Estados Unidos e `country_source` é `default`. Outro país retorna `reason: country_not_covered` e não custa nada. |
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
}
Método: nascimentos registrados por nome, sexo e ano, com cada ano ponderado pela parcela dessa coorte de nascimento que ainda está viva (tábuas de mortalidade por coorte da SSA). Fontes: nascimentos SSA 1880–2024 (US), INSEE 1900–2025 (França), SSB 1945–2025 (Noruega). `reason` é `not_found` para um nome fora da série e `insufficient_data` abaixo de 100 pessoas vivas.
Nascimentos no exterior não estão em nenhuma série, então nomes comuns entre imigrantes parecem mais jovens do que são. A série da Noruega começa em 1945, então faltam as pessoas nascidas antes. A tábua de mortalidade dos Estados Unidos também é usada para a França e a Noruega.
POST /api/v1/age/bulk aceita até 100 nomes em `names`, um crédito cada, na ordem de envio.
Saldo
Consulte seu saldo de créditos e o que resta da cota gratuita de hoje. Esta chamada não é cobrada.
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
}
Scripts não-latinos
Envie um nome em seu próprio script e nós o vinculamos aos dados de referência. Sem parâmetro adicional: detectamos o script e escolhemos a estratégia certa para ele.
A escrita árabe omite vogais breves, então محمد transliterá para "mhmd" enquanto nossos dados contêm "muhammed". Fazemos correspondência no padrão consonantal e mantemos o marcador feminino ة, portanto خالد (Khalid) e خالدة (Khalida) permanecem separados. Também cobre nomes persas e urdu escritos em script árabe.
Convertido para Pinyin. O sobrenome vem em primeiro lugar em chinês, então 李明 tem sobrenome 李 (Li) e nome pessoal 明 (Ming) — removemos o sobrenome antes de fazer a busca. Um único caractere é um nome pessoal completo e é tratado como um.
Mesmo tratamento de sobrenome em primeiro lugar que o chinês, usando os sobrenomes coreanos comuns.
Hiragana e katakana são lidos corretamente (ひろし → Hiroshi).
Nomes russos, ucranianos, búlgaros e sérvios transliteram diretamente.
Nomes hindi, marati e nepalês. A vogal final inerente é tratada (राहुल → Rahul, não "Rahula").
Caracteres kanji japoneses e caracteres chineses ocupam o mesmo intervalo Unicode, então não conseguimos distingui-los apenas pelos caracteres. A entrada Han é lida como chinês: um nome kanji que não temos registrado verbatim recebe a leitura em mandarim, que para um nome japonês geralmente está errada (健太 é lido como "jian tai" quando o nome é Kenta). Nomes que temos registrados correspondem exatamente e estão corretos. Envie nomes japoneses em kana ou escrita latina para ter certeza.
Tailandês omite vogais como árabe e precisa de sua própria camada de correspondência. Ainda não foi implementado, então estes retornam 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" }
Falha ao copiar. Selecione e copie o texto.
Quando não conseguimos converter um script, a resposta é gender: null com source: none. Verifique o campo source: script significa que transliteramos, db significa que combinamos diretamente os caracteres que você enviou. Os dois têm confidence diferente, e mostramos qual você obteve.
Campos de resposta
Idênticos em todos os endpoints.
| Campo | Tipo | Descrição |
|---|---|---|
credits_charged
|
integer
|
Quantos créditos foram descontados por esta chamada. |
credits_remaining
|
integer
|
Seu saldo disponível depois que esta chamada é paga: créditos comprados mais o que resta da cota gratuita de hoje. |
query
|
string
|
A entrada exatamente como você a enviou, antes de qualquer limpeza. |
name
|
string
|
O nome que realmente consultamos após remover títulos e sobrenomes. |
first_name
|
string
|
Nome próprio extraído da entrada. Devolvido mesmo quando gender é null, sem custo adicional. |
middle_name
|
string
|
Outros nomes entre o nome próprio e o sobrenome. As iniciais são descartadas. |
last_name
|
string
|
Sobrenome, incluindo partículas como van ou de la. Sempre null para nomes de usuário. |
name_type
|
string
|
personal, organization (Acme Ltda.) ou role (info@, atendimento). Organizações e funções não recebem gênero. |
gender
|
string
|
masculino, feminino ou null quando não temos confiança suficiente. |
country
|
string
|
O país de origem das estatísticas, ou null para agregado global. |
country_source
|
string
|
De onde veio o país: country, locale, ip ou null quando a resposta é mundial. |
sample_size
|
integer
|
Número de pessoas registradas por trás desta resposta. 0 significa que a fonte publica proporções ou atestações, não uma contagem que possamos auditar. |
probability
|
integer
|
Confiança no gênero informado, 50 a 100. 0 quando gênero é null. |
took_ms
|
integer
|
Tempo que levamos para resolver a consulta, em milissegundos inteiros. O tempo de rede do seu lado não está incluído. |
Dois campos que outros serviços não fornecem
source indica a origem da resposta: banco de dados de referência, correspondência aproximada ou fallback de IA. matched_as nomeia a entrada encontrada na correspondência aproximada. Juntos permitem que você decida quanto confiar num resultado único em vez de aceitá-lo sem questionar.
| Campo | Tipo | Descrição |
|---|---|---|
source
|
string
|
db, script, fuzzy, llm ou none. |
confidence
|
string
|
alta, média, baixa, não verificada ou desconhecida, com base em evidências da amostra. |
matched_as
|
string
|
Para correspondência aproximada, a entrada do banco de dados que correspondeu. Caso contrário, null. |
Códigos de erro
O código de status HTTP indica que uma chamada falhou. O corpo JSON então nomeia o motivo em error, explica em message e fornece um request_id para informar ao suporte, além de um link para a linha correspondente abaixo. Tome decisões com base em error, nunca em message: mensagens são traduzidas e podem ser reescritas.
| Código | HTTP | Significado |
|---|---|---|
missing_key |
401 | Nenhuma chave API foi enviada. Adicione um header Authorization: Bearer ou um header X-Api-Key à requisição. |
invalid_key |
401 | Esta chave API não é válida. |
revoked_key |
401 | Esta chave API foi revogada. |
blocked |
403 | Esta conta foi suspensa. Entre em contato com o suporte. |
email_not_verified |
403 | O endereço de e-mail desta conta ainda não foi confirmado. Abra o link de confirmação que enviamos ou solicite um novo no seu painel. |
ip_not_allowed |
403 | Solicitações deste endereço IP não são permitidas para esta chave. |
proxy_secret_required |
403 | Esta chave funciona apenas através de seu marketplace de API, que assina cada solicitação. Use a chave emitida para você lá. |
forbidden |
403 | Você não tem permissão para realizar esta ação. |
no_credits |
402 | Você não tem mais créditos. Compre mais ou aguarde a reinicialização da sua cota diária gratuita. |
missing_input |
400 | O parâmetro "name" é obrigatório. |
invalid_input |
422 | O parâmetro "name" não é válido. |
too_many_items |
422 | Um máximo de 100 itens pode ser enviado em uma solicitação. |
ai_consent_required |
422 | ai_fallback envia o nome para um provedor de IA terceirizado, ao qual esta conta não consentiu. Veja o campo "ai" para identificar o provedor e, em seguida, ative consultas de IA nas configurações do seu painel. |
unknown_endpoint |
404 | Não existe um endpoint neste caminho. Verifique a URL na documentação da API. |
method_not_allowed |
405 | Este endpoint não aceita requisições DELETE. |
payload_too_large |
413 | O corpo da requisição é muito grande. |
rate_limited |
429 | Muitas solicitações. Reduza a velocidade e tente novamente em breve. |
batch_not_found |
404 | Não existe nenhuma tarefa de arquivo com este ID nesta conta. |
batch_not_startable |
409 | Esta tarefa já foi iniciada ou encerrada. |
batch_not_finished |
409 | Esta tarefa ainda não terminou. Verifique o status e baixe o resultado quando estiver concluída. |
batch_in_progress |
409 | Esta tarefa está sendo processada e não pode ser cancelada agora. Exclua-a quando terminar. |
result_gone |
410 | Esta tarefa não tem resultado para baixar. Ela falhou, foi cancelada, expirou ou seu resultado de download único já foi baixado. |
too_many_batches |
429 | Você já tem 100 tarefas de arquivo em andamento. Aguarde uma terminar antes de iniciar outra. |
not_ready |
503 | A base de dados de nomes está sendo reconstruída. Tente novamente em um momento. |
server_error |
500 | Algo deu errado do nosso lado. Fomos notificados. |
{
"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"
}
Falha ao copiar. Selecione e copie o texto.
Limites de taxa
O uso normal não atinge um limite. O limite existe para impedir que uma chave vazada seja abusada, e conta por chave de API em vez de por IP, para que vários clientes num mesmo servidor não consumam a cota um do outro.
Limite atual: 1.200 requisições por minuto por chave. Precisa de mais? Peça e aumentaremos na sua conta.
Toda resposta inclui os headers padrão X-RateLimit-Limit e X-RateLimit-Remaining.
Espaços e letras não latinas em requisições GET
Um nome como Ayşe Yılmaz ou 中村 não pode trafegar em uma URL do jeito que foi digitado. Aplique percent-encoding ao valor quando chamar com GET, ou envie-o em um corpo JSON com POST e dispense a codificação.
Ayşe Yılmaz -> Ay%C5%9Fe%20Y%C4%B1lmaz
محمد -> %D9%85%D8%AD%D9%85%D8%AF
中村 -> %E4%B8%AD%E6%9D%91
Falha ao copiar. Selecione e copie o texto.