Continua → Panoramica

Riferimento REST API

Quattro endpoint, una struttura di risposta. Tutto sotto è attivo sul tuo account.

https://namegender.com/api Registrati gratis

Avvio rapido

Crea una chiave nella tua dashboard, poi invia la tua prima richiesta. Non è necessario alcun SDK.

curl "https://namegender.com/api?name=Ay%C5%9Fe&country=TR" \
  -H "Authorization: Bearer YOUR_API_KEY"
<?php

$query = http_build_query(['name' => 'Ayşe', 'country' => 'TR']);

$ch = curl_init('https://namegender.com/api?' . $query);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer YOUR_API_KEY'],
]);

$result = json_decode(curl_exec($ch), true);

echo $result['gender'];       // female
echo $result['probability'];  // 100
const params = new URLSearchParams({ name: 'Ayşe', country: 'TR' });

const response = await fetch(`https://namegender.com/api?${params}`, {
  headers: { Authorization: 'Bearer YOUR_API_KEY' },
});

const result = await response.json();

console.log(result.gender);       // "female"
console.log(result.probability);  // 100
import requests

response = requests.get(
    "https://namegender.com/api",
    params={"name": "Ayşe", "country": "TR"},
    headers={"Authorization": "Bearer YOUR_API_KEY"},
)

result = response.json()
print(result["gender"])       # female
print(result["probability"])  # 100
require "net/http"
require "json"

uri = URI("https://namegender.com/api")
uri.query = URI.encode_www_form(name: "Ayşe", country: "TR")

request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer YOUR_API_KEY"

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end

puts JSON.parse(response.body)["gender"]   # female
req, _ := http.NewRequest("GET", "https://namegender.com/api?name=Ay%C5%9Fe&country=TR", nil)
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")

resp, err := http.DefaultClient.Do(req)
if err != nil {
    log.Fatal(err)
}
defer resp.Body.Close()

var result struct {
    Gender      string `json:"gender"`
    Probability int    `json:"probability"`
}
json.NewDecoder(resp.Body).Decode(&result)

fmt.Println(result.Gender)   // female

Ogni endpoint restituisce la stessa struttura, quindi puoi cambiare input senza modificare il codice di parsing.

Autenticazione

Passa la tua chiave API in uno di tre modi. L'intestazione Authorization è consigliata: le stringhe di query finiscono nei log del server e nella cronologia del browser.

Intestazione Authorization (consigliato)
Authorization: Bearer ng_live_xxxxxxxxxxxx
Intestazione personalizzata
X-Api-Key: ng_live_xxxxxxxxxxxx
Parametro di query
https://namegender.com/api?name=Ayşe&key=ng_live_xxxxxxxxxxxx
Non esporre mai la tua chiave nel codice lato client. Le chiamate da un browser o app mobile devono passare attraverso il tuo backend.

Puoi limitare una chiave a indirizzi IP specifici dalla dashboard.

Librerie client

Un'API, quattro tipi di input e strumenti bulk che gestiscono file con cui altri servizi faticano.

Visualizza tutto
GET · POST https://namegender.com/api

Genere da nome

Accetta un nome o un nome completo. I titoli, i nomi centrali e i cognomi vengono eliminati prima della ricerca, quindi "Dr. Ayşe Yılmaz" e "Ayşe" danno la stessa risposta.

Parametro Tipo Descrizione
name
obbligatorio
string Il nome da classificare. Nome o nome completo.
country
facoltativo
string Codice paese ISO 3166-1 alpha-2. Migliora l'accuratezza per i nomi il cui genere varia per regione, come Andrea (maschile in Italia, femminile in Germania).
askToAI
facoltativo
boolean Ricadi a un modello linguistico quando il nome non è nel database. Costa un credito aggiuntivo.
forceToGenderize
facoltativo
boolean Restituisci il genere più probabile anche quando la confidenza è sotto la soglia. Disattivato per impostazione predefinita, perché una risposta al 50% presentata come certa è peggio di nessuna risposta.
curl "https://namegender.com/api?name=Jordan" \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "status": true,
  "used_credits": 1,
  "remaining_credits": 49999,
  "expires": null,
  "q": "Jordan",
  "name": "Jordan",
  "gender": "male",
  "country": null,
  "total_names": 62240,
  "probability": 84,
  "confidence": "high",
  "duration": "1ms",
  "source": "db",
  "matched_as": null
}
GET · POST https://namegender.com/api/email

Genere da email

