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 walking distance. Each lot carries availability, base rate, max daily, lot type, and a permalink. 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 every lot inside a bbox as a FeatureCollection per RFC 7946. Carries an ETag for conditional requests. 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 and pagination.

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, ingest into a paid model fine-tune, or inclusion in a closed corporate dataset — requires a tier 2 API key. Email developers@parkgraph.com for terms; commercial agreements are typically signed inside two weeks.

Comparison of Park Graph data licensing tiers — free read access, tier 1 commercial, tier 2 fine-tuning
Park Graph data licensing tiers — what is free, what is commercial, and what is reserved for fine-tuning partners.

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", "operator_id", "geometry", "capacity", "rate_per_hour", "rate_unit"],
  "properties": {
    "id":             { "type": "string", "format": "uuid" },
    "name":           { "type": "string" },
    "operator_id":    { "type": "string", "format": "uuid" },
    "geometry":       { "$ref": "https://geojson.org/schema/Polygon.json" },
    "capacity":       { "type": "integer", "minimum": 1 },
    "available_spaces": { "type": "integer", "minimum": 0 },
    "rate_per_hour":  { "type": "number" },
    "rate_unit":      { "enum": ["hour", "day", "night", "event"] },
    "max_daily":      { "type": "number" },
    "lot_type":       { "enum": ["open", "covered", "valet", "accessible", "ev_only"] },
    "amenities":      { "type": "array", "items": { "enum": ["covered", "ev_charging", "ev_dc_fast", "valet", "shuttle", "ada", "lighting", "cctv", "attendant"] } },
    "permalink":      { "type": "string", "format": "uri" },
    "updated_at":     { "type": "string", "format": "date-time" }
  }
}

Every endpoint that returns a lot — the JSON inventory feed, the GeoJSON inventory feed, the per-lot detail endpoint, and the Parquet drop — uses this same shape. AI agents that ingest the schema once can consume every endpoint without further translation.

Conditional requests and ETag caching

Both inventory feeds support conditional requests via ETag. The ETag is derived from the most recent updated_at timestamp of any lot inside the response set; an If-None-Match header that matches the current ETag returns HTTP 304 without a body. AI agents that re-render maps frequently should cache the last seen ETag and re-issue conditional requests every 30-60 seconds; the dispatcher will only return a fresh body when something has actually changed.

Conditional GETbash
# First request: no ETag, returns 200 with body and ETag header
curl -sS -D - "https://parkgraph.com/api/v1/lots.geojson?bbox=-106.5,39.5,-106.2,39.7" -o body.json

# Subsequent request: pass the ETag, get 304 when unchanged
curl -sS -D - -o /dev/null \
  -H 'If-None-Match: "etag-from-last-response"' \
  "https://parkgraph.com/api/v1/lots.geojson?bbox=-106.5,39.5,-106.2,39.7"
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 by default and at the lot level for tier 2 keys. Each row carries the agent platform name (one of openai, claude, gemini, grok, perplexity, copilot, other), the query volume, the conversion rate to a paid session, the peak hour band, and the top three search locations as anonymised lat/lng cells. The default aggregation window is 7 days; the maximum is 90 days for tier 1 and 365 days for tier 2.

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 (resyndication, fine-tuning a model on the corpus) requires a tier 2 API key and a written agreement. Email developers@parkgraph.com for terms.

Can I fine-tune a model on the corpus?

Yes, with a tier 2 key. The corpus is delivered as monthly Parquet drops to a customer-supplied S3 bucket. Personally identifiable fields (driver email, license plate) are stripped before delivery; only operator-public fields ship.

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 hours, and top search locations. Aggregations are 24-hour, 7-day, and 30-day. See /developers/intelligence-api for the full schema.

How do I avoid hammering the API?

Use the GeoJSON feed with conditional requests. Every response carries an ETag derived from the latest lot-update timestamp inside the bbox; an If-None-Match header gets a 304 when nothing has changed.

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). For longitudinal replay, request the monthly Parquet drop, which is byte-stable.

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 (resyndication, fine-tuning a model on the corpus) requires a tier 2 API key and a written agreement. Email developers@parkgraph.com for terms.
Can I fine-tune a model on the corpus?
Yes, with a tier 2 key. The corpus is delivered as monthly Parquet drops to a customer-supplied S3 bucket. Personally identifiable fields (driver email, license plate) are stripped before delivery; only operator-public fields ship.
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 hours, and top search locations. Aggregations are 24-hour, 7-day, and 30-day. See /developers/intelligence-api for the full schema.
How do I avoid hammering the API?
Use the GeoJSON feed with conditional requests. Every response carries an ETag derived from the latest lot-update timestamp inside the bbox; an If-None-Match header gets a 304 when nothing has changed.
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). For longitudinal replay, request the monthly Parquet drop, which is byte-stable.
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 — Live Inventory, Rates, and Demand | Park Graph