<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: IPRout Team</title>
    <description>The latest articles on DEV Community by IPRout Team (@iproutdev).</description>
    <link>https://dev.to/iproutdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3964053%2F78fc4368-f028-487a-b336-a287372d8456.png</url>
      <title>DEV Community: IPRout Team</title>
      <link>https://dev.to/iproutdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iproutdev"/>
    <language>en</language>
    <item>
      <title>The Easiest Way to Look Up GeoIP in Laravel</title>
      <dc:creator>IPRout Team</dc:creator>
      <pubDate>Mon, 03 Aug 2026 12:15:17 +0000</pubDate>
      <link>https://dev.to/iproutdev/the-easiest-way-to-look-up-geoip-in-laravel-374o</link>
      <guid>https://dev.to/iproutdev/the-easiest-way-to-look-up-geoip-in-laravel-374o</guid>
      <description>&lt;p&gt;IP location data is useful when your Laravel application needs a sensible regional default, timezone context, analytics enrichment, or an additional risk signal. The integration does not need a large package or a complicated SDK.&lt;/p&gt;

&lt;p&gt;With IPRout, you can send an IPv4 or IPv6 address to a simple HTTP endpoint and receive GeoIP and network information as JSON. In this tutorial, we will get a seven-day developer key, keep it outside the codebase, and build a reusable Laravel service around the API.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;GeoIP is an estimate derived from an IP address. It is not GPS data, proof of identity, or a user's exact physical location. Give users a way to correct important location-dependent choices.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What we are building
&lt;/h2&gt;

&lt;p&gt;We will add an endpoint to a Laravel application that accepts an IP address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /geoip?ip=8.8.8.8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application will validate the input, ask IPRout for the IP context, and return a response containing fields such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Country, region, and city&lt;/li&gt;
&lt;li&gt;Timezone&lt;/li&gt;
&lt;li&gt;Latitude and longitude&lt;/li&gt;
&lt;li&gt;Autonomous system number (ASN)&lt;/li&gt;
&lt;li&gt;Network organisation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No third-party PHP package is required. Laravel's built-in HTTP client handles the request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get a seven-day IPRout developer key
&lt;/h2&gt;

&lt;p&gt;IPRout provides a developer key for evaluating the API without creating an account. At the time of writing, the key:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is valid for seven days&lt;/li&gt;
&lt;li&gt;Includes 1,000 requests in total&lt;/li&gt;
&lt;li&gt;Does not require a login&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To generate one:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://iprout.com/developer-key" rel="noopener noreferrer"&gt;IPRout developer-key page&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Generate API Key&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Copy the generated key and store it somewhere secure.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Treat the key like a password. Do not publish it in a DEV post, commit it to Git, expose it in browser-side JavaScript, or write it to application logs.&lt;/p&gt;

&lt;p&gt;The developer-key allowance and terms may change, so check the page for the current details before publishing or following this tutorial.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure Laravel
&lt;/h2&gt;

&lt;p&gt;Add the key and API base URL to your project's &lt;code&gt;.env&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IPROUT_API_KEY=replace_with_your_key
IPROUT_API_BASE_URL=https://api.iprout.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, add an IPRout entry to &lt;code&gt;config/services.php&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="s1"&gt;'iprout'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'key'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'IPROUT_API_KEY'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="s1"&gt;'base_url'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'IPROUT_API_BASE_URL'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'https://api.iprout.com'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using Laravel's configuration layer keeps calls to &lt;code&gt;env()&lt;/code&gt; out of application code and works correctly when configuration is cached in production.&lt;/p&gt;

