Xác thực và định dạng số điện thoại quốc tế hoặc trong nước với GenderAPI.io V2. Xem ngữ cảnh quốc gia bắt buộc, các trường JSON và mức phí một tín dụng.
Xác thực và định dạng số điện thoại
Tham số
Kiểu
Bắt buộc
Mặc định
Mô tả
Tham sốnumber
Kiểustring
Bắt buộcCó
Mặc định—
Mô tảBắt buộc, 3–32 ký tự. Chữ số ASCII, dấu cách, dấu ngoặc đơn và dấu gạch nối, có thể bắt đầu bằng dấu +. Không chấp nhận số máy lẻ và chữ cái.
Tham sốcountry
Kiểustring
Bắt buộcCó điều kiện
Mặc định—
Mô tảMã ISO 3166-1 alpha-2 viết hoa. Bắt buộc với số trong nước; tùy chọn khi number bắt đầu bằng +. Bỏ qua nếu không dùng.
POST /phone/validate nhận number và country tùy chọn. Dùng số quốc tế bắt đầu bằng +, hoặc gửi mã quốc gia ISO viết hoa cho số trong nước. Phản hồi chứa valid, possible, e164, country và country_calling_code bên trong data, cùng phần meta giống các endpoint khác. Endpoint này kiểm tra cấu trúc số, không kiểm tra thuê bao có tồn tại hay không. Mỗi lần xác thực hoàn tất tốn 1 tín dụng, kể cả khi kết quả không hợp lệ. Phản hồi mô phỏng bên dưới minh họa một số không hợp lệ, độc lập với ví dụ yêu cầu.
Chọn ngôn ngữ lập trình.Thiết lập khóa API, sau đó chạy ví dụ trên máy chủ của bạn.
Mỗi yêu cầu dự đoán là một thao tác mới bị tính phí, kể cả khi thử lại. Các ví dụ này không tự động thử lại. Kiểm tra trạng thái tính phí trước khi gửi yêu cầu khác.
Trước khi chạy: quyền truy cập và xử lý lỗi
Chạy các ví dụ này trên máy chủ của bạn. Đặt GENDERAPI_API_KEY trong biến môi trường của tiến trình bằng khóa API hiện có. Xác nhận meta.access.mode là api_key: khóa không được nhận diện có thể chuyển sang dùng thử theo IP.
Với phản hồi JSON HTTP 4xx và 5xx, ví dụ giữ nguyên nội dung lỗi và kết thúc với mã thoát khác 0. Kiểm tra code, action và meta.usage.billing_status trước khi thử lại.
// 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 tích hợp sẵn. Lưu thành example.mjs và chạy node example.mjs. Tài liệu môi trường chạy
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+; thư viện chuẩn. Lưu thành example.py và chạy python3 example.py. Tài liệu môi trường chạy
PHP 8+ với tiện ích mở rộng cURL. Lưu thành example.php và chạy php example.php. Tài liệu môi trường chạy
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 client chuẩn. Lưu thành GenderApiExample.java và chạy java GenderApiExample.java. Tài liệu môi trường chạy
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.}
Ứng dụng console .NET 8+. Dùng làm Program.cs trong một dự án console, sau đó chạy dotnet run. Tài liệu môi trường chạy
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) }}
Phản hồi 422 từ chối đầu vào sai định dạng trước khi tính phí. Một yêu cầu đúng định dạng nhưng không phân tích được số có thể hoàn tất với HTTP 200, valid: false và null ở các trường định dạng; lần xác thực đã hoàn tất đó tốn 1 tín dụng. Một số phân tích được nhưng không hợp lệ vẫn có thể có giá trị e164. Hãy kiểm tra valid thay vì coi kết quả đã định dạng là bằng chứng số hợp lệ.
Trường
Kiểu
Có thể là null
Ví dụ
Mô tả
Trườngdata.valid
Kiểuboolean
Có thể là nullKhông
Ví dụfalse
Mô tảSố có khớp với quy tắc xác thực của kế hoạch đánh số hay không.
Trườngdata.possible
Kiểuboolean
Có thể là nullKhông
Ví dụfalse
Mô tảSố có độ dài hợp lý với kế hoạch đánh số hay không; tiêu chí này lỏng hơn valid.
Trườngdata.e164
Kiểustring
Có thể là nullCó
Ví dụnull
Mô tảSố ở định dạng quốc tế khi phân tích thành công; nếu không thì null.
Trườngdata.country
Kiểustring
Có thể là nullCó
Ví dụnull
Mô tảKhu vực suy ra từ số, hoặc null khi không có; trường này không định vị thuê bao.
Trườngdata.country_calling_code
Kiểuinteger
Có thể là nullCó
Ví dụnull
Mô tảMã gọi quốc tế dạng số, hoặc null khi không có.
Siêu dữ liệu về truy cập, tính phí và yêu cầu
Trường
Kiểu
Có thể là null
Ví dụ
Mô tả
Trườngmeta.request_id
Kiểustring
Có thể là nullKhông
Ví dụ"550e8400-e29b-41d4-a716-446655440000"
Mô tảMã định danh duy nhất của lần gửi HTTP này; cũng được gửi trong X-Request-ID.
Trườngmeta.duration_ms
Kiểuinteger
Có thể là nullKhông
Ví dụ42
Mô tảThời gian xử lý yêu cầu tính bằng mili giây.
Trườngmeta.access.mode
Kiểustring
Có thể là nullKhông
Ví dụ"api_key"
Mô tảapi_key, ip_trial hoặc unauthenticated. Khi dùng tài khoản trả phí, hãy kiểm tra giá trị là api_key.
Trườngmeta.access.reason
Kiểustring
Có thể là nullCó
Ví dụnull
Mô tảLý do chuyển sang dùng thử: api_key_missing, api_key_invalid hoặc api_key_not_found; trường hợp khác là null.
Trườngmeta.usage.charged_credits
Kiểuinteger
Có thể là nullCó
Ví dụ1
Mô tảSố tín dụng thực tính. Bằng 0 trước khi tính phí hoặc sau khi hoàn trả toàn bộ đã được xác nhận; null khi việc tính phí chưa được xác nhận.
Trườngmeta.usage.remaining_credits
Kiểuinteger
Có thể là nullCó
Ví dụ99
Mô tảSố dư khi thao tác hoàn tất. Có thể âm; null khi không có thông tin hoặc việc tính phí chưa được xác nhận.
Trườngmeta.usage.billing_status
Kiểustring
Có thể là nullKhông
Ví dụ"confirmed"
Mô tảnot_charged, confirmed hoặc unconfirmed. Kiểm tra trường này trước khi thử lại một dự đoán thất bại.
Trườngmeta.usage.resets_at
Kiểustring
Có thể là nullCó
Ví dụ"2026-09-27T12:00:00.000Z"
Mô tảThời điểm đặt lại dùng thử theo IP, theo UTC (ISO 8601); null với tài khoản dùng khóa API hoặc khi chưa biết.
Trườngmeta.usage.limit
Kiểuinteger
Có thể là nullCó
Ví dụ10
Mô tảHạn mức dùng thử theo IP; null với tài khoản dùng khóa API.
Trườngmeta.usage.period_seconds
Kiểuinteger
Có thể là nullCó
Ví dụ86400
Mô tảChu kỳ dùng thử theo IP tính bằng giây; null với tài khoản dùng khóa API.
Xác thực và thử lại
Gửi khóa API hiện có trong tiêu đề Bearer và Content-Type: application/json. Các ví dụ mã đọc GENDERAPI_API_KEY từ biến môi trường. Số trong nước cần country; trường này là tùy chọn khi number bắt đầu bằng +.