DEV Community

Cover image for # Crypto Profits Tracker (feat. Notion API) using Python
TnvMadhav⚡
TnvMadhav⚡

Posted on • Updated on

# Crypto Profits Tracker (feat. Notion API) using Python

Crypto Boom of early '21


A crackle involving cryptocurrencies took off late 2020, and early 2021 saw a portion of it go mainstream. Cryptocurrency adoption was at all time high, with mighty bursts of bulk investing and selling.
The prices went from all time highs to dwindling states all in the matter of minutes. This was a result of non stop bidirectional flow of coins all over the globe. This forced the investors to keep up to date with extremely mutable prices toggling the state of the market.

Some wanted quick profits, some wanted to be a part of history and others went for the overhaul. Regardless of the intentions, almost all of the players had the trade sites running non-stop on all screens to catch the next dip.

Hours and hours of precious time were lost while keeping up to date with the graphs based profits (or losses) and the inconsistent nature of the the market didn't make the situation any better.

For people like me who waste a lot of time overthinking and make decisions on impulse, I wanted to try sorting this out.

🤔

The idea was to keep me updated without all the glitter and jam. I hated keeping all of the trade firms open multiple tabs and wanted to get this sorted out.

So I planned to use APIs to pull data to my console to check the prices without any other hassle.

ICYAC: Link to the template at the end of article 👇🏻

...

😲 Advent of Notion API

Then Notion launched API Integrations Beta. This immediately lit a spark in my head. Now I didn't have to leave my notion app (workspace).

👓 My Expectations

  1. Open a Notion page,
  2. Check my profits (or losses),
  3. Close the page

👉🏻 "This should take only 1 minute of my time."


Design

I want my net profit but I don't want to leave my Notion Workspace.

I had to get my net profit,

Profit Equation

where

n is number of coins I am currently 'hodling',

m is number of coins of type j that I currently have in my wallet

I just want check 'NetProfit' and peace out.


Dashboard Setup

"Notion is incredible with its DIY databases." - We can build wonders without worrying about the code that goes into maintaining it.

I quickly set up a dashboard with the crypto coin entries as a entities. The selected attributes were used to calculate the profit.

Profit Dashboard

Considering that my API Integration is setup and my updation server is running, If I had to ever invest in a new currency, I would just add an entry to this database consisting of Name, Amount Invested and Number of Coins in wallet , I should automatically see my profits taking form in the Notion Database.

Notion Integration

In order to provide edit capabilities on my crypto dashboard, I would want to provide a access token with edit scope to my updation script (here python).

To get the access token (secret key), I would want to create an internal integration. The steps to create an integration for a database can be found here

Steps to setup an Integration: [Referenced from Official Notion Doc]

  • Go to https://www.notion.com/my-integrations.
  • Click the "+ New integration" button.
  • Give your integration a name, say "My-Crypto-Updates"
  • Select the workspace where you want to install this integration.
  • Click "Submit" to create the integration.
  • Copy the "Internal Integration Token" on the next page and keep it aside

Notion Integration Gif

Share a database with your integration

 A user must share specific pages with an integration in order for those pages to be accessed using the API. 

Go back to the 'Crypto Dashboard' & click on the Share button and use the selector to find your integration by its name, then click Invite. Your integration now has permission to read, write, and edit the new database.

Ensure that this created integration is not used by any other database

🔥 Leveraging notion-api

Once you have a database setup in your notion workspace, you would want to have a system where the dashboard is constantly updated with latest crypto currency prices.

😄 Let's walk you through to get it done, using the 💪🏻 power of Notion API,

High Level Design

I am using python as it is more readable and is familiar for most. The script essentially performs 3 actions:

  1. Getting list of CryptoCoins that the user has added to the Notion database (GET~ POST)

  2. Getting prices for the CryptoCoins in List (GET)

  3. Updating the Prices to the Notion Database (PATCH)


The above functionality is implemented using python class methods.

