IPGeolocation.io IP Geolocation API

IP geolocation API endpoints for looking up geographic location, network routing, ASN ownership, company attribution, timezone, currency, security threat intelligence, abuse contact, and User-Agent data. Accepts IPv4 addresses, IPv6 addresses, and domain names. The single lookup endpoint (`GET /v3/ipgeo`) resolves one IP or domain per request. The bulk lookup endpoint (`POST /v3/ipgeo-bulk`) accepts up to 50,000 entries per request and requires a paid plan.

Documentation

Specifications

Other Resources

OpenAPI Specification

ipgeolocation-ip-geolocation-api-openapi.yml Raw ↑
openapi: 3.0.7
info:
  title: 'IPGeolocation.io: Abuse Contact ASN Lookup IP Geolocation API'
  version: '3.0'
  description: "Retrieve abuse contact information associated with an IPv4 address or IPv6 address.\nThe API returns the organization responsible for handling abuse complaints related\nto the queried IP address, including the abuse contact role, organization name,\nregistered address, email contacts, and phone numbers.\n\nThe abuse contact data helps organizations report malicious activities such as\nspam, phishing, DDoS attacks, IP spoofing, and other network abuse to the\nresponsible network operator.\n\nOne endpoint is available:\n\n- **Abuse lookup** (`GET /v3/abuse`) returns abuse contact information for a\n  single IPv4 or IPv6 address per request.\n\nUse query parameters to control which fields are returned and which fields are\nexcluded from the response to reduce payload size when only specific data\nis required.\n\n## Authentication\n\nTwo authentication methods are supported:\n\n### API Key\n\nPass your API key as the `apiKey` query parameter on every request. You can find your\nkey in the [IPGeolocation dashboard](https://app.ipgeolocation.io/). Store it in\nserver-side environment variables. Avoid exposing it in client-side JavaScript.\n\n### Request Origin (CORS)\n\nAvailable on paid plans only. Whitelist your domain in the dashboard under the\n\"API Keys\" section. Once configured, requests from that domain (and all its subdomains)\nare accepted without passing `apiKey`. Enter your root domain (e.g. `example.com`),\nnot the full URL.\n\nEach plan has a limit on the number of extra API keys and request origins:\n\n| Plan | Extra API Keys + Request Origins |\n|---|---|\n| Starter (150K requests) | 1 |\n| Core (250K requests) | 1 |\n| Plus (500K requests) | 2 |\n| Pro (1M requests) | 2 |\n| Business (2M requests) | 3 |\n| Premium (5M requests) | 3 |\n\nAdditional keys or origins can be added for $2.50 per month each.\n\n## Response Formats\n\nThe API supports JSON (default) and XML output.\n\n- Set the `output` query parameter to `json` or `xml`.\n- Alternatively, set the `Accept` header to `application/json`, `application/xml`,\n  or `text/xml`.\n\nIf neither is specified, the response is returned as JSON. XML responses use a\n`LinkedHashMap` root element.\n\n## Credit Usage\n\nCredits are charged only for successful **HTTP 200** responses. The exact number of\ncredits consumed by a request is returned in the `X-Credits-Charged` response header.\n\nA **single IP abuse contact lookup** (`GET /v3/abuse`) consumes **1 credit** per request.\n\n\n## Field Filtering\n\nUse `fields` to cherry-pick specific fields, or `excludes` to drop fields you do not\nneed. Both accept dot-notation for nested fields (e.g. `abuse.route`,\n`abuse.organization`). The `ip` field is always present regardless of filters.\n\n## Parameter Name Casing\n\nQuery parameter names are case-sensitive. Use exact names such as\n`apiKey`, `ip`, `fields`, `excludes`, and `output`.\n\n## Plan Availability and Usage Limits\n\nThe IP Abuse Contact API is available **only on paid plans**.\n\nPaid subscriptions do not have fixed daily, hourly, or monthly rate limits.  \nIf the monthly quota is exceeded, requests continue and a surcharge may be applied according to the subscribed plan.\n\nFree plans cannot access the IP Abuse Contact API. Requests made with a free plan API key return **HTTP 401 Unauthorized**.\n"
  contact:
    name: IPGeolocation Support
    url: https://ipgeolocation.io/contact.html
    email: support@ipgeolocation.io
  termsOfService: https://ipgeolocation.io/tos.html
  license:
    name: Proprietary
    url: https://ipgeolocation.io/tos.html
