├── .gitignore ├── creds.py ├── Pipfile ├── README.md ├── script.py └── Pipfile.lock /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | 3 | venv/ 4 | .env 5 | .DS_Store 6 | .idea/ 7 | .vscode -------------------------------------------------------------------------------- /creds.py: -------------------------------------------------------------------------------- 1 | credentials = dict( 2 | refresh_token="", 3 | lwa_app_id="", 4 | lwa_client_secret="", 5 | ) -------------------------------------------------------------------------------- /Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | url = "https://pypi.org/simple" 3 | verify_ssl = true 4 | name = "pypi" 5 | 6 | [packages] 7 | requests = "*" 8 | 9 | [dev-packages] 10 | 11 | [requires] 12 | python_version = "3.9" 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # new-sp-api 2 | 3 | Amazon SP-API no longer requires AWS IAM and Signature Version 4! 🤯 4 | 5 | For developers who've tried the Amazon SP-API, the most challenging part was AWS setup and sending requests with Signatures. This is no longer the case. 6 | 7 | Now everyone can easily do sample requests using any programming language. 🤓 8 | 9 | I have just recorded a quick YouTube tutorial, where I am talking about the change and showing how to do a simple request and retrieve orders using Python. 10 | 11 | YouTube link: https://youtu.be/gp5kTI8I3pU?si=44fVicetmIoRhB3b 12 | 13 | ![SP-API UPDATE](https://github.com/jakobowsky/new-sp-api/assets/32365708/0501317d-837a-4958-85f6-7bfe2ed05d4a) 14 | -------------------------------------------------------------------------------- /script.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import urllib.parse 3 | import datetime 4 | import json 5 | from creds import credentials 6 | 7 | 8 | # Getting the LWA access token using the Seller Central App credentials. The token will be valid for 1 hour until it expires. 9 | token_response = requests.post( 10 | "https://api.amazon.com/auth/o2/token", 11 | data={ 12 | "grant_type": "refresh_token", 13 | "refresh_token": credentials["refresh_token"], 14 | "client_id": credentials["lwa_app_id"], 15 | "client_secret": credentials["lwa_client_secret"], 16 | }, 17 | ) 18 | access_token = token_response.json()["access_token"] 19 | 20 | # North America SP API endpoint (from https://developer-docs.amazon.com/sp-api/docs/sp-api-endpoints) 21 | endpoint = "https://sellingpartnerapi-na.amazon.com" 22 | 23 | # US Amazon Marketplace ID (from https://developer-docs.amazon.com/sp-api/docs/marketplace-ids) 24 | marketplace_id = "ATVPDKIKX0DER" 25 | 26 | # Downloading orders (from https://developer-docs.amazon.com/sp-api/docs/orders-api-v0-reference#getorders) 27 | # the getOrders operation is a HTTP GET request with query parameters 28 | request_params = { 29 | "MarketplaceIds": marketplace_id, # required parameter 30 | "CreatedAfter": ( 31 | datetime.datetime.now() - datetime.timedelta(days=30) 32 | ).isoformat(), # orders created since 30 days ago, the date needs to be in the ISO format 33 | } 34 | 35 | orders = requests.get( 36 | endpoint 37 | + "/orders/v0/orders" # getOrders operation path (from https://developer-docs.amazon.com/sp-api/docs/orders-api-v0-reference#getorders) 38 | + "?" 39 | + urllib.parse.urlencode(request_params), # encode query parameters to the URL 40 | headers={ 41 | "x-amz-access-token": access_token, # access token from LWA, every SP API request needs to have this header 42 | }, 43 | ) 44 | 45 | # pretty print the JSON response 46 | print(json.dumps(orders.json(), indent=2)) -------------------------------------------------------------------------------- /Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "b8c2e1580c53e383cfe4254c1f16560b855d984fde8b2beb3bf6ee8fc2fe5a22" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.9" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.org/simple", 14 | "verify_ssl": true 15 | } 16 | ] 17 | }, 18 | "default": { 19 | "certifi": { 20 | "hashes": [ 21 | "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", 22 | "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" 23 | ], 24 | "markers": "python_version >= '3.6'", 25 | "version": "==2023.7.22" 26 | }, 27 | "charset-normalizer": { 28 | "hashes": [ 29 | "sha256:02673e456dc5ab13659f85196c534dc596d4ef260e4d86e856c3b2773ce09843", 30 | "sha256:02af06682e3590ab952599fbadac535ede5d60d78848e555aa58d0c0abbde786", 31 | "sha256:03680bb39035fbcffe828eae9c3f8afc0428c91d38e7d61aa992ef7a59fb120e", 32 | "sha256:0570d21da019941634a531444364f2482e8db0b3425fcd5ac0c36565a64142c8", 33 | "sha256:09c77f964f351a7369cc343911e0df63e762e42bac24cd7d18525961c81754f4", 34 | "sha256:0d3d5b7db9ed8a2b11a774db2bbea7ba1884430a205dbd54a32d61d7c2a190fa", 35 | "sha256:1063da2c85b95f2d1a430f1c33b55c9c17ffaf5e612e10aeaad641c55a9e2b9d", 36 | "sha256:12ebea541c44fdc88ccb794a13fe861cc5e35d64ed689513a5c03d05b53b7c82", 37 | "sha256:153e7b6e724761741e0974fc4dcd406d35ba70b92bfe3fedcb497226c93b9da7", 38 | "sha256:15b26ddf78d57f1d143bdf32e820fd8935d36abe8a25eb9ec0b5a71c82eb3895", 39 | "sha256:1872d01ac8c618a8da634e232f24793883d6e456a66593135aeafe3784b0848d", 40 | "sha256:187d18082694a29005ba2944c882344b6748d5be69e3a89bf3cc9d878e548d5a", 41 | "sha256:1b2919306936ac6efb3aed1fbf81039f7087ddadb3160882a57ee2ff74fd2382", 42 | "sha256:232ac332403e37e4a03d209a3f92ed9071f7d3dbda70e2a5e9cff1c4ba9f0678", 43 | "sha256:23e8565ab7ff33218530bc817922fae827420f143479b753104ab801145b1d5b", 44 | "sha256:24817cb02cbef7cd499f7c9a2735286b4782bd47a5b3516a0e84c50eab44b98e", 45 | "sha256:249c6470a2b60935bafd1d1d13cd613f8cd8388d53461c67397ee6a0f5dce741", 46 | "sha256:24a91a981f185721542a0b7c92e9054b7ab4fea0508a795846bc5b0abf8118d4", 47 | "sha256:2502dd2a736c879c0f0d3e2161e74d9907231e25d35794584b1ca5284e43f596", 48 | "sha256:250c9eb0f4600361dd80d46112213dff2286231d92d3e52af1e5a6083d10cad9", 49 | "sha256:278c296c6f96fa686d74eb449ea1697f3c03dc28b75f873b65b5201806346a69", 50 | "sha256:2935ffc78db9645cb2086c2f8f4cfd23d9b73cc0dc80334bc30aac6f03f68f8c", 51 | "sha256:2f4a0033ce9a76e391542c182f0d48d084855b5fcba5010f707c8e8c34663d77", 52 | "sha256:30a85aed0b864ac88309b7d94be09f6046c834ef60762a8833b660139cfbad13", 53 | "sha256:380c4bde80bce25c6e4f77b19386f5ec9db230df9f2f2ac1e5ad7af2caa70459", 54 | "sha256:3ae38d325b512f63f8da31f826e6cb6c367336f95e418137286ba362925c877e", 55 | "sha256:3b447982ad46348c02cb90d230b75ac34e9886273df3a93eec0539308a6296d7", 56 | "sha256:3debd1150027933210c2fc321527c2299118aa929c2f5a0a80ab6953e3bd1908", 57 | "sha256:4162918ef3098851fcd8a628bf9b6a98d10c380725df9e04caf5ca6dd48c847a", 58 | "sha256:468d2a840567b13a590e67dd276c570f8de00ed767ecc611994c301d0f8c014f", 59 | "sha256:4cc152c5dd831641e995764f9f0b6589519f6f5123258ccaca8c6d34572fefa8", 60 | "sha256:542da1178c1c6af8873e143910e2269add130a299c9106eef2594e15dae5e482", 61 | "sha256:557b21a44ceac6c6b9773bc65aa1b4cc3e248a5ad2f5b914b91579a32e22204d", 62 | "sha256:5707a746c6083a3a74b46b3a631d78d129edab06195a92a8ece755aac25a3f3d", 63 | "sha256:588245972aca710b5b68802c8cad9edaa98589b1b42ad2b53accd6910dad3545", 64 | "sha256:5adf257bd58c1b8632046bbe43ee38c04e1038e9d37de9c57a94d6bd6ce5da34", 65 | "sha256:619d1c96099be5823db34fe89e2582b336b5b074a7f47f819d6b3a57ff7bdb86", 66 | "sha256:63563193aec44bce707e0c5ca64ff69fa72ed7cf34ce6e11d5127555756fd2f6", 67 | "sha256:67b8cc9574bb518ec76dc8e705d4c39ae78bb96237cb533edac149352c1f39fe", 68 | "sha256:6a685067d05e46641d5d1623d7c7fdf15a357546cbb2f71b0ebde91b175ffc3e", 69 | "sha256:70f1d09c0d7748b73290b29219e854b3207aea922f839437870d8cc2168e31cc", 70 | "sha256:750b446b2ffce1739e8578576092179160f6d26bd5e23eb1789c4d64d5af7dc7", 71 | "sha256:7966951325782121e67c81299a031f4c115615e68046f79b85856b86ebffc4cd", 72 | "sha256:7b8b8bf1189b3ba9b8de5c8db4d541b406611a71a955bbbd7385bbc45fcb786c", 73 | "sha256:7f5d10bae5d78e4551b7be7a9b29643a95aded9d0f602aa2ba584f0388e7a557", 74 | "sha256:805dfea4ca10411a5296bcc75638017215a93ffb584c9e344731eef0dcfb026a", 75 | "sha256:81bf654678e575403736b85ba3a7867e31c2c30a69bc57fe88e3ace52fb17b89", 76 | "sha256:82eb849f085624f6a607538ee7b83a6d8126df6d2f7d3b319cb837b289123078", 77 | "sha256:85a32721ddde63c9df9ebb0d2045b9691d9750cb139c161c80e500d210f5e26e", 78 | "sha256:86d1f65ac145e2c9ed71d8ffb1905e9bba3a91ae29ba55b4c46ae6fc31d7c0d4", 79 | "sha256:86f63face3a527284f7bb8a9d4f78988e3c06823f7bea2bd6f0e0e9298ca0403", 80 | "sha256:8eaf82f0eccd1505cf39a45a6bd0a8cf1c70dcfc30dba338207a969d91b965c0", 81 | "sha256:93aa7eef6ee71c629b51ef873991d6911b906d7312c6e8e99790c0f33c576f89", 82 | "sha256:96c2b49eb6a72c0e4991d62406e365d87067ca14c1a729a870d22354e6f68115", 83 | "sha256:9cf3126b85822c4e53aa28c7ec9869b924d6fcfb76e77a45c44b83d91afd74f9", 84 | "sha256:9fe359b2e3a7729010060fbca442ca225280c16e923b37db0e955ac2a2b72a05", 85 | "sha256:a0ac5e7015a5920cfce654c06618ec40c33e12801711da6b4258af59a8eff00a", 86 | "sha256:a3f93dab657839dfa61025056606600a11d0b696d79386f974e459a3fbc568ec", 87 | "sha256:a4b71f4d1765639372a3b32d2638197f5cd5221b19531f9245fcc9ee62d38f56", 88 | "sha256:aae32c93e0f64469f74ccc730a7cb21c7610af3a775157e50bbd38f816536b38", 89 | "sha256:aaf7b34c5bc56b38c931a54f7952f1ff0ae77a2e82496583b247f7c969eb1479", 90 | "sha256:abecce40dfebbfa6abf8e324e1860092eeca6f7375c8c4e655a8afb61af58f2c", 91 | "sha256:abf0d9f45ea5fb95051c8bfe43cb40cda383772f7e5023a83cc481ca2604d74e", 92 | "sha256:ac71b2977fb90c35d41c9453116e283fac47bb9096ad917b8819ca8b943abecd", 93 | "sha256:ada214c6fa40f8d800e575de6b91a40d0548139e5dc457d2ebb61470abf50186", 94 | "sha256:b09719a17a2301178fac4470d54b1680b18a5048b481cb8890e1ef820cb80455", 95 | "sha256:b1121de0e9d6e6ca08289583d7491e7fcb18a439305b34a30b20d8215922d43c", 96 | "sha256:b3b2316b25644b23b54a6f6401074cebcecd1244c0b8e80111c9a3f1c8e83d65", 97 | "sha256:b3d9b48ee6e3967b7901c052b670c7dda6deb812c309439adaffdec55c6d7b78", 98 | "sha256:b5bcf60a228acae568e9911f410f9d9e0d43197d030ae5799e20dca8df588287", 99 | "sha256:b8f3307af845803fb0b060ab76cf6dd3a13adc15b6b451f54281d25911eb92df", 100 | "sha256:c2af80fb58f0f24b3f3adcb9148e6203fa67dd3f61c4af146ecad033024dde43", 101 | "sha256:c350354efb159b8767a6244c166f66e67506e06c8924ed74669b2c70bc8735b1", 102 | "sha256:c5a74c359b2d47d26cdbbc7845e9662d6b08a1e915eb015d044729e92e7050b7", 103 | "sha256:c71f16da1ed8949774ef79f4a0260d28b83b3a50c6576f8f4f0288d109777989", 104 | "sha256:d47ecf253780c90ee181d4d871cd655a789da937454045b17b5798da9393901a", 105 | "sha256:d7eff0f27edc5afa9e405f7165f85a6d782d308f3b6b9d96016c010597958e63", 106 | "sha256:d97d85fa63f315a8bdaba2af9a6a686e0eceab77b3089af45133252618e70884", 107 | "sha256:db756e48f9c5c607b5e33dd36b1d5872d0422e960145b08ab0ec7fd420e9d649", 108 | "sha256:dc45229747b67ffc441b3de2f3ae5e62877a282ea828a5bdb67883c4ee4a8810", 109 | "sha256:e0fc42822278451bc13a2e8626cf2218ba570f27856b536e00cfa53099724828", 110 | "sha256:e39c7eb31e3f5b1f88caff88bcff1b7f8334975b46f6ac6e9fc725d829bc35d4", 111 | "sha256:e46cd37076971c1040fc8c41273a8b3e2c624ce4f2be3f5dfcb7a430c1d3acc2", 112 | "sha256:e5c1502d4ace69a179305abb3f0bb6141cbe4714bc9b31d427329a95acfc8bdd", 113 | "sha256:edfe077ab09442d4ef3c52cb1f9dab89bff02f4524afc0acf2d46be17dc479f5", 114 | "sha256:effe5406c9bd748a871dbcaf3ac69167c38d72db8c9baf3ff954c344f31c4cbe", 115 | "sha256:f0d1e3732768fecb052d90d62b220af62ead5748ac51ef61e7b32c266cac9293", 116 | "sha256:f5969baeaea61c97efa706b9b107dcba02784b1601c74ac84f2a532ea079403e", 117 | "sha256:f8888e31e3a85943743f8fc15e71536bda1c81d5aa36d014a3c0c44481d7db6e", 118 | "sha256:fc52b79d83a3fe3a360902d3f5d79073a993597d48114c29485e9431092905d8" 119 | ], 120 | "markers": "python_full_version >= '3.7.0'", 121 | "version": "==3.3.0" 122 | }, 123 | "idna": { 124 | "hashes": [ 125 | "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", 126 | "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" 127 | ], 128 | "markers": "python_version >= '3.5'", 129 | "version": "==3.4" 130 | }, 131 | "requests": { 132 | "hashes": [ 133 | "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", 134 | "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" 135 | ], 136 | "index": "pypi", 137 | "version": "==2.31.0" 138 | }, 139 | "urllib3": { 140 | "hashes": [ 141 | "sha256:7a7c7003b000adf9e7ca2a377c9688bbc54ed41b985789ed576570342a375cd2", 142 | "sha256:b19e1a85d206b56d7df1d5e683df4a7725252a964e3993648dd0fb5a1c157564" 143 | ], 144 | "markers": "python_full_version >= '3.7.0'", 145 | "version": "==2.0.6" 146 | } 147 | }, 148 | "develop": {} 149 | } 150 | --------------------------------------------------------------------------------