Διαβάστε το κοινόχρηστο υπόλοιπο GenderAPI και κατανοήστε το κόστος πίστωσης v2, τα χρεώσιμα άγνωστα στοιχεία, τις επιστροφές χρημάτων, τα αρνητικά υπόλοιπα και τους χρόνους επαναφοράς της δοκιμαστικής περιόδου IP.
Πιστώσεις, άγνωστα αποτελέσματα και χρήση
Μια ολοκληρωμένη πρόβλεψη με το gender: null κοστίζει πιστώσεις σύμφωνα με την επιλεγμένη λειτουργία. Η επικύρωση τηλεφώνου κοστίζει 1 πίστωση ακόμα και όταν valid: false. Τα σφάλματα επικύρωσης εισόδου πριν από τη χρέωση δεν κοστίζουν πιστώσεις. Οι αποτυχημένες προβλέψεις δεν κοστίζουν πιστώσεις μετά από επιβεβαιωμένη επιστροφή χρημάτων.
Ένα θετικό αρχικό υπόλοιπο αρκεί για να ξεκινήσει ένα μόνο αίτημα ή μια παρτίδα. Η τελική αφαίρεση μπορεί να κάνει το υπόλοιπο αρνητικό. Για παράδειγμα, ξεκινώντας με 1 πίστωση και χρησιμοποιώντας μια λειτουργία τεχνητής νοημοσύνης που κοστίζει 2 μονάδες αφήνει ένα υπόλοιπο -1. Ένα μηδενικό ή αρνητικό υπόλοιπο αποτρέπει νέες πράξεις που κοστίζουν πιστώσεις. Οι επιστροφές χρημάτων παραμένουν δυνατές.
Ελέγξτε το meta.usage.billing_status. Η τιμή not_charged σημαίνει ότι δεν αφαιρέθηκαν πιστώσεις και charged_credits: 0. Η τιμή confirmed σημαίνει ότι το τελικό κόστος είναι γνωστό. Η τιμή unconfirmed σημαίνει ότι το charged_credits είναι null και το αποτέλεσμα της χρέωσης χρειάζεται έλεγχο. Το remaining_credits μπορεί να είναι αρνητικό ή το null εάν δεν είναι διαθέσιμο. Αυτό το υπόλοιπο καταγράφεται όταν ολοκληρωθεί η λειτουργία και μπορεί να αλλάξει όταν εκτελούνται άλλα αιτήματα ταυτόχρονα.
GET /χρήση είναι δωρεάν. Επιστρέφει τα remaining_credits και expires_at. Για τη δοκιμή IP, επιστρέφει επίσης τα resets_at, limit και period_seconds. Το δοκιμαστικό όριο είναι 10 μονάδες και η περίοδος είναι 86400 δευτερόλεπτα. Αυτά τα πεδία μόνο δοκιμής είναι null για λογαριασμούς κλειδιού API. Το resets_at είναι ο δοκιμαστικός χρόνος επαναφοράς και όχι η ημερομηνία λήξης της συνδρομής.
Τα V1 και v2 χρησιμοποιούν το ίδιο πιστωτικό υπόλοιπο. Οι ταυτόχρονες ενημερώσεις υπολοίπου από το v1 και το v2 ενδέχεται να έρχονται σε διένεξη. Μην υποθέσετε ότι η χρέωση είναι εγγυημένη ότι θα πραγματοποιηθεί ακριβώς μία φορά και στις δύο εκδόσεις.
GET Το /api/v2/usage είναι δωρεάν και λαμβάνει έλεγχο ταυτότητας Bearer, χωρίς παραμέτρους ερωτήματος. Η παράλειψη ενός κλειδιού διαβάζει την τρέχουσα δοκιμαστική αποζημίωση IP.
Επιλέξτε γλώσσα προγραμματισμού.Ρυθμίστε το κλειδί API, και μετά εκτελέστε το παράδειγμα στον διακομιστή σας.
Αυτή η ανάγνωση υπολοίπου δεν κοστίζει πιστώσεις. Εξακολουθεί να μετράει στα όρια ποσοστού αιτήματος.
Πριν την εκτέλεση: πρόσβαση και διαχείριση σφαλμάτων
Εκτελέστε αυτά τα παραδείγματα στον διακομιστή σας. Ρυθμίστε το GENDERAPI_API_KEY στο περιβάλλον διεργασίας στο υπάρχον κλειδί API. Επιβεβαιώστε ότι το meta.access.mode είναι api_key: ένα μη αναγνωρισμένο κλειδί μπορεί να επιστρέψει στη δοκιμή IP.
Οι αποκρίσεις HTTP 4xx και 5xx JSON διατηρούν το σώμα σφάλματος και επιστρέφουν μια κατάσταση εξόδου μη μηδενική. Ελέγξτε τα 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 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+; ενσωματωμένη ανάκτηση. Αποθηκεύστε ως 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")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/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 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.}
Εφαρμογή κονσόλας .NET 8+. Χρησιμοποιήστε το ως Program.cs σε ένα έργο κονσόλας και, στη συνέχεια, εκτελέστε το 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") 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. Τεκμηρίωση χρόνου εκτέλεσης