API-DOKUMENTATION V2

GenderAPI.io V2: Validierung und Formatierung von Telefonnummern

Prüfen Sie mit GenderAPI.io V2 die Struktur einer Telefonnummer anhand von number und country. Lesen Sie data.valid, data.possible, die Formatierungsfelder und die Nutzungsmetadaten.

Eine Telefonnummer validieren und formatieren

ParameterTypErforderlichStandardwertBeschreibung
numberstringJa—Erforderlich, 3–32 Zeichen. ASCII-Ziffern, Leerzeichen, Klammern und Bindestriche, optional mit führendem +. Durchwahlen und Buchstaben werden nicht akzeptiert.
countrystringBedingt—ISO-3166-1-Alpha-2-Code in Großbuchstaben. Erforderlich für eine nationale Nummer; optional, wenn number mit + beginnt. Weglassen, wenn nicht benötigt.

Senden Sie number und optional country an POST https://api.genderapi.io/api/v2/phone/validate. Verwenden Sie eine internationale Nummer, die mit + beginnt, oder geben Sie für eine nationale Nummer einen ISO-Ländercode in Großbuchstaben an. GenderAPI.io V2 liefert data.valid, data.possible, data.e164, data.country und data.country_calling_code sowie meta für Zugang und Abrechnung. Geprüft wird die Struktur der Nummer, nicht ob ein Anschluss existiert. Jede abgeschlossene Validierung kostet 1 Credit, auch bei einem ungültigen Ergebnis. Die synthetische Antwort unten zeigt eine ungültige Nummer, unabhängig vom Anfragebeispiel.

Wählen Sie eine Programmiersprache. Richten Sie Ihren API-Schlüssel ein, und führen Sie dann das Beispiel auf Ihrem Server aus.

Jede Vorhersageanfrage ist ein neuer kostenpflichtiger Vorgang, auch bei Wiederholungen. Diese Beispiele wiederholen Anfragen nicht automatisch. Prüfen Sie den Abrechnungsstatus, bevor Sie eine weitere Anfrage senden.

Vor der Ausführung: Zugang und Fehlerbehandlung

Führen Sie diese Beispiele auf Ihrem Server aus. Setzen Sie GENDERAPI_API_KEY in der Prozessumgebung auf Ihren vorhandenen API-Schlüssel. Prüfen Sie, ob meta.access.mode den Wert api_key hat: Ein nicht erkannter Schlüssel kann in den IP-Testzugang wechseln.

Bei HTTP-4xx- und -5xx-Antworten im JSON-Format bleibt der Fehlerinhalt erhalten, und das Beispiel endet mit einem Exit-Status ungleich null. Prüfen Sie code, action und meta.usage.billing_status, bevor Sie die Anfrage wiederholen.

Anleitung zu Fehlern und Wiederholungen →
cURL
curl --silent --show-error --fail-with-body --max-time 30 \
  --request POST 'https://api.genderapi.io/api/v2/phone/validate' \
  --header "Authorization: Bearer ${GENDERAPI_API_KEY:?Set GENDERAPI_API_KEY}" \
  --header 'Content-Type: application/json' \
  --data '{
  "number": "+905321234567"
}'

cURL 7.76+ in einer POSIX-Shell. Im Terminal ausführen. Dokumentation der Laufzeitumgebung

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 = {
  "number": "+905321234567"
};

