Fortsæt → Oversigt

REST API-reference

Et par endpoints, én responsform. Alt nedenfor er live mod din konto.

https://namegender.com/api/v1/gender Tilmeld dig gratis
llms-full.txt

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-header (anbefalet)
Authorization: Bearer ng_live_xxxxxxxxxxxx

Kopiering mislykkedes. Markér og kopiér teksten.

X-Api-Key-header
X-Api-Key: ng_live_xxxxxxxxxxxx

Kopiering mislykkedes. Markér og kopiér teksten.

Eksponér aldrig din nøgle i kode på klientsiden. Kald fra en browser eller mobilapp skal gå gennem din egen backend.

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.

JavaScript Kilde
npm install namegender

Kopiering mislykkedes. Markér og kopiér teksten.

Command line Kilde
npm install -g namegender

Kopiering mislykkedes. Markér og kopiér teksten.

composer require namegender/namegender

Kopiering mislykkedes. Markér og kopiér teksten.

Python Kilde
pip install namegender-client

Kopiering mislykkedes. Markér og kopiér teksten.

Ruby Kilde
gem install namegender

Kopiering mislykkedes. Markér og kopiér teksten.

Java Kilde
<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.

C# / .NET Kilde
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.

PowerShell Kilde
Install-Module NameGender

Kopiering mislykkedes. Markér og kopiér teksten.

Rust Kilde
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 alle

AI-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 Code
claude mcp add namegender -e NAMEGENDER_API_KEY=ng_live_... -- npx -y namegender-mcp

Kopiering mislykkedes. Markér og kopiér teksten.

Claude Desktop, Cursor og andre klienter
{
    "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

GET · POST https://namegender.com/api/v1/gender
Markdown

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
}
GET · POST https://namegender.com/api/v1/gender/email
Markdown

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"
}
GET · POST https://namegender.com/api/v1/gender/username
Markdown

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"
}
POST https://namegender.com/api/v1/gender/bulk
Markdown

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.

POST GET DELETE https://namegender.com/api/v1/batches
Markdown

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. 1. POST /batches Send filen og name_column. Opgaven sættes i kø med det samme.
  2. 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. 3. GET /batches/{id}/result Download 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.

POST https://your-server.example/…
Markdown

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.

Verificér body præcis, som den modtages. Et framework, der parser JSON og serialiserer den igen, ændrer bytene, og signaturen passer ikke.
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.
GET POST https://namegender.com/api/v1/gender/countries
Markdown

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.

Dette er ikke en herkomst- eller etnicitetsbestemmelse og må ikke bruges som sådan. Talte statistikker findes kun for elleve lande: USA, Storbritannien, Frankrig, Canada, Spanien, Irland, Norge, Østrig, Israel, Polen og Schweiz. En søgning efter "Mehmet" rangerer derfor Schweiz og Frankrig først med omkring 29 % hver, og Tyrkiet optræder slet ikke i rangeringen — Tyrkiet udgiver ingen tal. Tyrkiet optræder i `attested_in`.
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.

GET POST https://namegender.com/api/v1/salutation
Markdown

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.

GET POST https://namegender.com/api/v1/name-check
Markdown

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.

Dette er ikke identitetsbekræftelse, og det kalder aldrig et navn falsk. Brug `implausible` og `suspicious` til at markere en post eller bede om flere oplysninger, ikke til automatisk at afvise folk.
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.

GET POST https://namegender.com/api/v1/age
Markdown

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.

Dette beskriver en gruppe, ikke en person. For de fleste navne spænder den midterste halvdel over 10 til 25 år. Brug det til målgruppeanalyse, segmenter og forskning, aldrig til at afgøre noget om én person: kreditvurdering, ansættelse, bolig, forsikring, berettigelse eller alderskontrol.
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.

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

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.

Understøttet
Arabisk skrift

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.

Kinesiske tegn

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.

Koreansk

Samme familienavn-først-håndtering som kinesisk, ved brug af almindelige koreanske familienavne.

Japansk kana

Hiragana og katakana læses korrekt (ひろし → Hiroshi).

Kyrillisk

Russiske, ukrainske, bulgarske og serbiske navne transkriberes direkte.

Devanagari

Hindi-, marathi- og nepali-navne. Den medfødte slutvokat håndteres (राहुल → Rahul, ikke "Rahula").

Ikke understøttet
Japansk kanji

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

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.
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.