DOKUMENTACJA API V2

GenderAPI.io V2: kredyty, rozliczenia i wykorzystanie

Sprawdź saldo GenderAPI.io współdzielone przez V1 i V2. Poznaj koszty kredytów w V2, standardowe przejście na AI, wymuszone wnioskowanie AI, płatne wyniki nieznane, zwroty, ujemne salda i odnawianie próby dla adresu IP.

Kredyty, nieznane wyniki i wykorzystanie

Udany wynik z płcią null jest płatny według stawki wybranego trybu. Walidacja numeru telefonu kosztuje 1 kredyt, nawet gdy valid: false. Błędy walidacji zgłoszone przed rozliczeniem oraz nieudane prognozy po potwierdzonym zwrocie nie zużywają kredytów.

Do rozpoczęcia pojedynczej operacji lub partii wystarczy dodatnie saldo początkowe. Końcowa opłata może sprawić, że saldo będzie ujemne: 1 kredyt na start minus operacja AI za 2 kredyty daje -1. Saldo zerowe lub ujemne blokuje nowe płatne operacje. Zwroty są nadal możliwe.

Sprawdź meta.usage.billing_status: not_charged oznacza brak obciążenia (charged_credits: 0); confirmed oznacza, że opłata netto jest znana; unconfirmed oznacza, że charged_credits ma wartość null, a wynik wymaga sprawdzenia. remaining_credits może być ujemne lub mieć wartość null, jeśli jest niedostępne. To stan z chwili zakończenia operacji, który może się zmienić przy równoczesnych zapytaniach.

GET /usage jest bezpłatne. Zwraca remaining_credits i expires_at, a w przypadku próby dla adresu IP także resets_at, limit i period_seconds. W próbie limit wynosi 10, a period_seconds 86400; dla kont z kluczem API te pola mają wartość null. resets_at nie oznacza wygaśnięcia subskrypcji.

V1 i V2 korzystają z tego samego salda. Istniejące mechanizmy aktualizacji salda w V1 mogą konkurować z V2; nie polegaj na gwarancji rozliczenia dokładnie raz między wersjami.

Poglądowa odpowiedź JSON
{
  "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
    }
  }
}

Sprawdź aktualne saldo

GET /api/v2/usage jest bezpłatne, przyjmuje uwierzytelnianie Bearer i nie ma parametrów zapytania. Bez klucza odczytuje bieżący limit próby dla adresu IP.

Wybierz język programowania. Skonfiguruj klucz API, następnie uruchom przykład na swoim serwerze.

Odczyt salda nie zużywa kredytów, ale nadal wlicza się do limitów częstotliwości zapytań.

Zanim uruchomisz: dostęp i obsługa błędów

Uruchamiaj te przykłady na swoim serwerze. Ustaw w środowisku procesu zmienną GENDERAPI_API_KEY na swój istniejący klucz API. Upewnij się, że meta.access.mode ma wartość api_key: nierozpoznany klucz może spowodować przejście na próbę dla adresu IP.

W przypadku odpowiedzi JSON z kodem HTTP 4xx i 5xx przykłady zachowują treść błędu i zwracają niezerowy kod wyjścia. Przed ponowną próbą sprawdź code, action i meta.usage.billing_status.

Przewodnik po błędach i ponawianiu zapytań →
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+ w powłoce POSIX. Uruchom w terminalu. Dokumentacja środowiska uruchomieniowego

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+; wbudowany fetch. Zapisz jako example.mjs i uruchom node example.mjs. Dokumentacja środowiska uruchomieniowego

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+; biblioteka standardowa. Zapisz jako example.py i uruchom python3 example.py. Dokumentacja środowiska uruchomieniowego

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+ z rozszerzeniem cURL. Zapisz jako example.php i uruchom php example.php. Dokumentacja środowiska uruchomieniowego

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+; standardowy klient HTTP. Zapisz jako GenderApiExample.java i uruchom java GenderApiExample.java. Dokumentacja środowiska uruchomieniowego

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

Aplikacja konsolowa .NET 8+. Użyj jako Program.cs w projekcie konsolowym, a następnie uruchom dotnet run. Dokumentacja środowiska uruchomieniowego

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+; biblioteka standardowa. Zapisz jako main.go i uruchom go run main.go. Dokumentacja środowiska uruchomieniowego

Pola odpowiedzi z saldem

PoleTypDopuszcza nullPrzykładOpis
data.remaining_creditsintegerNie99Bieżące saldo konta lub próby dla adresu IP; może być ujemne.
data.expires_atstringTaknullData wygaśnięcia konta lub próby w UTC (ISO 8601), jeśli jest dostępna.
data.resets_atstringTak"2026-09-27T12:00:00.000Z"Czas odnowienia próby dla adresu IP w UTC (ISO 8601); null dla kont z kluczem API lub gdy nie jest znany.
data.limitintegerTak10Limit kredytów próby dla adresu IP; null dla kont z kluczem API.
data.period_secondsintegerTak86400Okres próby dla adresu IP w sekundach; null dla kont z kluczem API.

Metadane dostępu, rozliczenia i zapytania

PoleTypDopuszcza nullPrzykładOpis
meta.request_idstringNie"550e8400-e29b-41d4-a716-446655440000"Unikalny identyfikator tej próby HTTP; wysyłany także w X-Request-ID.
meta.duration_msintegerNie42Czas przetwarzania zapytania w milisekundach.
meta.access.modestringNie"api_key"api_key, ip_trial lub unauthenticated. Korzystając z płatnego konta, sprawdź api_key.
meta.access.reasonstringTaknullPowód przejścia na próbę: api_key_missing, api_key_invalid lub api_key_not_found; w pozostałych przypadkach null.
meta.usage.charged_creditsintegerTak1Liczba pobranych kredytów netto. Zero przed pobraniem lub po potwierdzonym pełnym zwrocie; null, gdy rozliczenie jest niepotwierdzone.
meta.usage.remaining_creditsintegerTak99Saldo po zakończeniu operacji. Może być ujemne; null, gdy saldo jest niedostępne lub rozliczenie jest niepotwierdzone.
meta.usage.billing_statusstringNie"confirmed"not_charged, confirmed lub unconfirmed. Sprawdź to pole przed ponowieniem nieudanej prognozy.
meta.usage.resets_atstringTak"2026-09-27T12:00:00.000Z"Czas odnowienia próby dla adresu IP w UTC (ISO 8601); null dla kont z kluczem API lub gdy nie jest znany.
meta.usage.limitintegerTak10Limit kredytów próby dla adresu IP; null dla kont z kluczem API.
meta.usage.period_secondsintegerTak86400Okres próby dla adresu IP w sekundach; null dla kont z kluczem API.