
💰 PHP API do pobierania aktualnej ceny Bitcoin w 2026: od prostego skryptu do rozwiązania produkcyjnego
Strona akceptuje kryptowaluty, a kurs potrafi zmienić się o kilka procent w ciągu pół godziny. Klient chce widzieć aktualną cenę Bitcoin w walucie fiducjarnej bezpośrednio w interfejsie, nie zrzut ekranu z giełdy, tylko żywą wartość z API.
Ręczne monitorowanie kursu przez kartę CoinMarketCap zabiera czas i dostarcza dane z opóźnieniem. A gotowe wtyczki do kryptowalut są często przeładowane: reklamy, zbędne zapytania, powiązanie z jednym źródłem.
Poniżej dwa sposoby na pobranie bieżącej ceny Bitcoin przez PHP: od prymitywnego skryptu w 10 linijkach po wariant produkcyjny z cache'owaniem i wyborem źródła. Bez płatnych abonamentów, bez SDK ważącego 40 megabajtów.
💡 Szybki przegląd:
- Wybieramy źródło API: Bitpay (bezpłatne, bez klucza) lub CoinGecko (więcej danych, również bezpłatne)
- Piszemy skrypt PHP z file_get_contents lub cURL, oba warianty z objaśnieniem
- Dodajemy obsługę błędów i plikowe cache'owanie na 5 minut, aby nie odpytywać API przy każdym odświeżeniu strony
Czym jest API notowań kryptowalut i do czego jest potrzebne programiście PHP
API giełd kryptowalut i agregatorów zwraca bieżący kurs przez HTTP, wykonuje Pan zapytanie GET, otrzymuje Pan JSON z parą „BTC/USD" i wartością liczbową. Żadnego WebSocket ani subskrypcji: zwykły skrypt PHP na tanim hostingu daje sobie radę.
Typowe scenariusze, w których jest to potrzebne:
- Bramka płatnicza. Pokazać użytkownikowi: „Do zapłaty 0.00031 BTC", kurs nie jest wzięty z sufitu, tylko z API.
- Dashboard. Panel administracyjny sklepu internetowego z blokiem „Kursy kryptowalut".
- Tracker portfelowy. Zebrano 5 monet, skrypt raz na minutę aktualizuje ich łączną wartość.
Na potrzeby artykułu wybrano dwa źródła z bezpłatnym dostępem bez rejestracji: Bitpay i CoinGecko. Oba działają przez HTTPS, zwracają JSON i nie wymagają klucza API na poziomie podstawowym.

