Fortsett → Oversikt

REST API-referanse

Noen få endepunkter, én responsstruktur. Alt nedenfor er aktivt mot kontoen din.

https://namegender.com/api/v1/gender Registrer deg gratis
llms-full.txt

Markdown for kodeassistenter som Claude Code, Cursor og Copilot. Lim det inn i chatten, eller gi assistenten lenken.

Rask start

Opprett en nøkkel i dashbordet, og send din første forespørsel. Ingen SDK nødvendig.

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

Alle endepunkter returnerer samme struktur, så du kan bytte inndata uten å endre parserkoden.

Autentisering

Hver forespørsel sender API-nøkkelen din i en header. Bruk Authorization: Bearer som standard, eller X-Api-Key når HTTP-klienten din reserverer Authorization-headeren til noe annet. En nøkkel som legges i URL-en blir avvist: URL-er kopieres inn i proxylogger, analyseverktøy og nettleserhistorikk.

Authorization-header (anbefalt)
Authorization: Bearer ng_live_xxxxxxxxxxxx

Kopiering mislyktes. Merk og kopier teksten.

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

Kopiering mislyktes. Merk og kopier teksten.

Eksponér aldri nøkkelen din i klientkode. Kall fra en nettleser eller mobilapp bør gå gjennom din egen backend.

Du kan begrense en nøkkel til spesifikke IP-adresser fra dashbordet.

Klientbiblioteker

Tynne omslag over REST API. De sender nøkkelen din, bygger hver forespørsel og gjør feilsvar om til unntak.

JavaScript Kilde
npm install namegender

Kopiering mislyktes. Merk og kopier teksten.

Command line Kilde
npm install -g namegender

Kopiering mislyktes. Merk og kopier teksten.

composer require namegender/namegender

Kopiering mislyktes. Merk og kopier teksten.

Python Kilde
pip install namegender-client

Kopiering mislyktes. Merk og kopier teksten.

Ruby Kilde
gem install namegender

Kopiering mislyktes. Merk og kopier 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 mislyktes. Merk og kopier teksten.

C# / .NET Kilde
dotnet add package NameGender --version 0.6.0

Kopiering mislyktes. Merk og kopier teksten.

go get github.com/anpekesen/namegender-go@v0.7.0

Kopiering mislyktes. Merk og kopier teksten.

remotes::install_github('anpekesen/namegender-r', ref = 'v0.7.0')

Kopiering mislyktes. Merk og kopier teksten.

PowerShell Kilde
Install-Module NameGender

Kopiering mislyktes. Merk og kopier teksten.

Rust Kilde
cargo add namegender

Kopiering mislyktes. Merk og kopier teksten.

Du trenger ikke et. API-et består av en håndfull enkle JSON-endepunkter; et bibliotek sparer deg en ettermiddag, ikke et prosjekt. Hvis språket ditt ikke er oppført, har REST-referansen copy-paste-eksempler.

Vis alle

AI-assistenter (MCP)

Bruk NameGender fra Claude, Cursor og alle andre klienter som støtter Model Context Protocol. Spør assistenten om en liste med navn, så kaller den API-et for deg, med belegg ved siden av hvert svar.

Claude Code
claude mcp add namegender -e NAMEGENDER_API_KEY=ng_live_... -- npx -y namegender-mcp

Kopiering mislyktes. Merk og kopier teksten.

Claude Desktop, Cursor og andre klienter
{
    "mcpServers": {
        "namegender": {
            "command": "npx",
            "args": [
                "-y",
                "namegender-mcp"
            ],
            "env": {
                "NAMEGENDER_API_KEY": "ng_live_..."
            }
        }
    }
}

Kopiering mislyktes. Merk og kopier teksten.

Legg dette til i klientens MCP-konfigurasjonsfil, og start den på nytt.

Verktøy

