Guía de análisis de nombres de usuario

Leer en Markdown

Estimar el género a partir de nombres de usuario y apodos

Analiza nombres de usuario y apodos con V2: forceToGenderize, IA por elemento, resultados desconocidos y el coste de los reintentos.

Flujo de archivos sin código

Analiza alias en tu conjunto de datos

Sube un archivo Excel o CSV, selecciona la columna de nombres de usuario y activa el análisis de apodos antes de procesar los registros.

  • Archivos Excel y CSV
  • Columnas de usuario o nombre visible
  • Resultados enriquecidos exportables
Abrir la herramienta Excel/CSV
Opción de análisis de nombres de usuario y apodos en el flujo de archivos de GenderAPI
Análisis de apodos en el flujo de archivos de GenderAPI.

Entradas de ejemplo

Un alias no es una verificación de identidad

@alice_smith puede coincidir con un componente nominal. Con prenses y forceToGenderize puede devolverse una estimación mientras el nombre queda en null. user47291 puede quedar como desconocido. Son ejemplos de entrada; a ninguno se le ha asignado de antemano un resultado de género.

Lógica de análisis

¿Cómo funciona la predicción de género por nombre de usuario?

El sistema examina componentes nominales legibles y otras señales lingüísticas dentro del usuario o nombre visible. La IA estándar busca un nombre real utilizable; con forceToGenderize puede interpretar el alias sin un nombre real. El resultado se devuelve con sus campos de apoyo; una entrada aleatoria o insuficiente no debe forzarse a producir un resultado.

01Nombre de usuarioApodo o nombre visible
02Análisis de señalesNombre y contexto
03Resultado probabilísticoGénero y confianza

Canales de uso

Elige el método adecuado para tus datos

Procesamiento masivo sin código

Analiza usuarios de Excel o CSV en cuatro pasos

  1. 01

    Abre la herramienta para Excel/CSV

    Accede a la herramienta de carga de GenderAPI y sube el archivo que quieres procesar.

  2. 02

    Selecciona la columna de origen

    Asigna la columna que contiene nombres de usuario, alias o nombres visibles.

  3. 03

    Activa el análisis de apodos

    Habilita la opción que interpreta alias y nombres usados en redes sociales.

  4. 04

    Prueba una muestra y exporta

    Revisa primero un conjunto representativo; después procesa el archivo completo y descarga los datos enriquecidos.

Las cuentas nuevas incluyen 200 créditos API gratuitos al día, por lo que puedes validar el flujo con una muestra antes de procesar el archivo completo.

Casos de uso

Utilízalo como señal auxiliar cuando no exista un nombre real

El análisis de usuarios puede ayudar en datos de redes sociales, comunidades, videojuegos y perfiles creados por usuarios cuando el campo de nombre está vacío. Si dispones de una fuente más directa y autorizada, como un nombre real o un email, utiliza el endpoint apropiado.

Limitaciones

No trates el resultado como una identidad verificada

No todos los alias contienen un nombre real, las asociaciones culturales varían y la misma expresión puede tener significados diferentes entre idiomas. Acepta un resultado vacío cuando no exista señal suficiente, en lugar de convertir datos débiles en una conclusión definitiva.

Guía de implementación V2

Guarda por separado los datos de origen y la estimación

Conserva el identificador original del registro. La API no abre perfiles, no comprueba la titularidad de una cuenta ni verifica la identidad de nadie. Envía contexto de país solo si tienes información fiable; no lo deduzcas del dominio ni del idioma de la página.

Entrada de ejemploCampo u opciónCómo interpretarlo
@alice_smithdata.name / data.matchConserva el nombre de usuario original; no trates el fragmento coincidente como un nombre verificado.
prensesforceToGenderize: truePermite interpretar el alias sin un nombre real. Puede devolver un género con data.name null; no inventes un nombre para la persona.
user47291data.result_status: unknownLas entradas opacas o insuficientes pueden quedar como desconocidas. Eso no es un motivo para reintentar automáticamente.

Envía el nombre de usuario con type: username; no envíes la URL del perfil. La búsqueda en el conjunto de datos elimina la @ inicial, normaliza el texto y genera candidatos a partir de separadores y números. La consulta estándar puede añadir coincidencias limitadas de prefijo y sufijo; forceToGenderize no utiliza esos fragmentos adicionales. Si coinciden varios registros, se selecciona el de mayor recuento almacenado. Usa type: email para correos y type: name para nombres reales.

