REST API Referansı
Birkaç endpoint, tek bir yanıt yapısı. Aşağıdaki her şey hesabınızda canlı çalışmaktadır.
https://namegender.com/api/v1/gender
Ücretsiz kaydol
Claude Code, Cursor ve Copilot gibi kod asistanları için Markdown. Sohbete yapıştırın ya da asistana bağlantıyı verin.
Hızlı Başlangıç
Panelinde bir anahtar oluşturun, ardından ilk isteğinizi gönderin. SDK gerekmez.
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
Her endpoint aynı yapıyı döndürür, bu nedenle ayrıştırma kodunuzu değiştirmeden girişleri değiştirebilirsiniz.
Kimlik Doğrulama
Her istek API anahtarınızı bir başlıkta taşır. Varsayılan olarak Authorization: Bearer kullanın; HTTP istemciniz Authorization başlığını başka bir iş için ayırıyorsa X-Api-Key kullanın. URL'ye konan anahtar reddedilir: URL'ler proxy günlüklerine, analiz araçlarına ve tarayıcı geçmişine kopyalanır.
Authorization: Bearer ng_live_xxxxxxxxxxxx
Kopyalanamadı. Metni seçip kopyalayın.
X-Api-Key: ng_live_xxxxxxxxxxxx
Kopyalanamadı. Metni seçip kopyalayın.
Bir anahtarı panodan belirli IP adreslerine kısıtlayabilirsiniz.
İstemci Kütüphaneleri
REST API üzerinde ince sarmalayıcılar. Anahtarınızı gönderir, her isteği oluşturur ve hata yanıtlarını istisnalara dönüştürürler.
npm install namegender
Kopyalanamadı. Metni seçip kopyalayın.
npm install -g namegender
Kopyalanamadı. Metni seçip kopyalayın.
composer require namegender/namegender
Kopyalanamadı. Metni seçip kopyalayın.
pip install namegender-client
Kopyalanamadı. Metni seçip kopyalayın.
gem install namegender
Kopyalanamadı. Metni seçip kopyalayın.
<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>
Kopyalanamadı. Metni seçip kopyalayın.
dotnet add package NameGender --version 0.6.0
Kopyalanamadı. Metni seçip kopyalayın.
go get github.com/anpekesen/namegender-go@v0.7.0
Kopyalanamadı. Metni seçip kopyalayın.
remotes::install_github('anpekesen/namegender-r', ref = 'v0.7.0')
Kopyalanamadı. Metni seçip kopyalayın.
Install-Module NameGender
Kopyalanamadı. Metni seçip kopyalayın.
cargo add namegender
Kopyalanamadı. Metni seçip kopyalayın.
Kullanmanız gerekmez. API birkaç sade JSON endpoint'inden ibarettir; bir kütüphane size bir projeyi değil, bir öğleden sonrayı kazandırır. Diliniz listede yoksa REST referansında kopyala-yapıştır örnekleri var.
Tümünü görüntüleYapay zekâ asistanları (MCP)
NameGender'ı Claude, Cursor ve Model Context Protocol desteği olan diğer tüm istemcilerden kullanın. Asistana bir ad listesini sorun; API'yi sizin yerinize çağırır ve her yanıtın yanında dayanağını gösterir.
claude mcp add namegender -e NAMEGENDER_API_KEY=ng_live_... -- npx -y namegender-mcp
Kopyalanamadı. Metni seçip kopyalayın.
{
"mcpServers": {
"namegender": {
"command": "npx",
"args": [
"-y",
"namegender-mcp"
],
"env": {
"NAMEGENDER_API_KEY": "ng_live_..."
}
}
}
}
Kopyalanamadı. Metni seçip kopyalayın.
Bunu istemcinin MCP yapılandırma dosyasına ekleyin ve istemciyi yeniden başlatın.
Araçlar
gender_from_name- Ön addan ya da tam addan cinsiyet.
gender_from_email- E-posta adresindeki adı okur; info@ gibi rol adresleri bilinmiyor sonucunu döndürür.
gender_from_username- Kullanıcı adı veya takma addaki adı okur.
gender_bulk- Tek istekte en fazla 100 değer, eşleşme oranı özetiyle birlikte.
name_countries- Bir adın kayıtlı olduğu ülkeler. Kökene dair bir iddia değildir.
salutation- Mektubun dilinde mektubun açılış satırı; cinsiyet kesin değilse nötr biçim.
name_check- Bir forma yazılan adın gerçek görünüp görünmediği ve nedenleri. Hiçbir ada sahte demez.
age_from_name- ABD, Fransa ve Norveç'te bir adı taşıyan kişilerin medyan yaşı ve yaş aralıkları.
account_status- Kalan krediler ve bugünkü ücretsiz kullanım hakkı.
Her sorgu, doğrudan bir API çağrısında olduğu gibi, anahtarın sahibi olan hesabın kredilerini kullanır. Resmi MCP kayıt defterinde io.github.anpekesen/namegender adıyla listelenir. npm paketi · Kaynak
Addan Cinsiyet
Ad veya tam adı kabul eder. Ünvanlar, orta adlar ve soyadlar araştırmadan önce kaldırılır, bu nedenle "Dr. Ayşe Yılmaz" ve "Ayşe" aynı sonucu verir.
| Parametre | Tür | Açıklama |
|---|---|---|
name
gerekli
|
string
|
Sınıflandırılacak ad. Ad veya tam ad. |
country
isteğe bağlı
|
string
|
ISO 3166-1 alpha-2 ülke kodu. Andrea gibi cinsiyeti bölgeye göre değişen adlar için doğruluğu artırır (İtalya'da erkek, Almanya'da kadın). |
locale
isteğe bağlı
|
string
|
de-DE ya da en_US gibi bir dil etiketi, örneğin tarayıcının dili. country gönderilmediğinde bölgesi ülke olarak kullanılır. Bölgesiz etiket (en, de) ülke belirlemez. |
ip
isteğe bağlı
|
string
|
Son kullanıcının IP adresi. Ne country ne de bölgeli bir locale gönderildiğinde bu adresin ülkesi kullanılır. Saklanmaz. IP geolocation by DB-IP (db-ip.com). |
ai_fallback
isteğe bağlı
|
boolean
|
Ad verilerimizde yoksa null döndürmek yerine bir dil modelinden tahmin iste. Yalnızca ayarlarınızda yapay zekâ sorguları açıldıktan sonra çalışır ve bir ek krediye mal olur. |
best_guess
isteğe bağlı
|
boolean
|
Kanıt güven eşiğine ulaşmasa bile öndeki cinsiyeti döndür. Varsayılan olarak kapalı: kesin görünen ama 50/50'ye yakın bir yanıt, null'dan daha çok zarar verir. |
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
}
E-postadan Cinsiyet
Adresi yerel bölümünden çıkarır, ardından sınıflandırır. "ayse.yilmaz84@example.com" Ayşe'ye çözülür.
| Parametre | Tür | Açıklama |
|---|---|---|
email
gerekli
|
string
|
E-posta adresi. Yalnızca @ işaretinden önceki kısım kullanılır. |
country
isteğe bağlı
|
string
|
ISO 3166-1 alpha-2 ülke kodu. Andrea gibi cinsiyeti bölgeye göre değişen adlar için doğruluğu artırır (İtalya'da erkek, Almanya'da kadın). |
locale
isteğe bağlı
|
string
|
de-DE ya da en_US gibi bir dil etiketi, örneğin tarayıcının dili. country gönderilmediğinde bölgesi ülke olarak kullanılır. Bölgesiz etiket (en, de) ülke belirlemez. |
ip
isteğe bağlı
|
string
|
Son kullanıcının IP adresi. Ne country ne de bölgeli bir locale gönderildiğinde bu adresin ülkesi kullanılır. Saklanmaz. IP geolocation by DB-IP (db-ip.com). |
ai_fallback
isteğe bağlı
|
boolean
|
Ad verilerimizde yoksa null döndürmek yerine bir dil modelinden tahmin iste. Yalnızca ayarlarınızda yapay zekâ sorguları açıldıktan sonra çalışır ve bir ek krediye mal olur. |
best_guess
isteğe bağlı
|
boolean
|
Kanıt güven eşiğine ulaşmasa bile öndeki cinsiyeti döndür. Varsayılan olarak kapalı: kesin görünen ama 50/50'ye yakın bir yanıt, null'dan daha çok zarar verir. |
best_guess adresin kendisine değil, adresten okunan ada uygulanır. Adresten bir ad okunamazsa zorlanacak bir şey yoktur ve gender null kalır. Unutmayın: buradaki zorlanmış yanıt, kendisi de hatalı olabilecek bir çıkarımın üzerine kurulur.
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"
}
Kullanıcı Adından Cinsiyet
camelCase, snake_case, sondaki rakamlar ve başında @ işareti olan adları işler. "AyseYilmaz84" Ayşe'ye çözülür.
| Parametre | Tür | Açıklama |
|---|---|---|
username
gerekli
|
string
|
Kullanıcı adı veya handle. Başında @ işareti göz ardı edilir. |
country
isteğe bağlı
|
string
|
ISO 3166-1 alpha-2 ülke kodu. Andrea gibi cinsiyeti bölgeye göre değişen adlar için doğruluğu artırır (İtalya'da erkek, Almanya'da kadın). |
locale
isteğe bağlı
|
string
|
de-DE ya da en_US gibi bir dil etiketi, örneğin tarayıcının dili. country gönderilmediğinde bölgesi ülke olarak kullanılır. Bölgesiz etiket (en, de) ülke belirlemez. |
ip
isteğe bağlı
|
string
|
Son kullanıcının IP adresi. Ne country ne de bölgeli bir locale gönderildiğinde bu adresin ülkesi kullanılır. Saklanmaz. IP geolocation by DB-IP (db-ip.com). |
ai_fallback
isteğe bağlı
|
boolean
|
Ad verilerimizde yoksa null döndürmek yerine bir dil modelinden tahmin iste. Yalnızca ayarlarınızda yapay zekâ sorguları açıldıktan sonra çalışır ve bir ek krediye mal olur. |
best_guess
isteğe bağlı
|
boolean
|
Kanıt güven eşiğine ulaşmasa bile öndeki cinsiyeti döndür. Varsayılan olarak kapalı: kesin görünen ama 50/50'ye yakın bir yanıt, null'dan daha çok zarar verir. |
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"
}
Toplu İstek
Bir istekte 100 adaya kadar gönderin. Döngü yerine bunu kullanın: 100 ad için bir toplu çağrı tek bir gidiş-dönüş ve tek bir çoğaltılmış araştırmadır.
| Parametre | Tür | Açıklama |
|---|---|---|
names
gerekli
|
string[]
|
Ad dizisi. Maksimum 100 öğe. |
type
isteğe bağlı
|
string
|
Öğelerin ne olduğu: ad, e-posta veya kullanıcı adı. Varsayılan ad. |
country
isteğe bağlı
|
string
|
İstekteki her öğeye uygulanır. |
locale
isteğe bağlı
|
string
|
country gönderilmediğinde bölgesi her öğe için ülke olarak kullanılan dil etiketi. |
ip
isteğe bağlı
|
string
|
Ne country ne de bölgeli bir locale gönderildiğinde ülkesi her öğe için kullanılan son kullanıcı IP adresi. Saklanmaz. 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" }
]
}
Sonuçlar gönderdikleriniz aynı sırada geri gelir. Krediler ad başına ücretlendirilir ve bakiyeniz kısa olursa tüm istek herhangi bir işten önce reddedilir, bu nedenle asla yarı işlenmiş bir batch almarsınız.
Özet blok eşleşme oranını bir bakışta gösterir, böylece kalanı işlemeden önce girişin temizlenip temizlenmeyeceğine karar verebilirsiniz.
Dosya işleri
En fazla 100 MB ve 1.000.000 satırlık bir CSV ya da XLSX dosyası yükleyin, her satırına cinsiyet sütunları eklenmiş olarak geri alın. Satır başına bir kredi; yalnızca iş tamamlanırsa düşülür.
-
1.
POST /batchesDosyayı ve name_column değerini gönderin. İş hemen kuyruğa alınır. -
2.
GET /batches/{id}status completed ya da failed olana kadar işi okuyun. poll_after_seconds iki okuma arasında ne kadar bekleneceğini söyler. -
3.
GET /batches/{id}/resultSonucu indirin. Yüklediğiniz biçimde döner.
| Parametre | Tür | Açıklama |
|---|---|---|
file
gerekli
|
file
|
Başlık satırı olan CSV, TSV ya da XLSX. |
name_column
gerekli
|
string
|
İsimlerin bulunduğu sütunun başlığı, dosyadaki haliyle. start=false değilse zorunlu. |
country_column
isteğe bağlı
|
string
|
Satır başına ülke kodu içeren sütunun başlığı. |
country
isteğe bağlı
|
string
|
Ülkesi olmayan satırlar için varsayılan ülke. |
ai_fallback
isteğe bağlı
|
boolean
|
Veri kümesinde olmayan isimler için yapay zekâ modeline sor. Ayarlar’da yapay zekâ rızası gerekir. |
best_guess
isteğe bağlı
|
boolean
|
Kanıt zayıf olsa bile daha olası cinsiyeti döndür. |
delete_after_download
isteğe bağlı
|
boolean
|
Sonuç bir kez indirilebilir, ardından silinir. |
start
isteğe bağlı
|
boolean
|
false: yalnızca yükle ve incele. Varsayılan 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
}
Başlatmak için name_column zorunludur: yanlış çıkan bir tahmin, krediyi yanlış veriye harcatır. Önce sütunları, bir önizlemeyi ve maliyeti görmek için start=false gönderin, sonra işi başlatın.
Idempotency-Key başlığı gönderin. Aynı anahtarla yapılan yeniden deneme ikinci bir iş açmaz, ilk işi döner.
Aynı anda en fazla 3 iş kuyrukta ya da işlenmekte olabilir. Başlamamış bir iş iptal edilebilir ve kredisi iade edilir; işlenmekte olan bir iş durdurulamaz.
Webhook'lar
Panelde Webhook'lar altından bir uç ekleyin; bir dosya işi tamamlandığında ya da başarısız olduğunda o uca imzalı bir POST gönderelim, durumu sorgulamanıza gerek kalmasın.
| Olay | Tür | Açıklama |
|---|---|---|
batch.completed
|
BatchJob
|
İş bitti. Gövde, işi GET /batches/{id} yanıtıyla birebir aynı biçimde taşır. |
batch.failed
|
BatchJob
|
İş başarısız oldu ve ücret alınmadı. error.code değerine göre dallanın. |
credits.low
|
CreditsAlert
|
Mevcut hızla kredi en fazla 7 gün yetiyor. Saatte bir kontrol edilir; abonelik yenilemeleri hesaba katılır. |
credits.depleted
|
CreditsAlert
|
Bakiye bitti ve istekler 402 ile reddediliyor. Saatte bir kontrol edilir. |
webhook.test
|
object
|
Yalnızca paneldeki "Test olayı gönder" ile ve yalnızca o uca gönderilir. |
| Başlık | Tür | Açıklama |
|---|---|---|
NameGender-Signature
gerekli
|
string
|
t=<unix saniye>,v1=<hex>. Sırrı yeniledikten sonra 24 saat boyunca ikinci bir v1 bulunur. |
NameGender-Event-Id
gerekli
|
string
|
Olay kimliği. Aynı olayın her yeniden denemesinde aynıdır. |
NameGender-Delivery-Attempt
gerekli
|
integer
|
İlk denemede 1, en fazla 8. |
Her isteği doğrulayın
v1; zaman damgası, bir nokta ve ham gövdenin, uç sırrınızla hesaplanan HMAC-SHA256 değeridir. Sabit zamanlı karşılaştırın, herhangi bir v1 tutarsa isteği kabul edin ve saatinizden beş dakikadan fazla sapan zaman damgasını reddedin. İstemci kütüphaneleri bunların hepsini tek çağrıda yapar.
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" }
}
}
}
- 10 saniye içinde herhangi bir 2xx ile cevap verin, işi sonra yapın.
- Yönlendirme dahil başka her cevap, yaklaşık 45 saat içinde en fazla 7 kez yeniden denenir. Bir uç üç gün boyunca başarısız olmaya devam ederse kapatılır ve size e-posta gönderilir.
- Yeniden deneme aynı olay kimliğini taşır ve sıra garanti edilmez. NameGender-Event-Id ile tekilleştirin; işin güncel durumu gerektiğinde işi GET ile okuyun.
- Paneldeki sır yenileme eski sırrı 24 saat daha imzada tutar; sunucunuzu olay kaçırmadan güncelleyebilirsiniz.
- Yeni olay türleri eklenebilir. İşlemediğiniz bir türe 2xx ile cevap verin ve yok sayın.
Ülke dağılımı
Bir adın kayıtlı olduğu ülkeleri döndürür. İki liste geri gelir ve kasıtlı olarak birleştirilmez: `registrations` ölçülen hacimdir, yalnızca sayımlı ad istatistiği yayımlayan on bir ülke arasında karşılaştırılabilir; `attested_in` varlıktır, herhangi bir ağırlığı yoktur.
| Parametre | Tür | Açıklama |
|---|---|---|
name
gerekli
|
string
|
Sorgulanacak ad. |
limit
isteğe bağlı
|
integer
|
Kaç adet sayılı ülkenin `registrations` içinde listeleneceği. 1–100, varsayılan 25. Kısalan liste için paylar yeniden hesaplanmaz. |
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"]
}
İstek başına 1 kredi. `share` sayılı verisi olan tüm ülkeler üzerinden hesaplanır, bu nedenle toplamı yalnızca `limit` listeyi kısaltmadığında 100'e ulaşır; `counted_countries` de kısaltmadan önce sayılır. `attested_in` yüzde içermez çünkü bu kayıtların arkasında hesaplamak için bir sayı yoktur.
Hitap
Bir adı mektuba ya da e-postaya hazır bir hitaba dönüştürür, on dilde: “Sehr geehrte Frau Dr. Müller,”, “Sayın Ahmet Bey,”, “Madame,”, “山田様”. Cinsiyet sorgusu dahildir ve yine 1 kredi tutar. Her yanıtta resmî, samimi ve nötr birer satır ile resmî satırın parçaları bulunur.
| Parametre | Tür | Açıklama |
|---|---|---|
name
gerekli
|
string
|
Unvanlar dahil tam ad (“Dr. Anna Müller”). Bunu ya da `first_name` ve `last_name` gönderin. |
first_name, last_name
isteğe bağlı
|
string
|
CRM'iniz adları ayrı alanlarda tutuyorsa `name` yerine bunları kullanın. Hiçbir ayrıştırma yapılmaz. |
email
isteğe bağlı
|
string
|
Ad gönderilmediğinde kullanılan e-posta adresi. Ad, @ işaretinden önceki kısımdan özel harf olmadan okunur (Müller değil Mueller); info@ gibi rol adresleri kurum hitabı alır. |
language
isteğe bağlı
|
string
|
Hitabın dili: en, en-US, en-GB, de, de-AT, de-CH, fr, es, it, pt, pt-PT, pt-BR, nl, tr, pl, ja. Gönderilmezse: `locale` dili, ardından ülkenin ana dili, ardından İngilizce. Desteklenmeyen bir dil hata döndürür; sessizce İngilizceye geçilmez. |
country, locale, ip
isteğe bağlı
|
string
|
Cinsiyet sorgusu için ülke ipucu, cinsiyet endpointlerinde olduğu gibi. Dili yalnızca `language` gönderilmediğinde belirler. |
gender
isteğe bağlı
|
string
|
Zaten biliyorsanız `male`, `female` veya `neutral`. Sorgunun yerine geçer; `neutral` her zaman nötr biçimi verir. |
min_probability
isteğe bağlı
|
integer
|
Cinsiyetli hitap için en düşük olasılık, 50–100. Varsayılan 90. |
title
isteğe bağlı
|
string
|
Ayrı bir alanda tutulan akademik unvan, örneğin `Dr.` Almanca ve İngilizce hitaplarda kullanılır. |
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"
}
Yanlış cinsiyet, hiç cinsiyet olmamasından kötüdür; bu yüzden cinsiyetli biçim yalnızca cinsiyet en az `min_probability` olasılıkla biliniyorsa ve dilin ihtiyaç duyduğu ad parçası varsa kullanılır. Aksi halde `form` değeri `neutral` olur ve `reason` nedenini belirtir. Şirketler ve rol adresleri `form: organization` alır. `best_guess` ve `ai_fallback` burada geçerli değildir.
POST /api/v1/salutation/bulk, `names` içinde en fazla 100 ad alır; her ad 1 kredidir ve aynı seçenekler her ada uygulanır.
İsim kontrolü
Kayıt ya da potansiyel müşteri formuna yazılan bir adın gerçek bir kişinin adına benzeyip benzemediğini ve nedenini söyler. Klavyeye rastgele basılmış girdileri (“asdf qwerty”), yer tutucuları (“Test Test”, “John Doe”, “n/a”), kurgusal karakterleri (“Mickey Mouse”), küfürleri ve ad alanındaki rakam, simge ya da e-posta adreslerini yakalar. Ad başına 1 kredi.
| Parametre | Tür | Açıklama |
|---|---|---|
name
gerekli
|
string
|
Forma yazıldığı haliyle ad. Bunu ya da `first_name` ve `last_name` gönderin. |
first_name, last_name
isteğe bağlı
|
string
|
Formunuzda ayrı alanlar varsa `name` yerine bunları kullanın. |
country, locale, ip
isteğe bağlı
|
string
|
Ülke ipucu, cinsiyet endpointlerinde olduğu gibi. Adın ayrıştırılmasına ve kayıtlarda aranmasına yardımcı olur. |
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 }
}
Yüksek önemde bir sinyal varsa (klavye deseni, tekrarlanan harfler, yer tutucu, küfür, e-posta ya da URL) `assessment` değeri `implausible`, orta önemde bir sinyal (kurgusal karakter, rakam, simge, şirket adı, ünlü harf yok, çok uzun) ya da iki düşük sinyal varsa `suspicious`, aksi halde `plausible` olur. `score` kendi eşiğinizi belirlemeniz için 0 ile 100 arasındadır. Resmî doğum kayıtlarında bulunan bir ad onu yükseltir; hiç görmediğimiz bir ad tek başına düşürmez. Soyadları yalnızca biçimlerine göre değerlendirilir: bu endpointin arkasında bir soyadı veri kümesi yoktur.
Dokuz yazı sisteminde 4.610 gerçek ad üzerinde, tek başına ve bir soyadıyla birlikte test edildi: hiçbiri `suspicious` ya da `implausible` olarak işaretlenmedi. Null, Test ya da Cockburn gibi soyadları, Ng gibi iki harfli adlar ve tek adlar bilerek dokunulmadan bırakılır.
POST /api/v1/name-check/bulk, `names` içinde en fazla 100 ad alır; her ad 1 kredidir ve üç değerlendirmenin özeti döner.
İsimden yaş
Bir adı taşıyan yaşayan kişilerin kaç yaşında olduğu: medyan yaş, ortadaki yarı (`age_range`) ve ortadaki %80 (`age_range_80`). ABD'de Brittany: medyan 36, yarısı 32 ile 38 arasında. Ad başına 1 kredi.
| Parametre | Tür | Açıklama |
|---|---|---|
name
gerekli
|
string
|
Bir ad ya da tam ad; ilk ad kullanılır. |
gender
isteğe bağlı
|
string
|
Yalnızca o cinsiyetin kayıtlarını kullanmak için `male` ya da `female`. Erkek Leslie'ler kadın Leslie'lerden 16 yaş büyüktür. |
country, locale, ip
isteğe bağlı
|
string
|
Ülke ipucu, cinsiyet endpointlerinde olduğu gibi. Kapsanan ülkeler: US, FR ve NO. İpucu yoksa ABD serisi kullanılır ve `country_source` değeri `default` olur. Başka bir ülke `reason: country_not_covered` döndürür ve ücret alınmaz. |
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
}
Yöntem: ada, cinsiyete ve yıla göre kayıtlı doğumlar; her yıl, o doğum kuşağının hâlâ hayatta olan payıyla ağırlıklandırılır (SSA kuşak yaşam tabloları). Kaynaklar: SSA doğumları 1880–2024 (US), INSEE 1900–2025 (Fransa), SSB 1945–2025 (Norveç). Seride olmayan bir ad için `reason` değeri `not_found`, yaşayan kişi sayısı 100'ün altındaysa `insufficient_data` olur.
Yurt dışındaki doğumlar hiçbir seride yer almaz, bu yüzden göçmenler arasında yaygın adlar olduklarından genç görünür. Norveç serisi 1945'te başlar, bu yüzden daha önce doğanlar eksiktir. ABD yaşam tablosu Fransa ve Norveç için de kullanılır.
POST /api/v1/age/bulk, `names` içinde en fazla 100 ad alır; her ad 1 kredidir ve sonuçlar gönderilen sırayla döner.
Bakiye
Kredi bakiyenizi ve bugünkü ücretsiz kullanım hakkınızdan kalanı okuyun. Bu çağrı ücretlendirilmez.
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
}
Latin Dışı Yazı Sistemleri
Bir adı kendi yazı sisteminde gönderin ve biz bunu referans verilere bağlarız. Ek parametre gerekmez: yazı sistemini otomatik olarak tespit eder ve uygun stratejiyi uygularız.
Arapça yazı kısa ünlüleri atlar, bu nedenle محمد "mhmd" olarak transkripsiyonu yapılırken verilerimizde "muhammed" olarak bulunur. Bunun yerine ünsüz deseniyle eşleştiririz ve dişil ة işaretini koruriz, böylece خالد (Khalid) ve خالدة (Khalida) ayrı kalır. Arapça yazıyla yazılmış Farsça ve Urduca adları da kapsar.
Pinyin'e dönüştürülür. Çince'de soyadı önce gelir, bu nedenle 李明 soyadı 李 (Li) ve verilen adı 明 (Ming) 'dir — arama yapmadan önce soyadı çıkarırız. Tek bir karakter tam bir verilen addır ve tek bir ad olarak işlem görür.
Çince'nin aynı soyadı-önce işlemesi, yaygın Korece soyadlarıyla uygulanır.
Hiragana ve katakana doğru şekilde okunur (ひろし → Hiroshi).
Rus, Ukraynaca, Bulgarca ve Sırpça adlar doğrudan transkripsiyonu yapılır.
Hintçe, Marathi ve Nepalce adlar. Sondaki doğal ünlü işlem görür (राहुल → Rahul, "Rahula" değil).
Japonca kanji ve Çince karakterler aynı Unicode aralığını işgal ettiği için, yalnızca karakterlerden bunları ayırt edemeyiz. Han girişi Çince olarak okunur: zaten kelimesi kelimesine tuttuğumuz bir kanji adı, Mandarin okunuşunu alır ve bu da Japonca bir ad için genellikle yanlıştır (健太, ad Kenta olduğunda "jian tai" olarak okunur). Tuttuğumuz adlar tam olarak eşleşir ve doğrudur. Emin olmak için Japonca adları kana veya Latin yazısında gönderin.
Thai, Arapça gibi ünlüleri atlar ve kendi eşleştirme katmanına ihtiyaç duyar. Henüz oluşturulmadığı için bunlar null döndürür.
# 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" }
Kopyalanamadı. Metni seçip kopyalayın.
Bir yazıyı hiç şekilde köprüleyemediğimizde, yanıt gender: null ve source: none şeklindedir. source alanını kontrol edin: script, çeviriyazı yaptığımız anlamına gelir; db, gönderdiğiniz karakterleri doğrudan eşleştirdiğimiz anlamına gelir. İkisinin farklı güven seviyeleri vardır ve hangisini aldığınızı gösteririz.
Yanıt alanları
Tüm endpoint'ler arasında aynıdır.
| Alan | Tür | Açıklama |
|---|---|---|
credits_charged
|
integer
|
Bu çağrı için düşülen kredi sayısı. |
credits_remaining
|
integer
|
Bu çağrının ücreti düşüldükten sonra harcayabileceğiniz bakiye: satın alınan krediler artı bugünkü ücretsiz hakkınızdan kalan. |
query
|
string
|
Herhangi bir temizlemeden önce, tam olarak gönderdiğiniz haliyle giriş. |
name
|
string
|
Unvanlar ve soyadları çıkardıktan sonra arama yaptığımız ad. |
first_name
|
string
|
Girdiden ayrılan ad. Cinsiyet null olsa da döner, ek kredi almaz. |
middle_name
|
string
|
Ad ile soyadı arasındaki diğer adlar. Baş harfler atılır. |
last_name
|
string
|
Soyadı; van, de la gibi ekler dahil. Kullanıcı adlarında her zaman null. |
name_type
|
string
|
personal, organization (Acme LLC) ya da role (info@, Müşteri Hizmetleri). Kurum ve rol hesapları cinsiyet almaz. |
gender
|
string
|
Erkek, kadın veya söyleyecek kadar emin olmadığımız zaman null. |
country
|
string
|
İstatistiklerin kaynağı olan ülke veya küresel toplama için null. |
country_source
|
string
|
Ülkenin nereden geldiği: country, locale, ip ya da cevap dünya geneliyse null. |
sample_size
|
integer
|
Bu yanıtın arkasındaki kayıtlı kişi sayısı. 0, kaynağın denetleyebileceğimiz bir sayı değil, oran veya varlık kaydı yayımladığı anlamına gelir. |
probability
|
integer
|
Sayımlı veride gözlenen baskın cinsiyet oranı. Sayımsız veri 100 altında sınırlandırılır; cinsiyet null ise 0. |
took_ms
|
integer
|
Sorguyu çözümlemek için harcadığımız süre, tam milisaniye olarak. Sizin taraftaki ağ süresi dahil değildir. |
Diğer hizmetlerin sunmadığı kanıt alanları
confidence, sayımlı kanıtı örneklemsiz kayıttan ayırır. source yanıtın kaynağını, matched_as ise bulanık eşleşmenin ulaştığı kaydı belirtir.
| Alan | Tür | Açıklama |
|---|---|---|
source
|
string
|
db, script, fuzzy, llm veya none. |
confidence
|
string
|
Örneklem kanıtına göre high, medium, low, unverified veya unknown. |
matched_as
|
string
|
Bulanık eşleşme için eşleşen veritabanı girişi. Aksi takdirde null. |
Hata kodları
Bir çağrının başarısız olduğunu HTTP durum kodu söyler. JSON gövdesi ardından nedeni error alanında adlandırır, message alanında açıklar ve desteğe iletebileceğiniz bir request_id ile aşağıdaki ilgili satıra giden bir doküman bağlantısı verir. Mantığınızı her zaman error'a göre kurun, asla message'a göre değil: iletiler çevrilir ve yeniden yazılabilir.
| Kod | HTTP | Anlamı |
|---|---|---|
missing_key |
401 | API anahtarı gönderilmedi. İsteğe bir Authorization: Bearer başlığı veya X-Api-Key başlığı ekleyin. |
invalid_key |
401 | Bu API anahtarı geçerli değil. |
revoked_key |
401 | Bu API anahtarı iptal edilmiştir. |
blocked |
403 | Bu hesap askıya alınmıştır. Destek ekibiyle iletişime geçiniz. |
email_not_verified |
403 | Bu hesabın e-posta adresi henüz doğrulanmadı. Size gönderdiğimiz doğrulama bağlantısını açın ya da panelden yeni bir tane isteyin. |
ip_not_allowed |
403 | Bu IP adresinden gelen isteklere bu anahtar için izin verilmez. |
proxy_secret_required |
403 | Bu anahtar yalnızca API pazaryerinden çalışır ve her isteği imzalar. Orada size verilen anahtarı kullanın. |
forbidden |
403 | Bu işlemi gerçekleştirme izniniz yok. |
no_credits |
402 | Kredileriniz tükendi. Daha fazla satın alınız veya günlük ücretsiz kotanızın sıfırlanmasını bekleyiniz. |
missing_input |
400 | "name" parametresi zorunludur. |
invalid_input |
422 | "name" parametresi geçerli değil. |
too_many_items |
422 | Bir istekte en fazla 100 öğe gönderilebilir. |
ai_consent_required |
422 | ai_fallback, adı bir üçüncü taraf AI sağlayıcısına gönderir ve bu hesap buna onay vermemiştir. Sağlayıcının kim olduğunu "ai" alanından kontrol edin, ardından dashboard ayarlarınızdan AI sorgularını etkinleştirin. |
unknown_endpoint |
404 | Bu yolda hiçbir endpoint yok. URL'yi API belgelerine karşı kontrol edin. |
method_not_allowed |
405 | Bu endpoint DELETE isteklerini kabul etmiyor. |
payload_too_large |
413 | İstek gövdesi çok büyük. |
rate_limited |
429 | Çok fazla istek. Yavaşlayınız ve kısa bir süre sonra tekrar deneyiniz. |
batch_not_found |
404 | Bu hesapta bu kimliğe sahip bir dosya işi yok. |
batch_not_startable |
409 | Bu iş zaten başlatılmış ya da kapatılmış. |
batch_not_finished |
409 | Bu iş henüz bitmedi. Durumunu kontrol edin ve tamamlandığında sonucu indirin. |
batch_in_progress |
409 | Bu iş şu anda işleniyor ve iptal edilemez. Bittikten sonra silebilirsiniz. |
result_gone |
410 | Bu işin indirilecek sonucu yok. İş başarısız oldu, iptal edildi, süresi doldu ya da tek indirmelik sonucu zaten alındı. |
too_many_batches |
429 | Zaten çalışan 100 dosya işiniz var. Yenisini başlatmadan önce birinin bitmesini bekleyin. |
not_ready |
503 | İsim veritabanı yeniden oluşturuluyor. Birazdan tekrar deneyiniz. |
server_error |
500 | Bizim tarafımızda bir sorun oluştu. Bilgilendirilmiş olup çözüm için çalışılmaktadır. |
{
"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"
}
Kopyalanamadı. Metni seçip kopyalayın.
Oran sınırları
Normal kullanım bir sınıra ulaşmaz. Bu sınır, sızan bir anahtarın kötüye kullanılmasını engellemek için vardır ve IP yerine API anahtarı başına sayılır, böylece bir sunucuda birden fazla müşteri birbirinin payını tüketmez.
Geçerli sınır: Anahtar başına dakikada 1.200 istek. Daha fazlasına mı ihtiyacınız var? Sorun, hesabınızda artıracağız.
Her yanıt standart X-RateLimit-Limit ve X-RateLimit-Remaining header'larını taşır.
GET isteklerinde boşluklar ve Latin dışı harfler
Ayşe Yılmaz veya 中村 gibi bir ad, URL içinde yazıldığı haliyle taşınamaz. GET ile çağırırken değeri yüzde kodlamasıyla (percent-encoding) kodlayın ya da POST ile bir JSON gövdesinde gönderip kodlamayı tamamen atlayın.
Ayşe Yılmaz -> Ay%C5%9Fe%20Y%C4%B1lmaz
محمد -> %D9%85%D8%AD%D9%85%D8%AF
中村 -> %E4%B8%AD%E6%9D%91
Kopyalanamadı. Metni seçip kopyalayın.