Continuar → Descripción general

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.

Encabezado Authorization (recomendado)
Authorization: Bearer ng_live_xxxxxxxxxxxx
Encabezado personalizado
X-Api-Key: ng_live_xxxxxxxxxxxx
Parámetro de consulta
https://namegender.com/api?name=Ayşe&key=ng_live_xxxxxxxxxxxx
Nunca expongas tu clave en código del lado del cliente. Las llamadas desde un navegador o aplicación móvil deben pasar a través de tu propio backend.

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

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

Compatible
Escritura árabe

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.

Caracteres chinos

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.

Coreano

Mismo tratamiento de apellido primero que en chino, usando los apellidos coreanos comunes.

Kana japonés

Hiragana y katakana se leen correctamente (ひろし → Hiroshi).

Cirílico

Nombres rusos, ucranianos, búlgaros y serbios se transliteran directamente.

Devanagari

Nombres en hindi, marathi y nepalí. Se maneja la vocal final inherente (राहुल → Rahul, no "Rahula").

No compatible
Kanji japonés

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.

Tailandés

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