ΤΕΚΜΗΡΙΩΣΗ API V2

GenderAPI.io V2: επικύρωση και μορφοποίηση αριθμών τηλεφώνου

Ελέγξτε με το GenderAPI.io V2 τη δομή ενός αριθμού τηλεφώνου με βάση τα number και country. Διαβάστε τα data.valid, data.possible, τα πεδία μορφοποίησης και τα μεταδεδομένα χρήσης.

Επικύρωση και μορφοποίηση αριθμού τηλεφώνου

ΠαράμετροςΤύποςΥποχρεωτικόΠροεπιλογήΠεριγραφή
numberstringΝαι—Υποχρεωτικό, 3–32 χαρακτήρες. Ψηφία ASCII, κενά, παρενθέσεις και παύλες, με προαιρετικό + στην αρχή. Εσωτερικοί αριθμοί και γράμματα δεν γίνονται δεκτά.
countrystringΥπό προϋποθέσεις—Κωδικός 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 για την πρόσβαση και τη χρέωση. Ελέγχεται η δομή του αριθμού, όχι η ύπαρξη ενεργού συνδρομητή. Κάθε ολοκληρωμένη επικύρωση κοστίζει 1 πίστωση, ακόμη και με μη έγκυρο αποτέλεσμα. Η παρακάτω συνθετική απόκριση δείχνει έναν μη έγκυρο αριθμό, ανεξάρτητα από το παράδειγμα αιτήματος.

Επιλέξτε γλώσσα προγραμματισμού. Ρυθμίστε το κλειδί 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 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+ σε κέλυφος 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 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 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+ με την τυπική βιβλιοθήκη. Αποθηκεύστε ως example.py και εκτελέστε python3 example.py. Τεκμηρίωση του περιβάλλοντος εκτέλεσης

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+ με την επέκταση 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.
}

Εφαρμογή κονσόλας .NET 8+. Χρησιμοποιήστε το ως Program.cs σε ένα έργο κονσόλας και έπειτα εκτελέστε 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")
    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. Τεκμηρίωση του περιβάλλοντος εκτέλεσης

Παράδειγμα απόκρισης JSON
{
  "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
    }
  }
}

Ανάγνωση των πεδίων επικύρωσης τηλεφώνου

Μια απόκριση 422 απορρίπτει εσφαλμένα διαμορφωμένη είσοδο πριν από τη χρέωση. Ένα σωστά διαμορφωμένο αίτημα του οποίου ο αριθμός δεν μπορεί να αναλυθεί μπορεί να ολοκληρωθεί με HTTP 200, valid: false και null στα πεδία μορφοποίησης. Αυτή η ολοκληρωμένη επικύρωση κοστίζει 1 πίστωση. Ένας αριθμός που αναλύεται αλλά δεν είναι έγκυρος μπορεί να έχει και πάλι τιμή e164. Ελέγξτε το valid αντί να θεωρείτε μια μορφοποιημένη έξοδο απόδειξη εγκυρότητας.

ΠεδίοΤύποςΜπορεί να είναι nullΠαράδειγμαΠεριγραφή
data.validbooleanΌχιfalseΑν ο αριθμός τηρεί τους κανόνες επικύρωσης του σχεδίου αρίθμησης.
data.possiblebooleanΌχιfalseΑν ο αριθμός έχει εύλογο μήκος για το σχέδιο αρίθμησής του. Λιγότερο αυστηρό κριτήριο από το valid.
data.e164stringΝαιnullΑριθμός σε διεθνή μορφή όταν η ανάλυση επιτυγχάνει, διαφορετικά null.
data.countrystringΝαιnullΠεριοχή που προκύπτει από τον αριθμό ή null όταν δεν είναι διαθέσιμη. Δεν εντοπίζει τη θέση του κατόχου.
data.country_calling_codeintegerΝαιnullΑριθμητικός διεθνής κωδικός κλήσης ή null όταν δεν είναι διαθέσιμος.

Μεταδεδομένα πρόσβασης, χρέωσης και αιτήματος

ΠεδίοΤύποςΜπορεί να είναι 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.

Έλεγχος ταυτότητας και νέες προσπάθειες

Στείλτε το υπάρχον κλειδί API σας στην κεφαλίδα Bearer και Content-Type: application/json. Τα παραδείγματα κώδικα διαβάζουν το GENDERAPI_API_KEY από το περιβάλλον. Οι εθνικοί αριθμοί απαιτούν country. Το πεδίο είναι προαιρετικό όταν το number αρχίζει με +.