gender_from_name
Kjønn fra et fornavn eller fullt navn.
gender_from_email
Leser navnet i en e-postadresse; rolleadresser som info@ gir ukjent.
gender_from_username
Leser navnet i et brukernavn eller handle.
gender_bulk
Opptil 100 verdier i én forespørsel, med en oppsummering av treffraten.
name_countries
Land der et navn er registrert. Ikke en påstand om opprinnelse.
salutation
Innledningslinjen i et brev på brevets språk; den nøytrale formen når kjønnet ikke er sikkert.
name_check
Om et navn skrevet inn i et skjema ser ekte ut, med begrunnelsene. Kaller aldri et navn falskt.
age_from_name
Medianalder og aldersintervaller for personer med et fornavn i USA, Frankrike og Norge.
account_status
Gjenværende kreditter og dagens gratiskvote.

Hvert oppslag bruker kreditter fra kontoen som eier nøkkelen, akkurat som et direkte API-kall. Oppført i det offisielle MCP-registeret som io.github.anpekesen/namegender. npm-pakke · Kilde

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

Kjønn fra navn

Aksepterer fornavn eller fullt navn. Titler, mellomnavn og etternavn fjernes før oppslag, så "Dr. Ayşe Yılmaz" og "Ayşe" gir samme svar.

Parameter Type Beskrivelse
name
påkrevd
string Navnet som skal klassifiseres. Fornavn eller fullt navn.
country
valgfritt
string ISO 3166-1 alpha-2 landkode. Forbedrer nøyaktigheten for navn der kjønn varierer etter region, som Andrea (mann i Italia, kvinne i Tyskland).
locale
valgfritt
string En språktagg som de-DE eller en_US, for eksempel nettleserens språk. Regionen blir landet når country ikke sendes. En tagg uten region (en, de) setter ikke noe land.
ip
valgfritt
string Sluttbrukerens IP-adresse. Landet brukes når verken country eller en locale med region sendes. Lagres ikke. IP geolocation by DB-IP (db-ip.com).
ai_fallback
valgfritt
boolean Hvis navnet ikke finnes i dataene våre, ber vi en språkmodell om et estimat i stedet for å returnere null. Fungerer bare når AI-oppslag er slått på i innstillingene dine, og koster én ekstra kreditt.
best_guess
valgfritt
boolean Returner det ledende kjønnet selv når grunnlaget ikke når opp til sikkerhetsterskelen. Av som standard: et svar nær 50/50 som ser sikkert ut, gjør mer skade enn 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

Kjønn fra e-post

Trekker ut personen fra den lokale delen av adressen, og klassifiserer den. "ayse.yilmaz84@example.com" løses til Ayşe.

Parameter Type Beskrivelse
email
påkrevd
string E-postadressen. Bare delen før @ brukes.
country
valgfritt
string ISO 3166-1 alpha-2 landkode. Forbedrer nøyaktigheten for navn der kjønn varierer etter region, som Andrea (mann i Italia, kvinne i Tyskland).
locale
valgfritt
string En språktagg som de-DE eller en_US, for eksempel nettleserens språk. Regionen blir landet når country ikke sendes. En tagg uten region (en, de) setter ikke noe land.
ip
valgfritt
string Sluttbrukerens IP-adresse. Landet brukes når verken country eller en locale med region sendes. Lagres ikke. IP geolocation by DB-IP (db-ip.com).
ai_fallback
valgfritt
boolean Hvis navnet ikke finnes i dataene våre, ber vi en språkmodell om et estimat i stedet for å returnere null. Fungerer bare når AI-oppslag er slått på i innstillingene dine, og koster én ekstra kreditt.
best_guess
valgfritt
boolean Returner det ledende kjønnet selv når grunnlaget ikke når opp til sikkerhetsterskelen. Av som standard: et svar nær 50/50 som ser sikkert ut, gjør mer skade enn null.

best_guess virker på fornavnet som leses ut av adressen, ikke på selve adressen. Når det ikke kan leses ut noe fornavn, er det ingenting å tvinge frem, og gender forblir null. Husk at et tvunget svar her bygger på en utlesning som i seg selv kan være feil.

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