const response = await fetch("https://api.genderapi.io/api/v2/phone/validate", {
  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+; integriertes fetch. Als example.mjs speichern und node example.mjs ausführen. Dokumentation der Laufzeitumgebung

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("{\"number\":\"+905321234567\"}")

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/phone/validate",
    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+; Standardbibliothek. Als example.py speichern und python3 example.py ausführen. Dokumentation der Laufzeitumgebung

PHP
<?php
$apiKey = getenv('GENDERAPI_API_KEY');
if (!$apiKey) {
    throw new RuntimeException('Set GENDERAPI_API_KEY');
}
$body = json_decode('{"number":"+905321234567"}', true, 512, JSON_THROW_ON_ERROR);

$ch = curl_init('https://api.genderapi.io/api/v2/phone/validate');
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+ mit der cURL-Erweiterung. Als example.php speichern und php example.php ausführen. Dokumentation der Laufzeitumgebung

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 = "{\"number\":\"+905321234567\"}";
        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/phone/validate"))
            .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+; Standard-HTTP-Client. Als GenderApiExample.java speichern und java GenderApiExample.java ausführen. Dokumentation der Laufzeitumgebung

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/phone/validate");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
request.Content = new StringContent("{\"number\":\"+905321234567\"}", 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.
}

Konsolenanwendung mit .NET 8+. Als Program.cs in einem Konsolenprojekt verwenden und dann dotnet run ausführen. Dokumentation der Laufzeitumgebung

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 := "{\"number\":\"+905321234567\"}"
    request, err := http.NewRequest("POST", "https://api.genderapi.io/api/v2/phone/validate", 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+; Standardbibliothek. Als main.go speichern und go run main.go ausführen. Dokumentation der Laufzeitumgebung

Beispielhafte JSON-Antwort
{
  "data": {
    "valid": false,
    "possible": false,
    "e164": null,
    "country": null,
    "country_calling_code": null
  },
  "meta": {
    "request_id": "11111111-1111-4111-8111-111111111111",
    "duration_ms": 12,
    "access": {
      "mode": "ip_trial",
      "reason": "api_key_missing"
    },
    "usage": {
      "charged_credits": 1,
      "remaining_credits": 7,
      "billing_status": "confirmed",
      "resets_at": "2026-09-26T12:00:00.000Z",
      "limit": 10,
      "period_seconds": 86400
    }
  }
}

Felder der Telefonvalidierung lesen

Eine 422-Antwort weist fehlerhafte Eingaben vor der Abrechnung ab. Eine korrekt aufgebaute Anfrage, deren Nummer nicht geparst werden kann, kann mit HTTP 200, valid: false und null in den Formatierungsfeldern abgeschlossen werden; diese abgeschlossene Validierung kostet 1 Credit. Eine parsebare, aber ungültige Nummer kann trotzdem einen e164-Wert haben. Prüfen Sie valid, statt eine formatierte Ausgabe als Beleg für Gültigkeit zu werten.

FeldTypKann null seinBeispielBeschreibung
data.validbooleanNeinfalseOb die Nummer den Validierungsregeln des Nummernplans entspricht.
data.possiblebooleanNeinfalseOb die Nummer eine plausible Länge für ihren Nummernplan hat; schwächer als valid.
data.e164stringJanullInternational formatierte Nummer, wenn das Parsen gelingt, sonst null.
data.countrystringJanullAus der Nummer abgeleitete Region oder null, wenn nicht verfügbar; sie lokalisiert den Anschlussinhaber nicht.
data.country_calling_codeintegerJanullNumerische internationale Rufvorwahl oder null, wenn nicht verfügbar.

Zugang, Abrechnung und Anfragemetadaten

FeldTypKann null seinBeispielBeschreibung
meta.request_idstringNein"550e8400-e29b-41d4-a716-446655440000"Eindeutige Kennung dieses HTTP-Versuchs; auch in X-Request-ID enthalten.
meta.duration_msintegerNein42Bearbeitungszeit der Anfrage in Millisekunden.
meta.access.modestringNein"api_key"api_key, ip_trial oder unauthenticated. Prüfen Sie bei einem bezahlten Konto, ob api_key gemeldet wird.
meta.access.reasonstringJanullGrund für den Wechsel in den Testzugang: api_key_missing, api_key_invalid oder api_key_not_found; sonst null.
meta.usage.charged_creditsintegerJa1Netto abgebuchte Credits. 0 vor der Abbuchung oder nach einer bestätigten vollständigen Erstattung; null bei unbestätigter Abrechnung.
meta.usage.remaining_creditsintegerJa99Guthaben beim Abschluss des Vorgangs. Kann negativ sein; null, wenn nicht verfügbar oder die Abrechnung unbestätigt ist.
meta.usage.billing_statusstringNein"confirmed"not_charged, confirmed oder unconfirmed. Prüfen Sie dies, bevor Sie eine fehlgeschlagene Vorhersage wiederholen.
meta.usage.resets_atstringJa"2026-09-27T12:00:00.000Z"Zeitpunkt des Zurücksetzens des IP-Testzugangs in UTC (ISO 8601); null bei Konten mit API-Schlüssel oder wenn unbekannt.
meta.usage.limitintegerJa10Kontingent des IP-Testzugangs; null bei Konten mit API-Schlüssel.
meta.usage.period_secondsintegerJa86400Zeitfenster des IP-Testzugangs in Sekunden; null bei Konten mit API-Schlüssel.

Authentifizierung und Wiederholungen

Senden Sie Ihren vorhandenen API-Schlüssel im Bearer-Header und Content-Type: application/json. Die Codebeispiele lesen GENDERAPI_API_KEY aus der Umgebung. Nationale Nummern erfordern country; bei einer number, die mit + beginnt, ist dieses Feld optional.