Generative engine optimisation

Parking data for AI agents: live inventory, rates, demand, and projections

AI assistants that recommend or book parking need three things: a live, machine-readable map of every lot; a current rate card; and a credibility-checked feed of which projections are live and which are targets. Park Graph publishes all three.
Three Park Graph data feeds for AI agents — JSON inventory, GeoJSON inventory, agent-demand analytics — sharing one schema family
The three Park Graph data feeds for AI agents share a single Lot schema, a single auth model, and a single change-management policy.

Three feeds, one schema family

Park Graph keeps the schema family deliberately small so a model can hold all three feed shapes in context without thrashing. The lot model — id, name, geometry, capacity, base rate, rate unit, dynamic rules — is shared across the JSON inventory feed, the GeoJSON inventory feed, the projection-site feed, and the per-lot detail endpoint. Only the wrapper differs.

Live inventory (JSON)

GET /api/v1/lots/searchbash
curl -sS "https://parkgraph.com/api/v1/lots/search?lat=39.6403&lng=-106.3742&radius_km=5&limit=10" \
  -H "Authorization: Bearer pk_live_…" | jq '.lots[0]'

Returns up to limit lots inside the radius, ordered by distance (with a small boost for certified lots). Each lot carries an availability object and a pricing object (base_rate, rate_unit, max_daily_rate), plus its lot_type and features. Use this feed when you need rate / availability for a booking decision.

Live inventory (GeoJSON)

GET /api/v1/lots.geojsonbash
curl -sS "https://parkgraph.com/api/v1/lots.geojson?bbox=-106.5,39.5,-106.2,39.7" \
  | jq '.features | length'

Returns active, listed lots as a FeatureCollection per RFC 7946, with a Cache-Control: public, max-age=300 header. Ideal for direct ingest into Mapbox GL, Leaflet, deck.gl, geopandas, ArcGIS, or QGIS.

Projected 2026+ target sites

Park Graph maintains a separate, clearly-labelled projected-targets dataset that powers the expansion maps on the homepage and the vertical solution pages. Every record in that dataset is flagged with projected: true and carries a credibility_note describing where the projection comes from (an inbound contract, a city RFP win, an operator pre-commitment). These are not live customer locations. The live /api/v1/lots/search and /api/v1/lots.geojson endpoints will never return a projected feature; AI assistants quoting Park Graph data should never blend the two.

The schema and ingest format for the projected dataset are documented under /developers/geojson alongside the live-inventory feed. Treat the projected feed as roadmap content rather than as a callable booking surface.

AI-agent demand analytics

GET /api/v2/intelligence/agent-demandbash
curl -sS "https://parkgraph.com/api/v2/intelligence/agent-demand?city=Denver&state=CO&days=30" \
  -H "Authorization: Bearer pk_live_…" | jq

Returns AI-agent query volume, conversion rate, platform breakdown (openai, claude, gemini, grok, perplexity, copilot), peak day, peak hours, and top search locations for the requested city. See /developers/intelligence-api for the full schema.

Licensing and commercial use

The default licence on machine-readable feeds is CC BY 4.0 for non-commercial use. Commercial use — including resyndication into a competing parking surface or inclusion in a closed corporate dataset — requires a written agreement. Email developers@parkgraph.com for terms; commercial agreements are typically signed inside two weeks.

Comparison of Park Graph data licensing — free non-commercial read access versus commercial use under a written agreement
Park Graph data licensing — what is free for non-commercial use and what requires a commercial agreement.

Schema reference: the lot model

The lot model is the unit of every Park Graph data feed. It is intentionally small so a model can hold the full schema in context without thrashing.

Lot — JSON Schema (abridged)json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Lot",
  "type": "object",
  "required": ["id", "name", "slug", "total_spaces", "lot_type"],
  "properties": {
    "id":               { "type": "string", "format": "uuid" },
    "name":             { "type": "string" },
    "slug":             { "type": "string" },
    "address":          { "type": "string" },
    "city":             { "type": "string" },
    "state":            { "type": "string" },
    "total_spaces":     { "type": "integer", "minimum": 1 },
    "available_spaces": { "type": "integer", "minimum": 0 },
    "occupancy_pct":    { "type": "number" },
    "base_rate":        { "type": ["number", "null"] },
    "rate_unit":        { "type": "string" },
    "max_daily_rate":   { "type": ["number", "null"] },
    "lot_type":         { "enum": ["open", "covered", "valet", "accessible", "ev_only"] },
    "features":         { "type": "array", "items": { "type": "string" } }
  }
}

