DOCUMENTACIÓN API V2

GenderAPI.io V2: nombres de usuario y alias

Envía type: username y value a GenderAPI.io V2. Utiliza forceToGenderize para interpretar alias y conoce los resultados desconocidos y tus costes.

Antes de enviar la solicitud

Envía las consultas de GenderAPI.io V2 a POST https://api.genderapi.io/api/v2/gender con type y value en el cuerpo JSON. Utiliza tu clave actual en Authorization: Bearer YOUR_API_KEY y Content-Type: application/json. Lee el resultado en data y la información de acceso y cobro en meta. Cada solicitud se procesa de forma independiente.

Elige tu idioma en el ejemplo de código. Configura GENDERAPI_API_KEY en el entorno del proceso antes de ejecutarlo. Las claves faltantes o no reconocidas pueden usar la versión de prueba compartida de IP, así que confirme que meta.access.mode es api_key al integrar una cuenta.

Género de un nombre de usuario o apodo

ParámetroTipoObligatorioValor predeterminadoDescripción
typestringSí—Categoría de entrada: name, email o username.
valuestringSí—Requerido. 1–254 caracteres; no en blanco, sin caracteres de control. Los valores de correo electrónico deben tener una sintaxis de correo electrónico válida.
countrystringNo—Código ISO 3166-1 alpha-2 en mayúsculas opcional, por ejemplo TR o US. La búsqueda específica de un país puede recurrir al conjunto de datos global.
forceToGenderizebooleanNofalseConsulta primero el conjunto de datos y después la IA para apodos si no hay resultado. Compatible con name, email y username.
optionsobjectNo—Objeto con las opciones de IA de cada entrada.
options.ai_modestringNofallbackValores permitidos: off, fallback, always. Con forceToGenderize: true, omite este campo o utiliza fallback.
idstringNo—Identificador opcional con entre 1 y 64 caracteres en el cuerpo POST JSON. Debe ser único dentro de un lote y se devuelve con el resultado del lote. Las solicitudes individuales aceptan este identificador pero no lo incluyen en la respuesta. Las consultas GET no lo admiten.

Envía type: username y el usuario o alias en value a POST https://api.genderapi.io/api/v2/gender. Activa forceToGenderize para intentar una predicción basada en el significado de un alias, como prenses, aunque no se extraiga un nombre real. GenderAPI.io V2 consulta primero el conjunto de datos. La respuesta puede contener data.gender distinto de null junto con data.name: null.

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.

Las respuestas HTTP 4xx y 5xx JSON conservan el cuerpo del error y devuelven un estado de salida distinto de cero. Comprueba code, action y meta.usage.billing_status antes de volver a intentarlo.

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' \
  --header "Authorization: Bearer ${GENDERAPI_API_KEY:?Set GENDERAPI_API_KEY}" \
  --header 'Content-Type: application/json' \
  --data '{
  "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 = {
  "type": "username",
  "value": "prenses",
  "country": "TR",
  "forceToGenderize": true
};

