REST API v1.0 Aktif JSON

QRZ73 Callbook
Public API

Çağrı işareti sorgulama ve arama için açık REST API.
Kendi uygulamanıza entegre etmek için tek ihtiyacınız bir API anahtarı.

2
Endpoint
JSON
Format
REST
Mimari
TLS
Güvenlik
GET /public-api/v1/callsign?call=TB1TFO
200 OK 12ms
{
  "ok": true,
  "data": {
    "callsign": "TB1TFO",
    "name": "Fatih ÖNDER",
    "is_verified": true
  }
}

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.

Base URL
https://qrz73.org.tr/public-api/v1
Format
application/json; charset=utf-8
Kimlik Doğrulama
X-API-Key header
Rate Limiting
Anahtara özel limitler

Kimlik Doğrulama

Zorunlu

Tüm API istekleri kimlik doğrulama gerektirir. Anahtarınızı iki farklı şekilde iletebilirsiniz:

HTTP Header Önerilen
# Her istekte bu header'ı ekleyin
X-API-Key: 
Query Parameter
https://qrz73.org.tr/public-api/v1/callsign?call=TB1TFO&api_key=
API anahtarı gerekli. Kullanabilmek için önce giriş yapın ve API Portalı'ndan talep oluşturun.
GET /public-api/v1/callsign
Çağrı işaretine göre operatör profili getirir

Query Parametreleri

Parametre
Tip
Zorunlu
Açıklama
call
string
Evet
Çağrı işareti (büyük/küçük harf duyarsız). Örn: TB1TFO

Kod Ö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şareti
license_class — Lisans sınıfı (A/B/C)
grid_locator — Maidenhead grid locator
dmr_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) durumu
qsl_methods — QSL gönderim yöntemleri
operating_modes — Çalışma modları (gizlilik ayarına bağlı)
Bazı alanlar kullanıcının gizlilik tercihine göre null dönebilir.

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ı

Kod
Durum
Açıklama
200
OK
İstek başarılı, ok: true ve veri döner.
400
Bad Request
Eksik veya geçersiz parametre. error alanı nedeni açıklar.
401
Unauthorized
API anahtarı eksik, geçersiz veya süresi dolmuş.
403
Forbidden
IP adresi veya endpoint için erişim izni yok.
404
Not Found
Sorgulanan çağrı işareti kayıtlı değil.
429
Too Many Requests
Rate limit aşıldı. Retry-After header'ına bakın.
500
Internal Server Error
Sunucu tarafında beklenmeyen hata.

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)
Kota dolduğunda 429 Too Many Requests döner. 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.

Şeffaflık Bildirimi — Neden Ücretli?

QRZ73 Callbook, amatör telsiz topluluğuna ücretsiz ve açık bir platform sunmayı temel ilke olarak benimsemiştir. API erişiminde uygulanan ücretlendirme, yalnızca platformun sürdürülebilirliğini sağlamak amacıyla belirlenmekte olup sunucu barındırma, alan adı tescili ile teknik bakım ve yapılandırma giderlerini karşılamaya yöneliktir.

Bu platform kâr amacı gütmemektedir. API gelirlerinden site sahibi ve yöneticileri hiçbir kişisel kazanç elde etmemektedir; toplanan ücretlerin tamamı platformun işletim maliyetlerine ve amatör telsiz topluluğuna kesintisiz hizmet sunulmasına tahsis edilmektedir.

Ücretsiz
Ücretsiz
  • 30 istek / pencere
  • Kota dolunca 24 saat kilitli
  • JSON yanıt & tüm endpointler
  • X-API-Key kimlik doğrulama
Ücretsiz Başla
Basic
₺300/ay
  • 100 istek / pencere
  • Kota dolunca 24 saat kilitli
  • JSON yanıt & tüm endpointler
  • X-API-Key kimlik doğrulama
Talep Et
Premium
₺500/ay
  • 300 istek / pencere
  • Kota dolunca 12 saat kilitli
  • JSON yanıt & tüm endpointler
  • X-API-Key kimlik doğrulama
Talep Et
Tüm planlar admin onayı ile aktive edilir. API Portalı'ndan talep oluşturun; ücretli planlar için ödeme bilgileri onay sürecinde iletilecektir.