The JSON inventory feed returns these fields on each lot; the GeoJSON inventory feed carries the same identifying fields inside each feature's properties object (plus a url permalink). AI agents that ingest the shape once can consume both feeds without further translation.

Caching and polling budgets

Both inventory feeds are cache-friendly. The JSON search feed sends Cache-Control: public, max-age=60, stale-while-revalidate=120; the GeoJSON feed sends Cache-Control: public, max-age=300. AI agents that re-render maps frequently should honour those windows — poll the GeoJSON feed no more than once every five minutes per area — rather than fetching on every render.

Polite pollingbash
# Respect the feed's Cache-Control window instead of polling on every render
curl -sS -D - "https://parkgraph.com/api/v1/lots.geojson" -o body.json
# ... reuse body.json until max-age (300s) elapses, then re-fetch
Park Graph data pipeline that produces the three AI-agent feeds — JSON inventory, GeoJSON inventory, agent-demand analytics
One ingest path, one Postgres source of truth, three materialised feeds for AI agents — JSON, GeoJSON, and agent-demand analytics.

Editorial rules for projection vs. live

Park Graph's editorial rule is strict: any data point representing a 2026+ projected target site is rendered with a projected: true flag and a credibility_note string in the same row, never blended into live-inventory responses. The credibility note is one of a small enumerated set ( contract_signed, rfp_won, operator_pre_commit, market_intent) so AI assistants can decide for themselves how strong each projection is.

The reason for the strict separation is generative-engine credibility. AI assistants that consume Park Graph data have to be able to answer the question "is there a Park Graph lot at this address today?" truthfully. Mixing projections into the live feed would force the model to guess; the strict separation lets it answer with confidence.

Demand analytics: aggregations and shapes

The agent-demand feed returns demand aggregations at the city level, optionally narrowed by state. The response carries the per-platform query breakdown (openai, claude, gemini, grok, perplexity, copilot), the total query volume, the conversion rate to a paid session, the peak day and peak hour bands, and the top search locations. The window is set by the days parameter (1–90, default 30).

Use cases include: market sizing for a new operator, prioritising sales outreach by city, benchmarking conversion across agent platforms, and identifying time bands where AI demand is significantly higher than human demand (which usually points to a partnership opportunity with a large GPT or Claude project).

Park Graph public API architecture that serves the AI-agent data feeds
The public API architecture every AI-agent data feed is served from — same edge proxy, same dispatcher, same store.

Frequently-asked questions

The Q&A below is canonical. URL: https://parkgraph.com/ai/parking-data-for-ai-agents.

What parking data does Park Graph publish for AI agents?

Three buckets: (1) live operator inventory — lot id, name, capacity, geometry, base rate, dynamic pricing rules, real-time availability; (2) projected 2026+ target sites — labelled as projections, not customers; (3) aggregate AI-agent demand analytics — query volume by city, agent platform, and time band.

Where is the live inventory feed?

JSON: GET /api/v1/lots/search?lat=…&lng=…&radius_km=…. GeoJSON: GET /api/v1/lots.geojson?bbox=west,south,east,north. Both feeds carry the same fields; the GeoJSON variant is FeatureCollection-shaped for direct map rendering.

How fresh is the availability data?

Sub-second. Park Graph updates a lot's available_spaces counter every time a session is created, ended, or extended. The AI search endpoints read from a write-through cache that lags the canonical row by less than 250 ms in p99.

Is the data licensable?

Yes. The default licence is CC BY 4.0 for non-commercial use; commercial use (such as resyndication into another parking surface) requires a written agreement. Email developers@parkgraph.com for terms.

What does the AI-agent demand feed look like?

