YAYİNİ.NET API

Kapsamlı Radyo İstasyonları API Dokümantasyonu

v1.2 - Güncellendi: 03.09.2025

APİ Durum

Giriş

YAYİNİ.NET API, radyo istasyonları veritabanına kapsamlı programlı erişim sağlar. Bu API ile radyo istasyonları listesi, kategori bilgileri, kullanıcı işlemleri, dinleme istatistikleri ve daha fazlasını yönetebilirsiniz.

Önemli: Tüm API çağrıları HTTPS üzerinden yapılmalıdır. HTTP çağrıları güvenlik nedeniyle reddedilir.

Taban URL

http://yayini.net/api/

Genel Yanıt Formatı

Tüm API yanıtları aşağıdaki JSON formatını kullanır:

{
    "success": true,
    "message": "İşlem başarılı",
    "timestamp": "2025-08-01 21:10:18",
    "data": {
        // İstek türüne göre değişen veri
    },
    "pagination": {
        "current_page": 1,
        "per_page": 20,
        "total_items": 150,
        "total_pages": 8,
        "has_next": true,
        "has_prev": false
    }
}

Kimlik Doğrulama

Mevcut API sürümünde, genel endpointler kimlik doğrulama gerektirmez. Ancak kullanıcıya özel işlemler için giriş yapılması gerekir.

Genel Endpointler (Kimlik Doğrulama Gerektirmez)

  • İstasyon listesi
  • Kategori listesi
  • Arama işlemleri
  • Genel istatistikler

Korumalı Endpointler (Giriş Gerektirir)

  • Favori işlemleri
  • Kullanıcı profili
  • Dinleme geçmişi
  • Dinleme oturum yönetimi
Gelecek Sürümler: API anahtarı tabanlı kimlik doğrulama sistemi eklenecektir.

İstek Limitleri

API'nin istikrarlı çalışması için istek limitleri uygulanmaktadır. Bu limitler IP adresi bazında hesaplanır.

Anonim Kullanıcılar
60 istek/dakika

IP bazında limitlenir

Kayıtlı Kullanıcılar
120 istek/dakika

Kullanıcı bazında limitlenir

Limit Aşımı Durumu

İstek limiti aşıldığında aşağıdaki yanıt alınır:

HTTP/1.1 429 Too Many Requests

{
    "success": false,
    "message": "Çok fazla istek. Lütfen bir dakika sonra tekrar deneyin.",
    "error_code": "RATE_LIMIT_EXCEEDED",
    "retry_after": 60
}

Endpoint Özeti

API'de mevcut olan tüm endpointlerin genel listesi:

Metod Endpoint Açıklama Auth
GET /api/?endpoint=stations Radyo istasyonlarını listeler
GET /api/?endpoint=station&id={id} Tek istasyon detayı
GET /api/?endpoint=categories Kategori listesi
GET /api/?endpoint=popular Popüler istasyonlar
GET /api/?endpoint=newest Yeni eklenen istasyonlar
GET /api/?endpoint=search&q={query} İstasyon arama
GET /api/?endpoint=genres Müzik türleri
GET /api/?endpoint=countries Ülke listesi
GET /api/?endpoint=stats Genel istatistikler
GET /api/random-station.php Rastgele istasyon
GET /api/station-status.php İstasyon durumu
POST /api/start-listening.php Dinleme başlat
POST /api/end-listening.php Dinleme sonlandır
GET /api/get-favorites.php Favori listesi
POST /api/toggle-favorite.php Favori ekle/çıkar
GET /api/get-user-profile.php Kullanıcı profili
GET /api/get-user-history.php Dinleme geçmişi
POST /api/clear-history.php Geçmişi temizle

Ana Endpointler

API'nin temel endpointleri ve kullanım detayları:

GET İstasyonlar Listesi
GET http://yayini.net/api/?endpoint=stations

Tüm aktif radyo istasyonlarını sayfalama ile listeler.