Kjønn fra brukernavn

Håndterer camelCase, snake_case, etterfølgende sifre og ledende @-tegn. "AyseYilmaz84" løses til Ayşe.

Parameter Type Beskrivelse
username
påkrevd
string Brukernavnet eller håndtaket. Et ledende @ ignoreres.
country
valgfritt
string ISO 3166-1 alpha-2 landkode. Forbedrer nøyaktigheten for navn der kjønn varierer etter region, som Andrea (mann i Italia, kvinne i Tyskland).
locale
valgfritt
string En språktagg som de-DE eller en_US, for eksempel nettleserens språk. Regionen blir landet når country ikke sendes. En tagg uten region (en, de) setter ikke noe land.
ip
valgfritt
string Sluttbrukerens IP-adresse. Landet brukes når verken country eller en locale med region sendes. Lagres ikke. IP geolocation by DB-IP (db-ip.com).
ai_fallback
valgfritt
boolean Hvis navnet ikke finnes i dataene våre, ber vi en språkmodell om et estimat i stedet for å returnere null. Fungerer bare når AI-oppslag er slått på i innstillingene dine, og koster én ekstra kreditt.
best_guess
valgfritt
boolean Returner det ledende kjønnet selv når grunnlaget ikke når opp til sikkerhetsterskelen. Av som standard: et svar nær 50/50 som ser sikkert ut, gjør mer skade enn 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

Massesøk

Send opptil 100 navn i en forespørsel. Bruk dette i stedet for løkking: ett massesøk for 100 navn er en enkelt tur og ett enkelt deduplisert oppslag.

Parameter Type Beskrivelse
names
påkrevd
string[] Array av navn. Maksimalt 100 elementer.
type
valgfritt
string Hva elementene er: navn, e-post eller brukernavn. Standardverdi er navn.
country
valgfritt
string Brukt på alle elementer i forespørselen.
locale
valgfritt
string Språktagg der regionen blir landet for hvert element når country ikke sendes.
ip
valgfritt
string Sluttbrukerens IP-adresse der landet brukes for hvert element når verken country eller en locale med region sendes. Lagres 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" }
  ]
}

Resultater kommer tilbake i samme rekkefølge som du sendte dem. Kreditter belastes per navn, og hele forespørselen avvises før noe arbeid hvis saldoen din er lav, så du får aldri en halvt behandlet batch.

Sammendrags-blokken viser trefffrekvensen på et blikk, slik at du kan bestemme om inndata trenger rensing før du behandler resten.

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

Filjobber

Last opp en CSV- eller XLSX-fil på opptil 100 MB og 1 000 000 rader, og få den tilbake med kjønnskolonner lagt til hver rad. Én kreditt per rad, belastes bare hvis jobben fullføres.

  1. 1. POST /batches Send filen og name_column. Jobben settes i kø med én gang.
  2. 2. GET /batches/{id} Les jobben til status er completed eller failed. poll_after_seconds sier hvor lenge du skal vente mellom hver lesing.
  3. 3. GET /batches/{id}/result Last ned resultatet. Det kommer tilbake i formatet du lastet opp.
Parameter Type Beskrivelse
file
påkrevd
file CSV, TSV eller XLSX med en overskriftsrad.
name_column
påkrevd
string Overskriften på kolonnen med navnene, nøyaktig som i filen. Påkrevd med mindre start=false.
country_column
valgfritt
string Overskriften på en kolonne med en landskode per rad.
country
valgfritt
string Standardland for rader uten land.
ai_fallback
valgfritt
boolean Spør en KI-modell om navn som ikke finnes i datasettet. Krever KI-samtykke under Innstillinger.
best_guess
valgfritt
boolean Returner det mest sannsynlige kjønnet selv når grunnlaget er svakt.
delete_after_download
valgfritt
boolean Resultatet kan lastes ned én gang og slettes deretter.
start
valgfritt
boolean false: bare last opp og se gjennom. 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 kreves for å starte: en gjettet kolonne som viser seg å være feil, ville brukt kreditter på feil data. Send start=false for først å se kolonnene, en forhåndsvisning og kostnaden, og start deretter jobben.