Estrae la persona dalla parte locale dell'indirizzo, poi classifica quella. "ayse.yilmaz84@example.com" si risolve in Ayşe.

Parametro Tipo Descrizione
email
obbligatorio
string L'indirizzo email. Viene utilizzata solo la parte prima di @.
country
facoltativo
string Codice paese ISO 3166-1 alpha-2. Migliora l'accuratezza per i nomi il cui genere varia per regione, come Andrea (maschile in Italia, femminile in Germania).
askToAI
facoltativo
boolean Ricadi a un modello linguistico quando il nome non è nel database. Costa un credito aggiuntivo.

forceToGenderize non è disponibile qui: il nome viene estratto internamente, quindi forzare un risultato su un'estrazione incerta compone due supposizioni.

curl "https://namegender.com/api/email?email=ayse.yilmaz84%40example.com" \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "status": true,
  "q": "ayse.yilmaz84@example.com",
  "name": "Ayse",
  "gender": "female",
  "probability": 95,
  "confidence": "unverified",
  "total_names": 655,
  "duration": "1ms",
  "source": "db"
}
GET · POST https://namegender.com/api/username

Genere da username

Gestisce camelCase, snake_case, cifre finali e segni @ iniziali. "AyseYilmaz84" si risolve in Ayşe.

Parametro Tipo Descrizione
username
obbligatorio
string Lo username o handle. Un @ iniziale viene ignorato.
country
facoltativo
string Codice paese ISO 3166-1 alpha-2. Migliora l'accuratezza per i nomi il cui genere varia per regione, come Andrea (maschile in Italia, femminile in Germania).
askToAI
facoltativo
boolean Ricadi a un modello linguistico quando il nome non è nel database. Costa un credito aggiuntivo.
forceToGenderize
facoltativo
boolean Restituisci il genere più probabile anche quando la confidenza è sotto la soglia. Disattivato per impostazione predefinita, perché una risposta al 50% presentata come certa è peggio di nessuna risposta.
curl "https://namegender.com/api/username?username=AyseYilmaz84" \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "status": true,
  "q": "AyseYilmaz84",
  "name": "Ayse",
  "gender": "female",
  "probability": 95,
  "confidence": "unverified",
  "source": "db"
}
POST https://namegender.com/api/bulk

Richiesta in blocco

Invia fino a 100 nomi in una richiesta. Usa questo invece di fare un ciclo: una chiamata in blocco per 100 nomi è un singolo round trip e una singola ricerca deduplicata.

Parametro Tipo Descrizione
names
obbligatorio
string[] Array di nomi. Massimo 100 elementi.
type
facoltativo
string Cosa sono gli elementi: nome, email o username. Predefinito su nome.
country
facoltativo
string Applicato a ogni elemento nella richiesta.
curl -X POST "https://namegender.com/api/bulk" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"names": ["Ayşe", "Mehmet", "Priya", "Wei"]}'
<?php

$ch = curl_init('https://namegender.com/api/bulk');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'names' => ['Ayşe', 'Mehmet', 'Priya', 'Wei'],
    ]),
]);

$data = json_decode(curl_exec($ch), true);

foreach ($data['results'] as $row) {
    printf("%-8s %-7s %d%%\n", $row['q'], $row['gender'] ?? '?', $row['probability']);
}
const response = await fetch('https://namegender.com/api/bulk', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ names: ['Ayşe', 'Mehmet', 'Priya', 'Wei'] }),
});

const { results, summary } = await response.json();

console.log(summary.match_rate);   // 100
results.forEach(r => console.log(r.q, r.gender, r.probability));
import requests

response = requests.post(
    "https://namegender.com/api/bulk",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json={"names": ["Ayşe", "Mehmet", "Priya", "Wei"]},
)

data = response.json()
print(data["summary"]["match_rate"])   # 100

for row in data["results"]:
    print(row["q"], row["gender"], row["probability"])
{
  "status": true,
  "used_credits": 4,
  "remaining_credits": 49995,
  "duration": "2ms",
  "summary": {
    "total": 4,
    "identified": 4,
    "unknown": 0,
    "match_rate": 100
  },
  "results": [
    { "q": "Ayşe",   "gender": "female", "probability": 95, "total_names": 0, "confidence": "unverified", "source": "db" },
    { "q": "Mehmet", "gender": "male",   "probability": 95, "total_names": 0, "confidence": "unverified", "source": "db" },
    { "q": "Priya",  "gender": "female", "probability": 95, "total_names": 0, "confidence": "unverified", "source": "db" },
    { "q": "Wei",    "gender": "male",   "probability": 85, "total_names": 0, "confidence": "unverified", "source": "db" }
  ]
}