Elige el modo de procesamiento y su coste en créditos

OpciónProcesamientoCoste por elemento completado
options.ai_mode: offSolo el conjunto de datos1 crédito
options.ai_mode: fallbackPrimero el conjunto de datos; si no se resuelve, IA estándar1 crédito en total, IA incluida
options.ai_mode: alwaysDirectamente con IA2 créditos
forceToGenderize: truePrimero el conjunto de datos; si no se resuelve, interpretación del alias sin exigir un nombre real1 si lo resuelve el conjunto de datos; 2 en total si se utiliza IA

En una consulta individual el valor predeterminado es fallback; en los elementos de un lote, off. forceToGenderize es opcional para nombres, correos y nombres de usuario; en ese caso omite ai_mode o usa fallback, porque es incompatible con off y always. Los resultados unknown completados también se cobran. Basta con un saldo inicial positivo para empezar; al terminar la operación el saldo puede quedar por debajo de cero.

Asigna opciones propias a cada elemento del lote

Las entradas de ejemplo no garantizan ninguna estimación concreta. Configura GENDERAPI_API_KEY en el entorno del servidor y no incluyas la clave en código público del cliente. V1 y V2 comparten la misma clave de cuenta y el mismo saldo. Comprueba la clave con /api/v2/usage y confirma que meta.access.mode es api_key.

Elige un lenguaje de programación. Configura tu clave API, luego ejecuta el ejemplo en tu servidor.

Cada solicitud de predicción es una nueva operación facturable, incluidos los reintentos. Estos ejemplos no se reintentan automáticamente. Comprueba el estado de facturación antes de enviar otra solicitud.

Antes de ejecutar: acceso y manejo de errores

Ejecuta estos ejemplos en tu servidor. Configura GENDERAPI_API_KEY en el entorno de proceso con tu clave API existente. Confirma que meta.access.mode es api_key: una clave no reconocida puede recurrir a la prueba IP.

Para las respuestas JSON HTTP 4xx y 5xx, los ejemplos conservan el cuerpo del error y salen con un estado distinto de cero. Comprueba code, action y meta.usage.billing_status antes de volver a intentarlo. Para una respuesta por lotes HTTP 200, revisa también data o error en cada resultado.

Guía de errores y reintentos →
cURL
curl --silent --show-error --fail-with-body --max-time 30 \
  --request POST 'https://api.genderapi.io/api/v2/gender/batch' \
  --header "Authorization: Bearer ${GENDERAPI_API_KEY:?Set GENDERAPI_API_KEY}" \
  --header 'Content-Type: application/json' \
  --data '{
  "items": [
    {
      "id": "profile-001",
      "type": "username",
      "value": "@alice_smith",
      "options": {
        "ai_mode": "off"
      }
    },
    {
      "id": "profile-002",
      "type": "username",
      "value": "alexriver",
      "options": {
        "ai_mode": "fallback"
      }
    },
    {
      "id": "profile-003",
      "type": "username",
      "value": "prenses",
      "country": "TR",
      "forceToGenderize": true
    }
  ]
}'

cURL 7.76+ en un shell POSIX. Ejecuta en tu terminal. Documentación del entorno de ejecución

JavaScript / Node.js
// Server-side Node.js. Save as example.mjs.
const apiKey = process.env.GENDERAPI_API_KEY;
if (!apiKey) throw new Error("Set GENDERAPI_API_KEY");
const body = {
  "items": [
    {
      "id": "profile-001",
      "type": "username",
      "value": "@alice_smith",
      "options": {
        "ai_mode": "off"
      }
    },
    {
      "id": "profile-002",
      "type": "username",
      "value": "alexriver",
      "options": {
        "ai_mode": "fallback"
      }
    },
    {
      "id": "profile-003",
      "type": "username",
      "value": "prenses",
      "country": "TR",
      "forceToGenderize": true
    }
  ]
};

const response = await fetch("https://api.genderapi.io/api/v2/gender/batch", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify(body),
  signal: AbortSignal.timeout(30_000),
  redirect: "error",
});
const raw = await response.text();
if (!(response.headers.get("content-type") ?? "").includes("json")) {
  throw new Error(`HTTP ${response.status}: expected JSON; request ID ${response.headers.get("x-request-id")}`);
}
const result = JSON.parse(raw); // Also accepts application/problem+json.
if (!response.ok) {
  console.error(`HTTP ${response.status}`, result);
  process.exitCode = 1; // A retry is a new operation; inspect billing first.
} else {
  console.log(JSON.stringify(result, null, 2));
  // For batches, inspect every item: HTTP 200 may contain item errors.
}

