Async Python client for the Wuzzuf job-search API
Project description
🔍 PyWuzzuf
An unofficial, async-first Python client for the Wuzzuf Jobs API
📑 Table of Contents
⚠️ Important Considerations
[!WARNING] PyWuzzuf is an unofficial, educational project and is not affiliated with, endorsed by, or connected to Wuzzuf. Users are responsible for ensuring their use of this library complies with Wuzzuf's Terms and Conditions and
robots.txtpolicies.
[!IMPORTANT] Search Accuracy Notice: The Wuzzuf API uses "soft matching," meaning irrelevant results often appear after the first few pages. PyWuzzuf solves this with Client-Side Filtering, enforcing your criteria locally to guarantee data integrity. Read more in the Filtering Guide.
Rate Limiting & Ethics
- Client-side filtering means you may fetch more pages than requested to reach your target count
- Be respectful with request volumes — this tool is for educational and personal projects, not for scraping at scale
- Consider implementing delays between requests for larger operations
🔧 Core Features
| Feature | What It Does |
|---|---|
| 🎭 Browser Impersonation | Uses curl_cffi to mimic real Chrome/Firefox TLS fingerprints. No more 403s. |
| 🔄 Smart Pagination | Automatic retries with exponential backoff. Control flow with STOP/CONTINUE/RETRY. |
| ✅ Client-Side Filtering | Enforces your criteria locally — no more irrelevant results slipping through. |
| 📊 Data Quality Audits | Built-in detection for missing companies, salaries, and malformed entries. |
| 🔒 Type Safety | Full Pydantic v2 models with IDE autocomplete and validation. |
🚀 Installation
One-liner with uv (recommended):
uv add pywuzzuf
Classic pip:
pip install pywuzzuf
Poetry:
poetry add pywuzzuf
Requires Python 3.12+
🎯 Quick Start
Get the first 10 "Python Developer" jobs posted in the last 24 hours:
import asyncio
from pywuzzuf import WuzzufClient, SearchFilters, DateRange
async def main():
async with WuzzufClient() as client:
results = await client.jobs.search("Python Developer") \
.filter(SearchFilters(posted_within=DateRange.LAST_24_HOURS)) \
.limit(10) \
.all()
for job in results.items:
company = job.company.attributes.name if job.company else "Unknown"
print(f"📌 {job.attributes.title} @ {company}")
if job.quality.has_anomalies:
print(f" ⚠️ Missing: {', '.join(job.quality.missing_fields)}")
asyncio.run(main())
Output:
📌 Senior Python Engineer @ Instabug
📌 Backend Python Developer @ Paymob
⚠️ Missing: salary_range
📌 Python Team Lead @ Vezeeta
...
🤝 Contributions
[!IMPORTANT] Not accepting contributions at this time. Contributions will reopen once the project the more stable.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pywuzzuf-0.1.0.tar.gz.
File metadata
- Download URL: pywuzzuf-0.1.0.tar.gz
- Upload date:
- Size: 24.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c5bb1690a6a2abf228225e9d31dc3f97f395eccef70ba185289cbe993c9f65ce
|
|
| MD5 |
61a98fe4d9be63f080ef9ce441b32cd0
|
|
| BLAKE2b-256 |
dd0b2a0334f61b4108c4a8e3b7f6c0076519c77105d1758e29cfcb9a4ce869be
|
Provenance
The following attestation bundles were made for pywuzzuf-0.1.0.tar.gz:
Publisher:
publish.yml on hossam-elshabory/pywuzzuf
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pywuzzuf-0.1.0.tar.gz -
Subject digest:
c5bb1690a6a2abf228225e9d31dc3f97f395eccef70ba185289cbe993c9f65ce - Sigstore transparency entry: 1191310918
- Sigstore integration time:
-
Permalink:
hossam-elshabory/pywuzzuf@d6a98378805210f292943376c6b13d3d6f585eff -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/hossam-elshabory
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d6a98378805210f292943376c6b13d3d6f585eff -
Trigger Event:
push
-
Statement type:
File details
Details for the file pywuzzuf-0.1.0-py3-none-any.whl.
File metadata
- Download URL: pywuzzuf-0.1.0-py3-none-any.whl
- Upload date:
- Size: 30.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
994a54153aef4b6e9174db044c1b221960cd612c3572c4629e7cbfaf7fab20fb
|
|
| MD5 |
a0f264cf4afb9bee984ec8d473e55d95
|
|
| BLAKE2b-256 |
c862d609b8fc2c6bafdfdb8fe52c2084ed210806bd1f04e8c86c43f6956536cb
|
Provenance
The following attestation bundles were made for pywuzzuf-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on hossam-elshabory/pywuzzuf
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pywuzzuf-0.1.0-py3-none-any.whl -
Subject digest:
994a54153aef4b6e9174db044c1b221960cd612c3572c4629e7cbfaf7fab20fb - Sigstore transparency entry: 1191310919
- Sigstore integration time:
-
Permalink:
hossam-elshabory/pywuzzuf@d6a98378805210f292943376c6b13d3d6f585eff -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/hossam-elshabory
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d6a98378805210f292943376c6b13d3d6f585eff -
Trigger Event:
push
-
Statement type: