Pinloft
Free API + MCP server · no key

Addresses to coordinates, with county and FIPS codes

Type an address, get latitude and longitude, a cleaned address and, in the US, the county, Census tract and block FIPS codes from the official US Census geocoder. Worldwide addresses and reverse lookups use OpenStreetMap.

Who it's for

Anyone who needs this answer fast, from a person to an AI agent.

Analysts and researchers

Join addresses to Census, ACS, HMDA or CDC data by county, tract and block FIPS.

Real estate, insurance and logistics

Put properties, claims or stops on a map and know their county.

AI agents

Turn "where is this address?" into coordinates and districts in one tool call.

Developers

A geocoder with no key and no billing account for prototypes and small lists.

Try it

One address per line (up to 5). US addresses come back with county and FIPS codes.

Prefilled with a real example. Press Geocode.

Real sample output

Captured from a live call to this API (trimmed for length).

{
  "results": [
    {
      "id": "1",
      "query": "233 S Wacker Dr, Chicago, IL 60606",
      "queryType": "address",
      "status": "matched",
      "source": "us-census",
      "latitude": 41.8789195,
      "longitude": -87.6366023,
      "formattedAddress": "233 S WACKER DR, CHICAGO, IL, 60606",
      "matchType": "exact",
      "confidence": 1,
      "houseNumber": "233",
      "street": "S WACKER DR",
      "city": "CHICAGO",
      "county": "Cook County",
      "state": "Illinois",
      "stateCode": "IL",
      "postcode": "60606",
      "country": "United States",
      "countryCode": "US",
      "stateFips": "17",
      "countyFips": "17031",
      "tractFips": "17031839100",
      "blockGroupFips": "170318391002",
      "blockFips": "170318391002008",
      "osmType": null,
      "osmId": null,
      "placeType": "address",
      "districts": null,
      "attribution": "US Census Bureau Geocoder (public domain), TIGER/Line current benchmark",
      "note": null
    },
    {
      "id": "2",
      "query": "1600 Pennsylvania Ave NW, Washington, DC 20500",
      "queryType": "address",
      "status": "matched",
      "source": "us-census",
      "latitude": 38.8987026,
      "longitude": -77.0351892,
      "formattedAddress": "1600 PENNSYLVANIA AVE NW, WASHINGTON, DC, 20500",
      "matchType": "exact",
      "confidence": 1,
      "houseNumber": "1600",
      "street": "PENNSYLVANIA AVE NW",
      "city": "WASHINGTON",
      "county": "District of Columbia",
      "state": "District of Columbia",
      "stateCode": "DC",
      "postcode": "20500",
      "country": "United States",
      "countryCode": "US",
      "stateFips": "11",
      "countyFips": "11001",
      "tractFips": "11001980000",
      "blockGroupFips": "110019800001",
      "blockFips": "110019800001034",
      "osmType": null,
      "osmId": null,
      "placeType": "address",
      "districts": null,
      "attribution": "US Census Bureau Geocoder (public domain), TIGER/Line current benchmark",
      "note": null
    },
    {
      "id": "3",
      "query": "10 Downing St, London",
      "queryType": "address",
      "status": "matched",
      "source": "openstreetmap",
      "latitude": 51.5034878,
      "longitude": -0.1276965,
      "formattedAddress": "10 Downing Street, 10, Downing Street, Westminster, Covent Garden, City of Westminster, Greater London, England, SW1A 2AA, United Kingdom",
      "matchType": "rooftop_or_building",
      "confidence": 0.9,
      "houseNumber": "10",
      "street": "Downing Street",
      "city": "City of Westminster",
      "county": null,
      "state": "England",
      "stateCode": "ENG",
      "postcode": "SW1A 2AA",
      "country": "United Kingdom",
      "countryCode": "GB",
      "stateFips": null,
      "countyFips": null,
      "tractFips": null,
      "blockGroupFips": null,
      "blockFips": null,
      "osmType": "relation",
      "osmId": 1879842,
      "placeType": "office",
      "districts": null,
      "attribution": "Data © OpenStreetMap contributors, ODbL 1.0 (openstreetmap.org/copyright); geocoded via Nominatim or Photon",
      "note": null
    }
  ],
  "count": 3
}