&lt;p&gt;If you already cached your configuration, refresh it after changing &lt;code&gt;.env&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan config:clear
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Create a reusable IPRout service
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;app/Services/IPRout.php&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Services&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Http\Client\Response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Support\Facades\Http&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;InvalidArgumentException&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;RuntimeException&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;IPRout&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cd"&gt;/**
     * Look up GeoIP and ASN information for an IPv4 or IPv6 address.
     *
     * @return array&amp;lt;string, mixed&amp;gt;
     */&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;lookup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$ip&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;filter_var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;FILTER_VALIDATE_IP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InvalidArgumentException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'A valid IPv4 or IPv6 address is required.'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nv"&gt;$apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'services.iprout.key'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nb"&gt;is_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$apiKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nv"&gt;$apiKey&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RuntimeException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'The IPRout API key is not configured.'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Http&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'services.iprout.base_url'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;withToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$apiKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;acceptJson&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/ip/'&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;rawurlencode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ip&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;ensureRequestSucceeded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;ensureRequestSucceeded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Response&lt;/span&gt; &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;successful&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nv"&gt;$message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="mi"&gt;401&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'The IPRout API key is missing or invalid.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="mi"&gt;422&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'IPRout rejected the IP address as invalid.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="mi"&gt;429&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'The IPRout request limit has been reached.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="mi"&gt;500&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'IPRout encountered an internal server error.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'The IPRout lookup failed with HTTP '&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;

        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RuntimeException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API also supports the &lt;code&gt;X-API-Key&lt;/code&gt; header, but Laravel's &lt;code&gt;withToken()&lt;/code&gt; method makes bearer authentication especially readable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Authorization: Bearer YOUR_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The five-second timeout prevents a slow external request from occupying an application worker indefinitely. Choose a production timeout and fallback based on your own request budget.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add a controller
&lt;/h2&gt;

&lt;p&gt;Generate a controller:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan make:controller GeoIPController
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace its contents with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Http\Controllers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;App\Services\IPRout&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Http\JsonResponse&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Http\Request&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GeoIPController&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Controller&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;IPRout&lt;/span&gt; &lt;span class="nv"&gt;$iprout&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;JsonResponse&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$validated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="s1"&gt;'ip'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'required'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'ip'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;]);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nv"&gt;$iprout&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;lookup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$validated&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'ip'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Laravel's service container can construct the &lt;code&gt;IPRout&lt;/code&gt; class automatically, so no manual binding is needed for this service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Register the route
&lt;/h2&gt;

&lt;p&gt;Add the route to &lt;code&gt;routes/web.php&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;App\Http\Controllers\GeoIPController&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Support\Facades\Route&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/geoip'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;GeoIPController&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start the local development server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then make a lookup from another terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"http://127.0.0.1:8000/geoip?ip=8.8.8.8"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A successful response follows this shape:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"8.8.8.8"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"country_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"US"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"United States"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"California"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mountain View"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timezone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"America/Los_Angeles"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"latitude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;37.4056&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"longitude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-122.0775&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"asn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15169&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"organization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Google LLC"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;IP allocation and GeoIP datasets change, so do not write tests that require a public IP to return one permanent city or coordinate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Look up the caller IP instead
&lt;/h2&gt;

&lt;p&gt;IPRout also provides &lt;code&gt;GET /ip&lt;/code&gt;, which returns information for the IP address making the API request. That is different from looking up the end user's address from your Laravel request.&lt;/p&gt;

&lt;p&gt;In many deployments, IPRout will see the outbound IP of your application server when you call &lt;code&gt;GET /ip&lt;/code&gt;. If you need information about a visitor, obtain the visitor IP through Laravel and pass it to &lt;code&gt;GET /ip/{ip}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Be careful when your application runs behind a reverse proxy or load balancer. Only trust forwarded IP headers when Laravel is configured with the proxies you control. Otherwise, a client may be able to supply a false header value.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handle failure without breaking the application
&lt;/h2&gt;

&lt;p&gt;An external lookup should not become a single point of failure. Decide what your application will do when the lookup is unavailable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use a neutral default for optional personalisation.&lt;/li&gt;
&lt;li&gt;Record an analytics event without the enrichment fields.&lt;/li&gt;
&lt;li&gt;Ask the user to select their region or timezone.&lt;/li&gt;
&lt;li&gt;Require another risk signal instead of making an automatic security decision.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The documented IPRout error statuses are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;401&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Missing or invalid API key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;422&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Invalid IP address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;429&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rate limited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;500&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Internal server error&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Do not retry &lt;code&gt;401&lt;/code&gt; or &lt;code&gt;422&lt;/code&gt; responses without correcting the request. A limited retry with backoff may be appropriate for a transient server error, but retries must stay within your latency and request limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Production checklist
&lt;/h2&gt;

