Continuar → Visão geral

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
llms-full.txt

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.

Header Authorization (recomendado)
Authorization: Bearer ng_live_xxxxxxxxxxxx

Falha ao copiar. Selecione e copie o texto.

Header X-Api-Key
X-Api-Key: ng_live_xxxxxxxxxxxx

Falha ao copiar. Selecione e copie o texto.

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

Wrappers finos sobre a API REST. Enviam sua chave, montam cada requisição e transformam respostas de erro em exceções.

JavaScript Código-fonte
npm install namegender

Falha ao copiar. Selecione e copie o texto.

Command line Código-fonte
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.

C# / .NET Código-fonte
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.

PowerShell Código-fonte
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 tudo

Assistentes 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 Code
claude mcp add namegender -e NAMEGENDER_API_KEY=ng_live_... -- npx -y namegender-mcp

Falha ao copiar. Selecione e copie o texto.

Claude Desktop, Cursor e outros clientes
{
    "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

GET · POST https://namegender.com/api/v1/gender
Markdown

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
}
GET · POST https://namegender.com/api/v1/gender/email
Markdown

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"
}
GET · POST https://namegender.com/api/v1/gender/username
Markdown

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"
}
POST https://namegender.com/api/v1/gender/bulk
Markdown

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.

POST GET DELETE https://namegender.com/api/v1/batches
Markdown

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. 1. POST /batches Envie o arquivo e name_column. A tarefa entra na fila imediatamente.
  2. 2. GET /batches/{id} Consulte a tarefa até que status seja completed ou failed. poll_after_seconds indica quanto esperar entre as consultas.
  3. 3. GET /batches/{id}/result Baixe 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.

POST https://your-server.example/…
Markdown

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.

Verifique o corpo exatamente como chegou. Um framework que interpreta o JSON e o serializa de novo altera os bytes, e a assinatura não confere.
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.
GET POST https://namegender.com/api/v1/gender/countries
Markdown

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.

Isto não é uma inferência de país de origem ou etnia e não deve ser usado como tal. Estatísticas contadas existem apenas para onze países: EUA, Reino Unido, França, Canadá, Espanha, Irlanda, Noruega, Áustria, Israel, Polônia e Suíça. Uma busca por "Mehmet" portanto classifica a Suíça e a França em primeiro, com cerca de 29% cada, e a Turquia não aparece na classificação — a Turquia não publica contagens. A Turquia aparece em `attested_in`.
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.

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

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.

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

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.

Isto não é verificação de identidade e nunca chama um nome de falso. Use `implausible` e `suspicious` para sinalizar um registro ou pedir mais informações, não para rejeitar pessoas automaticamente.
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.

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

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.

Isto descreve um grupo, não uma pessoa. Para a maioria dos nomes, a metade central abrange de 10 a 25 anos. Use para análise de público, segmentos e pesquisa, nunca para decidir algo sobre uma pessoa: crédito, contratação, moradia, seguros, elegibilidade ou verificação de idade.
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.

GET https://namegender.com/api/v1/me
Markdown

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.

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