Referência da REST API
Quatro endpoints, um formato de resposta. Tudo abaixo é executado em tempo real em sua conta.
https://namegender.com/api
Criar conta grátis
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?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?' . $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?${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",
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")
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?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
Passe sua chave de API de três formas diferentes. O header Authorization é recomendado: strings de consulta terminam em logs do servidor e histórico do navegador.
Authorization: Bearer ng_live_xxxxxxxxxxxx
X-Api-Key: ng_live_xxxxxxxxxxxx
https://namegender.com/api?name=Ayşe&key=ng_live_xxxxxxxxxxxx
Você pode restringir uma chave a endereços IP específicos no dashboard.
Bibliotecas cliente
Uma API, quatro tipos de entrada e ferramentas em massa que lidam com ficheiros onde outros serviços falham.
Ver tudohttps://namegender.com/api
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). |
askToAI
opcional
|
boolean
|
Recorra a um modelo de linguagem quando o nome não estiver no banco de dados. Custa um crédito extra. |
forceToGenderize
opcional
|
boolean
|
Retorne o gênero mais provável mesmo quando a confiança está abaixo do limite. Desativado por padrão, porque uma resposta de cara-ou-coroa apresentada como certa é pior que nenhuma resposta. |
curl "https://namegender.com/api?name=Jordan" \
-H "Authorization: Bearer YOUR_API_KEY"
{
"status": true,
"used_credits": 1,
"remaining_credits": 49999,
"expires": null,
"q": "Jordan",
"name": "Jordan",
"gender": "male",
"country": null,
"total_names": 62240,
"probability": 84,
"confidence": "high",
"duration": "1ms",
"source": "db",
"matched_as": null
}
https://namegender.com/api/email
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). |
askToAI
opcional
|
boolean
|
Recorra a um modelo de linguagem quando o nome não estiver no banco de dados. Custa um crédito extra. |
forceToGenderize não está disponível aqui: o nome é extraído internamente, então forçar um resultado em uma extração incerta combina duas suposições.
curl "https://namegender.com/api/email?email=ayse.yilmaz84%40example.com" \
-H "Authorization: Bearer YOUR_API_KEY"
{
"status": true,
"q": "ayse.yilmaz84@example.com",
"name": "Ayse",
"gender": "female",
"probability": 95,
"confidence": "unverified",
"total_names": 655,
"duration": "1ms",
"source": "db"
}
https://namegender.com/api/username
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). |
askToAI
opcional
|
boolean
|
Recorra a um modelo de linguagem quando o nome não estiver no banco de dados. Custa um crédito extra. |
forceToGenderize
opcional
|
boolean
|
Retorne o gênero mais provável mesmo quando a confiança está abaixo do limite. Desativado por padrão, porque uma resposta de cara-ou-coroa apresentada como certa é pior que nenhuma resposta. |
curl "https://namegender.com/api/username?username=AyseYilmaz84" \
-H "Authorization: Bearer YOUR_API_KEY"
{
"status": true,
"q": "AyseYilmaz84",
"name": "Ayse",
"gender": "female",
"probability": 95,
"confidence": "unverified",
"source": "db"
}
https://namegender.com/api/bulk
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. |
curl -X POST "https://namegender.com/api/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/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['q'], $row['gender'] ?? '?', $row['probability']);
}
const response = await fetch('https://namegender.com/api/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.q, r.gender, r.probability));
import requests
response = requests.post(
"https://namegender.com/api/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["q"], row["gender"], row["probability"])
{
"status": true,
"used_credits": 4,
"remaining_credits": 49995,
"duration": "2ms",
"summary": {
"total": 4,
"identified": 4,
"unknown": 0,
"match_rate": 100
},
"results": [
{ "q": "Ayşe", "gender": "female", "probability": 95, "total_names": 0, "confidence": "unverified", "source": "db" },
{ "q": "Mehmet", "gender": "male", "probability": 95, "total_names": 0, "confidence": "unverified", "source": "db" },
{ "q": "Priya", "gender": "female", "probability": 95, "total_names": 0, "confidence": "unverified", "source": "db" },
{ "q": "Wei", "gender": "male", "probability": 85, "total_names": 0, "confidence": "unverified", "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.
https://namegender.com/api/me
Conta e cota
Verifique seu saldo restante sem gastar um crédito.
curl "https://namegender.com/api/me" \
-H "Authorization: Bearer YOUR_API_KEY"
{
"status": true,
"email": "you@example.com",
"remaining_credits": 50099,
"purchased_credits": 50000,
"free_today": 99,
"free_daily_limit": 100,
"lifetime_requests": 12480,
"expires": null
}
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?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?name=%E6%9D%8E%E6%98%8E" -H "Authorization: Bearer KEY"
# -> { "gender": "male", "probability": 92, "source": "db" }
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 |
|---|---|---|
status
|
boolean
|
false quando a requisição falhou. Verifique isso primeiro. |
used_credits
|
integer
|
Créditos consumidos por esta requisição. |
remaining_credits
|
integer
|
Créditos restantes após esta requisição. |
expires
|
null
|
Sempre null. Créditos comprados não expiram. |
q
|
string
|
Sua entrada, ecoada de volta sem alterações. |
name
|
string
|
O nome que realmente consultamos após remover títulos e sobrenomes. |
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. |
total_names
|
integer
|
Quantas pessoas reais esta resposta se baseia. 0 significa que a fonte fornece proporções em vez de contagens, não que a resposta seja fraca. |
probability
|
integer
|
Confiança no gênero informado, 50 a 100. 0 quando gênero é null. |
duration
|
string
|
Tempo de processamento do servidor. |
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, 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
Erros retornam um corpo JSON com status: false e uma string de erro legível por máquina. Corresponda ao erro, não à mensagem: mensagens são traduzidas e podem mudar.
| Código | HTTP | Significado |
|---|---|---|
missing_key |
401 | Chave API ausente. Passe-a como parâmetro "key" ou como header Authorization: Bearer. |
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. |
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 | askToAI 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. |
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. |
{
"status": false,
"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"
}
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.
Migrando de outro provedor
Nossos campos de resposta e nomes de parâmetros seguem a convenção comum, então mudar normalmente significa alterar uma linha: a URL base.
- https://api.other-provider.io/api?name=Ayşe&key=KEY
+ https://namegender.com/api?name=Ayşe&key=KEY
askToAI e forceToGenderize mantêm sua ortografia original exatamente por isso. Se um campo que você usa está faltando, nos avise e o adicionaremos.
Codifique sua entrada
Nomes contêm espaços e caracteres não-ASCII. URL-encode o valor antes de colocá-lo em uma string de consulta, ou use POST com um corpo 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