GenderAPI.io V2: Autentisering och kostnadsfri provperiod
Använd din befintliga GenderAPI.io-nyckel med Bearer-autentisering. Förstå det gemensamma saldot för V1 och V2, IP-provperioden och hur du kontrollerar åtkomsten.
Autentisering och den kostnadsfria provperioden
Parameter
Typ
Obligatorisk
Standardvärde
Beskrivning
ParameterAuthorization
Typstring
ObligatoriskNej
Standardvärde—
BeskrivningSkicka Bearer YOUR_API_KEY för att använda ett konto. Nycklar som saknas eller är okända använder den delade IP-provperioden.
ParameterContent-Type
Typstring
ObligatoriskEndast POST
Standardvärde—
BeskrivningSkicka application/json för POST-förfrågningar.
Skicka Authorization: Bearer YOUR_API_KEY från din server. Ersätt YOUR_API_KEY med din befintliga GenderAPI.io-nyckel. Båda versionerna använder samma saldo; ingen separat V2-prenumeration eller V2-nyckel behövs.
Alla POST-förfrågningar kräver Content-Type: application/json. Använd din befintliga API-nyckel i Bearer-rubriken. Varje förfrågan behandlas separat, och upprepade förfrågningar debiteras som vanligt.
Endast GET /gender accepterar dessutom frågeparametern key. Använd hellre Authorization-rubriken i integrationer, eftersom URL:er kan sparas i webbläsarhistorik och loggar. Lägg aldrig privata nycklar i frontendkod.
En nyckel som saknas, har fel format eller inte känns igen leder till IP-provperioden, som delas med V1. En känd nyckel som är inaktiverad, har gått ut eller är begränsad gör det inte. Kontrollera meta.access.mode: api_key, ip_trial eller unauthenticated. Orsaken till provperioden är api_key_missing, api_key_invalid eller api_key_not_found. En ogiltig nyckel kan alltså ge ett lyckat svar via provperioden, så kontrollera åtkomstläget i produktion.
Provkrediterna återställs efter en period på 24 timmar, inte nödvändigtvis vid midnatt. Läs resets_at via /usage. Alla som använder samma offentliga IP-adress delar på kvoten.
Kopiera API-nyckeln från ditt GenderAPI.io-konto. Ersätt YOUR_API_KEY nedan med nyckeln och kör sedan det valda exemplet i samma terminalsession. Kommandona sätter en miljövariabel enbart för den sessionen; den publicerade platshållaren är ingen fungerande nyckel.
För en applikation eller driftsättning konfigurerar du GENDERAPI_API_KEY som en hemlighet på serversidan. Exemplen läser inte in någon .env-fil automatiskt. Håll nyckeln borta från webbläsarpaket, versionshantering och offentliga URL:er.
Terminal i macOS/Linux
export GENDERAPI_API_KEY='YOUR_API_KEY'
Windows PowerShell
$env:GENDERAPI_API_KEY = 'YOUR_API_KEY'
Kontrollera åtkomsten utan att förbruka krediter
Anropa GET /usage med Bearer-rubriken. En giltig kontonyckel ger meta.access.mode: api_key. Om resultatet är ip_trial kontrollerar du den kopierade nyckeln innan du begär prediktioner. Förfrågan är kostnadsfri, även för ett konto utan kvarvarande krediter.
Den här saldokontrollen kostar inga krediter, men den räknas mot gränserna för antal förfrågningar.
Innan du kör: åtkomst och felhantering
Kör exemplen på din server. Sätt GENDERAPI_API_KEY i processmiljön till din befintliga API-nyckel. Kontrollera att meta.access.mode är api_key: en nyckel som inte känns igen kan leda till IP-provperioden.
Vid JSON-svar med HTTP 4xx och 5xx behålls felinnehållet och exemplet avslutas med en slutstatus som inte är noll. Kontrollera code, action och meta.usage.billing_status innan du försöker igen.
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+; standardbiblioteket. Spara som example.py och kör python3 example.py. Dokumentation för körmiljön
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+; inbyggd HTTP-klient. Spara som GenderApiExample.java och kör java GenderApiExample.java. Dokumentation för körmiljön
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.}
Konsolapplikation med .NET 8+. Använd som Program.cs i ett konsolprojekt och kör sedan dotnet run. Dokumentation för körmiljön
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) }}