Yahoo finance API gives error 403 (forbidden) on old URL and User-Agent
Asked Answered
U

3

9

One of the use cases I use Yahoo finance API for is to find out the earnings date for a given stock. This was working fine till about 7/2021 but started giving error 403 (forbidden).

After struggling a while, found that adding a {'User-agent': 'Mozilla/5.0'} header would fix the issue. If you face a similar issue, you could try and see if it fixes for you too. Here is a sample screenshot:

>>> url="https://query2.finance.yahoo.com/v10/finance/quoteSummary/PYPL?modules=calendarEvents"
>>> r=requests.get(url)
>>> r
<Response [403]>
>>> r=requests.get(url, headers={'User-agent': 'Mozilla/5.0'})
>>> r
<Response [200]>
>>> r.json()
{'quoteSummary': {'result': [{'calendarEvents': {'maxAge': 1, 'earnings': {'earningsDate': [{'raw': 1635764340, 'fmt': '2021-11-01'}, {'raw': 1636113600, 'fmt': '2021-11-05'}], 'earningsAverage': {'raw': 1.13, 'fmt': '1.13'}, 'earningsLow': {'raw': 0.97, 'fmt': '0.97'}, 'earningsHigh': {'raw': 1.27, 'fmt': '1.27'}, 'revenueAverage': {'raw': 6265160000, 'fmt': '6.27B', 'longFmt': '6,265,160,000'}, 'revenueLow': {'raw': 6041000000, 'fmt': '6.04B', 'longFmt': '6,041,000,000'}, 'revenueHigh': {'raw': 6539200000, 'fmt': '6.54B', 'longFmt': '6,539,200,000'}}, 'exDividendDate': {}, 'dividendDate': {}}}], 'error': None}}

Urticaceous answered 4/8, 2021 at 20:26 Comment(0)
S
9

I was facing a similar problem. Apparently two things have changed:

  1. they updated the URL
  2. they limit particular user agents (Matlab is explicitly rejected)

The URL as of 6/16/2021 is:

symbolString = 'TGT'; % look up Target prices as an example  
urlBase = 'https://query1.finance.yahoo.com/v7/finance/download/'; % base as of   6/16/2021
url = [urlBase,symbolString];  

Then we explicitly set the user agent:

options = weboptions('UserAgent',''); # as of 6/16/2021 it is enough to submit a blank user agent
Sidesman answered 4/8, 2021 at 20:33 Comment(2)
(1) I did not notice any URL changes. query2.finance.yahoo.com/v10/finance/quoteSummary has always worked for me and it continues to workUrticaceous
(2) ('UserAgent','') does not work for me. {'User-agent': 'Mozilla/5.0'} definitely works in my caseUrticaceous
B
2

This worked 14-Jan-2022. I Googled "what is my user agent" to get a user agent string. By adding a browser user agent string to the request I'm mimicking being a browser.

import requests
url='https://query1.finance.yahoo.com/v7/finance/download/TSLA'
headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'
}
r = requests.get(url, headers=headers)
print(r.status_code)
print(r.content)
Boondocks answered 14/1, 2023 at 8:33 Comment(0)
R
1

you need to update your python package in your env:

pip install yahoo-fin -U
Reprehension answered 15/8, 2021 at 22:7 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.