Zum Inhalt springen
Integration

So fügen Sie Ihrem SaaS in 20 Minuten IP-Geolokalisierung hinzu

| 7 min read

Vier SaaS-Funktionen, die IP-Geolokalisierung benötigen: Währungsvorgaben, DSGVO-Banner, Betrugserkennung und Analyse-Dashboards. Funktionierender Code für jeden, kein Google Maps erforderlich.

World map with location pins showing IP geolocation data
Photo by NASA on Unsplash

Ihr SaaS zeigt einem Benutzer in Berlin USD an. Ihr Cookie-Banner erscheint für Besucher in Texas. Ihr Betrugssystem kann nicht erkennen, wenn eine nigerianische IP eine deutsche Rechnungsadresse verwendet. Vier Funktionen benötigen IP-Geolokalisierung, und Sie können alle vier in 20 Minuten mit einer API hinzufügen.

Der API-Aufruf

Jede Funktion in diesem Beitrag beginnt mit demselben Endpunkt. Hier ist die rohe Locke:

curl -X POST https://api.botoi.com/v1/ip/lookup \\
  -H "Content-Type: application/json" \\
  -d '{"ip": "8.8.8.8"}'

Antwort:

{
  "success": true,
  "data": {
    "ip": "8.8.8.8",
    "city": "Mountain View",
    "region": "California",
    "country": "US",
    "countryName": "United States",
    "latitude": 37.386,
    "longitude": -122.0838,
    "timezone": "America/Los_Angeles",
    "isp": "Google LLC",
    "org": "Google Public DNS",
    "as": "AS15169 Google LLC"
  }
}

Ein POST gibt Ihnen Stadt, Region, Ländercode, vollständigen Ländernamen, Koordinaten, Zeitzone usw. ISP, Organisation und AS-Nummer. Das sind genug Daten, um alle vier unten aufgeführten Funktionen zu betreiben.

Funktion 1: Automatische Währungsauswahl an der Kasse

Wenn an der Kasse die falsche Währung angezeigt wird, werden die Umrechnungskurse beeinträchtigt. Ein Besucher aus Deutschland sieht „49,99 $“ und muss vor der Entscheidung gedanklich in Euro umrechnen. Schlimmer noch, sie könnten es tun Gehen Sie davon aus, dass Sie ihre Region nicht bedienen.

Beheben Sie dieses Problem mit Middleware, die das IP-Land des Besuchers einer Standardwährung zuordnet:

const COUNTRY_CURRENCY = {
  US: "USD", GB: "GBP", DE: "EUR", FR: "EUR", JP: "JPY",
  IN: "INR", BR: "BRL", AU: "AUD", CA: "CAD", CN: "CNY",
  KR: "KRW", MX: "MXN", SE: "SEK", CH: "CHF", SG: "SGD",
};

async function currencyMiddleware(req, res, next) {
  const ip = req.headers["x-forwarded-for"]?.split(",")[0] || req.ip;

  try {
    const response = await fetch("https://api.botoi.com/v1/ip/lookup", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "X-Api-Key": process.env.BOTOI_API_KEY,
      },
      body: JSON.stringify({ ip }),
    });

    const { data } = await response.json();
    req.defaultCurrency = COUNTRY_CURRENCY[data.country] || "USD";
  } catch {
    req.defaultCurrency = "USD";
  }

  next();
}

// Usage in Express
app.get("/checkout", currencyMiddleware, (req, res) => {
  res.render("checkout", { currency: req.defaultCurrency });
});

Die Land-Währungs-Karte deckt die 15 wichtigsten SaaS-Märkte ab. Erweitern Sie es für Ihr Publikum. Der Fallback auf USD bewältigt API-Fehler reibungslos; Kein Besucher sieht jemals eine kaputte Kasse weil bei einem Geolocation-Anruf eine Zeitüberschreitung aufgetreten ist.

Funktion 2: DSGVO-Cookie-Banner nur für EU-Besucher

Es ist unnötig und ärgerlich, jedem Besucher ein Cookie-Zustimmungsbanner anzuzeigen. Die DSGVO gilt für Besucher in der Europäischen Union. Alle anderen können es überspringen.

