<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[JKM Solutions Blog]]></title><description><![CDATA[Learn more about the Steam Web API and full-stack development in general.]]></description><link>https://jkm.solutions/blog/</link><image><url>https://jkm.solutions/blog/favicon.png</url><title>JKM Solutions Blog</title><link>https://jkm.solutions/blog/</link></image><generator>Ghost 5.80</generator><lastBuildDate>Sat, 04 Apr 2026 14:57:44 GMT</lastBuildDate><atom:link href="https://jkm.solutions/blog/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Setting up PostgreSQL on a Ubuntu Server]]></title><description><![CDATA[<p>Even though I mostly use docker composes for dev, and managed database solutions for prod, smaller projects might still find it useful to set up PostgreSQL locally. In this article, I&apos;ll walk through how to do it on a Ubuntu server specifically (I&apos;ll use a EC2</p>]]></description><link>https://jkm.solutions/blog/setting-up-postgresql-on-a-ubuntu-server/</link><guid isPermaLink="false">67325fff53de030fc9250940</guid><dc:creator><![CDATA[Kevin Rasmusson]]></dc:creator><pubDate>Mon, 11 Nov 2024 20:40:08 GMT</pubDate><media:content url="https://jkm.solutions/blog/content/images/2024/11/ubuntu_postgres.png" medium="image"/><content:encoded><![CDATA[<img src="https://jkm.solutions/blog/content/images/2024/11/ubuntu_postgres.png" alt="Setting up PostgreSQL on a Ubuntu Server"><p>Even though I mostly use docker composes for dev, and managed database solutions for prod, smaller projects might still find it useful to set up PostgreSQL locally. In this article, I&apos;ll walk through how to do it on a Ubuntu server specifically (I&apos;ll use a EC2 instance running Ubuntu 24.04.1).</p><h3 id="1-installations">1. Installations</h3><p>Firstly, we&apos;ll have to install all the packages we need, which starts with an update to our package list:</p><pre><code class="language-bash">sudo apt update</code></pre><p>Run the following command to install PostgreSQL:</p><pre><code class="language-bash">sudo apt install postgresql postgresql-contrib</code></pre><h3 id="2-setting-up-a-user">2. Setting up a user</h3><p>Accessing the database is done with a user. In a NodeJS application it might look something like this:</p><pre><code class="language-typescript">import { Pool } from &apos;pg&apos;;
import dotenv from &apos;dotenv&apos;;
dotenv.config();

export const pool = new Pool({
    user: process.env.POSTGRES_USER,
    host: process.env.POSTGRES_HOST,
    database: process.env.POSTGRES_DATABASE,
    password: process.env.POSTGRES_PASSWORD,
    port: parseInt(process.env.POSTGRES_PORT as string),
});</code></pre><p>As such, we&apos;ll have to make sure we create a user with the POSTGRES_USER and POSTGRES_PASSWORD we&apos;ve added to the application&apos;s environment variables.</p><p>To access the Postgres database, we&apos;ll have to switch user to the one created during installation:</p><pre><code class="language-bash">sudo -i -u postgres</code></pre><p>And then access the shell by using:</p><pre><code class="language-bash">psql
</code></pre><p>In the shell, we&apos;ll create our user:</p><pre><code class="language-sql">CREATE USER tf2bot WITH PASSWORD &apos;50d56046-0d01-4865-901c-a9b3fac8e1f8&apos;;</code></pre><p>(you can change the username and password to whatever fits your application best. In this case it will be used for a TF2 Steam bot).</p><p>Instead of creating the database with the default user and changing owner, I like to allow the newly created user to create databases:</p><pre><code class="language-sql">ALTER USER tf2bot CREATEDB;</code></pre><p>(change tf2bot to the username you used in the previous step)</p><p>For the next step, we need to locate a configuration file. This is easily done using the following command:</p><pre><code class="language-bash">SHOW hba_file;</code></pre><p>That should print something like:</p><pre><code>              hba_file               
-------------------------------------
 /etc/postgresql/16/main/pg_hba.conf
