<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Zaenal Arifin </title>
    <description>The latest articles on DEV Community by Zaenal Arifin  (@1amkaizen).</description>
    <link>https://dev.to/1amkaizen</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1165640%2F16c23086-bcaf-4b6b-bb4c-7501b84c6913.png</url>
      <title>DEV Community: Zaenal Arifin </title>
      <link>https://dev.to/1amkaizen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/1amkaizen"/>
    <language>en</language>
    <item>
      <title>🚀 Panduan Hosting Website di Raspberry Pi + Subdomain</title>
      <dc:creator>Zaenal Arifin </dc:creator>
      <pubDate>Fri, 12 Dec 2025 03:24:51 +0000</pubDate>
      <link>https://dev.to/1amkaizen/panduan-hosting-website-di-raspberry-pi-subdomain-2pe</link>
      <guid>https://dev.to/1amkaizen/panduan-hosting-website-di-raspberry-pi-subdomain-2pe</guid>
      <description>&lt;p&gt;Panduan ini buat bikin &lt;strong&gt;Website online di Raspberry Pi&lt;/strong&gt; dengan FastAPI + Gunicorn + Uvicorn + Nginx + SSL, sekaligus atur subdomain supaya bisa diakses dari internet.&lt;/p&gt;




&lt;h2&gt;
  
  
  1️⃣ Update &amp;amp; Install Dependency
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;python3-pip python3-venv nginx git &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2️⃣ Clone Project
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Catatan:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ganti &lt;code&gt;username/project.git&lt;/code&gt; sesuai repository GitHub kamu&lt;/li&gt;
&lt;li&gt;Path folder lokal (&lt;code&gt;cd project&lt;/code&gt;) bisa diganti sesuai nama project&lt;/li&gt;
&lt;li&gt;Pilih metode dependency sesuai kebutuhan: Poetry atau &lt;code&gt;requirements.txt&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/username/project.git   &lt;span class="c"&gt;# &amp;lt;-- ganti URL repo kamu&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;project                                          &lt;span class="c"&gt;# &amp;lt;-- ganti sesuai nama folder project&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Kalau pakai Poetry:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;poetry
poetry &lt;span class="nb"&gt;install&lt;/span&gt;                                     &lt;span class="c"&gt;# &amp;lt;-- otomatis install dependency dari pyproject.toml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Kalau pakai &lt;code&gt;requirements.txt&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv                               &lt;span class="c"&gt;# &amp;lt;-- buat virtual environment&lt;/span&gt;
&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate                            &lt;span class="c"&gt;# &amp;lt;-- aktifkan venv&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt                    &lt;span class="c"&gt;# &amp;lt;-- install dependency dari requirements.txt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Tips:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pastikan branch yang ingin dijalankan sesuai kebutuhan (&lt;code&gt;git checkout branch-name&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Kalau pakai Poetry, pastikan &lt;code&gt;poetry shell&lt;/code&gt; atau jalankan dengan &lt;code&gt;.venv/bin/python&lt;/code&gt; sesuai virtual environment&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3️⃣ Test FastAPI Lokal
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gunicorn main:app &lt;span class="nt"&gt;--workers&lt;/span&gt; 4 &lt;span class="nt"&gt;--worker-class&lt;/span&gt; uvicorn.workers.UvicornWorker &lt;span class="nt"&gt;--bind&lt;/span&gt; 0.0.0.0:8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Buka browser &lt;code&gt;http://127.0.0.1:8000&lt;/code&gt; harus muncul website.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4️⃣ Setup systemd Service
&lt;/h2&gt;

&lt;p&gt;Biar FastAPI jalan otomatis di background. &lt;strong&gt;Catatan:&lt;/strong&gt; ganti semua bagian yang sesuai project kamu, khususnya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;project.service&lt;/code&gt; → nama service, bisa diganti sesuai project&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;User&lt;/code&gt; &amp;amp; &lt;code&gt;Group&lt;/code&gt; → user di Pi yang punya akses ke folder project&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;WorkingDirectory&lt;/code&gt; → path ke folder project di Pi&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ExecStart&lt;/code&gt; → path ke virtual environment dan nama file app (&lt;code&gt;main:app&lt;/code&gt;)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;vim /etc/systemd/system/project.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isi file (sesuaikan nama &amp;amp; path):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;# /etc/systemd/system/project.service
&lt;/span&gt;&lt;span class="nn"&gt;[Unit]&lt;/span&gt;
&lt;span class="py"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;project FastAPI&lt;/span&gt;
&lt;span class="py"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network.target&lt;/span&gt;

&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;User&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;pi&lt;/span&gt;
&lt;span class="py"&gt;Group&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;pi&lt;/span&gt;
&lt;span class="py"&gt;WorkingDirectory&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/home/pi/project&lt;/span&gt;
&lt;span class="py"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"PATH=/home/pi/project/myenv/bin"&lt;/span&gt;
&lt;span class="py"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/home/pi/project/project/myenv/bin/gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000&lt;/span&gt;
&lt;span class="py"&gt;Restart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;
&lt;span class="py"&gt;RestartSec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;5s&lt;/span&gt;

&lt;span class="nn"&gt;[Install]&lt;/span&gt;
&lt;span class="py"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable &amp;amp; start service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;project        &lt;span class="c"&gt;# &amp;lt;-- pastikan sama dengan nama file service&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start project
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nama service (&lt;code&gt;project&lt;/code&gt;) harus konsisten di &lt;code&gt;/etc/systemd/system/&lt;/code&gt; dan saat enable/start&lt;/li&gt;
&lt;li&gt;Path &lt;code&gt;WorkingDirectory&lt;/code&gt; dan &lt;code&gt;ExecStart&lt;/code&gt; harus sesuai lokasi project &amp;amp; virtual environment kamu&lt;/li&gt;
&lt;li&gt;Jika pakai Poetry, path ke executable bisa diganti: &lt;code&gt;/home/pi/project/.venv/bin/gunicorn ...&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  5️⃣ Setup Nginx sebagai Reverse Proxy
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Catatan:&lt;/strong&gt; ganti semua yang perlu sesuai project kamu, khususnya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;project.conf&lt;/code&gt; → nama file config, bisa sesuai project&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;server_name&lt;/code&gt; → subdomain / domain yang kamu pakai&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;proxy_pass&lt;/code&gt; → URL lokal tempat FastAPI/Gunicorn berjalan
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;vim /etc/nginx/sites-available/project.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isi file (sesuaikan nama &amp;amp; domain):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;project.example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;# &amp;lt;-- ganti sesuai subdomain / domain kamu&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://127.0.0.1:8000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;# &amp;lt;-- ganti port sesuai Gunicorn&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable config &amp;amp; restart Nginx:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /etc/nginx/sites-available/project.conf /etc/nginx/sites-enabled/
&lt;span class="nb"&gt;sudo &lt;/span&gt;nginx &lt;span class="nt"&gt;-t&lt;/span&gt;                     &lt;span class="c"&gt;# &amp;lt;-- cek syntax&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart nginx      &lt;span class="c"&gt;# &amp;lt;-- restart Nginx supaya config berlaku&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nama file config (&lt;code&gt;project.conf&lt;/code&gt;) bisa diganti sesuai project, tapi harus konsisten saat &lt;code&gt;ln -s&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;server_name&lt;/code&gt; harus sama dengan subdomain / domain yang sudah diarahkan di DNS&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;proxy_pass&lt;/code&gt; harus sesuai port Gunicorn/Uvicorn yang kamu pakai&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  6️⃣ Pasang SSL Gratis dengan Let’s Encrypt
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Catatan:&lt;/strong&gt; ganti &lt;code&gt;project.example.com&lt;/code&gt; dengan &lt;strong&gt;subdomain atau domain&lt;/strong&gt; yang sudah diarahkan ke server kamu.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;certbot python3-certbot-nginx &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot &lt;span class="nt"&gt;--nginx&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; project.example.com   &lt;span class="c"&gt;# &amp;lt;-- ganti sesuai domain/subdomain kamu&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Tips &amp;amp; Catatan:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ikuti instruksi di layar untuk verifikasi domain dan otomatis konfigurasi HTTPS.&lt;/li&gt;
&lt;li&gt;Setelah selesai, Certbot akan otomatis men-setup &lt;strong&gt;redirect HTTP → HTTPS&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Untuk perpanjangan SSL otomatis, Certbot biasanya sudah menambahkan cron job. Bisa cek dengan:&lt;/li&gt;
&lt;/ul&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status certbot.timer
&lt;/code&gt;&lt;/pre&gt;


