DOCUMENTATION API V2

GenderAPI.io V2 : recherche par nom d'utilisateur et surnom

Envoyez type: username et value à GenderAPI.io V2. Utilisez forceToGenderize pour l'inférence de surnoms et comprenez les résultats inconnus et les crédits consommés.

Avant d'envoyer la requête

Envoyez les requêtes de prédiction GenderAPI.io V2 à POST https://api.genderapi.io/api/v2/gender, avec type et value dans le corps JSON. Utilisez votre clé GenderAPI.io existante dans Authorization: Bearer YOUR_API_KEY et Content-Type: application/json. Lisez le résultat dans data et les informations d'accès et de facturation dans meta. Chaque requête est traitée indépendamment.

Choisissez votre langage dans l'exemple de code. Définissez GENDERAPI_API_KEY dans l'environnement du processus avant de l'exécuter. Une clé absente ou non reconnue peut utiliser l'essai partagé par IP ; vérifiez donc que meta.access.mode vaut api_key lorsque vous intégrez un compte.

Genre à partir d'un nom d'utilisateur ou d'un surnom

ParamètreTypeObligatoireValeur par défautDescription
typestringOui—Catégorie d'entrée : name, email ou username.
valuestringOui—Obligatoire. 1 à 254 caractères ; non vide et sans caractères de contrôle. Une valeur de type email doit respecter la syntaxe d'une adresse e-mail valide.
countrystringNon—Code ISO 3166-1 alpha-2 facultatif, en majuscules, par exemple TR ou US. La recherche propre à un pays peut se rabattre sur le jeu de données global.
forceToGenderizebooleanNonfalseConsulte d'abord le jeu de données, puis l'IA adaptée aux surnoms si aucun résultat n'est trouvé. Compatible avec name, email et username.
optionsobjectNon—Objet contenant les options d'IA propres à chaque entrée.
options.ai_modestringNonfallbackValeurs autorisées : off, fallback, always. Avec forceToGenderize: true, omettez ce champ ou utilisez fallback.
idstringNon—Identifiant facultatif de 1 à 64 caractères dans le corps JSON POST. Renvoyé avec chaque résultat de lot et unique au sein d'un lot. Accepté mais non renvoyé pour les prédictions individuelles. Non pris en charge dans les requêtes GET.

Envoyez type: username et le pseudo ou surnom dans value à POST https://api.genderapi.io/api/v2/gender. Définissez forceToGenderize sur true pour tenter une prédiction fondée sur le sens d'un surnom, comme prenses, même si aucun véritable prénom ne peut être extrait. GenderAPI.io V2 consulte toujours le jeu de données en premier. Une prédiction de surnom peut renvoyer un data.gender non null avec data.name: null.

Choisissez un langage de programmation. Configurez votre clé API, puis exécutez l'exemple sur votre serveur.

Chaque requête de prédiction est une nouvelle opération facturable, y compris les nouvelles tentatives. Ces exemples ne réessaient pas automatiquement. Vérifiez le statut de facturation avant d'envoyer une autre requête.

Avant l'exécution : accès et gestion des erreurs

Exécutez ces exemples sur votre serveur. Définissez GENDERAPI_API_KEY dans l'environnement du processus avec votre clé API existante. Vérifiez que meta.access.mode vaut api_key : une clé non reconnue peut basculer vers l'essai par IP.

Pour les réponses JSON HTTP 4xx et 5xx, les exemples conservent le corps de l'erreur et renvoient un code de sortie non nul. Vérifiez code, action et meta.usage.billing_status avant de réessayer.

Guide des erreurs et des nouvelles tentatives →
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+ dans un shell POSIX. À exécuter dans votre terminal. Documentation de l'environnement d'exécution

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 intégré. Enregistrez sous example.mjs et exécutez node example.mjs. Documentation de l'environnement d'exécution

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+ ; bibliothèque standard. Enregistrez sous example.py et exécutez python3 example.py. Documentation de l'environnement d'exécution

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+ avec l'extension cURL. Enregistrez sous example.php et exécutez php example.php. Documentation de l'environnement d'exécution

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+ ; client HTTP standard. Enregistrez sous GenderApiExample.java et exécutez java GenderApiExample.java. Documentation de l'environnement d'exécution

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

Application console .NET 8+. Utilisez-le comme Program.cs dans un projet console, puis exécutez dotnet run. Documentation de l'environnement d'exécution

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+ ; bibliothèque standard. Enregistrez sous main.go et exécutez go run main.go. Documentation de l'environnement d'exécution

Exemple de réponse

Il s'agit d'une réponse réelle obtenue le 1er octobre 2026 avec une clé API ; seul le solde du compte a été remplacé. Elle ne constitue pas une mesure de la précision, et une requête réelle peut renvoyer un résultat différent. Les requêtes avec clé API indiquent meta.access.mode: api_key et renvoient null dans les champs de quota propres à l'essai ; les requêtes en essai par IP indiquent ip_trial. Lisez data pour l'inférence et meta.usage pour le résultat de facturation de l'opération.

