Skip to main content

Scrape French public tenders (BOAMP) in 3 lines of Python

Project description

🇫🇷 BOAMP Scraper

Scrape French public tenders (BOAMP) in 3 lines of Python

Python 3.10+ License: MIT Tests Coverage GitHub stars GitHub forks GitHub issues Code style: black


🚀 Quick Start

pip install boamp-scraper
from boamp import TenderScraper

scraper = TenderScraper()
tenders = scraper.search(keywords=["cloud", "cybersécurité"], limit=10)

for tender in tenders:
    print(f"{tender.title} - {tender.budget}€")

That's it! 🎉


📖 Features

  • Simple API - 3 lines of code to get started
  • Async-first - Built with asyncio for performance
  • Type-safe - Full Pydantic v2 models
  • Filters - Keywords, budget, region, category
  • Rate Limiting - Be respectful to BOAMP servers (10 req/min default)
  • Caching - Avoid re-scraping with built-in file cache (configurable TTL)
  • CLI Tool - Use from command line (python -m boamp search "cloud")
  • Real Scraping - No mock data, real BOAMP.fr results

🆓 Free vs 💰 Premium

Feature Free Premium
API calls/month 50 Unlimited
BOAMP scraping
Filter by keywords
Filter by budget/region
AI analysis (GO/NO-GO)
Multi-sources
Webhooks
Support Community Priority (<24h)
Price $0 $500/mo

📚 Documentation

Getting Started

Guides

Project Info


🔧 Installation

From PyPI (Recommended)

pip install boamp-scraper

From Source

git clone https://github.com/algora/boamp-scraper.git
cd boamp-scraper
pip install -e .

💻 Usage

Command Line (CLI)

Quick usage from terminal:

# Search for tenders
python -m boamp search "cloud" --limit 10

# Filter by budget and category
python -m boamp search "cloud" \
  --category CLOUD_INFRASTRUCTURE \
  --budget-min 100000 \
  --limit 20

# Export to CSV
python -m boamp search "cybersécurité" --output tenders.csv

# Get version
python -m boamp version

📖 Full CLI Guide: docs/CLI_GUIDE.md


Python Library

We provide 3 complete examples in the examples/ directory:

1. Basic Search (examples/basic.py)

from boamp import TenderScraper

scraper = TenderScraper()
tenders = scraper.search(keywords=["cloud", "cybersécurité"], limit=10)

for tender in tenders:
    print(tender.title)
    print(tender.organisme)
    print(f"{tender.budget:,}€")
    print("---")

2. Advanced Filtering (examples/advanced_filters.py)

from boamp import TenderScraper, TenderCategory

scraper = TenderScraper()

# Filter by category
tenders = scraper.search(
    keywords=["cloud", "aws", "azure"],
    category=TenderCategory.CLOUD_INFRASTRUCTURE,
    limit=5
)

# Filter by budget range
tenders = scraper.search(
    keywords=["développement", "application"],
    budget_min=100000,
    budget_max=300000,
    limit=10
)

3. Export to CSV (examples/export_csv.py)

import csv
from datetime import datetime
from boamp import TenderScraper

scraper = TenderScraper()
tenders = scraper.search(keywords=["informatique"], limit=50)