&lt;ul&gt;
&lt;li&gt;Pastikan domain/subdomain sudah &lt;strong&gt;propagasi di DNS&lt;/strong&gt; sebelum menjalankan Certbot.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  7️⃣ Opsi Subdomain
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Catatan Umum:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ganti &lt;code&gt;project&lt;/code&gt; atau &lt;code&gt;project.example.com&lt;/code&gt; sesuai nama project/subdomain kamu&lt;/li&gt;
&lt;li&gt;Pastikan DNS domain/subdomain sudah diarahkan ke server atau tunnel sebelum testing&lt;/li&gt;
&lt;li&gt;Pilih opsi sesuai kondisi IP server: statik atau dinamis&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Opsi 1 – Arahkan langsung ke IP publik&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Kalau server punya &lt;strong&gt;IP publik statik&lt;/strong&gt; (atau pakai Dynamic DNS):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Login ke Cloudflare → pilih domain → &lt;strong&gt;DNS&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Tambah &lt;strong&gt;A record&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt;: &lt;code&gt;project&lt;/code&gt;      # &amp;lt;-- ganti sesuai subdomain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type&lt;/strong&gt;: &lt;code&gt;A&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content&lt;/strong&gt;: IP publik Raspberry Pi  # &amp;lt;-- ganti sesuai IP server&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Proxy status&lt;/strong&gt;: Proxied / DNS only&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Port forwarding di router (kalau ada):&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Port 80 → Raspberry Pi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Port 443 → Raspberry Pi&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Kelebihan:&lt;/strong&gt; Cepat, langsung, bisa pakai Nginx &amp;amp; SSL&lt;br&gt;
&lt;strong&gt;Kekurangan:&lt;/strong&gt; Kalau IP publik berubah (dynamic IP), subdomain putus&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Opsi 2 – Pakai Cloudflare Tunnel (Argo Tunnel)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Cocok kalau server &lt;strong&gt;IP dinamis&lt;/strong&gt; atau di belakang NAT.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install &lt;code&gt;cloudflared&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;curl &lt;span class="nt"&gt;-y&lt;/span&gt;
curl &lt;span class="nt"&gt;-L&lt;/span&gt; https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64.deb &lt;span class="nt"&gt;-o&lt;/span&gt; cloudflared.deb
&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg &lt;span class="nt"&gt;-i&lt;/span&gt; cloudflared.deb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Login &amp;amp; buat tunnel:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudflared tunnel login
cloudflared tunnel create project-tunnel   &lt;span class="c"&gt;# &amp;lt;-- ganti nama tunnel sesuai project&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Hubungkan subdomain:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudflared tunnel route dns project.example.com project-tunnel   &lt;span class="c"&gt;# &amp;lt;-- ganti domain/subdomain&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Jalankan tunnel:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudflared tunnel run project-tunnel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Kelebihan:&lt;/strong&gt; Tidak perlu port forwarding, aman, HTTPS otomatis&lt;br&gt;
&lt;strong&gt;Kekurangan:&lt;/strong&gt; Harus jalankan tunnel di background atau sebagai systemd service&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Tips:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bisa buat systemd service untuk tunnel supaya otomatis jalan tiap boot&lt;/li&gt;
&lt;li&gt;Pastikan subdomain sudah terpropagasi di DNS sebelum menjalankan tunnel&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;p&gt;Biar &lt;strong&gt;cloudflared tunnel&lt;/strong&gt; jalan otomatis TANPA kamu harus ngetik:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cloudflared tunnel run project-tunnel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setiap kali boot Raspberry Pi, kamu &lt;strong&gt;harus bikin service systemd&lt;/strong&gt; khusus untuk Cloudflare Tunnel.&lt;/p&gt;

&lt;p&gt;Langsung aja—ini cara paling rapi &amp;amp; benar:&lt;/p&gt;




&lt;h1&gt;
  
  
  ✅ &lt;strong&gt;1. Buat file service systemd&lt;/strong&gt;
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;vim /etc/systemd/system/cloudflared.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isi file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[Unit]&lt;/span&gt;
&lt;span class="py"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Cloudflare Tunnel&lt;/span&gt;
&lt;span class="py"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network-online.target&lt;/span&gt;
&lt;span class="py"&gt;Wants&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network-online.target&lt;/span&gt;

&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;User&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;pi&lt;/span&gt;
&lt;span class="py"&gt;Group&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;pi&lt;/span&gt;
&lt;span class="py"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/cloudflared tunnel run project-tunnel&lt;/span&gt;
&lt;span class="py"&gt;Restart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;
&lt;span class="py"&gt;RestartSec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;5&lt;/span&gt;

&lt;span class="nn"&gt;[Install]&lt;/span&gt;
&lt;span class="py"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Catatan penting:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;project-tunnel&lt;/code&gt; → sesuaikan dengan nama tunnel kamu
cek dengan:&lt;/li&gt;
&lt;/ul&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;  cloudflared tunnel list
&lt;/code&gt;&lt;/pre&gt;


&lt;ul&gt;
&lt;li&gt;Lokasi &lt;code&gt;cloudflared&lt;/code&gt; biasanya &lt;code&gt;/usr/bin/cloudflared&lt;/code&gt;.
Cek dengan:&lt;/li&gt;
&lt;/ul&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;  which cloudflared
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  ✅ &lt;strong&gt;2. Reload systemd dan aktifkan service&lt;/strong&gt;
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;cloudflared
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start cloudflared
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status cloudflared
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kalau tampilannya &lt;strong&gt;active (running)&lt;/strong&gt; berarti sukses.&lt;/p&gt;




&lt;h1&gt;
  
  
  📌 &lt;strong&gt;3. Cek apakah tunnel sudah jalan&lt;/strong&gt;
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudflared tunnel list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Harusnya status-nya &lt;strong&gt;HEALTHY&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  🎉 Setelah ini:
&lt;/h1&gt;

&lt;p&gt;✔ Cloudflare Tunnel otomatis hidup setelah reboot&lt;br&gt;
✔ Kamu &lt;strong&gt;tidak perlu&lt;/strong&gt; manual run lagi&lt;br&gt;
✔ Website aman tanpa port forwarding&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Selesai!&lt;/strong&gt;&lt;br&gt;
Website kamu sekarang online di subdomain, dan service FastAPI + Gunicorn berjalan otomatis tiap boot.&lt;/p&gt;

</description>
      <category>raspberrypi</category>
      <category>serverless</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>🚀 Multichain Crypto API — Full Endpoint Overview</title>
      <dc:creator>Zaenal Arifin </dc:creator>
      <pubDate>Wed, 10 Dec 2025 04:57:09 +0000</pubDate>
      <link>https://dev.to/1amkaizen/multichain-crypto-api-full-endpoint-overview-436</link>
      <guid>https://dev.to/1amkaizen/multichain-crypto-api-full-endpoint-overview-436</guid>
      <description>&lt;p&gt;The &lt;strong&gt;Multichain Crypto API&lt;/strong&gt; is a powerful, developer-friendly solution that allows you to easily interact with multiple blockchains without running your own nodes. With ready-to-use endpoints, you can &lt;strong&gt;check wallet balances&lt;/strong&gt;, &lt;strong&gt;send tokens across chains&lt;/strong&gt;, &lt;strong&gt;estimate gas fees&lt;/strong&gt;, &lt;strong&gt;simulate token swaps&lt;/strong&gt;, &lt;strong&gt;monitor transactions&lt;/strong&gt;, and more. Perfect for dashboards, trading bots, multi-chain wallets, and automated crypto systems. 🎉&lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;Explore &amp;amp; Subscribe:&lt;/strong&gt; &lt;a href="https://rapidapi.com/1amkaizen/api/multichain-crypto-api4" rel="noopener noreferrer"&gt;RapidAPI – Multichain Crypto API&lt;/a&gt;&lt;br&gt;
📖 &lt;strong&gt;Full Documentation:&lt;/strong&gt; &lt;a href="https://api.aigoretech.cloud/docs" rel="noopener noreferrer"&gt;API Docs&lt;/a&gt;&lt;br&gt;
🛠️ &lt;strong&gt;Interactive API Reference:&lt;/strong&gt; &lt;a href="https://api.aigoretech.cloud/redoc" rel="noopener noreferrer"&gt;Redoc / Swagger UI&lt;/a&gt;  &lt;/p&gt;