(1 row)</code></pre><p>Let&apos;s exit the shell for now:</p><pre><code class="language-bash">\q</code></pre><p>And then ctrl + D to go back to our root user.</p><pre><code class="language-bash">ctrl + D</code></pre><h3 id="3-configuring-postgres-to-allow-sign-in-with-password">3. Configuring Postgres to allow sign in with password</h3><p>Depending on what was printed in the previous step, the following command might look different (depending on postgres version, etc.) Excluding the final file, let&apos;s navigate to the directory within which it resides:</p><pre><code class="language-bash">cd /etc/postgresql/16/main/</code></pre><p>To edit the file of interest, we&apos;ll utilize nano:</p><pre><code class="language-bash">sudo nano pg_hba.conf</code></pre><p>Scroll down to the following line and change &quot;peer&quot; to &quot;scram-sha-256&quot;</p><pre><code class="language-bash"># &quot;local&quot; is for Unix domain socket connections only
local   all             all                                peer</code></pre><p>It should look like this when you&apos;re done:</p><pre><code class="language-bash"># &quot;local&quot; is for Unix domain socket connections only
local   all             all                                scram-sha-256</code></pre><p>Afterwards, we&apos;ll have to restart postgres:</p><pre><code class="language-bash">sudo systemctl restart postgresql</code></pre><p>If all went well, you should now be able to directly sign in to the user you created:</p><pre><code class="language-bash">psql -U tf2bot -d postgres</code></pre><p>You&apos;ll be prompted for a password, enter the one you added during setup (in my case 50d56046-0d01-4865-901c-a9b3fac8e1f8)</p><p>Remain in the shell and move on to step 4.</p><h3 id="4-adding-our-database">4. Adding our database</h3><p>To add a database to postgres, use the following command:</p><pre><code class="language-bash">CREATE DATABASE tf2bot;</code></pre><p>Afterwards, you can connect to the database using:</p><pre><code class="language-bash">\c tf2bot;</code></pre><p>In here, paste the <strong>database.sql</strong> file of your project, and you&apos;ll be good to go!</p><p>Exit the postgres shell when you are done:</p><pre><code class="language-bash">\q</code></pre>]]></content:encoded></item><item><title><![CDATA[[DEPRECATED] Fetch CS2 Inventory with Floats using CSInventoryAPI (NodeJS)]]></title><description><![CDATA[<p><strong>Update March 14th, 2026: </strong>Valve pushed an update to inspect links last night, rendering this guide deprecated. After updating CSInventoryAPI I&apos;ll probably add a new blog post explaining the changes paired with a new guide.</p><p>In an attempt to make <a href="https://csinventoryapi.com/?ref=jkm.solutions" rel="noreferrer">CSInventoryAPI</a> more accessible, I figured I would put</p>]]></description><link>https://jkm.solutions/blog/cs2-inventory-with-floats-using-csinventoryapi-nodejs/</link><guid isPermaLink="false">67058a7c53de030fc92508ca</guid><dc:creator><![CDATA[Kevin Rasmusson]]></dc:creator><pubDate>Fri, 11 Oct 2024 16:14:07 GMT</pubDate><media:content url="https://jkm.solutions/blog/content/images/2024/10/item-floats.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://jkm.solutions/blog/content/images/2024/10/item-floats.jpg" alt="[DEPRECATED] Fetch CS2 Inventory with Floats using CSInventoryAPI (NodeJS)"><p><strong>Update March 14th, 2026: </strong>Valve pushed an update to inspect links last night, rendering this guide deprecated. After updating CSInventoryAPI I&apos;ll probably add a new blog post explaining the changes paired with a new guide.</p><p>In an attempt to make <a href="https://csinventoryapi.com/?ref=jkm.solutions" rel="noreferrer">CSInventoryAPI</a> more accessible, I figured I would put together a quick article detailing how to successfully use our most popular endpoint, the inspect API (/api/v1/inspect)</p><h3 id="the-url-property">The ?url= property</h3><p>The only thing we need to obtain the advanced item info for a specific item is the <em>inspect url</em>, most easily found by navigating to your own inventory, clicking an item, and finding the &quot;Inspect in Game...&quot; button.</p><figure class="kg-card kg-image-card"><img src="https://jkm.solutions/blog/content/images/2024/10/Screenshot-2024-10-11-at-14.43.59.png" class="kg-image" alt="[DEPRECATED] Fetch CS2 Inventory with Floats using CSInventoryAPI (NodeJS)" loading="lazy" width="924" height="838" srcset="https://jkm.solutions/blog/content/images/size/w600/2024/10/Screenshot-2024-10-11-at-14.43.59.png 600w, https://jkm.solutions/blog/content/images/2024/10/Screenshot-2024-10-11-at-14.43.59.png 924w" sizes="(min-width: 720px) 720px"></figure><p>If you copy that link address, you will find something with a close resemblance to: </p><blockquote>steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20S76561198166295458A38739886639D768787693327487156</blockquote><p>Now, the most important parts of this url is what happens near the end, after the %20 (space).</p><p>There are three letters that separate the different sequences of numbers:</p><ul><li>S (steamid64, in this case 76561198166295458)</li><li>A (assetid of the item, in this case 38739886639)</li><li>D (a random number as far as I know, we will not have to worry about this).</li></ul><h3 id="testing-the-inspect-endpoint">Testing the inspect endpoint</h3><p>Armed with this inspect link, you can try out the endpoint using the swagger UI available at <a href="https://csinventoryapi.com/docs?ref=jkm.solutions">https://csinventoryapi.com/docs</a>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://jkm.solutions/blog/content/images/2024/10/Screenshot-2024-10-11-at-14.58.10.png" class="kg-image" alt="[DEPRECATED] Fetch CS2 Inventory with Floats using CSInventoryAPI (NodeJS)" loading="lazy" width="1508" height="764" srcset="https://jkm.solutions/blog/content/images/size/w600/2024/10/Screenshot-2024-10-11-at-14.58.10.png 600w, https://jkm.solutions/blog/content/images/size/w1000/2024/10/Screenshot-2024-10-11-at-14.58.10.png 1000w, https://jkm.solutions/blog/content/images/2024/10/Screenshot-2024-10-11-at-14.58.10.png 1508w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Add your API key and the url, then press execute.</span></figcaption></figure><p>If all works well, you should receive an output similar to this:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://jkm.solutions/blog/content/images/2024/10/Screenshot-2024-10-11-at-14.56.46.png" class="kg-image" alt="[DEPRECATED] Fetch CS2 Inventory with Floats using CSInventoryAPI (NodeJS)" loading="lazy" width="1478" height="528" srcset="https://jkm.solutions/blog/content/images/size/w600/2024/10/Screenshot-2024-10-11-at-14.56.46.png 600w, https://jkm.solutions/blog/content/images/size/w1000/2024/10/Screenshot-2024-10-11-at-14.56.46.png 1000w, https://jkm.solutions/blog/content/images/2024/10/Screenshot-2024-10-11-at-14.56.46.png 1478w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&quot;floatvalue&quot; is the property that shows the float of the item in question.</span></figcaption></figure><h3 id="fetching-floats-of-items-in-an-inventory-using-nodejs">Fetching floats of items in an inventory using NodeJS </h3><p>The crux of it is, when fetching an inventory (e.g., by using the https://csinventoryapi.com/api/v1/inventory endpoint), the inspect url does not come pre-populated with the fields required to inspect the item, specifically the S and A properties are only filled with placeholders.</p><p>The solutions to this is however relatively straightforward. The S property is set to the steamid64 of the item&apos;s owner, and the A property is populated with the item&apos;s assetid. Let us see how to do this in practice (all code will be available on <a href="https://github.com/jkmsolutions/inventory-with-floats?ref=jkm.solutions" rel="noreferrer">GitHub</a>):</p><h4 id="get-user-inventory">Get user inventory</h4><p>Firstly, we&apos;ll build a method to retrieve a user&apos;s inventory (also using CSInventoryAPI to avoid rate limits imposed by Steam):</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">import axios from &apos;axios&apos;;

const API_KEY = process.env.CSINVENTORYAPI_API_KEY;

if (!API_KEY) {
    throw new Error(&apos;No API key provided&apos;);
}

/**
 * Fetches the inventory of a user
 * 
 * @param {string} steamid64 of the user
 * @returns {Promise&lt;Inventory&gt;} the user&apos;s inventory
 */
