تحقّق باستخدام GenderAPI.io V2 من بنية رقم هاتف انطلاقًا من number وcountry. اقرأ data.valid وdata.possible وحقول التنسيق والبيانات الوصفية للاستخدام.
التحقق من رقم هاتف وتنسيقه
المعامل
النوع
مطلوب
القيمة الافتراضية
الوصف
المعاملnumber
النوعstring
مطلوبنعم
القيمة الافتراضية—
الوصفمطلوب، 3–32 حرفًا. أرقام ASCII ومسافات وأقواس وشرطات، مع علامة + اختيارية في البداية. لا تُقبل الأرقام الداخلية (التحويلات) ولا الأحرف الأبجدية.
المعاملcountry
النوعstring
مطلوبمشروط
القيمة الافتراضية—
الوصفرمز ISO 3166-1 alpha-2 بأحرف كبيرة. مطلوب للرقم المحلي، واختياري عندما يبدأ number بـ +. احذفه إن لم تحتج إليه.
أرسل number، واختياريًا country، إلى POST https://api.genderapi.io/api/v2/phone/validate. استخدم رقمًا دوليًا يبدأ بـ +، أو أرسل رمز دولة ISO بأحرف كبيرة لرقم محلي. يعيد GenderAPI.io V2 الحقول data.valid وdata.possible وdata.e164 وdata.country وdata.country_calling_code، إضافةً إلى meta لمعلومات الوصول والخصم. يُتحقَّق من بنية الرقم، لا من وجود اشتراك فعلي. تكلفة كل عملية تحقق مكتملة رصيد واحد، حتى مع نتيجة غير صالحة. توضّح الاستجابة المُعدّة للتوضيح أدناه رقمًا غير صالح، بصرف النظر عن مثال الطلب.
كل طلب تقدير عملية جديدة مدفوعة، حتى عند إعادة المحاولة. لا تعيد هذه الأمثلة المحاولة تلقائيًا. تحقّق من حالة الخصم قبل إرسال طلب آخر.
قبل التشغيل: الوصول ومعالجة الأخطاء
شغّل هذه الأمثلة على خادمك. اضبط GENDERAPI_API_KEY في بيئة العملية على مفتاح API الحالي. تأكد من أن قيمة meta.access.mode هي api_key: فالمفتاح غير المعروف قد يؤدي إلى استخدام التجربة حسب عنوان IP.
في استجابات JSON ذات رموز HTTP 4xx و5xx، يُحتفظ بجسم الخطأ وينتهي المثال برمز خروج غير صفري. تحقّق من code وaction وmeta.usage.billing_status قبل إعادة المحاولة.
// 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+ مع fetch المدمج. احفظه باسم example.mjs وشغّل node example.mjs. وثائق بيئة التشغيل
Python
import jsonimport osimport sysimport urllib.errorimport urllib.requestapi_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 Nonerequest = 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+ مع المكتبة القياسية. احفظه باسم example.py وشغّل python3 example.py. وثائق بيئة التشغيل
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"); 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+ مع عميل 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.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.}
تطبيق وحدة تحكم (console) على .NET 8+. استخدمه كملف Program.cs في مشروع console، ثم شغّل dotnet run. وثائق بيئة التشغيل
Go
package mainimport ( "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+ مع المكتبة القياسية. احفظه باسم main.go وشغّل go run main.go. وثائق بيئة التشغيل
ترفض استجابة 422 المُدخل غير الصحيح البنية قبل الخصم. قد يكتمل الطلب الصحيح البنية الذي يتعذّر تحليل رقمه باستجابة HTTP 200 مع valid: false وقيمة null في حقول التنسيق؛ وتكلفة هذا التحقق المكتمل رصيد واحد. وقد يحمل الرقم القابل للتحليل لكنه غير صالح قيمة e164 مع ذلك. تحقّق من valid بدلًا من اعتبار المخرجات المنسقة دليلًا على الصلاحية.
الحقل
النوع
يمكن أن يكون null
مثال
الوصف
الحقلdata.valid
النوعboolean
يمكن أن يكون nullلا
مثالfalse
الوصفهل يطابق الرقم قواعد التحقق في خطة الترقيم.
الحقلdata.possible
النوعboolean
يمكن أن يكون nullلا
مثالfalse
الوصفهل طول الرقم معقول بالنسبة إلى خطة الترقيم؛ معيار أضعف من valid.
الحقلdata.e164
النوعstring
يمكن أن يكون nullنعم
مثالnull
الوصفالرقم بالتنسيق الدولي إذا نجح التحليل، وإلا null.
الحقلdata.country
النوعstring
يمكن أن يكون nullنعم
مثالnull
الوصفالمنطقة المستنتجة من الرقم، أو null إذا لم تتوفر؛ ولا تحدد موقع صاحب الخط.
الحقلdata.country_calling_code
النوعinteger
يمكن أن يكون nullنعم
مثالnull
الوصفرمز الاتصال الدولي الرقمي، أو null إذا لم يتوفر.
البيانات الوصفية للوصول والخصم والطلب
الحقل
النوع
يمكن أن يكون null
مثال
الوصف
الحقلmeta.request_id
النوعstring
يمكن أن يكون nullلا
مثال"550e8400-e29b-41d4-a716-446655440000"
الوصفمعرّف فريد لمحاولة HTTP هذه؛ ويُرسل أيضًا في X-Request-ID.
الحقلmeta.duration_ms
النوعinteger
يمكن أن يكون nullلا
مثال42
الوصفمدة معالجة الطلب بالمللي ثانية.
الحقلmeta.access.mode
النوعstring
يمكن أن يكون nullلا
مثال"api_key"
الوصفapi_key أو ip_trial أو unauthenticated. عند استخدام حساب مدفوع، تحقّق من ظهور api_key.
الحقلmeta.access.reason
النوعstring
يمكن أن يكون nullنعم
مثالnull
الوصفسبب الانتقال إلى التجربة حسب عنوان IP: api_key_missing أو api_key_invalid أو api_key_not_found؛ وإلا null.
الحقلmeta.usage.charged_credits
النوعinteger
يمكن أن يكون nullنعم
مثال1
الوصفصافي الأرصدة المخصومة. صفر قبل الخصم أو بعد استرداد كامل مؤكد؛ وnull إذا لم يُؤكَّد الخصم.
الحقلmeta.usage.remaining_credits
النوعinteger
يمكن أن يكون nullنعم
مثال99
الوصفالرصيد عند اكتمال العملية. قد يكون سالبًا؛ وnull إذا لم يتوفر أو لم يُؤكَّد الخصم.
الحقلmeta.usage.billing_status
النوعstring
يمكن أن يكون nullلا
مثال"confirmed"
الوصفnot_charged أو confirmed أو unconfirmed. تحقّق منه قبل إعادة محاولة تقدير فاشل.
الحقلmeta.usage.resets_at
النوعstring
يمكن أن يكون nullنعم
مثال"2026-09-27T12:00:00.000Z"
الوصفموعد تجديد التجربة حسب عنوان IP بتوقيت UTC (ISO 8601)؛ وnull لحسابات مفاتيح API أو إذا كان غير معروف.
الحقلmeta.usage.limit
النوعinteger
يمكن أن يكون nullنعم
مثال10
الوصفحصة التجربة حسب عنوان IP؛ وnull لحسابات مفاتيح API.
الحقلmeta.usage.period_seconds
النوعinteger
يمكن أن يكون nullنعم
مثال86400
الوصفمدة فترة التجربة حسب عنوان IP بالثواني؛ وnull لحسابات مفاتيح API.
المصادقة وإعادة المحاولة
أرسل مفتاح API الحالي في ترويسة Bearer مع Content-Type: application/json. تقرأ أمثلة الكود GENDERAPI_API_KEY من البيئة. تتطلب الأرقام المحلية country، وهذا الحقل اختياري عندما يبدأ number بـ +.