Opapisa APIopapisa.it ↗
Get official opening and closing times for Pisa's Tower, Cathedral, Baptistery, and more. Daily calendar data for up to 7 days via one endpoint.
What is the Opapisa API?
The opapisa.it API exposes the official opening calendar for the six monuments of Piazza dei Miracoli in Pisa — the Tower, Cathedral, Baptistery, Camposanto, Opera del Duomo Museum, and Sinopie Museum — through a single endpoint, get_opening_hours. Each response includes per-monument entries with opens_at and closes_at times in Europe/Rome local time, closure notices, split-schedule support, and general notices published on the official calendar page.
curl -X GET 'https://api.parse.bot/scraper/c4cb95ae-ebfb-4f12-ac03-075c15ee60e7/get_opening_hours?start_date=2026-10-02' \ -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 opapisa-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: Piazza dei Miracoli opening hours — check a week's schedule."""
from parse_apis.opapisa_it_api import OpaPisa, InputFormatInvalid
client = OpaPisa()
# Fetch the opening schedule for a week starting tomorrow-ish.
try:
schedule = client.schedules.get(start_date="2026-10-01", days=7)
except InputFormatInvalid:
print("Invalid date format — use YYYY-MM-DD within the published calendar range.")
raise
print(f"Schedule: {schedule.start_date} to {schedule.end_date} ({schedule.days} days)")
# Show general visitor notices published on the calendar page.
for note in schedule.general_notes:
print(f" ℹ {note[:120]}")
# List open monuments and closures for each entry.
if schedule.entries is not None:
for entry in schedule.entries:
if entry.is_closure:
print(f" {entry.date} CLOSED {entry.monument}: {entry.title}")
else:
print(f" {entry.date} {entry.opens_at}–{entry.closes_at} {entry.monument}")
print("exercised: schedules.get / Schedule fields / Entry fields")
Returns the official opening calendar for a window of consecutive days starting at start_date, one entry per monument per calendar event. A regular entry carries opens_at/closes_at in 24h local (Europe/Rome) time; a monument with a split schedule appears twice on that day with two time ranges; a closure or special all-day notice appears as an entry with all_day=true, opens_at/closes_at null and the notice text in title (is_closure is true when the title says the monument is closed). monument is the site's own category label (the Camposanto is labelled 'Cemetery'). general_notes lists the free-text notice paragraphs published above the calendar (ticket rules, seasonal evening openings, per-monument caveats). One request per call regardless of days (days is clamped to 7). A start_date beyond the published calendar (currently valid through early January 2027) is answered by the site with a 404 and surfaces as an upstream error.
| Param | Type | Description |
|---|---|---|
| days | integer | Number of consecutive days to return starting at start_date, 1 to 7 (larger values are clamped to 7). |
| start_daterequired | string | First day of the window, ISO date YYYY-MM-DD. |
{
"type": "object",
"fields": {
"days": "number of days actually covered after clamping",
"entries": "array of calendar entries: date, monument (site category label), title (event name or closure notice), opens_at/closes_at (H:MM local time, null for all-day notices), all_day, is_closure, event_id (integer), event_url",
"end_date": "last day of the returned window (ISO date)",
"start_date": "first day of the returned window (ISO date)",
"general_notes": "array of notice paragraphs published on the opening-time page"
},
"sample": {
"data": {
"days": 2,
"entries": [
{
"date": "2026-10-01",
"title": "Tower",
"all_day": false,
"event_id": 22511,
"monument": "Tower",
"opens_at": "9:00",
"closes_at": "20:00",
"event_url": "https://www.opapisa.it/en/event/tower-124/?instance_id=113395",
"is_closure": false
},
{
"date": "2026-10-02",
"title": "Cathedral closed to visitors",
"all_day": true,
"event_id": 22764,
"monument": "Cathedral",
"opens_at": null,
"closes_at": null,
"event_url": "https://www.opapisa.it/en/event/cathedral-closed-to-visitors-2/?instance_id=114940",
"is_closure": true
}
],
"end_date": "2026-10-02",
"start_date": "2026-10-01",
"general_notes": [
"The published calendar is valid through January 6, 2027. This page is regularly updated.",
"Open every day Entrance is allowed up to 30 minutes before closing time."
]
},
"status": "success"
}
}About the Opapisa API
What the API Returns
The get_opening_hours endpoint accepts two parameters: start_date (required, ISO date YYYY-MM-DD) and days (optional integer, 1–7; values above 7 are clamped). The response covers a consecutive window of calendar days and returns start_date, end_date, days (the count actually used after clamping), a general_notes array of notice paragraphs from the official calendar page, and an entries array.
Entries Array
Each item in entries represents one calendar event for one monument on one date. Fields include date, monument (the site category label, e.g. "Leaning Tower" or "Baptistery"), title (the event name or closure notice), and opens_at/closes_at in 24-hour local time. Monuments that operate a split schedule — for example, a mid-day closure — appear as two separate entries for the same date and monument, each with its own time window. Closure days carry a descriptive title instead of time fields.
Coverage and Freshness
All six monuments managed by Opera della Primaziale Pisana are covered: the Leaning Tower, Cathedral, Baptistery, Camposanto Monumentale, Museo dell'Opera del Duomo, and Museo delle Sinopie. Times reflect the official calendar published at opapisa.it and include seasonal schedule changes and special closure notices as they appear there. The general_notes field surfaces any site-wide notices that accompany a given calendar window.
The Opapisa API is a managed, monitored endpoint for opapisa.it — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when opapisa.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 opapisa.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 today's opening and closing times for the Leaning Tower in a travel itinerary app.
- Warn tourists of monument closures by checking the
titlefield for closure notices before a visit date. - Build a weekly schedule view showing split-schedule entries across all six Piazza dei Miracoli monuments.
- Sync a Google Calendar or iCal feed with monument hours by querying
get_opening_hourseach day. - Show
general_notesbanners in a Pisa city guide app when official site-wide notices are active. - Check whether a specific monument is open on a requested date by filtering
entriesbymonumentanddate. - Alert tour operators to seasonal schedule changes by comparing
opens_at/closes_atvalues across consecutive weekly queries.
| 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.
Does opapisa.it provide an official developer API?+
How does the API handle monuments with mid-day breaks or split schedules?+
get_opening_hours returns two separate entries for the same date and monument, each with its own opens_at and closes_at values. A single uninterrupted schedule produces one entry for that day.What is the maximum date window I can query at once?+
days parameter accepts integers from 1 to 7. Any value larger than 7 is clamped to 7, and the actual count used is reflected in the days field of the response. The end_date field shows the last date covered.Does the API return historical opening hours for past dates?+
start_date. Historical date coverage is not guaranteed. The endpoint covers the official calendar window as published on the opapisa.it opening-time page. You can fork this API on Parse and revise it to add explicit historical date handling if your use case requires it.