Node.js 22+; fetch integrado. Guarda como example.mjs y ejecuta node example.mjs. Documentación del entorno de ejecución

Python
import json
import os
import sys
import urllib.error
import urllib.request

api_key = os.environ.get("GENDERAPI_API_KEY")
if not api_key:
    raise RuntimeError("Set GENDERAPI_API_KEY")
body = json.loads("{\"items\":[{\"id\":\"profile-001\",\"type\":\"username\",\"value\":\"@alice_smith\",\"options\":{\"ai_mode\":\"off\"}},{\"id\":\"profile-002\",\"type\":\"username\",\"value\":\"alexriver\",\"options\":{\"ai_mode\":\"fallback\"}},{\"id\":\"profile-003\",\"type\":\"username\",\"value\":\"prenses\",\"country\":\"TR\",\"forceToGenderize\":true}]}")

class NoRedirect(urllib.request.HTTPRedirectHandler):
    def redirect_request(self, req, fp, code, msg, headers, newurl):
        return None

request = urllib.request.Request(
    "https://api.genderapi.io/api/v2/gender/batch",
    method="POST",
    data=json.dumps(body).encode("utf-8"),
    headers={
        "Authorization": "Bearer " + api_key,
        "Content-Type": "application/json",
    },
)
opener = urllib.request.build_opener(NoRedirect())
try:
    response = opener.open(request, timeout=30)
except urllib.error.HTTPError as error:
    response = error  # Keep the Problem Details body on non-2xx responses.
with response:
    status = response.status
    raw = response.read().decode("utf-8")
    if "json" not in response.headers.get("Content-Type", ""):
        raise RuntimeError(f"HTTP {status}: expected a JSON response")
    result = json.loads(raw)
print(json.dumps(result, indent=2), file=sys.stderr if status >= 300 else sys.stdout)
if not 200 <= status < 300:
    sys.exit(1)  # Inspect code, action and billing before retrying.
# For batches, inspect every item even when HTTP status is 200.

Python 3.10+; biblioteca estándar. Guarda como example.py y ejecuta python3 example.py. Documentación del entorno de ejecución

PHP
<?php
$apiKey = getenv('GENDERAPI_API_KEY');
if (!$apiKey) {
    throw new RuntimeException('Set GENDERAPI_API_KEY');
}
$body = json_decode('{"items":[{"id":"profile-001","type":"username","value":"@alice_smith","options":{"ai_mode":"off"}},{"id":"profile-002","type":"username","value":"alexriver","options":{"ai_mode":"fallback"}},{"id":"profile-003","type":"username","value":"prenses","country":"TR","forceToGenderize":true}]}', true, 512, JSON_THROW_ON_ERROR);

$ch = curl_init('https://api.genderapi.io/api/v2/gender/batch');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => false,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode($body, JSON_THROW_ON_ERROR),
]);
$raw = curl_exec($ch);
if ($raw === false) {
    throw new RuntimeException(curl_error($ch));
}
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE) ?: '';
curl_close($ch);
if (strpos($contentType, 'json') === false) {
    throw new RuntimeException("HTTP $status: expected a JSON response");
}
$result = json_decode($raw, true, 512, JSON_THROW_ON_ERROR);
$output = json_encode($result, JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR) . PHP_EOL;
if ($status < 200 || $status >= 300) {
    fwrite(STDERR, $output); // Preserve the Problem Details body.
    exit(1);
}
echo $output;
// For batches, inspect every item; HTTP 200 can contain item errors.

PHP 8+ con la extensión cURL. Guarda como example.php y ejecuta php example.php. Documentación del entorno de ejecución

Java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.time.Duration;

public class GenderApiExample {
    private static String requiredEnv(String name) {
        String value = System.getenv(name);
        if (value == null || value.isBlank()) throw new IllegalStateException("Set " + name);
        return value;
    }