Diese Middleware vergleicht das IP-Land des Besuchers mit der Liste der EU-Mitgliedstaaten und setzt ein Cookie, das im Frontend lautet:

const EU_COUNTRIES = new Set([
  "AT", "BE", "BG", "HR", "CY", "CZ", "DK", "EE", "FI", "FR",
  "DE", "GR", "HU", "IE", "IT", "LV", "LT", "LU", "MT", "NL",
  "PL", "PT", "RO", "SK", "SI", "ES", "SE",
]);

async function gdprMiddleware(req, res, next) {
  const ip = req.headers["x-forwarded-for"]?.split(",")[0] || req.ip;

  try {
    const response = await fetch("https://api.botoi.com/v1/ip/lookup", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "X-Api-Key": process.env.BOTOI_API_KEY,
      },
      body: JSON.stringify({ ip }),
    });

    const { data } = await response.json();
    req.isEU = EU_COUNTRIES.has(data.country);
  } catch {
    // Default to showing the banner when the lookup fails
    req.isEU = true;
  }

  next();
}

// Set a cookie so the frontend knows whether to show the banner
app.use(gdprMiddleware, (req, res, next) => {
  res.cookie("gdpr_applies", req.isEU ? "1" : "0", {
    httpOnly: false,
    maxAge: 86400 * 1000,
  });
  next();
});

Lesen Sie im Frontend das Cookie und schalten Sie das Banner um:

// Frontend: read the cookie and conditionally show the banner
function shouldShowCookieBanner() {
  const match = document.cookie.match(/gdpr_applies=(\d)/);
  return match ? match[1] === "1" : true; // default to showing
}

if (shouldShowCookieBanner()) {
  document.getElementById("cookie-banner").style.display = "block";
}

Das Standardverhalten bei einem Fehler besteht darin, das Banner anzuzeigen. Dies ist ein Fehler auf der Seite der Compliance; Wenn die geografische Suche fehlschlägt, erfüllen Sie weiterhin die DSGVO-Anforderungen. Das Cookie ist 24 Stunden haltbar, Sie rufen die API also nur einmal pro Besucher und Tag auf.

Funktion 3: Betrugserkennung mit geografischer Nichtübereinstimmung

Wenn jemand mit einer Rechnungsadresse in Deutschland auscheckt, seine IP jedoch geolokalisiert wird Nigeria, das ist ein Signal, das es wert ist, untersucht zu werden. Dies bedeutet nicht, dass die Transaktion abgeschlossen ist betrügerisch; Menschen reisen, nutzen VPNs und kaufen Geschenke für Freunde im Ausland. Aber es sind Daten Geben Sie an, was Ihr Betrugsprüfungsteam braucht.

