HalleyWeb APIhalleyweb.com ↗
Extract Italian municipality tender notices from HalleyWeb portals. Get CIG codes, dates, awarded amounts, procedure types, and PDF attachments per tender.
What is the HalleyWeb API?
The HalleyWeb API provides 5 endpoints for accessing public procurement data from Italian municipality portals hosted on the HalleyWeb platform. Starting with list_tender_notices, you can retrieve full tender listings per municipality — including CIG codes, start and end dates, awarded amounts, and procedure types — then drill into individual notices with get_tender_notice_detail to pull structured metadata and attached documents.
curl -X GET 'https://api.parse.bot/scraper/029346f6-3c41-4aa8-b22b-7adbef02b05b/list_tender_notices?base_url=https%3A%2F%2Fwww.halleyweb.com%2Fc015050' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace halleyweb-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: HalleyWeb Tender Notices — browse Italian municipality tenders, drill into details, inspect documents."""
from parse_apis.halleyweb_tender_notices_api import HalleyWeb, TenderNotFound
client = HalleyWeb()
# Construct a municipality by its portal URL and list its tenders.
municipality = client.municipality(base_url="https://www.halleyweb.com/c015050")
for tender in municipality.tenders(limit=5):
print(tender.title, tender.cig, tender.amount)
# Search tenders by keyword within the same municipality.
match = municipality.search(query="PROGETTO", limit=1).first()
if match:
# Drill into the tender detail page for metadata and documents.
detail = match.details()
print(detail.title, detail.metadata)
# List attached documents and inspect the first one.
for doc in detail.documents(limit=3):
print(doc.label, doc.url)
# Inspect a known document's metadata (file size, content type).
doc = client.document(url="https://www.halleyweb.com/c015050/zf/index.php/bandi-di-gara/bandi-di-gara/allegato-esito/serialBando/185/procedura/EG/serialAllegato/36")
try:
meta = doc.inspect()
print(meta.filename, meta.size_bytes, meta.content_type)
except TenderNotFound as exc:
print(f"Document gone: {exc.url}")
print("exercised: municipality.tenders / municipality.search / tender.details / detail.documents / document.inspect")
Retrieve all published tender notices from a municipality's HalleyWeb portal. Returns structured metadata for each tender including title, CIG code, dates, awarded amount, and procedure type. Municipalities without active tenders return an empty array. Each tender carries a detail_url suitable for drill-down via get_tender_notice_detail.
| Param | Type | Description |
|---|---|---|
| base_urlrequired | string | Municipality base URL on HalleyWeb, in the format https://www.halleyweb.com/<municipality_code>. |
{
"type": "object",
"fields": {
"tenders": "array of tender objects, each containing title, detail_url, cig, start_date, end_date, amount, and procedure_type",
"base_url": "string, the normalized municipality base URL used for the request"
},
"sample": {
"data": {
"tenders": [
{
"cig": "Z0232F8C93",
"title": "AFFIDAMENTO DIRETTO AD UNICO FORNITORE DEL SERVIZIO DI GESTIONE DEGLI ATTI AMMINISTRATIVI",
"amount": "8.418,00€",
"end_date": "31/12/2024",
"detail_url": "https://www.halleyweb.com/c015050/zf/index.php/bandi-di-gara/bandi-di-gara/bando/serialBando/132",
"start_date": "21/09/2021",
"procedure_type": "23-AFFIDAMENTO DIRETTO"
}
],
"base_url": "https://www.halleyweb.com/c015050"
},
"status": "success"
}
}About the HalleyWeb API
Tender Listings by Municipality
The list_tender_notices endpoint takes a base_url parameter in the format https://www.halleyweb.com/<municipality_code> and returns an array of tender objects. Each object includes title, detail_url, cig (Codice Identificativo Gara), start_date, end_date, amount, and procedure_type. Municipalities with no active postings return an empty array rather than an error. The base_url is echoed back in the response so you can track which portal a result set came from.
Detail Pages and Attached Documents
get_tender_notice_detail accepts a full url — typically a detail_url value from list_tender_notices — and returns the notice title, a metadata object containing CIG and CUP codes when present, and a pdfs array of document objects each carrying a label and url. The list_tender_pdfs endpoint exposes the same response shape when you only need the attachment inventory for a notice. To inspect a specific file before downloading it, download_tender_pdf performs a HEAD-level inspection and returns filename, size_bytes, content_type, and a status field — no file contents are transferred.
Keyword Search Across a Portal
search_tenders filters across the full tender list for a given municipality using a case-insensitive query string matched against title and cig. It returns matching tender objects in the same shape as list_tender_notices, plus a total count of matches. This is useful for monitoring a specific contract type or tracking a known CIG across portal updates.
Coverage Scope
This API is scoped to municipality portals running on the HalleyWeb platform. Each request targets a single municipality identified by its code in the base URL. Cross-municipality aggregation requires calling list_tender_notices once per portal.
The HalleyWeb API is a managed, monitored endpoint for halleyweb.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when halleyweb.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official halleyweb.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Monitor all active tenders for a specific Italian municipality by polling
list_tender_noticeson a schedule - Build a CIG-code lookup tool using
search_tendersto filter by known procurement identifiers - Aggregate tender document inventories across multiple municipality portals using
list_tender_pdfs - Track awarded amounts and procedure types across municipalities to analyze public spending patterns
- Verify file size and MIME type of tender PDFs before ingesting them into a document pipeline using
download_tender_pdf - Extract CUP codes from detail pages via
get_tender_notice_detailto cross-reference national investment project registries
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does HalleyWeb provide an official developer API for its municipality portals?+
What does `get_tender_notice_detail` return beyond what's in the listing?+
list_tender_notices returns summary fields: title, CIG, dates, amount, and procedure type. get_tender_notice_detail adds the pdfs array of attached documents (each with a label and URL) and a metadata object that includes the CUP code when the notice carries one. Not every notice will have a CUP or attached PDFs.Does `download_tender_pdf` return the actual file contents?+
filename, size_bytes, content_type, and a status string. If you need to ingest the file contents, you can fork the API on Parse and revise it to add a file-download endpoint.Can I search tenders across multiple municipalities in a single request?+
search_tenders requires a single base_url and filters within that municipality's portal only. You can fork the API on Parse and revise it to add a multi-municipality batch search endpoint.