&lt;h2&gt;
  
  
  🔧 API Setup
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Base URL:&lt;/strong&gt; &lt;code&gt;https://multichain-crypto-api4.p.rapidapi.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication:&lt;/strong&gt; RapidAPI Key (&lt;code&gt;X-RapidAPI-Key&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supported chains:&lt;/strong&gt; Solana, Ethereum, BSC, TRON, Polygon, Base, and more&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supported tokens:&lt;/strong&gt; See full list at &lt;a href="https://multichain-crypto-api4.p.rapidapi.com/api/v1/crypto/tokens" rel="noopener noreferrer"&gt;&lt;code&gt;/api/v1/crypto/tokens&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pro Tip:&lt;/strong&gt; Use the &lt;code&gt;/api/v1/crypto/tokens&lt;/code&gt; endpoint to dynamically fetch supported tokens for your dashboard or trading bot.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  📚 Endpoints Overview
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/v1/crypto/ping&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;Ping the API to check if it’s alive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/v1/crypto/send/native&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;Send native tokens (SOL, ETH, BNB, TRON, MATIC, BASE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/v1/crypto/send/usdc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;Send USDC tokens across supported chains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/v1/crypto/send/usdt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;Send USDT tokens across supported chains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/v1/crypto/balance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;Get wallet balance for a specific chain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/v1/crypto/price&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;Get the current price of a token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/v1/crypto/estimate-gas&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;Estimate gas fee for transactions on EVM chains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/v1/crypto/tokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;List all tokens supported by the API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/v1/crypto/swap/simulasi&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;Simulate token swaps to check expected output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/v1/crypto/token_info&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;Get metadata for a token (name, symbol, decimals, contract address)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/v1/crypto/tx_status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;Check status of a transaction by its hash&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;SEO Tip:&lt;/strong&gt; Each endpoint name and description includes target keywords like &lt;code&gt;send tokens&lt;/code&gt;, &lt;code&gt;check wallet balance&lt;/code&gt;, &lt;code&gt;estimate gas&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  📚 Available Endpoints with CURL Examples &amp;amp; Quick Tutorials
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1️⃣ Ping API
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GET&lt;/strong&gt; &lt;code&gt;/api/v1/crypto/ping&lt;/code&gt;&lt;br&gt;
&lt;em&gt;Check if the API is running and responsive.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Replace &lt;code&gt;&amp;lt;YOUR_API_KEY&amp;gt;&lt;/code&gt; with your RapidAPI Key. All curl examples below use the same &lt;code&gt;X-RapidAPI-Key&lt;/code&gt; and &lt;code&gt;X-RapidAPI-Host&lt;/code&gt; headers.&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://multichain-crypto-api4.p.rapidapi.com/api/v1/crypto/ping"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-RapidAPI-Key: &amp;lt;YOUR_API_KEY&amp;gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-RapidAPI-Host: multichain-crypto-api4.p.rapidapi.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"API is alive"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2️⃣ Send Native Token (SOL, ETH, BNB, TRON, MATIC, BASE)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;POST&lt;/strong&gt; &lt;code&gt;/api/v1/crypto/send/native&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace &lt;code&gt;&amp;lt;YOUR_API_KEY&amp;gt;&lt;/code&gt; with your RapidAPI Key.&lt;/li&gt;
&lt;li&gt;All curl examples use the same &lt;code&gt;X-RapidAPI-Key&lt;/code&gt; and &lt;code&gt;X-RapidAPI-Host&lt;/code&gt; headers.&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;&amp;lt;PRIVATE_KEY&amp;gt;&lt;/code&gt; with your wallet private key.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--request&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--url&lt;/span&gt; &lt;span class="s1"&gt;'https://multichain-crypto-api4.p.rapidapi.com/api/v1/crypto/send/native?token=&amp;lt;TOKEN&amp;gt;&amp;amp;destination_wallet=&amp;lt;DESTINATION_WALLET&amp;gt;&amp;amp;amount=&amp;lt;AMOUNT&amp;gt;&amp;amp;rpc_url=&amp;lt;RPC_URL&amp;gt;&amp;amp;private_key=&amp;lt;PRIVATE_KEY&amp;gt;'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'x-rapidapi-host: multichain-crypto-api4.p.rapidapi.com'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'x-rapidapi-key: &amp;lt;YOUR_API_KEY&amp;gt;'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Use case:&lt;/strong&gt; Send 1 SOL from your admin wallet to any Solana wallet in Devnet or Mainnet without running your own node.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  3️⃣ Send USDC or USDT
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;POST&lt;/strong&gt; &lt;code&gt;/api/v1/crypto/send/usdc&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;POST&lt;/strong&gt; &lt;code&gt;/api/v1/crypto/send/usdt&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace &lt;code&gt;&amp;lt;YOUR_API_KEY&amp;gt;&lt;/code&gt; with your RapidAPI Key.&lt;/li&gt;
&lt;li&gt;All curl examples use the same &lt;code&gt;X-RapidAPI-Key&lt;/code&gt; and &lt;code&gt;X-RapidAPI-Host&lt;/code&gt; headers.&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;&amp;lt;PRIVATE_KEY&amp;gt;&lt;/code&gt; with your wallet private key.&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;&amp;lt;TOKEN_ADDRESS&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;CHAIN&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;AMOUNT&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;DESTINATION_WALLET&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;RPC_URL&amp;gt;&lt;/code&gt; with your values.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--request&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--url&lt;/span&gt; &lt;span class="s1"&gt;'https://multichain-crypto-api4.p.rapidapi.com/api/v1/crypto/send/usdc?private_key=&amp;lt;PRIVATE_KEY&amp;gt;&amp;amp;rpc_url=&amp;lt;RPC_URL&amp;gt;&amp;amp;token_address=&amp;lt;TOKEN_ADDRESS&amp;gt;&amp;amp;chain=&amp;lt;CHAIN&amp;gt;&amp;amp;amount=&amp;lt;AMOUNT&amp;gt;&amp;amp;destination_wallet=&amp;lt;DESTINATION_WALLET&amp;gt;'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'x-rapidapi-host: multichain-crypto-api4.p.rapidapi.com'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'x-rapidapi-key: &amp;lt;YOUR_API_KEY&amp;gt;'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Use case:&lt;/strong&gt; Send USDC across Ethereum, BSC, Polygon, or Base chains. Perfect for multi-chain wallets or dashboards.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  4️⃣ Get Wallet Balance
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GET&lt;/strong&gt; &lt;code&gt;/api/v1/crypto/balance&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace &lt;code&gt;&amp;lt;YOUR_API_KEY&amp;gt;&lt;/code&gt; with your RapidAPI Key.&lt;/li&gt;
&lt;li&gt;All curl examples use the same &lt;code&gt;X-RapidAPI-Key&lt;/code&gt; and &lt;code&gt;X-RapidAPI-Host&lt;/code&gt; headers.&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;&amp;lt;CHAIN&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;WALLET_ADDRESS&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;RPC_URL&amp;gt;&lt;/code&gt; with your values.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--request&lt;/span&gt; GET &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--url&lt;/span&gt; &lt;span class="s1"&gt;'https://multichain-crypto-api4.p.rapidapi.com/api/v1/crypto/balance?chain=&amp;lt;CHAIN&amp;gt;&amp;amp;wallet=&amp;lt;WALLET_ADDRESS&amp;gt;&amp;amp;rpc_url=&amp;lt;RPC_URL&amp;gt;'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'x-rapidapi-host: multichain-crypto-api4.p.rapidapi.com'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'x-rapidapi-key: &amp;lt;YOUR_API_KEY&amp;gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Example JSON response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"chain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sol"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"wallet"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;WALLET_ADDRESS&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"balance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;10.5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Combine this with webhooks to monitor wallet balances in real-time.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  5️⃣ Get Token Price
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GET&lt;/strong&gt; &lt;code&gt;/api/v1/crypto/price&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace &lt;code&gt;&amp;lt;YOUR_API_KEY&amp;gt;&lt;/code&gt; with your RapidAPI Key.&lt;/li&gt;
&lt;li&gt;All curl examples use the same &lt;code&gt;X-RapidAPI-Key&lt;/code&gt; and &lt;code&gt;X-RapidAPI-Host&lt;/code&gt; headers.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--request&lt;/span&gt; GET &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--url&lt;/span&gt; https://multichain-crypto-api4.p.rapidapi.com/api/v1/crypto/price &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'x-rapidapi-host: multichain-crypto-api4.p.rapidapi.com'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'x-rapidapi-key: &amp;lt;YOUR_API_KEY&amp;gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Perfect for building live dashboards showing token prices across multiple chains.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  6️⃣ Estimate Gas Fee
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GET&lt;/strong&gt; &lt;code&gt;/api/v1/crypto/estimate-gas&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace &lt;code&gt;&amp;lt;YOUR_API_KEY&amp;gt;&lt;/code&gt; with your RapidAPI Key.&lt;/li&gt;
&lt;li&gt;All curl examples use the same &lt;code&gt;X-RapidAPI-Key&lt;/code&gt; and &lt;code&gt;X-RapidAPI-Host&lt;/code&gt; headers.&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;&amp;lt;CHAIN&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;TOKEN&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;AMOUNT&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;WALLET_ADDRESS&amp;gt;&lt;/code&gt; with your values.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--request&lt;/span&gt; GET &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--url&lt;/span&gt; &lt;span class="s1"&gt;'https://multichain-crypto-api4.p.rapidapi.com/api/v1/crypto/estimate-gas?chain=&amp;lt;CHAIN&amp;gt;&amp;amp;token=&amp;lt;TOKEN&amp;gt;&amp;amp;amount=&amp;lt;AMOUNT&amp;gt;&amp;amp;destination_wallet=&amp;lt;WALLET_ADDRESS&amp;gt;'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'x-rapidapi-host: multichain-crypto-api4.p.rapidapi.com'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'x-rapidapi-key: &amp;lt;YOUR_API_KEY&amp;gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Use this to calculate the approximate fee before sending a transaction. Helps prevent failed transfers due to insufficient gas.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  7️⃣ Get Supported Tokens
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GET&lt;/strong&gt; &lt;code&gt;/api/v1/crypto/tokens&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace &lt;code&gt;&amp;lt;YOUR_API_KEY&amp;gt;&lt;/code&gt; with your RapidAPI Key.&lt;/li&gt;
&lt;li&gt;All curl examples use the same &lt;code&gt;X-RapidAPI-Key&lt;/code&gt; and &lt;code&gt;X-RapidAPI-Host&lt;/code&gt; headers.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--request&lt;/span&gt; GET &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--url&lt;/span&gt; https://multichain-crypto-api4.p.rapidapi.com/api/v1/crypto/tokens &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'x-rapidapi-host: multichain-crypto-api4.p.rapidapi.com'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'x-rapidapi-key: &amp;lt;YOUR_API_KEY&amp;gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; This endpoint is important for dynamic frontends or dashboards to list all supported tokens across Solana, Ethereum, BSC, TRON, Polygon, Base, and more.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  8️⃣ Simulate Token Swap
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;POST&lt;/strong&gt; &lt;code&gt;/api/v1/crypto/swap/simulasi&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace &lt;code&gt;&amp;lt;YOUR_API_KEY&amp;gt;&lt;/code&gt; with your RapidAPI Key.&lt;/li&gt;
&lt;li&gt;All curl examples use the same &lt;code&gt;X-RapidAPI-Key&lt;/code&gt; and &lt;code&gt;X-RapidAPI-Host&lt;/code&gt; headers.&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;&amp;lt;FROM_TOKEN&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;TO_TOKEN&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;AMOUNT&amp;gt;&lt;/code&gt; with your values.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--request&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--url&lt;/span&gt; &lt;span class="s1"&gt;'https://multichain-crypto-api4.p.rapidapi.com/api/v1/crypto/swap/simulasi?from_token=&amp;lt;FROM_TOKEN&amp;gt;&amp;amp;to_token=&amp;lt;TO_TOKEN&amp;gt;&amp;amp;amount=&amp;lt;AMOUNT&amp;gt;'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'x-rapidapi-host: multichain-crypto-api4.p.rapidapi.com'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'x-rapidapi-key: &amp;lt;YOUR_API_KEY&amp;gt;'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Simulate swaps before executing real transactions to prevent slippage or unexpected token conversion rates.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  9️⃣ Get Token Metadata
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GET&lt;/strong&gt; &lt;code&gt;/api/v1/crypto/token_info&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace &lt;code&gt;&amp;lt;YOUR_API_KEY&amp;gt;&lt;/code&gt; with your RapidAPI Key.&lt;/li&gt;
&lt;li&gt;All curl examples use the same &lt;code&gt;X-RapidAPI-Key&lt;/code&gt; and &lt;code&gt;X-RapidAPI-Host&lt;/code&gt; headers.&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;token=sol&lt;/code&gt; with the token you want metadata for.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--request&lt;/span&gt; GET &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--url&lt;/span&gt; &lt;span class="s1"&gt;'https://multichain-crypto-api4.p.rapidapi.com/api/v1/crypto/token_info?token=sol'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'x-rapidapi-host: multichain-crypto-api4.p.rapidapi.com'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'x-rapidapi-key: &amp;lt;YOUR_API_KEY&amp;gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Retrieve token name, symbol, decimals, and contract address programmatically.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🔟 Get Transaction Status
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GET&lt;/strong&gt; &lt;code&gt;/api/v1/crypto/tx_status&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace &lt;code&gt;&amp;lt;YOUR_API_KEY&amp;gt;&lt;/code&gt; with your RapidAPI Key.&lt;/li&gt;
&lt;li&gt;All curl examples use the same &lt;code&gt;X-RapidAPI-Key&lt;/code&gt; and &lt;code&gt;X-RapidAPI-Host&lt;/code&gt; headers.&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;&amp;lt;TX_HASH&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;CHAIN&amp;gt;&lt;/code&gt; with your transaction hash and the corresponding chain.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--request&lt;/span&gt; GET &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--url&lt;/span&gt; &lt;span class="s1"&gt;'https://multichain-crypto-api4.p.rapidapi.com/api/v1/crypto/tx_status?tx_hash=&amp;lt;TX_HASH&amp;gt;&amp;amp;chain=&amp;lt;CHAIN&amp;gt;'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'x-rapidapi-host: multichain-crypto-api4.p.rapidapi.com'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'x-rapidapi-key: &amp;lt;YOUR_API_KEY&amp;gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Monitor the confirmation status of your transactions across chains.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔗 Why Use Multichain Crypto API?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Multi-chain support: Solana, Ethereum, BSC, TRON, Polygon, Base, etc.&lt;/li&gt;
&lt;li&gt;Unified endpoints for wallets, tokens, and transactions&lt;/li&gt;
&lt;li&gt;No need to run your own blockchain nodes&lt;/li&gt;
&lt;li&gt;Ready for async automation, trading bots, and dashboards&lt;/li&gt;
&lt;li&gt;Fast, developer-friendly, and production-ready&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO optimized:&lt;/strong&gt; endpoints, keywords, and example JSON snippets help with search visibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 &lt;strong&gt;Pro Tip:&lt;/strong&gt; Combine this API with &lt;strong&gt;webhooks or monitoring scripts&lt;/strong&gt; to get &lt;strong&gt;real-time updates&lt;/strong&gt; for wallets and transactions.&lt;/p&gt;

&lt;p&gt;📄 &lt;strong&gt;Full Documentation:&lt;/strong&gt; &lt;a href="https://api.aigoretech.cloud/docs" rel="noopener noreferrer"&gt;API Docs&lt;/a&gt;&lt;br&gt;
🧩 &lt;strong&gt;Interactive API Reference:&lt;/strong&gt; &lt;a href="https://api.aigoretech.cloud/redoc" rel="noopener noreferrer"&gt;Redoc / Swagger UI&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Explore all endpoints and subscribe here:&lt;/strong&gt; &lt;a href="https://rapidapi.com/1amkaizen/api/multichain-crypto-api4" rel="noopener noreferrer"&gt;RapidAPI – Multichain Crypto API&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>fastapi</category>
      <category>cryptocurrency</category>
      <category>api</category>
    </item>
    <item>
      <title>How to Send Native Crypto Tokens Across Multiple Blockchains Using FastAPI API</title>
      <dc:creator>Zaenal Arifin </dc:creator>
      <pubDate>Mon, 08 Dec 2025 03:52:39 +0000</pubDate>
      <link>https://dev.to/1amkaizen/how-to-send-native-crypto-tokens-across-multiple-blockchains-using-fastapi-api-18cj</link>
      <guid>https://dev.to/1amkaizen/how-to-send-native-crypto-tokens-across-multiple-blockchains-using-fastapi-api-18cj</guid>
      <description>&lt;p&gt;Sending native crypto tokens like &lt;strong&gt;SOL, ETH, BNB, or BASE&lt;/strong&gt; programmatically can be challenging, especially when you need to handle &lt;strong&gt;transaction signing, network RPC, and error handling&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Crypto API Service&lt;/strong&gt; provides a simple solution via its FastAPI endpoints. In this article, we’ll guide you through sending native tokens using the &lt;code&gt;/send/native&lt;/code&gt; endpoint with a &lt;strong&gt;Python async example&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1️⃣ Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.11+&lt;/li&gt;
&lt;li&gt;Install dependencies:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;httpx asyncio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;RapidAPI key (subscribe to the Crypto API Service)&lt;/li&gt;
&lt;li&gt;Sender wallet private key (for demo; &lt;strong&gt;never expose mainnet keys publicly&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Destination wallet address&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2️⃣ Understanding the &lt;code&gt;/send/native&lt;/code&gt; Endpoint
&lt;/h2&gt;

&lt;p&gt;The endpoint &lt;code&gt;/send/native&lt;/code&gt; allows you to send native blockchain tokens:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Required parameters:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;token&lt;/code&gt;: Token symbol (&lt;code&gt;SOL&lt;/code&gt;, &lt;code&gt;ETH&lt;/code&gt;, &lt;code&gt;BNB&lt;/code&gt;, &lt;code&gt;BASE&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;destination_wallet&lt;/code&gt;: Recipient address&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;amount&lt;/code&gt;: Amount to send&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rpc_url&lt;/code&gt;: Optional custom RPC URL&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;private_key&lt;/code&gt;: Optional private key for signing the transaction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tx_hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"5NfL1yS5kJjKx9rR4v8Q7P1M2Zq3vT6Y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SOL successfully sent"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3️⃣ Example Python Script
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;send_native.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# send_native.py
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;

&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;API_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://multichain-crypto-api4.p.rapidapi.com/api/v1/crypto/send/native&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_RAPIDAPI_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# replace with your RapidAPI key
&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;send_native_token&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;destination_wallet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rpc_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;private_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Send native token via Crypto API&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;AsyncClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Amount must be greater than 0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🚀 Sending &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;destination_wallet&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;API_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;destination_wallet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;destination_wallet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;amount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rpc_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rpc_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;private_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;private_key&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-RapidAPI-Key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;success&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Transaction failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

            &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✅ Transaction successful: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;❌ Failed to send token: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exc_info&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SOL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;destination_wallet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YourDestinationWalletAddress&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.01&lt;/span&gt;
    &lt;span class="n"&gt;rpc_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.devnet.solana.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# optional, can use default
&lt;/span&gt;    &lt;span class="n"&gt;private_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_PRIVATE_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;           &lt;span class="c1"&gt;# optional, can be None if using API signing
&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;send_native_token&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;destination_wallet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rpc_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;private_key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Transaction Hash: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tx_hash&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Status: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Message: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4️⃣ Example Output
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tx_hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"5NfL1yS5kJjKx9rR4v8Q7P1M2Zq3vT6Y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SOL successfully sent"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Console output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Transaction Hash: 5NfL1yS5kJjKx9rR4v8Q7P1M2Zq3vT6Y
Status: success
Message: SOL successfully sent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5️⃣ How to Run
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Save script as &lt;code&gt;send_native.py&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;YOUR_RAPIDAPI_KEY&lt;/code&gt; and &lt;code&gt;YOUR_PRIVATE_KEY&lt;/code&gt; (if needed)&lt;/li&gt;
&lt;li&gt;Set token, destination wallet, and amount&lt;/li&gt;
&lt;li&gt;Run:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python send_native.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Check console for transaction hash and status&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  6️⃣ Tips for Safe Token Transfers
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Never commit private keys&lt;/strong&gt; to version control. Use environment variables or secure vaults.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test on devnet/testnet&lt;/strong&gt; first before sending mainnet tokens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log all responses&lt;/strong&gt; for debugging and auditing purposes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handle exceptions gracefully&lt;/strong&gt; to avoid lost transactions or crashes.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  7️⃣ Closing
&lt;/h2&gt;

&lt;p&gt;Using the &lt;code&gt;/send/native&lt;/code&gt; endpoint, you can &lt;strong&gt;send SOL, ETH, BNB, or BASE tokens easily&lt;/strong&gt; without handling low-level blockchain operations. This is ideal for &lt;strong&gt;wallet apps, bots, and automated payment systems&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To explore more, you can combine this with &lt;strong&gt;balance checking&lt;/strong&gt; or &lt;strong&gt;transaction status monitoring&lt;/strong&gt; endpoints from the &lt;strong&gt;Crypto API Service on RapidAPI&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>python</category>
      <category>cryptocurrency</category>
      <category>fastapi</category>
    </item>
    <item>
      <title>How to Track Ethereum Transaction Status with FastAPI API</title>
      <dc:creator>Zaenal Arifin </dc:creator>
      <pubDate>Mon, 08 Dec 2025 03:49:35 +0000</pubDate>
      <link>https://dev.to/1amkaizen/how-to-track-ethereum-transaction-status-with-fastapi-api-d7l</link>
      <guid>https://dev.to/1amkaizen/how-to-track-ethereum-transaction-status-with-fastapi-api-d7l</guid>
      <description>&lt;p&gt;Tracking Ethereum transaction status can be tricky, especially when you want &lt;strong&gt;reliable, real-time updates&lt;/strong&gt;. Using the &lt;strong&gt;Crypto API Service&lt;/strong&gt;, you can easily check if a transaction is pending, confirmed, or failed.&lt;/p&gt;

&lt;p&gt;In this tutorial, we’ll create a &lt;strong&gt;Python async script&lt;/strong&gt; to query the transaction status of an Ethereum transaction using the API.&lt;/p&gt;




&lt;h2&gt;
  
  
  1️⃣ Setup
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.11+&lt;/li&gt;
&lt;li&gt;Install dependencies:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;httpx asyncio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;RapidAPI key (subscribe to Crypto API Service)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2️⃣ Example Python Script
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;check_eth_tx.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# check_eth_tx.py
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;

&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;API_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hhttps://multichain-crypto-api4.p.rapidapi.com/api/v1/crypto/tx_status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_RAPIDAPI_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# replace with your RapidAPI key
&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_tx_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tx_hash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Async function to fetch Ethereum transaction status&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;AsyncClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;API_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chain&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;eth&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tx_hash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tx_hash&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-RapidAPI-Key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Transaction data: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HTTPError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Failed to fetch transaction: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;tx_hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0x123abc...your_tx_hash_here&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;tx_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;get_tx_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tx_hash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tx_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Transaction Hash: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tx_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tx_hash&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Status: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tx_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Message: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tx_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3️⃣ Example Output
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"confirmed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tx_hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x123abc...your_tx_hash_here"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Transaction successfully processed"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Console output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Transaction Hash: 0x123abc...your_tx_hash_here
Status: confirmed
Message: Transaction successfully processed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4️⃣ How to Run
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Save script as &lt;code&gt;check_eth_tx.py&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;YOUR_RAPIDAPI_KEY&lt;/code&gt; with your RapidAPI key&lt;/li&gt;
&lt;li&gt;Run:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python check_eth_tx.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Check console to see the status of your Ethereum transaction&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  5️⃣ Closing
&lt;/h2&gt;

&lt;p&gt;With this script, you can &lt;strong&gt;quickly check Ethereum transaction status&lt;/strong&gt; without running your own node or relying on multiple providers.&lt;/p&gt;

&lt;p&gt;This is perfect for &lt;strong&gt;wallets, dApps, or monitoring tools&lt;/strong&gt;. Explore more endpoints like balance or token transfers using the &lt;strong&gt;Crypto API Service on RapidAPI&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Suggested Tags
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python, fastapi, crypto, ethereum, api, tutorial
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>python</category>
      <category>fastapi</category>
      <category>cryptocurrency</category>
      <category>webdev</category>
    </item>
    <item>
      <title>💰 How to Easily Check Multi-Chain Crypto Wallet Balances with Multichain Crypto API</title>
      <dc:creator>Zaenal Arifin </dc:creator>
      <pubDate>Mon, 08 Dec 2025 03:48:20 +0000</pubDate>
      <link>https://dev.to/1amkaizen/how-to-easily-check-multi-chain-crypto-wallet-balances-with-fastapi-api-25lo</link>
      <guid>https://dev.to/1amkaizen/how-to-easily-check-multi-chain-crypto-wallet-balances-with-fastapi-api-25lo</guid>
      <description>&lt;p&gt;💰 &lt;strong&gt;How to Easily Check Multi-Chain Crypto Wallet Balances with Multichain Crypto API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Crypto developers often face challenges when checking wallet balances or transaction statuses across multiple blockchains. Doing it manually can be tedious, especially if you need to support &lt;strong&gt;Solana, Ethereum, BSC, Polygon, TRON, or Base&lt;/strong&gt; at the same time.&lt;/p&gt;

&lt;p&gt;Fortunately, the &lt;strong&gt;Multichain Crypto API&lt;/strong&gt; 🎉 allows developers to directly query blockchain data via ready-to-use API endpoints, without running nodes themselves.&lt;/p&gt;




&lt;h3&gt;
  
  
  🛠️ Setup
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.11+&lt;/li&gt;
&lt;li&gt;Install dependencies:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;httpx asyncio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;RapidAPI key (sign up and subscribe to &lt;a href="https://rapidapi.com/1amkaizen/api/multichain-crypto-api4/playground/apiendpoint_75f020bb-6878-4eb0-9a64-c1e3a27d40b5" rel="noopener noreferrer"&gt;Multichain Crypto API&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ⚡ Python Async Example
&lt;/h3&gt;

&lt;p&gt;Create a file called &lt;code&gt;check_balance.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;

&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;API_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://multichain-crypto-api4.p.rapidapi.com/api/v1/crypto/balance&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_RAPIDAPI_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_balance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;AsyncClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;API_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chain&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wallet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-RapidAPI-Key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Balance data: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HTTPError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Failed to fetch data: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;chain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sol&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;wallet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BnwKsYcEYMCZBTdgTQ8NE3QT79Yj&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;balance_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;get_balance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;balance_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Wallet: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;balance_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;wallet&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Chain: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;balance_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;chain&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Balance: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;balance_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;balance&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🖥️ CURL Example
&lt;/h3&gt;

&lt;p&gt;Quick test without Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://multichain-crypto-api4.p.rapidapi.com/api/v1/crypto/balance?rpc_url=https://api.devnet.solana.com&amp;amp;chain=sol&amp;amp;wallet=BnwKsYcEYMCZBTdgTQ8NE3QT79YjzzBdjevPQFKvd4B5"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-RapidAPI-Key: YOUR_RAPIDAPI_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-RapidAPI-Host: multichain-crypto-api4.p.rapidapi.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Notes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace &lt;code&gt;YOUR_RAPIDAPI_KEY&lt;/code&gt; with your key&lt;/li&gt;
&lt;li&gt;Use testnet wallet for safety&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  📊 Sample Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"chain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sol"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"wallet"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BnwKsYcEYMCZBTdgTQ8NE3QT79Yj"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"balance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;12.345&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Console output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Wallet: BnwKsYcEYMCZBTdgTQ8NE3QT79Yj
Chain: sol
Balance: 12.345
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ▶️ How to Run
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Save the script as &lt;code&gt;check_balance.py&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;YOUR_RAPIDAPI_KEY&lt;/code&gt; with your RapidAPI key&lt;/li&gt;
&lt;li&gt;Run:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python check_balance.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;See the wallet balance printed on the console&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  🔗 Explore More Endpoints
&lt;/h3&gt;

&lt;p&gt;Check out the &lt;strong&gt;&lt;a href="https://rapidapi.com/1amkaizen/api/multichain-crypto-api4/playground/apiendpoint_75f020bb-6878-4eb0-9a64-c1e3a27d40b5" rel="noopener noreferrer"&gt;Multichain Crypto API on RapidAPI&lt;/a&gt;&lt;/strong&gt; for more endpoints and integrations.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Pro Tip:&lt;/strong&gt; Combine this API with webhooks or alert systems for real-time balance notifications — perfect for traders or devs needing instant data.&lt;/p&gt;

</description>
      <category>fastapi</category>
      <category>cryptocurrency</category>
      <category>python</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Install DVWS (Damn Vulnerable Web Services) on Nginx</title>
      <dc:creator>Zaenal Arifin </dc:creator>
      <pubDate>Sat, 01 Nov 2025 05:38:31 +0000</pubDate>
      <link>https://dev.to/1amkaizen/how-to-install-dvws-damn-vulnerable-web-services-on-nginx-5110</link>
      <guid>https://dev.to/1amkaizen/how-to-install-dvws-damn-vulnerable-web-services-on-nginx-5110</guid>
      <description>&lt;p&gt;DVWS (Damn Vulnerable Web Services) is a deliberately vulnerable web application for learning web and API penetration testing. Below is a complete, improved step-by-step guide to install DVWS on an &lt;strong&gt;Ubuntu + Nginx&lt;/strong&gt; server plus important production safety notes and alternatives.&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Prerequisites&lt;/li&gt;
&lt;li&gt;Step 1 — Update &amp;amp; install packages&lt;/li&gt;
&lt;li&gt;Step 2 — Install PHP-FPM and required PHP extensions&lt;/li&gt;
&lt;li&gt;Step 3 — Create Nginx site configuration for DVWS&lt;/li&gt;
&lt;li&gt;Step 4 — Enable site &amp;amp; test configuration&lt;/li&gt;
&lt;li&gt;Step 5 — Download DVWS and set permissions&lt;/li&gt;
&lt;li&gt;Step 6 — Verify in browser&lt;/li&gt;
&lt;li&gt;Extra recommendations &amp;amp; missing pieces added&lt;/li&gt;
&lt;li&gt;Quick Docker alternative&lt;/li&gt;
&lt;li&gt;Final security &amp;amp; ethical notes&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A server running Ubuntu (the commands below assume Debian/Ubuntu).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo&lt;/code&gt; privileges.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Nginx&lt;/code&gt; not already serving a conflicting site on port 80 (or use alternate port).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Important:&lt;/strong&gt; DVWS is intentionally insecure — &lt;strong&gt;do not&lt;/strong&gt; expose it to the public Internet without containment (use private network, VPN, or local VM).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1 — Update &amp;amp; install base packages
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;

&lt;span class="c"&gt;# install nginx, git, unzip (if needed)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nginx git unzip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2 — Install PHP-FPM and common PHP extensions
&lt;/h2&gt;

&lt;p&gt;DVWS is PHP based. Install PHP-FPM and common extensions that web apps often need. Adjust PHP version (7.4, 8.0, 8.1) to your system.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# contoh: install PHP 8.1 (ubah versi jika perlu)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; php8.1-fpm php8.1-cli php8.1-mbstring php8.1-xml php8.1-curl php8.1-zip php8.1-mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Verify PHP-FPM socket path (you'll need this for Nginx config):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; /run/php
&lt;span class="c"&gt;# contoh output: php8.1-fpm.sock&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you use a different PHP version, update the socket path in Nginx config accordingly (e.g. &lt;code&gt;/run/php/php7.4-fpm.sock&lt;/code&gt; or &lt;code&gt;/run/php/php8.1-fpm.sock&lt;/code&gt;).&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3 — Configure Nginx for DVWS
&lt;/h2&gt;

&lt;p&gt;Create a new site config (use &lt;code&gt;vim&lt;/code&gt; if you edit). Example path: &lt;code&gt;/etc/nginx/sites-available/dvws&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;vim /etc/nginx/sites-available/dvws
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste this (adjust &lt;code&gt;server_name&lt;/code&gt; and &lt;code&gt;root&lt;/code&gt; to match your environment):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;your_domain_or_ip&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;# ganti dengan domain atau IP&lt;/span&gt;

    &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="n"&gt;/var/www/html/DVWS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;index&lt;/span&gt; &lt;span class="s"&gt;index.php&lt;/span&gt; &lt;span class="s"&gt;index.html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;# Serves static files or falls back to index.php&lt;/span&gt;
    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;try_files&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt;&lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="n"&gt;/index.php?&lt;/span&gt;&lt;span class="nv"&gt;$args&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# PHP processing&lt;/span&gt;
    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt; &lt;span class="sr"&gt;\.php$&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;include&lt;/span&gt; &lt;span class="nc"&gt;snippets/fastcgi-php&lt;/span&gt;&lt;span class="s"&gt;.conf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="c1"&gt;# pastikan path socket sesuai versi PHP-FPM yang terpasang&lt;/span&gt;
        &lt;span class="kn"&gt;fastcgi_pass&lt;/span&gt; &lt;span class="s"&gt;unix:/run/php/php8.1-fpm.sock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;fastcgi_param&lt;/span&gt; &lt;span class="s"&gt;SCRIPT_FILENAME&lt;/span&gt; &lt;span class="nv"&gt;$document_root$fastcgi_script_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;include&lt;/span&gt; &lt;span class="s"&gt;fastcgi_params&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# Deny access to hidden files (like .env, .git)&lt;/span&gt;
    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt; &lt;span class="sr"&gt;/\.&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;deny&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# Optional: limit large uploads (if needed)&lt;/span&gt;
    &lt;span class="kn"&gt;client_max_body_size&lt;/span&gt; &lt;span class="mi"&gt;10M&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Notes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace &lt;code&gt;your_domain_or_ip&lt;/code&gt; with your server IP or domain.&lt;/li&gt;
&lt;li&gt;Check the exact php-fpm socket under &lt;code&gt;/run/php&lt;/code&gt; and update &lt;code&gt;fastcgi_pass&lt;/code&gt; accordingly.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 4 — Enable the site and test Nginx
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# create symlink&lt;/span&gt;
&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /etc/nginx/sites-available/dvws /etc/nginx/sites-enabled/

&lt;span class="c"&gt;# test nginx config&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nginx &lt;span class="nt"&gt;-t&lt;/span&gt;

&lt;span class="c"&gt;# restart nginx to apply changes&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;nginx -t&lt;/code&gt; reports errors, fix them before restarting.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5 — Download DVWS and set permissions
&lt;/h2&gt;

&lt;p&gt;Clone the DVWS repository into the configured root.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;git clone https://github.com/interference-security/DVWS.git /var/www/html/DVWS

&lt;span class="c"&gt;# set owner to www-data (nginx default user) and adjust permissions&lt;/span&gt;
&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; www-data:www-data /var/www/html/DVWS
&lt;span class="nb"&gt;sudo &lt;/span&gt;find /var/www/html/DVWS &lt;span class="nt"&gt;-type&lt;/span&gt; d &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;chmod &lt;/span&gt;755 &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;find /var/www/html/DVWS &lt;span class="nt"&gt;-type&lt;/span&gt; f &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;chmod &lt;/span&gt;644 &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If DVWS needs writable directories (e.g. uploads), make only those directories writable by the web server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; www-data:www-data /var/www/html/DVWS/uploads
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;770 /var/www/html/DVWS/uploads
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 6 — Access DVWS via browser
&lt;/h2&gt;

&lt;p&gt;Open in your browser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://your_domain_or_ip/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see the DVWS interface. If you get a 500 / PHP error, check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP-FPM service: &lt;code&gt;sudo systemctl status php8.1-fpm&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Nginx error log: &lt;code&gt;/var/log/nginx/error.log&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;PHP-FPM log: &lt;code&gt;/var/log/php8.1-fpm.log&lt;/code&gt; (path may differ)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7 — Extra recommendations &amp;amp; missing items I added
&lt;/h2&gt;

&lt;p&gt;I added several practical and security-related steps that were missing in the original text:&lt;/p&gt;

&lt;h3&gt;
  
  
  7.1 PHP extensions
&lt;/h3&gt;

&lt;p&gt;Install common PHP extensions (&lt;code&gt;mbstring&lt;/code&gt;, &lt;code&gt;xml&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;zip&lt;/code&gt;, &lt;code&gt;mysql&lt;/code&gt; etc.) — many web apps require them.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.2 Nginx &lt;code&gt;nginx -t&lt;/code&gt; validation
&lt;/h3&gt;

&lt;p&gt;Always validate Nginx config before restart.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.3 Correct PHP socket path
&lt;/h3&gt;

&lt;p&gt;Check &lt;code&gt;/run/php&lt;/code&gt; for the right socket (or use &lt;code&gt;127.0.0.1:9000&lt;/code&gt; if using TCP). Many guides forget to adjust this and PHP will fail.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.4 Minimal permissions principle
&lt;/h3&gt;

&lt;p&gt;Only make truly necessary dirs writable — avoid &lt;code&gt;777&lt;/code&gt;. Set owner to &lt;code&gt;www-data&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.5 Database / dependencies
&lt;/h3&gt;

&lt;p&gt;If DVWS requires a database (MySQL/MariaDB), install and initialize it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; mariadb-server
&lt;span class="nb"&gt;sudo &lt;/span&gt;mysql_secure_installation
&lt;span class="c"&gt;# create db/user if DVWS needs one&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read DVWS README to confirm if it requires DB setup.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.6 Firewall &amp;amp; network isolation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;ufw&lt;/code&gt; to restrict access:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; ufw
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow OpenSSH
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow &lt;span class="s1"&gt;'Nginx Full'&lt;/span&gt;   &lt;span class="c"&gt;# 80 and 443 if you enable SSL&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw &lt;span class="nb"&gt;enable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Prefer running DVWS in private network or local VM, &lt;strong&gt;not&lt;/strong&gt; exposed publicly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7.7 HTTPS (optional but recommended for realistic testing)
&lt;/h3&gt;

&lt;p&gt;For real-world simulation and secure access, enable HTTPS with Let's Encrypt (only if you intend to expose it safely):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; certbot python3-certbot-nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot &lt;span class="nt"&gt;--nginx&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; your_domain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For local/isolated testing, HTTPS is optional.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.8 SELinux / AppArmor considerations
&lt;/h3&gt;

&lt;p&gt;If using a distro with SELinux (CentOS/RHEL) or AppArmor restrictions, you may need to allow nginx/php-fpm access to the document root. On Ubuntu, AppArmor profiles can block access — check logs if you get permission denied.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.9 Logging &amp;amp; troubleshooting
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Nginx access/error logs: &lt;code&gt;/var/log/nginx/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;PHP-FPM logs (path depends on PHP version): check systemd journal or &lt;code&gt;/var/log/&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7.10 Use a VM or container for safety
&lt;/h3&gt;

&lt;p&gt;Because DVWS is intentionally vulnerable, run it inside:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a local VM (VirtualBox, Vagrant), or&lt;/li&gt;
&lt;li&gt;an isolated Docker container, or&lt;/li&gt;
&lt;li&gt;a private network / VPN.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  8 — Quick Docker alternative (safer &amp;amp; easier to tear down)
&lt;/h2&gt;

&lt;p&gt;If you prefer Docker (recommended for isolation), do this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Dockerfile example (very simple)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; php:8.1-fpm&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nginx git unzip
&lt;span class="c"&gt;# install additional PHP extensions as needed&lt;/span&gt;
&lt;span class="c"&gt;# copy DVWS into /var/www/html and configure nginx inside container or use separate nginx container&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or run a ready Nginx + PHP-FPM container and mount DVWS into &lt;code&gt;/var/www/html&lt;/code&gt;. Using Docker Compose with separate &lt;code&gt;nginx&lt;/code&gt; and &lt;code&gt;php-fpm&lt;/code&gt; services is common.&lt;/p&gt;




&lt;h2&gt;
  
  
  9 — Final security and ethical notes (important)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DVWS is intentionally vulnerable&lt;/strong&gt;. Use only on systems you own or have explicit permission to test.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do not&lt;/strong&gt; expose DVWS to the public Internet unless you fully isolate it (VPN, firewall, private subnet).&lt;/li&gt;
&lt;li&gt;Clean up or destroy the VM/container after testing.&lt;/li&gt;
&lt;li&gt;Use best practices when reusing any configuration in production (strict permissions, updated packages, remove sample/test apps).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  10 — Troubleshooting quick checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;sudo nginx -t&lt;/code&gt; — config syntax ok?&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;systemctl status php*-fpm&lt;/code&gt; — PHP-FPM running?&lt;/li&gt;
&lt;li&gt;Check socket: &lt;code&gt;ls /run/php/&lt;/code&gt; and match &lt;code&gt;fastcgi_pass&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Logs: &lt;code&gt;/var/log/nginx/error.log&lt;/code&gt;, &lt;code&gt;/var/log/nginx/access.log&lt;/code&gt;, PHP-FPM logs.&lt;/li&gt;
&lt;li&gt;Permissions: owner &lt;code&gt;www-data:www-data&lt;/code&gt;, no &lt;code&gt;777&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dvws</category>
      <category>bugbounty</category>
      <category>security</category>
      <category>nginx</category>
    </item>
    <item>
      <title>🧩 How to Structure a FastAPI Project the Right Way</title>
      <dc:creator>Zaenal Arifin </dc:creator>
      <pubDate>Sat, 01 Nov 2025 05:32:29 +0000</pubDate>
      <link>https://dev.to/1amkaizen/how-to-structure-a-fastapi-project-the-right-way-4ho4</link>
      <guid>https://dev.to/1amkaizen/how-to-structure-a-fastapi-project-the-right-way-4ho4</guid>
      <description>&lt;p&gt;When you first start with &lt;strong&gt;FastAPI&lt;/strong&gt;, it’s tempting to throw everything into a single file — and it works fine… until your app grows. Then suddenly, your codebase becomes spaghetti.&lt;/p&gt;

&lt;p&gt;In this post, we’ll go through how to &lt;strong&gt;structure a FastAPI project properly&lt;/strong&gt;, using clean architecture principles that scale easily.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Why Project Structure Matters
&lt;/h2&gt;

&lt;p&gt;A good structure makes your project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easier to &lt;strong&gt;maintain&lt;/strong&gt; and &lt;strong&gt;scale&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Easier for &lt;strong&gt;new developers&lt;/strong&gt; to understand.&lt;/li&gt;
&lt;li&gt;Ready for &lt;strong&gt;testing&lt;/strong&gt;, &lt;strong&gt;CI/CD&lt;/strong&gt;, and &lt;strong&gt;deployment&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your FastAPI project looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;main.py
models.py
routes.py
schemas.py
database.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;…it’s time for an upgrade.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ Recommended Folder Structure
&lt;/h2&gt;

&lt;p&gt;Here’s a clean, production-ready structure I use for real projects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/
├── api/
│   ├── routes/
│   │   ├── users.py
│   │   ├── items.py
│   │   └── __init__.py
│   ├── deps.py
│   ├── __init__.py
│   └── api_v1.py
├── core/
│   ├── config.py
│   ├── security.py
│   └── __init__.py
├── db/
│   ├── base.py
│   ├── session.py
│   └── __init__.py
├── models/
│   ├── user.py
│   ├── item.py
│   └── __init__.py
├── schemas/
│   ├── user.py
│   ├── item.py
│   └── __init__.py
├── services/
│   ├── user_service.py
│   └── __init__.py
├── main.py
└── __init__.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚙️ Let’s Break It Down
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;core/&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Contains global configurations — environment variables, security settings, and constants.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/core/config.py
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseSettings&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Settings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseSettings&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;APP_NAME&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;My FastAPI App&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;

    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;env_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.env&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;settings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Settings&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;code&gt;db/&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Handles all database setup — connection, session management, and base models.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/db/session.py
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sqlalchemy&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;create_engine&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sqlalchemy.orm&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sessionmaker&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.core.config&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;

&lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_engine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;SessionLocal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sessionmaker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;autocommit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;autoflush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;code&gt;api/routes/&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Organize endpoints by domain — one file per feature.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/api/routes/users.py
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;APIRouter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Depends&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.schemas.user&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.services.user_service&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_all_users&lt;/span&gt;

&lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;APIRouter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/users&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;users&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="nd"&gt;@router.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response_model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;list_users&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;get_all_users&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;code&gt;services/&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Business logic lives here — keep it separate from routes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/services/user_service.py
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.db.session&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SessionLocal&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.models.user&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_all_users&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SessionLocal&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;code&gt;main.py&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The entry point that ties everything together.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/main.py
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.api.api_v1&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;api_router&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.core.config&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;APP_NAME&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include_router&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_router&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧠 Tips for Scalable FastAPI Projects
&lt;/h2&gt;

&lt;p&gt;✅ Use &lt;strong&gt;Pydantic models&lt;/strong&gt; for input/output validation&lt;br&gt;
✅ Split logic into &lt;strong&gt;layers&lt;/strong&gt; — routes, services, models&lt;br&gt;
✅ Use &lt;strong&gt;dependency injection&lt;/strong&gt; for clean imports&lt;br&gt;
✅ Add &lt;strong&gt;logging&lt;/strong&gt; early — don’t debug with &lt;code&gt;print()&lt;/code&gt;&lt;br&gt;
✅ Separate &lt;strong&gt;environment variables&lt;/strong&gt; from code&lt;/p&gt;


&lt;h2&gt;
  
  
  🧰 Example Repository
&lt;/h2&gt;

&lt;p&gt;I’ve uploaded an example of this structure here:&lt;br&gt;
👉 GitHub - fastapi-clean-structure &lt;em&gt;(insert your repo link)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You can clone it, install dependencies, and start your app in seconds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/yourusername/fastapi-clean-structure.git
&lt;span class="nb"&gt;cd &lt;/span&gt;fastapi-clean-structure
poetry &lt;span class="nb"&gt;install
&lt;/span&gt;poetry run uvicorn app.main:app &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔚 Conclusion
&lt;/h2&gt;

&lt;p&gt;Clean project structure isn’t just about being “organized” — it’s about &lt;strong&gt;future-proofing&lt;/strong&gt; your codebase.&lt;br&gt;
FastAPI makes things fast, but structure makes them &lt;strong&gt;sustainable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you found this useful, drop a ❤️ or follow me — I post about &lt;strong&gt;Python, FastAPI, and backend architecture&lt;/strong&gt; regularly.&lt;/p&gt;

</description>
      <category>python</category>
      <category>fastapi</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🚀 Deploying a FastAPI Project to an Ubuntu VPS — A Complete Guide for Developers</title>
      <dc:creator>Zaenal Arifin </dc:creator>
      <pubDate>Sat, 01 Nov 2025 05:24:58 +0000</pubDate>
      <link>https://dev.to/1amkaizen/deploying-a-fastapi-project-to-an-ubuntu-vps-a-complete-guide-for-developers-392</link>
      <guid>https://dev.to/1amkaizen/deploying-a-fastapi-project-to-an-ubuntu-vps-a-complete-guide-for-developers-392</guid>
      <description>&lt;p&gt;As an independent developer, I often get asked: how do you deploy a Python project to a VPS so it runs automatically and stays stable?&lt;/p&gt;

&lt;p&gt;Well, in this article, I’ll walk you through step-by-step how to host a FastAPI project (or a Python bot) on an Ubuntu VPS — complete with systemd, Nginx, and SSL setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Why Use a VPS?
&lt;/h2&gt;

&lt;p&gt;If you’ve been coding backend projects for a while, chances are you want your project to be accessible online — whether it’s an API, a bot, or a web dashboard.&lt;/p&gt;

&lt;p&gt;A VPS (Virtual Private Server) gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full freedom (root access)
&lt;/li&gt;
&lt;li&gt;Ability to install anything (Python, Docker, etc.)
&lt;/li&gt;
&lt;li&gt;Faster and more stable than shared hosting
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Popular providers:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
👉 DigitalOcean, Vultr, Linode, Hetzner, or HostHatch.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. VPS Preparation
&lt;/h2&gt;

&lt;p&gt;Log in to your VPS using SSH:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh root@ip-address-vps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then update the system and install basic packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y
sudo apt install python3 python3-venv python3-pip git nginx ufw -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;💡 &lt;strong&gt;Security Tips:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a non-root user:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;adduser ubuntu
usermod -aG sudo ubuntu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set up the UFW firewall:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ufw allow OpenSSH
ufw allow 'Nginx Full'
ufw enable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Clone Project to the Server
&lt;/h2&gt;

&lt;p&gt;Go to a safe directory to store your source code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd /opt
sudo git clone https://github.com/username/project.git
sudo chown -R ubuntu:ubuntu project
cd project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you’re using &lt;strong&gt;Poetry&lt;/strong&gt;, install it first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -sSL https://install.python-poetry.org | python3 -
export PATH="$HOME/.local/bin:$PATH"
poetry install --no-root
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or use the standard &lt;strong&gt;venv&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Run the Project Manually (Test)
&lt;/h2&gt;

&lt;p&gt;Test your project manually first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;poetry run uvicorn app.main:app --host 0.0.0.0 --port 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, if using venv:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open your browser:&lt;br&gt;
👉 &lt;code&gt;http://&amp;lt;vps-ip&amp;gt;:8000&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you see the FastAPI default page — it’s running fine.&lt;/p&gt;
&lt;h2&gt;
  
  
  5. Create a Systemd Service
&lt;/h2&gt;

&lt;p&gt;To make the project auto-start on VPS reboot and manageable via &lt;code&gt;systemctl&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Create a new service file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo vim /etc/systemd/system/fastapi.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Unit]
Description=FastAPI Application
After=network.target

[Service]
User=ubuntu
WorkingDirectory=/opt/project
ExecStart=/home/ubuntu/.local/bin/poetry run uvicorn app.main:app --host 127.0.0.1 --port 8000
Restart=always
Environment="PATH=/home/ubuntu/.local/bin:/usr/bin"

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Activate the service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl daemon-reload
sudo systemctl enable fastapi
sudo systemctl start fastapi
sudo systemctl status fastapi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the status shows &lt;strong&gt;active (running)&lt;/strong&gt; — everything’s good.&lt;/p&gt;

&lt;p&gt;💡 Use &lt;code&gt;journalctl -u fastapi -f&lt;/code&gt; to view real-time logs.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Configure Nginx (Reverse Proxy)
&lt;/h2&gt;

&lt;p&gt;This allows your app to be accessed via port 80/443 (HTTP/HTTPS).&lt;/p&gt;

&lt;p&gt;Create a new config file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo vim /etc/nginx/sites-available/fastapi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;server {
    server_name yourdomain.com;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable the config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo ln -s /etc/nginx/sites-available/fastapi /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now open your browser:&lt;br&gt;
👉 &lt;code&gt;http://yourdomain.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If it loads correctly — your setup is complete.&lt;/p&gt;
&lt;h2&gt;
  
  
  7. Install Free SSL (Let’s Encrypt)
&lt;/h2&gt;

&lt;p&gt;Use &lt;strong&gt;certbot&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d yourdomain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SSL will be automatically installed and Nginx updated to HTTPS.&lt;/p&gt;

&lt;p&gt;Check status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  8. Testing &amp;amp; Monitoring
&lt;/h2&gt;

&lt;p&gt;Test your service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -I https://yourdomain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;View real-time logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo journalctl -u fastapi -f
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart service after code updates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl restart fastapi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  9. Extra Tips for Developers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;tmux&lt;/strong&gt; to keep manual sessions running.&lt;/li&gt;
&lt;li&gt;Add auto-deploy via Git hook:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  git pull &amp;amp;&amp;amp; sudo systemctl restart fastapi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Save logs to a custom file in &lt;code&gt;/var/log/fastapi.log&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If you run multiple projects, create separate systemd services for each.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;fail2ban&lt;/strong&gt; to secure SSH and Nginx.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  10. Conclusion
&lt;/h2&gt;

&lt;p&gt;Now you have a VPS that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runs &lt;strong&gt;FastAPI 24/7&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Is secure, auto-started, and SSL-ready&lt;/li&gt;
&lt;li&gt;Can be redeployed easily with &lt;code&gt;git pull + restart&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With this setup, you can professionally and efficiently deploy backends, Telegram bots, or internal APIs.&lt;/p&gt;

&lt;p&gt;In the next article, I’ll cover &lt;strong&gt;auto-deploy CI/CD using GitHub Actions&lt;/strong&gt; directly to your VPS — stay tuned!&lt;/p&gt;

&lt;p&gt;💬 &lt;strong&gt;Bonus: Quick Multi-App systemd Template&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you have multiple projects (e.g., a bot and a web app):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo vim /etc/systemd/system/telegram-bot.service
sudo vim /etc/systemd/system/fastapi.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each can auto-run and be monitored with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl status telegram-bot
sudo systemctl status fastapi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>vps</category>
      <category>python</category>
      <category>fastapi</category>
      <category>programming</category>
    </item>
    <item>
      <title>Building a Bot Platform with Django: Step-by-Step Guide to Creating Bot Platform With Django</title>
      <dc:creator>Zaenal Arifin </dc:creator>
      <pubDate>Sun, 06 Oct 2024 02:52:50 +0000</pubDate>
      <link>https://dev.to/1amkaizen/building-a-bot-platform-with-django-step-by-step-guide-to-creating-bot-platform-with-django-3j7i</link>
      <guid>https://dev.to/1amkaizen/building-a-bot-platform-with-django-step-by-step-guide-to-creating-bot-platform-with-django-3j7i</guid>
      <description>&lt;p&gt;👋 &lt;strong&gt;Hey Devs!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I’m excited to share something I’ve been working on for a while — my new ebook titled &lt;strong&gt;"Building a Bot Platform with Django."&lt;/strong&gt; If you’ve ever wanted to create your own bot platform where users can make bots for &lt;strong&gt;Telegram&lt;/strong&gt; and &lt;strong&gt;WhatsApp&lt;/strong&gt;, this book is for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Can You Expect?
&lt;/h2&gt;

&lt;p&gt;In this ebook, I break down how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build a bot creation platform using &lt;strong&gt;Django&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Set up &lt;strong&gt;Telegram&lt;/strong&gt; and &lt;strong&gt;WhatsApp&lt;/strong&gt; bots using &lt;strong&gt;webhooks&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Add custom &lt;strong&gt;commands&lt;/strong&gt; and &lt;strong&gt;responses&lt;/strong&gt; that make your bots interactive.&lt;/li&gt;
&lt;li&gt;Integrate with &lt;strong&gt;Twilio&lt;/strong&gt; to get your WhatsApp bot running.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best part? This guide takes you through every stage of building the platform, from setting up the initial project to deploying it live. You don’t need to be a Django expert to follow along; the book is designed for developers of all levels!&lt;/p&gt;

&lt;h2&gt;
  
  
  Why You Should Get It:
&lt;/h2&gt;

&lt;p&gt;Bots are becoming a critical part of business communication, automating everything from customer service to task management. With this ebook, you’ll have the skills to create bots that your users or clients can interact with effortlessly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who Is This For?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Django developers looking for a fun new project.&lt;/li&gt;
&lt;li&gt;Anyone interested in bot automation using messaging platforms.&lt;/li&gt;
&lt;li&gt;Developers who want to integrate real-time interaction into their apps.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ready to start building?
&lt;/h2&gt;

&lt;p&gt;Grab your copy of &lt;strong&gt;"Building a Bot Platform with Django"&lt;/strong&gt; now at &lt;a href="https://aigoretech.my.id/ebook" rel="noopener noreferrer"&gt;aigoretech/ebook&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Want to Get Promo &amp;amp; Discounts?
&lt;/h2&gt;

&lt;p&gt;Join my Discord community to stay updated on exclusive promotions and discounts. Connect with me and other developers by joining here: &lt;a href="https://discord.gg/GNhjpqeX4g" rel="noopener noreferrer"&gt;discord.gg/GNhjPqeX4g&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you have any questions about the book, feel free to drop a comment or reach out! I’m happy to chat about all things Django and bots. 🚀&lt;/p&gt;

</description>
      <category>django</category>
      <category>python</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Belajar Machine Learning dengan Python dan Library Scikit-Learn</title>
      <dc:creator>Zaenal Arifin </dc:creator>
      <pubDate>Sun, 29 Sep 2024 10:03:14 +0000</pubDate>
      <link>https://dev.to/1amkaizen/belajar-machine-learning-dengan-python-dan-library-scikit-learn-25ko</link>
      <guid>https://dev.to/1amkaizen/belajar-machine-learning-dengan-python-dan-library-scikit-learn-25ko</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqsce48enanzph8wk57li.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqsce48enanzph8wk57li.png" alt="Image description" width="800" height="737"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📚 &lt;strong&gt;Belajar Machine Learning dengan Python dan Library Scikit-Learn&lt;/strong&gt; 🤖📊&lt;/p&gt;

&lt;p&gt;Apakah Anda ingin memulai perjalanan di dunia machine learning? Buku ini adalah panduan lengkap yang dirancang untuk membantu pembaca memahami konsep dasar dan aplikasi praktis machine learning menggunakan Python dan library Scikit-Learn yang populer. Cocok untuk pemula maupun praktisi yang ingin memperdalam pengetahuan mereka tentang teknik-teknik terbaru dalam bidang ini.&lt;/p&gt;

&lt;p&gt;📖 &lt;strong&gt;Apa yang akan Anda pelajari:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ Dasar-dasar machine learning&lt;br&gt;
✅ Teknik preprocessing data&lt;br&gt;
✅ Membangun model machine learning&lt;br&gt;
✅ Evaluasi model dan optimasi kinerja&lt;br&gt;
✅ Penerapan algoritma populer seperti regresi, klasifikasi, dan clustering&lt;/p&gt;

&lt;p&gt;Dengan buku ini, Anda akan dibimbing secara langkah demi langkah melalui konsep yang kompleks menjadi sederhana, didukung dengan contoh kode Python yang jelas dan penjelasan yang mendetail. Tak hanya itu, Anda juga mendapatkan akses ke repositori GitHub untuk melihat dan mencoba sendiri kode yang digunakan.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Dapatkan di:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://clicky.id/aigoretech/download-ebook" rel="noopener noreferrer"&gt;https://clicky.id/aigoretech/download-ebook&lt;/a&gt;&lt;br&gt;
Atau kunjungi:&lt;br&gt;
&lt;a href="https://aigoretech.my.id/ebook" rel="noopener noreferrer"&gt;https://aigoretech.my.id/ebook&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>machinelearning</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>Fundamental Machine Learning: Panduan Lengkap untuk Pemula</title>
      <dc:creator>Zaenal Arifin </dc:creator>
      <pubDate>Sun, 29 Sep 2024 09:55:24 +0000</pubDate>
      <link>https://dev.to/1amkaizen/fundamental-machine-learning-panduan-lengkap-untuk-pemula-2klo</link>
      <guid>https://dev.to/1amkaizen/fundamental-machine-learning-panduan-lengkap-untuk-pemula-2klo</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftpgh9grrcrg9s3qjsgz7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftpgh9grrcrg9s3qjsgz7.png" alt="Image description" width="800" height="737"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📚&lt;strong&gt;Fundamental Machine Learning: Panduan Lengkap untuk Pemula&lt;/strong&gt;🤖📈&lt;/p&gt;

&lt;p&gt;Apakah Anda baru memulai perjalanan di dunia machine learning? Ebook ini adalah panduan sempurna bagi pemula untuk memahami konsep-konsep dasar serta aplikasi machine learning di berbagai industri. Dari kesehatan hingga keuangan, e-commerce hingga teknologi, Anda akan mempelajari cara memilih model yang tepat, mengevaluasi performa, dan menerapkan solusi machine learning secara praktis — tanpa harus mendalami kode.&lt;/p&gt;

&lt;p&gt;📖&lt;strong&gt;Apa yang akan Anda pelajari:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ Pengenalan berbagai algoritma machine learning&lt;br&gt;
✅ Aplikasi machine learning dalam industri nyata&lt;br&gt;
✅ Pemilihan model yang tepat untuk berbagai kasus&lt;br&gt;
✅ Teknik evaluasi performa model&lt;br&gt;
✅ Penerapan machine learning tanpa fokus pada kode&lt;/p&gt;

&lt;p&gt;Buku ini memberikan pengantar yang mudah dipahami dan disusun dengan contoh-contoh praktis, menjadikannya panduan yang ideal untuk siapa saja yang ingin memahami machine learning dari perspektif konsep dan aplikasi industri.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Dapatkan di:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://clicky.id/aigoretech/download-fundamental-machine-learning" rel="noopener noreferrer"&gt;https://clicky.id/aigoretech/download-fundamental-machine-learning&lt;/a&gt;&lt;br&gt;
Atau kunjungi:&lt;br&gt;
&lt;a href="https://aigoretech.my.id/ebook" rel="noopener noreferrer"&gt;https://aigoretech.my.id/ebook&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>tutorial</category>
      <category>ai</category>
      <category>python</category>
    </item>
    <item>
      <title>Membangun Platform Bot dengan Django</title>
      <dc:creator>Zaenal Arifin </dc:creator>
      <pubDate>Sun, 29 Sep 2024 09:54:25 +0000</pubDate>
      <link>https://dev.to/1amkaizen/membangun-platform-bot-dengan-django-18m4</link>
      <guid>https://dev.to/1amkaizen/membangun-platform-bot-dengan-django-18m4</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dgmb63fd0zx41d44k9r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dgmb63fd0zx41d44k9r.png" alt="Image description" width="800" height="626"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📚 &lt;strong&gt;Buku Panduan Lengkap: Membangun Platform Bot dengan Django&lt;/strong&gt; 🖥️🤖&lt;/p&gt;

&lt;p&gt;Apakah Anda ingin membangun platform bot menggunakan Django? Buku ini adalah solusi lengkap untuk Anda! Cocok untuk pemula maupun pengembang berpengalaman, buku ini menyajikan langkah-langkah yang jelas dan praktis untuk menciptakan proyek bot yang siap di-deploy, dengan integrasi sempurna ke Telegram dan WhatsApp.&lt;/p&gt;

&lt;p&gt;📲&lt;strong&gt;Apa yang akan Anda pelajari:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ Cara membuat bot interaktif&lt;br&gt;
✅ Integrasi webhook untuk menghubungkan bot ke layanan eksternal&lt;br&gt;
✅ Manajemen perintah (commands) yang efisien&lt;br&gt;
✅ Implementasi log aktivitas untuk pelacakan performa&lt;/p&gt;

&lt;p&gt;📖&lt;strong&gt;Buku ini dilengkapi dengan:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Contoh kode yang mudah dipahami&lt;br&gt;
Penjelasan mendetail di setiap langkah&lt;br&gt;
Akses ke repositori GitHub dengan kode lengkap&lt;br&gt;
✨ Diskon Spesial 15% untuk ebook "Membangun Platform Bot dengan Django"! 🎉&lt;br&gt;
Gunakan kode DISKON15 saat checkout. Penawaran ini hanya berlaku hingga 25 Oktober 2024. Segera dapatkan panduan ini dan mulai bangun bot Anda dengan hemat! 💻🚀&lt;/p&gt;

&lt;p&gt;🔗&lt;strong&gt;Dapatkan di:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://clicky.id/aigoretech/promo-page" rel="noopener noreferrer"&gt;https://clicky.id/aigoretech/promo-page&lt;/a&gt;&lt;br&gt;
Atau kunjungi:&lt;br&gt;
&lt;a href="https://aigoretech.my.id/ebook" rel="noopener noreferrer"&gt;https://aigoretech.my.id/ebook&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>django</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
