Skip to main content

📡 jobfeeds

One typed, async Python interface to six public job boards.

pip install jobfeeds

PyPI Python Tests Typed License


Fetching job postings should not require writing six API clients. jobfeeds gives you Remotive, Arbeitnow, Greenhouse boards, RemoteOK, We Work Remotely, and the Hacker News "Who is hiring" thread through one interface, normalized into one pydantic model, with failures isolated per source.

Extracted from, and used in production by, JobRadar, a live job-market intelligence dashboard.

Quickstart

import asyncio
from jobfeeds import Remotive, Greenhouse, fetch_all

async def main():
    # One source
    jobs = await Remotive().fetch()               # list[Posting]
    print(jobs[0].company, jobs[0].title, jobs[0].url)

    # Configured source
    jobs = await Greenhouse(boards=["stripe", "anthropic"]).fetch()

    # Everything, concurrently, failure-isolated
    results = await fetch_all()                   # list[SourceResult]
    for r in results:
        print(r.source, len(r.postings) if r.ok else f"FAILED: {r.error}")

asyncio.run(main())

The model

Every source normalizes into the same Posting:

Field Notes
source adapter name ("remotive", "greenhouse", ...)
external_id the source's own id
company, title, url always present
location_raw as the source states it, unparsed
posted_at datetime or None, when the source provides one
raw source-specific payload; descriptions truncated to 8,000 chars
.hash cross-source dedupe key (normalized company + title + location)

Boards syndicate each other's postings; posting_hash() collapses the duplicates without trusting any board-specific id.

Sources and their quirks

Adapter Config Worth knowing
Remotive() Curated remote listings, JSON API
Arbeitnow(pages=3) page count DACH-market coverage; paginates explicitly because the API's own links.next can point at filtered views
Greenhouse(boards=[...], per_board_limit=40, title_pattern=None) board tokens, cap, optional title regex Direct-employer postings (Stripe, Anthropic, GitLab, ...). No global search endpoint exists, you choose boards. A default starter set is included
RemoteOK() Their terms require a visible link back to remoteok.com in what you build. The API's first element is a legal notice, already skipped
WeWorkRemotely(categories=[...]) category slugs RSS per category; defaults to programming, devops, design, product
HNWhoIsHiring() Finds the latest monthly thread via Algolia, parses only structured "Company | Role | Location" comments; freeform replies are ignored

All adapters accept timeout= and user_agent=. Public APIs change; every adapter parses defensively and skips malformed entries instead of raising.

Failure isolation

fetch_all() never lets one dead API take down the run:

results = await fetch_all([Remotive(), Greenhouse(boards=["stripe"])])
postings = [p for r in results if r.ok for p in r.postings]
errors = {r.source: r.error for r in results if not r.ok}

Your own adapter joins the party by satisfying the SourceAdapter protocol: anything with a name and an async fetch() -> list[Posting].

Design notes

  • httpx + pydantic only. No framework, no ORM, no surprises in your dependency tree.
  • Fully typed, ships py.typed.
  • No product logic. Filtering, enrichment, and storage belong to your application; this package only does feed access done well. (JobRadar's tech-role filter, LLM enrichment, and database live in its repo, on top of this package.)
  • Tests never touch the network. Every adapter is tested against mocked responses (respx) in CI on Python 3.11, 3.12, and 3.13.

License

MIT. Built by Nandor Nagy as part of a public portfolio; the ingestion layer of jobradar.nagysolution.com.

Metadata

Release files for jobfeeds 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for jobfeeds 0.1.0
File Size Uploaded Provenance Actions
jobfeeds-0.1.0.tar.gz 13.5 kB With provenance Details for jobfeeds-0.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for jobfeeds 0.1.0
File Interpreter ABI Platform Actions
jobfeeds-0.1.0-py3-none-any.whl Python 3 none any Details for jobfeeds-0.1.0-py3-none-any.whl

Total release size: 29.8 kB

Release files / jobfeeds-0.1.0.tar.gz

Download URL jobfeeds-0.1.0.tar.gz
Size 13.5 kB
Tags Source
SHA-256 checksum
How to use checksums
430e823815d679821e47a31defcc7025e2a8f4c4a42f6901ad7bec25c7d512ef
BLAKE2b-256 checksum
How to use checksums
e2120637e2d38092a187e31915b432ff9fdf2abb5eaee642f1b3727f8db7f275
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 5, 2026.

Transparency log

Release files / jobfeeds-0.1.0-py3-none-any.whl

Download URL jobfeeds-0.1.0-py3-none-any.whl
Size 16.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2389014ba988e9249c5a68a5450c1e5872b1ee02fcb4d510d790ba0d4ee915b0
BLAKE2b-256 checksum
How to use checksums
8285d2892dee64956dba9ada82b126e362f69cceb8244dea680cfdf99b9995e6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 5, 2026.

Transparency log

Security for jobfeeds 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for jobfeeds-0.1.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 5, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page