API DOKÜMANTASYONU V2

GenderAPI.io V2 ile e-postadan cinsiyet tahmini

GenderAPI.io V2 ile e-posta adresindeki isim ipuçlarından tahmin alın. İstek ve yanıt örneklerini, doğrulamayı, belirsiz sonuçları ve yapay zekâ seçeneklerini inceleyin.

İsteği göndermeden önce

POST https://api.genderapi.io/api/v2/gender adresine JSON gönderin. Authorization: Bearer YOUR_API_KEY başlığında mevcut anahtarınızı ve Content-Type: application/json kullanın. Her istek bağımsız işlenir.

Kod örneğinde dilinizi seçin. Çalıştırmadan önce GENDERAPI_API_KEY ortam değişkenini ayarlayın. Eksik veya tanınmayan anahtarlar ortak IP denemesini kullanabilir; hesap entegrasyonunda meta.access.mode değerinin api_key olduğunu doğrulayın.

E-posta adresinden cinsiyet tahmini

ParametreTürZorunluVarsayılanAçıklama
typestringEvet—Girdi türü: name, email veya username.
valuestringEvet—Zorunlu. 1–254 karakter; boş olamaz ve kontrol karakteri içeremez. E-posta değeri geçerli e-posta sözdizimine uymalıdır.
countrystringHayır—İsteğe bağlı, büyük harfli ISO 3166-1 alpha-2 kodu; örneğin TR veya US. Ülkeye özel sorgu, genel veri kümesine dönebilir.
forceToGenderizebooleanHayırfalseÖnce veri kümesine bakılır; sonuç bulunamazsa takma adları yorumlayan yapay zekâ kullanılır. name, email ve username için desteklenir.
optionsobjectHayır—Her girdiye ait yapay zekâ seçeneklerini içeren nesne.
options.ai_modestringHayırfallbackGeçerli değerler: off, fallback, always. forceToGenderize: true olduğunda bu alanı göndermeyin veya fallback kullanın.
idstringHayır—POST JSON içinde isteğe bağlı, 1–64 karakterlik kimlik. Her toplu sonuçta geri döner ve aynı toplu istekte benzersiz olmalıdır. Tekli sorguda kabul edilir ancak yanıtta yer almaz. GET sorgularında desteklenmez.

type: email kullanın. API, adreste kullanılabilir bir isim ipucu arar. Ortak posta kutuları ve anlamlı ipucu içermeyen yerel bölümler belirsiz sonuç verebilir. İsteğe bağlı forceToGenderize, gerçek ad bulunmasa bile takma addan yapay zekâ tahminine izin verir.

Programlama dilinizi seçin. API anahtarınızı ayarlayın, ardından örneği sunucunuzda çalıştırın.

Yeniden denemeler dahil her tahmin isteği yeni ve ücretlendirilebilir bir işlemdir. Örnekler otomatik yeniden deneme yapmaz. Yeni istekten önce ücretlendirme durumunu kontrol edin.

Çalıştırmadan önce: erişim ve hata yönetimi

Örnekleri sunucunuzda çalıştırın. İşlem ortamındaki GENDERAPI_API_KEY değişkenini mevcut anahtarınıza ayarlayın. Tanınmayan anahtar IP denemesine yönlenebildiğinden meta.access.mode değerinin api_key olduğunu doğrulayın.

HTTP 4xx ve 5xx JSON yanıtlarında hata gövdesi korunur ve program sıfırdan farklı çıkış koduyla sonlanır. Yeniden denemeden önce code, action ve meta.usage.billing_status alanlarını kontrol edin.

Hata ve yeniden deneme rehberi →
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": "email",
  "value": "alice.smith@example.com",
  "country": "US"
}'