Send en Idempotency-Key-header. Et nytt forsøk med samme nøkkel returnerer den første jobben i stedet for å åpne en ny.

Opptil 3 jobber kan stå i kø eller kjøre samtidig. En jobb som ikke har startet, kan avbrytes, og kreditten returneres; en jobb under behandling kan ikke stoppes.

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

Webhooks

Legg til et endepunkt under Webhooks i panelet, så sender vi det en signert POST når en filjobb fullføres eller mislykkes, uten at du trenger å spørre.

Hendelse Type Beskrivelse
batch.completed BatchJob Jobben er ferdig. Body inneholder jobben nøyaktig slik GET /batches/{id} returnerer den.
batch.failed BatchJob Jobben mislyktes og ble ikke belastet. Forgren på error.code.
credits.low CreditsAlert Med dagens forbruk varer kredittene 7 dager eller mindre. Sjekkes hver time; abonnementsfornyelser tas med.
credits.depleted CreditsAlert Saldoen er tom, og forespørsler avvises med 402. Sjekkes hver time.
webhook.test object Sendes bare via «Send testhendelse» i panelet, og bare til det endepunktet.
Header Type Beskrivelse
NameGender-Signature
påkrevd
string t=<unix-sekunder>,v1=<hex>. Etter at du har fornyet hemmeligheten, finnes en ekstra v1 i 24 timer.
NameGender-Event-Id
påkrevd
string Hendelsens ID. Den samme ved hvert nye forsøk av samme hendelse.
NameGender-Delivery-Attempt
påkrevd
integer 1 ved første forsøk, opptil 8.

Verifiser hver forespørsel

v1 er HMAC-SHA256 av tidsstempelet, et punktum og den rå bodyen, med endepunktets hemmelighet. Sammenlign i konstant tid, godta forespørselen hvis en v1 stemmer, og avvis et tidsstempel som avviker mer enn fem minutter fra klokken din. Klientbibliotekene gjør alt dette i ett kall.

Verifiser bodyen nøyaktig slik den mottas. Et rammeverk som tolker JSON og serialiserer den på nytt, endrer bytene, og signaturen stemmer 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 hvilken som helst 2xx innen 10 sekunder, og gjør arbeidet etterpå.
  • Alle andre svar, også omdirigeringer, prøves igjen opptil 7 ganger over omtrent 45 timer. Hvis et endepunkt fortsetter å feile i tre dager, slås det av og du får en e-post.
  • Et nytt forsøk har samme ID, og rekkefølgen er ikke garantert. Fjern duplikater med NameGender-Event-Id, og les jobben med GET når du trenger gjeldende tilstand.
  • Fornyer du hemmeligheten i panelet, signerer den gamle videre i 24 timer, så du kan oppdatere serveren uten å gå glipp av hendelser.
  • Nye hendelsestyper kan komme til. Svar 2xx på en type du ikke håndterer, og ignorer den.
GET POST https://namegender.com/api/v1/gender/countries
Markdown

Landsfordeling

Returnerer landene hvor et navn er registrert. To lister kommer tilbake og de er bevisst ikke slått sammen: `registrations` er målt volum, kun sammenliknbart blant de elleve landene som publiserer tellet navnestatistikk, og `attested_in` er tilstedeværelse uten vekting.