Limits, plainly

Free and rate limited so it stays fast for everyone. A bulk and scheduled version for big lists is coming to the Apify Store.

  • 20 calls per minute per IP address.
  • Up to 5 addresses or points per call.
  • Up to 3 OpenStreetMap lookups per call (non-US addresses, US misses, reverse); US addresses use the Census geocoder.
  • About 15 seconds per call at most.
  • Free, no key. OSM results: © OpenStreetMap contributors (ODbL).

Use the API

JSON over HTTPS, CORS enabled, no key. GET for quick calls, POST a JSON body for lists. Spec: openapi.json · llms.txt

cURL
curl -s "https://pinloft.cybermax-tools.workers.dev/api/geocode?address=233+S+Wacker+Dr%2C+Chicago%2C+IL+60606%0A1600+Pennsylvania+Ave+NW%2C+Washington%2C+DC+20500%0A10+Downing+St%2C+London&districts=false"

# lists: POST a JSON body
curl -s -X POST https://pinloft.cybermax-tools.workers.dev/api/geocode \
  -H "content-type: application/json" \
  -d '{"addresses":["233 S Wacker Dr, Chicago, IL 60606","10 Downing St, London"],"districts":true}'
Python
import requests

r = requests.post("https://pinloft.cybermax-tools.workers.dev/api/geocode",
                  json={"addresses":["233 S Wacker Dr, Chicago, IL 60606","10 Downing St, London"],"districts":True}, timeout=30)
r.raise_for_status()
for row in r.json()["results"]:
    print(row)

Endpoints: /api/geocode geocode up to 5 addresses (us census first, openstreetmap worldwide) · /api/reverse reverse geocode up to 5 points (street address + us fips and districts)

Add it to your AI agent (MCP)

A remote MCP server at https://pinloft.cybermax-tools.workers.dev/mcp (streamable HTTP, no auth). Read-only tools with JSON schemas, so agents know exactly what to send.

MCP config
// Claude Desktop, Cursor, VS Code, any MCP client (remote, no key)
{
  "mcpServers": {
    "pinloft": { "type": "http", "url": "https://pinloft.cybermax-tools.workers.dev/mcp" }
  }
}

# Claude Code
claude mcp add --transport http pinloft https://pinloft.cybermax-tools.workers.dev/mcp

# Tools: geocode_address, reverse_geocode
# e.g. geocode_address({"addresses":["233 S Wacker Dr, Chicago, IL 60606"]})
  • geocode_address
    Convert up to 5 street addresses to latitude/longitude with a cleaned, matched address and match confidence. US addresses also get state, county, tract, block group and block FIPS codes (US Census geocoder); include_districts adds congressional and state legislative districts, city, school district and metro area. Worldwide addresses use OpenStreetMap.
  • reverse_geocode
    Convert up to 5 latitude/longitude points to the nearest street address (OpenStreetMap), and for US points add state/county/tract/block FIPS codes and congressional/state districts from the US Census geocoder.

FAQ

Why not the Google Maps Geocoding API?

It needs an API key and a billing account, and its terms restrict storing and reusing results. Pinloft uses the public-domain US Census geocoder for US addresses and OpenStreetMap (ODbL, attribution required) elsewhere, with no key.

What are FIPS codes and why do they matter?

Standard Census codes for state, county, tract and block. With them you can join any address to Census, ACS, HMDA, CDC or FEMA data.

Does it work outside the US?

Yes, through OpenStreetMap (Nominatim, with Photon as fallback). FIPS codes and districts exist only for US locations.

How accurate is it?

Census matches are street-range interpolations (matchType exact or non_exact); OSM matches say whether they hit a building, a street or only an area, with a confidence score.

Can I geocode a whole spreadsheet?

The free API takes up to 5 addresses per call. A bulk version (thousands per run, only new addresses on a schedule) is coming to the Apify Store.

How do I credit the data?

Each row has an attribution field. For OpenStreetMap rows show "© OpenStreetMap contributors"; Census data is public domain.