How to use Notion API 💻


  1. Clone the GitHub Repository
  2. (After unzipping) You will find 3 files inside
  3. cd into the directory where the 3 files are present using bash shell or terminal (command prompt for windows)
  4. Install the required software dependencies by running the following command,

    
    pip3 install -r requirements.txt
    
    # use `py -m pip install -r requirements.txt` (for 
      Windows System)
    
  5. Update and save the my_variables.yml file with your notion related information, (don't include the <> characters)

    MY_NOTION_SECRET_TOKEN: <insert-your-notion-integration- 
    secret-token> # (use the secret from prior step
    
  6. Run the following command to execute python script,

    python3 read.py   
    
    # Use `py read.py` if you are on Windows!
    
  7. 🙌🏻 Watch your crypto dashboard update automatically! 🎉


Conclusion

This was another experiment of mine but it really helped me save a lot of time scrolling and clicking around Crypto Trading Firms.

If you liked this, do follow me on Twitter and let me know 😁

👉🏻 The Notion Template can be found here :~

Crypto Dashboard

👉🏻 If you want to offload running and maintaining code to me, you can subscribe to this service as a monthly subscription:

Crypto Profits Tracker App

Oldest comments (32)

Collapse
 
linkard profile image
Robin Playe 🌐

Can't get this to work for the life of me. Could use a video tutorial

Collapse
 
tnvmadhav profile image
TnvMadhav⚡ • Edited

Thank you for your feedback! I will definitely improve on the setup instructions for my future products!

But for the time being, would you mind sharing where exactly you are stuck at?

Collapse
 
linkard profile image
Info Comment hidden by post author - thread only accessible via permalink
Robin Playe 🌐

I followed the instructions, but it's just not working for me. I'm able to download the zip file, launch the first python command, modify one of the file with my secret key and launch the final command, but my Notion page never updated with the API after that.

Note that I have no experience with Python, so I am following the instructions with minimal knowledge of what everything does.

 
tnvmadhav profile image
TnvMadhav⚡ • Edited

Don't worry! Python is an incredible language and you would get better and better as you proactively try to find your weak spots and improve :)

I have a couple of questions:

  1. Have you added any crypto currencies to your dashboard table under the 'Name' Attribute? If you haven't I would recommend adding a test coin first

  2. Do you see any errors when you run python script?

Thread Thread
 
linkard profile image
Robin Playe 🌐
  1. No at first, Yes later. Got the same result both times
  2. I did it again from the beginning, here is the last block of text I get when I launch the last command "Traceback (most recent call last): File "C:\Users\linka\OneDrive\Documents\Backend\Notion\Python\Crypto Wallet\Binance\python3-notion-crypto-dashboard-bundle\read.py", line 102, in MyIntegration().UpdateIndefinitely() File "C:\Users\linka\OneDrive\Documents\Backend\Notion\Python\Crypto Wallet\Binance\python3-notion-crypto-dashboard-bundle\read.py", line 20, in init self.getDatabaseId() File "C:\Users\linka\OneDrive\Documents\Backend\Notion\Python\Crypto Wallet\Binance\python3-notion-crypto-dashboard-bundle\read.py", line 31, in getDatabaseId self.my_variables_map["DATABASE_ID"] = response.json()["results"][0]["id"] KeyError: 'results'"
Thread Thread
 
tnvmadhav profile image
TnvMadhav⚡ • Edited

Thank you for informing. I will be de listing the product for now and try to reproduce this.

I will get back to you soon.

Edit:
I am not able to reproduce this.

BTW, what is the output of print(response.json()) in the method getDatabaseId() ?

Can we take this in twitter dms?

Edit:
Issue is fixed ✅

Thread Thread
 
linkard profile image
Robin Playe 🌐

Sure! I'm not sure what your last question means but i followed you on twittter

Collapse
 
theshadowgit profile image
Info Comment hidden by post author - thread only accessible via permalink
TheShadowGit

Hey Madhav, Thanks for the guide. I have imported your repository to my github. Now where do i edit and run the python file ? will it be on my desktop ? I just want to know because that will mean, I will have to always remember to run this script before looking at my tracker in notion ? is that how it is supposed to be ?

Collapse
 
tnvmadhav profile image
TnvMadhav⚡

Hey there,

Apologies for the delayed response!

Now where do i edit and run the python file ?

You just have to paste your notion integration secret token into the my_variables.yml file and run your python script!

I just want to know because that will mean, I will have to always remember to run this script before looking at my tracker in notion ? is that how it is supposed to be ?

Yes, as long as the script is running, the crypto data will be fetched and the notion database will be updated automatically!

Collapse
 
zopear profile image
Jane Doe • Edited

I got up to the last step and ran the python.3 read.py (I'm on mac) and received an index error: list index out of range

Any suggestions to get around this one?

Thank you!

Collapse
 
tnvmadhav profile image
TnvMadhav⚡

Apologies for the delayed response.

Sure. I would love to help. Can we take this to twitter DMs if you don't mind?

Collapse
 
zaxkiller profile image
zaxkiller

Got the same error, any suggestion?

Thank you!!

Thread Thread
 
pierre_fortin_ee47ea55404 profile image
pierre fortin

Got the same error

IndexError: list index out of range

Any ideas?

Thread Thread
 
tnvmadhav profile image
TnvMadhav⚡

Hi Pierre Fortin,

Can we take this to twitter DMs if you don't mind?

...that way we can prevent this public thread from bloating up!

Thread Thread
 
pierre_fortin_ee47ea55404 profile image
pierre fortin

Sure, but there's no option to DM you on Twitter though.

Thread Thread
 
tnvmadhav profile image
TnvMadhav⚡ • Edited

Hey Pierre Fortin,

Apologies for the delayed response.

Could you follow me on Twitter? and maybe when I follow you back, we could initiate DM!

Collapse
 
vickzerh profile image
Victor Delaune • Edited

Hey Madhav, thanks a lot for your work! What a useful tool.

Small question: how can I get the price in Euro € instead of USD $ ?

I track all my crypto investments in euro and it would be a big pain to change everything...

EDIT: I managed changing USDT to EUR in 51th line of the read.py code.

Collapse
 
tnvmadhav profile image
TnvMadhav⚡

Sorry, for being late.

Did it work out?

Collapse
 
giodsiyow profile image
Info Comment hidden by post author - thread only accessible via permalink

Hi! awesome what you could accomplish with a bit of python. I have the same problem as the first guy though--the script won't run, returning

KeyError: 'results'

this means that results don't exist right?

Collapse
 
benjiblaine profile image
Ben Blaine

I got an error

Traceback (most recent call last):
  File "/notion-crypto-integration-main/read.py", line 102, in <module>
    MyIntegration().UpdateIndefinitely()
  File "/notion-crypto-integration-main/read.py", line 20, in __init__
    self.getDatabaseId()
  File "/notion-crypto-integration-main/read.py", line 31, in getDatabaseId
    self.my_variables_map["DATABASE_ID"] = response.json()["results"][0]["id"]
KeyError: 'results'
Enter fullscreen mode Exit fullscreen mode
Collapse
 
tnvmadhav profile image
TnvMadhav⚡

Hello Ben,

I can help you out!

Can we connect on twitter DMs? That way we can resolve things without bloating public threads

Collapse
 
benjiblaine profile image
Ben Blaine

Please do @benjiblaine

Thread Thread
 
benjiblaine profile image
Ben Blaine

Thanks for the help @tnvmadhav ! It's working now.

I simply forgot to remove the "<" and ">" in the my_variables.yml file 🤦‍♂️

Thread Thread
 
tnvmadhav profile image
TnvMadhav⚡

😄 Thank you for stating the solution to this problem Ben!

👍🏻 This will surely help others as well.

PS: I have also updated the post regarding the same.

Collapse
 
anesgroup profile image
AnesGroup

i got an error

Collapse
 
tnvmadhav profile image
TnvMadhav⚡ • Edited

Hello,

I would love to help you out.

Can we connect using Twitter DMs so that this thread isn't bloated with minute details?

Collapse
 
anesgroup profile image
AnesGroup

Sure @anesgroup on Twitter.
Thank you.

Collapse
 
sanjuancito profile image
SanJuancito

i got TypeError: 'str' object does not support item assignment

Collapse
 
callusvn profile image
Jame Kane

Traceback (most recent call last):
File "read.py", line 102, in
MyIntegration().UpdateIndefinitely()
File "read.py", line 21, in init
self.getNotionDatabaseEntities()
File "read.py", line 42, in getNotionDatabaseEntities
self.my_variables_map["NOTION_ENTRIES"].update({v["properties"]["Name"]["title"][0]["text"]["content"]: {"page": v["id"], "price": float(v["properties"]["Price/Coin"]["number"])}})
IndexError: list index out of range

I got this error

Collapse
 
fedefede profile image
Fede_Drei

Hi there, amazing job, it's possibile to find a walkaround to get pools APY data? if you want to move on twitter this is my handle @fedre5

Thanks!

Collapse
 
leo_feroces profile image
Leo Feroces

I got the same error as @benjiblaine

Traceback (most recent call last):
  File "/Users/jeanduporte/Downloads/notion-crypto-integration-main/read.py", line 102, in <module>
    MyIntegration().UpdateIndefinitely()
  File "/Users/jeanduporte/Downloads/notion-crypto-integration-main/read.py", line 20, in __init__
    self.getDatabaseId()
  File "/Users/jeanduporte/Downloads/notion-crypto-integration-main/read.py", line 31, in getDatabaseId
    self.my_variables_map["DATABASE_ID"] = response.json()["results"][0]["id"]
IndexError: list index out of range
Enter fullscreen mode Exit fullscreen mode

Any ideas?

Collapse
 
leo_feroces profile image
Leo Feroces

I did not forget to remove <>

Some comments have been hidden by the post's author - find out more