DOCUMENTATION API V2

GenderAPI.io V2 : crédits, facturation et utilisation

Consultez votre solde GenderAPI.io partagé entre V1 et V2. Comprenez le repli ordinaire, l'IA forcée, les résultats inconnus facturés, les remboursements et la réinitialisation de l'essai.

Crédits, résultats inconnus et utilisation

Un genre null renvoyé par une opération réussie est facturé au tarif du mode sélectionné. La validation de téléphone coûte 1 crédit même lorsque valid: false. Les erreurs de validation avant facturation et les prédictions échouées ne consomment aucun crédit après un remboursement confirmé.

Un solde de départ positif suffit pour lancer une opération individuelle ou un lot. Le débit final peut rendre le solde négatif : 1 crédit de départ moins une opération IA à 2 crédits laisse -1. Un solde nul ou négatif bloque les nouvelles opérations facturables. Les remboursements restent possibles.

Consultez meta.usage.billing_status : not_charged signifie qu'aucun débit n'a eu lieu (charged_credits: 0) ; confirmed signifie que le débit net est connu ; unconfirmed signifie que charged_credits vaut null et que le résultat doit être vérifié. remaining_credits peut être négatif, ou null s'il n'est pas disponible. C'est un instantané pris à la fin de l'opération, qui peut évoluer avec des requêtes simultanées.

GET /usage est gratuit. Il renvoie remaining_credits et expires_at, ainsi que resets_at, limit et period_seconds pour l'essai par IP. Pour l'essai, limit vaut 10 et period_seconds vaut 86400 ; ces champs valent null pour les comptes avec clé API. resets_at n'est pas la date d'expiration de l'abonnement.

La V1 et la V2 partagent un même solde. Les mises à jour de solde de la V1 peuvent entrer en concurrence avec celles de la V2 ; ne comptez pas sur une garantie de facturation exactement unique entre les versions.

Réponse JSON illustrative
{
  "data": {
    "remaining_credits": 9,
    "expires_at": "2026-09-26T12:00:00.000Z",
    "resets_at": "2026-09-26T12:00:00.000Z",
    "limit": 10,
    "period_seconds": 86400
  },
  "meta": {
    "request_id": "11111111-1111-4111-8111-111111111111",
    "duration_ms": 12,
    "access": {
      "mode": "ip_trial",
      "reason": "api_key_missing"
    },
    "usage": {
      "charged_credits": 0,
      "remaining_credits": 9,
      "billing_status": "not_charged",
      "resets_at": "2026-09-26T12:00:00.000Z",
      "limit": 10,
      "period_seconds": 86400
    }
  }
}

Vérifier le solde actuel

GET /api/v2/usage est gratuit et utilise l'authentification Bearer, sans paramètre de requête. Sans clé, il renvoie l'allocation actuelle de l'essai par IP.

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

Cette consultation du solde ne consomme aucun crédit, mais elle est prise en compte dans les limites de débit des requêtes.

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 GET 'https://api.genderapi.io/api/v2/usage' \
  --header "Authorization: Bearer ${GENDERAPI_API_KEY:?Set GENDERAPI_API_KEY}"

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 response = await fetch("https://api.genderapi.io/api/v2/usage", {
  method: "GET",
  headers: {
    Authorization: `Bearer ${apiKey}`,
  },
  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")

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/usage",
    method="GET",
    headers={
        "Authorization": "Bearer " + api_key,
    },
)
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');
}

$ch = curl_init('https://api.genderapi.io/api/v2/usage');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'GET',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => false,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . $apiKey,
    ],
]);
$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");
        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/usage"))
            .timeout(Duration.ofSeconds(30))
            .header("Authorization", "Bearer " + apiKey)
            .GET()
            .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.Get, "https://api.genderapi.io/api/v2/usage");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);

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")
    request, err := http.NewRequest("GET", "https://api.genderapi.io/api/v2/usage", nil)
    if err != nil { return err }
    request.Header.Set("Authorization", "Bearer " + apiKey)
    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

Champs de la réponse de solde

ChampTypePeut valoir nullExempleDescription
data.remaining_creditsintegerNon99Solde actuel du compte ou de l'essai par IP ; peut être négatif.
data.expires_atstringOuinullExpiration du compte ou de l'essai en UTC (ISO 8601), si disponible.
data.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.
data.limitintegerOui10Crédits de l'essai par IP ; null pour les comptes avec clé API.
data.period_secondsintegerOui86400Durée de l'essai par IP en secondes ; null pour les comptes avec clé API.

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.