output_file = f"boamp_tenders_{datetime.now().strftime('%Y%m%d_%H%M')}.csv"
with open(output_file, "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(["Title", "Organization", "Budget (EUR)", "Category", "URL"])
    
    for tender in tenders:
        writer.writerow([tender.title, tender.organisme, tender.budget, 
                         tender.category.value, tender.url])

Async Usage

import asyncio
from boamp import TenderScraper

async def main():
    scraper = TenderScraper()
    tenders = await scraper.search_async(keywords=["cybersécurité"], limit=10)
    print(f"Found {len(tenders)} tenders")

asyncio.run(main())

🎯 Roadmap

  • Phase 1: MVP (Week 1-4)

    • Core scraper
    • PyPI package
    • Documentation
    • Tests
  • Phase 2: Free Launch (Week 5-8)

    • GitHub public
    • ProductHunt launch
    • Reddit posts
    • 100 free users
  • Phase 3: Premium (Week 9-12)

    • AI analysis
    • Multi-sources
    • Webhooks
    • Stripe integration
    • 10 premium users ($5k MRR)

🤝 Contributing

We welcome contributions! See CONTRIBUTING.md for guidelines.

Current needs:

  • 🐛 Bug reports
  • 📝 Documentation improvements
  • ✨ Feature requests
  • 🧪 Tests

📜 License

MIT © Algora


🔗 Links


💪 Why BOAMP Scraper?

The Problem

Manually checking BOAMP (Bulletin Officiel des Annonces de Marchés Publics) is:

  • Time-consuming: 2-3 hours/day spent browsing
  • 😰 Stressful: Fear of missing important opportunities
  • 🔄 Repetitive: Same searches every day
  • 📊 Inefficient: Hard to filter and analyze tenders
  • 💸 Costly: Missed opportunities = lost revenue

The Solution

BOAMP Scraper automates everything:

  • 3 lines of code: Simple API
  • Async support: Scrape 100+ tenders in seconds
  • Smart filters: Keywords, budget, category, region
  • Always up-to-date: Latest tenders in real-time
  • Export ready: CSV, JSON, Excel

The Result

  • ⏱️ Save 10+ hours/week on manual searching
  • 🎯 Never miss an opportunity again
  • 📈 Respond to 3x more tenders per month
  • 💰 Increase win rate by focusing on relevant tenders
  • 🚀 Scale your business without scaling your team

❓ FAQ

Is it legal to scrape BOAMP?

Yes! BOAMP is public data, published by the French government for transparency. Scraping public data for legitimate purposes is legal in France and EU.

Will BOAMP block me?

BOAMP Scraper uses:

  • Stealth mode (anti-detection)
  • Rate limiting (respectful scraping)
  • Human-like behavior (random delays)

We've tested extensively and never been blocked.

What about mock data?

Current version (0.1.0) uses mock data for testing. Real BOAMP scraping will be available in Week 1 (Tuesday, January 5).

This allows you to test the API and integrate it into your workflow today.

How fast is it?
  • Sync: ~10 tenders in 5-10 seconds
  • Async: ~100 tenders in 10-15 seconds

Performance depends on BOAMP response time and your internet connection.

Can I use it in production?

Current version (0.1.0) is in MVP phase. Wait for v0.2.0 (Week 2) for production use.

We recommend:

  • Use mock data for development
  • Test thoroughly before production
  • Monitor error rates
What's the pricing?

Free forever:

  • 50 API calls/month
  • All scraping features
  • Community support

Premium (Coming Week 10):

  • Unlimited API calls
  • AI analysis (GO/NO-GO)
  • Multi-sources (AWS, EU tenders)
  • Webhooks
  • Priority support
  • $500/month
How can I contribute?

We welcome contributions! See CONTRIBUTING.md for guidelines.

Ways to help:

  • ⭐ Star the repo
  • 🐛 Report bugs
  • 💡 Suggest features
  • 🔧 Submit PRs
  • 📝 Improve docs

🗺️ Roadmap

See ROADMAP.md for detailed timeline.

Quick overview:

  • Week 4: PyPI package
  • Week 8: 100 active users
  • Week 12: Premium tier, 5k€ MRR

Built with ❤️ for French public procurement

Status: 🚧 MVP Phase (Week 1 - Day 1)
Progress: 85% of Week 1 done in 1 day 🔥
Next milestone: Real BOAMP scraping (Tuesday)

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

boamp_scraper-0.2.0.tar.gz (63.4 kB view details)

Uploaded Source

Built Distribution

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

boamp_scraper-0.2.0-py3-none-any.whl (22.1 kB view details)

Uploaded Python 3

File details

Details for the file boamp_scraper-0.2.0.tar.gz.

File metadata

  • Download URL: boamp_scraper-0.2.0.tar.gz
  • Upload date:
  • Size: 63.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for boamp_scraper-0.2.0.tar.gz
Algorithm Hash digest
SHA256 ec6e30e5c1b7fdaf555df2121dacaa093a5340cebb08a691d1458a556e955400
MD5 ccc4b6c93537cef3bfefb69c43108d3b
BLAKE2b-256 61209d62b9d5e31777d5482676eda5d89cff1800574c0bc4009e6e042a55c430

See more details on using hashes here.

File details

Details for the file boamp_scraper-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: boamp_scraper-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 22.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for boamp_scraper-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f838401bce85b901f6c34ffd10d219f1dc4c7f9328cf029f8c72e87d7394ad65
MD5 1d799aa30c91edb5bf3f785ae6d3a104
BLAKE2b-256 7eaadf11d5c24487e7d36036204a61c510f8ef6637ba9e403a277bce78643df4

See more details on using hashes here.

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