const getUserInventory = async (steamid64) =&gt; {
    const response = await axios.get(
        `https://csinventoryapi.com/api/v1/inventory?api_key=${API_KEY}&amp;steamid64=${steamid64}`
    );

    if (response.data.success !== 1) {
        throw new Error(&apos;Failed to fetch inventory&apos;);
    }

    if (response.data.total_inventory_count === 0) {
        throw new Error(&apos;No items found.&apos;);
    }

    if (!response.data.assets || !response.data.descriptions) {
        throw new Error(&apos;No assets found.&apos;);
    }

    return response.data;
}</code></pre><figcaption><p><span style="white-space: pre-wrap;">Simple method to fetch user inventory w/ some error handling.</span></p></figcaption></figure><h4 id="parse-user-inventory">Parse user inventory</h4><p>Armed with this data, and given that the user have items in their inventory, we can go ahead and parse it into a more manageable array of items (Steam divides the assets and the descriptions, why this is a necessary step in most applications utilising inventory fetching).</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">/**
 * 
 * @param {Inventory} inventory 
 * @returns {Promise&lt;ParsedInventoryItem[]&gt;}
 */
const parseInventory = async (inventory) =&gt; {
    const parsedInventory = [];

    for (let i = 0; i &lt; inventory.assets.length; i++) {
        const asset = inventory.assets[i];
        const description = inventory.descriptions.find(d =&gt; d.classid === asset.classid);

        if (!description) {
            continue;
        }

        parsedInventory.push({
            appid: asset.appid,
            classid: asset.classid,
            instanceid: asset.instanceid,
            assetid: asset.assetid,
            contextid: asset.contextid,
            icon_url: description.icon_url,
            tradable: description.tradable,
            inspect_url: description.actions &amp;&amp; description.actions[0] &amp;&amp; description.actions[0].link || null,
            name: description.name,
            market_hash_name: description.market_hash_name,
            name_color: description.name_color
        });
    }

    return parsedInventory;
}</code></pre><figcaption><p><span style="white-space: pre-wrap;">Some parsing is required to find the fields we are interested in (specifically the inspect_url, which might not always be present. A sticker capsule, for instance, does not have an inspect url).</span></p></figcaption></figure><p>If we now test running these method using the following code:</p><pre><code class="language-javascript">const inventory = await getUserInventory(steamid64);
const parsedInventory = await parseInventory(inventory);
console.log(parsedInventory);</code></pre><p>We will see an array of items that look like this:</p><pre><code class="language-javascript">{
    appid: 730,
    classid: &apos;720381639&apos;,
    instanceid: &apos;5837227973&apos;,
    assetid: &apos;38537743650&apos;,
    contextid: &apos;2&apos;,
    icon_url: &apos;-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KU0Zwwo4NUX4oFJZEHLbXH5ApeO4YmlhxYQknCRvCo04DEVlxkKgpovbSsLQJf2PLacDBA5ciJlZG0hOPxNrfunWVY7sBOguzA45W73wy2_BY4Nm32cIWQcA4_ZVCC_1K4kLvohJTt7s6YmnRqs3Yh5y7Zlgv330_d1jhnvw&apos;,
    tradable: 1,
    inspect_url: &apos;steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20S%owner_steamid%A%assetid%D9223627464362234909&apos;,
    name: &apos;&#x2605; Karambit | Rust Coat&apos;,
    market_hash_name: &apos;&#x2605; Karambit | Rust Coat (Battle-Scarred)&apos;,
    name_color: &apos;8650AC&apos;
}</code></pre><p>If we look at the inspect url, we can see that we are missing the S and A properties that I mentioned earlier, and that they are filled with % placeholders. On a positive note, at least they tell us precisely what should be put in their place.</p><h4 id="populating-the-ownersteamid-and-assetid-fields">Populating the %owner_steamid% and %assetid% fields</h4><p>The last step is to populate the fields in the item&apos;s inspect url, and actually fetch the floatvalue for each item in the parsed inventory.</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">/**
 * Populates the float values of the items in the inventory
 * @param {ParsedInventoryItem[]} parsedInventory 
 * @param {steamid64} steamid64 
 * @returns {Promise&lt;ParsedInventoryItem[]&gt;}
 */