Dette er ikke en inferens om opprinnelsesland eller etnisitet, og må ikke brukes som sådan. Tellet statistikk finnes kun for elleve land: USA, Storbritannia, Frankrike, Canada, Spania, Irland, Norge, Østerrike, Israel, Polen og Sveits. Et søk på "Mehmet" rangerer derfor Sveits og Frankrike først, med omtrent 29 % hver, og Tyrkia vises ikke i rangeringen i det hele tatt — Tyrkia publiserer ingen tellinger. Tyrkia vises i `attested_in`.
Parameter Type Beskrivelse
name
påkrevd
string Navnet som skal slås opp.
limit
valgfritt
integer Hvor mange tellende land som skal listes i `registrations`. 1–100, standard 25. Andelene beregnes ikke på nytt for den kortere listen.
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 kreditt per forespørsel. `share` beregnes over alle tellende land, så den summerer kun til 100 når `limit` ikke kutter listen; `counted_countries` teller også før kuttet. `attested_in` inneholder ingen prosenter fordi det ikke er noen telling bak disse postene å beregne fra.

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

Hilsen

Gjør et navn om til en hilsen, klar for brev eller e-post, på ti språk: “Sehr geehrte Frau Dr. Müller,”, “Sayın Ahmet Bey,”, “Madame,”, “山田様”. Kjønnsoppslaget er inkludert og koster den samme ene kreditten. Hvert svar har en formell, en uformell og en nøytral linje, pluss delene av den formelle linjen.

Parameter Type Beskrivelse
name
påkrevd
string Fullt navn, titler inkludert (“Dr. Anna Müller”). Send dette eller `first_name` og `last_name`.
first_name, last_name
valgfritt
string Bruk disse i stedet for `name` når CRM-et ditt lagrer navn i separate felt. Ingenting tolkes.
email
valgfritt
string E-postadresse som brukes når det ikke sendes et navn. Navnet leses fra delen før @, uten aksenter (Mueller, ikke Müller); info@ og andre funksjonsadresser får hilsenen for organisasjoner.
language
valgfritt
string Språket for hilsenen: en, en-US, en-GB, de, de-AT, de-CH, fr, es, it, pt, pt-PT, pt-BR, nl, tr, pl, ja. Uten det: språket fra `locale`, deretter landets hovedspråk, deretter engelsk. Et språk som ikke støttes, gir en feil, aldri et stille bytte til engelsk.
country, locale, ip
valgfritt
string Landshint for kjønnsoppslaget, som på kjønnsendepunktene. Det velger språket bare når `language` ikke sendes.
gender
valgfritt
string `male`, `female` eller `neutral`, når du allerede vet det. Overstyrer oppslaget; `neutral` gir alltid den nøytrale formen.
min_probability
valgfritt
integer Laveste sannsynlighet for en kjønnet hilsen, 50–100. Standard 90.
title
valgfritt
string Akademisk tittel lagret i et eget felt, for eksempel `Dr.` Brukes i tyske og engelske hilsener.
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"
}

Feil kjønn er verre enn ingen, så den kjønnede formen brukes bare når kjønnet er kjent med minst `min_probability` og språket har navnedelen det trenger. Ellers er `form` lik `neutral`, og `reason` forteller hvorfor. Bedrifter og funksjonsadresser får `form: organization`. `best_guess` og `ai_fallback` gjelder ikke her.

POST /api/v1/salutation/bulk tar opptil 100 navn i `names`, én kreditt hver, med de samme valgene for hvert navn.

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

Navnesjekk

Forteller om et navn som er skrevet inn i et registrerings- eller leadskjema, ser ut som navnet til en ekte person, og hvorfor. Det fanger opp tilfeldig tastetrykking (“asdf qwerty”), plassholdere (“Test Test”, “John Doe”, “n/a”), fiktive figurer (“Mickey Mouse”), banning og tall, symboler eller e-postadresser i navnefeltet. Én kreditt per navn.

