scheb / yahoo-finance-api
PHP library for accessing Yahoo Finance data
Installs: 161 352
Dependents: 7
Suggesters: 0
Security: 0
Stars: 304
Watchers: 32
Forks: 60
Open Issues: 4
Requires
- php: >=8.1
- ext-json: *
- guzzlehttp/guzzle: ^7
- psr/cache: ^2|^3
Requires (Dev)
- escapestudios/symfony2-coding-standard: ^3.9
- phpunit/phpunit: ^10.5|^11|^12
- squizlabs/php_codesniffer: ^3.5
- symfony/cache: ^6|^7
- vimeo/psalm: ^6.0
This package is auto-updated.
Last update: 2025-07-05 21:00:43 UTC
README
This is a PHP client for Yahoo Finance API.
Since YQL APIs have been discontinued in November 2017, this client is using non-official API endpoints for quotes, search and historical data.
Warning
These non-official APIs cannot be assumed stable and might break any time. Also, you might violate Yahoo's terms of service. So use them at your own risk.
Installation
Download via Composer:
composer require scheb/yahoo-finance-api
Alternatively, you can also add the package directly to composer.json:
{ "require": { "scheb/yahoo-finance-api": "^5" } }
and then tell Composer to install the package:
composer update scheb/yahoo-finance-api
Usage
use Scheb\YahooFinanceApi\ApiClient; use Scheb\YahooFinanceApi\ApiClientFactory; use GuzzleHttp\Client; // Create a new client from the factory $client = ApiClientFactory::createApiClient(); // Or configure with options $client = ApiClientFactory::createApiClient( clientOptions: [/* ... */], // Guzzle client options retries: 3, retryDelay: 1000, // milliseconds ); // Returns an array of Scheb\YahooFinanceApi\Results\SearchResult $searchResult = $client->search("Apple"); // Returns an array of Scheb\YahooFinanceApi\Results\HistoricalData $historicalData = $client->getHistoricalQuoteData( "AAPL", ApiClient::INTERVAL_1_DAY, new \DateTime("-14 days"), new \DateTime("today") ); // Retrieve dividends history, returns an array of Scheb\YahooFinanceApi\Results\DividendData $dividendData = $client->getHistoricalDividendData( "AAPL", new \DateTime("-5 years"), new \DateTime("today") ); // Retrieve stock split history, returns an array of Scheb\YahooFinanceApi\Results\SplitData $splitData = $client->getHistoricalSplitData( "AAPL", new \DateTime("-5 years"), new \DateTime("today") ); // Returns Scheb\YahooFinanceApi\Results\Quote $exchangeRate = $client->getExchangeRate("USD", "EUR"); // Returns an array of Scheb\YahooFinanceApi\Results\Quote $exchangeRates = $client->getExchangeRates([ ["USD", "EUR"], ["EUR", "USD"], ]); // Returns Scheb\YahooFinanceApi\Results\Quote $quote = $client->getQuote("AAPL"); // Returns an array of Scheb\YahooFinanceApi\Results\Quote $quotes = $client->getQuotes(["AAPL", "GOOG"]); // Returns an array of Scheb\YahooFinanceApi\Results\OptionChain $optionChain = $client->getOptionChain("AAPL"); $optionChain = $client->getOptionChain("AAPL", new \DateTime("2021-01-01"));
Configuration
User Agent
You can customize the User-Agent header by passing it in the Guzzle client options:
$guzzleClientOptions = ['headers' => ['User-Agent' => 'MyApp/1.0']]; $client = ApiClientFactory::createApiClient($guzzleClientOptions);
Using curl-impersonate
This library supports curl-impersonate to mimic real browser behavior. When using curl-impersonate, the library automatically removes the default User-Agent header to let curl-impersonate handle it.
To use curl-impersonate:
- Install curl-impersonate on your system
- Typically, you'd want to download the
libcurl-*
package for the respective system architecture and extract it - Follow the Using libcurl-impersonate in PHP scripts guide
- Typically, you'd want to download the
- When execution your application, set the required environment variables:
export LD_PRELOAD=/path/to/curl-impersonate/libcurl-impersonate.so export CURL_IMPERSONATE=chrome136 # or another browser version
- Create your API client normally - no additional configuration needed:
$client = ApiClientFactory::createApiClient();
The library will automatically detect the CURL_IMPERSONATE
environment variable and configure the HTTP client
accordingly.
Retry Feature
The library includes a built-in retry mechanism that can automatically retry failed requests. Configure it when creating the client:
$client = ApiClientFactory::createApiClient( retries: 3, // Number of retry attempts (default: 0) retryDelay: 1000, // Delay between retries in milliseconds (default: 0) );
When a request fails, the library will:
- Wait for the specified delay
- Renew the session context (fetch new set of cookies and crumb value)
- Retry the request
- Repeat until success or max retries reached
Context Cache Feature
The library supports caching session contexts (cookies and crumb value) to improve performance and reduce HTTP requests. This is especially useful in high-traffic applications or when making multiple requests.
To use caching, you need a PSR-6 cache implementation, e.g. you could use symfony/cache
:
composer require symfony/cache
Then configure the cache. In this example, a simple file-based cache is used:
use Scheb\YahooFinanceApi\ApiClientFactory; use Symfony\Component\Cache\Adapter\FilesystemAdapter; // File-based cache from symfony/cache $cache = new FilesystemAdapter(); // Create API client with caching $client = ApiClientFactory::createApiClient( cache: $cache, // PSR-6 cache implementation cacheTtl: 3600, // Cache TTL in seconds (optional, default: 3600) cacheKey: 'my_cache_key' // Custom cache key (optional) );
Version Guidance
Version | Status | PHP Version |
---|---|---|
1.x | EOL | >= 5.3.0 |
2.x | EOL | >= 5.6.0 |
3.x | EOL | >= 5.6.0 |
4.x | EOL | >= 7.1.3 |
5.x | Maintained | >= 8.1.0 |
License
This library is available under the MIT license.
Contributing
Want to contribute to this project? See CONTRIBUTING.md.
Support Me
I'm developing this library since 2014. I love to hear from people using it, giving me the motivation to keep working on my open source projects.
If you want to let me know you're finding it useful, please consider giving it a star ⭐ on GitHub.
If you love my work and want to say thank you, you can help me out for a beer 🍻️ via PayPal.