Genel Bakış
QRZ73 Callbook Public API, ham amatör radyo çağrı işareti verilerine
programatik erişim sağlar. Tüm istekler HTTPS üzerinden yapılır
ve JSON formatında yanıt döner.
https://qrz73.org.tr/public-api/v1
application/json; charset=utf-8
X-API-Key header
Anahtara özel limitler
Kimlik Doğrulama
ZorunluTüm API istekleri kimlik doğrulama gerektirir. Anahtarınızı iki farklı şekilde iletebilirsiniz:
# Her istekte bu header'ı ekleyin X-API-Key:
https://qrz73.org.tr/public-api/v1/callsign?call=TB1TFO&api_key=
/public-api/v1/callsign
Query Parametreleri
callTB1TFOKod Örnekleri
# cURL ile çağrı işareti sorgulama curl -X GET \ "https://qrz73.org.tr/public-api/v1/callsign?call=TB1TFO" \ -H "X-API-Key: " \ -H "Accept: application/json"
<?php $apiKey = ''; $call = 'TB1TFO'; $url = "https://qrz73.org.tr/public-api/v1/callsign?call={$call}"; $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "X-API-Key: {$apiKey}", 'Accept: application/json', ], ]); $response = json_decode(curl_exec($ch), true); curl_close($ch); if ($response['ok']) { $op = $response['data']; echo "{$op['callsign']} — {$op['name']}\n"; }
import requests API_KEY = "" BASE = "https://qrz73.org.tr/public-api/v1" headers = {"X-API-Key": API_KEY} resp = requests.get( f"{BASE}/callsign", params={"call": "TB1TFO"}, headers=headers ) data = resp.json() if data["ok"]: op = data["data"] print(f"{op['callsign']} — {op['name']}")
// fetch() ile çağrı işareti sorgulama const API_KEY = ''; const BASE = 'https://qrz73.org.tr/public-api/v1'; async function getCallsign(call) { const res = await fetch( `${BASE}/callsign?call=${call}`, { headers: { 'X-API-Key': API_KEY } } ); const data = await res.json(); if (data.ok) { console.log(data.data.callsign, data.data.name); } } getCallsign('TB1TFO');
// Gradle: implementation("com.squareup.okhttp3:okhttp:4.12.0") import okhttp3.OkHttpClient import okhttp3.Request import org.json.JSONObject val client = OkHttpClient() fun getCallsign(call: String): JSONObject? { val request = Request.Builder() .url("https://qrz73.org.tr/public-api/v1/callsign?call=$call") .addHeader("X-API-Key", "") .addHeader("Accept", "application/json") .build() client.newCall(request).execute().use { response -> if (!response.isSuccessful) return null val json = JSONObject(response.body!!.string()) if (json.getBoolean("ok")) return json.getJSONObject("data") } return null } // Kullanım (Coroutine içinde): val op = getCallsign("TB1TFO") println("${op?.getString("callsign")} — ${op?.getString("name")}")
import Foundation let apiKey = "" let call = "TB1TFO" let url = URL(string: "https://qrz73.org.tr/public-api/v1/callsign?call=\(call)")! var request = URLRequest(url: url) request.setValue(apiKey, forHTTPHeaderField: "X-API-Key") request.setValue("application/json", forHTTPHeaderField: "Accept") let task = URLSession.shared.dataTask(with: request) { data, _, _ in guard let data, let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any], json["ok"] as? Bool == true, let op = json["data"] as? [String: Any] else { return } let callsign = op["callsign"] as? String ?? "" let name = op["name"] as? String ?? "" print("\(callsign) — \(name)") } task.resume()
using System.Net.Http; using System.Text.Json; var apiKey = ""; var call = "TB1TFO"; var url = $"https://qrz73.org.tr/public-api/v1/callsign?call={call}"; using var http = new HttpClient(); http.DefaultRequestHeaders.Add("X-API-Key", apiKey); http.DefaultRequestHeaders.Add("Accept", "application/json"); var resp = await http.GetStringAsync(url); var doc = JsonDocument.Parse(resp).RootElement; if (doc.GetProperty("ok").GetBoolean()) { var op = doc.GetProperty("data"); Console.WriteLine($"{op.GetProperty("callsign").GetString()} — {op.GetProperty("name").GetString()}"); }
package main import ( "encoding/json" "fmt" "io" "net/http" ) func main() { apiKey := "" call := "TB1TFO" url := fmt.Sprintf("https://qrz73.org.tr/public-api/v1/callsign?call=%s", call) req, _ := http.NewRequest("GET", url, nil) req.Header.Set("X-API-Key", apiKey) req.Header.Set("Accept", "application/json") resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) var result struct { Ok bool `json:"ok"` Data struct { Callsign string `json:"callsign"` Name string `json:"name"` } `json:"data"` } json.Unmarshal(body, &result) if result.Ok { fmt.Printf("%s — %s\n", result.Data.Callsign, result.Data.Name) } }
// pubspec.yaml: http: ^1.2.0 import 'package:http/http.dart' as http; import 'dart:convert'; const apiKey = ''; const base = 'https://qrz73.org.tr/public-api/v1'; Future<void> getCallsign(String call) async { final uri = Uri.parse('$base/callsign?call=$call'); final resp = await http.get(uri, headers: {'X-API-Key': apiKey}); final json = jsonDecode(resp.body) as Map<String, dynamic>; if (json['ok'] == true) { final op = json['data'] as Map<String, dynamic>; print('${op["callsign"]} — ${op["name"]}'); } } void main() => getCallsign('TB1TFO');
// Standart kütüphane — ekstra bağımlılık yok import java.io.*; import java.net.*; import java.nio.charset.StandardCharsets; public class QRZ73Example { static final String API_KEY = ""; static final String BASE = "https://qrz73.org.tr/public-api/v1"; public static void main(String[] args) throws Exception { URL url = new URL(BASE + "/callsign?call=TB1TFO"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestProperty("X-API-Key", API_KEY); conn.setRequestProperty("Accept", "application/json"); try (BufferedReader br = new BufferedReader( new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) { StringBuilder sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) sb.append(line); System.out.println(sb); // JSON string } } }
require 'net/http' require 'json' API_KEY = '' BASE = 'https://qrz73.org.tr/public-api/v1' uri = URI("#{BASE}/callsign?call=TB1TFO") req = Net::HTTP::Get.new(uri) req['X-API-Key'] = API_KEY req['Accept'] = 'application/json' res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) } data = JSON.parse(res.body) if data['ok'] op = data['data'] puts "#{op['callsign']} — #{op['name']}" end
// Cargo.toml: // reqwest = { version = "0.12", features = ["json"] } // tokio = { version = "1", features = ["full"] } // serde_json = "1" use reqwest::Client; #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let api_key = ""; let base = "https://qrz73.org.tr/public-api/v1"; let resp = Client::new() .get(format!("{}/callsign?call=TB1TFO", base)) .header("X-API-Key", api_key) .header("Accept", "application/json") .send().await? .json::<serde_json::Value>().await?; if resp["ok"].as_bool().unwrap_or(false) { let op = &resp["data"]; println!("{} — {}", op["callsign"], op["name"]); } Ok(()) }
// Deno veya Node 18+ (native fetch) const API_KEY = ''; const BASE = 'https://qrz73.org.tr/public-api/v1'; interface CallsignData { callsign: string; name: string | null; license_class: string | null; dmr_ids: number[]; nxdn_ids: number[]; is_verified: boolean; } async function getCallsign(call: string): Promise<CallsignData | null> { const res = await fetch(`${BASE}/callsign?call=${call}`, { headers: { 'X-API-Key': API_KEY }, }); const json = await res.json() as { ok: boolean; data: CallsignData }; return json.ok ? json.data : null; } const op = await getCallsign('TB1TFO'); if (op) console.log(`${op.callsign} — ${op.name}`);
// npm install axios const axios = require('axios'); const API_KEY = ''; const BASE = 'https://qrz73.org.tr/public-api/v1'; async function getCallsign(call) { const { data } = await axios.get(`${BASE}/callsign`, { params: { call }, headers: { 'X-API-Key': API_KEY }, }); if (data.ok) { const op = data.data; console.log(`${op.callsign} — ${op.name}`); console.log('DMR IDs:', op.dmr_ids); } } getCallsign('TB1TFO');
// Derleme: g++ -o example example.cpp -lcurl #include <curl/curl.h> #include <iostream> #include <string> static size_t writeCallback(void* buf, size_t sz, size_t n, std::string* out) { out->append((char*)buf, sz * n); return sz * n; } int main() { const std::string apiKey = ""; const std::string url = "https://qrz73.org.tr/public-api/v1/callsign?call=TB1TFO"; CURL* curl = curl_easy_init(); std::string response; struct curl_slist* hdrs = nullptr; hdrs = curl_slist_append(hdrs, ("X-API-Key: " + apiKey).c_str()); hdrs = curl_slist_append(hdrs, "Accept: application/json"); curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, hdrs); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); curl_easy_perform(curl); curl_slist_free_all(hdrs); curl_easy_cleanup(curl); std::cout << response << std::endl; // JSON string return 0; }
Yanıt Örneği 200 OK
{
"ok": true,
"data": {
"callsign": "TB1TFO",
"name": "Fatih ÖNDER",
"license_class": "C",
"city": "İstanbul",
"district": "Çekmeköy",
"country": "Turkey",
"grid_locator": "KN41oa",
"dmr_ids": [2860722],
"nxdn_ids": [826],
"is_verified": true,
"is_silent_key": false,
"qsl_methods": {
"bureau": true,
"lotw": true,
"eqsl": false
},
"bands": "HF, VHF, UHF",
"operating_modes": "SSB, CW, FT8, DMR"
},
"meta": {
"version": "1.0",
"timestamp": "2026-05-16T12:00:00+00:00",
"response_time_ms": 12,
"callsign": "TB1TFO"
}
}
Yanıt Alanları
callsign — Çağrı işaretilicense_class — Lisans sınıfı (A/B/C)grid_locator — Maidenhead grid locatordmr_ids — DMR kimlik numaraları (dizi, boş olabilir)nxdn_ids — NXDN kimlik numaraları (dizi, boş olabilir)is_verified — Belge doğrulandı mıis_silent_key — SK (Silent Key) durumuqsl_methods — QSL gönderim yöntemlerioperating_modes — Çalışma modları (gizlilik ayarına bağlı)null dönebilir./public-api/v1/search
Query Parametreleri
qTB1limit1, Max: 50, Varsayılan: 10Kod Örnekleri
curl -X GET \ "https://qrz73.org.tr/public-api/v1/search?q=TB1&limit=10" \ -H "X-API-Key: "
<?php $apiKey = ''; $url = "https://qrz73.org.tr/public-api/v1/search?q=TB1&limit=10"; $ctx = stream_context_create([ 'http' => [ 'header' => "X-API-Key: {$apiKey}\r\n", ] ]); $json = file_get_contents($url, false, $ctx); $data = json_decode($json, true); foreach ($data['data'] as $op) { echo "{$op['callsign']} — {$op['name']}\n"; }
import requests resp = requests.get( "https://qrz73.org.tr/public-api/v1/search", params={"q": "TB1", "limit": 10}, headers={"X-API-Key": ""} ) for op in resp.json()["data"]: print(op["callsign"], "—", op["name"])
const res = await fetch( `https://qrz73.org.tr/public-api/v1/search?q=TB1&limit=10`, { headers: { 'X-API-Key': '' } } ); const { data } = await res.json(); data.forEach(op => console.log(op.callsign, op.name));
// Gradle: implementation("com.squareup.okhttp3:okhttp:4.12.0") import okhttp3.OkHttpClient import okhttp3.Request import org.json.JSONObject val client = OkHttpClient() fun search(q: String, limit: Int = 10): List<JSONObject> { val request = Request.Builder() .url("https://qrz73.org.tr/public-api/v1/search?q=$q&limit=$limit") .addHeader("X-API-Key", "") .build() client.newCall(request).execute().use { response -> if (!response.isSuccessful) return emptyList() val json = JSONObject(response.body!!.string()) if (!json.getBoolean("ok")) return emptyList() val arr = json.getJSONArray("data") return (0 until arr.length()).map { arr.getJSONObject(it) } } } search("TB1").forEach { println("${it.getString("callsign")} — ${it.getString("name")}") }
import Foundation let apiKey = "" let url = URL(string: "https://qrz73.org.tr/public-api/v1/search?q=TB1&limit=10")! var request = URLRequest(url: url) request.setValue(apiKey, forHTTPHeaderField: "X-API-Key") URLSession.shared.dataTask(with: request) { data, _, _ in guard let data, let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any], json["ok"] as? Bool == true, let items = json["data"] as? [[String: Any]] else { return } for op in items { let cs = op["callsign"] as? String ?? "" let name = op["name"] as? String ?? "" print("\(cs) — \(name)") } }.resume()
using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.Add("X-API-Key", ""); var resp = await http.GetStringAsync( "https://qrz73.org.tr/public-api/v1/search?q=TB1&limit=10" ); var doc = JsonDocument.Parse(resp).RootElement; if (doc.GetProperty("ok").GetBoolean()) { foreach (var op in doc.GetProperty("data").EnumerateArray()) { Console.WriteLine( $"{op.GetProperty("callsign").GetString()} — {op.GetProperty("name").GetString()}" ); } }
package main import ( "encoding/json" "fmt" "io" "net/http" ) func main() { req, _ := http.NewRequest("GET", "https://qrz73.org.tr/public-api/v1/search?q=TB1&limit=10", nil) req.Header.Set("X-API-Key", "") resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) var result struct { Ok bool `json:"ok"` Data []struct { Callsign string `json:"callsign"` Name string `json:"name"` } `json:"data"` } json.Unmarshal(body, &result) for _, op := range result.Data { fmt.Printf("%s — %s\n", op.Callsign, op.Name) } }
// pubspec.yaml: http: ^1.2.0 import 'package:http/http.dart' as http; import 'dart:convert'; const apiKey = ''; const base = 'https://qrz73.org.tr/public-api/v1'; Future<void> search(String q, {int limit = 10}) async { final uri = Uri.parse('$base/search?q=$q&limit=$limit'); final resp = await http.get(uri, headers: {'X-API-Key': apiKey}); final json = jsonDecode(resp.body) as Map<String, dynamic>; if (json['ok'] == true) { final items = json['data'] as List; for (final op in items) { print('${op["callsign"]} — ${op["name"]}'); } } } void main() => search('TB1');
// Standart kütüphane — ekstra bağımlılık yok import java.io.*; import java.net.*; import java.nio.charset.StandardCharsets; public class QRZ73Search { static final String API_KEY = ""; static final String BASE = "https://qrz73.org.tr/public-api/v1"; public static void main(String[] args) throws Exception { URL url = new URL(BASE + "/search?q=TB1&limit=10"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestProperty("X-API-Key", API_KEY); conn.setRequestProperty("Accept", "application/json"); try (BufferedReader br = new BufferedReader( new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) { StringBuilder sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) sb.append(line); System.out.println(sb); // JSON string } } }
require 'net/http' require 'json' API_KEY = '' BASE = 'https://qrz73.org.tr/public-api/v1' uri = URI("#{BASE}/search?q=TB1&limit=10") req = Net::HTTP::Get.new(uri) req['X-API-Key'] = API_KEY res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) } data = JSON.parse(res.body) if data['ok'] data['data'].each do |op| puts "#{op['callsign']} — #{op['name']}" end end
// Cargo.toml: // reqwest = { version = "0.12", features = ["json"] } // tokio = { version = "1", features = ["full"] } // serde_json = "1" use reqwest::Client; #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let api_key = ""; let base = "https://qrz73.org.tr/public-api/v1"; let resp = Client::new() .get(format!("{}/search?q=TB1&limit=10", base)) .header("X-API-Key", api_key) .send().await? .json::<serde_json::Value>().await?; if resp["ok"].as_bool().unwrap_or(false) { for op in resp["data"].as_array().unwrap_or(&vec![]) { println!("{} — {}", op["callsign"], op["name"]); } } Ok(()) }
// Deno veya Node 18+ (native fetch) const API_KEY = ''; const BASE = 'https://qrz73.org.tr/public-api/v1'; interface SearchResult { callsign: string; name: string | null; city: string | null; license_class: string | null; is_verified: boolean; } async function search(q: string, limit = 10): Promise<SearchResult[]> { const res = await fetch(`${BASE}/search?q=${q}&limit=${limit}`, { headers: { 'X-API-Key': API_KEY }, }); const json = await res.json() as { ok: boolean; data: SearchResult[] }; return json.ok ? json.data : []; } const results = await search('TB1'); results.forEach(op => console.log(`${op.callsign} — ${op.name}`));
// npm install axios const axios = require('axios'); const API_KEY = ''; const BASE = 'https://qrz73.org.tr/public-api/v1'; async function search(q, limit = 10) { const { data } = await axios.get(`${BASE}/search`, { params: { q, limit }, headers: { 'X-API-Key': API_KEY }, }); if (data.ok) { data.data.forEach(op => console.log(`${op.callsign} — ${op.name}`)); } } search('TB1');
// Derleme: g++ -o example example.cpp -lcurl #include <curl/curl.h> #include <iostream> #include <string> static size_t writeCallback(void* buf, size_t sz, size_t n, std::string* out) { out->append((char*)buf, sz * n); return sz * n; } int main() { const std::string apiKey = ""; const std::string url = "https://qrz73.org.tr/public-api/v1/search?q=TB1&limit=10"; CURL* curl = curl_easy_init(); std::string response; struct curl_slist* hdrs = nullptr; hdrs = curl_slist_append(hdrs, ("X-API-Key: " + apiKey).c_str()); hdrs = curl_slist_append(hdrs, "Accept: application/json"); curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, hdrs); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); curl_easy_perform(curl); curl_slist_free_all(hdrs); curl_easy_cleanup(curl); std::cout << response << std::endl; // JSON string return 0; }
Yanıt Örneği 200 OK
{
"ok": true,
"data": [
{
"callsign": "TB1AA",
"name": "Mehmet Kaya",
"city": "Ankara",
"country": "Turkey",
"license_class": "B",
"is_verified": false,
"is_silent_key": false
}
],
"meta": {
"version": "1.0",
"timestamp": "2026-05-16T12:00:00+00:00",
"response_time_ms": 8,
"query": "TB1",
"count": 1,
"limit": 10
}
}
Yanıt Formatı
Tüm yanıtlar aynı kök yapıya sahiptir:
{
"ok": true | false, // İşlem başarılı mı?
"data": { ... } | [ ... ], // Başarılı yanıt verisi
"error": "mesaj", // Hata mesajı (ok=false)
"meta": {
"version": "1.0",
"timestamp": "ISO 8601",
"response_time_ms": 12 // Yanıt süresi ms
}
}
HTTP Hata Kodları
ok: true ve veri döner.error alanı nedeni açıklar.Retry-After header'ına bakın.Hata Yanıtı Örneği
{
"ok": false,
"error": "'XY9ZZZ' çağrı işareti bulunamadı",
"code": 404,
"meta": {
"version": "1.0",
"timestamp": "2026-05-16T12:00:00+00:00"
}
}
Rate Limiting
API'de plan bazlı kota sistemi kullanılmaktadır. Her plan belirli bir istek kotasına sahiptir; kota dolduğunda anahtar otomatik olarak kilitlenir ve ilgili süre sonunda kota sıfırlanarak yeniden kullanılabilir hale gelir. Mevcut kota durumu her yanıtta HTTP header'larında iletilir.
X-RateLimit-Plan
Aktif plan adı (free, basic, premium, ultra)
X-RateLimit-Limit
Plan kotası — pencere başına maksimum istek sayısı
X-RateLimit-Used
Mevcut pencerede kullanılan istek sayısı
X-RateLimit-Remaining
Mevcut pencerede kalan istek hakkı
X-RateLimit-Window
Kilit penceresi süresi (örn. 24h, 12h, 6h)
X-RateLimit-Reset
Kotanın sıfırlanacağı Unix zaman damgası (kilit durumunda)
Retry-After
429 durumunda beklenmesi gereken süre (saniye)
Retry-After veya X-RateLimit-Reset değerini kullanarak ne zaman yeniden deneyeceğinizi hesaplayabilirsiniz.
Plan Yükseltme
Daha yüksek kotaya ihtiyaç duyuyorsanız API Portalı'ndan üst bir plan talep edebilirsiniz. Planlar aşağıda detaylıca açıklanmıştır.
Planlar & Fiyatlar
Kota dolduğunda API anahtarı belirtilen süre boyunca kilitlenir; süre bitiminde kota sıfırlanır ve yeniden kullanılabilir hale gelir. Ücretli planlar aylık abonelik ile aktif edilir.
- 30 istek / pencere
- Kota dolunca 24 saat kilitli
- JSON yanıt & tüm endpointler
- X-API-Key kimlik doğrulama
- 100 istek / pencere
- Kota dolunca 24 saat kilitli
- JSON yanıt & tüm endpointler
- X-API-Key kimlik doğrulama
- 300 istek / pencere
- Kota dolunca 12 saat kilitli
- JSON yanıt & tüm endpointler
- X-API-Key kimlik doğrulama
- 1,000 istek / pencere
- Kota dolunca 6 saat kilitli
- JSON yanıt & tüm endpointler
- X-API-Key kimlik doğrulama