Dette er ikke identitetsbekreftelse, og det kaller aldri et navn falskt. Bruk `implausible` og `suspicious` til å merke en post eller be om mer informasjon, ikke til å avvise folk automatisk.
Parameter Type Beskrivelse
name
påkrevd
string Navnet slik det ble skrevet inn i skjemaet. Send dette eller `first_name` og `last_name`.
first_name, last_name
valgfritt
string Bruk disse i stedet for `name` når skjemaet ditt har separate felt.
country, locale, ip
valgfritt
string Landshint, som på kjønnsendepunktene. Hjelper med å dele opp navnet og med oppslaget 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 det finnes et signal med høy alvorlighet (tastaturmønster, gjentatte bokstaver, plassholder, banning, e-post eller URL), `suspicious` med et middels signal (fiktiv figur, tall, symboler, firmanavn, ingen vokaler, svært langt) eller to lave, og ellers `plausible`. `score` går fra 0 til 100 for din egen terskel. Et fornavn som finnes i offisielle fødselsregistre, hever den; et navn vi aldri har sett, senker den ikke alene. Etternavn vurderes bare ut fra formen: det finnes ikke noe etternavnsdatasett bak dette endepunktet.

Testet på 4.610 ekte fornavn i ni skriftsystemer, alene og sammen med et etternavn: ingen ble merket som mistenkelig eller usannsynlig. Etternavn som Null, Test eller Cockburn, navn på to bokstaver som Ng og enkeltnavn blir bevisst latt i fred.

POST /api/v1/name-check/bulk tar opptil 100 navn i `names`, én kreditt hver, med en oppsummering av de tre vurderingene.

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

Alder ut fra navn

Hvor gamle de levende personene med et fornavn er: medianalderen, den midterste halvdelen (`age_range`) og de midterste 80 % (`age_range_80`). Brittany i USA: median 36, halvparten mellom 32 og 38. Én kreditt per navn.

Dette beskriver en gruppe, ikke en person. For de fleste navn spenner den midterste halvdelen over 10 til 25 år. Bruk det til målgruppeanalyse, segmenter og forskning, aldri til å avgjøre noe om én person: kredittvurdering, ansettelse, bolig, forsikring, berettigelse eller alderskontroll.
Parameter Type Beskrivelse
name
påkrevd
string Et fornavn eller et fullt navn; fornavnet brukes.
gender
valgfritt
string `male` eller `female` for å bruke bare registreringene for det kjønnet. Menn som heter Leslie, er 16 år eldre enn kvinner som heter Leslie.
country, locale, ip
valgfritt
string Landshint, som på kjønnsendepunktene. Dekket: US, FR og NO. Uten hint brukes den amerikanske serien, og `country_source` er `default`. Et annet land gir `reason: country_not_covered` og koster ingenting.
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: registrerte fødsler etter navn, kjønn og år, der hvert år vektes med andelen av fødselskullet som fortsatt lever (SSAs kohortdødelighetstabeller). Kilder: SSA-fødsler 1880–2024 (US), INSEE 1900–2025 (Frankrike), SSB 1945–2025 (Norge). `reason` er `not_found` for et navn som ikke finnes i serien, og `insufficient_data` under 100 levende personer.

Fødsler i utlandet er ikke med i noen serie, så navn som er vanlige blant innvandrere, ser yngre ut enn de er. Den norske serien starter i 1945, så personer født tidligere mangler. Den amerikanske dødelighetstabellen brukes også for Frankrike og Norge.

POST /api/v1/age/bulk tar opptil 100 navn i `names`, én kreditt hver, i den rekkefølgen de sendes.

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

Saldo

Les kredittsaldoen din og hva som er igjen av dagens gratiskvote. Dette kallet koster ingenting.

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 skriftsystemer

Send et navn i sitt eget skriftsystem, og vi knytter det til referansedataene. Ingen ekstra parameter: vi gjenkjenner skriftsystemet og velger riktig strategi.

Støttet
Arabisk skrift

Arabisk skrift utelater korte vokaler, så محمد translittereres til "mhmd" mens våre data inneholder "muhammed". Vi matcher på konsonantmønsteret og bevarer den feminine markøren ة slik at خالد (Khalid) og خالدة (Khalida) holdes atskilt. Dekker også persiske og urdunavne skrevet i arabisk skrift.

