SHIPPED 2026-05-23 · US-ONLY · USGS NAIP

Aerial photo of any address.
In one API call.

Sharp 0.6m aerial imagery — public-domain USGS NAIP — for any US property. Pass an address or coordinates, get back a PNG of the parcel and its surroundings.

What customers usually call "satellite" is actually aerial photography — captured by aircraft at ~25,000 ft, not satellites. NAIP's 0.6m resolution beats most satellite sources and shows individual roofs, driveways, vehicles, pools and trees. We proxy USGS on demand so you don't deal with their API surface, projections, or coverage gaps. 1 credit per render, 30-day cache, no separate vendor key.

Free tier: 3,000 calls/day. No credit card.
0.6m typical NAIP resolution US-only · CONUS + AK + HI 1 credit per rendered image

Three ways to ask for the imagery

All backed by the same public-domain USGS NAIP imagery. All deterministic — same URL returns the same image every time, so Cloudflare absorbs repeats for 30 days.

📍

By free-text address

Pass the address as a string, we geocode it internally (no separate charge) and return the aerial at that location. One round-trip, one credit.

GET /v1/property/image?q=3168+Beckie+Dr+SW,+Wyoming,+MI&size=350
🎯

By lat/lng coordinates

Already have the coordinates? Skip the geocode and pass them directly. Same image, same credit.

GET /v1/property/image?lat=42.86753&lng=-85.7419&size=350
🔍

Variable bbox size

Tune the framing: size=200 for a tight lot crop, size=350 default (residential block), size=1000 for a neighborhood view, up to size=2000 max.

GET /v1/property/image?lat=…&lng=…&size=1000&format=jpg

Try it on a real address

Type a US address, see the aerial photo. No signup. Same response your code would get.

Open the live demo →

Three lines of code

Same call, three languages. SDKs at version 1.15.0 on PyPI and npm.

curl
# address → aerial image, one call
curl -o aerial.png "https://csv2geo.com/api/v1/property/image?q=3168+Beckie+Dr+SW,+Wyoming,+MI&size=350&api_key=geo_live_..."
Python
from csv2geo import Client
c = Client("geo_live_...")
png = c.property_image(
  q="3168 Beckie Dr SW, Wyoming, MI",
  size=350)
open("aerial.png", "wb").write(png)
Node.js
import { Client } from "csv2geo-sdk";
const c = new Client("geo_live_...");
const png = await c.propertyImage({
  q: "3168 Beckie Dr SW, Wyoming, MI",
  size: 350 });
fs.writeFileSync("aerial.png", png);

What people build with it

The four patterns that come up most in real-estate, insurance and CV pipelines.

Real-estate listings

Show the parcel + surroundings on every listing. Sharper than a Mapbox satellite layer, no per-listing satellite licence, no embedded vendor watermark.

Insurance underwriting

Visual property assessment without a site visit. Roof condition, surrounding tree overhang, pool presence, outbuilding count — all readable in a 0.6m frame.

Appraisal research

Compare a property to its neighbors at the same scale. Aerial year-over-year change detection when you keep older renders archived.

Computer-vision substrate

Free pixel input for roof condition, pool detection, solar panel surveys, driveway extraction, outbuilding inventory. NAIP is what Cape Analytics / ZestyAI models train on.

Pricing

1 credit per rendered image — same as static maps. URL is deterministic per coordinate + size + format, so Cloudflare absorbs repeats for 30 days. Free tier covers 3,000 calls/day.

See full API pricing