I risultati tornano nello stesso ordine in cui li hai inviati. I crediti vengono addebitati per nome e l'intera richiesta viene rifiutata prima di qualsiasi operazione se il tuo saldo è insufficiente, quindi non avrai mai un batch parzialmente elaborato.

Il blocco di riepilogo ti mostra il tasso di corrispondenza a colpo d'occhio, così puoi decidere se l'input ha bisogno di pulizia prima di elaborare il resto.

GET https://namegender.com/api/me

Account e quota

Controlla il tuo saldo rimanente senza spendere un credito.

curl "https://namegender.com/api/me" \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "status": true,
  "email": "you@example.com",
  "remaining_credits": 50099,
  "purchased_credits": 50000,
  "free_today": 99,
  "free_daily_limit": 100,
  "lifetime_requests": 12480,
  "expires": null
}

Script non latini

Invia un nome nel suo script originale e lo colleghiamo ai dati di riferimento. Nessun parametro aggiuntivo: rilieviamo lo script e scegliamo la strategia giusta.

Supportato
Script arabo

La scrittura araba omette le vocali brevi, quindi محمد si traslittera in "mhmd" mentre i nostri dati contengono "muhammed". Facciamo un match sullo schema consonantico e conserviamo il marker femminile ة, così خالد (Khalid) e خالدة (Khalida) rimangono distinti. Copre anche i nomi persiani e urdu scritti in script arabo.

Caratteri cinesi

Convertiti in Pinyin. Il cognome viene per primo in cinese, quindi 李明 ha cognome 李 (Li) e nome proprio 明 (Ming) — rimuoviamo il cognome prima della ricerca. Un singolo carattere è un nome proprio completo e viene trattato come uno.

Coreano

Stesso trattamento cognome-primo del cinese, usando i cognomi coreani comuni.

Kana giapponese

Hiragana e katakana vengono letti correttamente (ひろし → Hiroshi).

Cirillico

I nomi russo, ucraino, bulgaro e serbo si traslitterano direttamente.

Devanagari

Nomi hindi, marathi e nepalese. La vocale finale intrinseca è gestita (राहुल → Rahul, non "Rahula").

Non supportato
Kanji giapponese

I caratteri kanji giapponesi e i caratteri cinesi occupano lo stesso intervallo Unicode, quindi non possiamo distinguerli dai caratteri stessi. L'input Han viene letto come cinese: un nome kanji che non possediamo esattamente viene traslitterato secondo la pronuncia mandarino, che per un nome giapponese è solitamente errata (健太 viene letto come "jian tai" quando il nome è Kenta). I nomi che possediamo corrispondono esattamente e sono corretti. Invia i nomi giapponesi in kana o caratteri latini per essere sicuro.

Thai

Il thai omette le vocali come l'arabo e ha bisogno del suo strato di matching. Non ancora implementato, quindi questi restituiscono null.

# Arap yazısı — ünsüz iskeleti üzerinden eşleşir
curl "https://namegender.com/api?name=%D9%85%D8%AD%D9%85%D8%AF" -H "Authorization: Bearer KEY"
# -> { "gender": "male", "probability": 100, "source": "script", "matched_as": "mahamad" }

# Çince — soyadı ayıklanır, verilen ad sorgulanır
curl "https://namegender.com/api?name=%E6%9D%8E%E6%98%8E" -H "Authorization: Bearer KEY"
# -> { "gender": "male", "probability": 92, "source": "db" }

Quando non riusciamo a convertire uno script, la risposta è gender: null con source: none. Controlla il campo source: script significa che abbiamo traslitterato, db significa che abbiamo trovato una corrispondenza esatta con i caratteri che hai inviato. I due hanno un livello di confidence diverso e ti mostriamo quale hai ottenuto.

Campi della risposta

Identici su tutti gli endpoint.