Krok 1: pobieramy kurs przez Bitpay API
Bitpay to procesor płatności dla Bitcoin. Posiada on publiczny endpoint /api/rates, który zwraca kursy BTC do ponad 150 walut fiducjarnych w jednej tablicy JSON. Nie ma tokena ani limitu liczby zapytań dla podstawowego zastosowania.
Prosty wariant: file_get_contents
Najkrótszy działający kod. Proszę dodać go do pliku bitcoin-rates.php w katalogu głównym strony i otworzyć w przeglądarce:
1 <?php 2 $url = "https://bitpay.com/api/rates"; 3 $json = json_decode(file_get_contents($url), true); 4 5 foreach ($json as $item) { 6 if ($item['code'] === 'USD') { 7 echo '1 BTC = $' . $item['rate'] . "\n"; 8 } 9 if ($item['code'] === 'EUR') { 10 echo '1 BTC = €' . $item['rate'] . "\n"; 11 } 12 }
Skrypt pobiera całą tablicę kursów, przechodzi przez nią w pętli i wyświetla tylko USD i EUR. file_get_contents() z adresem URL HTTPS działa, jeśli w php.ini włączona jest dyrektywa allow_url_fopen = On, na większości hostingów jest ona domyślnie aktywna.
Bardziej niezawodne podejście: cURL
file_get_contents nie ustawia limitów czasu i cicho pada przy błędzie sieciowym. W przypadku prawdziwej strony lepiej użyć cURL:
1 <?php 2 $ch = curl_init(); 3 curl_setopt_array($ch, [ 4 CURLOPT_URL => 'https://bitpay.com/api/rates', 5 CURLOPT_RETURNTRANSFER => true, 6 CURLOPT_TIMEOUT => 10, 7 CURLOPT_SSL_VERIFYPEER => true, 8 ]); 9 $response = curl_exec($ch); 10 $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 11 curl_close($ch); 12 13 if ($httpCode !== 200 || !$response) { 14 echo 'API временно недоступно.'; 15 exit; 16 } 17 18 $data = json_decode($response, true); 19 20 foreach ($data as $item) { 21 if ($item['code'] === 'USD') { 22 echo '1 BTC = $' . number_format($item['rate'], 2) . "\n"; 23 } 24 }
Limit czasu 10 sekund, sprawdzenie kodu HTTP, number_format dla czytelnego wyświetlenia. W praktyce taki skrypt wystarczy, aby osadzić kurs w stopce lub na pasku bocznym strony.
Krok 2: alternatywne źródło, CoinGecko API
Bitpay zwraca kursy tylko dla BTC i BCH. Jeśli potrzebne są również Ethereum, Solana lub dowolny inny zasób z top-500, podłączamy CoinGecko API. Bezpłatny plan daje 10-30 zapytań na minutę bez klucza.
Proste zapytanie o cenę Bitcoin i Ethereum
Endpoint /api/v3/simple/price przyjmuje listę monet oddzielonych przecinkami oraz waluty przez parametr vs_currencies:
1 <?php 2 $url = 'https://api.coingecko.com/api/v3/simple/price' 3 . '?ids=bitcoin,ethereum' 4 . '&vs_currencies=usd,eur,rub'; 5 6 $ch = curl_init(); 7 curl_setopt_array($ch, [ 8 CURLOPT_URL => $url, 9 CURLOPT_RETURNTRANSFER => true, 10 CURLOPT_TIMEOUT => 10, 11 ]); 12 $response = curl_exec($ch); 13 curl_close($ch); 14 15 $prices = json_decode($response, true); 16 17 echo 'BTC: $' . $prices['bitcoin']['usd'] . ' / €' . $prices['bitcoin']['eur'] . "\n"; 18 echo 'ETH: $' . $prices['ethereum']['usd'] . ' / ₽' . $prices['ethereum']['rub'] . "\n";
Odpowiedź przychodzi w kompaktowej formie, tylko te monety i waluty, o które Pan poprosił. Żadnego iterowania w pętli po 150 rekordach.
Co jeszcze potrafi CoinGecko
- Dane historyczne:
/api/v3/coins/bitcoin/history?date=01-01-2026, kurs na konkretną datę. - Dane rynkowe:
/api/v3/coins/bitcoin, kapitalizacja rynkowa, wolumen, zmiana w ciągu 24 godzin, podaż w obiegu. - Monety na czasie:
/api/v3/search/trending, top zapytań wyszukiwania w ciągu doby.
Do prostego kursu „BTC/USD" wystarczy pierwszy przykład. Jeśli tworzy Pan dashboard, proszę podłączyć rozszerzony endpoint.
Krok 3: cache'owanie i ochrona przed awarią API
Odpytywanie zewnętrznego API przy każdym ładowaniu strony to zła praktyka. Sieć może mrugnąć, serwer CoinGecko paść na minutę, a odwiedzający zobaczy błąd zamiast kursu.
Niezawodne rozwiązanie: plikowe cache'owanie. Skrypt zapisuje odpowiedź API do lokalnego pliku JSON i odświeża go raz na 5 minut. Wszystkie zapytania pośrednie czytają cache, natychmiastowo i bez wywołań zewnętrznych.
1 <?php 2 $cacheFile = __DIR__ . '/btc-cache.json'; 3 $cacheTime = 300; // 5 минут 4 5 // Если кеш свежий — читаем его 6 if (file_exists($cacheFile) && (time() - filemtime($cacheFile)) < $cacheTime) { 7 $data = json_decode(file_get_contents($cacheFile), true); 8 echo '1 BTC = $' . number_format($data['bitcoin']['usd'], 2); 9 echo ' (кеш, обновлен ' . date('H:i:s', filemtime($cacheFile)) . ')'; 10 exit; 11 } 12 13 // Кеш устарел или отсутствует — запрашиваем API 14 $ch = curl_init(); 15 curl_setopt_array($ch, [ 16 CURLOPT_URL => 'https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd', 17 CURLOPT_RETURNTRANSFER => true, 18 CURLOPT_TIMEOUT => 10, 19 ]); 20 $response = curl_exec($ch); 21 $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 22 curl_close($ch); 23 24 if ($httpCode !== 200 || !$response) { 25 // API упал — отдаем устаревший кеш, если он есть 26 if (file_exists($cacheFile)) { 27 $data = json_decode(file_get_contents($cacheFile), true); 28 echo '1 BTC = $' . number_format($data['bitcoin']['usd'], 2); 29 echo ' (устаревший кеш — API не ответил)'; 30 exit; 31 } 32 echo 'Нет данных. Попробуйте позже.'; 33 exit; 34 } 35 36 // Сохраняем свежий ответ и выводим 37 file_put_contents($cacheFile, $response); 38 $data = json_decode($response, true); 39 echo '1 BTC = $' . number_format($data['bitcoin']['usd'], 2); 40 echo ' (свежие данные)';
Proszę zwrócić uwagę: skrypt najpierw sprawdza cache i tylko w razie potrzeby odwołuje się do API. Jeśli API nie odpowiada, zwracany jest ostatni zapisany kurs z adnotacją „przestarzały cache". Odwiedzający widzi wartość liczbową, a nie białą stronę z błędem.
Przed wdrożeniem na stronę produkcyjną proszę upewnić się, że PHP ma prawa do zapisu w folderze ze skryptem. I proszę wykonać pełny backup, skrypt zapisuje plik na dysku.
Na filmie powyżej wizualna analiza CoinGecko API z przykładami zapytań i odpowiedzi w czasie rzeczywistym. Przydatne, jeśli pracuje Pan z API kryptowalut po raz pierwszy i chce Pan zobaczyć pełny cykl: od zapytania GET do parsowania JSON.
⁉️🤔 Często zadawane pytania
Które API wybrać, Bitpay czy CoinGecko?
Jeśli potrzebny jest tylko kurs Bitcoin do dolara, proszę wziąć Bitpay. Jest prostszy, zwraca odpowiedź w jednej tablicy bez parametrów i nie ma limitów. Jeśli planuje Pan pracować z kilkunastoma monetami lub pokazywać wykresy, CoinGecko: więcej danych, elastyczne endpointy, a bezpłatny plan pokrywa potrzeby niewielkiego projektu.
Czy Bitpay API wymaga klucza API?
Publiczny endpoint
/api/ratesnie wymaga klucza. Jest to otwarty endpoint, z którego korzystają portfele i giełdy do wyświetlania kursów. Komercyjne endpointy Bitpay (tworzenie faktur, przyjmowanie płatności) wymagają tokena, ale do prostego pobrania kursu nie są one potrzebne.
Dlaczego nie CoinMarketCap API?
W CoinMarketCap bezpłatny plan wymaga rejestracji i wygenerowania klucza. Limit 10 000 zapytań miesięcznie dla małego projektu wystarcza. Jednak na start „od zera bez rejestracji" Bitpay i CoinGecko są wygodniejsze: skopiował Pan URL, wkleił do kodu, zadziałało.
Co zrobić, jeśli hosting blokuje file_get_contents dla zewnętrznych URL?
Proszę przejść na cURL, jest on dostępny praktycznie na każdym hostingu. Jeśli cURL również jest wyłączony (rzadkość w 2026 roku), proszę dopytać u dostawcy hostingu o możliwość włączenia
curl.sow rozszerzeniach PHP. Alternatywa: użyćwp_remote_get()wewnątrz WordPress, ta funkcja działa przez HTTP API rdzenia i sama wybiera dostępny transport.
Jak często aktualizowane są kursy w API?
Bitpay aktualizuje kurs przy każdym zapytaniu, wartości odpowiadają bieżącemu spreadowi rynkowemu. CoinGecko aktualizuje dane co 30-60 sekund dla prostego endpointu ceny. Do wyświetlania na stronie częstotliwość „raz na 5 minut" jest w zupełności wystarczająca, rynek kryptowalut jest zmienny, ale nie na tyle, by sekundowe wahania miały znaczenie dla bloku informacyjnego.
Które API wybrać do swojego zadania
Bitpay i CoinGecko pokrywają różne potrzeby, nie konkurując ze sobą bezpośrednio:
- Jeśli tworzy Pan formularz płatności z konwersją „BTC → USD", Bitpay: jeden wiersz URL, minimum kodu, kurs zawsze świeży.
- Jeśli buduje Pan dashboard z wykresami i portfelem z 10 monet, CoinGecko: zapytanie o cenę paczką, dane historyczne, kapitalizacja rynkowa i wolumen w jednym wywołaniu.
- Jeśli potrzebny jest maksymalnie szybki start bez zewnętrznych zależności, Bitpay bez cURL przez
file_get_contents: 10 linijek kodu i kurs na stronie.
Proszę zacząć od prostego: skopiować pierwszy przykład z artykułu, zamienić walutę na swoją i otworzyć w przeglądarce. Gdy zadziała, proszę opakować to w cache'owanie według szablonu z kroku 3 i wdrożyć na stronę produkcyjną. A które API ostatecznie Pan wybrał, proszę napisać w komentarzach.



