KeyError when parsing json when key is there

Question:

I have the code below which collects data from an API. I am then parsing and collecting the data points I need. I am having an issue where I am getting a KeyError but the key exists and all the data is returned, so if there is an error, why does it work?

any help would be appreciated.

url = f"{Base_url}/betoffer/event/{','.join(map(str, event_ids))}.json?app_id={AppID}&app_key={AppKey}&local={Country}&site={Site}&type=125"
    print(url)

    player_td_data = requests.get(url).text
    player_td_data = json.loads(player_td_data)

    for td_data in player_td_data['betOffers']:
        if td_data['criterion']['label'] == 'First Touchdown Scorer - Including Overtime' and 'OFFERED_PREMATCH' in td_data['tags']:
            for outcomes in td_data['outcomes']:
                if outcomes['type'] == 'OT_PLAYER_PARTICIPANT':
                    event_id = td_data['eventId']
                    player_id = outcomes['id']
                    player_name = outcomes['participant']
                    player_first_td_odds = outcomes['odds']


                    print(f'{event_id} {player_id} {player_name} {player_first_td_odds}')

which produces the data i am required below

1018663065 3172232074 Wentz, Carson 23000
1018663065 3172232100 McKissic, JD 17000
1018663065 3172232109 Gibson, Antonio 13000
1018663065 3172232117 Robinson Jr., Brian 8500
1018663065 3172232126 Griffin, Ryan 51000
1018663065 3172232134 Pettis, Dante 31000
1018663065 3172232140 St. Brown, Equanimeous 21000
1018663065 3172232146 Kmet, Cole 16000
1018663065 3172232153 Harry, N’Keal 31000
1018663065 3172232159 Fields, Justin 9000
1018663065 3172232164 Montgomery, David 6750
1018663065 3172232170 Blasingame, Khari 76000
1018663065 3172232176 Wesco, Trevon 76000
1018663065 3172232181 Smith-Marsette, Ihmir 61000
1018663065 3172232186 Ebner, Trestan 56000
1018663065 3172232190 Mooney, Darnell 12000
1018663065 3172232194 Herbert, Khalil 16000
1018663065 3172232197 Tonges, Jake 91000
1018663065 3172232200 Jones Jr., Velus 34000
1018663065 3172232259 Samuel, Curtis 10500
1018663065 3172232265 Sims, Cam 41000
1018663065 3172232268 McLaurin, Terry 9000

but it also gives a KeyError below

Traceback (most recent call last):
  File "C:UsersxxOneDriveDesktopxxx-functionstesting.py", line 87, in <module>
    first_touchdowns_odds(event_ids)
  File "C:UsersxxxOneDriveDesktopxxx-functionstesting.py", line 77, in first_touchdowns_odds
    player_first_td_odds = outcomes['odds']
KeyError: 'odds'

this is the json

