REST API-reference
Et par endpoints, én responsform. Alt nedenfor er live mod din konto.
https://namegender.com/api/v1/gender
Tilmeld dig gratis
Markdown til kodeassistenter som Claude Code, Cursor og Copilot. Indsæt det i chatten, eller giv assistenten linket.
Hurtig start
Opret en nøgle i dit dashboard, og send derefter din første anmodning. Du behøver ingen SDK.
curl "https://namegender.com/api/v1/gender?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/v1/gender?' . $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/v1/gender?${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/v1/gender",
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/v1/gender")
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/v1/gender?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
Hver endpoint returnerer samme form, så du kan skifte input uden at ændre din parsing-kode.
Godkendelse
Hver anmodning sender din API-nøgle i en header. Brug Authorization: Bearer som standard, eller X-Api-Key når din HTTP-klient bruger Authorization-headeren til noget andet. En nøgle i URL'en afvises: URL'er bliver kopieret ind i proxylogs, analyseværktøjer og browserhistorik.
Authorization: Bearer ng_live_xxxxxxxxxxxx
Kopiering mislykkedes. Markér og kopiér teksten.
X-Api-Key: ng_live_xxxxxxxxxxxx
Kopiering mislykkedes. Markér og kopiér teksten.
Du kan begrænse en nøgle til specifikke IP-adresser fra dashboardet.
Klientbiblioteker
Tynde wrappere omkring REST API'en. De sender din nøgle, bygger hver forespørgsel og omsætter fejlsvar til undtagelser.
npm install namegender
Kopiering mislykkedes. Markér og kopiér teksten.
npm install -g namegender
Kopiering mislykkedes. Markér og kopiér teksten.
composer require namegender/namegender
Kopiering mislykkedes. Markér og kopiér teksten.
pip install namegender-client
Kopiering mislykkedes. Markér og kopiér teksten.
gem install namegender
Kopiering mislykkedes. Markér og kopiér teksten.
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
<dependency>
<groupId>com.github.anpekesen</groupId>
<artifactId>namegender-java</artifactId>
<version>v0.9.0</version>
</dependency>
Kopiering mislykkedes. Markér og kopiér teksten.
dotnet add package NameGender --version 0.6.0
Kopiering mislykkedes. Markér og kopiér teksten.
go get github.com/anpekesen/namegender-go@v0.7.0
Kopiering mislykkedes. Markér og kopiér teksten.
remotes::install_github('anpekesen/namegender-r', ref = 'v0.7.0')
Kopiering mislykkedes. Markér og kopiér teksten.
Install-Module NameGender
Kopiering mislykkedes. Markér og kopiér teksten.
cargo add namegender
Kopiering mislykkedes. Markér og kopiér teksten.
Du behøver ikke én. API'en er en håndfuld almindelige JSON-endpoints; et bibliotek sparer dig en eftermiddag, ikke et projekt. Hvis dit sprog ikke er angivet, har REST-referencen copy-paste-eksempler.
Se alleAI-assistenter (MCP)
Brug NameGender fra Claude, Cursor og enhver anden klient, der understøtter Model Context Protocol. Spørg assistenten om en liste med navne, så kalder den API'en for dig med belæg ved siden af hvert svar.
claude mcp add namegender -e NAMEGENDER_API_KEY=ng_live_... -- npx -y namegender-mcp
Kopiering mislykkedes. Markér og kopiér teksten.
{
"mcpServers": {
"namegender": {
"command": "npx",
"args": [
"-y",
"namegender-mcp"
],
"env": {
"NAMEGENDER_API_KEY": "ng_live_..."
}
}
}
}
Kopiering mislykkedes. Markér og kopiér teksten.
Tilføj dette til klientens MCP-konfigurationsfil, og genstart den.
Værktøjer
gender_from_name- Køn ud fra et fornavn eller et fulde navn.
gender_from_email- Læser navnet i en e-mailadresse; rolleadresser som info@ giver ukendt.
gender_from_username- Læser navnet i et brugernavn eller handle.
gender_bulk- Op til 100 værdier i én anmodning med en oversigt over matchraten.
name_countries- Lande, hvor et navn er registreret. Ikke en påstand om oprindelse.
salutation- Brevets indledende linje på brevets sprog; den neutrale form, når kønnet ikke er sikkert.
name_check- Om et navn skrevet i en formular ligner et rigtigt navn, med begrundelserne. Kalder aldrig et navn falsk.
age_from_name- Medianalder og aldersintervaller for personer med et fornavn i USA, Frankrig og Norge.
account_status- Resterende kreditter og dagens gratis kvote.
Hvert opslag bruger kreditter fra den konto, der ejer nøglen, præcis som et direkte API-kald. Opført i det officielle MCP-register som io.github.anpekesen/namegender. npm-pakke · Kilde
Køn fra navn
Accepterer et fornavn eller fuldt navn. Titler, mellemnavne og efternavne fjernes før opslag, så "Dr. Ayşe Yılmaz" og "Ayşe" giver samme svar.
| Parameter | Type | Beskrivelse |
|---|---|---|
name
påkrævet
|
string
|
Navnet til klassificering. Fornavn eller fuldt navn. |
country
valgfrit
|
string
|
ISO 3166-1 alpha-2 landekode. Forbedrer nøjagtigheden for navne hvis køn varierer efter region, såsom Andrea (mand i Italien, kvinde i Tyskland). |
locale
valgfrit
|
string
|
Et sprogtag som de-DE eller en_US, for eksempel browserens sprog. Dets region bliver landet, når country ikke sendes. Et tag uden region (en, de) sætter intet land. |
ip
valgfrit
|
string
|
Slutbrugerens IP-adresse. Dens land bruges, når hverken country eller en locale med region sendes. Gemmes ikke. IP geolocation by DB-IP (db-ip.com). |
ai_fallback
valgfrit
|
boolean
|
Hvis navnet ikke findes i vores data, så bed en sprogmodel om et skøn i stedet for at returnere null. Virker kun, når AI-opslag er slået til i dine indstillinger, og koster én ekstra kredit. |
best_guess
valgfrit
|
boolean
|
Returnér det dominerende køn, selv når evidensen ikke når tillidstærsklen. Slået fra som standard: et næsten 50/50-svar, der ser sikkert ud, gør mere skade end null. |
curl "https://namegender.com/api/v1/gender?name=Jordan" \
-H "Authorization: Bearer YOUR_API_KEY"
{
"credits_charged": 1,
"credits_remaining": 49999,
"request_id": "req_4b7e0c2d9a1f6358",
"query": "Jordan",
"name": "Jordan",
"first_name": "Jordan",
"middle_name": null,
"last_name": null,
"name_type": "personal",
"gender": "male",
"country": null,
"sample_size": 62240,
"probability": 84,
"took_ms": 1,
"confidence": "high",
"source": "db",
"matched_as": null
}
Køn fra e-mail
Udtrækker personen fra e-mailadressens lokale del og klassificerer derefter det. "ayse.yilmaz84@example.com" opløses til Ayşe.
| Parameter | Type | Beskrivelse |
|---|---|---|
email
påkrævet
|
string
|
E-mailadresse. Kun delen før @ bruges. |
country
valgfrit
|
string
|
ISO 3166-1 alpha-2 landekode. Forbedrer nøjagtigheden for navne hvis køn varierer efter region, såsom Andrea (mand i Italien, kvinde i Tyskland). |
locale
valgfrit
|
string
|
Et sprogtag som de-DE eller en_US, for eksempel browserens sprog. Dets region bliver landet, når country ikke sendes. Et tag uden region (en, de) sætter intet land. |
ip
valgfrit
|
string
|
Slutbrugerens IP-adresse. Dens land bruges, når hverken country eller en locale med region sendes. Gemmes ikke. IP geolocation by DB-IP (db-ip.com). |
ai_fallback
valgfrit
|
boolean
|
Hvis navnet ikke findes i vores data, så bed en sprogmodel om et skøn i stedet for at returnere null. Virker kun, når AI-opslag er slået til i dine indstillinger, og koster én ekstra kredit. |
best_guess
valgfrit
|
boolean
|
Returnér det dominerende køn, selv når evidensen ikke når tillidstærsklen. Slået fra som standard: et næsten 50/50-svar, der ser sikkert ud, gør mere skade end null. |
best_guess virker på det fornavn, der læses ud af adressen, ikke på selve adressen. Kan der ikke læses et fornavn, er der intet at gennemtvinge, og gender forbliver null. Husk, at et gennemtvunget svar her bygger på en udtrækning, der i sig selv kan være forkert.
curl "https://namegender.com/api/v1/gender/email?email=ayse.yilmaz84%40example.com" \
-H "Authorization: Bearer YOUR_API_KEY"
{
"credits_charged": 1,
"credits_remaining": 49998,
"query": "ayse.yilmaz84@example.com",
"name": "Ayse",
"gender": "female",
"sample_size": 655,
"probability": 100,
"took_ms": 1,
"confidence": "high",
"source": "db"
}
Køn fra brugernavn
Håndterer camelCase, snake_case, efterfølgende cifre og førende @-tegn. "AyseYilmaz84" opløses til Ayşe.
| Parameter | Type | Beskrivelse |
|---|---|---|
username
påkrævet
|
string
|
Brugernavnet eller håndtaget. Et førende @ ignoreres. |
country
valgfrit
|
string
|
ISO 3166-1 alpha-2 landekode. Forbedrer nøjagtigheden for navne hvis køn varierer efter region, såsom Andrea (mand i Italien, kvinde i Tyskland). |
locale
valgfrit
|
string
|
Et sprogtag som de-DE eller en_US, for eksempel browserens sprog. Dets region bliver landet, når country ikke sendes. Et tag uden region (en, de) sætter intet land. |
ip
valgfrit
|
string
|
Slutbrugerens IP-adresse. Dens land bruges, når hverken country eller en locale med region sendes. Gemmes ikke. IP geolocation by DB-IP (db-ip.com). |
ai_fallback
valgfrit
|
boolean
|
Hvis navnet ikke findes i vores data, så bed en sprogmodel om et skøn i stedet for at returnere null. Virker kun, når AI-opslag er slået til i dine indstillinger, og koster én ekstra kredit. |
best_guess
valgfrit
|
boolean
|
Returnér det dominerende køn, selv når evidensen ikke når tillidstærsklen. Slået fra som standard: et næsten 50/50-svar, der ser sikkert ud, gør mere skade end null. |
curl "https://namegender.com/api/v1/gender/username?username=AyseYilmaz84" \
-H "Authorization: Bearer YOUR_API_KEY"
{
"credits_charged": 1,
"credits_remaining": 49997,
"query": "AyseYilmaz84",
"name": "Ayse",
"gender": "female",
"sample_size": 655,
"probability": 100,
"took_ms": 1,
"confidence": "high",
"source": "db"
}
Masseanmodning
Send op til 100 navne i en anmodning. Brug dette i stedet for at loope: et enkelt masseopkald for 100 navne er en enkelt rundtur og et enkelt dedupliseret opslag.
| Parameter | Type | Beskrivelse |
|---|---|---|
names
påkrævet
|
string[]
|
Navnearray. Maksimalt 100 elementer. |
type
valgfrit
|
string
|
Hvad elementerne er: navn, e-mail eller brugernavn. Standard er navn. |
country
valgfrit
|
string
|
Gælder for hvert element i anmodningen. |
locale
valgfrit
|
string
|
Sprogtag, hvis region bliver landet for hvert element, når country ikke sendes. |
ip
valgfrit
|
string
|
Slutbrugerens IP-adresse, hvis land bruges for hvert element, når hverken country eller en locale med region sendes. Gemmes ikke. IP geolocation by DB-IP (db-ip.com). |
curl -X POST "https://namegender.com/api/v1/gender/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/v1/gender/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['query'], $row['gender'] ?? '?', $row['probability']);
}
const response = await fetch('https://namegender.com/api/v1/gender/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.query, r.gender, r.probability));
import requests
response = requests.post(
"https://namegender.com/api/v1/gender/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["query"], row["gender"], row["probability"])
{
"credits_charged": 4,
"credits_remaining": 49995,
"request_id": "req_71d0a9e3c5b24f86",
"took_ms": 2,
"summary": {
"total": 4,
"identified": 4,
"unknown": 0,
"match_rate": 100
},
"results": [
{ "query": "Ayşe", "gender": "female", "probability": 100, "sample_size": 655, "confidence": "high", "source": "db" },
{ "query": "Mehmet", "gender": "male", "probability": 100, "sample_size": 1130, "confidence": "high", "source": "db" },
{ "query": "Priya", "gender": "female", "probability": 100, "sample_size": 2993, "confidence": "high", "source": "db" },
{ "query": "Wei", "gender": "male", "probability": 86, "sample_size": 136, "confidence": "high", "source": "db" }
]
}
Resultaterne kommer tilbage i samme rækkefølge som du sendte dem. Kreditter opkræves pr. navn, og hele anmodningen afvises før noget arbejde, hvis din saldo er for lav, så du får aldrig en halvfærdig batch.
Opsummeringsblokkene viser matchprocenten på et øjeblik, så du kan afgøre, om inputtet skal rengøres, før du behandler resten.
Filopgaver
Upload en CSV- eller XLSX-fil på op til 100 MB og 1.000.000 rækker, og få den tilbage med kønskolonner tilføjet til hver række. Én kredit pr. række, opkrævet kun hvis opgaven fuldføres.
-
1.
POST /batchesSend filen og name_column. Opgaven sættes i kø med det samme. -
2.
GET /batches/{id}Læs opgaven, indtil status er completed eller failed. poll_after_seconds angiver, hvor længe der skal ventes mellem læsninger. -
3.
GET /batches/{id}/resultDownload resultatet. Det kommer tilbage i det format, du uploadede.
| Parameter | Type | Beskrivelse |
|---|---|---|
file
påkrævet
|
file
|
CSV, TSV eller XLSX med en overskriftsrække. |
name_column
påkrævet
|
string
|
Overskrift på kolonnen med navnene, præcis som i filen. Påkrævet, medmindre start=false. |
country_column
valgfrit
|
string
|
Overskrift på en kolonne med en landekode pr. række. |
country
valgfrit
|
string
|
Standardland for rækker uden land. |
ai_fallback
valgfrit
|
boolean
|
Spørg en AI-model om navne, der ikke er i datasættet. Kræver AI-samtykke under Indstillinger. |
best_guess
valgfrit
|
boolean
|
Returner det mest sandsynlige køn, også når grundlaget er svagt. |
delete_after_download
valgfrit
|
boolean
|
Resultatet kan downloades én gang og slettes derefter. |
start
valgfrit
|
boolean
|
false: kun upload og gennemse. Standard er true. |
# 1. Upload and start
curl -X POST "https://namegender.com/api/v1/batches" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Idempotency-Key: 6f1c2e0a-customers-2026-09" \
-F "file=@customers.csv" \
-F "name_column=first_name" \
-F "country_column=country"
# 2. Poll until status is completed or failed
curl "https://namegender.com/api/v1/batches/B-7K2M9QX4TA" \
-H "Authorization: Bearer YOUR_API_KEY"
# 3. Download the result
curl "https://namegender.com/api/v1/batches/B-7K2M9QX4TA/result" \
-H "Authorization: Bearer YOUR_API_KEY" \
-o customers-gender.csv
import { NameGender } from 'namegender';
import { openAsBlob } from 'node:fs';
import { writeFile } from 'node:fs/promises';
const client = new NameGender(process.env.NAMEGENDER_API_KEY);
const job = await client.batches.create(await openAsBlob('customers.csv'), {
filename: 'customers.csv',
name_column: 'first_name',
country_column: 'country',
});
const done = await client.batches.wait(job.id);
if (done.status === 'failed') throw new Error(done.error.code);
const file = await client.batches.download(done.id);
await writeFile('customers-gender.csv', Buffer.from(await file.arrayBuffer()));
from namegender import NameGender
client = NameGender("YOUR_API_KEY")
job = client.batches.create("customers.csv", name_column="first_name", country_column="country")
done = client.batches.wait(job["id"])
if done["status"] == "failed":
raise RuntimeError(done["error"]["code"])
client.batches.download(done["id"], "customers-gender.csv")
{
"id": "B-7K2M9QX4TA",
"status": "completed",
"source": "api",
"file": { "name": "customers.csv", "format": "csv" },
"columns": { "name": "first_name", "country": "country" },
"rows": { "total": 200000, "processed": 200000, "identified": 187412 },
"progress": 100,
"credits": { "reserved": 200000, "charged": 200000 },
"summary": { "male": 96120, "female": 91292, "unknown": 12588, "from_llm": 0 },
"error": null,
"result": {
"url": "https://namegender.com/api/v1/batches/B-7K2M9QX4TA/result",
"format": "csv",
"expires_at": "2026-10-01T10:04:12Z"
},
"poll_after_seconds": null
}
name_column er påkrævet for at starte: en gættet kolonne, der viser sig at være forkert, ville bruge kreditter på de forkerte data. Send start=false for først at se kolonnerne, en forhåndsvisning og prisen, og start derefter opgaven.
Send en Idempotency-Key-header. Et nyt forsøg med samme nøgle returnerer den første opgave i stedet for at oprette en ny.
Op til 3 opgaver kan stå i kø eller køre på samme tid. En opgave, der ikke er startet, kan annulleres, og dens kredit returneres; en opgave under behandling kan ikke stoppes.
Webhooks
Tilføj et endpoint under Webhooks i dit dashboard, så sender vi det en signeret POST, når en filopgave er fuldført eller mislykkes, og du slipper for at spørge.
| Hændelse | Type | Beskrivelse |
|---|---|---|
batch.completed
|
BatchJob
|
Opgaven er færdig. Body indeholder opgaven præcis, som GET /batches/{id} returnerer den. |
batch.failed
|
BatchJob
|
Opgaven mislykkedes og blev ikke opkrævet. Forgren på error.code. |
credits.low
|
CreditsAlert
|
Med det nuværende forbrug rækker kreditterne 7 dage eller mindre. Tjekkes hver time; abonnementsfornyelser medregnes. |
credits.depleted
|
CreditsAlert
|
Saldoen er tom, og anmodninger afvises med 402. Tjekkes hver time. |
webhook.test
|
object
|
Sendes kun via "Send testhændelse" i dashboardet og kun til det endpoint. |
| Header | Type | Beskrivelse |
|---|---|---|
NameGender-Signature
påkrævet
|
string
|
t=<unix-sekunder>,v1=<hex>. Efter du har fornyet hemmeligheden, er der en ekstra v1 i 24 timer. |
NameGender-Event-Id
påkrævet
|
string
|
Hændelsens ID. Det samme ved hvert nyt forsøg med samme hændelse. |
NameGender-Delivery-Attempt
påkrævet
|
integer
|
1 ved første forsøg, op til 8. |
Verificér hver anmodning
v1 er HMAC-SHA256 af tidsstemplet, et punktum og den rå body, med dit endpoints hemmelighed. Sammenlign i konstant tid, accepter anmodningen, hvis en v1 passer, og afvis et tidsstempel, der ligger mere end fem minutter fra dit ur. Klientbibliotekerne klarer det hele i ét kald.
import express from 'express';
import { webhooks, NameGenderWebhookError } from 'namegender';
const app = express();
// express.raw, not express.json: the signature covers the exact bytes.
app.post('/namegender', express.raw({ type: 'application/json' }), async (req, res) => {
let event;
try {
event = await webhooks.verify(
req.body,
req.get('NameGender-Signature'),
process.env.NAMEGENDER_WEBHOOK_SECRET,
);
} catch (error) {
if (error instanceof NameGenderWebhookError) return res.sendStatus(400);
throw error;
}
res.sendStatus(204); // answer first, then do the work
if (event.type === 'batch.completed') {
const job = event.data.object; // same object as GET /batches/{id}
}
});
import os
from flask import Flask, request
from namegender import webhooks, WebhookVerificationError
app = Flask(__name__)
@app.post("/namegender")
def namegender_webhook():
try:
event = webhooks.verify(
request.get_data(), # raw bytes, not request.json
request.headers.get("NameGender-Signature"),
os.environ["NAMEGENDER_WEBHOOK_SECRET"],
)
except WebhookVerificationError:
return "", 400
if event["type"] == "batch.completed":
job = event["data"]["object"] # same object as GET /batches/{id}
return "", 204
<?php
$body = file_get_contents('php://input'); // raw body, before json_decode
$header = $_SERVER['HTTP_NAMEGENDER_SIGNATURE'] ?? '';
$secret = getenv('NAMEGENDER_WEBHOOK_SECRET');
parse_str(str_replace(',', '&', $header), $parts); // t=…&v1=…
preg_match_all('/v1=([0-9a-f]{64})/', $header, $m);
$t = (int) ($parts['t'] ?? 0);
$expected = hash_hmac('sha256', $t . '.' . $body, $secret);
$valid = abs(time() - $t) <= 300
&& array_filter($m[1], fn ($sig) => hash_equals($expected, $sig));
if (! $valid) {
http_response_code(400);
exit;
}
http_response_code(204);
$event = json_decode($body, true);
{
"id": "evt_16f7c01502fda5436e8b7c4e",
"type": "batch.completed",
"created_at": "2026-09-24T10:04:12Z",
"api_version": "v1",
"data": {
"object": {
"id": "B-7K2M9QX4TA",
"status": "completed",
"rows": { "total": 200000, "processed": 200000, "identified": 187412 },
"credits": { "reserved": 200000, "charged": 200000 },
"result": { "url": "…/api/v1/batches/B-7K2M9QX4TA/result", "format": "csv" }
}
}
}
- Svar med en vilkårlig 2xx inden for 10 sekunder, og lav arbejdet bagefter.
- Alle andre svar, også omdirigeringer, forsøges igen op til 7 gange over cirka 45 timer. Fejler et endpoint i tre dage, slås det fra, og du får en e-mail.
- Et nyt forsøg har samme ID, og rækkefølgen er ikke garanteret. Fjern dubletter via NameGender-Event-Id, og læs opgaven med GET, når du har brug for dens aktuelle tilstand.
- Når du fornyer hemmeligheden i dashboardet, signerer den gamle med i 24 timer, så du kan opdatere din server uden at miste hændelser.
- Der kan komme nye hændelsestyper. Svar 2xx på en type, du ikke håndterer, og ignorer den.
Landefordeling
Returnerer de lande, hvor et navn er registreret. Der kommer to lister tilbage, og de er bevidst ikke flettet sammen: `registrations` er målt volumen, der kun kan sammenlignes blandt de elleve lande, der udgiver talt navnestatistik, og `attested_in` er tilstedeværelse uden vægt.
| Parameter | Type | Beskrivelse |
|---|---|---|
name
påkrævet
|
string
|
Det navn, der skal søges på. |
limit
valgfrit
|
integer
|
Hvor mange tælte lande der skal vises i `registrations`. 1–100, standard 25. Andelene genberegnes ikke for den kortere liste. |
curl "https://namegender.com/api/v1/gender/countries?name=Mehmet" \
-H "Authorization: Bearer YOUR_API_KEY"
{
"credits_charged": 1,
"credits_remaining": 49994,
"took_ms": 3,
"name": "Mehmet",
"basis": {
"counted_sources": ["ssa", "ons", "nrs", "nisra", "insee", "statcan", "ine", "cso", "ssb", "statat", "pesel", "bfs"],
"counted_countries": 8,
"attested_countries": 16,
"note": "Shares are calculated only across countries that publish counted name statistics…"
},
"registrations": [
{ "country": "CH", "count": 3890, "share": 29.45, "gender": "male", "source": "bfs" },
{ "country": "FR", "count": 3775, "share": 28.58, "gender": "male", "source": "insee" },
{ "country": "PL", "count": 1808, "share": 13.69, "gender": "male", "source": "pesel" }
],
"attested_in": ["AL","AT","AU","BE","CA","CH","ES","FR","GB","KS","MK","NO","PL","SE","TR","US"]
}
Én kredit per anmodning. `share` beregnes på tværs af alle lande med tælledata, så den summerer kun til 100, når `limit` ikke afkorter listen; `counted_countries` tæller også før afkortningen. `attested_in` indeholder ingen procenter, fordi der ikke er tælledata bag disse poster at beregne ud fra.
Hilsen
Gør et navn til en hilsen, klar til et brev eller en e-mail, på ti sprog: “Sehr geehrte Frau Dr. Müller,”, “Sayın Ahmet Bey,”, “Madame,”, “山田様”. Kønsopslaget er inkluderet og koster den samme ene kredit. Hvert svar har en formel, en uformel og en neutral linje samt delene af den formelle linje.
| Parameter | Type | Beskrivelse |
|---|---|---|
name
påkrævet
|
string
|
Fulde navn inklusive titler (“Dr. Anna Müller”). Send dette eller `first_name` og `last_name`. |
first_name, last_name
valgfrit
|
string
|
Brug disse i stedet for `name`, når dit CRM gemmer navne i separate felter. Intet bliver fortolket. |
email
valgfrit
|
string
|
E-mailadresse, der bruges, når der ikke sendes et navn. Navnet læses fra delen før @, uden accenter (Mueller, ikke Müller); info@ og andre funktionsadresser får hilsenen til organisationer. |
language
valgfrit
|
string
|
Hilsenens sprog: en, en-US, en-GB, de, de-AT, de-CH, fr, es, it, pt, pt-PT, pt-BR, nl, tr, pl, ja. Uden det: sproget fra `locale`, derefter landets hovedsprog, derefter engelsk. Et sprog, der ikke understøttes, giver en fejl, aldrig et stille skift til engelsk. |
country, locale, ip
valgfrit
|
string
|
Landehint til kønsopslaget, som på køns-endpoints. Det vælger kun sproget, når `language` ikke sendes. |
gender
valgfrit
|
string
|
`male`, `female` eller `neutral`, når du allerede kender det. Tilsidesætter opslaget; `neutral` giver altid den neutrale form. |
min_probability
valgfrit
|
integer
|
Laveste sandsynlighed for en kønnet hilsen, 50–100. Standard 90. |
title
valgfrit
|
string
|
Akademisk titel gemt i et separat felt, f.eks. `Dr.` Bruges i tyske og engelske hilsner. |
curl -X POST "https://namegender.com/api/v1/salutation" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Dr. Anna Müller", "language": "de"}'
{
"credits_charged": 1,
"credits_remaining": 49993,
"language": "de",
"form": "gendered",
"reason": null,
"salutation": {
"formal": "Sehr geehrte Frau Dr. Müller,",
"informal": "Liebe Anna,",
"neutral": "Guten Tag Dr. Anna Müller,"
},
"parts": { "opening": "Sehr geehrte", "courtesy": "Frau", "academic": "Dr.", "name": "Müller" },
"gender": "female",
"gender_source": "lookup",
"probability": 99,
"first_name": "Anna",
"last_name": "Müller",
"name_type": "personal"
}
Et forkert køn er værre end intet, så den kønnede form bruges kun, når kønnet er kendt med mindst `min_probability`, og sproget har den navnedel, det skal bruge. Ellers er `form` lig med `neutral`, og `reason` siger hvorfor. Virksomheder og funktionsadresser får `form: organization`. `best_guess` og `ai_fallback` gælder ikke her.
POST /api/v1/salutation/bulk tager op til 100 navne i `names`, én kredit hver, med de samme indstillinger for hvert navn.
Navnetjek
Fortæller, om et navn, der er skrevet i en tilmeldings- eller leadformular, ligner en rigtig persons navn, og hvorfor. Det fanger tilfældige tastetryk (“asdf qwerty”), pladsholdere (“Test Test”, “John Doe”, “n/a”), fiktive figurer (“Mickey Mouse”), bandeord samt tal, symboler eller e-mailadresser i navnefeltet. Én kredit pr. navn.
| Parameter | Type | Beskrivelse |
|---|---|---|
name
påkrævet
|
string
|
Navnet, som det er skrevet i formularen. Send dette eller `first_name` og `last_name`. |
first_name, last_name
valgfrit
|
string
|
Brug disse i stedet for `name`, når din formular har separate felter. |
country, locale, ip
valgfrit
|
string
|
Landehint, som på køns-endpoints. Hjælper med at opdele navnet og med opslaget i registrene. |
curl -X POST "https://namegender.com/api/v1/name-check" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "asdf qwerty"}'
{
"credits_charged": 1,
"credits_remaining": 49992,
"query": "asdf qwerty",
"assessment": "implausible",
"score": 0,
"signals": [
{ "code": "placeholder", "severity": "high", "part": "first_name", "value": "asdf" },
{ "code": "keyboard_pattern", "severity": "high", "part": "first_name", "value": "asdf" },
{ "code": "keyboard_pattern", "severity": "high", "part": "last_name", "value": "qwerty" }
],
"first_name": "Asdf",
"last_name": "Qwerty",
"name_type": "personal",
"evidence": { "first_name_status": "not_found", "first_name_counted_records": 0 }
}
`assessment` er `implausible`, når der er et signal med høj alvorlighed (tastaturmønster, gentagne bogstaver, pladsholder, bandeord, e-mail eller URL), `suspicious` ved et mellemsignal (fiktiv figur, tal, symboler, firmanavn, ingen vokaler, meget langt) eller to lave, og ellers `plausible`. `score` går fra 0 til 100, så du kan sætte din egen grænse. Et fornavn, der findes i officielle fødselsregistre, hæver den; et navn, vi aldrig har set, sænker den ikke alene. Efternavne vurderes kun ud fra deres form: der ligger intet efternavnsdatasæt bag dette endpoint.
Testet på 4.610 rigtige fornavne i ni skriftsystemer, alene og sammen med et efternavn: ingen blev markeret som mistænkelig eller usandsynlig. Efternavne som Null, Test eller Cockburn, navne på to bogstaver som Ng og enkeltnavne bliver bevidst ladt i fred.
POST /api/v1/name-check/bulk tager op til 100 navne i `names`, én kredit hver, med en opsummering af de tre vurderinger.
Alder ud fra navn
Hvor gamle de levende personer med et fornavn er: medianalderen, den midterste halvdel (`age_range`) og de midterste 80 % (`age_range_80`). Brittany i USA: median 36, halvdelen mellem 32 og 38. Én kredit pr. navn.
| Parameter | Type | Beskrivelse |
|---|---|---|
name
påkrævet
|
string
|
Et fornavn eller et fuldt navn; fornavnet bruges. |
gender
valgfrit
|
string
|
`male` eller `female` for kun at bruge det køns registreringer. Mænd ved navn Leslie er 16 år ældre end kvinder ved navn Leslie. |
country, locale, ip
valgfrit
|
string
|
Landehint, som på køns-endpoints. Dækket: US, FR og NO. Uden hint bruges den amerikanske serie, og `country_source` er `default`. Et andet land returnerer `reason: country_not_covered` og koster intet. |
curl "https://namegender.com/api/v1/age?name=Brittany" \
-H "Authorization: Bearer YOUR_API_KEY"
{
"credits_charged": 1,
"credits_remaining": 49991,
"request_id": "req_8f2c1a",
"name": "Brittany",
"first_name": "Brittany",
"gender": null,
"age": 36,
"age_range": { "low": 32, "high": 38 },
"age_range_80": { "low": 28, "high": 41 },
"birth_year": 1990,
"sample_size": 353775,
"births": 361434,
"country": "US",
"country_source": "default",
"source": "ssa",
"series": "1880-2024",
"reference_year": 2026,
"reason": null
}
Metode: registrerede fødsler efter navn, køn og år, hvor hvert år vægtes med den andel af fødselsårgangen, der stadig lever (SSA's kohortedødelighedstavler). Kilder: SSA-fødsler 1880–2024 (US), INSEE 1900–2025 (Frankrig), SSB 1945–2025 (Norge). `reason` er `not_found` for et navn, der ikke findes i serien, og `insufficient_data` under 100 levende personer.
Fødsler i udlandet indgår i ingen serie, så navne, der er almindelige blandt indvandrere, ser yngre ud, end de er. Den norske serie begynder i 1945, så personer født tidligere mangler. Den amerikanske dødelighedstavle bruges også for Frankrig og Norge.
POST /api/v1/age/bulk tager op til 100 navne i `names`, én kredit hver, i den rækkefølge, de sendes.
Saldo
Se din kreditsaldo og hvor meget der er tilbage af dagens gratis kvote. Kaldet koster ikke noget.
curl "https://namegender.com/api/v1/me" \
-H "Authorization: Bearer YOUR_API_KEY"
{
"email": "you@example.com",
"credits_remaining": 50099,
"purchased_credits": 50000,
"free_today": 99,
"free_daily_limit": 100,
"lifetime_requests": 12480
}
Ikke-latinske skrifter
Send et navn i dets eget skriftsystem, og vi forbinder det til referencedata. Ingen ekstra parameter: vi registrerer skriftsystemet automatisk og vælger den rigtige strategi.
Arabisk skrift udelader korte vokaler, så محمد transkriberes til "mhmd" mens vores data indeholder "muhammed". Vi matcher på konsonantmønstret i stedet og bevarer det feminine ة-tegn, så خالد (Khalid) og خالدة (Khalida) holdes adskilt. Dækker også persiske og urdu-navn skrevet i arabisk skrift.
Konverteret til Pinyin. Familienavnet kommer først på kinesisk, så 李明 har familienavnet 李 (Li) og fornavnet 明 (Ming) — vi fjerner familienavnet før opslag. Et enkelt tegn udgør et komplet fornavn og behandles som ét.
Samme familienavn-først-håndtering som kinesisk, ved brug af almindelige koreanske familienavne.
Hiragana og katakana læses korrekt (ひろし → Hiroshi).
Russiske, ukrainske, bulgarske og serbiske navne transkriberes direkte.
Hindi-, marathi- og nepali-navne. Den medfødte slutvokat håndteres (राहुल → Rahul, ikke "Rahula").
Japanske kanji og kinesiske tegn optager samme Unicode-område, så vi kan ikke skelne dem fra tegnene alene. Han-input læses som kinesisk: et kanji-navn, som vi ikke allerede har ordret, får sin Mandarin-udtale, hvilket for et japansk navn normalt er forkert (健太 læses som "jian tai", når navnet er Kenta). NavneDe navne, som vi har, matcher præcist og er korrekte. Send japanske navne i kana eller Latin for at være sikker.
Thai udelader vokaler meget som arabisk og kræver sit eget matchinglag. Ikke implementeret endnu, så disse returnerer null.
# Arap yazısı — ünsüz iskeleti üzerinden eşleşir
curl "https://namegender.com/api/v1/gender?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/v1/gender?name=%E6%9D%8E%E6%98%8E" -H "Authorization: Bearer KEY"
# -> { "gender": "male", "probability": 92, "source": "db" }
Kopiering mislykkedes. Markér og kopiér teksten.
Når vi slet ikke kan oversætte et skript, er svaret køn: null med kilde: none. Kontroller kildefeltet: script betyder, at vi translittererede, db betyder, at vi matchede de tegn, du sendte, direkte. De to har forskellige konfidensværdier, og vi viser dig, hvilken du fik.
Responsfelter
Identisk på alle endpoints.
| Felt | Type | Beskrivelse |
|---|---|---|
credits_charged
|
integer
|
Hvor mange kreditter der blev trukket for dette kald. |
credits_remaining
|
integer
|
Din brugbare saldo, når dette kald er betalt: købte kreditter plus det, der er tilbage af dagens gratis kvote. |
query
|
string
|
Inputtet præcis som du sendte det, før nogen form for rensning. |
name
|
string
|
Det navn vi faktisk slog op efter at have fjernet titler og efternavne. |
first_name
|
string
|
Fornavn udledt af inputtet. Returneres også, når gender er null, uden ekstra omkostning. |
middle_name
|
string
|
Øvrige fornavne mellem fornavnet og efternavnet. Initialer udelades. |
last_name
|
string
|
Efternavn, inklusive præfikser som van eller de la. Altid null for brugernavne. |
name_type
|
string
|
personal, organization (Acme ApS) eller role (info@, kundeservice). Organisationer og roller får intet køn. |
gender
|
string
|
male, female eller null når vi ikke er sikre nok til at sige det. |
country
|
string
|
Det land statistikken kommer fra, eller null for det globale aggregat. |
country_source
|
string
|
Hvor landet kom fra: country, locale, ip eller null, når svaret gælder hele verden. |
sample_size
|
integer
|
Antal registrerede personer bag svaret. 0 betyder, at kilden offentliggør andele eller belæg, ikke et antal vi kan efterprøve. |
probability
|
integer
|
Tillid til det angivne køn, 50 til 100. 0 når køn er null. |
took_ms
|
integer
|
Den tid vi brugte på at løse opslaget, i hele millisekunder. Netværkstid på din side er ikke medregnet. |
To felter som andre tjenester ikke giver dig
source fortæller dig hvor svaret kommer fra: referencedatabasen, et fuzzy match eller AI-fallbacket. matched_as navngiver det entry som fuzzy match landede på. Sammen lader de dig bestemme hvor meget du skal stole på et enkelt resultat i stedet for at tage det for givet.
| Felt | Type | Beskrivelse |
|---|---|---|
source
|
string
|
db, script, fuzzy, llm eller none. |
confidence
|
string
|
høj, medium, lav, uverificeret eller ukendt baseret på stikprøvebevis. |
matched_as
|
string
|
Ved et fuzzy match, den databaseentry som matchede. Ellers null. |
Fejlkoder
HTTP-statuskoden fortæller dig, at et kald fejlede. JSON-bodyen angiver derefter årsagen i error, forklarer den i message og giver dig et request_id, du kan oplyse til support, samt et link til den tilsvarende række i dokumentationen nedenfor. Styr efter error, aldrig efter message: beskeder oversættes og kan blive omformuleret.
| Kode | HTTP | Betydning |
|---|---|---|
missing_key |
401 | Der blev ikke sendt nogen API-nøgle. Tilføj en Authorization: Bearer-header eller en X-Api-Key-header til anmodningen. |
invalid_key |
401 | Denne API-nøgle er ikke gyldig. |
revoked_key |
401 | Denne API-nøgle er blevet tilbagekaldt. |
blocked |
403 | Denne konto er blevet suspenderet. Kontakt support. |
email_not_verified |
403 | Denne kontos e-mailadresse er endnu ikke bekræftet. Åbn bekræftelseslinket, vi har sendt dig, eller bed om et nyt fra dit kontrolpanel. |
ip_not_allowed |
403 | Anmodninger fra denne IP-adresse er ikke tilladt for denne nøgle. |
proxy_secret_required |
403 | Denne nøgle fungerer kun gennem sit API-marked, som signerer hver anmodning. Brug den nøgle, der er udstedt til dig der. |
forbidden |
403 | Du har ikke tilladelse til at udføre denne handling. |
no_credits |
402 | Du er løbet tør for kreditter. Køb flere eller vent til dit daglige gratiskvoter nulstilles. |
missing_input |
400 | Parameteren "name" er påkrævet. |
invalid_input |
422 | Parameteren "name" er ikke gyldig. |
too_many_items |
422 | Maksimalt 100 elementer kan sendes i en enkelt anmodning. |
ai_consent_required |
422 | ai_fallback sender navnet til en tredjepartsai-udbyder, som denne konto ikke har accepteret. Se "ai"-feltet for at se, hvilken udbyder det er, og aktiver derefter AI-opslag i dine dashboardindstillinger. |
unknown_endpoint |
404 | Der findes intet endpoint på denne sti. Kontroller URL'en mod API-dokumentationen. |
method_not_allowed |
405 | Dette endpoint accepterer ikke DELETE-anmodninger. |
payload_too_large |
413 | Anmodningens brødtekst er for stor. |
rate_limited |
429 | For mange anmodninger. Sænk tempoet og prøv igen om lidt. |
batch_not_found |
404 | Der findes ingen filopgave med dette ID på denne konto. |
batch_not_startable |
409 | Denne opgave er allerede startet eller lukket. |
batch_not_finished |
409 | Denne opgave er ikke færdig endnu. Tjek status, og download resultatet, når den er fuldført. |
batch_in_progress |
409 | Denne opgave behandles og kan ikke annulleres nu. Slet den, når den er færdig. |
result_gone |
410 | Denne opgave har intet resultat at downloade. Den mislykkedes, blev annulleret, udløb, eller dens engangsresultat er allerede hentet. |
too_many_batches |
429 | Du har allerede 100 filopgaver i gang. Vent, til en er færdig, før du starter en ny. |
not_ready |
503 | Navnedatabasen bliver genopbygget. Prøv igen om et øjeblik. |
server_error |
500 | Noget gik galt på vores side. Vi er blevet underrettet. |
{
"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"
}
Kopiering mislykkedes. Markér og kopiér teksten.
Ratebegrænsninger
Normal brug rammer ikke en grænse. Loftet eksisterer for at stoppe en lækket nøgle fra at blive misbrugt, og det tælles pr. API-nøgle snarere end pr. IP, så flere kunder på én server ikke forbruger hinanden's tilladelighed.
Nuværende grænse: 1.200 anmodninger pr. minut pr. nøgle. Behov for mere? Spørg og vi hæver det på din konto.
Hver response indeholder standard X-RateLimit-Limit og X-RateLimit-Remaining headers.
Mellemrum og ikke-latinske bogstaver i GET-anmodninger
Et navn som Ayşe Yılmaz eller 中村 kan ikke sendes i en URL, som det er skrevet. Procentkod værdien, når du kalder med GET, eller send den i en JSON-body med POST og spring kodningen helt over.
Ayşe Yılmaz -> Ay%C5%9Fe%20Y%C4%B1lmaz
محمد -> %D9%85%D8%AD%D9%85%D8%AF
中村 -> %E4%B8%AD%E6%9D%91
Kopiering mislykkedes. Markér og kopiér teksten.