Parametreler
Parametre Tip Zorunlu Açıklama
page integer Opsiyonel Sayfa numarası (varsayılan: 1)
limit integer Opsiyonel Sayfa başına kayıt (1-50, varsayılan: 20)
genre string Opsiyonel Müzik türüne göre filtrele
country string Opsiyonel Ülkeye göre filtrele
language string Opsiyonel Dile göre filtrele
Örnek İstek
curl -X GET "http://yayini.net/api/?endpoint=stations&page=1&limit=10&genre=pop"
Örnek Yanıt
{
    "success": true,
    "data": [
        {
            "id": 1,
            "station_name": "MASALFM",
            "station_url": "https://rserver60.okeylisans.com/8140/stream",
            "stream_type": "shoutcast_v2",
            "logo": "default_radio.jpg",
            "description": "MASALFM",
            "genre": "POP",
            "country": "Türkiye",
            "language": "Türkçe",
            "bitrate": 320,
            "streaming_format": "mp3",
            "owner_name": "admin",
            "listen_count": 145,
            "today_listens": 23,
            "view_count": 892,
            "website": null,
            "created_at": "2025-07-27 21:37:40",
            "updated_at": "2025-07-29 14:58:04"
        }
    ],
    "pagination": {
        "current_page": 1,
        "per_page": 10,
        "total_items": 156,
        "total_pages": 16,
        "has_next": true,
        "has_prev": false
    },
    "filters": {
        "genre": "pop",
        "country": "",
        "language": ""
    },
    "timestamp": "2025-08-01 21:10:18"
}
GET İstasyon Detayı
GET http://yayini.net/api/?endpoint=station&id={station_id}

Belirli bir radyo istasyonunun detaylı bilgilerini getirir.

Parametreler
Parametre Tip Zorunlu Açıklama
id integer Zorunlu İstasyon ID'si
Yanıt Kodları
  • 200 Başarılı
  • 400 Geçersiz ID
  • 404 İstasyon bulunamadı

Kategoriler

GET Kategori Listesi
GET http://yayini.net/api/?endpoint=categories

Tüm aktif kategorileri ve her kategorideki istasyon sayısını listeler.

Örnek Yanıt
{
    "success": true,
    "data": [
        {
            "id": 1,
            "name": "Pop Müzik",
            "slug": "pop-muzik",
            "description": "Pop müzik radyo kanalları",
            "station_count": 45
        },
        {
            "id": 2,
            "name": "Rock Müzik",
            "slug": "rock-muzik",
            "description": "Rock müzik radyo kanalları",
            "station_count": 23
        }
    ],
    "count": 2,
    "timestamp": "2025-08-01 21:10:18"
}

Kullanıcı Endpointleri

Giriş yapmış kullanıcılar için özel endpointler:

GET Kullanıcı Profili Auth Gerekli
GET http://yayini.net/api/get-user-profile.php

Giriş yapmış kullanıcının profil bilgileri ve istatistiklerini getirir.

GET Dinleme Geçmişi Auth Gerekli
GET http://yayini.net/api/get-user-history.php

Kullanıcının dinleme geçmişini sayfalama ile listeler.

Parametreler
Parametre Tip Zorunlu Açıklama
page integer Opsiyonel Sayfa numarası
limit integer Opsiyonel Kayıt limiti
POST Geçmişi Temizle Auth Gerekli
POST http://yayini.net/api/clear-history.php

Kullanıcının tüm dinleme geçmişini siler.

Favoriler

GET Favori Listesi Auth Gerekli
GET http://yayini.net/api/get-favorites.php

Kullanıcının favori radyo istasyonlarını listeler.

POST Favori Ekle/Çıkar Auth Gerekli
POST http://yayini.net/api/toggle-favorite.php

Bir radyo istasyonunu favorilere ekler veya çıkarır.

İstek Gövdesi
{
    "station_id": 1,
    "action": "add"  // "add" veya "remove"
}

İstatistikler

GET Platform İstatistikleri
GET http://yayini.net/api/?endpoint=stats

Platform genelinde istatistik bilgilerini getirir.

Örnek Yanıt
{
    "success": true,
    "data": {
        "total_stations": 156,
        "total_users": 1247,
        "total_listens": 89564,
        "countries": 45,
        "weekly_new_stations": 12,
        "today_listens": 1568
    },
    "timestamp": "2025-08-01 21:10:18"
}
GET Online Kullanıcılar
GET http://yayini.net/api/get-online-users.php

Şu anda online olan kullanıcı sayısı ve detayları.

Yardımcı Endpointler

GET Rastgele İstasyon
GET http://yayini.net/api/random-station.php

Rastgele bir radyo istasyonu döndürür.

Parametreler
Parametre Tip Zorunlu Açıklama
genre string Opsiyonel Belirli türden seç
country string Opsiyonel Belirli ülkeden seç
exclude string Opsiyonel Hariç tutulacak ID'ler (virgülle ayrılmış)
GET İstasyon Durumu
GET http://yayini.net/api/station-status.php?station_id={id}

Bir radyo istasyonunun canlı durumunu ve dinleyici sayısını kontrol eder.

