# Immobiliare.it Scraper — Italy Property Data & API (`sian.agency/immobiliare-property-scraper`) Actor

Immobiliare.it scraper and Italian real estate data API for Italy. Search sale and rent listings by place, search URL or listing URL; return price, price per square metre, surface area, rooms, bedrooms, bathrooms, floor, build year, energy class, heating, condominium fees and agency.

- **URL**: https://apify.com/sian.agency/immobiliare-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate, Lead generation, Agents
- **Stats:** 17 total users, 1 monthly users, 82.6% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 overview listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Immobiliare.it Scraper — Italy Property Data & API 🇮🇹🏠

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Smart Idealista Scraper](https://img.shields.io/badge/Store-Smart%20Idealista%20Scraper-E60023)](https://apify.com/sian.agency/smart-idealista-scraper?fpr=sian) [![Dubai Real Estate Scraper](https://img.shields.io/badge/Store-Dubai%20Real%20Estate-93D500)](https://apify.com/sian.agency/bayut-property-scraper?fpr=sian) [![Redfin Property Scraper](https://img.shields.io/badge/Store-Redfin%20Property%20Scraper-A02021)](https://apify.com/sian.agency/redfin-property-scraper?fpr=sian)

#### 🎉 The fast, no-code Immobiliare.it data API — scrape ~90% of useful fields essentially free, no immobiliare.it API key required

##### Built for property investors, agents, proptech teams, and market researchers who need clean Italian real-estate data — for sale and for rent — across every city in Italy.

### 🔎 What is the Immobiliare.it Scraper — and when should you use it?

The **Immobiliare.it Scraper** turns Italian property listings from immobiliare.it into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

**Use it when you need:** sale or rent listings across Italy — price, price per m², surface area, rooms, bedrooms, bathrooms, floor, build year, energy class, heating, condominium fees, address and agency.

**Use something else when:** you need a different country. Use [Smart Idealista Scraper](https://apify.com/sian.agency/smart-idealista-scraper?fpr=sian) for Spain and Portugal. Use [Funda Property Scraper](https://apify.com/sian.agency/funda-property-scraper?fpr=sian) for the Netherlands. Use [Otodom Property Scraper](https://apify.com/sian.agency/otodom-property-scraper?fpr=sian) for Poland.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/immobiliare-property-scraper

**Your agent can pay for its own runs.** This Actor is eligible for [agentic payments](https://docs.apify.com/platform/actors/publishing/monetize), so an agent can discover it, run it and settle the bill over [x402](https://www.x402.org/) (USDC on Base) or [Skyfire](https://www.skyfire.xyz/) — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```text
I want Italian property data from Immobiliare.it using the Apify Actor `sian.agency/immobiliare-property-scraper`.

Use it when I need: sale or rent listings across Italy — price, price per m², surface area, rooms, bedrooms, bathrooms, floor, build year, energy class, heating, condominium fees, address and agency.

Don't use it when: you need a different country — use smart-idealista-scraper or funda-property-scraper or otodom-property-scraper instead.

How to call it: keep `scrapeMode` on `overview` for fast rows or `detail` for the full record; search with `searchMode: byPlace` and a `places` list, or paste `searchUrls`.

Start with this input:
{
  "scrapeMode": "overview",
  "searchMode": "byPlace",
  "places": [
    "Roma"
  ],
  "contract": "sale",
  "maxResults": 50
}

Ask me which Italian city or comune, and whether you want sale or rent, then run the Actor and summarise the results as a table.
```

**Things you can ask your agent for:**

- *Compare price per m² across Roma, Milano and Napoli.*
- *Find flats in Firenze with energy class A or B and a lift.*
- *Pull condominium fees for listings in Torino to model running costs.*

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at [apify.com/sian.agency/immobiliare-property-scraper.md](https://apify.com/sian.agency/immobiliare-property-scraper.md).

### 📋 Overview

**Pull listings from Immobiliare.it — Italy's #1 property portal — as clean JSON or CSV.** For sale (*vendita*) and for rent (*affitto*), across Milano, Roma, Torino, Napoli, Firenze and every comune in Italy. Pick the depth that fits the job: a fast, low-cost overview scan for sizing a market, or the full per-property record.

**Why investors and agents choose us:**

- ⚡ **Two depths, one actor**: a fast Overview scan for whole-market sweeps, or full Detail records when you need everything
- 🔁 **Detail = Overview + more**: every overview field is on a Detail row too, with deeper data added on top — never less
- 💰 **Pay-per-result pricing**: Overview from **$3 per 1,000 listings** — only charged for listings actually extracted
- 📐 **Analysis-ready**: price, size in m², rooms, baths, floor, **price-per-m²** and **GPS coordinates** on every row
- 🎯 **Three ways to search**: by city name, by a pasted Immobiliare.it search URL (your filters honored), or by specific listing URLs
- 💎 **No API key, no code**: no immobiliare.it API access needed — point, click, export a real-estate data feed
- 🆓 **Free to try**: up to 25 listings per run, no credit card

### ✨ Features

- 🧭 **Overview mode**: 25 listings per page — price, specs, location, agency, photo gallery — ideal for fast market sweeps
- 🔍 **Detail mode**: full per-listing record — energy class, construction year, condominium fees, complete feature list, hi-res photos
- 🗺️ **By place / search URL / listing URL**: type a city + sale/rent, paste an Immobiliare.it search link, or drop in specific listings
- 🎚️ **Filters**: contract (sale/rent), property type (apartments, villas, detached houses), price range, min rooms, min surface
- 📐 **Price-per-m² + thumbnail** computed on every row for instant comparison
- 📍 **GPS + full address** on every listing for mapping and territory analysis
- 📞 **Agent contact built in**: agency name, agent name and **phone** on every listing — instant lead lists
- 🧾 **Self-documenting datasets**: every row carries a `metadata` object recording the exact search settings that produced it
- 📤 **Clean exports**: JSON, CSV, Excel, or the full REST API

### 🎬 Quick Start

Pick a scrape depth, choose how to search, set filters, and run. Results stream to the Apify dataset as clean JSON/CSV.

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~immobiliare-property-scraper/runs?token=[YOUR_TOKEN]" \
-H 'Content-Type: application/json' \
-d '{"scrapeMode":"overview","searchMode":"byPlace","places":["Milano"],"contract":"sale","maxResults":50}'
```

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Pick your scrape depth

**Overview** for a fast price + spec scan (25 listings/page), or **Detail** for the full per-property record.

#### Step 2: Choose how to search

**By place** (type a city like `Milano` + sale/rent), **By search URL** (paste an Immobiliare.it search link — filters honored), or **By listing URL** (detail mode — drop in specific listings).

#### Step 3: Set filters & run

Property type, price range, min rooms, min surface, Max results — then hit **Start**.

**That's it! In under a minute, you'll have:**

- A clean dataset of Italian property listings (JSON / CSV / Excel)
- Price, size, rooms, GPS, agency and price-per-m² on every row
- A repeatable, no-code real-estate data feed

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| scrapeMode | string | No | `overview` (fast & cheap) or `detail` (full fields). Default `overview`. |
| searchMode | string | No | `byPlace`, `bySearchUrl`, or `byListingUrl` (detail only). |
| places | array | No | City / comune names, e.g. `["Milano","Roma"]` (byPlace). |
| contract | string | No | `sale` (vendita) or `rent` (affitto). Default `sale`. |
| propertyType | string | No | `appartamenti`, `ville`, `case-indipendenti`, or empty for all. |
| searchUrls | array | No | Immobiliare.it search URLs (bySearchUrl) — on-page filters honored. |
| listingUrls | array | No | Listing URLs or IDs (detail / byListingUrl). |
| maxResults | integer | No | Max listings this run. FREE tier capped at 25. |
| minPrice / maxPrice | integer | No | Price range filter (€). |
| minRooms / minSurface | integer | No | Minimum rooms / surface (m²). |

**Example — by place:**

```json
{
  "scrapeMode": "overview",
  "searchMode": "byPlace",
  "places": ["Milano", "Roma"],
  "contract": "sale",
  "propertyType": "appartamenti",
  "maxPrice": 500000,
  "maxResults": 200
}
```

**Example — by search URL:**

```json
{
  "scrapeMode": "overview",
  "searchMode": "bySearchUrl",
  "searchUrls": ["https://www.immobiliare.it/vendita-ville/roma/"],
  "maxResults": 100
}
```

### 📤 Output

Results are saved to the Apify dataset with **30+ fields** including:

| Field | Type | Description |
|-------|------|-------------|
| propertyTitle | string | Listing title |
| url | string | Listing URL |
| contract | string | `sale` or `rent` |
| typology | string | Property type (Appartamento, Villa, …) |
| price | number | Asking price (€) |
| price\_per\_sqm\_eur | number | Price per m² (computed) |
| surface\_sqm | number | Surface area (m²) |
| rooms / bedrooms / bathrooms | number | Room counts |
| floor / elevator | string / bool | Floor + lift |
| city / province / region | string | Location rollup |
| address / latitude / longitude | string / number | Address + GPS |
| agency\_name / agent\_name / agency\_phone | string | Agency + agent contact |
| agency\_id / agency\_url / is\_private | int / string / bool | Seller |
| energy\_class | string | *(detail)* energy efficiency class |
| building\_year | number | *(detail)* construction year |
| condominium\_expenses | string | *(detail)* monthly condo fees |
| features / photos / thumbnail | array / string | Amenities + photo gallery |

**Example:**

```json
{
  "id": 128819432,
  "propertyTitle": "Quadrilocale via Alessandro Stradella, Milano",
  "url": "https://www.immobiliare.it/annunci/128819432/",
  "contract": "sale",
  "typology": "Appartamento",
  "price": 1300000,
  "price_per_sqm_eur": 8667,
  "surface_sqm": 150,
  "rooms": 4,
  "bathrooms": 2,
  "floor": "2°, con ascensore",
  "city": "Milano",
  "province": "Milano",
  "region": "Lombardia",
  "address": "Via Alessandro Stradella",
  "latitude": 45.4786,
  "longitude": 9.216,
  "agency_name": "Agenzia Elle B Immobiliare",
  "agent_name": "Laura Barletta",
  "agency_phone": "0481 375481",
  "energy_class": "A",
  "building_year": 1920,
  "condominium_expenses": "€ 235/mese",
  "photo_count": 23
}
```

### 💼 Use Cases & Examples

#### 1. Market research & price benchmarking

**Analysts sizing a city or neighbourhood market.**
**Input:** `byPlace` Milano, sale, all residential. **Output:** thousands of listings with price-per-m². **Use:** build a live price index per zone.

#### 2. Investment sourcing

**Investors hunting undervalued stock.**
**Input:** `byPlace` + `maxPrice` + `minSurface`. **Output:** filtered listings with €/m² and GPS. **Use:** rank deals by price-per-m² vs zone median.

#### 3. Lead generation for agents

**Agents building a private-seller / agency contact list.**
**Input:** Overview scan of a target area. **Output:** `agency_name` + `is_private` on every row. **Use:** prospecting and competitive coverage.

#### 4. Proptech & valuation data feeds

**Proptech teams powering AVMs and dashboards.**
**Input:** scheduled `bySearchUrl` runs. **Output:** a clean, repeatable Italian real-estate data feed. **Use:** feed models without an immobiliare.it API.

#### 5. Relocation & buyer search

**Relocation services shortlisting homes for clients.**
**Input:** `byPlace` + filters + Detail mode. **Output:** full records with photos, energy class, condo fees. **Use:** curated client shortlists.

#### 6. Comparative market analysis (CMA)

**Appraisers preparing valuations.**
**Input:** Detail mode on a set of comparable listings. **Output:** building year, energy class, full features. **Use:** defensible CMA inputs.

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/immobiliare-property-scraper').call({
  scrapeMode: 'overview', searchMode: 'byPlace', places: ['Milano'], contract: 'sale', maxResults: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/immobiliare-property-scraper').call(
    run_input={'scrapeMode': 'overview', 'searchMode': 'byPlace', 'places': ['Milano'], 'contract': 'sale', 'maxResults': 50}
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item)
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~immobiliare-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"scrapeMode":"overview","searchMode":"byPlace","places":["Milano"],"contract":"sale","maxResults":50}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: Schedule (e.g. daily) or webhook
2. **HTTP Request**: Call the actor API
3. **Process**: Handle the JSON results
4. **Action**: Save to a sheet/DB, notify, or transform

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 listings** per run — full feature access, same quality
- No credit card required
- Perfect for testing and small projects

#### PAID Tier (Production Ready)

- **Unlimited** listings per run
- Pay-per-result: only charged for listings actually extracted
- Overview and Detail priced separately so you only pay for the depth you use

💰 **Overview from $3 per 1,000 listings** — Detail priced separately for the full per-property record.

🔗 [View current pricing](https://apify.com/sian.agency/immobiliare-property-scraper?fpr=sian)

### ❓ Frequently Asked Questions

**Q: How many listings can I extract?**
A: FREE tier: 25 per run. PAID tier: unlimited.

**Q: Do I need an Immobiliare.it API key?**
A: No. There's no setup and no immobiliare.it account or API key required.

**Q: What's the difference between Overview and Detail?**
A: Overview is a fast, low-cost scan covering ~90% of useful fields. Detail adds energy class, construction year, condominium fees, the complete feature list and hi-res photos — and includes everything Overview returns.

**Q: Can I use my own Immobiliare.it search filters?**
A: Yes — paste your search URL in `bySearchUrl` mode and the on-page filters (type, price, etc.) are honored.

**Q: What output formats are available?**
A: JSON, CSV, Excel — export directly from the Apify dataset.

**Q: Does it work for both sale and rent?**
A: Yes — set `contract` to `sale` (vendita) or `rent` (affitto).

**Q: Is this legal?**
A: We only extract publicly available data. See the legal note below.

### 🐛 Troubleshooting

**No results returned**

- Check the city name spelling (e.g. `Milano`, not `Milan`), or paste a working Immobiliare.it search URL instead.
- Loosen filters — an overly tight price/surface range can return zero listings.

**Property type filter seems ignored**

- Use a supported type (`appartamenti`, `ville`, `case-indipendenti`) or leave it empty for all residential.

**Fewer results than expected**

- FREE tier is capped at 25 listings per run. Upgrade to PAID for unlimited, or raise `maxResults`.

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

*This is an independent tool and is not affiliated with, endorsed by, or sponsored by Immobiliare.it or its parent company. "Immobiliare.it" is a trademark of its respective owner.*

### 🤝 Support

**Join our active support community**

- For issues or questions, open an issue from the actor page
- Check the [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `scrapeMode` (type: `string`):

⚡ **OVERVIEW** — fast, cheap, ungated. Pulls ~90% of fields straight from immobiliare.it's listings API (price, size, rooms, baths, floor, address, GPS, photos, agency).

🔍 **DETAIL** — full fields per listing (energy class, build year, condominium fees, complete feature list, hi-res photos). Slower and priced higher per result.

**TIP:** Start with Overview — upgrade to Detail only when you need the extra fields.

## `searchMode` (type: `string`):

🧭 How to tell the scraper what to fetch:

- **By place** — type one or more city / municipality names (e.g. "Milano", "Roma"). Combine with the filters below.
- **By search URL** — paste an immobiliare.it search results URL; every on-page filter in the URL is honored.
- **By listing URL/ID** — Detail mode only: paste listing URLs or bare IDs to fetch specific properties.

## `places` (type: `array`):

📍 City / municipality names, e.g. "Milano", "Roma". Used when **Search by = By place**.

**TIP:** Add several at once — each place is searched in turn until **Max results** is reached.

## `contract` (type: `string`):

🏷️ **Sale** (vendita) or **Rent** (affitto). Applies to By place searches.

## `propertyType` (type: `string`):

🏠 Filter By place searches by typology. Leave on **All residential** for everything.

## `searchUrls` (type: `array`):

🔗 immobiliare.it search-results URLs to scrape. Used when **Search by = By search URL**.

**TIP:** Build any search on immobiliare.it (set your filters, sort order, map area), then copy the URL from the address bar — every on-page filter is honored.

**BULK EDIT:** Click "Bulk edit" to paste many URLs, one per line. Example: `https://www.immobiliare.it/vendita-ville/roma/`.

## `listingUrls` (type: `array`):

🆔 **Detail mode only.** immobiliare.it listing URLs (e.g. https://www.immobiliare.it/annunci/12345/) or bare numeric IDs.

**BULK EDIT:** Click "Bulk edit" to paste many URLs/IDs, one per line.

## `maxResults` (type: `integer`):

🔢 Maximum listings to extract this run.

- **FREE tier:** capped at 25 listings per run.
- **PAID tier:** unlimited — set as high as you need.

## `minPrice` (type: `integer`):

💶 Optional. Minimum price filter (By place mode).

## `maxPrice` (type: `integer`):

💶 Optional. Maximum price filter (By place mode).

## `minRooms` (type: `integer`):

🚪 Optional. Minimum number of rooms (By place mode).

## `minSurface` (type: `integer`):

📐 Optional. Minimum surface area in m² (By place mode).

## Actor input object example

```json
{
  "scrapeMode": "overview",
  "searchMode": "byPlace",
  "places": [
    "Milano",
    "Roma"
  ],
  "contract": "sale",
  "propertyType": "",
  "searchUrls": [
    "https://www.immobiliare.it/vendita-ville/roma/"
  ],
  "listingUrls": [
    "https://www.immobiliare.it/annunci/128819432/"
  ],
  "maxResults": 100
}
```

# Actor output Schema

## `results` (type: `string`):

Scraped immobiliare.it listings (JSON/CSV/Excel).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "places": [
        "Milano"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/immobiliare-property-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "places": ["Milano"] }

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/immobiliare-property-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "places": [
    "Milano"
  ]
}' |
apify call sian.agency/immobiliare-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sian.agency/immobiliare-property-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/RE89jPBRamOnifSwd/builds/31wmgL9vbvAZbVgjo/openapi.json