Campo Tipo Descrizione
status boolean false quando la richiesta non è riuscita. Controlla questo per primo.
used_credits integer Crediti consumati da questa richiesta.
remaining_credits integer Crediti rimasti dopo questa richiesta.
expires null Sempre null. I crediti acquistati non scadono.
q string Il tuo input, restituito immutato.
name string Il nome che abbiamo effettivamente cercato dopo aver rimosso titoli e cognomi.
gender string male, female, o null quando non siamo abbastanza sicuri.
country string Il paese da cui provengono le statistiche, o null per l'aggregato globale.
total_names integer Quante persone reali questa risposta si basa. 0 significa che la fonte fornisce proporzioni anziché conteggi, non che la risposta è debole.
probability integer Confidenza nel genere indicato, da 50 a 100. 0 quando gender è null.
duration string Tempo di elaborazione lato server.

Due campi che altri servizi non forniscono

source ti dice da dove proviene la risposta: dal database di riferimento, da una corrispondenza fuzzy o dal fallback AI. matched_as indica il nome su cui la corrispondenza fuzzy ha trovato un match. Insieme ti permettono di decidere quanto fidarti di un singolo risultato invece di accettarlo per scontato.

Campo Tipo Descrizione
source string db, fuzzy, llm, o none.
confidence string alta, media, bassa, non verificata o sconosciuta, in base alle prove campionarie.
matched_as string Per una corrispondenza fuzzy, il record del database che ha trovato un match. Altrimenti null.

Codici di errore

Gli errori restituiscono un corpo JSON con status: false e una stringa di errore leggibile dalle macchine. Fai corrispondere l'errore, non il messaggio: i messaggi sono tradotti e potrebbero cambiare.

Codice HTTP Significato
missing_key 401 Chiave API mancante. Passala come parametro "key" o come header Authorization: Bearer.
invalid_key 401 Questa chiave API non è valida.
revoked_key 401 Questa chiave API è stata revocata.
blocked 403 Questo account è stato sospeso. Contatta il supporto.
email_not_verified 403 L'indirizzo e-mail di questo account non è ancora stato confermato. Apri il link di conferma che ti abbiamo inviato oppure richiedine uno nuovo dalla dashboard.
ip_not_allowed 403 Le richieste da questo indirizzo IP non sono consentite per questa chiave.
forbidden 403 Non sei autorizzato a eseguire questa azione.
no_credits 402 Non hai più crediti. Acquistane altri o attendi il reset della tua quota gratuita giornaliera.
missing_input 400 Il parametro "name" è obbligatorio.
invalid_input 422 Il parametro "name" non è valido.
too_many_items 422 Un massimo di 100 elementi può essere inviato in una richiesta.
unknown_endpoint 404 Non esiste alcun endpoint a questo percorso. Verifica l'URL nella documentazione dell'API.
method_not_allowed 405 Questo endpoint non accetta richieste DELETE.
payload_too_large 413 Il corpo della richiesta è troppo grande.
rate_limited 429 Troppe richieste. Rallenta e riprova tra poco.
not_ready 503 Il database dei nomi è in fase di ricostruzione. Riprova tra un momento.
server_error 500 Qualcosa è andato storto. Siamo stati notificati.
{
  "status": false,
  "error": "no_credits",
  "message": "You are out of credits. Buy more or wait for your daily free quota to reset.",
  "request_id": "req_9c1f5b2a7e0d4a13",
  "docs": "https://namegender.com/docs#error-no_credits"
}

Limiti di velocità

L'uso normale non raggiunge un limite. Il limite esiste per evitare che una chiave compromessa venga abusata, e si conta per chiave API anziché per IP in modo che più clienti su un server non consumino l'allowance gli uni degli altri.

Limite attuale: 1.200 richieste al minuto per chiave. Hai bisogno di più? Contattaci e lo aumenteremo sul tuo account.

Ogni risposta include gli header standard X-RateLimit-Limit e X-RateLimit-Remaining.

Migrazione da un altro provider

I nostri campi di risposta e nomi di parametri seguono la convenzione comune, quindi il passaggio di solito significa cambiare una riga: l'URL base.

- https://api.other-provider.io/api?name=Ayşe&key=KEY
+ https://namegender.com/api?name=Ayşe&key=KEY

askToAI e forceToGenderize mantengono la loro ortografia originale esattamente per questo motivo. Se manca un campo su cui conti, faccelo sapere e lo aggiungeremo.

Codifica il tuo input

I nomi contengono spazi e caratteri non-ASCII. Codifica l'URL il valore prima di inserirlo in una stringa di query, oppure usa POST con un corpo JSON.

Ayşe Yılmaz  ->  Ay%C5%9Fe%20Y%C4%B1lmaz
محمد          ->  %D9%85%D8%AD%D9%85%D8%AF
中村           ->  %E4%B8%AD%E6%9D%91