&lt;p&gt;Before deploying the integration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep &lt;code&gt;IPROUT_API_KEY&lt;/code&gt; in your hosting platform's secret store.&lt;/li&gt;
&lt;li&gt;Validate every supplied IP address.&lt;/li&gt;
&lt;li&gt;Configure a short timeout and an application-specific fallback.&lt;/li&gt;
&lt;li&gt;Avoid logging API keys or unnecessary raw IP addresses.&lt;/li&gt;
&lt;li&gt;Review how long your application retains IP-derived data.&lt;/li&gt;
&lt;li&gt;Cache repeated lookups only if that behaviour fits your data-freshness and privacy requirements.&lt;/li&gt;
&lt;li&gt;Monitor &lt;code&gt;401&lt;/code&gt;, &lt;code&gt;422&lt;/code&gt;, &lt;code&gt;429&lt;/code&gt;, and server-error responses.&lt;/li&gt;
&lt;li&gt;Let users correct important regional or timezone defaults.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Start your first Laravel GeoIP lookup
&lt;/h2&gt;

&lt;p&gt;You now have a small Laravel integration with secure configuration, input validation, explicit error handling, and no additional package dependency.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://iprout.com/developer-key" rel="noopener noreferrer"&gt;Generate a seven-day IPRout developer key&lt;/a&gt;, then use the &lt;a href="https://iprout.com/docs" rel="noopener noreferrer"&gt;IPRout API documentation&lt;/a&gt; when you are ready to explore the complete request contract.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>webdev</category>
      <category>api</category>
    </item>
    <item>
      <title>How to Detect VPNs, Data Centers, and Suspicious Traffic Using ASN Data</title>
      <dc:creator>IPRout Team</dc:creator>
      <pubDate>Thu, 11 Jun 2026 09:17:29 +0000</pubDate>
      <link>https://dev.to/iproutdev/how-to-detect-vpns-data-centers-and-suspicious-traffic-using-asn-data-4bem</link>
      <guid>https://dev.to/iproutdev/how-to-detect-vpns-data-centers-and-suspicious-traffic-using-asn-data-4bem</guid>
      <description>&lt;h1&gt;
  
  
  How to Detect VPNs, Data Centers, and Suspicious Traffic Using ASN Data
&lt;/h1&gt;

&lt;p&gt;Most developers think about IP intelligence in terms of geolocation.&lt;/p&gt;

&lt;p&gt;Questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which country is this user from?&lt;/li&gt;
&lt;li&gt;Which city are they connecting from?&lt;/li&gt;
&lt;li&gt;What language should I show?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;are common.&lt;/p&gt;

&lt;p&gt;But after working with APIs, analytics, and security systems, I've found that ASN data is often more useful than country data.&lt;/p&gt;

&lt;p&gt;If you're building authentication systems, fraud detection, analytics platforms, or API security controls, ASN information can provide context that geolocation alone cannot.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is an ASN?
&lt;/h2&gt;

&lt;p&gt;ASN stands for Autonomous System Number.&lt;/p&gt;

&lt;p&gt;Every major ISP, cloud provider, mobile carrier, and network operator on the internet is assigned one or more ASNs.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google&lt;/li&gt;
&lt;li&gt;Amazon AWS&lt;/li&gt;
&lt;li&gt;Microsoft Azure&lt;/li&gt;
&lt;li&gt;Cloudflare&lt;/li&gt;
&lt;li&gt;Telstra&lt;/li&gt;
&lt;li&gt;Comcast&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why ASN Data Matters
&lt;/h2&gt;

&lt;p&gt;Imagine a user signs up from an IP address located in Australia.&lt;/p&gt;

&lt;p&gt;Traditional GeoIP data might tell you the country and city.&lt;/p&gt;

&lt;p&gt;But ASN data might tell you the traffic originates from Amazon AWS rather than a residential internet connection.&lt;/p&gt;

&lt;p&gt;That additional context can be extremely valuable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detecting Data Center Traffic
&lt;/h2&gt;

&lt;p&gt;Many bots, scrapers, and automated systems operate from cloud providers.&lt;/p&gt;

