GeoAxis: AI Image Location Finder – Find the Location of Any Image

v1.0 — api.geoaxis.ai

Documentation

Geolocate any image with a single API call. Upload a photo, get GPS coordinates back.

pip install pygeoaxis

Getting Started

The GeoAxis API lets you upload any image and get back its geographic location. Two search modes are available:

Global Search

AI analyzes visual clues to locate the image anywhere in the world.

City Search

Matches against a city's indexed database — fast, sub-300ms results.

Base URL: https://api.geoaxis.ai

Installation

Install the official Python wrapper from PyPI:

terminal
pip install pygeoaxis

Or use the API directly with any HTTP client — requests, fetch, curl, etc. No SDK required.

Python SDK Usage

python
from pygeoaxis import GeoAxis

# Initialize with your API key
client = GeoAxis(token="<your_api_key>")

# The SDK wraps the REST API — see below for endpoints

Requirements

  • Python 3.6+
  • A GeoAxis account with an active Pro or Business subscription
  • Your API key (from Dashboard → Settings)

Authentication

All protected endpoints require your API key in the Authorization header:

Authorization: Bearer <your_api_key>

Getting Your API Key

  1. Sign in at geoaxis.ai/login
  2. Subscribe to a Pro or Business plan at geoaxis.ai/pricing
  3. Open your Dashboard
  4. Click your avatar (bottom-left) → "API Key"
  5. Click "Reveal" to see your key, then "Copy"

Using Your Key

python
import requests

API_KEY = "<your_api_key>"

# Pass in every request:
headers = {"Authorization": f"Bearer {API_KEY}"}
javascript
const API_KEY = "<your_api_key>";

// Pass in every request:
headers: { "Authorization": `Bearer ${API_KEY}` }
Keep your key secret. Never expose it in client-side code or public repositories.

Quick Start

Geolocate an image in 4 lines of Python:

python
import requests, base64

API_KEY = "<your_api_key>"
image = base64.b64encode(open("photo.jpg", "rb").read()).decode()

res = requests.post(
    "https://api.geoaxis.ai/api/search",
    headers={"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"},
    json={"image_base64": image, "global": True}
)

loc = res.json()["location"]
print(f"{loc['location_name']}, {loc['country']}")
print(f"Coordinates: ({loc['lat']}, {loc['lng']})")
print(f"Confidence: {loc['confidence']:.0%}")
output
Paris, France
Coordinates: (48.8566, 2.3522)
Confidence: 85%

GET /api/locations

List all available indexed cities you can search against. Use this to populate a city selector in your UI.

bash
curl https://api.geoaxis.ai/api/locations \
  -H "Authorization: Bearer <your_api_key>"
python
res = requests.get(
    "https://api.geoaxis.ai/api/locations",
    headers={"Authorization": f"Bearer {API_KEY}"},
)
cities = res.json()["locations"]
for city in cities:
    print(city["path"])  # e.g. "US/Texas/Dallas"

GET /api/health

Check if the server is ready. No authentication required.

bash
curl https://api.geoaxis.ai/api/health
json
{
  "status": "ok",
  "model_loaded": true,
  "device": "cuda",
  "indexes_loaded": 17,
  "total_vectors": 95640224,
  "queue": { "queue_length": 0, "active": 0, "total_processed": 5678 }
}

Base64 JSON Mode

Instead of multipart file upload, you can send the image as a base64-encoded string in a JSON body. This is useful when you already have the image in memory or as a data URI.

ParameterTypeRequiredDescription
image_base64stringYesBase64-encoded image (raw or data URI)
formatstringNoImage format: jpg, png, webp (default: jpg)
globalbooleanNotrue for global search
city_pathstringNo*Required if global is not true
contextstringNoHint for global search
kintegerNoNumber of results (default: 10)

Python

python
import requests, base64

image_b64 = base64.b64encode(open("photo.jpg", "rb").read()).decode()

# Global search
res = requests.post(
    "https://api.geoaxis.ai/api/search",
    headers={
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json",
    },
    json={
        "image_base64": image_b64,
        "format": "jpg",
        "global": True,
        "context": "somewhere in Asia",
    },
)
print(res.json()["location"])

JavaScript (Browser)

javascript
// Convert file input to base64 and send as JSON
const file = fileInput.files[0];
const reader = new FileReader();

reader.onload = async () => {
  const res = await fetch("https://api.geoaxis.ai/api/search", {
    method: "POST",
    headers: {
      "Authorization": `Bearer ${API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      image_base64: reader.result,  // data:image/jpeg;base64,... works
      global: true,
    }),
  });
  const { location } = await res.json();
  console.log(location);
};

reader.readAsDataURL(file);

Node.js

javascript
const fs = require("fs");

const imageBase64 = fs.readFileSync("photo.jpg").toString("base64");

const res = await fetch("https://api.geoaxis.ai/api/search", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    image_base64: imageBase64,
    format: "jpg",
    city_path: "US/Texas/Dallas",
    k: 5,
  }),
});
console.log(await res.json());

Rate Limits

Requests per user1 every 10 seconds
Max image size16 MB
Accepted formatsPNG, JPG, JPEG, HEIC, BMP, WebP
Max queue depth50 concurrent requests

When rate limited you receive 429:

json
{ "error": "Rate limited. Try again in 7s.", "retry_after": 8 }

Error Codes

CodeMeaningWhen
400Bad RequestMissing image, invalid format, missing city_path
401UnauthorizedMissing or invalid API key
403ForbiddenNo active subscription
404Not FoundCity not indexed
413Too LargeImage exceeds 16 MB
429Rate Limited> 1 request per 10s
503UnavailableModel loading or queue full (50 max)

cURL Examples

bash
# Health check (no auth)
curl https://api.geoaxis.ai/api/health

# List available cities
curl https://api.geoaxis.ai/api/locations \
  -H "Authorization: Bearer <your_api_key>"

# Global search (file upload)
curl -X POST https://api.geoaxis.ai/api/search \
  -H "Authorization: Bearer <your_api_key>" \
  -F "image=@photo.jpg" \
  -F "global=true" \
  -F "context=European city"

# City search (file upload)
curl -X POST https://api.geoaxis.ai/api/search \
  -H "Authorization: Bearer <your_api_key>" \
  -F "image=@photo.jpg" \
  -F "city_path=US/Texas/Dallas" \
  -F "k=10"

# Global search (base64 JSON)
curl -X POST https://api.geoaxis.ai/api/search \
  -H "Authorization: Bearer <your_api_key>" \
  -H "Content-Type: application/json" \
  -d "{
    \"image_base64\": \"$(base64 -w0 photo.jpg)\",
    \"global\": true,
    \"context\": \"somewhere in Europe\"
  }"

Need help? contact@geoaxis.ai

pygeoaxis on PyPI · GitHub

GeoAxis LogoGeoAxis

AI-powered image location intelligence with HyperVision™ technology

Legal

By using our software, you agree to our Privacy Policy, Terms of Service, Safety Statement, and Refund Policy.

© 2026 GeoAxis | All Rights Reserved

Payment methods
  • American Express
  • Mastercard
  • PayPal
  • Visa
GeoAxis