Search
API REFERENCE

API Documentation

Integrate the GeoPin geolocation engine into your application. Upload a street photo and receive GPS coordinates.

Base URL https://geopin.nl

# Quick Start

Get your API key from your account page and send your first request:

curl
curl -X POST https://geopin.nl/api/geolocate \
  -H "X-API-Key: sk_geopin_your_key" \
  -F "image=@photo.jpg"

# Authentication

All requests to /api/geolocate require an API key in the X-API-Key header.

Find your API key on your account page. Never share your key publicly.

# Rate Limits

Plan Searches / month Result
Free3Location within ~500m
Starter10Exact GPS coordinates
Pro150Exact GPS coordinates
Business1,000Exact GPS coordinates

# Endpoints

POST /api/geolocate

Geolocate a street photo and receive GPS coordinates.

Headers

X-API-Key required Your API key
Content-Type automatic multipart/form-data

Body multipart/form-data

image required Image file (JPG, PNG or WebP)

Example response 200 OK

JSON
{
  "search_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "location": {
    "lat": 52.21987,
    "lon": 6.89350,
    "confidence": 0.847,
    "heading": 142.5
  },
  "pano_id": "CAoSLEFGMVFp...",
  "server_time": 1.243,
  "usage": {
    "plan": "pro",
    "used": 42,
    "limit": 150
  }
}

Error codes

400No image provided
401Invalid or missing API key
402Monthly limit reached
429Too many requests
503Service temporarily unavailable
GET /api/stats

Returns the current status of the GeoPin index.

No authentication required.

Example response 200 OK

JSON
{
  "total_indexed_images": 112885,
  "coverage": "Enschede (pilot)",
  "last_updated": "2026-03-22T10:00:00.000Z"
}
GET /api/auth/me

Retrieve your account details and current usage.

Headers

Authorization required Bearer <auth_token>

Example response 200 OK

JSON
{
  "user": {
    "id": 1,
    "email": "user@example.com",
    "name": "Jane Smith",
    "plan": "pro",
    "apiKey": "sk_geopin_abc123...",
    "usage": 42
  }
}

# Code Examples

Python

Python
import requests

API_KEY = "sk_geopin_your_key"

with open("photo.jpg", "rb") as f:
    resp = requests.post(
        "https://geopin.nl/api/geolocate",
        headers={"X-API-Key": API_KEY},
        files={"image": f},
    )

data = resp.json()
loc = data["location"]
print(f"Location: {loc['lat']}, {loc['lon']}")
print(f"Confidence: {loc['confidence']:.1%}")

JavaScript / Node.js

JavaScript
const form = new FormData();
form.append("image", fileInput.files[0]);

const res = await fetch("https://geopin.nl/api/geolocate", {
  method: "POST",
  headers: { "X-API-Key": "sk_geopin_your_key" },
  body: form,
});

const { location } = await res.json();
console.log(`Location: ${location.lat}, ${location.lon}`);

# Response Fields

FieldTypeDescription
location.latfloatLatitude (WGS84)
location.lonfloatLongitude (WGS84)
location.confidencefloatConfidence score (0–1)
location.headingfloatEstimated viewing direction in degrees (0–360)
pano_idstringMatched panorama ID
server_timefloatProcessing time in seconds
search_idstringUnique search ID