POST Dinleme Oturumu Yönetimi
POST http://yayini.net/api/start-listening.php
POST http://yayini.net/api/end-listening.php

Dinleme oturumlarını başlatma ve sonlandırma.

Dinleme Başlatma
{
    "station_id": 1
}
Dinleme Sonlandırma
{
    "session_id": "session_64f5a1b2c3d4e_1692649520"
}

Hata Kodları

API'de karşılaşabileceğiniz HTTP durum kodları ve anlamları:

Başarılı Yanıtlar
  • 200 OK İstek başarılı
İstemci Hataları
  • 400 Bad Request Geçersiz istek
  • 401 Unauthorized Giriş gerekli
  • 404 Not Found Kaynak bulunamadı
  • 429 Too Many Requests Çok fazla istek
Sunucu Hataları
  • 500 Internal Server Error Sunucu hatası
Özel Hata Kodları
  • RATE_LIMIT_EXCEEDED
    İstek limiti aşıldı
  • STATION_NOT_FOUND
    İstasyon bulunamadı
  • INVALID_SESSION
    Geçersiz oturum
  • DB_ERROR
    Veritabanı hatası

Örnek Kullanımlar

JavaScript ile API Kullanımı

// İstasyon listesi çekme
async function getStations() {
    try {
        const response = await fetch('http://yayini.net/api/?endpoint=stations&limit=10');
        const data = await response.json();
        
        if (data.success) {
            console.log('İstasyonlar:', data.data);
            return data.data;
        } else {
            console.error('Hata:', data.message);
        }
    } catch (error) {
        console.error('İstek hatası:', error);
    }
}

// Favori ekleme
async function addToFavorites(stationId) {
    try {
        const response = await fetch('http://yayini.net/api/toggle-favorite.php', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({
                station_id: stationId,
                action: 'add'
            })
        });
        
        const data = await response.json();
        
        if (data.success) {
            console.log('Favorilere eklendi!');
        } else {
            console.error('Hata:', data.message);
        }
    } catch (error) {
        console.error('İstek hatası:', error);
    }
}

// Dinleme oturumu başlatma
async function startListening(stationId) {
    try {
        const response = await fetch('http://yayini.net/api/start-listening.php', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({
                station_id: stationId
            })
        });
        
        const data = await response.json();
        
        if (data.success) {
            console.log('Dinleme başlatıldı, Session ID:', data.session_id);
            return data.session_id;
        }
    } catch (error) {
        console.error('Dinleme başlatma hatası:', error);
    }
}

PHP ile API Kullanımı

<?php
// İstasyon arama
function searchStations($query) {
    $url = 'http://yayini.net/api/?endpoint=search&q=' . urlencode($query);
    
    $response = file_get_contents($url);
    $data = json_decode($response, true);
    
    if ($data['success']) {
        return $data['data'];
    } else {
        throw new Exception($data['message']);
    }
}

// Kullanım örneği
try {
	    $stations = searchStations('pop');
    foreach ($stations as $station) {
        echo "İstasyon: " . $station['station_name'] . "\n";
        echo "Tür: " . $station['genre'] . "\n";
        echo "Ülke: " . $station['country'] . "\n";
        echo "---\n";
    }
} catch (Exception $e) {
    echo "Hata: " . $e->getMessage();
}

// cURL ile POST isteği
function makeApiRequest($endpoint, $data = null, $method = 'GET') {
    $ch = curl_init();
    
    curl_setopt($ch, CURLOPT_URL, 'http://yayini.net/api/' . $endpoint);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/json'
    ]);
    
    if ($method === 'POST' && $data) {
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
    }
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    
    if ($httpCode === 200) {
        return json_decode($response, true);
    } else {
        throw new Exception("HTTP $httpCode: $response");
    }
}

// Rastgele istasyon al
$randomStation = makeApiRequest('random-station.php?genre=rock');
if ($randomStation['success']) {
    echo "Rastgele Rock İstasyonu: " . $randomStation['data']['station_name'];
}
?>

Python ile API Kullanımı

import requests
import json