servers:
- url: https://api.ipgeolocation.io
  description: Production
security:
- ApiKeyAuth: []
tags:
- name: IP Geolocation
  description: 'IP geolocation API endpoints for looking up geographic location, network routing,

    ASN ownership, company attribution, timezone, currency, security threat intelligence,

    abuse contact, and User-Agent data. Accepts IPv4 addresses, IPv6 addresses, and

    domain names. The single lookup endpoint (`GET /v3/ipgeo`) resolves one IP or domain

    per request. The bulk lookup endpoint (`POST /v3/ipgeo-bulk`) accepts up to 50,000

    entries per request and requires a paid plan.

    '
  externalDocs:
    description: IPGeolocation API documentation and integration guides
    url: https://ipgeolocation.io/documentation/ip-location-api.html
paths:
  /v3/ipgeo:
    get:
      operationId: lookupIpGeolocation
      summary: IPGeolocation.io Single IP Geolocation Lookup
      description: 'Returns geolocation and enrichment data for a single IPv4 address, IPv6 address,

        or domain name. When `ip` is omitted, the API resolves the caller''s public IP

        automatically, which is useful for client-side lookups.


        The base response always includes `location`, `country_metadata`, `currency`,

        `asn`, and `time_zone`. Paid plans also get `network` and `company` by default.


        Use the `include` parameter to add optional modules such as `security`, `abuse`,

        `user_agent`, `geo_accuracy`, `dma_code`, and hostname resolution.


        Use `fields` and `excludes` to control exactly which parts of the response you

        receive. This reduces payload size and can improve response times.

        '
      tags:
      - IP Geolocation
      parameters:
      - $ref: '#/components/parameters/Ip'
      - $ref: '#/components/parameters/Lang'
      - $ref: '#/components/parameters/Include'
      - $ref: '#/components/parameters/Fields'
      - $ref: '#/components/parameters/Excludes'
      - $ref: '#/components/parameters/Output'
      responses:
        '200':
          description: Geolocation data for the requested IP or domain.
          headers:
            X-Credits-Charged:
              description: Number of API credits consumed by this request.
              schema:
                type: number
                example: 1
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IpGeolocationResponse'
              examples:
                paidFullResponse:
                  summary: Paid plan, all modules included
                  value:
                    ip: 91.128.103.196
                    hostname: 91.128.103.196
                    location:
                      continent_code: EU
                      continent_name: Europe
                      country_code2: SE
                      country_code3: SWE
                      country_name: Sweden
                      country_name_official: Kingdom of Sweden
                      country_capital: Stockholm
                      state_prov: Stockholms län
                      state_code: SE-AB
                      district: Stockholm
                      city: Stockholm
                      locality: Stockholm
                      accuracy_radius: '4.395'
                      confidence: high
                      dma_code: ''
                      zipcode: 164 40
                      latitude: '59.40510'
                      longitude: '17.95510'
                      is_eu: true
                      country_flag: https://ipgeolocation.io/static/flags/se_64.png
                      geoname_id: '9972319'
                      country_emoji: 🇸🇪
                    country_metadata:
                      calling_code: '+46'
                      tld: .se
                      languages:
                      - sv-SE
                      - se
                      - sma
                      - fi-SE
                    network:
                      connection_type: ''
                      route: 91.128.0.0/14
                      is_anycast: false
                    currency:
                      code: SEK
                      name: Swedish Krona
                      symbol: kr
                    asn:
                      as_number: AS1257
                      organization: Tele2 Sverige AB
                      country: SE
                      type: ISP
                      domain: tele2.com
                      date_allocated: '2024-12-13'
                      rir: RIPE
                    company:
                      name: Tele2 Sverige AB
                      type: ISP
                      domain: tele2.com
                    security:
                      threat_score: 0
                      is_tor: false
                      is_proxy: false
                      proxy_provider_names: []
                      proxy_confidence_score: 0
                      proxy_last_seen: ''
                      is_residential_proxy: false
                      is_vpn: false
                      vpn_provider_names: []
                      vpn_confidence_score: 0
                      vpn_last_seen: ''
                      is_relay: false
                      relay_provider_name: ''
                      is_anonymous: false
                      is_known_attacker: false
                      is_bot: false
                      is_spam: false
                      is_cloud_provider: false
                      cloud_provider_name: ''
                    abuse:
                      route: 91.128.0.0/14
                      country: SE
                      name: Swipnet Staff
                      organization: ''
                      kind: group
                      address: Tele2 AB/Swedish IP Network, IP Registry, Torshamnsgatan 17 164 40 Kista SWEDEN
                      emails:
                      - abuse@tele2.com
                      phone_numbers:
                      - +46 8 5626 42 10
                    time_zone:
                      name: Europe/Stockholm
                      offset: 1
                      offset_with_dst: 1
                      current_time: 2026-02-13 09:19:24.410+0100
                      current_time_unix: 1770970764.41
                      current_tz_abbreviation: CET
                      current_tz_full_name: Central European Standard Time
                      standard_tz_abbreviation: CET
                      standard_tz_full_name: Central European Standard Time
                      is_dst: false
                      dst_savings: 0
                      dst_exists: true
                      dst_tz_abbreviation: CEST
                      dst_tz_full_name: Central European Summer Time
                      dst_start:
                        utc_time: 2026-03-29 TIME 01:00
                        duration: +1.00H
                        gap: true
                        date_time_after: 2026-03-29 TIME 03:00
                        date_time_before: 2026-03-29 TIME 02:00
                        overlap: false
                      dst_end:
                        utc_time: 2026-10-25 TIME 01:00
                        duration: -1.00H
                        gap: false
                        date_time_after: 2026-10-25 TIME 02:00
                        date_time_before: 2026-10-25 TIME 03:00
                        overlap: true
                    user_agent:
                      user_agent_string: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0
                      name: Edge
                      type: Browser
                      version: '143'
                      version_major: '143'
                      device:
                        name: Linux Desktop
                        type: Desktop
                        brand: Unknown
                        cpu: Intel x86_64
                      engine:
                        name: Blink
                        type: Browser
                        version: '143'
                        version_major: '143'
                      operating_system:
                        name: Linux
                        type: Desktop
                        version: ??
                        version_major: ??
                        build: ??
                freeMinimalResponse:
                  summary: Free plan default response
                  value:
                    ip: 165.227.0.0
                    location:
                      continent_code: NA
                      continent_name: North America
                      country_code2: US
                      country_code3: USA
                      country_name: United States
                      country_name_official: United States of America
                      country_capital: Washington, D.C.
                      state_prov: California
                      state_code: US-CA
                      district: Santa Clara County
                      city: Santa Clara
                      zipcode: '95051'
                      latitude: '37.35983'
                      longitude: '-121.98144'
                      is_eu: false
                      country_flag: https://ipgeolocation.io/static/flags/us_64.png
                      geoname_id: '5346804'
                      country_emoji: 🇺🇸
                    country_metadata:
                      calling_code: '+1'
                      tld: .us
                      languages:
                      - en-US
                      - es-US
                      - haw
                      - fr
                    currency:
                      code: USD
                      name: US Dollar
                      symbol: $
                    asn:
                      as_number: AS14061
                      organization: DigitalOcean, LLC
                      country: US
                    time_zone:
                      name: America/Los_Angeles
                      offset: -8
                      offset_with_dst: -8
                      current_time: 2026-02-09 09:54:51.206-0800
                      current_time_unix: 1770659691.206
                      current_tz_abbreviation: PST
                      current_tz_full_name: Pacific Standard Time
                      standard_tz_abbreviation: PST
                      standard_tz_full_name: Pacific Standard Time
                      is_dst: false
                      dst_savings: 0
                      dst_exists: true
                      dst_tz_abbreviation: PDT
                      dst_tz_full_name: Pacific Daylight Time
                      dst_start:
                        utc_time: 2026-03-08 TIME 10:00
                        duration: +1.00H
                        gap: true
                        date_time_after: 2026-03-08 TIME 03:00
                        date_time_before: 2026-03-08 TIME 02:00
                        overlap: false
                      dst_end:
                        utc_time: 2026-11-01 TIME 09:00
                        duration: -1.00H
                        gap: false
                        date_time_after: 2026-11-01 TIME 01:00
                        date_time_before: 2026-11-01 TIME 02:00
                        overlap: true
            application/xml:
              schema:
                $ref: '#/components/schemas/IpGeolocationResponse'
              examples:
                paidFullResponse:
                  summary: Paid plan, all modules included (XML)
                  value: "<LinkedHashMap>\n  <ip>91.128.103.196</ip>\n  <hostname>91.128.103.196</hostname>\n  <location>\n      <continent_code>EU</continent_code>\n      <continent_name>Europe</continent_name>\n      <country_code2>SE</country_code2>\n      <country_code3>SWE</country_code3>\n      <country_name>Sweden</country_name>\n      <country_name_official>Kingdom of Sweden</country_name_official>\n      <country_capital>Stockholm</country_capital>\n      <state_prov>Stockholms län</state_prov>\n      <state_code>SE-AB</state_code>\n      <district>Stockholm</district>\n      <city>Stockholm</city>\n      <locality>Stockholm</locality>\n      <accuracy_radius>8.793</accuracy_radius>\n      <confidence>high</confidence>\n      <dma_code></dma_code>\n      <zipcode>164 40</zipcode>\n      <latitude>59.40510</latitude>\n      <longitude>17.95510</longitude>\n      <is_eu>true</is_eu>\n      <country_flag>https://ipgeolocation.io/static/flags/se_64.png</country_flag>\n      <geoname_id>9972319</geoname_id>\n      <country_emoji>\U0001F1F8\U0001F1EA</country_emoji>\n  </location>\n  <country_metadata>\n      <calling_code>+46</calling_code>\n      <tld>.se</tld>\n      <languages>sv-SE</languages>\n      <languages>se</languages>\n      <languages>sma</languages>\n      <languages>fi-SE</languages>\n  </country_metadata>\n  <network>\n      <connection_type></connection_type>\n      <route>91.128.0.0/14</route>\n      <is_anycast>false</is_anycast>\n  </network>\n  <currency>\n      <code>SEK</code>\n      <name>Swedish Krona</name>\n      <symbol>kr</symbol>\n  </currency>\n  <asn>\n      <as_number>AS1257</as_number>\n      <organization>Tele2 Sverige AB</organization>\n      <country>SE</country>\n      <type>ISP</type>\n      <domain>tele2.com</domain>\n      <date_allocated>2002-09-19</date_allocated>\n      <rir>RIPE</rir>\n  </asn>\n  <company>\n      <name>Tele2 Sverige AB</name>\n      <type>ISP</type>\n      <domain>tele2.com</domain>\n  </company>\n  <security>\n      <threat_score>0</threat_score>\n      <is_tor>false</is_tor>\n      <is_proxy>false</is_proxy>\n      <proxy_confidence_score>0</proxy_confidence_score>\n      <proxy_last_seen></proxy_last_seen>\n      <is_residential_proxy>false</is_residential_proxy>\n      <is_vpn>false</is_vpn>\n      <vpn_confidence_score>0</vpn_confidence_score>\n      <vpn_last_seen></vpn_last_seen>\n      <is_relay>false</is_relay>\n      <relay_provider_name></relay_provider_name>\n      <is_anonymous>false</is_anonymous>\n      <is_known_attacker>false</is_known_attacker>\n      <is_bot>false</is_bot>\n      <is_spam>false</is_spam>\n      <is_cloud_provider>false</is_cloud_provider>\n      <cloud_provider_name></cloud_provider_name>\n  </security>\n  <abuse>\n      <route>91.128.0.0/14</route>\n      <country>SE</country>\n      <name>Swipnet Staff</name>\n      <organization></organization>\n      <kind>group</kind>\n      <address>Tele2 AB/Swedish IP Network, IP Registry, Torshamnsgatan 17 164 40 Kista SWEDEN</address>\n      <emails>abuse@tele2.com</emails>\n      <phone_numbers>+46 8 5626 42 10</phone_numbers>\n  </abuse>\n  <time_zone>\n      <name>Europe/Stockholm</name>\n      <offset>1</offset>\n      <offset_with_dst>1</offset_with_dst>\n      <current_time>2026-03-02 13:32:39.256+0100</current_time>\n      <current_time_unix>1772454759.256</current_time_unix>\n      <current_tz_abbreviation>CET</current_tz_abbreviation>\n      <current_tz_full_name>Central European Standard Time</current_tz_full_name>\n      <standard_tz_abbreviation>CET</standard_tz_abbreviation>\n      <standard_tz_full_name>Central European Standard Time</standard_tz_full_name>\n      <is_dst>false</is_dst>\n      <dst_savings>0</dst_savings>\n      <dst_exists>true</dst_exists>\n      <dst_tz_abbreviation>CEST</dst_tz_abbreviation>\n      <dst_tz_full_name>Central European Summer Time</dst_tz_full_name>\n      <dst_start>\n          <utc_time>2026-03-29 TIME 01:00</utc_time>\n          <duration>+1.00H</duration>\n          <gap>true</gap>\n          <date_time_after>2026-03-29 TIME 03:00</date_time_after>\n          <date_time_before>2026-03-29 TIME 02:00</date_time_before>\n          <overlap>false</overlap>\n      </dst_start>\n      <dst_end>\n          <utc_time>2026-10-25 TIME 01:00</utc_time>\n          <duration>-1.00H</duration>\n          <gap>false</gap>\n          <date_time_after>2026-10-25 TIME 02:00</date_time_after>\n          <date_time_before>2026-10-25 TIME 03:00</date_time_before>\n          <overlap>true</overlap>\n      </dst_end>\n  </time_zone>\n  <user_agent>\n      <user_agent_string>PostmanRuntime/7.49.1</user_agent_string>\n      <name>PostmanRuntime</name>\n      <type>Robot</type>\n      <version>7.49.1</version>\n      <version_major>7</version_major>\n      <device>\n          <name>Postman Runtime</name>\n          <type>Robot</type>\n          <brand>Postman</brand>\n          <cpu>Unknown</cpu>\n      </device>\n      <engine>\n          <name>PostmanRuntime</name>\n          <type>Robot</type>\n          <version>7.49.1</version>\n          <version_major>7</version_major>\n      </engine>\n      <operating_system>\n          <name>Cloud</name>\n          <type>Cloud</type>\n          <version>??</version>\n          <version_major>??</version_major>\n          <build>??</build>\n      </operating_system>\n  </user_agent>\n</LinkedHashMap>\n"
                freeMinimalResponse:
                  summary: Free plan default response (XML)
                  value: "<LinkedHashMap>\n  <ip>165.227.0.0</ip>\n  <location>\n      <continent_code>NA</continent_code>\n      <continent_name>North America</continent_name>\n      <country_code2>US</country_code2>\n      <country_code3>USA</country_code3>\n      <country_name>United States</country_name>\n      <country_name_official>United States of America</country_name_official>\n      <country_capital>Washington, D.C.</country_capital>\n      <state_prov>California</state_prov>\n      <state_code>US-CA</state_code>\n      <district>Santa Clara County</district>\n      <city>Santa Clara</city>\n      <zipcode>95051</zipcode>\n      <latitude>37.35983</latitude>\n      <longitude>-121.98144</longitude>\n      <is_eu>false</is_eu>\n      <country_flag>https://ipgeolocation.io/static/flags/us_64.png</country_flag>\n      <geoname_id>5346804</geoname_id>\n      <country_emoji>\U0001F1FA\U0001F1F8</country_emoji>\n  </location>\n  <country_metadata>\n      <calling_code>+1</calling_code>\n      <tld>.us</tld>\n      <languages>en-US</languages>\n      <languages>es-US</languages>\n      <languages>haw</languages>\n      <languages>fr</languages>\n  </country_metadata>\n  <currency>\n      <code>USD</code>\n      <name>US Dollar</name>\n      <symbol>$</symbol>\n  </currency>\n  <asn>\n      <as_number>AS14061</as_number>\n      <organization>DigitalOcean, LLC</organization>\n      <country>US</country>\n  </asn>\n  <time_zone>\n      <name>America/Los_Angeles</name>\n      <offset>-8</offset>\n      <offset_with_dst>-8</offset_with_dst>\n      <current_time>2026-03-02 03:29:55.186-0800</current_time>\n      <current_time_unix>1772450995.186</current_time_unix>\n      <current_tz_abbreviation>PST</current_tz_abbreviation>\n      <current_tz_full_name>Pacific Standard Time</current_tz_full_name>\n      <standard_tz_abbreviation>PST</standard_tz_abbreviation>\n      <standard_tz_full_name>Pacific Standard Time</standard_tz_full_name>\n      <is_dst>false</is_dst>\n      <dst_savings>0</dst_savings>\n      <dst_exists>true</dst_exists>\n      <dst_tz_abbreviation>PDT</dst_tz_abbreviation>\n      <dst_tz_full_name>Pacific Daylight Time</dst_tz_full_name>\n      <dst_start>\n          <utc_time>2026-03-08 TIME 10:00</utc_time>\n          <duration>+1.00H</duration>\n          <gap>true</gap>\n          <date_time_after>2026-03-08 TIME 03:00</date_time_after>\n          <date_time_before>2026-03-08 TIME 02:00</date_time_before>\n          <overlap>false</overlap>\n      </dst_start>\n      <dst_end>\n          <utc_time>2026-11-01 TIME 09:00</utc_time>\n          <duration>-1.00H</duration>\n          <gap>false</gap>\n          <date_time_after>2026-11-01 TIME 01:00</date_time_after>\n          <date_time_before>2026-11-01 TIME 02:00</date_time_before>\n          <overlap>true</overlap>\n      </dst_end>\n  </time_zone>\n</LinkedHashMap>\n"
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '405':
          $ref: '#/components/responses/MethodNotAllowed'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '499':
          $ref: '#/components/responses/ClientClosedRequest'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '502':
          $ref: '#/components/responses/BadGateway'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
        '504':
          $ref: '#/components/responses/GatewayTimeout'
        '505':
          $ref: '#/components/responses/HttpVersionNotSupported'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /v3/ipgeo-bulk:
    post:
      operationId: bulkLookupIpGeolocation
      summary: IPGeolocation.io Bulk IP Geolocation Lookup
      description: 'Returns geolocation and enrichment data for up to 50,000 IPv4 addresses, IPv6

        addresses, or domain names in a single request. The request body must be a JSON

        object with an `ips` array.


        This endpoint requires a paid plan. Calling it with a free

        plan API key returns HTTP 401.


        The response is a JSON array with one element per IP in the request. Each element

        is either a full geolocation response object or an error object with only a

        `message` field. Invalid, bogon, and unresolvable entries appear as error

        objects. Invalid, private, and bogon IPs are not billed.


        This endpoint supports the same query parameters as the single lookup endpoint,

        including `lang`, `include`, `fields`, `excludes`, and `output`.


        Credits are calculated as: credits per lookup multiplied by the number of valid

        IPs in the request. The total is returned in the `X-Credits-Charged` response

        header. When at least one submitted ip is invalid, the `X-Successful-Record`

        response header indicates how many entries were successfully resolved.


        Only the `POST` method is accepted. Sending a `GET` request returns HTTP 405.

        '
      tags:
      - IP Geolocation
      parameters:
      - $ref: '#/components/parameters/Lang'
      - $ref: '#/components/parameters/Include'
      - $ref: '#/components/parameters/Fields'
      - $ref: '#/components/parameters/Excludes'
      - $ref: '#/components/parameters/Output'
      requestBody:
        required: true
        description: 'A JSON object containing an `ips` array. Each element is a string representing

          an IPv4 address, IPv6 address, or domain name. The array must not be empty and

          must not contain more than 50,000 entries.

          '
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkGeolocationRequest'
            examples:
              mixedIps:
                summary: Mixed IPv4, IPv6, and domain
                value:
                  ips:
                  - 8.8.8.8
                  - 91.128.103.196
                  - 2607:fb91:16c6:8860:e531:2d1d:4944:6c7c
                  - ipgeolocation.io
              ipv4Only:
                summary: Multiple IPv4 addresses
                value:
                  ips:
                  - 1.1.1.1
                  - 8.8.4.4
                  - 165.227.0.0
      responses:
        '200':
          description: 'An array of results, one per input entry. Valid entries return full

            geolocation objects. Invalid, bogon, and unresolvable entries return

            objects with only a `message` field.

            `X-Successful-Record` is returned only when at least one submitted entry

            fails and the number of successful lookups is lower than the number of

            submitted entries.

            '
          headers:
            X-Credits-Charged:
              description: 'Total number of API credits consumed. Equals credits per lookup

                multiplied by the count of valid IPs.

                '
              schema:
                type: number
                example: 3
            X-Successful-Record:
              description: 'Number of valid IP addresses or domains that were successfully resolved in

                this bulk request. Invalid, bogon, and private IPs are not counted.

                This header is included only when at least one bulk entry returns an

                error message and total successful lookups are fewer than submitted

                entries.

                '
              schema:
                type: number
                example: 4
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/BulkGeolocationResponseItem'
              examples:
                bulkResponse:
                  summary: Bulk response with one valid and one error entry
                  value:
                  - ip: 8.8.8.8
                    location:
                      continent_code: NA
                      continent_name: North America
                      country_code2: US
                      country_code3: USA
                      country_name: United States
                      country_name_official: United States of America
                      country_capital: Washington, D.C.
                      state_prov: California
                      state_code: US-CA
                      district: Santa Clara County
                      city: Mountain View
                      zipcode: '94043'
                      latitude: '37.42240'
                      longitude: '-122.08421'
                      is_eu: false
                      country_flag: https://ipgeolocation.io/static/flags/us_64.png
                      geoname_id: '5375480'
                      country_emoji: 🇺🇸
                    country_metadata:
                      calling_code: '+1'
                      tld: .us
                      languages:
                      - en-US
                      - es-US
                      - haw
                      - fr
                    network:
                      connection_type: ''
                      route: 8.8.8.0/24
                      is_anycast: true
                    currency:
                      code: USD
                      name: US Dollar
                      symbol: $
                    asn:
                      as_number: AS15169
                      organization: Google LLC
                      country: US
                      type: BUSINESS
                      domain: google.com
                      date_allocated: '2000-03-30'
                      rir: ARIN
                    company:
                      name: Google LLC
                      type: HOSTING
                      domain: google.com
                    time_zone:
                      name: America/Los_Angeles
                      offset: -8
                      offset_with_dst: -8
                      current_time: 2026-02-09 09:54:51.206-0800
                      current_time_unix: 1770659691.206
                      current_tz_abbreviation: PST
                      current_tz_full_name: Pacific Standard Time
                      standard_tz_abbreviation: PST
                      standard_tz_full_name: Pacific Standard Time
                      is_dst: false
                      dst_savings: 0
                      dst_exists: true
                      dst_tz_abbreviation: PDT
                      dst_tz_full_name: Pacific Daylight Time
                      dst_start:
                        utc_time: 2026-03-08 TIME 10:00
                        duration: +1.00H
                        gap: true
                        date_time_after: 2026-03-08 TIME 03:00
                        date_time_before: 2026-03-08 TIME 02:00
                        overlap: false
                      dst_end:
                        utc_time: 2026-11-01 TIME 09:00
                        duration: -1.00H
                        gap: false
                        date_time_after: 2026-11-01 TIME 01:00
                        date_time_before: 2026-11-01 TIME 02:00
                        overlap: true
                  - message: '''10.0.0.1'' is a bogon IP address.'
            application/xml:
              schema:
                type: array
                xml:
                  name: ArrayList
                  wrapped: true
                items:
                  $ref: '#/components/schemas/BulkGeolocationResponseItem'
                  xml:
                    name: item
              examples:
                bulkResponse:
                  summary: Bulk response with one valid and one error entry (XML)
                  value: "<

# --- truncated at 32 KB (85 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/ipgeolocation/refs/heads/main/openapi/ipgeolocation-ip-geolocation-api-openapi.yml