Kinesiske tegn

Konvertert til Pinyin. Familienavnet kommer først på kinesisk, så 李明 har familienavnet 李 (Li) og det gitte navnet 明 (Ming) — vi fjerner familienavnet før oppslag. Et enkelt tegn er et komplett gitt navn og håndteres som ett.

Koreansk

Samme familienavn-først-håndtering som kinesisk, med vanlige koreanske familienavn.

Japansk kana

Hiragana og katakana leses korrekt (ひろし → Hiroshi).

Kyrillisk

Russiske, ukrainske, bulgarske og serbiske navn translittereres direkte.

Devanagari

Hindi-, marathi- og nepalske navn. Den iboende sluttstavelsen håndteres (राहुल → Rahul, ikke "Rahula").

Ikke støttet
Japansk kanji

Japanske kanji og kinesiske tegn opptar samme Unicode-område, så vi kan ikke skille dem fra tegnene alene. Han-input leses som kinesisk: et kanji-navn vi ikke allerede har ordrett får sin Mandarin-lesing, som for et japansk navn vanligvis er feil (健太 leses som "jian tai" når navnet er Kenta). Navn vi har, samsvarer nøyaktig og er korrekte. Send japanske navn i kana eller latinsk skrift for sikkerhet.

Thai

Thai utelater vokaler mye som arabisk og trenger sitt eget matchingslag. Ikke bygget ennå, 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 mislyktes. Merk og kopier teksten.

Når vi ikke kan konvertere et skriftsystem i det hele tatt, er responsen kjønn: null med kilde: none. Sjekk kildefeltet: script betyr at vi translittererte, db betyr at vi samstemte tegnene du sendte direkte. De to har ulik sikkerhet, og vi viser hvilken du fikk.

Responsefelt

Identisk på alle endepunkter.

Felt Type Beskrivelse
credits_charged integer Hvor mange kreditter som ble trukket for dette kallet.
credits_remaining integer Den disponible saldoen din etter at dette kallet er betalt: kjøpte kreditter pluss det som er igjen av dagens gratiskvote.
query string Inndataene nøyaktig slik du sendte dem, før noen opprydding.
name string Navnet vi faktisk slår opp etter å ha fjernet titler og etternavn.
first_name string Fornavn tolket fra inndata. Returneres også når gender er null, uten ekstra kostnad.
middle_name string Øvrige fornavn mellom fornavnet og etternavnet. Initialer utelates.
last_name string Etternavn, inkludert prefikser som van eller de la. Alltid null for brukernavn.
name_type string personal, organization (Acme AS) eller role (info@, kundeservice). Organisasjoner og roller får ikke kjønn.
gender string male, female, eller null når vi ikke er sikre nok til å si det.
country string Landet statistikken kommer fra, eller null for globalt aggregat.
country_source string Hvor landet kom fra: country, locale, ip eller null når svaret gjelder hele verden.
sample_size integer Antall registrerte personer bak dette svaret. 0 betyr at kilden publiserer andeler eller belegg, ikke et antall vi kan etterprøve.
probability integer Sikkerhet for det angitte kjønnet, 50 til 100. 0 når kjønn er null.
took_ms integer Tiden vi brukte på å løse oppslaget, i hele millisekunder. Nettverkstid på din side er ikke inkludert.

To felt som andre tjenester ikke gir deg

source forteller deg hvor svaret kom fra: referansedatabasen, et fuzzy match, eller AI-fallback. matched_as navngir oppføringen som fuzzy match landet på. Sammen lar de deg bestemme hvor mye du skal stole på et enkelt resultat i stedet for å ta det for gitt.

Felt Type Beskrivelse
source string db, script, fuzzy, llm, eller none.
confidence string høy, medium, lav, uverifisert eller ukjent, basert på eksempeldata.
matched_as string For fuzzy match, databaseoppføringen som matchet. Ellers null.