const addFloatsToParsedInventory = async (parsedInventory, steamid64) =&gt; {
    const parsedInventoryWithFloats = [];

    for (const item of parsedInventory) {
        try {
            if (!item.inspect_url) {
                console.error(&apos;No inspect url found for item:&apos;, item.market_hash_name);
                continue;
            }

            // replace %owner_steamid% with the steamid64 of the user
            // and %assetid% with the assetid of the item
            const parsedInspectUrl = item.inspect_url
              .replace(&apos;%owner_steamid%&apos;, steamid64)
              .replace(&apos;%assetid%&apos;, item.assetid);

            const response = await axios.get(
                &apos;https://csinventoryapi.com/api/v1/inspect?api_key=&apos; + API_KEY + &apos;&amp;url=&apos; + parsedInspectUrl
            );
    
            const { 
              floatvalue, 
              paintseed, 
              paintindex 
            } = response.data.iteminfo;

            parsedInventoryWithFloats.push({
                ...item,
                inspect_url: parsedInspectUrl,
                floatvalue,
                paintseed,
                paintindex
            });

            await new Promise(r =&gt; setTimeout(r, 10000));
            console.log(&apos;Fetched float values for item:&apos;, item.market_hash_name);
        } catch (error) {
            console.log(error);
            console.error(&apos;Failed to fetch float values for item:&apos;, item.market_hash_name);
        }
    }

    return parsedInventoryWithFloats;
}</code></pre><figcaption><p><span style="white-space: pre-wrap;">First we replace the missing fields in the inspect_url, then we fetch the floatvalue using the API endpoint.</span></p></figcaption></figure><p>If we run this and print the inventory afterwards, we&apos;ll see floatvalues for the items that have that property, e.g.:</p><pre><code class="language-javascript">{
    appid: 730,
    classid: &apos;1310017306&apos;,
    instanceid: &apos;5844343608&apos;,
    assetid: &apos;28124449669&apos;,
    contextid: &apos;2&apos;,
    icon_url: &apos;-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KU0Zwwo4NUX4oFJZEHLbXH5ApeO4YmlhxYQknCRvCo04DEVlxkKgpoo6m1FBRp3_bGcjhQ09-jq5WYh8j_OrfdqWhe5sN4mOTE8bP5gVO8v106NT37LY-cJAZvZF-ErAC7wLi60MO57s7NwSBgvSgksynamEfmiRBJcKUx0nUflmj0&apos;,
    tradable: 1,
    inspect_url: &apos;steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20S76561198166295458A28124449669D17212839835523578275&apos;,
    name: &apos;USP-S | Kill Confirmed&apos;,
    market_hash_name: &apos;USP-S | Kill Confirmed (Minimal Wear)&apos;,
    name_color: &apos;D2D2D2&apos;,
    floatvalue: 0.13473990559577942,
    paintseed: 461,
    paintindex: 504
}</code></pre><h3 id="a-note-on-rate-limits">A note on rate limits</h3><p>The timeout in the loop is to make sure that you do not hit the rate limit imposed by CSInventoryAPI. If you have a business/enterprise plan, the timeout duration can be adjusted accordingly.</p><p>If you have any questions, want further help with implementation, or want to start a <a href="https://jkm.solutions/services/steam?ref=jkm.solutions" rel="noreferrer">new project</a>, feel free to <a href="https://jkm.solutions/contact?ref=jkm.solutions" rel="noreferrer">contact us</a>. </p>]]></content:encoded></item><item><title><![CDATA[Step-by-Step Guide to Setting Up Steam Desktop Authenticator for a Steam Bot]]></title><description><![CDATA[Step by step guide to set up Steam Desktop Authenticator required build Steambots with automated trading capabilities, updated for 2024.]]></description><link>https://jkm.solutions/blog/steam-desktop-authenticator/</link><guid isPermaLink="false">6603e19e322fee174785cd6a</guid><category><![CDATA[steambot]]></category><category><![CDATA[steam api]]></category><dc:creator><![CDATA[Kevin Rasmusson]]></dc:creator><pubDate>Wed, 27 Mar 2024 14:37:40 GMT</pubDate><media:content url="https://jkm.solutions/blog/content/images/2024/03/STEAM-DESKTOP-AUTHENTICATOR.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://jkm.solutions/blog/content/images/2024/03/STEAM-DESKTOP-AUTHENTICATOR.jpg" alt="Step-by-Step Guide to Setting Up Steam Desktop Authenticator for a Steam Bot"><p>When building an application utilizing a Steam Bot, e.g., trading applications or gambling websites not using peer-to-peer trading for deposits/withdraws, you will need dedicated Steam accounts that will be used for this purpose. These accounts, which will have their trading and therefore confirmation of trades automated, must still have a mobile authenticator set up to avoid delays with their trading. Seeing as setting up a mobile authenticator on your phone hides away some files you need to access to set the bots up for trading, a program called <a href="https://github.com/Jessecar96/SteamDesktopAuthenticator?ref=jkm.solutions" rel="noreferrer">Steam Desktop Authenticator</a> is commonly used for this purpose.</p><hr><h3 id="prerequisites">Prerequisites</h3><p>Firstly, you will already need a Steam account. Seeing as the registration process is relatively straightforward, I will not be addressing this in the article. I typically use a <a href="https://proton.me/mail?ref=jkm.solutions" rel="noreferrer">proton email address</a> (remember to verify it with a real email to not lock your inbox). Furthermore, if the intention is to trade with the account, it might be a good idea to add $5 to the account balance to remove its restriction. I do a more detailed walkthrough of this in my guide on <a href="https://jkm.solutions/blog/how-to-obtain-your-steam-api-key-a-step-by-step-guide/" rel="noreferrer">adding a Steam Web API key</a> to a Steam account (something that you should also do for your bot account after we are done setting up Steam Desktop Authenticator).</p><p>Since the application is Windows only, you&apos;ll also need either a computer running Windows, or run it in a VM. I went with the first option, but whatever floats the boat for you work.</p><h3 id="step-1download-the-legit-version-of-steam-desktop-authenticator">Step 1 - Download the <u>legit</u><em> </em>version of Steam Desktop Authenticator</h3><p>Seeing as Steam Desktop Authenticator handles incredibly sensitive data which potentially allows a malicious actor to automatically send trades on your account&apos;s behalf, there are several phishing sites and actors that try to get you to download a &quot;fake&quot; version of Steam Desktop Authenticator, to access your Steam account&apos;s credentials and probably empty the inventory.</p><p>As such, <a href="https://github.com/Jessecar96/SteamDesktopAuthenticator?ref=jkm.solutions" rel="noreferrer">this</a> is the only legit link to the official GitHub repo maintained by Jessecar96 (the creator of the program). We are going to download the <a href="https://github.com/Jessecar96/SteamDesktopAuthenticator/releases/tag/1.0.15?ref=jkm.solutions" rel="noreferrer">1.0.15 version</a>. Click and download the according zip file:</p><figure class="kg-card kg-image-card"><img src="https://jkm.solutions/blog/content/images/2025/04/Screenshot-2025-04-06-at-20.11.41.png" class="kg-image" alt="Step-by-Step Guide to Setting Up Steam Desktop Authenticator for a Steam Bot" loading="lazy" width="2000" height="1245" srcset="https://jkm.solutions/blog/content/images/size/w600/2025/04/Screenshot-2025-04-06-at-20.11.41.png 600w, https://jkm.solutions/blog/content/images/size/w1000/2025/04/Screenshot-2025-04-06-at-20.11.41.png 1000w, https://jkm.solutions/blog/content/images/size/w1600/2025/04/Screenshot-2025-04-06-at-20.11.41.png 1600w, https://jkm.solutions/blog/content/images/size/w2400/2025/04/Screenshot-2025-04-06-at-20.11.41.png 2400w" sizes="(min-width: 720px) 720px"></figure><h3 id="step-2add-the-bot-account">Step 2 - Add the bot account</h3><p>After downloading and unzipping the folder, it&apos;s time to start the Steam Desktop Authenticator by clicking the &quot;Steam Desktop Authenticator.exe&quot; file. Assuming it is your first time using the application to set up a SteamBot, click &quot;This is my first time and I just want to sign into my Steam Account(s)&quot; when prompted:</p><figure class="kg-card kg-image-card"><img src="https://jkm.solutions/blog/content/images/2024/04/first-prompt.png" class="kg-image" alt="Step-by-Step Guide to Setting Up Steam Desktop Authenticator for a Steam Bot" loading="lazy" width="394" height="287"></figure><p>Afterward, the application will open, whereupon you will press &quot;Setup New Account&quot; in the top left corner. When prompted to enter login details, enter the username and password of the Steam account that you wish to use as a SteamBot.</p><figure class="kg-card kg-image-card"><img src="https://jkm.solutions/blog/content/images/2024/04/sign-in.png" class="kg-image" alt="Step-by-Step Guide to Setting Up Steam Desktop Authenticator for a Steam Bot" loading="lazy" width="340" height="496"></figure><h3 id="step-3save-the-revocation-code">Step 3 - Save the revocation code</h3><p>After signing in, you will be prompted to save your revocation code. This is crucial if someone ever obtains unauthorized access to your Steam account (the risk of which is increased substantially by using it as a SteamBot with sign-in details used in the operation of a web application). You will be prompted to re-enter the revocation code too, to ensure that it has been written down correctly.</p><figure class="kg-card kg-image-card"><img src="https://jkm.solutions/blog/content/images/2024/04/revoke.png" class="kg-image" alt="Step-by-Step Guide to Setting Up Steam Desktop Authenticator for a Steam Bot" loading="lazy" width="407" height="145"></figure><h3 id="step-4sms-code-sent-to-your-phone-email-actually">Step 4 - SMS code sent to your &quot;phone&quot; (email actually)</h3><p>Even though Steam Desktop Authenticator asks you to enter the code sent via SMS, the code is sent to your email. This is a relic from past versions of the applications where a phone number was required to set up the mobile authenticator, which curiously is not the case anymore. The email should look something like this:</p><figure class="kg-card kg-image-card"><img src="https://jkm.solutions/blog/content/images/2024/04/Screenshot-2024-04-14-at-16.54.27.png" class="kg-image" alt="Step-by-Step Guide to Setting Up Steam Desktop Authenticator for a Steam Bot" loading="lazy" width="1247" height="769" srcset="https://jkm.solutions/blog/content/images/size/w600/2024/04/Screenshot-2024-04-14-at-16.54.27.png 600w, https://jkm.solutions/blog/content/images/size/w1000/2024/04/Screenshot-2024-04-14-at-16.54.27.png 1000w, https://jkm.solutions/blog/content/images/2024/04/Screenshot-2024-04-14-at-16.54.27.png 1247w" sizes="(min-width: 720px) 720px"></figure><h3 id="step-5re-enter-revocation-code">Step 5 - Re-enter revocation code</h3><p>As a last step of the setup process, you will be asked to enter the revocation code as specified in Step 3. As mentioned before, this is to ensure that you wrote it down, as it is in your best interest to have this information if you ever need support to get your account back from a malicious actor.</p><figure class="kg-card kg-image-card"><img src="https://jkm.solutions/blog/content/images/2024/04/revokeagain.png" class="kg-image" alt="Step-by-Step Guide to Setting Up Steam Desktop Authenticator for a Steam Bot" loading="lazy" width="405" height="281"></figure><h3 id="step-6write-down-mafile-information">Step 6 - Write down .maFile information</h3><p>There we go! Now, with a mobile authenticator set up, we can obtain the information we need to automate trading with the SteamBots through code. The fields we are looking for are called <em>sharedSecret</em> (used for automatically generating the 2fa code required to sign in) and <em>identitySecret</em> (used to automate confirmation of trades where the bot has items to give.</p><p>To find said properties, you need to navigate to the folder holding all Steam Desktop Authenticator files and navigate to the maFiles subfolder:</p><figure class="kg-card kg-image-card"><img src="https://jkm.solutions/blog/content/images/2024/04/mafiles.png" class="kg-image" alt="Step-by-Step Guide to Setting Up Steam Desktop Authenticator for a Steam Bot" loading="lazy" width="925" height="565" srcset="https://jkm.solutions/blog/content/images/size/w600/2024/04/mafiles.png 600w, https://jkm.solutions/blog/content/images/2024/04/mafiles.png 925w" sizes="(min-width: 720px) 720px"></figure><p>If you have multiple accounts (like is the case here), the format is {BOT_STEAMID64}.maFile, so go ahead and open the one that&apos;s relevant for the bot account you are setting up right now. Use <a href="https://steamid.io/?ref=jkm.solutions" rel="noreferrer">https://steamid.io</a> if you need to obtain the account&apos;s steamid64.</p><p>Opening the file, it should start with:</p><pre><code>{&quot;shared_secret&quot;:&quot;XXXX&quot;,...</code></pre><p>If not, and the content looks random, the file is likely encrypted. You can turn off encryption in the app under &quot;Manage Encryption&quot;, in the top right corner.</p><p>Closer to the middle of the file&apos;s object you will find </p><pre><code>&quot;identity_secret&quot;:&quot;XXXX&quot;</code></pre><p>which is the second value you will need to automate trading.</p><h3 id="next-steps">Next steps</h3><p>If you are looking to develop SteamBots with trading capabilities yourself, and you enjoy developing with NodeJS, I suggest you check out <a href="https://github.com/DoctorMcKay/node-steam-tradeoffer-manager?ref=jkm.solutions" rel="noreferrer">McKay&apos;s tradeoffer manager</a> and all of his other packages.</p><p>If you need help setting up, building, developing, and deploying applications utilizing SteamBots, do not hesitate to reach out either via email to <a href="mailto:kevin@jkmholding.com" rel="noreferrer">kevin@jkmholding.com</a> or via discord to <a href="https://discordapp.com/users/237596991050219521?ref=jkm.solutions" rel="noreferrer">kevalane</a>.</p>]]></content:encoded></item><item><title><![CDATA[How to Obtain Your Steam API Key: A Step-by-Step Guide]]></title><description><![CDATA[In this guide, I'll show you how to create a Steam API key for your Steam account and help you remove an account restriction that might be stopping you.]]></description><link>https://jkm.solutions/blog/how-to-obtain-your-steam-api-key/</link><guid isPermaLink="false">6602916a322fee174785ccfc</guid><category><![CDATA[steam api key]]></category><category><![CDATA[steam web api key]]></category><category><![CDATA[get steam api key]]></category><category><![CDATA[obtain steam api key]]></category><category><![CDATA[generate steam api key]]></category><dc:creator><![CDATA[Kevin Rasmusson]]></dc:creator><pubDate>Tue, 26 Mar 2024 10:10:54 GMT</pubDate><media:content url="https://jkm.solutions/blog/content/images/2024/03/apikey.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://jkm.solutions/blog/content/images/2024/03/apikey.jpg" alt="How to Obtain Your Steam API Key: A Step-by-Step Guide"><p>The Steam API key is a necessary component both for developers building applications utilizing the Steam API, but also increasingly for individuals using trading websites/services where their trade offers must be tracked. In this guide, I&apos;ll show you how to create a Steam API key for your Steam account and help you remove an account restriction that might be stopping you.</p><hr><h3 id="prerequisites">Prerequisites</h3><p>Before creating a Steam API key, there are certain prerequisites that must be met:</p><ul><li>You must have a Steam account.</li><li>Your account must not be limited (it must have spent $5.00 on games, see <a href="https://help.steampowered.com/en/faqs/view/71D3-35C2-AD96-AA3A?ref=jkm.solutions" rel="noreferrer">this support article</a>).</li><li>You should have read the <a href="https://steamcommunity.com/dev/apiterms?ref=jkm.solutions" rel="noreferrer">Steam Web API Terms of Use</a> to avoid breaches.</li></ul><h3 id="obtaining-your-steam-api-key">Obtaining your Steam API key</h3><p>Firstly, navigate to <a href="https://steamcommunity.com/dev/apikey?ref=jkm.solutions">https://steamcommunity.com/dev/apikey</a>, which is Steam&apos;s official page for registering for an API key.</p><h3 id="step-1unrestrict-your-account">Step 1 - Unrestrict your account</h3><p>If you are met with the following text when you navigate to the Steam API registration page linked above, your first step will be to remove the restriction on the account. If your account is not restricted, move along to <strong>Step 2.</strong></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://jkm.solutions/blog/content/images/2024/03/Screenshot-2024-03-26-at-10.34.16.png" class="kg-image" alt="How to Obtain Your Steam API Key: A Step-by-Step Guide" loading="lazy" width="1924" height="1158" srcset="https://jkm.solutions/blog/content/images/size/w600/2024/03/Screenshot-2024-03-26-at-10.34.16.png 600w, https://jkm.solutions/blog/content/images/size/w1000/2024/03/Screenshot-2024-03-26-at-10.34.16.png 1000w, https://jkm.solutions/blog/content/images/size/w1600/2024/03/Screenshot-2024-03-26-at-10.34.16.png 1600w, https://jkm.solutions/blog/content/images/2024/03/Screenshot-2024-03-26-at-10.34.16.png 1924w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">A restricted account cannot use the Steam Web API.</span></figcaption></figure><p>My preferred way to solve this is by adding $5 to the Steam wallet, which can later be spent on buying skins on the Steam market, thereby giving an effective &quot;cost&quot; of around a dollar. Head over to <a href="https://store.steampowered.com/steamaccount/addfunds?ref=jkm.solutions">https://store.steampowered.com/steamaccount/addfunds</a> to add funds to the account, and select the minimum fund level, in my case it is &#x20AC;5.</p><h3 id="step-2enter-a-domain-name">Step 2 - Enter a domain name</h3><p>Seeing as the API key is a &quot;Web&quot; API key, Steam wants a domain name for the application that will utilize the API key.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://jkm.solutions/blog/content/images/2024/03/Screenshot-2024-03-26-at-10.43.58.png" class="kg-image" alt="How to Obtain Your Steam API Key: A Step-by-Step Guide" loading="lazy" width="1934" height="1138" srcset="https://jkm.solutions/blog/content/images/size/w600/2024/03/Screenshot-2024-03-26-at-10.43.58.png 600w, https://jkm.solutions/blog/content/images/size/w1000/2024/03/Screenshot-2024-03-26-at-10.43.58.png 1000w, https://jkm.solutions/blog/content/images/size/w1600/2024/03/Screenshot-2024-03-26-at-10.43.58.png 1600w, https://jkm.solutions/blog/content/images/2024/03/Screenshot-2024-03-26-at-10.43.58.png 1934w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Steam requires a domain name for the application that will use the Steam API key.</span></figcaption></figure><p>From my experience, this is not enforced, meaning any domain can be inserted. However, if you are giving the API key to someone else&apos;s application, e.g., a trading website, or using it for your own development project, it is recommended to use the domain &quot;localhost&quot;.</p><h3 id="step-3mobile-authenticator-confirmation">Step 3 - Mobile authenticator confirmation</h3><p>After entering a domain name, you will be met with the following prompt:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://jkm.solutions/blog/content/images/2024/03/Screenshot-2024-03-26-at-10.49.08.png" class="kg-image" alt="How to Obtain Your Steam API Key: A Step-by-Step Guide" loading="lazy" width="1946" height="1388" srcset="https://jkm.solutions/blog/content/images/size/w600/2024/03/Screenshot-2024-03-26-at-10.49.08.png 600w, https://jkm.solutions/blog/content/images/size/w1000/2024/03/Screenshot-2024-03-26-at-10.49.08.png 1000w, https://jkm.solutions/blog/content/images/size/w1600/2024/03/Screenshot-2024-03-26-at-10.49.08.png 1600w, https://jkm.solutions/blog/content/images/2024/03/Screenshot-2024-03-26-at-10.49.08.png 1946w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Creating an API key requires confirmation in the Steam Authenticator app.</span></figcaption></figure><p>This is a relatively new security addition by Steam, which probably was implemented as a safeguard against the increasing number of &quot;API scams&quot; that were conducted. Just confirm the action in your app like you would any other Steam trade.</p><h3 id="step-4copy-api-key">Step 4 - Copy API key</h3><p>After confirmation, your Steam Web API key has been generated!</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://jkm.solutions/blog/content/images/2024/03/Screenshot-2024-03-26-at-10.59.03-1.png" class="kg-image" alt="How to Obtain Your Steam API Key: A Step-by-Step Guide" loading="lazy" width="1938" height="1156" srcset="https://jkm.solutions/blog/content/images/size/w600/2024/03/Screenshot-2024-03-26-at-10.59.03-1.png 600w, https://jkm.solutions/blog/content/images/size/w1000/2024/03/Screenshot-2024-03-26-at-10.59.03-1.png 1000w, https://jkm.solutions/blog/content/images/size/w1600/2024/03/Screenshot-2024-03-26-at-10.59.03-1.png 1600w, https://jkm.solutions/blog/content/images/2024/03/Screenshot-2024-03-26-at-10.59.03-1.png 1938w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Steam API key visible for an account after confirming in the Steam Authenticator app.</span></figcaption></figure><p>Now, you should <strong>NEVER </strong>share your Steam API key with the public as I have done in this image. This will give attackers information about trades you are conducting, items you received, and other information. Steam is limiting the API key&apos;s use cases to prevent scams, but this is still not something you want to share with the world. Always think twice (and ask why) if someone asks you to provide them with your API key.</p><hr><p>And that&apos;s it! I hope you found this guide useful. If you need any help, don&apos;t hesitate to contact me using any of the methods available on our <a href="https://jkm.solutions/contact?ref=jkm.solutions" rel="noreferrer">contact page</a>. If you are interested in hiring us to build a web application utilizing the Steam API, e.g., trading websites, gambling websites, keys-to-crypto trading bots, and other applications, head over to our <a href="https://jkm.solutions/services/steam?ref=jkm.solutions" rel="noreferrer">services page</a> to learn more.</p><h3 id></h3>]]></content:encoded></item><item><title><![CDATA[Sign in through Steam using NodeJS]]></title><description><![CDATA[Allowing your users to sign in through steam is essential if you are operating a website connected to Steam’s services in any way. In this article, I will teach you how to set up a “Sign in through Steam” system on your website using NodeJS.]]></description><link>https://jkm.solutions/blog/sign-in-through-steam-using-nodejs/</link><guid isPermaLink="false">6600a24e322fee174785cc98</guid><category><![CDATA[steam api]]></category><category><![CDATA[steam openid]]></category><category><![CDATA[sign in through steam]]></category><category><![CDATA[nodejs]]></category><dc:creator><![CDATA[Kevin Rasmusson]]></dc:creator><pubDate>Sun, 24 Mar 2024 22:13:33 GMT</pubDate><media:content url="https://jkm.solutions/blog/content/images/2024/03/signin.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://jkm.solutions/blog/content/images/2024/03/signin.jpg" alt="Sign in through Steam using NodeJS"><p>Allowing your users to sign in through steam is essential if you are operating a website connected to Steam&#x2019;s services in any way. This way of authentication allows you to seamlessly collect user&#x2019;s SteamID64, thus allowing you to see their Steam inventory, profile picture etc. In this article, I will teach you how to set up a &#x201C;Sign in through Steam&#x201D; system on your website using NodeJS.</p><p>This article was updated after the <a href="https://github.com/liamcurry/passport-steam?ref=jkm.solutions" rel="noreferrer">passport steam</a> library proved to have another vulnerability (which is not to be unexpected after 8 years of no maintenance). </p><p>The solution herein utilized a library built by the one and only <a href="https://github.com/DoctorMcKay?ref=jkm.solutions" rel="noreferrer">Doctor McKay</a>, a true hero within the community of Steam API development.</p><hr><h3 id="npm-installs">NPM Installs</h3><p>If you have not done it already, initialize a project in your folder of choice using a terminal:</p><pre><code class="language-shell">npm init -y</code></pre><p>To utilize modules, add the following line somewhere inside your package.json file:</p><pre><code class="language-json">{
  ...
  &quot;type&quot;: &quot;module&quot;,
  ...
}
</code></pre><p>Afterwards, we are going to need some npm installs. The following installs are required:</p><figure class="kg-card kg-code-card"><pre><code>npm install express
npm install express-session
npm install steam-signin
npm install dotenv
npm install axios</code></pre><figcaption><p><span style="white-space: pre-wrap;">Node installs</span></p></figcaption></figure><p>Don&#x2019;t have npm installed? Head over to&#xA0;<a href="https://nodejs.org/en/?ref=jkm.solutions" rel="noopener ugc nofollow">nodejs.org</a>&#xA0;and install it for your operating system of choice.</p><h3 id="start-building-the-server">Start building the server</h3><p>Assuming we are working on a vanilla project, we will need to start with the necessary code to build a simple server. All the code can be found on&#xA0;<a href="https://github.com/kevalane/sign-in-through-steam?ref=jkm.solutions" rel="noopener ugc nofollow">GitHub</a>.</p><figure class="kg-card kg-code-card"><pre><code class="language-Javascript">// Require all the installs
// Require all the installs
import express from &quot;express&quot;;
import session from &quot;express-session&quot;;
import SteamSignIn from &quot;steam-signin&quot;;
import dotenv from &quot;dotenv&quot;;
dotenv.config();
import axios from &quot;axios&quot;;

