Referencia de REST API
Cuatro endpoints, una estructura de respuesta. Todo lo siguiente está activo en tu cuenta.
https://namegender.com/api
Registrarse gratis
Inicio rápido
Crea una clave en tu panel de control y envía tu primera solicitud. No necesitas SDK.
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 devuelve la misma estructura, así que puedes cambiar entradas sin modificar tu código de análisis.
Autenticación
Pasa tu clave de API de tres formas diferentes. Se recomienda el encabezado Authorization: las cadenas de consulta terminan en registros de servidor e historial del navegador.
Authorization: Bearer ng_live_xxxxxxxxxxxx
X-Api-Key: ng_live_xxxxxxxxxxxx
https://namegender.com/api?name=Ayşe&key=ng_live_xxxxxxxxxxxx
Puedes restringir una clave a direcciones IP específicas desde el panel de control.
Bibliotecas cliente
Una API, cuatro tipos de entrada y herramientas de carga masiva que manejan archivos donde otros servicios fallan.
Ver todohttps://namegender.com/api
Género a partir del nombre
Acepta un nombre de pila o un nombre completo. Los títulos, nombres intermedios y apellidos se eliminan antes de la búsqueda, así que "Dr. Ayşe Yılmaz" y "Ayşe" dan la misma respuesta.
| Parámetro | Tipo | Descripción |
|---|---|---|
name
requerido
|
string
|
El nombre a clasificar. Nombre de pila o nombre completo. |
country
opcional
|
string
|
Código de país ISO 3166-1 alfa-2. Mejora la precisión para nombres cuyo género varía según la región, como Andrea (masculino en Italia, femenino en Alemania). |
askToAI
opcional
|
boolean
|
Recurre a un modelo de lenguaje cuando el nombre no está en la base de datos. Cuesta un crédito adicional. |
forceToGenderize
opcional
|
boolean
|
Devuelve el género más probable incluso cuando la confianza está por debajo del umbral. Desactivado por defecto, porque una respuesta tipo moneda presentada como segura es peor que ninguna respuesta. |
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 del correo electrónico
Extrae la persona de la parte local de la dirección y luego la clasifica. "ayse.yilmaz84@example.com" se resuelve a Ayşe.
| Parámetro | Tipo | Descripción |
|---|---|---|
email
requerido
|
string
|
La dirección de correo electrónico. Solo se usa la parte anterior a @. |
country
opcional
|
string
|
Código de país ISO 3166-1 alfa-2. Mejora la precisión para nombres cuyo género varía según la región, como Andrea (masculino en Italia, femenino en Alemania). |
askToAI
opcional
|
boolean
|
Recurre a un modelo de lenguaje cuando el nombre no está en la base de datos. Cuesta un crédito adicional. |
forceToGenderize no está disponible aquí: el nombre se extrae internamente, así que forzar un resultado en una extracción incierta compone dos conjeturas.
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 del nombre de usuario
Maneja camelCase, snake_case, dígitos finales y signos @ iniciales. "AyseYilmaz84" se resuelve a Ayşe.
| Parámetro | Tipo | Descripción |
|---|---|---|
username
requerido
|
string
|
El nombre de usuario o identificador. Un @ inicial se ignora. |
country
opcional
|
string
|
Código de país ISO 3166-1 alfa-2. Mejora la precisión para nombres cuyo género varía según la región, como Andrea (masculino en Italia, femenino en Alemania). |
askToAI
opcional
|
boolean
|
Recurre a un modelo de lenguaje cuando el nombre no está en la base de datos. Cuesta un crédito adicional. |
forceToGenderize
opcional
|
boolean
|
Devuelve el género más probable incluso cuando la confianza está por debajo del umbral. Desactivado por defecto, porque una respuesta tipo moneda presentada como segura es peor que ninguna respuesta. |
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
Solicitud en lote
Envía hasta 100 nombres en una solicitud. Usa esto en lugar de hacer un bucle: una llamada en lote para 100 nombres es un único viaje de ida y vuelta y una búsqueda deduplicada única.
| Parámetro | Tipo | Descripción |
|---|---|---|
names
requerido
|
string[]
|
Array de nombres. Máximo 100 elementos. |
type
opcional
|
string
|
Qué son los elementos: nombre, correo electrónico o nombre de usuario. Por defecto, nombre. |
country
opcional
|
string
|
Se aplica a cada elemento de la solicitud. |
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" }
]
}
Los resultados vuelven en el mismo orden en que los enviaste. Los créditos se cobran por nombre, y toda la solicitud se rechaza antes de cualquier trabajo si tu saldo es insuficiente, así que nunca obtendrás un lote procesado parcialmente.
El bloque de resumen te muestra la tasa de coincidencia de un vistazo, para que puedas decidir si la entrada necesita limpieza antes de procesar el resto.
https://namegender.com/api/me
Cuenta y cuota
Comprueba tu saldo restante sin gastar un 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
}
Escrituras no latinas
Envía un nombre en su escritura original y lo vinculamos con los datos de referencia. Sin parámetros adicionales: detectamos la escritura y elegimos la estrategia correcta.
La escritura árabe omite las vocales cortas, así que محمد se translittera a "mhmd" mientras nuestros datos contienen "muhammed". Hacemos coincidencia por el patrón de consonantes, y preservamos el marcador femenino ة para que خالد (Khalid) y خالدة (Khalida) se mantengan separados. También cubre nombres persas y urdu escritos en árabe.
Se convierten a pinyin. El apellido viene primero en chino, así que 李明 tiene apellido 李 (Li) y nombre 明 (Ming) — removemos el apellido antes de buscar. Un carácter único es un nombre completo y se trata como tal.
Mismo tratamiento de apellido primero que en chino, usando los apellidos coreanos comunes.
Hiragana y katakana se leen correctamente (ひろし → Hiroshi).
Nombres rusos, ucranianos, búlgaros y serbios se transliteran directamente.
Nombres en hindi, marathi y nepalí. Se maneja la vocal final inherente (राहुल → Rahul, no "Rahula").
Los caracteres kanji japoneses y los caracteres chinos ocupan el mismo rango Unicode, por lo que no podemos distinguirlos solo por los caracteres. La entrada Han se lee como chino: un nombre kanji que no tenemos almacenado literalmente obtiene su lectura mandarina, que para un nombre japonés generalmente es incorrecta (健太 se lee como "jian tai" cuando el nombre es Kenta). Los nombres que sí tenemos coinciden exactamente y son correctos. Envía nombres japoneses en kana o caracteres latinos para estar seguro.
El tailandés omite vocales como el árabe y necesita su propia capa de coincidencia. Aún no está implementado, así que estos devuelven 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" }
Cuando no podemos convertir un sistema de escritura, la respuesta es gender: null con source: none. Verifica el campo source: script significa que transliteramos, db significa que coincidimos directamente con los caracteres que enviaste. Los dos tienen diferentes niveles de confianza, y te mostramos cuál obtuviste.
Campos de respuesta
Idénticos en todos los endpoints.
| Campo | Tipo | Descripción |
|---|---|---|
status
|
boolean
|
false si la solicitud falló. Revisa esto primero. |
used_credits
|
integer
|
Créditos consumidos en esta solicitud. |
remaining_credits
|
integer
|
Créditos restantes después de esta solicitud. |
expires
|
null
|
Siempre null. Los créditos comprados no expiran. |
q
|
string
|
Tu entrada, devuelta sin cambios. |
name
|
string
|
El nombre que realmente buscamos después de eliminar títulos y apellidos. |
gender
|
string
|
masculino, femenino, o null cuando no tenemos suficiente confianza. |
country
|
string
|
El país del que provienen las estadísticas, o null para el agregado global. |
total_names
|
integer
|
Cuántas personas reales respaldan esta respuesta. 0 significa que la fuente proporciona proporciones en lugar de recuentos, no que la respuesta sea débil. |
probability
|
integer
|
Confianza en el género indicado, 50 a 100. 0 cuando el género es null. |
duration
|
string
|
Tiempo de procesamiento en el servidor. |
Dos campos que otros servicios no ofrecen
source te dice de dónde vino la respuesta: la base de datos de referencia, una coincidencia aproximada o el fallback de IA. matched_as nombra la entrada en la que aterrizó la coincidencia aproximada. Juntos te permiten decidir cuánto confiar en un resultado individual en lugar de aceptarlo sin cuestionarlo.
| Campo | Tipo | Descripción |
|---|---|---|
source
|
string
|
db, fuzzy, llm, o none. |
confidence
|
string
|
alta, media, baja, sin verificar o desconocida, según la evidencia de la muestra. |
matched_as
|
string
|
Para una coincidencia aproximada, la entrada de la base de datos que coincidió. En caso contrario null. |
Códigos de error
Los errores devuelven un cuerpo JSON con status: false y una cadena de error legible por máquina. Coincide con el error, no con el mensaje: los mensajes se traducen y pueden cambiar.
| Código | HTTP | Significado |
|---|---|---|
missing_key |
401 | Falta la clave API. Pásala como parámetro "key" o como un header Authorization: Bearer. |
invalid_key |
401 | Esta clave API no es válida. |
revoked_key |
401 | Esta clave API ha sido revocada. |
blocked |
403 | Esta cuenta ha sido suspendida. Contacta con soporte. |
email_not_verified |
403 | La dirección de correo de esta cuenta aún no se ha confirmado. Abre el enlace de confirmación que te enviamos o solicita uno nuevo desde tu panel. |
ip_not_allowed |
403 | Las solicitudes desde esta dirección IP no están permitidas para esta clave. |
forbidden |
403 | No tienes permiso para realizar esta acción. |
no_credits |
402 | No tienes créditos disponibles. Compra más o espera a que se reinicie tu cuota gratuita diaria. |
missing_input |
400 | El parámetro "name" es obligatorio. |
invalid_input |
422 | El parámetro "name" no es válido. |
too_many_items |
422 | Se puede enviar un máximo de 100 elementos en una solicitud. |
ai_consent_required |
422 | askToAI envía el nombre a un proveedor de IA de terceros, al cual esta cuenta no ha dado su consentimiento. Consulta el campo "ai" para ver quién es ese proveedor y luego habilita las búsquedas de IA en la configuración de tu dashboard. |
unknown_endpoint |
404 | No hay endpoint en esta ruta. Verifica la URL en la documentación de la API. |
method_not_allowed |
405 | Este endpoint no acepta solicitudes DELETE. |
payload_too_large |
413 | El cuerpo de la solicitud es demasiado grande. |
rate_limited |
429 | Demasiadas solicitudes. Ralentiza el ritmo e intenta de nuevo en poco tiempo. |
not_ready |
503 | La base de datos de nombres se está reconstruyendo. Intenta de nuevo en un momento. |
server_error |
500 | Algo salió mal en nuestro lado. Ya hemos sido 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"
}
Límites de velocidad
El uso normal no alcanza un límite. El tope existe para evitar que una clave filtrada sea abusada, y se cuenta por clave API en lugar de por IP para que varios clientes en un servidor no consuman la asignación de otros.
Límite actual: 1.200 solicitudes por minuto por clave. ¿Necesitas más? Pregunta y lo aumentaremos en tu cuenta.
Cada respuesta lleva los headers estándar X-RateLimit-Limit y X-RateLimit-Remaining.
Migrar desde otro proveedor
Nuestros campos de respuesta y nombres de parámetros siguen la convención común, por lo que cambiar normalmente significa modificar una línea: la URL base.
- https://api.other-provider.io/api?name=Ayşe&key=KEY
+ https://namegender.com/api?name=Ayşe&key=KEY
askToAI y forceToGenderize mantienen su ortografía original por esta exacta razón. Si falta un campo del que dependes, cuéntanos y lo añadiremos.
Codifica tu entrada
Los nombres contienen espacios y caracteres no ASCII. Codifica la URL del valor antes de incluirlo en una cadena de consulta, o utiliza POST con un cuerpo 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