async function checkGeoMismatch(ip, billingCountry) {
  const response = await fetch("https://api.botoi.com/v1/ip/lookup", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "X-Api-Key": process.env.BOTOI_API_KEY,
    },
    body: JSON.stringify({ ip }),
  });

  const { data } = await response.json();

  const mismatch = data.country !== billingCountry;

  return {
    mismatch,
    ipCountry: data.country,
    ipCity: data.city,
    billingCountry,
    riskNote: mismatch
      ? \`IP located in \${data.countryName} but billing address is \${billingCountry}\`
      : null,
  };
}

// Usage during checkout
app.post("/checkout", async (req, res) => {
  const ip = req.headers["x-forwarded-for"]?.split(",")[0] || req.ip;
  const { billingCountry } = req.body;

  const geo = await checkGeoMismatch(ip, billingCountry);

  if (geo.mismatch) {
    // Flag for manual review instead of blocking
    await flagOrder(req.body.orderId, geo.riskNote);
  }

  // Continue processing the order
  await processOrder(req.body);
  res.json({ success: true });
});

Die Funktion gibt ein strukturiertes Objekt mit dem Mismatch-Flag und einem für Menschen lesbaren Objekt zurück Der Risikohinweis kann von Ihrem Support-Team überprüft werden. Markieren Sie die Bestellung stattdessen zur manuellen Überprüfung es komplett blockieren. Kombinieren Sie dies mit anderen Signalen (Alter der E-Mail-Domain, Zahlung). Geschwindigkeit, Gerätefingerabdruck) für ein vollständigeres Bild.

Funktion 4: Analytics-Dashboard mit Benutzerverteilung

Wenn Sie wissen, wo sich Ihre Benutzer befinden, können Sie entscheiden, welche Sprachen und welche Regionen unterstützt werden sollen welche Ziele mit Marketing angestrebt werden sollen und wo Edge-Server platziert werden sollen. Dieses Skript verarbeitet einen Stapel der Besucher-IPs und ergibt eine sortierte Länderverteilung:

async function buildCountryDistribution(ips) {
  const counts = {};

  // Process in batches to respect rate limits
  for (const ip of ips) {
    try {
      const response = await fetch("https://api.botoi.com/v1/ip/lookup", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          "X-Api-Key": process.env.BOTOI_API_KEY,
        },
        body: JSON.stringify({ ip }),
      });

      const { data } = await response.json();
      const country = data.countryName || "Unknown";
      counts[country] = (counts[country] || 0) + 1;
    } catch {
      counts["Unknown"] = (counts["Unknown"] || 0) + 1;
    }
  }

  // Sort by count descending
  return Object.entries(counts)
    .sort(([, a], [, b]) => b - a)
    .map(([country, count]) => ({
      country,
      count,
      percentage: ((count / ips.length) * 100).toFixed(1) + "%",
    }));
}

// Example output:
// [
//   { country: "United States", count: 4521, percentage: "34.2%" },
//   { country: "Germany", count: 1893, percentage: "14.3%" },
//   { country: "United Kingdom", count: 1247, percentage: "9.4%" },
//   ...
// ]

Führen Sie dies als nächtlichen Job für Ihre Zugriffsprotokolle aus. Die Ausgabe sagt Ihnen genau, welche Länder verursachen den meisten Verkehr. Wenn 14 % Ihrer Nutzer in Deutschland sind, aber nur Ihre App unterstützt Englisch, das ist eine Lokalisierungsmöglichkeit, die Sie quantifizieren können.

Caching-Strategie

IP-zu-Standort-Zuordnungen ändern sich nicht oft. Es gibt keinen Grund, die API erneut aufzurufen für die gleiche IP innerhalb einer Sitzung. Dieser Cache verwendet eine einfache Karte mit einer 1-stündigen TTL:

class GeoCache {
  constructor(ttlMs = 60 * 60 * 1000) {
    this.cache = new Map();
    this.ttlMs = ttlMs;
  }

  get(ip) {
    const entry = this.cache.get(ip);
    if (!entry) return null;
    if (Date.now() - entry.timestamp > this.ttlMs) {
      this.cache.delete(ip);
      return null;
    }
    return entry.data;
  }

  set(ip, data) {
    this.cache.set(ip, { data, timestamp: Date.now() });
  }
}

const geoCache = new GeoCache();

async function lookupWithCache(ip) {
  const cached = geoCache.get(ip);
  if (cached) return cached;

  const response = await fetch("https://api.botoi.com/v1/ip/lookup", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "X-Api-Key": process.env.BOTOI_API_KEY,
    },
    body: JSON.stringify({ ip }),
  });

  const { data } = await response.json();
  geoCache.set(ip, data);
  return data;
}

Für Einzelinstanz-Node.js-Server funktioniert die In-Memory-Map einwandfrei. Wenn Sie mehrere ausführen Instanzen hinter einem Load Balancer, tauschen Sie die Karte gegen Redis aus. Es gilt die gleiche TTL-Logik; Speichern Sie die Geodaten als JSON-String mit einem Ablauf von 3600 Sekunden.

Extrahieren der Client-IP

Der schwierigste Teil der IP-Geolokalisierung ist nicht der API-Aufruf; Es erhält die richtige IP an erster Stelle. Wenn sich Ihre App hinter einem Reverse-Proxy, Load Balancer oder CDN befindet, req.connection.remoteAddress gibt die IP des Proxys zurück, nicht die des Besuchers.

So erhalten Sie die echte Client-IP in jeder Umgebung:

// Express
const ip = req.headers["x-forwarded-for"]?.split(",")[0]?.trim() || req.ip;

// Next.js (App Router)
import { headers } from "next/headers";
const headerList = await headers();
const ip = headerList.get("x-forwarded-for")?.split(",")[0]?.trim();

// Cloudflare Workers
const ip = request.headers.get("cf-connecting-ip");

// Vercel (edge or serverless)
const ip = request.headers.get("x-real-ip")
  || request.headers.get("x-forwarded-for")?.split(",")[0]?.trim();

Trennen Sie immer beim ersten Komma in x-forwarded-for. Dieser Header kann enthalten eine Kette von IPs, wenn der Datenverkehr über mehrere Proxys läuft. Der erste Eintrag ist der ursprüngliche Client-IP.

Wenn Sie Cloudflare nutzen, verwenden Sie cf-connecting-ip. Cloudflare setzt diesen Header auf jede Anfrage und es ist schwieriger zu fälschen als x-forwarded-for.

FAQ

Wie füge ich IP-Geolokalisierung zu meiner SaaS-Anwendung hinzu?
Senden Sie die IP-Adresse Ihres Besuchers an eine IP-Geolocation-API (wie POST /v1/ip/lookup) und verwenden Sie die zurückgegebenen Land-, Stadt- und Zeitzonendaten, um sein Erlebnis zu personalisieren. Zu den häufigsten Anwendungsfällen gehören die automatische Auswahl der Währung an der Kasse, die Anzeige von DSGVO-Bannern für EU-Besucher, die Meldung von Geo-Mismatch-Betrug und die Erstellung von Analyse-Dashboards. Sie können alle vier Funktionen mit einer einzigen API hinzufügen.
Was ist die beste IP-Standort-API für SaaS-Produkte?
Suchen Sie nach einer API, die Land-, Stadt-, Regions-, Koordinaten-, Zeitzonen- und ISP-Daten in einem einzigen Aufruf zurückgibt. Botois /v1/ip/lookup gibt alle diese Felder zurück, ohne dass eine Anmeldung für den anonymen Zugriff erforderlich ist (5 Anforderungen/Min.). Für den Produktionseinsatz stellt ein kostenloser API-Schlüssel 1.000 Anfragen pro Tag bereit. Bezahlte Pläne beginnen bei 9 $/Monat.
Kann ich Benutzer ohne Google Maps anhand ihrer IP-Adresse lokalisieren?
Ja. IP-Geolokalisierungs-APIs geben Breiten-, Längen-, Stadt- und Länderdaten zurück, ohne dass Google Maps oder ein anderer Kartendienst erforderlich ist. Sie benötigen eine Kartenbibliothek nur, wenn Sie den Standort auf einer visuellen Karte anzeigen möchten. Für Funktionen wie Währungsvorgaben, DSGVO-Konformität und Betrugserkennung sind die rohen Geolokalisierungsdaten der API alles, was Sie benötigen.
Wie genau ist die IP-Geolokalisierung zur Ermittlung des Benutzerstandorts?
Die IP-Geolokalisierung ist auf Länderebene in etwa 99 % der Fälle und auf Stadtebene in etwa 80–90 % der Fälle genau. Die Genauigkeit sinkt bei Mobilfunkanbietern und VPN-Benutzern. Für SaaS-Funktionen wie Währungsauswahl und DSGVO-Konformität ist die Genauigkeit auf Länderebene ausreichend. Kombinieren Sie zur Betrugserkennung IP-Geolokalisierung mit Rechnungsadressdaten, anstatt sich auf die Präzision auf Stadtebene zu verlassen.
Sollte ich IP-Geolocation-Ergebnisse in meinem SaaS zwischenspeichern?
Ja. IP-zu-Standort-Zuordnungen ändern sich selten, sodass die Zwischenspeicherung der Ergebnisse für eine Stunde pro IP die API-Aufrufe erheblich reduziert. Verwenden Sie eine In-Memory-Map für Einzelinstanzbereitstellungen oder Redis für Mehrinstanz-Setups. Die meisten SaaS-Anwendungen weisen eine Cache-Trefferquote von 60–80 % auf, da wiederkehrende Besucher innerhalb einer Sitzung auf dieselbe IP zugreifen.

Starte mit botoi zu entwickeln

150+ API-Endpunkte für Abfragen, Textverarbeitung, Bildgenerierung und Entwickler-Tools. Kostenloser Tarif, keine Kreditkarte nötig.