⚙️Sample Python Code

Sample code for accessing the Nansen API, retrieves the relevant data, puts it in a dataframe and then saves a CSV to the user's local file.

The user just needs to input EMAIL, PASSWORD (hidden), API QUESTION, and TOKEN_ADDRESS.

Available as either a downloadable file or directly as code.

Sample Code

{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Importing python librairies\n",
    "\n",
    "import json\n",
    "import requests\n",
    "import pandas\n",
    "import os\n",
    "from getpass import getpass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Input Nansen your email and password please\n",
      "What is your Nansen account email? aurelie.barthere@nansen.ai\n",
      "Please input your Nansen password ········\n"
     ]
    }
   ],
   "source": [
    "# User prompted to input his email and password below:\n",
    "\n",
    "print('Input Nansen your email and password please')\n",
    "try:\n",
    "    EMAIL = input('What is your Nansen account email? ')\n",
    "except:\n",
    "    pass\n",
    "try:\n",
    "    PASSWORD = getpass(prompt='Please input your Nansen password ')\n",
    "except:\n",
    "    pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "200, should be 200\n",
      "application/json\n"
     ]
    }
   ],
   "source": [
    "# Connecting to the API\n",
    "\n",
    "# User parameters and API url and headers\n",
    "\n",
    "url = f'https://query.api.nansen.ai/auth'\n",
    "headers = {'Accept': 'application/json','Content-Type': 'application/json'}\n",
    "\n",
    "payload =  json.dumps({\n",
    "  'email': EMAIL,\n",
    "  'password': PASSWORD,\n",
    "})\n",
    "\n",
    "r = requests.post(url, headers=headers, data=payload)\n",
    "\n",
    "print(str(r.status_code) +  ', should be 200') \n",
    "print(r.headers['content-type'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'token': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjUwYTdhYTlkNzg5MmI1MmE4YzgxMzkwMzIzYzVjMjJlMTkwMzI1ZDgiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vZDUtbmFuc2VuLXByb2QiLCJhdWQiOiJkNS1uYW5zZW4tcHJvZCIsImF1dGhfdGltZSI6MTY1NzA0OTMzNSwidXNlcl9pZCI6Ijg5ZkMwMTRreDJRVE96bm5FYjVrcXRWZ2FJdjIiLCJzdWIiOiI4OWZDMDE0a3gyUVRPem5uRWI1a3F0VmdhSXYyIiwiaWF0IjoxNjU3MDQ5MzM1LCJleHAiOjE2NTcwNTI5MzUsImVtYWlsIjoiYXVyZWxpZS5iYXJ0aGVyZUBuYW5zZW4uYWkiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJlbWFpbCI6WyJhdXJlbGllLmJhcnRoZXJlQG5hbnNlbi5haSJdfSwic2lnbl9pbl9wcm92aWRlciI6InBhc3N3b3JkIn19.BihuSukAMWdwIaVedZLuIPCLOVX_cUeH-9KGzNQbwXWEHgbmNs-Qw0OryoXXOzv1AEIqvRQv5g78SPSlrF-R1AyfhqL4vbytZGn4dts-5Kwz3aRepvqpBO79a7JjDV6iTScnAp_zMMqundIlIflxqz6OEadsT0kxigd0HpzQzmtK03EruUuhRxvESHLgd2BhN5BFpOvD2LUz2p-pnZCflhCoUZ86mivzUINYVEJSPu_Ps9SeGkUA4W47RAgeMRMmlNjl32zwfwdH0OL5XoxFArfBBqJpQ42lM_O0qy6Xqh8wIsD6XXS7B5QCZ5NM3qTj1fbTNVFmvkLrgMy8ZFIyUQ', 'uid': '89fC014kx2QTOznnEb5kqtVgaIv2'}\n"
     ]
    }
   ],
   "source": [
    "# Retrieving user token and displaying that token\n",
    "\n",
    "token = r.json()\n",
    "print(token)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Testing a few sample API questions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Examples of questions:\n",
    "\n",
    "question_1 = f'/v1/questions/api_tgm_balance_change_7d'\n",
    "question_2 = f'/v1/questions/api_tgm_token_balances'\n",
    "question_3 = f'/v1/questions/api_token_balances_on_exchanges'\n",
    "question_4 = f'/v1/questions/api_sm_holdings_segment'\n",
    "question_5 = f'/v1/questions/api_tgm_total_exchange_supply'\n",
    "\n",
    "\n",
    "token_address_1 = \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\" # usdc example"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Please input an API question, example: /v1/questions/api_nft_mint_leaderboard; see https://nansen-ai.gitbook.io/nansen-query-documentation/api-access/end-points/v1/questions/api_nft_mint_leaderboard\n",
      "Please input a token address, example USDC: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB480xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\n"
     ]
    }
   ],
   "source": [
    "# User please input your question \n",
    "\n",
    "try:\n",
    "    user_input_question = input('Please input an API question, example: /v1/questions/api_nft_mint_leaderboard; see https://nansen-ai.gitbook.io/nansen-query-documentation/api-access/end-points')\n",
    "except:\n",
    "    pass\n",
    "try:\n",
    "    user_input_token = input('Please input a token address, example USDC: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48')\n",
    "except:\n",
    "    pass\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Loading data to Python dictionary\n",
    "url = f'https://query.api.nansen.ai' + user_input_question\n",
    "token_address = {\"token\": user_input_token}\n",
    "headers = {'Accept': 'application/json','Content-Type': 'application/json','Authorization': token['token']}\n",
    "payload =  json.dumps({\"params\": token_address,\"accept_stale\": False})\n",
    "\n",
    "try: \n",
    "    r = requests.post(url, headers=headers, data=payload)\n",
    "    r.json()\n",
    "    \n",
    "except:\n",
    "    print('There was an error attempting to call the API. Please check the correctness of your token and question inputs and try again.')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Here is what your data look like in a dataframe:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>address</th>\n",
       "      <th>no_of_5x_projects</th>\n",
       "      <th>no_of_nfts_sold</th>\n",
       "      <th>no_of_projects_sold</th>\n",
       "      <th>profit</th>\n",
       "      <th>revenue</th>\n",
       "      <th>spent</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0xee0201e07db325a5d732aeb9b9fba7b5b8e92c2a</td>\n",
       "      <td>30</td>\n",
       "      <td>397</td>\n",
       "      <td>68</td>\n",
       "      <td>18.163534</td>\n",
       "      <td>34.518600</td>\n",
       "      <td>16.355066</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0x97da20dc2bd46174da79d71a385b7248527fbee6</td>\n",
       "      <td>15</td>\n",
       "      <td>709</td>\n",
       "      <td>36</td>\n",
       "      <td>17.257880</td>\n",
       "      <td>32.833920</td>\n",
       "      <td>15.576040</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0x73c4818b537a4108d3e90dc83baabe80405c66d8</td>\n",
       "      <td>16</td>\n",
       "      <td>603</td>\n",
       "      <td>86</td>\n",
       "      <td>17.171500</td>\n",
       "      <td>43.231800</td>\n",
       "      <td>26.060300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0xd8b07bc1bc3bae553bca5e94e99935dc12df24ff</td>\n",
       "      <td>14</td>\n",
       "      <td>161</td>\n",
       "      <td>51</td>\n",
       "      <td>15.293985</td>\n",
       "      <td>27.226202</td>\n",
       "      <td>11.932217</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0xd045cc3e4428222eeb1602d63897a32c32440a6c</td>\n",
       "      <td>20</td>\n",
       "      <td>471</td>\n",
       "      <td>40</td>\n",
       "      <td>14.119944</td>\n",
       "      <td>23.688700</td>\n",
       "      <td>9.568756</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>95</th>\n",
       "      <td>0x165d163657ed71b588b2c05c7e477dabfb214c87</td>\n",
       "      <td>19</td>\n",
       "      <td>258</td>\n",
       "      <td>58</td>\n",
       "      <td>5.073793</td>\n",
       "      <td>8.686973</td>\n",
       "      <td>3.613180</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>96</th>\n",
       "      <td>0xf82d46e02dd50c280050d45f22d7e22aceb0f0ae</td>\n",
       "      <td>22</td>\n",
       "      <td>104</td>\n",
       "      <td>48</td>\n",
       "      <td>5.070906</td>\n",
       "      <td>10.345000</td>\n",
       "      <td>5.274094</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>97</th>\n",
       "      <td>0x911ab8b7d4a95a81653cc42122b8f3972dcff898</td>\n",
       "      <td>38</td>\n",
       "      <td>192</td>\n",
       "      <td>67</td>\n",
       "      <td>5.034235</td>\n",
       "      <td>6.141130</td>\n",
       "      <td>1.106895</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>98</th>\n",
       "      <td>0xa184c1285a66bf2082a78962356713a460951822</td>\n",
       "      <td>16</td>\n",
       "      <td>326</td>\n",
       "      <td>52</td>\n",
       "      <td>5.004661</td>\n",
       "      <td>7.497680</td>\n",
       "      <td>2.493019</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>99</th>\n",
       "      <td>0x8524915f14e267c1786d7b89768428553e7674dc</td>\n",
       "      <td>13</td>\n",
       "      <td>133</td>\n",
       "      <td>35</td>\n",
       "      <td>5.004618</td>\n",
       "      <td>11.202200</td>\n",
       "      <td>6.197582</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>100 rows × 7 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                       address  no_of_5x_projects  \\\n",
       "0   0xee0201e07db325a5d732aeb9b9fba7b5b8e92c2a                 30   \n",
       "1   0x97da20dc2bd46174da79d71a385b7248527fbee6                 15   \n",
       "2   0x73c4818b537a4108d3e90dc83baabe80405c66d8                 16   \n",
       "3   0xd8b07bc1bc3bae553bca5e94e99935dc12df24ff                 14   \n",
       "4   0xd045cc3e4428222eeb1602d63897a32c32440a6c                 20   \n",
       "..                                         ...                ...   \n",
       "95  0x165d163657ed71b588b2c05c7e477dabfb214c87                 19   \n",
       "96  0xf82d46e02dd50c280050d45f22d7e22aceb0f0ae                 22   \n",
       "97  0x911ab8b7d4a95a81653cc42122b8f3972dcff898                 38   \n",
       "98  0xa184c1285a66bf2082a78962356713a460951822                 16   \n",
       "99  0x8524915f14e267c1786d7b89768428553e7674dc                 13   \n",
       "\n",
       "    no_of_nfts_sold  no_of_projects_sold     profit    revenue      spent  \n",
       "0               397                   68  18.163534  34.518600  16.355066  \n",
       "1               709                   36  17.257880  32.833920  15.576040  \n",
       "2               603                   86  17.171500  43.231800  26.060300  \n",
       "3               161                   51  15.293985  27.226202  11.932217  \n",
       "4               471                   40  14.119944  23.688700   9.568756  \n",
       "..              ...                  ...        ...        ...        ...  \n",
       "95              258                   58   5.073793   8.686973   3.613180  \n",
       "96              104                   48   5.070906  10.345000   5.274094  \n",
       "97              192                   67   5.034235   6.141130   1.106895  \n",
       "98              326                   52   5.004661   7.497680   2.493019  \n",
       "99              133                   35   5.004618  11.202200   6.197582  \n",
       "\n",
       "[100 rows x 7 columns]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Converting our data to pandas.DataFrame\n",
    "\n",
    "try: \n",
    "    df = pandas.DataFrame.from_dict(r.json()['result_data'])\n",
    "except:\n",
    "    df = pandas.DataFrame.from_dict(r.json())\n",
    "\n",
    "print('Here is what your data look like in a dataframe:')\n",
    "df\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "An example Excel workbook with the dataframe output has been saved here: C:\\Users\\aurel\\example_nansen_api.csv\n"
     ]
    }
   ],
   "source": [
    "# Moving to excel INPUT to YOUR LOCAL DRIVE\n",
    "\n",
    "    # Find the path where this workbook is saved\n",
    "\n",
    "your_local_path = os.path.dirname(os.path.abspath(os.getcwd()))\n",
    "\n",
    "   # Saving to csv\n",
    "\n",
    "csv_name = 'example_nansen_api.csv'\n",
    "    \n",
    "df.to_csv(your_local_path+ r'\\\\'+csv_name)\n",
    "\n",
    "print('An example Excel workbook with the dataframe output has been saved here: '+ your_local_path+ '\\\\' + csv_name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Enjoy Nansen API ;-)\n"
     ]
    }
   ],
   "source": [
    "print('Enjoy Nansen API ;-)')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}

Last updated