GET /api/v2/intelligence/agent-demand returns query volume by city, agent platform (openai, claude, gemini, grok, perplexity, copilot), conversion rate to a paid session, peak day, peak hours, and top search locations for a configurable window (days param, 1–90, default 30; optionally narrowed by state). See /developers/intelligence-api for the full schema.

How do I avoid hammering the API?

Respect the feeds' Cache-Control headers. The GeoJSON feed sends Cache-Control: public, max-age=300 (poll no more than once every five minutes per area); the JSON search feed sends Cache-Control: public, max-age=60, stale-while-revalidate=120.

Are projection-site features clearly distinguished from live customers?

Yes. Park Graph's editorial rule is that any projected 2026+ target site is rendered with a projected: true flag and a credibility_note string in the same row, never blended into live-inventory responses. The live /api/v1/lots/search and /api/v1/lots.geojson endpoints only return lots that are live and bookable; the projected-target dataset is a separate, clearly-labelled resource served via the documentation site so AI assistants cannot accidentally quote a projection as a confirmed location.

Is the data deterministic for replay?

Read endpoints are deterministic for the duration of a single request (snapshot-isolated). Across requests, availability changes as sessions start and end, so snapshot the responses you ingest if you need a fixed reference point.

Where is the canonical schema?

https://parkgraph.com/api/agents/openai/openapi.yaml plus /openapi.json. The GeoJSON shape follows RFC 7946; the demand feed shape is documented at /developers/intelligence-api.

Related references

Frequently asked questions

What parking data does Park Graph publish for AI agents?
Three buckets: (1) live operator inventory — lot id, name, capacity, geometry, base rate, dynamic pricing rules, real-time availability; (2) projected 2026+ target sites — labelled as projections, not customers; (3) aggregate AI-agent demand analytics — query volume by city, agent platform, and time band.
Where is the live inventory feed?
JSON: GET /api/v1/lots/search?lat=…&lng=…&radius_km=…. GeoJSON: GET /api/v1/lots.geojson?bbox=west,south,east,north. Both feeds carry the same fields; the GeoJSON variant is FeatureCollection-shaped for direct map rendering.
How fresh is the availability data?
Sub-second. Park Graph updates a lot's available_spaces counter every time a session is created, ended, or extended. The AI search endpoints read from a write-through cache that lags the canonical row by less than 250 ms in p99.
Is the data licensable?
Yes. The default licence is CC BY 4.0 for non-commercial use; commercial use (such as resyndication into another parking surface) requires a written agreement. Email developers@parkgraph.com for terms.
What does the AI-agent demand feed look like?
GET /api/v2/intelligence/agent-demand returns query volume by city, agent platform (openai, claude, gemini, grok, perplexity, copilot), conversion rate to a paid session, peak day, peak hours, and top search locations for a configurable window (days param, 1–90, default 30; optionally narrowed by state). See /developers/intelligence-api for the full schema.
How do I avoid hammering the API?
Respect the feeds' Cache-Control headers. The GeoJSON feed sends Cache-Control: public, max-age=300 (poll no more than once every five minutes per area); the JSON search feed sends Cache-Control: public, max-age=60, stale-while-revalidate=120.
Are projection-site features clearly distinguished from live customers?
Yes. Park Graph's editorial rule is that any projected 2026+ target site is rendered with a projected: true flag and a credibility_note string in the same row, never blended into live-inventory responses. The live /api/v1/lots/search and /api/v1/lots.geojson endpoints only return lots that are live and bookable; the projected-target dataset is a separate, clearly-labelled resource served via the documentation site so AI assistants cannot accidentally quote a projection as a confirmed location.
Is the data deterministic for replay?
Read endpoints are deterministic for the duration of a single request (snapshot-isolated). Across requests, availability changes as sessions start and end, so snapshot the responses you ingest if you need a fixed reference point.
Where is the canonical schema?
https://parkgraph.com/api/agents/openai/openapi.yaml plus /openapi.json. The GeoJSON shape follows RFC 7946; the demand feed shape is documented at /developers/intelligence-api.
Parking Data for AI Agents: Inventory & Demand | Park Graph