// Create a new SteamSignIn object
const realm = process.env.API_URL;
const signIn = new SteamSignIn(realm)

// Create an express app
const app = express();

// Set up the session
app.use(session({
    secret: process.env.SECRET,
    resave: false,
    saveUninitialized: true,
}));

// Let&apos;s set a port
const port = 3000;

// Spin up the server
app.listen(port, () =&gt; {
    console.log(&apos;Listening, port &apos; + port);
});</code></pre><figcaption><p><span style="white-space: pre-wrap;">index.js</span></p></figcaption></figure><p>We will also need to create a .env file (you can rename the .env.example if you are following along within the github repository):</p><figure class="kg-card kg-code-card"><pre><code class="language-shell">SECRET=whatever-you-want
API_URL=http://localhost:3000
STEAM_API_KEY=your-steam-api-key # we will retrieve this later</code></pre><figcaption><p><span style="white-space: pre-wrap;">.env</span></p></figcaption></figure><p>You can run this code using (given that you named your application file index.js):</p><pre><code>node index.js</code></pre><p>If you get any errors at this point, make sure that all the packages are installed correctly.</p><hr><h3 id="set-steam-api-key">Set Steam API key</h3><p>To obtain player details (like account name and avatar), you will need to set up an API Key for your Steam account. I wrote another blog post that is available <a href="https://jkm.solutions/blog/how-to-obtain-your-steam-api-key/" rel="noreferrer">here</a>, taking you through all the necessary steps. Add it to the .env file above.</p><h3 id="creating-the-primary-route">Creating the primary route</h3><p>To be able to access the sign-in functionality, we need to expose a few routes. Firstly, we will build the route that users will get redirected to from the front-end.</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">app.get(&apos;/api/v1/auth/steam&apos;, (req, res) =&gt; {
    res.statusCode = 302;
    res.setHeader(
        &quot;Location&quot;,
        signIn.getUrl(process.env.API_URL + &apos;/api/v1/auth/steam/return&apos;)
    )
    res.end();
});</code></pre><figcaption><p><span style="white-space: pre-wrap;">index.js</span></p></figcaption></figure><p>This code initializes the sign in, and then redirects to our own route, which we will build next:</p><h3 id="build-return-route">Build return route</h3><figure class="kg-card kg-code-card"><pre><code class="language-javascript">app.get(&apos;/api/v1/auth/steam/return&apos;, async (req, res) =&gt; {
    res.setHeader(&apos;Content-Type&apos;, &apos;text/plain&apos;);
    try {
        let steamId = await signIn.verifyLogin(req.url);

        const steamid64 = steamId.getSteamID64();
        const response = await axios.get(`https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=${process.env.STEAM_API_KEY}&amp;steamids=${steamid64}`)
        const { avatarfull, personaname } = response.data.response.players[0];

        req.session.user = {
            steamid64,
            avatarfull,
            personaname,
        }
        await req.session.save()
    
        res.redirect(process.env.API_URL);
    } catch (error) {
        console.error(error);
        return res.status(500).send(&apos;There was an error signing in.&apos;);
    }
});</code></pre><figcaption><p><span style="white-space: pre-wrap;">index.js</span></p></figcaption></figure><p>A lot going on here. The important section (that verifies the sign in), is the line where we get tha authenticated user&apos;s steamId.</p><p>After this, we fetch typical info that applications display of the signed in user, namely their steam profile avatar, and their display name (personaname).</p><p>This is then saved to our session, which allows us to maintain the signed in state across requests. Like with the primary route, a redirect is present to another route:</p><h3 id="home-route">Home route</h3><figure class="kg-card kg-code-card"><pre><code class="language-javascript">app.get(&apos;/&apos;, (req, res) =&gt; {
    const { user } = req.session;
    res.status(200).send(user);
});</code></pre><figcaption><p><span style="white-space: pre-wrap;">index.js</span></p></figcaption></figure><p>With this route, we are simply returning the data of the signed user (if they are signed in).</p><h3 id="connecting-to-the-front-end">Connecting to the front-end</h3><p>The &#x2018;/api/v1/auth/steam&#x2019; route is the one we redirect users to from the front-end using a simple href:</p><pre><code class="language-HTML">&lt;a href=&quot;http://localhost:3000/api/v1/auth/steam&quot;&gt;Sign in&lt;/a&gt;</code></pre><p>Having added this code, start your server and navigate to said URL, and you should be met with the following familiar official Steam page:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://jkm.solutions/blog/content/images/2024/03/1_MjzrRAp11ceX4HSmtqF0Gg.webp" class="kg-image" alt="Sign in through Steam using NodeJS" loading="lazy" width="953" height="366" srcset="https://jkm.solutions/blog/content/images/size/w600/2024/03/1_MjzrRAp11ceX4HSmtqF0Gg.webp 600w, https://jkm.solutions/blog/content/images/2024/03/1_MjzrRAp11ceX4HSmtqF0Gg.webp 953w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Sign in page visible by navigating to localhost:3000/api/v1/auth/steam</span></figcaption></figure><p>Now, sign in using your own Steam account and you will be redirected to the main page, localhost:3000/, where you will be met with the following:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://jkm.solutions/blog/content/images/2024/07/Screenshot-2024-07-12-at-02.04.13.png" class="kg-image" alt="Sign in through Steam using NodeJS" loading="lazy" width="1910" height="560" srcset="https://jkm.solutions/blog/content/images/size/w600/2024/07/Screenshot-2024-07-12-at-02.04.13.png 600w, https://jkm.solutions/blog/content/images/size/w1000/2024/07/Screenshot-2024-07-12-at-02.04.13.png 1000w, https://jkm.solutions/blog/content/images/size/w1600/2024/07/Screenshot-2024-07-12-at-02.04.13.png 1600w, https://jkm.solutions/blog/content/images/2024/07/Screenshot-2024-07-12-at-02.04.13.png 1910w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Data about steam user available after sign in.</span></figcaption></figure><p>This is just the body of &#x2018;req.session.user&#x2019; (see the &#x2018;/&#x2019; route, where you can see the res.send()). From this JSON data you can get the user&#x2019;s Steamname, avatar and their steamid64.</p><hr><p>This example only serves as a simple setup for you to build upon. For example, a real website will probably have a database where user information is stored, therefore you would need to manipulate the JSON data after authentication and insert the necessary information into your database of choice.</p><p>If you have any questions, do not hesitate to get in touch, either by emailing me directly <a href="mailto:kevin@jkmholding.com" rel="noreferrer">kevin@jkmholding.com</a>, by adding me on <a href="https://discordapp.com/users/237596991050219521?ref=jkm.solutions" rel="noreferrer">discord</a>, or by using any of the other methods of contact available on our <a href="https://jkm.solutions/contact?ref=jkm.solutions" rel="noreferrer">contact page</a>.</p><p>If you are interested in hiring us to create a project utilizing the Steam API, e.g., trading bots, gambling websites, skin trading websites, and more, head over to our <a href="https://jkm.solutions/services/steam?ref=jkm.solutions" rel="noreferrer">services page</a> to see what we can do. </p>]]></content:encoded></item></channel></rss>