API & MCP Access

Beyond browsing the map or downloading a static snapshot, the DeepPVMapper registry can be queried live: directly from your own code with a plain REST API, or in plain language through an MCP server that plugs straight into Claude and other MCP-compatible clients.

Bulk download

Want the whole dataset once, to work with offline?

See the Raw data options →

MCP server

Want to ask questions in plain language, or let an AI agent explore the data for you?

Set up MCP →

REST API

Building your own app or script and need live, filtered data on demand?

See the REST API →
New

MCP Server

DeepPVMapper publishes an MCP server — a small, read-only bridge that lets an AI assistant call the registry itself instead of guessing. Once connected, you (or whoever you're working with) can ask about installed capacity, deployment trends, or specific detections directly in a conversation, and get answers backed by the actual data.

1

Open your MCP client's connector settings

In Claude Desktop or on claude.ai: Settings → Connectors → Add custom connector. Claude Code, Cursor and most other MCP clients have an equivalent "add a remote server" option.

2

Paste the server URL

https://zelhliylrlktnasircwp.supabase.co/functions/v1/mcp/mcp

Using Claude Code from a terminal instead? One command does the same thing:

claude mcp add deeppvmapper -t http https://zelhliylrlktnasircwp.supabase.co/functions/v1/mcp/mcp
3

Reconnect, then just ask

Restart or reconnect the client. A tool named deeppvmapper should appear — no API key or account needed, it only reads the same public data the website itself uses.

An example

Give me the share of installations above 9 kWp in Charente. Are they located in specific spots within the département?
get_department_capacity_stats aggregate_detection_capacity search_detections

Charente has 10,914 installations totaling 252,425 kWp. 812 (≈7.4%) are above 9 kWp — but they account for ≈18.6% of the département's capacity.

Spatially they're not clustered: spread across well over 100 communes, mostly 1–6 per commune — consistent with scattered barns, farm buildings and commercial roofs in a mostly rural département, with a light concentration around Angoulême.

How about Cognac and the Petite Champagne territory?
aggregate_detection_capacity web search

Cognac (town): 132 installations, 617 kWp — only 6.1% are above 9 kWp, yet that slice is 47.7% of the town's capacity.

Petite Champagne (the 16 Charente communes inside the cru): 254 installations, 2,577 kWp — 13.0% are above 9 kWp, representing 73.6% of the zone's capacity. Both skew far more toward large systems than Charente overall (≈18.6%).

Three towns — Barbezieux-Saint-Hilaire, Barret and Châteauneuf-sur-Charente — account for ~64% of those large installations. One curiosity: Ladiville's entire large-system footprint is a single 250 kWp array — likely a distillery or warehouse roof, not a house.

Worth knowing: every answer above still carries the registry's usual caveats — estimated recall of ~60% (a missing detection isn't evidence of absence), and capacity/surface/tilt figures are model estimates, not surveyed measurements. The MCP server exposes a dedicated tool for this, so an assistant can check how much to trust a result before stating it.

REST API

For your own code — a script, a notebook, a backend service — the registry is also a plain PostgREST API. No account or key request needed: every public request uses the same publishable key, shown below, that the website itself uses.

1

Query detections directly

Detections in Gironde (département 33) with an estimated capacity above 9 kWp:

curl "https://zelhliylrlktnasircwp.supabase.co/rest/v1/detections?dpt=eq.33&kwp=gt.9&select=id,geom,surface,kwp,first_seen" \
  -H "apikey: sb_publishable_rKz4rtTA3hpRxPgN3C3yAg_bbT5iTBi" \
  -H "Authorization: Bearer sb_publishable_rKz4rtTA3hpRxPgN3C3yAg_bbT5iTBi"
2

Or pull pre-computed département aggregates

Installed capacity and system counts, ranked, for every département:

curl "https://zelhliylrlktnasircwp.supabase.co/rest/v1/rpc/dept_capacity_stats" \
  -H "apikey: sb_publishable_rKz4rtTA3hpRxPgN3C3yAg_bbT5iTBi" \
  -H "Authorization: Bearer sb_publishable_rKz4rtTA3hpRxPgN3C3yAg_bbT5iTBi"
3

Spatial queries work too

A bounding-box endpoint (get_detections_bbox) and an arbitrary-geometry endpoint (get_detections_in_zone) return detections as GeoJSON, ready to drop onto a map — see the full contract for parameters and response shapes.