&lt;p&gt;Common examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS&lt;/li&gt;
&lt;li&gt;Azure&lt;/li&gt;
&lt;li&gt;Google Cloud&lt;/li&gt;
&lt;li&gt;DigitalOcean&lt;/li&gt;
&lt;li&gt;Vultr&lt;/li&gt;
&lt;li&gt;Oracle Cloud&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your application receives large volumes of registrations or API requests from these providers, ASN data can help identify patterns.&lt;/p&gt;

&lt;p&gt;This doesn't automatically mean the traffic is malicious.&lt;/p&gt;

&lt;p&gt;But it does provide another signal that can be combined with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rate limits&lt;/li&gt;
&lt;li&gt;Device fingerprints&lt;/li&gt;
&lt;li&gt;User behavior&lt;/li&gt;
&lt;li&gt;Reputation systems&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Detecting VPN Usage
&lt;/h2&gt;

&lt;p&gt;Many VPN providers operate infrastructure from hosting providers and data centers.&lt;/p&gt;

&lt;p&gt;While ASN data alone cannot definitively identify every VPN user, it can help detect traffic that originates from networks commonly associated with VPN infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fraud Prevention
&lt;/h2&gt;

&lt;p&gt;ASN data is particularly useful during:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User registration&lt;/li&gt;
&lt;li&gt;Account recovery&lt;/li&gt;
&lt;li&gt;Login verification&lt;/li&gt;
&lt;li&gt;Payment processing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ASN is not a final decision-maker.&lt;/p&gt;

&lt;p&gt;It's another signal that helps build a risk profile.&lt;/p&gt;

&lt;h2&gt;
  
  
  Analytics and Reporting
&lt;/h2&gt;

&lt;p&gt;ASN information can also improve visibility into your user base.&lt;/p&gt;

&lt;p&gt;Questions you can answer include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How much traffic comes from mobile carriers?&lt;/li&gt;
&lt;li&gt;How much traffic comes from cloud providers?&lt;/li&gt;
&lt;li&gt;Which ISPs are most common?&lt;/li&gt;
&lt;li&gt;Which networks generate the most abuse reports?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example Lookup
&lt;/h2&gt;

&lt;p&gt;A simple ASN lookup can provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Geographic location&lt;/li&gt;
&lt;li&gt;Network owner&lt;/li&gt;
&lt;li&gt;ASN information&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Country-level geolocation is useful.&lt;/p&gt;

&lt;p&gt;ASN intelligence often provides the context that makes that geolocation meaningful.&lt;/p&gt;

&lt;p&gt;If you're building authentication systems, fraud detection tools, analytics platforms, or API security controls, then ASN data is worth paying attention to.&lt;/p&gt;




&lt;p&gt;Example lookups in this article were performed using IPRout, a developer-first GeoIP and ASN API currently in public beta.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://iprout.com" rel="noopener noreferrer"&gt;https://iprout.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>networking</category>
      <category>security</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I Built a Developer-First GeoIP &amp; ASN API Because Most Projects Don’t Need the Complexity</title>
      <dc:creator>IPRout Team</dc:creator>
      <pubDate>Tue, 02 Jun 2026 07:49:33 +0000</pubDate>
      <link>https://dev.to/iproutdev/i-built-a-developer-first-geoip-asn-api-because-most-projects-dont-need-the-complexity-kh7</link>
      <guid>https://dev.to/iproutdev/i-built-a-developer-first-geoip-asn-api-because-most-projects-dont-need-the-complexity-kh7</guid>
      <description>&lt;h1&gt;
  
  
  Why I Built Yet Another GeoIP API
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; I built IPRout, a developer-first GeoIP and ASN API focused on simplicity, fast onboarding, and free developer access. I'm looking for feedback from other developers building products that rely on IP intelligence.&lt;/p&gt;

&lt;p&gt;Most applications only need a few pieces of IP intelligence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Country&lt;/li&gt;
&lt;li&gt;ASN&lt;/li&gt;
&lt;li&gt;ISP / Organization&lt;/li&gt;
&lt;li&gt;Basic geolocation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yet many solutions felt overly complex, expensive, or required account creation before you could even test them.&lt;/p&gt;

&lt;p&gt;While integrating GeoIP services into several projects, a recurring pattern emerged: developers often needed only a small subset of data but were forced into much larger products and pricing structures.&lt;/p&gt;