POSIX kabuğunda cURL 7.76+. Terminalinizde çalıştırın. Çalıştırma ortamı dokümantasyonu

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": "email",
  "value": "alice.smith@example.com",
  "country": "US"
};

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+; yerleşik fetch. example.mjs olarak kaydedin ve node example.mjs çalıştırın. Çalıştırma ortamı dokümantasyonu

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\":\"email\",\"value\":\"alice.smith@example.com\",\"country\":\"US\"}")

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+; standart kütüphane. example.py olarak kaydedin ve python3 example.py çalıştırın. Çalıştırma ortamı dokümantasyonu

PHP
<?php
$apiKey = getenv('GENDERAPI_API_KEY');
if (!$apiKey) {
    throw new RuntimeException('Set GENDERAPI_API_KEY');
}
$body = json_decode('{"type":"email","value":"alice.smith@example.com","country":"US"}', 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.

cURL uzantılı PHP 8+. example.php olarak kaydedin ve php example.php çalıştırın. Çalıştırma ortamı dokümantasyonu

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\":\"email\",\"value\":\"alice.smith@example.com\",\"country\":\"US\"}";
        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+; standart HTTP istemcisi. GenderApiExample.java olarak kaydedin ve java GenderApiExample.java çalıştırın. Çalıştırma ortamı dokümantasyonu

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\":\"email\",\"value\":\"alice.smith@example.com\",\"country\":\"US\"}", 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.
}

.NET 8+ konsol uygulaması. Konsol projesinde Program.cs olarak kullanın, ardından dotnet run çalıştırın. Çalıştırma ortamı dokümantasyonu

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\":\"email\",\"value\":\"alice.smith@example.com\",\"country\":\"US\"}"
    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+; standart kütüphane. main.go olarak kaydedin ve go run main.go çalıştırın. Çalıştırma ortamı dokümantasyonu

Örnek yanıt

Bu, 1 Ekim 2026'da API anahtarıyla alınmış gerçek bir yanıttır; yalnızca hesap bakiyesi değiştirilmiştir. Doğruluk ölçüsü değildir ve canlı bir istek farklı bir sonuç döndürebilir. API anahtarlı isteklerde meta.access.mode: api_key döner ve yalnızca denemeye ait kota alanları null olur; IP denemesi isteklerinde ip_trial döner. Tahmini data, işlemin ücretlendirme sonucunu meta.usage içinde okuyun.

Temsili JSON yanıtı
{
  "data": {
    "input": {
      "type": "email",
      "value": "alice.smith@example.com",
      "country": "US"
    },
    "name": "alice",
    "gender": "female",
    "country": "US",
    "confidence": 0.9932550587059705,
    "confidence_kind": "observed_frequency",
    "sample_count": 4003,
    "source": "dataset",
    "result_status": "identified",
    "reason": null,
    "country_source": "dataset",
    "match": {
      "name": "alice",
      "method": "token",
      "scope": "country",
      "country": "US"
    }
  },
  "meta": {
    "request_id": "7c22993d-454f-4f61-8b4b-d1154d3b89ff",
    "duration_ms": 13,
    "access": {
      "mode": "api_key",
      "reason": null
    },
    "usage": {
      "charged_credits": 1,
      "remaining_credits": 49999,
      "billing_status": "confirmed",
      "resets_at": null,
      "limit": null,
      "period_seconds": null
    }
  }
}

Tahmin yanıtı alanları