    public static void main(String[] args) throws Exception {
        String apiKey = requiredEnv("GENDERAPI_API_KEY");
        String body = "{\"items\":[{\"id\":\"profile-001\",\"type\":\"username\",\"value\":\"@alice_smith\",\"options\":{\"ai_mode\":\"off\"}},{\"id\":\"profile-002\",\"type\":\"username\",\"value\":\"alexriver\",\"options\":{\"ai_mode\":\"fallback\"}},{\"id\":\"profile-003\",\"type\":\"username\",\"value\":\"prenses\",\"country\":\"TR\",\"forceToGenderize\":true}]}";
        HttpClient client = HttpClient.newBuilder()
            .connectTimeout(Duration.ofSeconds(10))
            .followRedirects(HttpClient.Redirect.NEVER)
            .build();
        HttpRequest request = HttpRequest.newBuilder(URI.create("https://api.genderapi.io/api/v2/gender/batch"))
            .timeout(Duration.ofSeconds(30))
            .header("Authorization", "Bearer " + apiKey)
            .header("Content-Type", "application/json")
            .POST(HttpRequest.BodyPublishers.ofString(body, StandardCharsets.UTF_8))
            .build();
        HttpResponse<String> response = client.send(request,
            HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
        if (!response.headers().firstValue("content-type").orElse("").contains("json")) {
            throw new IllegalStateException("HTTP " + response.statusCode() + ": expected JSON");
        }
        // JSON text; parse with your application's JSON library when integrating.
        if (response.statusCode() < 200 || response.statusCode() >= 300) {
            System.err.println(response.body()); // Includes Problem Details.
            System.exit(1);
        }
        System.out.println(response.body());
        // For batches, inspect each item's data or error, including on HTTP 200.
    }
}

Java 17+; cliente estándar HTTP. Guarda como GenderApiExample.java y ejecuta java GenderApiExample.java. Documentación del entorno de ejecución

C# / .NET
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;

string RequiredEnv(string name) =>
    !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable(name))
        ? Environment.GetEnvironmentVariable(name)!
        : throw new InvalidOperationException($"Set {name}");

var apiKey = RequiredEnv("GENDERAPI_API_KEY");
using var handler = new HttpClientHandler { AllowAutoRedirect = false };
using var client = new HttpClient(handler) { Timeout = TimeSpan.FromSeconds(30) };
using var request = new HttpRequestMessage(HttpMethod.Post, "https://api.genderapi.io/api/v2/gender/batch");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
request.Content = new StringContent("{\"items\":[{\"id\":\"profile-001\",\"type\":\"username\",\"value\":\"@alice_smith\",\"options\":{\"ai_mode\":\"off\"}},{\"id\":\"profile-002\",\"type\":\"username\",\"value\":\"alexriver\",\"options\":{\"ai_mode\":\"fallback\"}},{\"id\":\"profile-003\",\"type\":\"username\",\"value\":\"prenses\",\"country\":\"TR\",\"forceToGenderize\":true}]}", Encoding.UTF8, "application/json");

using var response = await client.SendAsync(request);
var raw = await response.Content.ReadAsStringAsync();
if (!(response.Content.Headers.ContentType?.MediaType?.Contains("json") ?? false))
    throw new InvalidOperationException($"HTTP {(int)response.StatusCode}: expected JSON");
using var result = JsonDocument.Parse(raw);
if (!response.IsSuccessStatusCode)
{
    Console.Error.WriteLine(result.RootElement); // Preserve Problem Details.
    Environment.ExitCode = 1;
}
else
{
    Console.WriteLine(result.RootElement);
    // For batches, inspect every item even on HTTP 200.
}

Aplicación de consola .NET 8+. Úsalo como Program.cs en un proyecto de consola, luego ejecuta dotnet run. Documentación del entorno de ejecución

Go
package main

import (
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "os"
    "strings"
    "time"
)

func requiredEnv(name string) string {
    value := os.Getenv(name)
    if value == "" { panic("Set " + name) }
    return value
}

func run() error {
    apiKey := requiredEnv("GENDERAPI_API_KEY")
    body := "{\"items\":[{\"id\":\"profile-001\",\"type\":\"username\",\"value\":\"@alice_smith\",\"options\":{\"ai_mode\":\"off\"}},{\"id\":\"profile-002\",\"type\":\"username\",\"value\":\"alexriver\",\"options\":{\"ai_mode\":\"fallback\"}},{\"id\":\"profile-003\",\"type\":\"username\",\"value\":\"prenses\",\"country\":\"TR\",\"forceToGenderize\":true}]}"
    request, err := http.NewRequest("POST", "https://api.genderapi.io/api/v2/gender/batch", strings.NewReader(body))
    if err != nil { return err }
    request.Header.Set("Authorization", "Bearer " + apiKey)
    request.Header.Set("Content-Type", "application/json")
    client := &http.Client{
        Timeout: 30 * time.Second,
        CheckRedirect: func(req *http.Request, via []*http.Request) error {
            return http.ErrUseLastResponse
        },
    }
    response, err := client.Do(request)
    if err != nil { return err }
    defer response.Body.Close()
    raw, err := io.ReadAll(response.Body)
    if err != nil { return err }
    if !strings.Contains(response.Header.Get("Content-Type"), "json") || !json.Valid(raw) {
        return fmt.Errorf("HTTP %d: expected a JSON response", response.StatusCode)
    }
    if response.StatusCode < 200 || response.StatusCode >= 300 {
        return fmt.Errorf("HTTP %d: %s", response.StatusCode, raw)
    }
    fmt.Println(string(raw))
    // For batches, inspect every item even on HTTP 200.
    return nil
}

