Gov APIcultura.gov.it ↗
Get opening hours, ticket-office hours, and admission prices for Italian cultural sites listed on cultura.gov.it via one structured API endpoint.
What is the Gov API?
The cultura.gov.it API exposes 10 structured response fields from Italian Ministry of Culture place pages through a single endpoint, get_place_hours_and_prices. Given a place slug, it returns site opening hours and ticket-office hours as separate 7-day arrays, adult and reduced admission prices in euro, booking requirements, and supplementary ticket notes — all sourced from the official cultura.gov.it listing for that site.
curl -X GET 'https://api.parse.bot/scraper/7d950d84-2999-4fca-b551-8534b77e3014/get_place_hours_and_prices?slug=grotte-di-catullo-e-museo-archeologico-di-sirmione' \ -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 cultura-gov-it-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: fetch opening hours and prices for an Italian cultural site."""
from parse_apis.cultura_gov_it_api import CulturaGovIt, PlaceNotFound
client = CulturaGovIt()
# Look up a place by its cultura.gov.it page slug.
try:
place = client.places.get(slug="grotte-di-catullo-e-museo-archeologico-di-sirmione")
except PlaceNotFound:
print("Place not found for that slug.")
raise
print(place.name, f"— {place.booking}")
print(f"Adult: {place.adult_price_eur} {place.currency}, Reduced: {place.reduced_price_eur} {place.currency}")
# Walk the weekly site opening hours.
for h in place.site_hours or []:
status = "closed" if h.closed else f"{h.open}–{h.close}"
print(f" {h.day_label}: {status}" + (f" ({h.note})" if h.note else ""))
# Saturday ticket-office hours as a quick check.
if place.saturday_ticket_office_hours is not None:
sat = place.saturday_ticket_office_hours
print(f"Saturday ticket office: {sat.open}–{sat.close}")
if place.ticket_info:
print(f"Ticket notes: {place.ticket_info[:120]}")
print("exercised: places.get")
Returns, for one cultural place on cultura.gov.it identified by its page slug, the full-price (adult) and reduced admission prices in euro, the weekly site opening hours (section 'Apertura') and, separately, the weekly ticket-office hours (section 'Biglietteria'), each as a 7-row array keyed by English day name with open/close times in HH:MM (24h, Italy local time), a closed flag and the site's per-day note (typically the last-entry time, Italian text). Saturday rows are also surfaced directly as saturday_site_hours and saturday_ticket_office_hours. ticket_info carries the free-text ticket notes (combined tickets, passes) when present, otherwise null. seasonal_validity lists any seasonal validity phrases the page states for these hours (e.g. 'dal 1 aprile al 31 ottobre' as one shape); it is an empty array and seasonal_validity_listed is false when the page lists none — the representative place currently lists none, so a populated case is unverified. Prices are null when the page shows no ticket card. One page fetch per call. An unknown slug returns a stale_input error (the site answers with its own 'page not found' page).
| Param | Type | Description |
|---|---|---|
| slug | string | Place page slug as it appears in the cultura.gov.it place URL path (lowercase words joined by hyphens). |
{
"type": "object",
"fields": {
"name": "place name from the page heading",
"slug": "echo of the place slug",
"booking": "booking requirement text as shown (Italian, e.g. 'Prenotazione Facoltativa' = optional), or null",
"currency": "ISO currency code of the prices",
"site_hours": "array of 7 day rows for the site itself: day (english), day_label (Italian as shown), open/close HH:MM or null, closed boolean, note (last-entry text or null)",
"ticket_info": "free-text ticket notes (combined tickets, annual pass) or null",
"adult_price_eur": "full-price (adult) ticket in euro as a number, null if no ticket card",
"reduced_price_eur": "reduced ticket in euro as a number, null if no ticket card",
"seasonal_validity": "array of seasonal validity phrases stated on the page; empty when none listed",
"saturday_site_hours": "the Saturday row of site_hours, or null if absent",
"ticket_office_hours": "array of 7 day rows for the ticket office, same row shape as site_hours",
"seasonal_validity_listed": "boolean, true when seasonal_validity is non-empty",
"saturday_ticket_office_hours": "the Saturday row of ticket_office_hours, or null if absent"
},
"sample": {
"data": {
"name": "Grotte di Catullo e Museo archeologico di Sirmione",
"slug": "grotte-di-catullo-e-museo-archeologico-di-sirmione",
"booking": "Prenotazione Facoltativa",
"currency": "EUR",
"site_hours": [
{
"day": "monday",
"note": null,
"open": "08:30",
"close": "14:00",
"closed": false,
"day_label": "Lunedì"
},
{
"day": "saturday",
"note": "Ultimo ingresso h 16.20",
"open": "08:30",
"close": "19:30",
"closed": false,
"day_label": "Sabato"
}
],
"ticket_info": "E' disponibile anche il biglietto congiunto Castello Scaligero, Grotte di Catullo e Villa Romana di Desenzano 20,00 € Abbonamento annuale: €20 (ingressi illimitati per 365 giorni dall'acquisto)",
"adult_price_eur": 10,
"reduced_price_eur": 2,
"seasonal_validity": [],
"saturday_site_hours": {
"day": "saturday",
"note": "Ultimo ingresso h 16.20",
"open": "08:30",
"close": "19:30",
"closed": false,
"day_label": "Sabato"
},
"ticket_office_hours": [
{
"day": "monday",
"note": null,
"open": "08:00",
"close": "13:00",
"closed": false,
"day_label": "Lunedì"
},
{
"day": "saturday",
"note": null,
"open": "08:30",
"close": "18:30",
"closed": false,
"day_label": "Sabato"
}
],
"seasonal_validity_listed": false,
"saturday_ticket_office_hours": {
"day": "saturday",
"note": null,
"open": "08:30",
"close": "18:30",
"closed": false,
"day_label": "Sabato"
}
},
"status": "success"
}
}About the Gov API
What the API Returns
The single endpoint, get_place_hours_and_prices, accepts a slug parameter matching the URL path of any cultural site listed on cultura.gov.it (e.g., grotte-di-catullo-e-museo-archeologico-di-sirmione). It returns the place name and slug, an adult_price_eur and reduced_price_eur as numeric values in euro, and a currency field confirming the ISO code.
Hours Data
Hours are returned as two separate 7-element arrays. site_hours covers the physical site's access schedule; each row carries a day (English), day_label (Italian as printed on the page), open and close in HH:MM format, and a closed boolean for days when the site does not operate. The saturday_site_hours convenience field surfaces the Saturday row directly. A parallel structure for the ticket office is not listed as a named top-level field but the site_hours split from the ticket-office schedule mirrors the same row shape.
Supplementary Fields
booking returns the booking-requirement text in Italian as it appears on the page (e.g., Prenotazione Facoltativa) or null when absent. ticket_info holds free-text notes about combined tickets or annual passes. seasonal_validity is an array of any validity-period phrases stated on the listing; it is an empty array when none are given. All text fields that originate from Italian-language content are returned as-is without translation.
The Gov API is a managed, monitored endpoint for cultura.gov.it — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when cultura.gov.it 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 cultura.gov.it 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?+
- Display up-to-date admission prices for Italian museum listings in a travel planning app, using adult_price_eur and reduced_price_eur.
- Build a weekly visit-planner widget that reads site_hours to show day-by-day open/close times for a given cultural site.
- Alert users when a site is closed on a specific day by checking the closed boolean in the site_hours array.
- Surface booking-requirement status (booking field) alongside opening times in a trip-itinerary tool.
- Aggregate seasonal_validity data across multiple slugs to flag sites with restricted operating periods.
- Show ticket-office hours separately from site access hours to help visitors plan arrival times.
- Power a discount-finder feature by comparing adult_price_eur and reduced_price_eur across multiple sites.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.