class RadioAPI:
    def __init__(self, base_url):
        self.base_url = base_url
        self.session = requests.Session()
    
    def get_stations(self, page=1, limit=20, genre=None, country=None):
        """İstasyon listesi çek"""
        params = {
            'endpoint': 'stations',
            'page': page,
            'limit': limit
        }
        
        if genre:
            params['genre'] = genre
        if country:
            params['country'] = country
            
        response = self.session.get(f"{self.base_url}/api/", params=params)
        
        if response.status_code == 200:
            return response.json()
        else:
            raise Exception(f"API Error: {response.status_code}")
    
    def search_stations(self, query, limit=20):
        """İstasyon ara"""
        params = {
            'endpoint': 'search',
            'q': query,
            'limit': limit
        }
        
        response = self.session.get(f"{self.base_url}/api/", params=params)
        return response.json()
    
    def get_random_station(self, genre=None, country=None, exclude=None):
        """Rastgele istasyon al"""
        params = {}
        if genre:
            params['genre'] = genre
        if country:
            params['country'] = country
        if exclude:
            params['exclude'] = exclude
            
        response = self.session.get(f"{self.base_url}/api/random-station.php", params=params)
        return response.json()
    
    def get_station_status(self, station_id):
        """İstasyon durumunu kontrol et"""
        params = {'station_id': station_id}
        response = self.session.get(f"{self.base_url}/api/station-status.php", params=params)
        return response.json()

# Kullanım örneği
api = RadioAPI('http://yayini.net')

try:
    # Türk pop istasyonları ara
    turkish_pop = api.get_stations(genre='pop', country='Türkiye', limit=10)
    
    if turkish_pop['success']:
        print(f"Bulunan {len(turkish_pop['data'])} Türk Pop İstasyonu:")
        for station in turkish_pop['data']:
            print(f"- {station['station_name']} ({station['listen_count']} dinleme)")
    
    # Rastgele rock istasyonu al
    random_rock = api.get_random_station(genre='rock')
    if random_rock['success']:
        station = random_rock['data']
        print(f"\nRastgele Rock İstasyonu: {station['station_name']}")
        
        # İstasyon durumunu kontrol et
        status = api.get_station_status(station['id'])
        if status['success']:
            print(f"Durum: {'Online' if status['data']['is_online'] else 'Offline'}")
            print(f"Aktif Dinleyici: {status['data']['active_listeners']}")
            
except Exception as e:
    print(f"Hata: {e}")

Node.js ile API Kullanımı

const axios = require('axios');

class RadioAPI {
    constructor(baseUrl) {
        this.baseUrl = baseUrl;
        this.client = axios.create({
            baseURL: baseUrl,
            timeout: 10000,
            headers: {
                'Content-Type': 'application/json'
            }
        });
    }
    
    async getStations(options = {}) {
        try {
            const params = {
                endpoint: 'stations',
                page: options.page || 1,
                limit: options.limit || 20,
                ...options
            };
            
            const response = await this.client.get('/api/', { params });
            return response.data;
        } catch (error) {
            throw new Error(`API Request failed: ${error.message}`);
        }
    }
    
    async searchStations(query, limit = 20) {
        const params = {
            endpoint: 'search',
            q: query,
            limit
        };
        
        const response = await this.client.get('/api/', { params });
        return response.data;
    }
    
    async getPopularStations(limit = 20) {
        const params = {
            endpoint: 'popular',
            limit
        };
        
        const response = await this.client.get('/api/', { params });
        return response.data;
    }
    
    async getCategories() {
        const params = { endpoint: 'categories' };
        const response = await this.client.get('/api/', { params });
        return response.data;
    }
    
    async getStats() {
        const params = { endpoint: 'stats' };
        const response = await this.client.get('/api/', { params });
        return response.data;
    }
    
    async getRandomStation(filters = {}) {
        const response = await this.client.get('/api/random-station.php', {
            params: filters
        });
        return response.data;
    }
    
    async startListening(stationId) {
        const response = await this.client.post('/api/start-listening.php', {
            station_id: stationId
        });
        return response.data;
    }
    
    async endListening(sessionId) {
        const response = await this.client.post('/api/end-listening.php', {
            session_id: sessionId
        });
        return response.data;
    }
}

// Kullanım örneği
const api = new RadioAPI('http://yayini.net');

async function example() {
    try {
        // Platform istatistikleri
        const stats = await api.getStats();
        console.log('Platform İstatistikleri:', stats.data);
        
        // Popüler istasyonları al
        const popular = await api.getPopularStations(5);
        console.log(`\nEn Popüler ${popular.data.length} İstasyon:`);
        
        popular.data.forEach((station, index) => {
            console.log(`${index + 1}. ${station.station_name} - ${station.listen_count} dinleme`);
        });
        
        // "jazz" arama yap
        const jazzStations = await api.searchStations('jazz', 3);
        if (jazzStations.success && jazzStations.data.length > 0) {
            console.log('\nJazz İstasyonları:');
            jazzStations.data.forEach(station => {
                console.log(`- ${station.station_name} (${station.country})`);
            });
        }
        
        // Rastgele Türk istasyonu
        const randomTurkish = await api.getRandomStation({ country: 'Türkiye' });
        if (randomTurkish.success) {
            console.log(`\nRastgele Türk İstasyonu: ${randomTurkish.data.station_name}`);
        }
        
    } catch (error) {
        console.error('API Hatası:', error.message);
    }
}

