API-DOKUMENTATION V2

GenderAPI.io V2: kreditter, opkrævning og forbrug

Læs din fælles saldo hos GenderAPI.io, og forstå priserne i kreditter i V2, opkrævning for ukendte resultater, refusioner, negativ saldo og nulstilling af IP-prøveadgangen.

Kreditter, ukendte resultater og forbrug

Et gennemført resultat med gender null opkræves efter prisen for den valgte tilstand. Validering af telefonnumre koster 1 kredit, også når valid er false. Valideringsfejl før opkrævning og mislykkede forudsigelser bruger ingen kreditter efter en bekræftet refusion.

En positiv startsaldo er nok til at starte en enkelt operation eller en batch. Den endelige opkrævning kan gøre saldoen negativ: 1 startkredit minus en AI-operation til 2 kreditter giver -1. En saldo på nul eller derunder blokerer nye operationer, der koster kreditter. Refusioner er stadig tilladt.

Læs meta.usage.billing_status: not_charged betyder, at der ikke er trukket noget (charged_credits: 0). confirmed betyder, at nettoopkrævningen er kendt. unconfirmed betyder, at charged_credits er null, og at udfaldet skal kontrolleres. remaining_credits kan være negativ eller null, hvis værdien ikke er tilgængelig. Det er et øjebliksbillede ved afslutningen og kan ændre sig ved samtidige forespørgsler.

GET /usage er gratis. Det returnerer remaining_credits og expires_at samt resets_at, limit og period_seconds for IP-prøveadgangen. For IP-prøveadgangen er limit 10 og period_seconds 86400. For konti med API-nøgle er disse felter null. resets_at er ikke abonnementets udløb.

V1 og V2 deler én saldo. V1's eksisterende opdateringer af saldoen kan køre samtidig med V2, så forlad dig ikke på en garanti for præcis én opkrævning på tværs af versionerne.

Illustrativt JSON-svar
{
  "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
    }
  }
}

Tjek den aktuelle saldo

GET /api/v2/usage er gratis og bruger Bearer-godkendelse uden forespørgselsparametre. Hvis du udelader nøglen, læses de aktuelle kreditter i IP-prøveadgangen.

Vælg et programmeringssprog. Konfigurér din API-nøgle, og kør derefter eksemplet på din server.

Det koster ingen kreditter at læse saldoen, men forespørgslen tæller stadig med i forespørgselsgrænserne.

Før du kører: adgang og fejlhåndtering

Kør eksemplerne på din server. Sæt GENDERAPI_API_KEY i procesmiljøet til din eksisterende API-nøgle. Bekræft, at meta.access.mode er api_key: En nøgle, der ikke genkendes, kan føre til IP-prøveadgangen.

JSON-svar med HTTP 4xx og 5xx bevarer fejlens body og returnerer en exitstatus, der ikke er nul. Kontrollér code, action og meta.usage.billing_status, før du prøver igen.

Guide til fejl og nye forsøg →
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+ i en POSIX-shell. Kør i din terminal. Dokumentation for kørselsmiljøet

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+, indbygget fetch. Gem som example.mjs, og kør node example.mjs. Dokumentation for kørselsmiljøet

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+, standardbiblioteket. Gem som example.py, og kør python3 example.py. Dokumentation for kørselsmiljøet

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+ med cURL-udvidelsen. Gem som example.php, og kør php example.php. Dokumentation for kørselsmiljøet

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+, standard-HTTP-klienten. Gem som GenderApiExample.java, og kør java GenderApiExample.java. Dokumentation for kørselsmiljøet

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

Konsolapplikation med .NET 8+. Brug som Program.cs i et konsolprojekt, og kør derefter dotnet run. Dokumentation for kørselsmiljøet

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+, standardbiblioteket. Gem som main.go, og kør go run main.go. Dokumentation for kørselsmiljøet

Felter i svaret om saldoen

FeltTypeKan være nullEksempelBeskrivelse
data.remaining_creditsintegerNej99Aktuel saldo for kontoen eller IP-prøveadgangen. Den kan være negativ.
data.expires_atstringJanullUdløbstidspunkt for kontoen eller IP-prøveadgangen i UTC (ISO 8601), når det er tilgængeligt.
data.resets_atstringJa"2026-09-27T12:00:00.000Z"Tidspunkt for nulstilling af IP-prøveadgangen i UTC (ISO 8601). null for konti med API-nøgle, eller når det ikke er kendt.
data.limitintegerJa10Kreditter i IP-prøveadgangen. null for konti med API-nøgle.
data.period_secondsintegerJa86400Periode for IP-prøveadgangen i sekunder. null for konti med API-nøgle.

Metadata om adgang, opkrævning og forespørgslen

FeltTypeKan være nullEksempelBeskrivelse
meta.request_idstringNej"550e8400-e29b-41d4-a716-446655440000"Entydigt id for dette HTTP-forsøg. Sendes også i X-Request-ID.
meta.duration_msintegerNej42Behandlingstid for forespørgslen i millisekunder.
meta.access.modestringNej"api_key"api_key, ip_trial eller unauthenticated. Kontrollér, at værdien er api_key, når du bruger en betalt konto.
meta.access.reasonstringJanullÅrsag til IP-prøveadgangen: api_key_missing, api_key_invalid eller api_key_not_found, ellers null.
meta.usage.charged_creditsintegerJa1Opkrævede kreditter netto. Nul før opkrævning eller efter en fuld bekræftet refusion, null, når opkrævningen ikke er bekræftet.
meta.usage.remaining_creditsintegerJa99Saldo, når operationen afsluttes. Kan være negativ. null, når den ikke er tilgængelig, eller opkrævningen ikke er bekræftet.
meta.usage.billing_statusstringNej"confirmed"not_charged, confirmed eller unconfirmed. Kontrollér dette, før du prøver en mislykket forudsigelse igen.
meta.usage.resets_atstringJa"2026-09-27T12:00:00.000Z"Tidspunkt for nulstilling af IP-prøveadgangen i UTC (ISO 8601). null for konti med API-nøgle, eller når det ikke er kendt.
meta.usage.limitintegerJa10Kreditter i IP-prøveadgangen. null for konti med API-nøgle.
meta.usage.period_secondsintegerJa86400Periode for IP-prøveadgangen i sekunder. null for konti med API-nøgle.