&lt;p&gt;That led to building IPRout, a developer-first GeoIP and ASN API focused on simplicity and fast onboarding.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;GeoIP data appears in more applications than most people realize.&lt;/p&gt;

&lt;p&gt;Common use cases include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fraud prevention&lt;/li&gt;
&lt;li&gt;User analytics&lt;/li&gt;
&lt;li&gt;Content localization&lt;/li&gt;
&lt;li&gt;Security monitoring&lt;/li&gt;
&lt;li&gt;API protection&lt;/li&gt;
&lt;li&gt;Compliance requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In many cases, developers simply need answers to a few straightforward questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which country is this IP from?&lt;/li&gt;
&lt;li&gt;Which organization owns this IP?&lt;/li&gt;
&lt;li&gt;Which ASN is associated with this address?&lt;/li&gt;
&lt;li&gt;Is the traffic coming from a residential ISP or a cloud provider?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For those scenarios, getting started should be simple.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is IPRout?
&lt;/h2&gt;

&lt;p&gt;IPRout is a GeoIP and ASN lookup API designed with developers in mind.&lt;/p&gt;

&lt;p&gt;The goal was straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast API responses&lt;/li&gt;
&lt;li&gt;Simple onboarding&lt;/li&gt;
&lt;li&gt;Developer-friendly access&lt;/li&gt;
&lt;li&gt;No unnecessary complexity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A lookup is as simple as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.iprout.com/ip/8.8.8.8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"8.8.8.8"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"US"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"country_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"United States"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"asn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15169&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"organization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Google LLC"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Free Developer Access
&lt;/h2&gt;

&lt;p&gt;One thing that has always been frustrating as a developer is having to create an account, verify an email address, and sometimes even provide payment details before being able to test an API.&lt;/p&gt;

&lt;p&gt;To reduce that friction, IPRout provides a:&lt;/p&gt;

&lt;h3&gt;
  
  
  7-Day Developer Key
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No login required&lt;/li&gt;
&lt;li&gt;CAPTCHA protected&lt;/li&gt;
&lt;li&gt;1,000 requests over 7 days&lt;/li&gt;
&lt;li&gt;Immediate access for testing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Free Account
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;10,000 requests per month&lt;/li&gt;
&lt;li&gt;API key management&lt;/li&gt;
&lt;li&gt;Usage dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is simple: let developers try the API properly before deciding whether it fits their project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  User Localization
&lt;/h3&gt;

&lt;p&gt;Determine a visitor's country and adapt content or experiences accordingly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Analytics
&lt;/h3&gt;

&lt;p&gt;Understand where traffic originates and which networks your users connect from.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security
&lt;/h3&gt;

&lt;p&gt;Identify requests originating from cloud providers, hosting networks, or unexpected regions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fraud Prevention
&lt;/h3&gt;

&lt;p&gt;Combine country and ASN information with existing risk signals during signups, authentication, and payment workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  API Access Controls
&lt;/h3&gt;

&lt;p&gt;Restrict, allow, or monitor traffic based on geographic location or network ownership.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built for Simplicity
&lt;/h2&gt;

&lt;p&gt;There are already excellent IP intelligence providers available.&lt;/p&gt;

&lt;p&gt;The goal of IPRout is not to replace every enterprise-grade platform.&lt;/p&gt;

&lt;p&gt;The goal is to provide a straightforward API for developers who need reliable GeoIP and ASN data without unnecessary complexity.&lt;/p&gt;

&lt;p&gt;Sometimes the best developer experience is simply making common things easy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking for Feedback
&lt;/h2&gt;

&lt;p&gt;IPRout is currently in public beta and I'd love feedback from fellow developers.&lt;/p&gt;

&lt;p&gt;A few questions I'm particularly interested in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What GeoIP fields do you actually use in production?&lt;/li&gt;
&lt;li&gt;What information do you wish providers exposed more clearly?&lt;/li&gt;
&lt;li&gt;What integrations would be useful?&lt;/li&gt;
&lt;li&gt;What does a good developer experience look like for this type of API?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every feature currently planned is being driven by developer feedback.&lt;/p&gt;

&lt;p&gt;If you'd like to try it out or share feedback, I'd love to hear your thoughts.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://iprout.com" rel="noopener noreferrer"&gt;https://iprout.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy building.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>backend</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