// Örneği çalıştır
example();

Postman Collection

API'yi test etmek için Postman koleksiyonu:

{
    "info": {
        "name": "YAYİNİ.NET Radio API",
        "description": "Radyo İstasyonları API Koleksiyonu",
        "version": "1.2.0"
    },
    "item": [
        {
            "name": "İstasyon Listesi",
            "request": {
                "method": "GET",
                "url": {
                    "raw": "http://yayini.net/api/?endpoint=stations&page=1&limit=10",
                    "query": [
                        {"key": "endpoint", "value": "stations"},
                        {"key": "page", "value": "1"},
                        {"key": "limit", "value": "10"}
                    ]
                }
            }
        },
        {
            "name": "İstasyon Arama",
            "request": {
                "method": "GET",
                "url": {
                    "raw": "http://yayini.net/api/?endpoint=search&q=pop&limit=5",
                    "query": [
                        {"key": "endpoint", "value": "search"},
                        {"key": "q", "value": "pop"},
                        {"key": "limit", "value": "5"}
                    ]
                }
            }
        },
        {
            "name": "Popüler İstasyonlar",
            "request": {
                "method": "GET",
                "url": {
                    "raw": "http://yayini.net/api/?endpoint=popular&limit=10",
                    "query": [
                        {"key": "endpoint", "value": "popular"},
                        {"key": "limit", "value": "10"}
                    ]
                }
            }
        },
        {
            "name": "Rastgele İstasyon",
            "request": {
                "method": "GET",
                "url": "http://yayini.net/api/random-station.php"
            }
        },
        {
            "name": "Platform İstatistikleri",
            "request": {
                "method": "GET",
                "url": {
                    "raw": "http://yayini.net/api/?endpoint=stats",
                    "query": [
                        {"key": "endpoint", "value": "stats"}
                    ]
                }
            }
        }
    ]
}
Postman İçe Aktarma: Yukarıdaki JSON'u kopyalayıp Postman'de "Import" → "Raw Text" ile ekleyebilirsiniz.

SDK ve Wrapper'lar

Farklı programlama dilleri için hazır SDK'lar:

JavaScript SDK

Browser ve Node.js için

Yakında
PHP SDK

Composer paket desteği

Yakında
Python SDK

PyPI paket desteği

Yakında

Sık Sorulan Sorular

Evet, YAYİNİ.NET API tamamen ücretsizdir. Rate limit dahilinde sınırsız kullanabilirsiniz.

Evet, tüm endpointler CORS destekli olup browser'dan doğrudan çağrılabilir.

Şu anda WebSocket desteği bulunmuyor, ancak gelecek sürümlerde real-time özellikler eklenecek.

Şu anda v1.2 kullanılmaktadır. Gelecek major değişiklikler için backward compatibility korunacak.

Webhook desteği planlanmaktadır. İstasyon durumu değişiklikleri ve yeni eklenen istasyonlar için bildirim alabileceksiniz.

Değişiklik Günlüğü

v1.2 - 03.09.2025
  • Kullanıcı profili ve geçmiş endpointleri eklendi
  • Rastgele istasyon endpointi eklendi
  • İstasyon durumu kontrol endpointi eklendi
  • Dinleme oturum yönetimi iyileştirildi
  • Rate limiting sistemi güncellendi
  • Hata kodları ve mesajları standardize edildi
v1.1 - 27.07.2025
  • Favori işlemleri API'si eklendi
  • Online kullanıcı sayısı endpointi eklendi
  • Platform istatistikleri genişletildi
  • CORS desteği iyileştirildi
v1.0 - 25.07.2025
  • İlk API sürümü yayınlandı
  • Temel CRUD işlemleri eklendi
  • Sayfalama ve filtreleme desteği
  • JSON formatında yanıtlar

Destek ve İletişim

API kullanımı hakkında sorularınız için:

Bug Raporu: İletişim Formu
Dokümantasyon: Bu sayfa sürekli güncellenmektedir
Geliştirici İpuçları
  • Her zaman hata kontrolü yapın
  • Rate limit'i aşmamaya dikkat edin
  • Timeout değerlerini ayarlayın
  • SSL sertifika doğrulaması yapın
  • API yanıtlarını cache'leyin