const response = await fetch("https://api.genderapi.io/api/v2/gender", {
  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("{\"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",
    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('{"type":"username","value":"prenses","country":"TR","forceToGenderize":true}', true, 512, JSON_THROW_ON_ERROR);

$ch = curl_init('https://api.genderapi.io/api/v2/gender');
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 = "{\"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"))
            .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");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
request.Content = new StringContent("{\"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 := "{\"type\":\"username\",\"value\":\"prenses\",\"country\":\"TR\",\"forceToGenderize\":true}"
    request, err := http.NewRequest("POST", "https://api.genderapi.io/api/v2/gender", 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

Ejemplo de respuesta

Esta es una respuesta real capturada el 1 de octubre de 2026 con una clave de API; solo se sustituyó el saldo de la cuenta. No es una medida de precisión, y una consulta real puede devolver un resultado distinto. Las solicitudes con clave de API indican meta.access.mode: api_key y null en los campos exclusivos de la prueba; las solicitudes de prueba por IP indican ip_trial. Lee data para la predicción y meta.usage para el resultado del cobro.

Respuesta JSON ilustrativa
{
  "data": {
    "input": {
      "type": "username",
      "value": "prenses",
      "country": "TR",
      "forceToGenderize": true
    },
    "name": "prenses",
    "gender": "female",
    "country": "TR",
    "confidence": 0.9456521739130435,
    "confidence_kind": "observed_frequency",
    "sample_count": 184,
    "source": "dataset",
    "result_status": "identified",
    "reason": null,
    "country_source": "dataset",
    "match": {
      "name": "prenses",
      "method": "normalized",
      "scope": "country",
      "country": "TR"
    }
  },
  "meta": {
    "request_id": "a799faa4-bc1a-4537-90b3-2c1b60205499",
    "duration_ms": 15,
    "access": {
      "mode": "api_key",
      "reason": null
    },
    "usage": {
      "charged_credits": 1,
      "remaining_credits": 49999,
      "billing_status": "confirmed",
      "resets_at": null,
      "limit": null,
      "period_seconds": null
    }
  }
}

Campos de la respuesta de predicción

CampoTipo¿Admite null?EjemploDescripción
data.inputobjectNo{"type":"name","value":"Javier","country":"ES"}Tipo de entrada, valor y país. forceToGenderize se incluye cuando true.
data.namestringSí"javier"Nombre de pila coincidente o extraído; null cuando no hay ninguno disponible.
data.genderstringSí"male"male, female o JSON null. Esta es una predicción, no una prueba de la identidad de una persona.
data.result_statusstringNo"identified"identified si se devuelve un género; unknown en caso contrario.
data.reasonstringSínullnull en resultados identified. Para unknown: not_found, no_name_candidate, ambiguous o insufficient_evidence.
data.confidencenumberSí0.95Puntuación entre 0 y 1, o null. Si gender es null, confidence también lo es.
data.confidence_kindstringSí"observed_frequency"observed_frequency: el recuento de género dominante dividido por el recuento total en el conjunto de datos seleccionado. model_reported: una puntuación de IA, no una probabilidad calibrada. El valor es null cuando no está disponible.
data.sample_countintegerSí1200Tamaño de muestra del conjunto de datos o null. La IA no inventa un recuento de muestras.
data.sourcestringNo"dataset"dataset, ai o none.
data.countrystringSí"ES"Asociación de país del conjunto de datos o ai_association, o null. No establece nacionalidad, residencia ni etnia.
data.country_sourcestringSí"dataset"Origen de la asociación de país: dataset, ai_association o null.
data.matchobjectNo{"name":"javier","method":"normalized","scope":"country","country":"ES"}Nombre coincidente en el conjunto de datos, método (normalized, token, substring o model_inference), ámbito (country o global) y país de la coincidencia. La información no disponible se representa con null.

Acceso, facturación y metadatos de la solicitud

CampoTipo¿Admite null?EjemploDescripción
meta.request_idstringNo"550e8400-e29b-41d4-a716-446655440000"Identificador único de este intento HTTP; también se envía en X-Request-ID.
meta.duration_msintegerNo42Tiempo de procesamiento de la solicitud en milisegundos.
meta.access.modestringNo"api_key"api_key, ip_trial o unauthenticated. Comprueba api_key para cualquier integración de cuenta, gratuita o de pago.
meta.access.reasonstringSínullMotivo del acceso de prueba: api_key_missing, api_key_invalid o api_key_not_found; null en otros casos.
meta.usage.charged_creditsintegerSí1Créditos netos cobrados. Cero antes del cobro o tras un reembolso completo confirmado; null si el cobro no está confirmado.
meta.usage.remaining_creditsintegerSí99Saldo al finalizar la operación. Puede ser negativo; null si no está disponible o el cobro no está confirmado.
meta.usage.billing_statusstringNo"confirmed"not_charged, confirmed o unconfirmed. Compruébelo antes de reintentar una predicción fallida.
meta.usage.resets_atstringSí"2026-09-27T12:00:00.000Z"Reinicio de la prueba por IP en UTC (ISO 8601); null para cuentas con clave API o si se desconoce.
meta.usage.limitintegerSí10Créditos de la prueba por IP; null para cuentas con clave API.
meta.usage.period_secondsintegerSí86400Duración de la prueba por IP en segundos; null para cuentas con clave API.

Leer una predicción de apodo

Este ejemplo utiliza forceToGenderize: true. Si el conjunto de datos identifica un género, el costo es 1 crédito. De lo contrario, la IA interpreta el alias y una solicitud completa cuesta 2 créditos en total, incluso si el género sigue siendo desconocido. Omite ai_mode o configúrelo en fallback. El uso de off o always junto con forceToGenderize devuelve HTTP 422.

En modo apodo, se permite una predicción de género con name: null. Significa que no se extrajo ningún nombre real, no que el análisis haya fallado. Si IA devuelve un género, se devuelven sample_count: null y confidence_kind: model_reported. La puntuación no es una probabilidad calibrada y no verifica la identidad personal.

Sin forceToGenderize, una consulta individual por usuario utiliza fallback estándar por 1 crédito en total, pero requiere un nombre real utilizable. Envía options.ai_mode: off para consultar solo el conjunto de datos.

Guías relacionadas