func main() {
    if err := run(); err != nil {
        fmt.Fprintln(os.Stderr, err) // Keep Problem Details for error handling.
        os.Exit(1)
    }
}

Go 1.22+; biblioteca estándar. Guarda como main.go y ejecuta go run main.go. Documentación del entorno de ejecución

Gestiona los resultados de la lista y los reintentos

POST /api/v2/gender/batch acepta hasta 50 elementos con clave API y 10 en la prueba compartida por IP. Asigna a cada elemento sus propios type, value y options. Si quieres el respaldo estándar de IA, indica fallback explícitamente en cada elemento. El id debe ser único dentro de cada lote; index empieza en cero dentro del lote enviado. Guarda aparte tus propios identificadores de trabajo y de fila de origen.

Un HTTP 200 no significa que todos los elementos se hayan completado. Trata por separado los resultados identified, unknown y error; meta.summary.succeeded incluye tanto identified como unknown. Evalúa juntos data.gender, source, confidence_kind, confidence, match y reason. No consideres equivalentes la puntuación de IA y la frecuencia del conjunto de datos.

Si meta.usage.billing_status está confirmado, reenvía solo los errores operativos que admitan un nuevo intento. Si el estado es unconfirmed o se pierde la respuesta, detente y concilia la facturación. Reenviar el mismo registro, incluido un unknown completado, crea una nueva operación facturable; no reenvíes toda la lista a ciegas.

Contrato de solicitudes por lotes · Campos de la respuesta · Opciones de IA · Evaluación de precisión y confianza · Política de tratamiento de datos

Los complementos de Excel y Google Sheets y otras integraciones ya preparadas pueden usar su propia conexión y su propio formato de salida. No des por hecho que su resultado sigue este esquema JSON de V2; consulta la guía actualizada de cada integración.

Preguntas frecuentes

Predicción de género por usuario y apodo

¿Se puede predecir el género a partir de un nombre de usuario?

En V2, si activas forceToGenderize, primero se consulta el conjunto de datos; si no se resuelve el género, la IA puede interpretar el alias sin exigir un nombre real. El resultado puede quedar como unknown y no es una identidad verificada. La IA estándar, en cambio, necesita un nombre real utilizable.

¿Qué nombres de usuario ofrecen mejores resultados?

Los valores que incluyen un nombre real, un apodo legible o un componente nominal claro pueden aportar una señal más útil. Las cadenas aleatorias y los nombres de marca pueden no producir resultado.

¿Puedo analizar un solo nombre de usuario mediante API?

Sí. El endpoint individual analiza un registro. Para varios registros existe un endpoint específico de solicitudes por lotes.

¿Puedo subir un archivo Excel o CSV?

Sí. En la herramienta de archivos puedes elegir la columna de nombre de usuario o nombre visible y activar el análisis de apodos.

¿Por qué debo guardar juntos los campos de confianza y origen de V2?

En V2, data.confidence va de 0 a 1. Evalúalo junto con source y confidence_kind, porque la puntuación de IA y la frecuencia del conjunto de datos no son la misma medida. Conserva los resultados unknown y el campo reason.

¿Se puede usar el resultado para segmentación?

Puede servir como señal auxiliar para análisis agregados y enriquecimiento de datos, pero no debe usarse por sí sola para decisiones de alto impacto sobre una persona ni para dar por hecha su identidad.

¿Puedo probarlo gratis?

Las cuentas nuevas de GenderAPI incluyen 200 créditos API gratuitos al día para probar muestras representativas mediante API o archivos.

Publicado: 4 de junio de 2025Última revisión: 28 de septiembre de 2026

Prueba tu integración

Analiza un nombre de usuario con la API específica

Empieza con 200 créditos API gratuitos al día y conecta el endpoint adecuado a tu flujo.