وثائق API V2

GenderAPI.io V2: الأرصدة والخصم والاستخدام

تحقّق من رصيد GenderAPI.io المشترك بين V1 وV2. تعرّف على الرجوع العادي إلى الذكاء الاصطناعي، والتفسير القسري للأسماء المستعارة، والنتائج غير المعروفة المدفوعة، والاسترداد، وتجديد التجربة حسب عنوان IP.

الأرصدة والنتائج غير المعروفة والاستخدام

تُخصم النتيجة الناجحة التي يكون فيها gender هو null وفق تكلفة الوضع المختار. تكلفة التحقق من رقم الهاتف رصيد واحد حتى عندما تكون قيمة valid هي false. لا تستهلك أخطاء التحقق السابقة للخصم والتقديرات الفاشلة أي أرصدة بعد تأكيد الاسترداد.

يكفي رصيد ابتدائي موجب لبدء عملية فردية أو طلب مجمّع. قد يجعل الخصم النهائي الرصيد سالبًا: رصيد ابتدائي قدره 1 ناقص عملية ذكاء اصطناعي تكلفتها 2 يترك -1. يمنع الرصيد الصفري أو السالب العمليات المدفوعة الجديدة. ويظل الاسترداد ممكنًا.

اقرأ meta.usage.billing_status: تعني not_charged عدم وجود خصم (charged_credits: 0)؛ وتعني confirmed أن صافي الخصم معروف؛ وتعني unconfirmed أن قيمة charged_credits هي null وأن النتيجة تحتاج إلى تحقق. قد تكون remaining_credits سالبة، أو null إذا لم تتوفر. وهي لقطة لحظة الاكتمال وقد تتغير بسبب الطلبات المتزامنة.

GET /usage مجاني. يعيد remaining_credits وexpires_at، وكذلك resets_at وlimit وperiod_seconds للتجربة حسب عنوان IP. حد التجربة 10 وقيمة period_seconds هي 86400؛ وتكون هذه الحقول null لحسابات مفاتيح API. لا يمثّل resets_at موعد انتهاء اشتراك.

يتشارك V1 وV2 الرصيد نفسه. قد تتزامن تحديثات الرصيد التي يجريها V1 مع V2 وتتعارض معها؛ فلا تعتمد على ضمان خصم يحدث مرة واحدة بالضبط عبر الإصدارين.

مثال على استجابة 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
    }
  }
}

التحقق من الرصيد الحالي

GET /api/v2/usage مجاني، ويستخدم مصادقة Bearer دون معاملات استعلام. من دون مفتاح، تُقرأ الحصة الحالية للتجربة حسب عنوان IP.

اختر لغة البرمجة. إعداد مفتاح API، ثم شغّل المثال على خادمك.

لا تستهلك قراءة الرصيد هذه أي أرصدة، لكنها تُحتسب ضمن حدود معدل الطلبات.

قبل التشغيل: الوصول ومعالجة الأخطاء

شغّل هذه الأمثلة على خادمك. اضبط GENDERAPI_API_KEY في بيئة العملية على مفتاح API الحالي. تأكد من أن قيمة meta.access.mode هي api_key: فالمفتاح غير المعروف قد يؤدي إلى استخدام التجربة حسب عنوان IP.

في استجابات JSON ذات رموز HTTP 4xx و5xx، يُحتفظ بجسم الخطأ وينتهي المثال برمز خروج غير صفري. تحقّق من code وaction وmeta.usage.billing_status قبل إعادة المحاولة.

دليل الأخطاء وإعادة المحاولة ←
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+ في واجهة أوامر POSIX. شغّله في الطرفية. وثائق بيئة التشغيل

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 المدمج. احفظه باسم example.mjs وشغّل node example.mjs. وثائق بيئة التشغيل

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+ مع المكتبة القياسية. احفظه باسم example.py وشغّل python3 example.py. وثائق بيئة التشغيل

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+ مع امتداد cURL. احفظه باسم example.php وشغّل php example.php. وثائق بيئة التشغيل

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+ مع عميل HTTP القياسي. احفظه باسم GenderApiExample.java وشغّل java GenderApiExample.java. وثائق بيئة التشغيل

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

تطبيق وحدة تحكم (console) على .NET 8+. استخدمه كملف Program.cs في مشروع console، ثم شغّل dotnet run. وثائق بيئة التشغيل

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+ مع المكتبة القياسية. احفظه باسم main.go وشغّل go run main.go. وثائق بيئة التشغيل

حقول استجابة الرصيد

الحقلالنوعيمكن أن يكون nullمثالالوصف
data.remaining_creditsintegerلا99الرصيد الحالي للحساب أو للتجربة حسب عنوان IP؛ وقد يكون سالبًا.
data.expires_atstringنعمnullموعد انتهاء صلاحية الحساب أو التجربة بتوقيت UTC (ISO 8601)، إن توفر.
data.resets_atstringنعم"2026-09-27T12:00:00.000Z"موعد تجديد التجربة حسب عنوان IP بتوقيت UTC (ISO 8601)؛ وnull لحسابات مفاتيح API أو إذا كان غير معروف.
data.limitintegerنعم10حصة التجربة حسب عنوان IP؛ وnull لحسابات مفاتيح API.
data.period_secondsintegerنعم86400مدة فترة التجربة حسب عنوان IP بالثواني؛ وnull لحسابات مفاتيح API.

البيانات الوصفية للوصول والخصم والطلب

الحقلالنوعيمكن أن يكون nullمثالالوصف
meta.request_idstringلا"550e8400-e29b-41d4-a716-446655440000"معرّف فريد لمحاولة HTTP هذه؛ ويُرسل أيضًا في X-Request-ID.
meta.duration_msintegerلا42مدة معالجة الطلب بالمللي ثانية.
meta.access.modestringلا"api_key"api_key أو ip_trial أو unauthenticated. عند استخدام حساب مدفوع، تحقّق من ظهور api_key.
meta.access.reasonstringنعمnullسبب الانتقال إلى التجربة حسب عنوان IP: api_key_missing أو api_key_invalid أو api_key_not_found؛ وإلا null.
meta.usage.charged_creditsintegerنعم1صافي الأرصدة المخصومة. صفر قبل الخصم أو بعد استرداد كامل مؤكد؛ وnull إذا لم يُؤكَّد الخصم.
meta.usage.remaining_creditsintegerنعم99الرصيد عند اكتمال العملية. قد يكون سالبًا؛ وnull إذا لم يتوفر أو لم يُؤكَّد الخصم.
meta.usage.billing_statusstringلا"confirmed"not_charged أو confirmed أو unconfirmed. تحقّق منه قبل إعادة محاولة تقدير فاشل.
meta.usage.resets_atstringنعم"2026-09-27T12:00:00.000Z"موعد تجديد التجربة حسب عنوان IP بتوقيت UTC (ISO 8601)؛ وnull لحسابات مفاتيح API أو إذا كان غير معروف.
meta.usage.limitintegerنعم10حصة التجربة حسب عنوان IP؛ وnull لحسابات مفاتيح API.
meta.usage.period_secondsintegerنعم86400مدة فترة التجربة حسب عنوان IP بالثواني؛ وnull لحسابات مفاتيح API.