<?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"><channel><title><![CDATA[Dev Global Jobs Developers]]></title><description><![CDATA[Dev Global Jobs Developers]]></description><link>https://devglobaljobs1.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6ad0ac735fef7aeb726a0825/8fe1b65b-84df-48a8-b8a9-fd712e0fff1b.png</url><title>Dev Global Jobs Developers</title><link>https://devglobaljobs1.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Sat, 07 Nov 2026 12:40:26 GMT</lastBuildDate><atom:link href="https://devglobaljobs1.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Build a Remote Job Board Widget with a Free Jobs API (No API Key)]]></title><description><![CDATA[Fetch live jobs by country or category in a few lines of JavaScript or Python]]></description><link>https://devglobaljobs1.hashnode.dev/build-a-remote-job-board-widget-with-a-free-jobs-api-no-api-key</link><guid isPermaLink="true">https://devglobaljobs1.hashnode.dev/build-a-remote-job-board-widget-with-a-free-jobs-api-no-api-key</guid><category><![CDATA[api]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Python]]></category><category><![CDATA[webdev]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Dev Global Jobs]]></dc:creator><pubDate>Thu, 15 Oct 2026 10:40:04 GMT</pubDate><content:encoded><![CDATA[<p>I wanted a small "latest jobs" box for a side project, and most job APIs I tried either wanted a paid plan, an OAuth dance, or a sales call. So here is the setup I ended up with. It uses the free jobs API from <a href="https://devglobaljobs.com">Dev Global Jobs</a>, which needs no key and returns plain JSON.</p>
<h2>What the API gives you</h2>
<p>There are three endpoints, all documented on the <a href="https://devglobaljobs.com/developers">developers page</a>:</p>
<ul>
<li><code>GET /api/v1/jobs</code> returns a list of live jobs. You can filter with <code>country</code>, <code>category</code>, <code>search</code>, <code>featured</code>, <code>easyApply</code>, <code>limit</code> (up to 100) and <code>offset</code>.</li>
<li><code>GET /api/v1/jobs/{id}</code> returns one job.</li>
<li><code>GET /jobs.rss</code> is an RSS 2.0 feed of the newest jobs, with an optional <code>category</code>.</li>
</ul>
<p>The limit is 120 requests per minute per IP, and CORS is enabled, so you can call it straight from the browser. The one rule worth remembering: keep the link back to the job page and name the source when you show the listings.</p>
<h2>A quick test with curl</h2>
<pre><code class="language-bash">curl "https://devglobaljobs.com/api/v1/jobs?limit=5&amp;country=de"
</code></pre>
<p>The response has a <code>meta</code> block (<code>total</code>, <code>limit</code>, <code>offset</code>, <code>hasMore</code>, <code>updatedAt</code>) and a <code>jobs</code> array. Each job has fields like <code>title</code>, <code>organization</code>, <code>location</code>, <code>country</code>, <code>category</code>, <code>jobType</code>, <code>salary</code>, <code>postedAt</code>, <code>closingDate</code> and <code>url</code>. When I tried it, the Germany filter alone returned over twenty thousand live jobs, so pagination with <code>offset</code> matters.</p>
<h2>A browser widget in plain JavaScript</h2>
<pre><code class="language-html">&lt;div id="jobs"&gt;Loading jobs...&lt;/div&gt;
&lt;script&gt;
  async function loadJobs() {
    const res = await fetch(
      "https://devglobaljobs.com/api/v1/jobs?limit=6&amp;category=remote"
    );
    const data = await res.json();
    const box = document.getElementById("jobs");
    box.innerHTML = data.jobs
      .map(
        (job) =&gt; `
        &lt;p&gt;
          &lt;a href="${job.url}" target="_blank" rel="noopener"&gt;${job.title}&lt;/a&gt;&lt;br&gt;
          &lt;small&gt;${job.organization || ""} Â· ${job.location || job.country}&lt;/small&gt;
        &lt;/p&gt;`
      )
      .join("") +
      '&lt;small&gt;Jobs from &lt;a href="https://devglobaljobs.com"&gt;Dev Global Jobs&lt;/a&gt;&lt;/small&gt;';
  }
  loadJobs().catch(() =&gt; {
    document.getElementById("jobs").textContent = "Could not load jobs right now.";
  });
&lt;/script&gt;
</code></pre>
<p>In a real project, escape the text before you inject it as HTML, or build the elements with <code>textContent</code>. I kept it short here.</p>
<h2>The same thing in Python</h2>
<p>Handy for a daily email digest or a Telegram/Discord bot:</p>
<pre><code class="language-python">import requests

URL = "https://devglobaljobs.com/api/v1/jobs"

def latest_jobs(country=None, category=None, limit=10):
    params = {"limit": limit}
    if country:
        params["country"] = country
    if category:
        params["category"] = category
    r = requests.get(URL, params=params, timeout=15)
    r.raise_for_status()
    return r.json()["jobs"]

for job in latest_jobs(category="remote", limit=5):
    print(f"{job['title']} | {job.get('organization')} | {job['url']}")
</code></pre>
<p>If you poll it on a schedule, store the <code>id</code> values you have already seen so your bot only posts new jobs. Once an hour is plenty and keeps you far below the rate limit.</p>
<h2>Or skip code and use RSS</h2>
<p>If you just want the feed in a reader, Slack, or an automation tool, point it at:</p>
<pre><code>https://devglobaljobs.com/jobs.rss?category=remote
</code></pre>
<h2>Things I would do differently next time</h2>
<ol>
<li>Cache the response for a few minutes on your own server if your page gets traffic. One cached call per few minutes beats one call per visitor.</li>
<li>Show <code>closingDate</code> when it exists. People like knowing how much time they have.</li>
<li>Filter by country for local communities. A city or student group page with only nearby jobs feels much more useful than a generic list.</li>
</ol>
<p>That's the whole thing. It took me less than an hour to get a working widget, and most of that was CSS. The full parameter list and the terms are on the <a href="https://devglobaljobs.com/developers">Dev Global Jobs developers page</a>.</p>
]]></content:encoded></item></channel></rss>