Skip to main content

Async Python client for the Wuzzuf job-search API

Project description

🔍 PyWuzzuf

An unofficial, async-first Python client for the Wuzzuf Jobs API

python - 3.12+ UV Prek - Ready Async - Ready License - MIT

📖 Read The Documentation


📑 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.txt policies.

[!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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pywuzzuf-0.1.0.tar.gz (24.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pywuzzuf-0.1.0-py3-none-any.whl (30.1 kB view details)

Uploaded Python 3

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

Hashes for pywuzzuf-0.1.0.tar.gz
Algorithm Hash digest
SHA256 c5bb1690a6a2abf228225e9d31dc3f97f395eccef70ba185289cbe993c9f65ce
MD5 61a98fe4d9be63f080ef9ce441b32cd0
BLAKE2b-256 dd0b2a0334f61b4108c4a8e3b7f6c0076519c77105d1758e29cfcb9a4ce869be

See more details on using hashes here.

Provenance

The following attestation bundles were made for pywuzzuf-0.1.0.tar.gz:

Publisher: publish.yml on hossam-elshabory/pywuzzuf

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for pywuzzuf-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 994a54153aef4b6e9174db044c1b221960cd612c3572c4629e7cbfaf7fab20fb
MD5 a0f264cf4afb9bee984ec8d473e55d95
BLAKE2b-256 c862d609b8fc2c6bafdfdb8fe52c2084ed210806bd1f04e8c86c43f6956536cb

See more details on using hashes here.

Provenance

The following attestation bundles were made for pywuzzuf-0.1.0-py3-none-any.whl:

Publisher: publish.yml on hossam-elshabory/pywuzzuf

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page