For Listing Portals

Make Every Listing Page
AI-Visible at Scale

82% of property searches now start with an AI query. Most listing portals are invisible because individual pages are missing the geo data layer AI engines need to resolve, rank, and cite them.

82%of consumers use AI for property and local research
1.2%of listing pages currently appear in AI recommendations
1 APIthe GeoEnrich API, purpose-built for listing portals

Your listings exist as addresses.
AI engines need geographic entities.

Standard listing databases store what humans enter: address, price, bedrooms, photos. They were never designed to supply machine-readable geographic context. When AI engines try to match listings against location queries, three critical data gaps cause them to skip your pages entirely.

Missing Coordinates

Address strings are not machine-queryable. Without precise GeoCoordinates on every listing page, AI engines cannot place your listings in geographic space or match them to proximity queries like "apartments near the park."

Missing Neighborhood Context

Without containedInPlace linking each listing to its neighborhood and city entities, AI cannot retrieve your listings for area-level queries like "apartments in Prenzlauer Berg" or "villas in the Algarve."

Missing Nearby Context

Queries like "flats near the metro" or "homes close to good schools" require structured relationships to nearby places. A sentence in the description is not a queryable signal for AI retrieval.

One call. Complete geo layer.

One GeoEnrich API call per listing. Run at build time or server-side. Returns coordinates, neighborhood hierarchy, and nearby places in a single response, ready to inject as JSON-LD.

Step 1

Send the listing address

Pass the raw address string to GeoEnrich API. One call returns everything: precise coordinates, the full neighborhood and city hierarchy, and structured nearby places within your chosen radius. Run in bulk against your entire database at build time.

Node.js
const res = await fetch(
  `https://api.mapatlas.eu/v1/geoenrich
    ?address=${encodeURIComponent(listing.address)}
    &radius=600
    &categories=transit,education,leisure
    &key=${API_KEY}`
);
const { geo } = await res.json();
Step 2

Receive the enriched geo layer

The response includes coordinates, neighborhood, district, city, country, and an array of nearby places with type, name, and distance. Every field maps directly to a schema.org property, so the JSON-LD write is mechanical. Optional parameters unlock additional layers per nearby place: website, phone, opening hours, and category tags, useful for richer listing pages or internal data pipelines.

Response JSON
{
  "coordinates": { "lat": 52.5384, "lng": 13.4132 },
  "neighborhood": "Prenzlauer Berg",
  "district": "Pankow",
  "city": "Berlin",
  "country": "DE",
  "dataTimestamp": "2026-03-01T00:00:00Z",
  "nearby": [
    { "name": "Eberswalder Str.", "type": "transit",   "distance": 140 },
    { "name": "Kollwitzplatz",    "type": "leisure",   "distance": 210 },
    { "name": "Grundschule ...",  "type": "education", "distance": 380 }
  ]
}
Step 3

Inject the complete JSON-LD

Map the geo layer directly to JSON-LD and embed it in every listing page. Each listing becomes a resolvable geographic entity: retrievable by area, by proximity, by price, and by room count. For a full schema reference, see the JSON-LD schema guide.

JSON-LD output
{
  "@context": "https://schema.org",
  "@type": "Apartment",
  "name": listing.title,
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": geo.coordinates.lat,
    "longitude": geo.coordinates.lng
  },
  "containedInPlace": {
    "@type": "Place",
    "name": geo.neighborhood,
    "containedInPlace": { "@type": "City", "name": geo.city }
  },
  "amenityFeature": geo.nearby.map(p => ({
    "@type": "LocationFeatureSpecification",
    "name": p.name,
    "value": true,
    "description": `${p.distance}m nearby`
  })),
  "dateModified": geo.dataTimestamp
}

The GeoEnrich API

A single endpoint purpose-built for listing portals. Pass an address, receive the complete geo data layer needed to make that listing AI-visible. EU-hosted and GDPR-compliant.

Precise coordinates

Four decimal places minimum. Directly populates the GeoCoordinates block on every listing page.

Neighborhood hierarchy

Neighborhood, district, city, and country resolved from the address. Powers the containedInPlace chain for area-level AI retrieval.

Nearby places

Transit, education, leisure, and healthcare within a configurable radius. Each place returned with distance and walk time for amenityFeature schema.

Monthly data refresh with timestamp

Every response includes a dataTimestamp updated monthly. Map it to dateModified in your JSON-LD and AI engines see verified, current data, not stale listings.

Single endpoint
GET /v1/geoenrich

Parameters:
  address    string   Required
  radius     number   Meters (default 600)
  categories string   Comma-separated
  key        string   API key

Returns:
  coordinates    { lat, lng }
  neighborhood   string
  district       string
  city           string
  country        string (ISO 3166-1)
  dataTimestamp  string (ISO 8601, monthly refresh)
  nearby         Place[]
    name         string
    type         string
    distance     number (meters)

See which geo signals your listing pages are missing

Before building the pipeline, run your existing listing pages through the MapAtlas AEO Checker. It identifies exactly which geo signals are missing: coordinates, containedInPlace, and nearby POI data. The failing signals are exactly what GeoEnrich API supplies.

Run the AEO Checker
GeoCoordinates present on listing page
containedInPlace neighborhood resolved
Nearby transit stops as structured data
Nearby schools and amenities linked
Offer schema with price and availability
Correct schema type for listing category

Common questions

Start geo-enriching your listing pages

One API. Three steps. Every listing becomes an AI-resolvable geographic entity.