AlanTürNull olabilir mi?ÖrnekAçıklama
data.inputobjectHayır{"type":"name","value":"Elif","country":"TR"}Girdi türü, değeri ve ülkesi. forceToGenderize, true olduğunda eklenir.
data.namestringEvet"elif"Eşleşen veya çıkarılan ad; bulunamıyorsa null.
data.genderstringEvet"male"male, female veya JSON null. Doğrulanmış kişisel kimlik değil, tahmindir.
data.result_statusstringHayır"identified"Cinsiyet döndürüldüğünde identified, diğer durumlarda unknown.
data.reasonstringEvetnullSonuç identified ise null. Bilinmeyen sonuç nedenleri: not_found, no_name_candidate, ambiguous veya insufficient_evidence.
data.confidencenumberEvet0.950–1 arası puan veya null. Cinsiyet null ise güven skoru da null’dır.
data.confidence_kindstringEvet"observed_frequency"observed_frequency: baskın veri kümesi sayısı / toplam. model_reported: yapay zekâ skoru; kalibre edilmiş olasılık değildir. Bilgi yoksa null.
data.sample_countintegerEvet1200Veri kümesindeki örnek sayısı veya null. Yapay zekâ örnek sayısı üretmez.
data.sourcestringHayır"dataset"dataset, ai veya none.
data.countrystringEvet"TR"Veri kümesi veya ai_association kaynaklı ülke ilişkisi; bilgi yoksa null. Vatandaşlık, ikamet veya etnik köken kanıtı değildir.
data.country_sourcestringEvet"dataset"Ülke ilişkilendirmesinin kaynağı: dataset, ai_association veya null.
data.matchobjectHayır{"name":"elif","method":"normalized","scope":"country","country":"TR"}Eşleşen isim, yöntem (normalized, token, substring veya model_inference), ülke/genel kapsam ve eşleşen ülke. Olmayan kanıt null’dır.

Erişim, ücretlendirme ve istek bilgileri

AlanTürNull olabilir mi?ÖrnekAçıklama
meta.request_idstringHayır"550e8400-e29b-41d4-a716-446655440000"Bu HTTP isteğinin benzersiz kimliği; X-Request-ID başlığında da gönderilir.
meta.duration_msintegerHayır42İsteğin milisaniye cinsinden işlenme süresi.
meta.access.modestringHayır"api_key"api_key, ip_trial veya unauthenticated. Hesap anahtarıyla erişimde api_key olduğunu doğrulayın.
meta.access.reasonstringEvetnullDenemeye geçiş nedeni: api_key_missing, api_key_invalid veya api_key_not_found; diğer durumlarda null.
meta.usage.charged_creditsintegerEvet1Net düşülen kredi. Ücretlendirme öncesinde veya tam iade doğrulandığında sıfırdır; ücretlendirme belirsizse null.
meta.usage.remaining_creditsintegerEvet99İşlem tamamlandığındaki bakiye. Negatif olabilir; bilgi alınamıyorsa veya ücretlendirme belirsizse null.
meta.usage.billing_statusstringHayır"confirmed"not_charged, confirmed veya unconfirmed. Başarısız bir tahmini yeniden denemeden önce kontrol edin.
meta.usage.resets_atstringEvet"2026-09-27T12:00:00.000Z"IP denemesinin UTC sıfırlanma zamanı (ISO 8601); API anahtarlı hesaplarda veya bilinmiyorsa null.
meta.usage.limitintegerEvet10IP denemesinin kredi hakkı; API anahtarlı hesaplarda null.
meta.usage.period_secondsintegerEvet86400IP denemesinin saniye cinsinden süresi; API anahtarlı hesaplarda null.

E-posta doğrulama ve isim ipuçları

value geçerli e-posta sözdizimine uymalıdır. Geçersiz sözdizimi ücretlendirmeden önce HTTP 422 döndürür. Sözdizimi kontrolü, posta kutusunun varlığını veya belirli bir kişiye ait olduğunu doğrulamaz.

Adresteki tanınabilir kişi adı veri kümesiyle eşleşebilir. Ortak, görev bazlı veya anlamlı isim içermeyen adreslerde gender: null dönebilir. Çözülemeyen tekli sorguda varsayılan normal AI fallback toplam 1 kredidir; başarıyla tamamlanan belirsiz sonuç da buna dahildir.

Veri kümesinde tahmin bulunamadığında takma ad odaklı tahmin için forceToGenderize: true kullanın. Veri kümesinde tahmin bulunursa 1, yapay zekâ kullanılırsa toplam 2 kredi alınır. Sonuç yine null olabilir. E-posta alan adı kişinin konumunun kanıtı değildir; ülkeyi yalnızca ilgili bilgi varsa gönderin.

İlgili rehberler