Feilkoder

HTTP-statuskoden forteller deg at et kall mislyktes. JSON-bodyen oppgir deretter årsaken i error, forklarer den i message og gir deg en request_id du kan oppgi til support, pluss en lenke til den tilhørende raden i dokumentasjonen nedenfor. Forgren på error, aldri på message: meldinger er oversatt og kan bli omformulert.

Kode HTTP Betydning
missing_key 401 Ingen API-nøkkel ble sendt. Legg til en Authorization: Bearer-header eller en X-Api-Key-header i forespørselen.
invalid_key 401 Denne API-nøkkelen er ikke gyldig.
revoked_key 401 Denne API-nøkkelen er tilbakekalt.
blocked 403 Denne kontoen er suspendert. Kontakt support.
email_not_verified 403 E-postadressen til denne kontoen er ikke bekreftet ennå. Åpne bekreftelseslenken vi sendte deg, eller be om en ny fra kontrollpanelet.
ip_not_allowed 403 Forespørsler fra denne IP-adressen er ikke tillatt for denne nøkkelen.
proxy_secret_required 403 Denne nøkkelen fungerer bare gjennom sitt API-marked, som signerer hver forespørsel. Bruk nøkkelen som er utstedt til deg der.
forbidden 403 Du har ikke tillatelse til å utføre denne handlingen.
no_credits 402 Du har brukt opp kredittene dine. Kjøp flere eller vent til det daglige gratiskvotumet tilbakestilles.
missing_input 400 Parameteren "name" er obligatorisk.
invalid_input 422 Parameteren "name" er ikke gyldig.
too_many_items 422 Maksimalt 100 elementer kan sendes i én forespørsel.
unknown_endpoint 404 Det finnes ingen endpoint på denne adressen. Kontroller URL-en mot API-dokumentasjonen.
method_not_allowed 405 Dette endepunktet aksepterer ikke DELETE-forespørsler.
payload_too_large 413 Forespørselsbrøden er for stor.
rate_limited 429 For mange forespørsler. Sakt ned og prøv igjen om litt.
batch_not_found 404 Det finnes ingen filjobb med denne ID-en på denne kontoen.
batch_not_startable 409 Denne jobben er allerede startet eller lukket.
batch_not_finished 409 Denne jobben er ikke ferdig ennå. Sjekk statusen, og last ned resultatet når den er fullført.
batch_in_progress 409 Denne jobben behandles og kan ikke avbrytes nå. Slett den når den er ferdig.
result_gone 410 Denne jobben har ikke noe resultat å laste ned. Den mislyktes, ble avbrutt, utløp, eller engangsresultatet er allerede hentet.
too_many_batches 429 Du har allerede 100 filjobber i gang. Vent til én er ferdig før du starter en ny.
not_ready 503 Navndatabasen blir gjenoppbygget. Prøv igjen om en stund.
server_error 500 Noe gikk galt på vår side. Vi er blitt varslet.
{
  "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 mislyktes. Merk og kopier teksten.

Hastighetsbegrensninger

Normal bruk treffer ikke en grense. Grensen finnes for å stoppe en lekket nøkkel fra å bli misbrukt, og den teller per API-nøkkel i stedet for per IP slik at flere kunder på én server ikke forbruker hverandres tilldelinger.

Gjeldende grense: 1 200 forespørsler per minutt per nøkkel. Trenger du mer? Spør og vi øker den på kontoen din.

Hver respons inneholder standard X-RateLimit-Limit og X-RateLimit-Remaining header.

Mellomrom og ikke-latinske bokstaver i GET-forespørsler

Et navn som Ayşe Yılmaz eller 中村 kan ikke sendes i en URL slik det er skrevet. Prosentkod verdien når du kaller med GET, eller send den i en JSON-body med POST og slipp koding helt.

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 mislyktes. Merk og kopier teksten.