Réponse JSON illustrative
{
  "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
    }
  }
}

Champs de la réponse de prédiction

ChampTypePeut valoir nullExempleDescription
data.inputobjectNon{"type":"name","value":"Antoine","country":"FR"}Type d'entrée, valeur et pays. forceToGenderize est inclus lorsqu'il vaut true.
data.namestringOui"antoine"Prénom correspondant ou extrait ; null si aucun n'est disponible.
data.genderstringOui"male"male, female ou JSON null. Il s'agit d'une inférence, et non d'une identité personnelle vérifiée.
data.result_statusstringNon"identified"identified si un genre est renvoyé ; unknown sinon.
data.reasonstringOuinullnull pour les résultats identified. Raisons d'un résultat inconnu : not_found, no_name_candidate, ambiguous ou insufficient_evidence.
data.confidencenumberOui0.95Score de 0 à 1 ou null. Un genre null a une confiance null.
data.confidence_kindstringOui"observed_frequency"observed_frequency : effectif du genre dominant divisé par le total de la ligne du jeu de données sélectionnée. model_reported : score de l'IA, qui n'est pas une probabilité calibrée. null lorsqu'il n'est pas disponible.
data.sample_countintegerOui1200Taille de l'échantillon du jeu de données ou null. L'IA n'invente pas d'effectif d'échantillon.
data.sourcestringNon"dataset"dataset, ai ou none.
data.countrystringOui"FR"Association à un pays issue de dataset ou ai_association, ou null. N'établit ni la nationalité, ni la résidence, ni l'origine ethnique.
data.country_sourcestringOui"dataset"Origine de l'association au pays : dataset, ai_association ou null.
data.matchobjectNon{"name":"antoine","method":"normalized","scope":"country","country":"FR"}Nom correspondant dans le jeu de données, méthode (normalized, token, substring ou model_inference), portée country ou global et pays de la correspondance. Les informations indisponibles valent null.

Accès, facturation et métadonnées de la requête

ChampTypePeut valoir nullExempleDescription
meta.request_idstringNon"550e8400-e29b-41d4-a716-446655440000"Identifiant unique de cette tentative HTTP ; également envoyé dans X-Request-ID.
meta.duration_msintegerNon42Durée de traitement de la requête en millisecondes.
meta.access.modestringNon"api_key"api_key, ip_trial ou unauthenticated. Vérifiez api_key lorsque vous utilisez un compte payant.
meta.access.reasonstringOuinullMotif du passage à l'essai : api_key_missing, api_key_invalid ou api_key_not_found ; null sinon.
meta.usage.charged_creditsintegerOui1Crédits nets débités. Zéro avant débit ou après remboursement intégral confirmé ; null si la facturation n'est pas confirmée.
meta.usage.remaining_creditsintegerOui99Solde à la fin de l'opération. Peut être négatif ; null si indisponible ou si la facturation n'est pas confirmée.
meta.usage.billing_statusstringNon"confirmed"not_charged, confirmed ou unconfirmed. Vérifiez ce champ avant de relancer une prédiction échouée.
meta.usage.resets_atstringOui"2026-09-27T12:00:00.000Z"Réinitialisation de l'essai par IP en UTC (ISO 8601) ; null pour les comptes avec clé API ou si inconnue.
meta.usage.limitintegerOui10Crédits de l'essai par IP ; null pour les comptes avec clé API.
meta.usage.period_secondsintegerOui86400Durée de l'essai par IP en secondes ; null pour les comptes avec clé API.

Lire une prédiction de surnom

Cet exemple utilise forceToGenderize: true. Une recherche résolue par le jeu de données coûte 1 crédit. Sinon, l'API demande à l'IA d'interpréter l'alias et facture 2 crédits au total pour une opération réussie, y compris un résultat inconnu. Omettez ai_mode ou définissez-le sur fallback ; off et always sont incompatibles avec forceToGenderize et renvoient HTTP 422.

En mode surnom, un genre inféré avec name: null est autorisé. Cela signifie qu'aucun véritable prénom n'a été extrait ; ce n'est pas une erreur d'analyse. Lorsqu'un genre est renvoyé, les résultats de l'IA contiennent sample_count: null et confidence_kind: model_reported. Le score n'est ni une probabilité calibrée ni une vérification d'identité.

Sans forceToGenderize, une recherche individuelle par nom d'utilisateur utilise toujours par défaut le repli ordinaire sur l'IA pour 1 crédit au total, mais elle exige un véritable prénom exploitable. Utilisez options.ai_mode: off pour un traitement limité au jeu de données.

Guides associés