string · required
Town name, the text before the comma in the listing location. Towns with fewer than 5 live listings are omitted from this file.
Example: Estepona
Due-diligence pack for the Spanish coastal new-build listing book and the observation ledger published with it. Listing counts are computed from the book on this deployment. The price-history range is read from price_snapshots when a database client is configured. The published open-data file is reported separately and is not used to fill a failed database read. A figure that cannot be computed is not available.
Generated 2026-10-26T09:32:36.124Z · Health checked 2026-10-26T09:32:36.124Z
Current listing book
5 provinces mapped
Live price_snapshots
v2026-10-26
Avena Spanish Coastal New-Build Market Observations The book on this deployment holds 2,051 listings across 96 location strings and 9 costa labels. Feed artifact time: 2026-10-26T06:52:07.350Z.
Open-dataset town file, recomputed now from this book with the same k≥5 rule: 67 towns. The published manifest reports 67 towns and 2,051 live listings at 2026-10-26T06:52:56.385Z.
Rows with no country field are counted as unset. GET /api/v1/properties defaults a missing country to ES. This pack does not apply that default to the count.
| Country on the row | Listings |
|---|---|
| (country not set on the listing row) | 2,051 |
Parsed from the location string with the province list used for the Spain statistics file. A location that does not match is unmapped. Unmapped locations: none.
| Province | Towns | Listings |
|---|---|---|
| Málaga | 18 | 861 |
| Alicante | 50 | 822 |
| Murcia | 24 | 327 |
| Granada | 1 | 6 |
| Cádiz | 3 | 35 |
| Costa | Listings |
|---|---|
| Costa del Sol | 861 |
| Costa Blanca South | 487 |
| Costa Calida | 275 |
| Costa Blanca North | 249 |
| Costa Blanca South - Inland | 76 |
| Costa Calida - Inland | 52 |
| Costa del Sol (Cadiz) | 35 |
| Costa Blanca North - Inland | 10 |
| Costa Tropical | 6 |
| Type | Listings |
|---|---|
| Apartment | 886 |
| Penthouse | 398 |
| Villa | 391 |
| Townhouse | 197 |
| Bungalow | 173 |
| Studio | 6 |
Distinct development_ref values on the current book: 756. Rows with none: 0. A development reference identifies a project in the feed. It is not a company name.
Promoter names: not available. The listing feed does not include promoter or developer company names. The value stored as developer is a source label written by the capture from the region (Costa del Sol versus the other regions). It is not a promoter directory.
Source labels on the current book, grouped from the developer field. These are not promoter names.
| Source label | Listings |
|---|---|
| Via Xavia Estate | 1,149 |
| Via Avena Estate | 902 |
| Location | Province | Costa | Listings |
|---|---|---|---|
| Estepona, Málaga | Málaga | Costa del Sol | 230 |
| Mijas, Málaga | Málaga | Costa del Sol | 187 |
| Torrevieja, Alicante | Alicante | Costa Blanca South | 118 |
| Fuengirola, Málaga | Málaga | Costa del Sol | 100 |
| Pilar de La Horadada, Alicante | Alicante | Costa Blanca South | 90 |
| Marbella, Málaga | Málaga | Costa del Sol | 84 |
| Los Alcazares, Murcia | Murcia | Costa Calida | 77 |
| Finestrat, Alicante | Alicante | Costa Blanca North | 59 |
| Guardamar del Segura, Alicante | Alicante | Costa Blanca South | 54 |
| Casares, Málaga | Málaga | Costa del Sol | 52 |
| San Pedro del Pinatar, Murcia | Murcia | Costa Calida | 52 |
| Torre Pacheco, Murcia | Murcia | Costa Calida | 48 |
| Benijofar, Alicante | Alicante | Costa Blanca South | 41 |
| Manilva, Málaga | Málaga | Costa del Sol | 40 |
| Benahavís, Málaga | Málaga | Costa del Sol | 36 |
| San Miguel de Salinas, Alicante | Alicante | Costa Blanca South | 32 |
| Pinoso, Alicante | Alicante | Costa Blanca South - Inland | 31 |
| Villajoyosa, Alicante | Alicante | Costa Blanca North | 31 |
| Algorfa, Alicante | Alicante | Costa Blanca South | 30 |
| Polop, Alicante | Alicante | Costa Blanca North | 27 |
| Torremolinos, Málaga | Málaga | Costa del Sol | 27 |
| Rojales, Alicante | Alicante | Costa Blanca South | 25 |
| Málaga, Málaga | Málaga | Costa del Sol | 24 |
| Orihuela Costa, Alicante | Alicante | Costa Blanca South | 22 |
| Baños y Mendigo, Murcia | Murcia | Costa Calida | 21 |
| Benalmádena, Málaga | Málaga | Costa del Sol | 21 |
| San Javier, Murcia | Murcia | Costa Calida | 19 |
| Vélez Málaga, Málaga | Málaga | Costa del Sol | 19 |
| San Roque, Cádiz | Cádiz | Costa del Sol (Cadiz) | 18 |
| Alicante, Alicante | Alicante | Costa Blanca North | 16 |
| Calpe, Alicante | Alicante | Costa Blanca North | 16 |
| Orihuela, Alicante | Alicante | Costa Blanca South | 16 |
| Fuente Álamo, Murcia | Murcia | Costa Calida - Inland | 14 |
| Aguilas, Murcia | Murcia | Costa Calida | 13 |
| Jávea Xàbia, Alicante | Alicante | Costa Blanca North | 13 |
| la Nucia, Alicante | Alicante | Costa Blanca North | 13 |
| rincon de la victoria, Málaga | Málaga | Costa del Sol | 13 |
| Alhama De Murcia, Murcia | Murcia | Costa Calida - Inland | 12 |
| El Verger, Alicante | Alicante | Costa Blanca North | 12 |
| Hondón de las Nieves, Alicante | Alicante | Costa Blanca South - Inland | 12 |
| La Linea De La Concepcion, Cádiz | Cádiz | Costa del Sol (Cadiz) | 12 |
| Benissa, Alicante | Alicante | Costa Blanca North | 11 |
| El Campello, Alicante | Alicante | Costa Blanca North | 11 |
| Cartagena, Murcia | Murcia | Costa Calida | 10 |
| Ciudad Quesada, Alicante | Alicante | Costa Blanca South | 10 |
| Denia, Alicante | Alicante | Costa Blanca North | 10 |
| Dolores, Alicante | Alicante | Costa Blanca South | 10 |
| La Manga Club, Murcia | Murcia | Costa Calida | 10 |
| La Manga del Mar Menor, Murcia | Murcia | Costa Calida | 10 |
| San Pedro De Alcantara, Málaga | Málaga | Costa del Sol | 10 |
| Santa Pola, Alicante | Alicante | Costa Blanca South | 10 |
| Mazarron, Murcia | Murcia | Costa Calida - Inland | 9 |
| Mutxamel, Alicante | Alicante | Costa Blanca North | 9 |
| Aspe, Alicante | Alicante | Costa Blanca South - Inland | 8 |
| Cox, Alicante | Alicante | Costa Blanca South - Inland | 7 |
| Moraira_Teulada, Alicante | Alicante | Costa Blanca North | 7 |
| Puerto de Mazarron, Murcia | Murcia | Costa Calida | 7 |
| San Fulgencio, Alicante | Alicante | Costa Blanca South | 7 |
| Almuñecar, Granada | Granada | Costa Tropical | 6 |
| Bigastro, Alicante | Alicante | Costa Blanca South | 6 |
| La Romana, Alicante | Alicante | Costa Blanca South - Inland | 6 |
| Ojen, Málaga | Málaga | Costa del Sol | 6 |
| Torrox, Málaga | Málaga | Costa del Sol | 6 |
| Catral, Alicante | Alicante | Costa Blanca South - Inland | 5 |
| La Marina, Alicante | Alicante | Costa Blanca South | 5 |
| Monforte del Cid, Alicante | Alicante | Costa Blanca North - Inland | 5 |
| Sotogrande, Cádiz | Cádiz | Costa del Sol (Cadiz) | 5 |
| Alfas del Pi, Alicante | Alicante | Costa Blanca North | 4 |
| Altea, Alicante | Alicante | Costa Blanca North | 4 |
| Avileses, Murcia | Murcia | Costa Calida - Inland | 4 |
| Benidorm, Alicante | Alicante | Costa Blanca North | 4 |
| Daya Nueva, Alicante | Alicante | Costa Blanca South | 4 |
| Lorca, Murcia | Murcia | Costa Calida - Inland | 4 |
| Los Montesinos, Alicante | Alicante | Costa Blanca South | 4 |
| Penaguila, Alicante | Alicante | Costa Blanca North - Inland | 4 |
| Calasparra, Murcia | Murcia | Costa Calida - Inland | 3 |
| Istán, Málaga | Málaga | Costa del Sol | 3 |
| Jacarilla, Alicante | Alicante | Costa Blanca South - Inland | 3 |
| Yecla, Murcia | Murcia | Costa Calida - Inland | 3 |
| Alhaurín De La Torre, Málaga | Málaga | Costa del Sol | 2 |
| Benejúzar, Alicante | Alicante | Costa Blanca South - Inland | 2 |
| Cabo de Palos, Murcia | Murcia | Costa Calida | 2 |
| Fortuna, Murcia | Murcia | Costa Calida - Inland | 2 |
| Gran Alacant, Alicante | Alicante | Costa Blanca South | 2 |
| La Union, Murcia | Murcia | Costa Calida | 2 |
| Santiago de la Ribera, Murcia | Murcia | Costa Calida | 2 |
| Almoradi, Alicante | Alicante | Costa Blanca South - Inland | 1 |
| Benitachell, Alicante | Alicante | Costa Blanca North | 1 |
| Formentera del Segura, Alicante | Alicante | Costa Blanca South | 1 |
| Lliber, Alicante | Alicante | Costa Blanca North - Inland | 1 |
| Los Nietos, Murcia | Murcia | Costa Calida | 1 |
| Los Urrutias, Murcia | Murcia | Costa Calida | 1 |
| Nerja, Málaga | Málaga | Costa del Sol | 1 |
| Rafal, Alicante | Alicante | Costa Blanca South - Inland | 1 |
| San Juan Alicante, Alicante | Alicante | Costa Blanca North | 1 |
| Sucina, Murcia | Murcia | Costa Calida - Inland | 1 |
Source: price_snapshots. First date: 2026-08-05. Latest date: 2026-10-26. Observed days: 76. published movement ledger; its first and latest dates match the live price_snapshots endpoints
Published ledger on this deployment: 2026-08-05 to 2026-10-26, 76 observation days, 764 moves, 328 tombstones (45 still listed, 283 currently absent). Ledger gaps (public/open-data/movement-ledger.json): 2026-10-14 to 2026-10-20 (7 days)
Fields on the open observation files, on GET /api/v1/properties (default and format=apip), on GET /api/v1/dataset-export, and on the aggregate payload of GET /api/v1/open-dataset. Other routes are not this dataset. Their index is /api/openapi.json.
string · required
Town name, the text before the comma in the listing location. Towns with fewer than 5 live listings are omitted from this file.
Example: Estepona
string · required
Costa label from the listing book for that town.
Example: Costa del Sol
integer · listings · required
Live listings in the town at the time the file was built.
Example: 230
number · EUR · required
Median asking price of the live listings in the town.
Example: 724,500
number · EUR/m² · required
Median asking price per square metre.
Example: 6,793
number · EUR/m² · required
25th percentile of asking price per square metre.
Example: 5,475
number · EUR/m² · required
75th percentile of asking price per square metre.
Example: 8,896
number · m² · required
Median built area of the live listings in the town.
Example: 102
number · percent · required
Share of listings whose type is Villa, Townhouse, or Bungalow.
Example: 13
number · km · nullable
Median beach distance. Null when the town has no beach-distance values.
Example: 1.2
date · YYYY-MM-DD · required
Observation day. Days with no snapshot are absent, not filled with zeros.
Example: 2026-08-05
integer · listings · required
Distinct listing refs observed that day.
Example: 1,990
integer · listings · required
Verified asking-price increases observed that day. Unit changes are not included.
Example: 0
integer · listings · required
Verified asking-price reductions observed that day. Unit changes are not included.
Example: 0
number · percent · nullable
Median absolute size of the verified moves that day. Null when the day had no counted move.
Example: null
integer · listings · required
Listing refs recorded as leaving the feed that day. A delisting is not a registered sale.
Example: 0
integer · listings · required
Delisted refs observed listed again that day.
Example: 0
string · required
Listing ref the move was observed on. The column name is historical; the value is the feed ref.
Example: N6155
date · YYYY-MM-DD · required
Day the new asking price was observed.
Example: 2026-08-06
date · YYYY-MM-DD · required
Day the previous asking price of the same ref was observed. Not necessarily the previous calendar day.
Example: 2026-08-05
number · EUR · required
Previous asking price.
Example: 270,631
number · EUR · required
Newly observed asking price.
Example: 285,631
number · percent · required
Change from the previous observed asking price to the new one, in percent.
Example: 5.54
string · nullable
Town stored on the newer snapshot. Null when the snapshot had none.
Example: La Manga del Mar Menor
string · nullable
Property type stored on the newer snapshot. Null when the snapshot had none.
Example: Townhouse
string · required
Listing ref that left the observed feed. The value is the feed ref.
Example: N9263
string · nullable
Town on the delisting row.
Example: Pinoso
string · nullable
Region code on the delisting row.
Example: cb-south
string · nullable
Property type on the delisting row.
Example: Villa
number · bedrooms · nullable
Bedrooms on the delisting row.
Example: null
number · m² · nullable
Built area on the delisting row.
Example: null
number · EUR · nullable
Last asking price observed before the ref left the feed.
Example: 385,000
number · EUR/m² · nullable
Last asking price per square metre observed before the ref left the feed.
Example: 3,667
date · YYYY-MM-DD · nullable
Last day the ref was observed in the feed.
Example: 2026-08-06
date · YYYY-MM-DD · nullable
First later day the ref was observed listed again. Null when it has not returned. The tombstone row is kept either way.
Example: null
boolean · required
True when the ref is present on the latest observation day. Those rows are not evidence of absorption.
Example: false
string · required
Dataset name written by the open-dataset generator.
Example: Avena Spanish Coastal New-Build Market Observations
string · required
File version, the generation date prefixed with v. Not the Zenodo deposit.
Example: v2026-10-26
integer · required
Schema version of the observation files. 2 added relisted_on, relistings, and the split between delistings that returned and delistings still absent.
Example: 2
timestamp · ISO-8601 · required
When this manifest was generated.
Example: 2026-10-26T06:52:56.385Z
string · required
License string written on the manifest.
Example: CC-BY-4.0
string · required
Attribution string written on the manifest.
Example: Avena Terminal (avenaterminal.com)
date · YYYY-MM-DD · required
First observation day in the published ledger.
Example: 2026-08-05
date · YYYY-MM-DD · required
Latest observation day in the published ledger.
Example: 2026-10-26
integer · days · required
Count of observation days in the file. Not a calendar span.
Example: 76
integer · listings · required
Distinct refs present in the snapshots used to build the file.
Example: 2,343
integer · moves · required
Rows in moves.csv.
Example: 764
integer · listings · required
Rows in tombstones.csv, including refs later observed again.
Example: 328
integer · listings · required
Tombstoned refs with a relisted_on date.
Example: 50
integer · listings · required
Tombstoned refs present again on the latest observation day.
Example: 45
integer · listings · required
Tombstoned refs absent on the latest observation day.
Example: 283
integer · listings · required
Listing-book size when the file was built. It can differ from the book on a later deploy.
Example: 2,051
integer · towns · required
Towns in towns.csv.
Example: 67
integer · listings · required
Minimum live listings for a town to be published in towns.csv.
Example: 5
string · required
DOI of an earlier one-off snapshot. The manifest note says the current dataset version is not that deposit.
Example: 10.5281/zenodo.19520064
date · YYYY-MM-DD · required
Publication date of the Zenodo snapshot named on the manifest.
Example: 2026-04-11
integer · listings · required
Listing count of that Zenodo snapshot, as written on the manifest. Not the current book.
Example: 500
string · required
The generator's own note on what the Zenodo DOI is and is not.
Example: Earlier one-off snapshot. This dataset version is not deposited on Zenodo.
string · nullable
Feed listing reference. Omitted from JSON when the listing has none.
Example: N9739
string · required
Listing title stored on the book.
Example: Modern New Build Villas in Finestrat with Private Pool Near Benidorm
string · required
Source label written by the capture, not a promoter company name. See coverage.
Example: Via Xavia Estate
string · required
Location string as stored, normally "town, province".
Example: Finestrat, Alicante
string · required
Costa name when the listing has one, otherwise the region code.
Example: Costa Blanca North
string · required
Property type stored on the listing.
Example: Villa
number · EUR · required
Asking price. Not a registered transaction price.
Example: 550,000
number · EUR · required
Upper asking price when the feed has a range. Equals price when it does not.
Example: 550,000
number · EUR/m² · nullable
Asking price per square metre of the area used for the listing.
Example: 5,140
number · EUR/m² · required
Area benchmark price per square metre stored on the listing. A model input, not a transaction index.
Example: 6,466
number · m² · required
Built area stored on the listing.
Example: 107
number · m² · nullable
Plot area. Null when the feed has none.
Example: 300
number · bedrooms · required
Bedroom count stored on the listing.
Example: 3
number · bathrooms · required
Bathroom count stored on the listing.
Example: 3
number · km · nullable
Beach distance stored on the listing.
Example: 5
string · required
Build status stored on the listing.
Example: under-construction
string · required
Completion quarter stored on the listing, or TBA when the feed has no delivery date.
Example: 2026-Q4
number · 0–100 · nullable
Avena Score computed when the book is loaded. Not a read of score_history. Null when the listing was not scored.
Example: 79
number · 0–1 · required
Deterministic adversarial confidence computed with the response. The route passes energy as null into that calculation.
Example: 0.94
string[] · required
Reason codes from the same confidence calculation. Empty when none apply.
Example: ["missing_energy"]
boolean · required
True when that confidence is below the review threshold in the confidence module.
Example: false
number · percent · nullable
Gross yield estimate computed with the score. Null when the listing has no yield.
Example: 8.9
number · percent · nullable
Net yield estimate computed with the score.
Example: 5
number · EUR · nullable
Gross annual rent estimate behind the yield.
Example: 49,000
string · required
URL stored on the listing. It is not guaranteed to be an http listing page.
Example: https://www.xaviaestate.com/search-property/province_4/city_65/page_1/order_ddesc/
string · nullable
First image URL stored on the listing.
Example: https://fotos15.apinmo.com/7515/28857817/16-1.jpg
number · degrees · nullable
Latitude stored on the listing.
Example: 38.558160418991896
number · degrees · nullable
Longitude stored on the listing.
Example: -0.20115097434858767
string · ISO 3166-1 alpha-2 · required
Country code. The route writes ES when the listing has none.
Example: ES
string · required
Country name. The route writes Spain when the listing has none.
Example: Spain
string · ISO 4217 · required
Currency code. The route writes EUR when the listing has none.
Example: EUR
string · nullable
Portal name stored on the listing, when the book has one.
Example: null
timestamp · ISO-8601 · nullable
Last sync timestamp stored on the listing, when the book has one.
Example: null
integer · listings · required
Listings matching the filters, before paging. The example is the unfiltered book.
Example: 2,051
integer · listings · required
Page size. Default 20. The route caps it at 50.
Example: 20
integer · listings · required
Paging offset. Default 0.
Example: 0
integer · listings · required
Listings in this page.
Example: 20
number · EUR · required
Mean asking price of the page, not of the whole filtered set.
Example: 472,712
number · 0–100 · required
Mean score of scored listings on the page. The route rounds the mean of an empty page to 0.
Example: 77
string · required
Identifier derived from the feed ref by deriveAPIPId. Not the feed ref itself. The default payload's ref is the feed ref.
Example: ES-COST-1931
integer · 0–100 · required
Rounded score, clamped to 0–100. A listing with no score is emitted as 0.
Example: 53
number · percent · nullable
Gross yield, rounded to 2 decimals. Omitted when the listing has no yield.
Example: 2.4
string · nullable
Present in the APIP schema. toAPIP always sets it undefined, so the JSON omits it. Not populated from this book.
Example: null
string · nullable
Present in the APIP schema. toAPIP always sets it undefined, so the JSON omits it.
Example: null
integer · 0–100 · nullable
Present in the APIP schema. toAPIP always sets it undefined, so the JSON omits it.
Example: null
string · nullable
Copied from the listing energy letter when that letter is A–G. No separate carbon figure is computed. Omitted otherwise.
Example: B
number · nullable
Present in the APIP schema. toAPIP always sets it undefined, so the JSON omits it.
Example: null
string · required
Text before the comma in the location string.
Example: Estepona
string · required
Costa name, or the region code when the listing has no costa.
Example: Costa del Sol
string · ISO 3166-1 alpha-2 · required
Country code. ES when the listing has none.
Example: ES
number · degrees · nullable
Latitude. The coordinates object is omitted unless both lat and lng are present.
Example: 36.42236862288461
number · degrees · nullable
Longitude. Omitted with coordinates when either value is missing.
Example: -5.201588722366235
number · km · nullable
Beach distance. Omitted when the listing has none.
Example: 2.2
number · EUR · required
Asking price.
Example: 560,000
number · EUR/m² · nullable
Asking price per square metre. Omitted when absent or zero.
Example: 7,778
number · EUR/m² · nullable
The listing benchmark price per square metre (mm2). Omitted when absent or zero.
Example: 8,687
string · ISO 4217 · required
Currency. EUR when the listing has none.
Example: EUR
number · local currency · nullable
Pre-conversion price. Omitted when the listing has none. This book's rows do not carry it.
Example: null
number · m² · nullable
Built area. Omitted when absent or zero.
Example: 72
number · bedrooms · nullable
Bedrooms. Omitted when null.
Example: 3
number · bathrooms · nullable
Bathrooms. Omitted when null.
Example: 2
string · nullable
Mapped to private, communal, or none. Other stored values are omitted.
Example: communal
string · nullable
Energy letter A–G, or pending when a value is present but not a letter. Omitted when the listing has none.
Example: B
string · nullable
Mapped to off_plan, under_construction, key_ready, or resale. Unrecognised status text is omitted.
Example: under_construction
string · nullable
Portal stored on the listing. The source object is omitted when portal, source ref, last sync, and URL are all empty.
Example: null
string · nullable
Source reference stored on the listing.
Example: null
timestamp · ISO-8601 · nullable
Last sync timestamp stored on the listing.
Example: null
string · nullable
URL stored on the listing.
Example: mailto:henrik@xaviaestate.com
string · required
Feed ref, or the development ref when the feed ref is missing. Empty string when both are missing.
Example: SP1931
string · required
Property type.
Example: Apartment
string · required
Location string as stored.
Example: Estepona, Málaga
string · required
Region code, not the costa name. The properties API region field prefers the costa name.
Example: costa-del-sol
number · EUR · required
Asking price.
Example: 560,000
number · EUR/m² · nullable
Asking price per square metre.
Example: 7,778
number · 0–100 · nullable
Score computed when the book is loaded.
Example: 53
number · percent · nullable
Gross yield estimate.
Example: 2.4
number · bedrooms · required
Bedroom count.
Example: 3
number · bathrooms · required
Bathroom count.
Example: 2
number · m² · required
Built area.
Example: 72
number · km · nullable
Beach distance.
Example: 2.2
string · required
Source label, not a promoter name.
Example: Via Avena Estate
string · required
Build status.
Example: under-construction
string · nullable
Energy rating stored on the listing.
Example: B
string · nullable
Pool value stored on the listing.
Example: communal
string · required
Constant attribution string written by this route on every row.
Example: Avena Terminal (avenaterminal.com)
string · required
Constant DOI string written by this route on every row. The open-dataset manifest describes that DOI as an earlier snapshot, not the current observation file.
Example: 10.5281/zenodo.19520064
string · required
Literal version written by this route. It is not the version in /open-data/dataset.json.
Example: 1.0.0
string · required
License URL written by this route.
Example: https://creativecommons.org/licenses/by/4.0/
string · required
Full location string from the listing book, including the province. Not the town-only name used in towns.csv.
Example: Estepona, Málaga
integer · listings · required
Listings with that location string.
Example: 230
number · EUR · required
Mean asking price, rounded. The route emits 0 when the input list is empty.
Example: 989,440
number · percent · required
Mean gross yield, one decimal. 0 when the location has no yield estimates.
Example: 2
number · 0–100 · required
Mean score, rounded. 0 when the location has no scores.
Example: 51
number · EUR/m² · required
Mean asking price per square metre, rounded.
Example: 7,903
string · required
Constant attribution written on every aggregate row.
Example: Avena Terminal (avenaterminal.com)
string · required
Constant license string written on every aggregate row.
Example: CC BY 4.0
string · required
Costa label from the listing book.
Example: Costa del Sol
integer · listings · required
Listings in that costa.
Example: 861
number · EUR · required
Mean asking price in the costa, rounded.
Example: 1,006,990
number · percent · required
Mean gross yield in the costa. 0 when none of the listings have a yield.
Example: 2
number · 0–100 · required
Mean score in the costa. 0 when none of the listings have a score.
Example: 50
number · EUR/m² · required
Mean asking price per square metre in the costa, rounded.
Example: 7,925
string · required
Constant attribution written on every aggregate row.
Example: Avena Terminal (avenaterminal.com)
string · required
Constant license string written on every aggregate row.
Example: CC BY 4.0
string · required
Property type.
Example: Apartment
integer · listings · required
Listings of that type.
Example: 886
number · percent · required
Share of the book, one decimal.
Example: 43.2
string · required
Asking-price band label defined in the route.
Example: Under €100k
integer · listings · required
Listings in that band. The top of each band is exclusive.
Example: 1
string · required
Score band label defined in the route.
Example: 90–100 (Exceptional)
integer · listings · required
Scored listings in that band.
Example: 0
string · required
Gross-yield band label defined in the route.
Example: Over 8%
integer · listings · required
Listings whose gross yield falls in that band.
Example: 65
number · required
A single number this route computes from the book averages. It is not the APCI series published at /avena-index.
Example: 22.7
number · 0–100 · required
Mean score of scored listings, one decimal.
Example: 49.9
number · EUR · required
Mean asking price of the book, rounded.
Example: 723,589
number · percent · required
Mean gross yield of listings that have one, two decimals.
Example: 3.58
number · EUR/m² · required
Mean asking price per square metre, rounded.
Example: 6,340
integer · listings · required
Listings in the book used to build the response.
Example: 2,051
integer · listings · required
Listings that have a score.
Example: 2,051
date · YYYY-MM-DD · required
UTC date of the request, not the feed generation date.
Example: 2026-10-26
Last-observed values come from /api/health where that payload has them. A clock time the health payload does not carry is not available.
Refreshes the listing book in public/data.json from the daily capture and rebuilds the open-data observation files. After the book is deployed it calls /api/cron/pricing-history and /api/cron/scribe.
Writes price_snapshots for the current UTC day from the deployed listing book and diffs asking prices against the previous trusted day. Same-unit checks are applied there.
Checks whether today's capture is missing and, only if it is, dispatches feed-refresh. It does not reconstruct an earlier day that was never stored.
Rebuilds data/es-official.json from INE housing price index table 79563 and the Ministerio de Vivienda y Agenda Urbana appraisal file. Separate from the listing history. The Registradores series is recorded as not ingested when the portal refuses the job.
The published observation ledger begins 2026-08-05, the day price capture was pointed at the live feed. Earlier internal tables repeated a frozen snapshot and are excluded. Snapshots before that date are not in the open dataset.
The sell-through monitor records this gap: no snapshots on these dates after a feed outage. Listings last seen the day before the gap and absent the day after left on an unknown date inside the gap and are flagged as exits in that gap. The ledger gaps below are computed from the published movement ledger on this deployment, which can show the same gap and any further gap.
A developer often advertises several units of one building under a single listing reference and changes which unit it shows. A change in asking price counts as a price move only when it is the same unit: same property type, bedrooms and bathrooms, and built and plot size within 2%. When the specification changed, the row is recorded as a unit change and excluded from move counts. A move of 25% or more also needs full specs on both sides, the same photo set, a new EUR/m² within 0.5–2× the area benchmark, and must not return exactly to an asking price the listing showed in the previous 365 days; otherwise it is marked unverified and not counted. Every observation is kept. The verdict is stored on the row.
Snapshot rows carry move_status from 2026-10-24. moves.csv drops a change only when that status is unit_changed or unverified. A row with no status is not dropped. History from before that date was not reclassified.
Asking-price history is a calendar of observations. A stored day is the book captured for that UTC date. Missed days stay missed. Scores on the live API are computed at read time and are not that history.
price_snapshots is written for the current UTC day, one row per listing ref and date. A later capture on the same UTC day upserts that day's row, so the same day can be replaced. The job does not write earlier dates. score rows in score_history are not rewritten: the scribe upsert ignores a row that already exists for that ref and date.
A calendar day that was not captured is not backfilled. The capture backstop only dispatches a fresh capture when today is missing. It cannot invent the book for a day that has already passed without a snapshot.
score_history is written by /api/cron/scribe. The Vercel cron is 03:05 UTC (5 3 * * *), and feed-refresh.yml calls the same route after a deploy. Existing rows are not updated. Rows dated before 2026-08-21 can be filed one day after the book they describe. The route dates rows from the feed file after that seam and does not rewrite the earlier rows.
score, yield, and score_confidence on GET /api/v1/properties are computed when the response is built. They are not a read of score_history. A methodology change changes the live score without rewriting stored history.
The open dataset is rebuilt from snapshots on or after 2026-08-05 and from the listing book at build time. Rebuilding it does not create rows for dates that have no snapshot. A same-day replacement of today's snapshot is what a later build of that same day will contain.
Scribe last run: not available. /api/health does not report the scribe job, so its last-run timestamp is not available.
GET · JSON · API key required. A request with no key is rejected.
Listing page, default 20 rows, cap 50. format=apip returns the APIP shape of the same page. Pricing on request. See /license and /access.
GET · JSON. CSV with ?format=csv. JSONL wrappers with ?format=kaggle and ?format=huggingface. · No key on this route.
Column subset of the current listing book. The kaggle and huggingface query values change the file shape. They do not mean this response was fetched from those sites.
GET · JSON · No key.
Aggregate counts for the current book. No listing rows.
GET · JSON and CSV · No key.
Observation files: dataset.json, towns.csv, towns.json, movement-ledger.csv, movement-ledger.json, moves.csv, moves.json, tombstones.csv, tombstones.json.
GET · git, market/ directory · Public repository.
Mirror of the observation files. /api/health compares market/dataset.json. Latest mirror date from this health read: 2026-10-25.
GET · JSON · No key.
Current listing book used by the site, including description text and image URLs that the open observation files omit. It is the current cross-section, not the price history.
GET · CSV · No key.
First 25 data rows of public/open-data/moves.csv, unchanged.
GET · HTML. Source file data/es-official.json. · No key.
Weekly official benchmark. Not the listing history.
GET · Hugging Face dataset · Public page.
feed-refresh.yml uploads the open-data files here when HF_TOKEN is set, and leaves the existing copy when it is not. /api/health does not report this copy. Freshness is not available.
The observation manifest on this deployment says license CC-BY-4.0 and attribution "Avena Terminal (avenaterminal.com)". The license page states that aggregate datasets, research papers, and training data published by Avena Terminal are under CC BY 4.0, with attribution to Avena Terminal (avenaterminal.com).
Earlier one-off snapshot. This dataset version is not deposited on Zenodo.
The keyed listings API is covered by the API section of /license. This pack does not restate tiers. Commercial terms: Pricing on request. License · Pricing on request
These values were not computed for this response. The reason is the one recorded at generation time.