{
    "betOffers": [{
        "eventId": 1018663065,
        "criterion": {
            "englishLabel": "First Touchdown Scorer - Including Overtime",
            "id": 1001488021,
            "label": "First Touchdown Scorer - Including Overtime",
            "order": [
                1
            ]
        },
        "tags": [
            "OFFERED_PREMATCH",
            "BET_BUILDER"
        ],
        "outcomes": [{
                "oddsFractional": "22/1",
                "englishLabel": "Wentz, Carson",
                "label": "Wentz, Carson",
                "betOfferId": 2349921831,
                "oddsAmerican": "2200",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Wentz, Carson",
                "participantId": 1003128420,
                "changedDate": "2022-10-12T21:37:28Z",
                "odds": 23000,
                "cashOutStatus": "ENABLED",
                "id": 3172232074,
                "status": "OPEN",
                "eventParticipantId": 1000000334
            },
            {
                "oddsFractional": "50/1",
                "englishLabel": "No Touchdown",
                "label": "No Touchdown",
                "betOfferId": 2349921831,
                "oddsAmerican": "5000",
                "type": "OT_NO_GOAL",
                "changedDate": "2022-10-12T21:37:28Z",
                "odds": 51000,
                "cashOutStatus": "ENABLED",
                "id": 3172232086,
                "status": "OPEN"
            },
            {
                "oddsFractional": "16/1",
                "englishLabel": "McKissic, JD",
                "label": "McKissic, JD",
                "betOfferId": 2349921831,
                "oddsAmerican": "1600",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "McKissic, JD",
                "participantId": 1003405978,
                "changedDate": "2022-10-12T22:13:43Z",
                "odds": 17000,
                "cashOutStatus": "ENABLED",
                "id": 3172232100,
                "status": "OPEN",
                "eventParticipantId": 1000000334
            },
            {
                "oddsFractional": "12/1",
                "englishLabel": "Gibson, Antonio",
                "label": "Gibson, Antonio",
                "betOfferId": 2349921831,
                "oddsAmerican": "1200",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Gibson, Antonio",
                "participantId": 1006035581,
                "changedDate": "2022-10-12T22:13:43Z",
                "odds": 13000,
                "cashOutStatus": "ENABLED",
                "id": 3172232109,
                "status": "OPEN",
                "eventParticipantId": 1000000334
            },
            {
                "oddsFractional": "15/2",
                "englishLabel": "Robinson Jr., Brian",
                "label": "Robinson Jr., Brian",
                "betOfferId": 2349921831,
                "oddsAmerican": "750",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Robinson Jr., Brian",
                "participantId": 1007667637,
                "changedDate": "2022-10-12T22:13:43Z",
                "odds": 8500,
                "cashOutStatus": "ENABLED",
                "id": 3172232117,
                "status": "OPEN",
                "eventParticipantId": 1000000334
            },
            {
                "oddsFractional": "50/1",
                "englishLabel": "Griffin, Ryan",
                "label": "Griffin, Ryan",
                "betOfferId": 2349921831,
                "oddsAmerican": "5000",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Griffin, Ryan",
                "participantId": 1002198957,
                "changedDate": "2022-10-13T01:18:07Z",
                "odds": 51000,
                "cashOutStatus": "ENABLED",
                "id": 3172232126,
                "status": "OPEN",
                "eventParticipantId": 1000000178
            },
            {
                "oddsFractional": "30/1",
                "englishLabel": "Pettis, Dante",
                "label": "Pettis, Dante",
                "betOfferId": 2349921831,
                "oddsAmerican": "3000",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Pettis, Dante",
                "participantId": 1003741140,
                "changedDate": "2022-10-13T01:18:07Z",
                "odds": 31000,
                "cashOutStatus": "ENABLED",
                "id": 3172232134,
                "status": "OPEN",
                "eventParticipantId": 1000000178
            },
            {
                "oddsFractional": "20/1",
                "englishLabel": "St. Brown, Equanimeous",
                "label": "St. Brown, Equanimeous",
                "betOfferId": 2349921831,
                "oddsAmerican": "2000",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "St. Brown, Equanimeous",
                "participantId": 1004561624,
                "changedDate": "2022-10-12T21:37:28Z",
                "odds": 21000,
                "cashOutStatus": "ENABLED",
                "id": 3172232140,
                "status": "OPEN",
                "eventParticipantId": 1000000178
            },
            {
                "oddsFractional": "15/1",
                "englishLabel": "Kmet, Cole",
                "label": "Kmet, Cole",
                "betOfferId": 2349921831,
                "oddsAmerican": "1500",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Kmet, Cole",
                "participantId": 1005209906,
                "changedDate": "2022-10-12T21:37:28Z",
                "odds": 16000,
                "cashOutStatus": "ENABLED",
                "id": 3172232146,
                "status": "OPEN",
                "eventParticipantId": 1000000178
            },
            {
                "oddsFractional": "30/1",
                "englishLabel": "Harry, N’Keal",
                "label": "Harry, N’Keal",
                "betOfferId": 2349921831,
                "oddsAmerican": "3000",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Harry, N’Keal",
                "participantId": 1005252420,
                "changedDate": "2022-10-12T21:37:28Z",
                "odds": 31000,
                "cashOutStatus": "ENABLED",
                "id": 3172232153,
                "status": "OPEN",
                "eventParticipantId": 1000000178
            },
            {
                "oddsFractional": "8/1",
                "englishLabel": "Fields, Justin",
                "label": "Fields, Justin",
                "betOfferId": 2349921831,
                "oddsAmerican": "800",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Fields, Justin",
                "participantId": 1005289956,
                "changedDate": "2022-10-12T21:37:30Z",
                "odds": 9000,
                "cashOutStatus": "ENABLED",
                "id": 3172232159,
                "status": "OPEN",
                "eventParticipantId": 1000000178
            },
            {
                "oddsFractional": "23/4",
                "englishLabel": "Montgomery, David",
                "label": "Montgomery, David",
                "betOfferId": 2349921831,
                "oddsAmerican": "575",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Montgomery, David",
                "participantId": 1005330489,
                "changedDate": "2022-10-13T01:18:07Z",
                "odds": 6750,
                "cashOutStatus": "ENABLED",
                "id": 3172232164,
                "status": "OPEN",
                "eventParticipantId": 1000000178
            },
            {
                "oddsFractional": "75/1",
                "englishLabel": "Blasingame, Khari",
                "label": "Blasingame, Khari",
                "betOfferId": 2349921831,
                "oddsAmerican": "7500",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Blasingame, Khari",
                "participantId": 1005619153,
                "changedDate": "2022-10-12T21:37:30Z",
                "odds": 76000,
                "cashOutStatus": "ENABLED",
                "id": 3172232170,
                "status": "OPEN",
                "eventParticipantId": 1000000178
            },
            {
                "oddsFractional": "75/1",
                "englishLabel": "Wesco, Trevon",
                "label": "Wesco, Trevon",
                "betOfferId": 2349921831,
                "oddsAmerican": "7500",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Wesco, Trevon",
                "participantId": 1005620092,
                "changedDate": "2022-10-12T21:37:28Z",
                "odds": 76000,
                "cashOutStatus": "ENABLED",
                "id": 3172232176,
                "status": "OPEN",
                "eventParticipantId": 1000000178
            },
            {
                "oddsFractional": "60/1",
                "englishLabel": "Smith-Marsette, Ihmir",
                "label": "Smith-Marsette, Ihmir",
                "betOfferId": 2349921831,
                "oddsAmerican": "6000",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Smith-Marsette, Ihmir",
                "participantId": 1005740936,
                "changedDate": "2022-10-13T01:18:07Z",
                "odds": 61000,
                "cashOutStatus": "ENABLED",
                "id": 3172232181,
                "status": "OPEN",
                "eventParticipantId": 1000000178
            },
            {
                "oddsFractional": "55/1",
                "englishLabel": "Ebner, Trestan",
                "label": "Ebner, Trestan",
                "betOfferId": 2349921831,
                "oddsAmerican": "5500",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Ebner, Trestan",
                "participantId": 1005999128,
                "changedDate": "2022-10-12T21:37:30Z",
                "odds": 56000,
                "cashOutStatus": "ENABLED",
                "id": 3172232186,
                "status": "OPEN",
                "eventParticipantId": 1000000178
            },
            {
                "oddsFractional": "11/1",
                "englishLabel": "Mooney, Darnell",
                "label": "Mooney, Darnell",
                "betOfferId": 2349921831,
                "oddsAmerican": "1100",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Mooney, Darnell",
                "participantId": 1006797242,
                "changedDate": "2022-10-12T21:37:28Z",
                "odds": 12000,
                "cashOutStatus": "ENABLED",
                "id": 3172232190,
                "status": "OPEN",
                "eventParticipantId": 1000000178
            },
            {
                "oddsFractional": "15/1",
                "englishLabel": "Herbert, Khalil",
                "label": "Herbert, Khalil",
                "betOfferId": 2349921831,
                "oddsAmerican": "1500",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Herbert, Khalil",
                "participantId": 1007051724,
                "changedDate": "2022-10-12T21:37:30Z",
                "odds": 16000,
                "cashOutStatus": "ENABLED",
                "id": 3172232194,
                "status": "OPEN",
                "eventParticipantId": 1000000178
            },
            {
                "oddsFractional": "90/1",
                "englishLabel": "Tonges, Jake",
                "label": "Tonges, Jake",
                "betOfferId": 2349921831,
                "oddsAmerican": "9000",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Tonges, Jake",
                "participantId": 1007678491,
                "changedDate": "2022-10-12T21:37:28Z",
                "odds": 91000,
                "cashOutStatus": "ENABLED",
                "id": 3172232197,
                "status": "OPEN",
                "eventParticipantId": 1000000178
            },
            {
                "oddsFractional": "34/1",
                "englishLabel": "Jones Jr., Velus",
                "label": "Jones Jr., Velus",
                "betOfferId": 2349921831,
                "oddsAmerican": "3400",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Jones Jr., Velus",
                "participantId": 1007905969,
                "changedDate": "2022-10-13T01:18:07Z",
                "odds": 35000,
                "cashOutStatus": "ENABLED",
                "id": 3172232200,
                "status": "OPEN",
                "eventParticipantId": 1000000178
            },
            {
                "oddsFractional": "17/1",
                "englishLabel": "Any other Chicago Bears player",
                "label": "Any other Chicago Bears player",
                "betOfferId": 2349921831,
                "oddsAmerican": "1700",
                "type": "OT_ANY_OTHER_PARTICIPANT",
                "participant": "Chicago Bears",
                "participantId": 1000000178,
                "changedDate": "2022-10-12T21:37:28Z",
                "odds": 18000,
                "cashOutStatus": "ENABLED",
                "id": 3172232205,
                "status": "OPEN",
                "eventParticipantId": 1000000178
            },
            {
                "oddsFractional": "19/2",
                "englishLabel": "Samuel, Curtis",
                "label": "Samuel, Curtis",
                "betOfferId": 2349921831,
                "oddsAmerican": "950",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Samuel, Curtis",
                "participantId": 1002450777,
                "changedDate": "2022-10-12T22:13:43Z",
                "odds": 10500,
                "cashOutStatus": "ENABLED",
                "id": 3172232259,
                "status": "OPEN",
                "eventParticipantId": 1000000334
            },
            {
                "oddsFractional": "40/1",
                "englishLabel": "Sims, Cam",
                "label": "Sims, Cam",
                "betOfferId": 2349921831,
                "oddsAmerican": "4000",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Sims, Cam",
                "participantId": 1003050339,
                "changedDate": "2022-10-12T22:13:43Z",
                "odds": 41000,
                "cashOutStatus": "ENABLED",
                "id": 3172232265,
                "status": "OPEN",
                "eventParticipantId": 1000000334
            },
            {
                "oddsFractional": "8/1",
                "englishLabel": "McLaurin, Terry",
                "label": "McLaurin, Terry",
                "betOfferId": 2349921831,
                "oddsAmerican": "800",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "McLaurin, Terry",
                "participantId": 1003741186,
                "changedDate": "2022-10-12T22:13:43Z",
                "odds": 9000,
                "cashOutStatus": "ENABLED",
                "id": 3172232268,
                "status": "OPEN",
                "eventParticipantId": 1000000334
            },
            {
                "englishLabel": "Thomas, Logan",
                "label": "Thomas, Logan",
                "betOfferId": 2349921831,
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Thomas, Logan",
                "participantId": 1004231988,
                "changedDate": "2022-10-12T21:09:17Z",
                "cashOutStatus": "ENABLED",
                "id": 3172232271,
                "status": "SUSPENDED",
                "eventParticipantId": 1000000334
            },
            {
                "englishLabel": "Dotson, Jahan",
                "label": "Dotson, Jahan",
                "betOfferId": 2349921831,
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Dotson, Jahan",
                "participantId": 1005740692,
                "changedDate": "2022-10-12T21:09:17Z",
                "cashOutStatus": "ENABLED",
                "id": 3172232274,
                "status": "SUSPENDED",
                "eventParticipantId": 1000000334
            },
            {
                "oddsFractional": "80/1",
                "englishLabel": "Milne, Dax",
                "label": "Milne, Dax",
                "betOfferId": 2349921831,
                "oddsAmerican": "8000",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Milne, Dax",
                "participantId": 1007029029,
                "changedDate": "2022-10-12T21:37:28Z",
                "odds": 81000,
                "cashOutStatus": "ENABLED",
                "id": 3172232277,
                "status": "OPEN",
                "eventParticipantId": 1000000334
            },
            {
                "oddsFractional": "19/1",
                "englishLabel": "Brown, Dyami",
                "label": "Brown, Dyami",
                "betOfferId": 2349921831,
                "oddsAmerican": "1900",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Brown, Dyami",
                "participantId": 1007094475,
                "changedDate": "2022-10-12T22:13:43Z",
                "odds": 20000,
                "cashOutStatus": "ENABLED",
                "id": 3172232279,
                "status": "OPEN",
                "eventParticipantId": 1000000334
            },
            {
                "oddsFractional": "45/1",
                "englishLabel": "Turner, Cole",
                "label": "Turner, Cole",
                "betOfferId": 2349921831,
                "oddsAmerican": "4500",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Turner, Cole",
                "participantId": 1007180703,
                "changedDate": "2022-10-12T22:13:43Z",
                "odds": 46000,
                "cashOutStatus": "ENABLED",
                "id": 3172232281,
                "status": "OPEN",
                "eventParticipantId": 1000000334
            },
            {
                "oddsFractional": "66/1",
                "englishLabel": "Rogers, Armani",
                "label": "Rogers, Armani",
                "betOfferId": 2349921831,
                "oddsAmerican": "6600",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Rogers, Armani",
                "participantId": 1007800362,
                "changedDate": "2022-10-12T21:37:28Z",
                "odds": 67000,
                "cashOutStatus": "ENABLED",
                "id": 3172232283,
                "status": "OPEN",
                "eventParticipantId": 1000000334
            },
            {
                "oddsFractional": "18/1",
                "englishLabel": "Bates, John",
                "label": "Bates, John",
                "betOfferId": 2349921831,
                "oddsAmerican": "1800",
                "type": "OT_PLAYER_PARTICIPANT",
                "participant": "Bates, John",
                "participantId": 1007957637,
                "changedDate": "2022-10-12T22:13:43Z",
                "odds": 19000,
                "cashOutStatus": "ENABLED",
                "id": 3172232285,
                "status": "OPEN",
                "eventParticipantId": 1000000334
            },
            {
                "oddsFractional": "16/1",
                "englishLabel": "Any other Washington Commanders player",
                "label": "Any other Washington Commanders player",
                "betOfferId": 2349921831,
                "oddsAmerican": "1600",
                "type": "OT_ANY_OTHER_PARTICIPANT",
                "participant": "Washington Commanders",
                "participantId": 1000000334,
                "changedDate": "2022-10-12T21:37:28Z",
                "odds": 17000,
                "cashOutStatus": "ENABLED",
                "id": 3172232289,
                "status": "OPEN",
                "eventParticipantId": 1000000334
            }
        ],
        "cashOutStatus": "ENABLED",
        "closed": "2022-10-14T00:15:00Z",
        "betOfferType": {
            "englishName": "Player Occurrence Number",
            "name": "Player Occurrence Number",
            "id": 125
        },
        "id": 2349921831
    }],
    "range": {
        "total": 1,
        "size": 1,
        "start": 0
    },
    "events": [{
        "englishName": "Chicago Bears - Washington Commanders",
        "groupId": 1000093656,
        "homeName": "Chicago Bears",
        "groupSortOrder": 2876820019684212700,
        "prematchEnd": "2022-10-14T00:15:00Z",
        "path": [{
                "englishName": "American Football",
                "termKey": "american_football",
                "name": "American Football",
                "id": 1000093199
            },
            {
                "englishName": "NFL",
                "termKey": "nfl",
                "name": "NFL",
                "id": 1000093656
            }
        ],
        "id": 1018663065,
        "state": "NOT_STARTED",
        "group": "NFL",
        "start": "2022-10-14T00:15:00Z",
        "nonLiveBoCount": 254,
        "tags": [
            "OFFERED_LIVE",
            "BET_BUILDER",
            "MATCH",
            "LIVE_OCCURRENCE_FEED"
        ],
        "awayName": "Washington Commanders",
        "name": "Chicago Bears - Washington Commanders",
        "sport": "AMERICAN_FOOTBALL"
    }]
}
Asked By: DrewS

||

Answers:

One small modification to your code allows you to see which record is causing the error.

for td_data in player_td_data['betOffers']:
        if td_data['criterion']['label'] == 'First Touchdown Scorer - Including Overtime' and 'OFFERED_PREMATCH' in td_data['tags']:
            for outcomes in td_data['outcomes']:
                if outcomes['type'] == 'OT_PLAYER_PARTICIPANT':
                    event_id = td_data['eventId']
                    player_id = outcomes['id']
                    player_name = outcomes['participant']
                    try:
                        player_first_td_odds = outcomes['odds']
                    except KeyError:
                        print(f'KeyError on {player_name}')
                        break


                    print(f'{event_id} {player_id} {player_name} {player_first_td_odds}')

You can see that indeed the JSON record for Thomas, Logan is missing the odds field.

Answered By: Mark Ransom
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.