{"id":16417550,"url":"https://github.com/fedecalendino/nintendeals","last_synced_at":"2025-10-26T20:31:15.220Z","repository":{"id":37634001,"uuid":"134039202","full_name":"fedecalendino/nintendeals","owner":"fedecalendino","description":"Library with a set of tools for scraping information about Nintendo games and its prices across all regions (NA, EU and JP).","archived":true,"fork":false,"pushed_at":"2024-09-28T12:13:29.000Z","size":3365,"stargazers_count":127,"open_issues_count":1,"forks_count":16,"subscribers_count":4,"default_branch":"main","last_synced_at":"2024-09-28T12:18:14.104Z","etag":null,"topics":["deals","games","metacritic","nintendo","nintendo-eshop","nintendo-switch","reddit","reddit-bot","scraping","scraping-websites"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fedecalendino.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2018-05-19T07:12:26.000Z","updated_at":"2024-09-28T12:16:41.000Z","dependencies_parsed_at":"2023-12-20T14:55:16.434Z","dependency_job_id":"e2088f00-2ec8-4087-a6ea-64a5ce4fb561","html_url":"https://github.com/fedecalendino/nintendeals","commit_stats":{"total_commits":164,"total_committers":4,"mean_commits":41.0,"dds":0.4817073170731707,"last_synced_commit":"db0a28536982ea420e257e99bf573db13d7f51f0"},"previous_names":[],"tags_count":19,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fedecalendino%2Fnintendeals","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fedecalendino%2Fnintendeals/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fedecalendino%2Fnintendeals/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fedecalendino%2Fnintendeals/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fedecalendino","download_url":"https://codeload.github.com/fedecalendino/nintendeals/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":219862222,"owners_count":16555958,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["deals","games","metacritic","nintendo","nintendo-eshop","nintendo-switch","reddit","reddit-bot","scraping","scraping-websites"],"created_at":"2024-10-11T07:11:34.472Z","updated_at":"2025-10-26T20:31:09.804Z","avatar_url":"https://github.com/fedecalendino.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":" # nintendeals\n\u003e \"nintendeals was a bot, he loved learning and deals on nintendo's eshop.\" **LetsFunHans** 💬️\n\n[![Version](https://img.shields.io/pypi/v/nintendeals?logo=pypi)](https://pypi.org/project/nintendeals)\n[![Quality Gate Status](https://img.shields.io/sonar/alert_status/fedecalendino_nintendeals?logo=sonarcloud\u0026server=https://sonarcloud.io)](https://sonarcloud.io/dashboard?id=fedecalendino_nintendeals)\n[![CodeCoverage](https://img.shields.io/sonar/coverage/fedecalendino_nintendeals?logo=sonarcloud\u0026server=https://sonarcloud.io)](https://sonarcloud.io/dashboard?id=fedecalendino_nintendeals)\n\n-----\n\nNamed after the my old [reddit bot](https://reddit.com/u/nintendeals), nintendeals is now a library with \nall the scrapers and integrations of nintendo services that I used.\n\n\n## Terminology\n\nBefore getting into any details first we need too get into the same page with a few terms:\n\n### Region\n\nHere we have three regions NA, EU and JP each one corresponding to Nintendo of America (NoA), Nintendo of Europe (NoE)\nand Nintendo of Japan (NoJ). Each of these regions have set of countries they are \"in charge of\":\n\nNoA:\n  * Canada\n  * Mexico\n  * United Stated\n  \nNoE:\n  * Every country in the European Union\n  * Australia\n  * New Zealand\n  * South Africa\n  \nNoJ:\n  * Japan\n  \n### nsuid\n\nAn nsuid is a 14 digit long string which Nintendo uses to identify games on each region. \nTaking Breath of the Wild as an example, we have these 3 nsuids for it (one per region):\n\n```    \n  * 70010000000025 (NA)\n  * 70010000000023 (EU)\n  * 70010000000026 (JP)\n```\n    \n### Product Code\n\nThe product code is another type of ID that Nintendo uses, it usually is a 8/9 character long string.\nTaking Splatoon 2 as an example, we have these 3 product codes for it (one per region):\n\n```\n  * HACPAAB6B (NA)\n  * HACPAAB6C (EU)\n  *  HACAAB6A (JP)\n```\n\nThe difference with the nsuid is that the product code has a constant between all regions (`AAB6` in this example), \nand this is what I decided to call [unique_id](https://github.com/fedecalendino/nintendeals/blob/master/nintendeals/commons/classes/games.py#L56) \nand it is what we can you to join a game across all regions.\n\nYou can also see this code in the front of your Nintendo Switch [cartridge](https://media.karousell.com/media/photos/products/2019/08/17/splatoon_2_cartridge_only_1566040350_4f38e061_progressive.jpg).\n\n## Services\n\nThis library provides three types of services: Info, Listing, Searching and Pricing. Each region has a different \nversion of Info, Listing and Searching, but Pricing is the same for all as it only requires a country and an nsuid.\n\n### Listing\n\nEven thought there are different version for each region, they all work in the same way. Given a supported \nplatform ([for this library](https://github.com/fedecalendino/nintendeals/blob/master/nintendeals/constants.py#L15))\nthey will retrieve a list games in the selected region (in the form of an iterator).\n\n```python\nfrom nintendeals import noa\n\nfor game in noa.list_switch_games():\n    print(game.title, \"/\", game.nsuid)\n```\n\n```text\n\u003e\u003e ARMS / 70010000000392\n\u003e\u003e Astro Duel Deluxe / 70010000000301\n\u003e\u003e Axiom Verge / 70010000000821\n\u003e\u003e Azure Striker GUNVOLT: STRIKER PACK / 70010000000645\n\u003e\u003e Beach Buggy Racing / 70010000000721\n```\n\n```python\nfrom nintendeals import noe\n\nfor game in noe.list_switch_games():\n    print(game.title, \"/\", game.nsuid)\n```\n\n```text\n\u003e\u003e I and Me / 70010000000314\n\u003e\u003e In Between / 70010000009184\n\u003e\u003e Ghost 1.0 / 70010000001386\n\u003e\u003e Resident Evil 0 / 70010000012848\n\u003e\u003e 64.0 / 70010000020867\n```\n\n### Searching\n\nBuilt on top of the listing services, these provide a simple way to search for games by title or release_date:\n\n```python\nfrom nintendeals import noa\n\nfor game in noa.search_switch_games(query=\"Zelda\"):\n    print(game.title, \"/\", game.nsuid)\n```\n\n```text\n\u003e\u003e The Legend of Zelda™: Link’s Awakening / 70010000020033\n\u003e\u003e The Legend of Zelda™: Link's Awakening: Dreamer Edition / None\n\u003e\u003e Cadence of Hyrule: Crypt of the NecroDancer Featuring The Legend of Zelda / 70010000021364\n\u003e\u003e The Legend of Zelda™: Breath of the Wild / 70010000000025\n```\n\n\n### Info\n\nOnce you have the nsuid of the game that you want, you can call the `game_info` service. And again, each region has their\nown version but they all work the same, but keep in mind that you need to use the correct nsuid for each region.\nComing back to the nsuid of Breath of the Wild as an example:\n\n```python\nfrom nintendeals import noa\n\ngame = noa.game_info(\"70010000000025\")\nprint(game.title)\nprint(game.product_code, game.unique_id)\nprint(game.release_date)\nprint(game.players)\nprint(str(game.rating[0]), game.rating[1])\nprint(game.eshop.ca_fr)\n\nfor feature, value in game.features.items():\n    print(\" *\", str(feature), \":\", value)\n```\n\n```text\n\u003e\u003e The Legend of Zelda™: Breath of the Wild\n\u003e\u003e HACPAAAAA AAAA\n\u003e\u003e 2017-03-03 00:00:00\n\u003e\u003e 1\n\u003e\u003e ESRB Everyone 10+\n\u003e\u003e https://www.nintendo.com/fr_CA/games/detail/the-legend-of-zelda-breath-of-the-wild-switch\n\u003e\u003e  * Demo Available : False\n\u003e\u003e  * DLC Available : False\n\u003e\u003e  * Nintendo Switch Online Required : True\n\u003e\u003e  * Save Data Cloud Supported : True\n```\n\n```python\nfrom nintendeals import noe\n\ngame = noe.game_info(\"70010000000023\")\nprint(game.title)\nprint(game.product_code, game.unique_id)\nprint(game.release_date)\nprint(game.players)\nprint(str(game.rating[0]), game.rating[1])\nprint(game.eshop.uk_en)\n\nfor feature, value in game.features.items():\n    print(\" *\", str(feature), \":\", value)\n```\n\n```text\n\u003e\u003e The Legend of Zelda: Breath of the Wild\n\u003e\u003e HACPAAAAA AAAA\n\u003e\u003e 2017-03-03 00:00:00\n\u003e\u003e 1\n\u003e\u003e PEGI 12\n\u003e\u003e https://www.nintendo.co.uk/Games/Nintendo-Switch/The-Legend-of-Zelda-Breath-of-the-Wild-1173609.html\n\u003e\u003e  * Amiibo Supported : True\n\u003e\u003e  * Demo Available : False\n\u003e\u003e  * DLC Available : False\n\u003e\u003e  * Nintendo Switch Online Required : False\n\u003e\u003e  * Save Data Cloud Supported : True\n\u003e\u003e  * Voice Chat Supported : False\n```\n\n```python\nfrom nintendeals import noj\n\ngame = noj.game_info(\"70010000000026\")\nprint(game.title)\nprint(game.product_code, game.unique_id)\nprint(game.release_date)\nprint(game.players)\nprint(str(game.rating[0]), game.rating[1])\nprint(game.eshop.jp_jp)\n\nfor feature, value in game.features.items():\n    print(\" *\", str(feature), \":\", value)\n```\n\n```text\n\u003e\u003e ゼルダの伝説　ブレス オブ ザ ワイルド\n\u003e\u003e HACAAAAA AAAA\n\u003e\u003e 2017-03-03 00:00:00\n\u003e\u003e 1\n\u003e\u003e CERO B\n\u003e\u003e https://store-jp.nintendo.com/list/software/70010000000026.html\n\u003e\u003e  * Amiibo Supported : True\n\u003e\u003e  * DLC Available : True\n\u003e\u003e  * Nintendo Switch Online Required : False\n```\n\n\n### Pricing\n\nGiven a country code (using the alpha-2 iso standard) and a game or list of games this service will fetch the current \npricing of that/those games for that country. Since this service uses nsuids to fetch the price, make sure that the\ngames that you provide have the regional nsuid that matches the country that you want. For example, only the nsuid for\nthe American region will be able to fetch you the prices of Canada, Mexico and United Stated but not for Japan or Spain.\n\n```python\nfrom nintendeals import noe\nfrom nintendeals.api import prices\n\ngame = noe.game_info(\"70010000007705\")\nprint(game.title)\nprint()\n\nprice = prices.get_price(game, country=\"CZ\")  # Czech Republic\nprint(price.currency)\nprint(price.value)\nprint(price.sale_discount, \"%\")\nprint(price.sale_value)\nprint(price.sale_start)\nprint(price.sale_end)\n\n# Alternatively you can do this for the same effect:\nprice = game.price(country=\"CZ\") \n``` \n\n```text\nDead Cells\n\nCZK\n625.0\n80 %\n500.0\n2020-04-19 22:00:00\n2020-05-03 21:59:59\n```\n\nTo reduce the amount of call to the prices api, you can also use the `get_prices` service that works in a similar way\nbut it expects a list of games instead of only one:\n\n```python\nfrom nintendeals import noa\nfrom nintendeals.api import prices\n\nbotw = noa.game_info(\"70010000000025\")\nprint(botw.title)\nceleste = noa.game_info(\"70010000006442\")\nprint(celeste.title)\n\nprint()\n\nprices = prices.get_prices([botw, celeste], country=\"US\")\nfor nsuid, price in prices:\n    print(nsuid)\n    print(price.value)\n    print(price.sale_value)\n    print()\n```\n\n```text\nThe Legend of Zelda™: Breath of the Wild\nCeleste\n\n70010000000025\n59.99\nNone\n\n70010000006442\n19.99\n4.99\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffedecalendino%2Fnintendeals","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffedecalendino%2Fnintendeals","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffedecalendino%2Fnintendeals/lists"}