Continuar → Visão geral

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.

Header Authorization (recomendado)
Authorization: Bearer ng_live_xxxxxxxxxxxx
Header customizado
X-Api-Key: ng_live_xxxxxxxxxxxx
Parâmetro de query
https://namegender.com/api?name=Ayşe&key=ng_live_xxxxxxxxxxxx
Nunca exponha sua chave no código do lado do cliente. Chamadas de um navegador ou app mobile devem passar por seu próprio backend.

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 tudo
GET · POST https://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
}
GET · POST 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"
}
GET · POST 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"
}
POST 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.

GET 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.

Compatível
Script árabe

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.

Caracteres chineses

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.

Coreano

Mesmo tratamento de sobrenome em primeiro lugar que o chinês, usando os sobrenomes coreanos comuns.

Kana japonês

Hiragana e katakana são lidos corretamente (ひろし → Hiroshi).

Cirílico

Nomes russos, ucranianos, búlgaros e sérvios transliteram diretamente.

Devanagari

Nomes hindi, marati e nepalês. A vogal final inerente é tratada (राहुल → Rahul, não "Rahula").

Não compatível
Kanji japonês

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

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.
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