Access proprietary parking market intelligence — rates, demand forecasts, and AI agent analytics — through a simple REST API. No lot management required.
Evaluate parking revenue potential before acquiring properties. Compare market rates across locations.
Understand parking demand patterns to optimize urban infrastructure and zoning decisions.
Route drivers to high-availability areas and predict pricing for parking-integrated services.
Assess parking infrastructure density and demand patterns for risk modeling.
Pay per query. No minimums, no subscriptions required.
$0.10
per query
$0.25
per query
$1.00
per query
Rate limit: 100 queries/minute per API key. Volume discounts available for Enterprise plans.
All endpoints require an API key with the intelligence scope.
/api/v2/intelligence/market-rate$0.10Average hourly/daily rates, rate ranges, demand scores, and competitor counts for any location.
Request
curl -H "Authorization: Bearer pk_live_..." \ "https://parkgraph.com/api/v2/intelligence/market-rate?lat=40.7128&lng=-74.0060&radius_km=2"
Response
{
"data": {
"market_rate": {
"avg_hourly_cents": 350,
"avg_daily_cents": 2500,
"min_hourly_cents": 200,
"max_hourly_cents": 500
},
"demand_score": 78,
"competitor_count": 12
}
}/api/v2/intelligence/demand-forecast$0.25Predicted demand scores, expected occupancy, and dynamic pricing recommendations for a location and date.
Request
curl -H "Authorization: Bearer pk_live_..." \ "https://parkgraph.com/api/v2/intelligence/demand-forecast?lat=40.7128&lng=-74.0060&date=2026-04-15"
Response
{
"data": {
"predicted_demand_score": 85,
"expected_sessions": 45,
"expected_events": [
{ "name": "Weekend", "type": "recurring", "impact": "high" }
],
"price_recommendation": {
"recommended_rate_cents": 420,
"multiplier": 1.2,
"rationale": "High demand expected"
}
}
}/api/v2/intelligence/agent-demand$1.00AI agent query volumes, platform breakdowns, conversion rates, peak times, and coverage data for any city.
Request
curl -H "Authorization: Bearer pk_live_..." \ "https://parkgraph.com/api/v2/intelligence/agent-demand?city=Denver&state=CO&days=30"
Response
{
"data": {
"total_agent_queries": 1247,
"conversion_rate_pct": 34.2,
"platform_breakdown": {
"openai": 523, "google": 312,
"claude": 198, "perplexity": 214
},
"peak_day": "Friday",
"peak_times": [
{ "hour": 17, "label": "5:00 PM", "query_count": 89 }
],
"top_search_locations": [
{ "location": "Downtown Denver", "query_count": 312 }
],
"coverage_level": "partial"
}
}Create an API key with the intelligence scope and start querying parking data in minutes.
The Park Graph Intelligence API sits behind the same security perimeter as the dashboard and the public website. The notes below summarise the controls that apply to every Intelligence API request; a deeper write-up lives in the developer changelog.
Authentication
Every authenticated request carries an API key in the Authorization header (`Bearer pk_live_…`). Keys are issued per project from /dashboard/api-keys. Rotation is an HTTP DELETE + re-create in the dashboard; old keys are revoked immediately. Live and sandbox keys use the `pk_live_` and `pk_test_` prefixes so they cannot be confused in code review.
Transport security
TLS 1.3 with HSTS preloaded on every host (parkgraph.com, *.parkgraph.com). Plaintext requests are rejected at the edge with HTTP 426. Certificates are issued through the public Let's Encrypt CA and pinned in the CT logs.
Payment handling
Card data is tokenised inside Stripe Elements on the driver's device — Park Graph never observes raw PANs and is therefore SAQ-A scope. Sessions reference Stripe PaymentIntents by id only; webhooks are signed by Stripe using HMAC-SHA256 and verified server-side before any state change.
Data retention
Driver email addresses and license plates are retained for the lifetime of the operator's relationship with Park Graph (or 30 days after a verified delete request, whichever comes first). Search-only requests with no booking outcome are anonymised after 24 hours. Aggregated occupancy data has no personal identifiers and is retained indefinitely.
Audit trail
Every write — session create, end, extend, refund, rate change, agent registration — appends an immutable row to the audit_log table with actor type, actor id, and the diff. The log is exposed to operators through the dashboard activity feed and via a per-lot CSV export. Deletes are tombstoned, not hard-removed.
Limits are enforced per API key (or per IP for unauthenticated reads) using a rolling token bucket. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers; 429 responses additionally carry Retry-After. Bursts above the per-minute budget should be backed off with jitter — the official SDK does this automatically.
| Scope | Budget | Window |
|---|---|---|
| Market-rate, demand, and forecast endpoints | 60 requests | per API key per minute |
| Bulk export / GeoJSON dumps | 12 requests | per API key per hour |
| AI-agent demand analytics | 120 requests | per API key per minute |
Need a higher ceiling? Email developers@parkgraph.com with your projected throughput and we will lift the burst budget on a per-key basis.
Every error response uses the same envelope: { "error": { "code": "…", "message": "…", "request_id": "req_…" } }. The HTTP status indicates the broad class; the code field disambiguates within a class. Surface the request_id to your support team — we can look up the full server-side trace by id alone.
| Code | HTTP status | Meaning |
|---|---|---|
| BAD_REQUEST | 400 | Required parameter missing or out of range. Response body lists the offending field. |
| UNAUTHORIZED | 401 | Missing or malformed Authorization header. Send `Authorization: Bearer pk_live_…`. |
| FORBIDDEN | 403 | API key is valid but the plan does not include this scope (e.g. agent or intelligence endpoints on Starter). |
| NOT_FOUND | 404 | Lot, session, or webhook id does not exist or has been deleted. |
| CONFLICT | 409 | Idempotent retry of a non-terminal session, or attempt to end an already-completed session. |
| RATE_LIMITED | 429 | Per-key burst budget exceeded. Inspect `Retry-After` and back off. |
| PAYLOAD_TOO_LARGE | 413 | Webhook delivery body or batch upload exceeds 1 MB. |
| INTERNAL | 500 | Unexpected server error. Park Graph automatically opens an incident and retries idempotent writes. |
| BAD_GATEWAY | 502 | Upstream payment processor returned an error. Safe to retry with the same idempotency key. |
Park Graph is built for agentic distribution: every commercial endpoint (search, availability, rates, sessions, refunds) is callable by an LLM through MCP, OpenAI Actions, Gemini function declarations, xAI function calling, Perplexity Agent API, or Microsoft Copilot plugins. The grid below maps the most common agent-driven workflows on top of the Intelligence API.
Conversational booking
An end user asks ChatGPT, Claude, Gemini, Grok, or Perplexity to find parking near a destination. The model calls /lots/search, summarises 3-5 lots with prices and walking distance, then on confirmation calls /sessions to start a session and returns the QR-coded receipt URL.
Travel-app companion
A flight-booking or hotel-booking assistant pre-fetches arrival-airport parking for the trip dates and displays inline lot suggestions inside its itinerary view. The same surface backs in-app booking and a fallback web checkout.
Voice-first ordering
Realtime voice assistants (e.g. gpt-realtime, Gemini Live, Grok Voice) confirm a lot, plate, and duration verbally, then call /sessions and read back the session code. Drivers never touch a screen until they walk away from the car.
Fleet dispatcher
An autonomous-vehicle fleet (rideshare, delivery, robotaxi) holds AV-fleet allocations with /av-fleet/dispatch, then commits the spot at handoff. See /developers/av-fleet for the AV-specific contract.
Procurement / expense agent
An accounts-payable agent reconciles staff parking against company-card statements by querying /sessions/search by plate, then files reimbursements through the agent's own ledger.
City planning analytics
A research agent queries /api/v2/intelligence/market-rate and /api/v2/intelligence/agent-demand for an address corridor, then drafts a report on rate elasticity and AI-agent traffic.
Every Park Graph request — whether it arrives from the Intelligence API, the dashboard, the QR-driven mobile checkout, or an agent — runs through the same Next.js Edge front door, hits the same Postgres-backed core, and shares the same audit log and webhook fan-out. There is no divergent code path between "agent traffic" and "human traffic": anything an agent can do, a human can do, and vice versa.
Every operator gets a sandbox key prefixed with pk_test_. Sandbox traffic uses Stripe test mode, synthetic lots, and never charges a real card. Spin one up at /developers/sandbox, then point your client at https://parkgraph.com/api/v1 exactly as you would in production.
For integration help, reach the developer team at developers@parkgraph.com or open an issue on the public GitHub org. Status and incident history live at /developers/changelog; subscribe to the JSON feed for machine-readable updates.