openapi: 3.0.3 info: title: MaxMind GeoIP Web Services API description: > MaxMind's GeoIP web services provide IP geolocation data including country, city, ISP, organization, ASN, connection type, and VPN/proxy detection. Services are available at three tiers: Country, City Plus, and Insights. All endpoints use HTTP Basic Auth with your MaxMind account ID and license key. version: '2.1' contact: name: MaxMind Support url: https://support.maxmind.com/ termsOfService: https://www.maxmind.com/en/terms_of_service license: name: MaxMind End User License Agreement url: https://www.maxmind.com/en/end_user_license_agreement servers: - url: https://geoip.maxmind.com description: MaxMind GeoIP production server - url: https://geolite.info description: MaxMind GeoLite production server security: - basicAuth: [] paths: /geoip/v2.1/country/{ipAddress}: get: operationId: getGeoIPCountry summary: GeoIP Country Lookup description: > Returns country-level geolocation data for a given IP address, including country name, ISO code, continent, and registered country. Suitable for geo-targeting, content localization, and compliance use cases where city precision is not required. Billed at $0.0001 per lookup. tags: - GeoIP Country parameters: - $ref: '#/components/parameters/ipAddress' responses: '200': description: Successful country lookup response content: application/json: schema: $ref: '#/components/schemas/CountryResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '402': $ref: '#/components/responses/PaymentRequired' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalServerError' /geoip/v2.1/city/{ipAddress}: get: operationId: getGeoIPCity summary: GeoIP City Plus Lookup description: > Provides city-level geolocation data including city name, postal code, latitude and longitude with accuracy radius, metro code, time zone, and subdivisions. Also includes country, ISP, and organization data in a single response. Priced at $0.0003 per query. tags: - GeoIP City parameters: - $ref: '#/components/parameters/ipAddress' responses: '200': description: Successful city lookup response content: application/json: schema: $ref: '#/components/schemas/CityResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '402': $ref: '#/components/responses/PaymentRequired' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalServerError' /geoip/v2.1/insights/{ipAddress}: get: operationId: getGeoIPInsights summary: GeoIP Insights Lookup description: > MaxMind's most comprehensive IP data API, returning all GeoIP City Plus fields plus additional intelligence including connection type, ISP, organization, user type, domain, anonymous IP and proxy/VPN/Tor detection flags. Priced at $0.002 per query. tags: - GeoIP Insights parameters: - $ref: '#/components/parameters/ipAddress' responses: '200': description: Successful insights lookup response content: application/json: schema: $ref: '#/components/schemas/InsightsResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '402': $ref: '#/components/responses/PaymentRequired' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/TooManyRequests' '500': $ref: '#/components/responses/InternalServerError' components: securitySchemes: basicAuth: type: http scheme: basic description: > Use your MaxMind account ID as the username and your license key as the password. All requests must be made over HTTPS. parameters: ipAddress: name: ipAddress in: path required: true description: > The IP address you want to look up. Use "me" to look up the IP address of the current connection. Accepts IPv4 (dotted quad) or IPv6 (canonical form per RFC 5952). schema: type: string example: '128.101.101.101' schemas: LocalizedNames: type: object description: Localized names keyed by locale code (e.g., "en", "de", "fr") additionalProperties: type: string example: en: United States de: Vereinigte Staaten Continent: type: object description: Continent data for the IP address properties: code: type: string description: Two-letter continent code example: NA geoname_id: type: integer description: GeoNames ID for the continent example: 6255149 names: $ref: '#/components/schemas/LocalizedNames' Country: type: object description: Country data for the IP address properties: confidence: type: integer description: Confidence percent (1-99) that the country is correct (Insights only) minimum: 1 maximum: 99 example: 99 geoname_id: type: integer description: GeoNames ID for the country example: 6252001 is_in_european_union: type: boolean description: Whether the country is a member of the EU example: false iso_code: type: string description: ISO 3166-1 alpha-2 country code example: US names: $ref: '#/components/schemas/LocalizedNames' RegisteredCountry: type: object description: Country where the IP address is registered properties: geoname_id: type: integer example: 6252001 is_in_european_union: type: boolean example: false iso_code: type: string example: US names: $ref: '#/components/schemas/LocalizedNames' RepresentedCountry: type: object description: Country that is represented by the IP address (e.g., military) properties: geoname_id: type: integer example: 6252001 is_in_european_union: type: boolean example: false iso_code: type: string example: US names: $ref: '#/components/schemas/LocalizedNames' type: type: string description: Type of represented country (e.g., "military", "satellite") example: military CountryTraits: type: object description: Traits associated with the IP address (Country tier) properties: ip_address: type: string description: The IP address that was looked up example: 128.101.101.101 is_anycast: type: boolean description: Whether the IP is part of an anycast network example: false network: type: string description: CIDR network block associated with the record example: 128.101.101.0/24 MaxMindMeta: type: object description: MaxMind account metadata properties: queries_remaining: type: integer description: Number of queries remaining in the current subscription period example: 123456 City: type: object description: City data for the IP address properties: confidence: type: integer description: Confidence percent (1-99) that the city is correct minimum: 1 maximum: 99 example: 75 geoname_id: type: integer description: GeoNames ID for the city example: 5037649 names: $ref: '#/components/schemas/LocalizedNames' Location: type: object description: Location data including coordinates and time zone properties: accuracy_radius: type: integer description: Estimated accuracy radius in kilometers example: 20 latitude: type: number format: double description: Approximate latitude example: 44.9532 longitude: type: number format: double description: Approximate longitude example: -93.0875 metro_code: type: integer description: US metro code (US only) example: 613 time_zone: type: string description: Time zone name as defined by the IANA Time Zone Database example: America/Chicago Postal: type: object description: Postal code data properties: code: type: string description: Postal code for the IP address example: '55420' confidence: type: integer description: Confidence percent (1-99) the postal code is correct minimum: 1 maximum: 99 example: 60 Subdivision: type: object description: Subdivision (state/province/region) data properties: confidence: type: integer description: Confidence percent (1-99) the subdivision is correct minimum: 1 maximum: 99 example: 88 geoname_id: type: integer description: GeoNames ID for the subdivision example: 5037779 iso_code: type: string description: ISO 3166-2 code for the subdivision example: MN names: $ref: '#/components/schemas/LocalizedNames' CityTraits: allOf: - $ref: '#/components/schemas/CountryTraits' - type: object properties: autonomous_system_number: type: integer description: Autonomous System Number (ASN) for the IP address example: 217 autonomous_system_organization: type: string description: Organization associated with the ASN example: University of Minnesota connection_type: type: string description: Connection type (Cable/DSL, Cellular, Corporate, Satellite) example: Corporate domain: type: string description: Second-level domain associated with the IP address example: umn.edu isp: type: string description: Name of the ISP example: University of Minnesota mobile_country_code: type: string description: Mobile Country Code (MCC) for mobile connections example: '310' mobile_network_code: type: string description: Mobile Network Code (MNC) for mobile connections example: '004' organization: type: string description: Name of the organization using the IP address example: University of Minnesota Anonymizer: type: object description: Anonymizer and proxy detection data (Insights only) properties: confidence: type: integer description: Confidence in the anonymizer detection (0-99) minimum: 0 maximum: 99 example: 85 is_anonymous: type: boolean description: Whether the IP belongs to an anonymous network example: false is_anonymous_vpn: type: boolean description: Whether the IP is associated with an anonymous VPN service example: false is_hosting_provider: type: boolean description: Whether the IP belongs to a hosting provider example: false is_public_proxy: type: boolean description: Whether the IP is a public proxy example: false is_residential_proxy: type: boolean description: Whether the IP is part of a residential proxy network example: false is_tor_exit_node: type: boolean description: Whether the IP is a Tor exit node example: false network_last_seen: type: string description: Date the network was last seen as an anonymizer (ISO 8601) example: '2024-01-15' provider_name: type: string description: Name of the VPN or proxy provider if known example: NordVPN InsightsLocation: allOf: - $ref: '#/components/schemas/Location' - type: object properties: average_income: type: integer description: Average income in US dollars for the area (US only) example: 52000 population_density: type: integer description: Population density per square kilometer for the area example: 1100 InsightsTraits: allOf: - $ref: '#/components/schemas/CityTraits' - type: object properties: ip_risk_snapshot: type: number format: double description: IP risk score snapshot from 0.01 to 99 example: 0.5 static_ip_score: type: number format: double description: Score indicating how static the IP is (0-99.99) example: 1.5 user_count: type: integer description: Estimated number of users sharing the IP in the past 24 hours example: 1 user_type: type: string description: > Type of user associated with the IP address. Possible values: business, cafe, cellular, college, consumer_privacy_network, content_delivery_network, dialup, government, hosting, library, military, residential, router, school, search_engine_spider, traveler example: business CountryResponse: type: object description: Response from the GeoIP Country web service properties: continent: $ref: '#/components/schemas/Continent' country: $ref: '#/components/schemas/Country' maxmind: $ref: '#/components/schemas/MaxMindMeta' registered_country: $ref: '#/components/schemas/RegisteredCountry' represented_country: $ref: '#/components/schemas/RepresentedCountry' traits: $ref: '#/components/schemas/CountryTraits' CityResponse: type: object description: Response from the GeoIP City Plus web service properties: city: $ref: '#/components/schemas/City' continent: $ref: '#/components/schemas/Continent' country: $ref: '#/components/schemas/Country' location: $ref: '#/components/schemas/Location' maxmind: $ref: '#/components/schemas/MaxMindMeta' postal: $ref: '#/components/schemas/Postal' registered_country: $ref: '#/components/schemas/RegisteredCountry' represented_country: $ref: '#/components/schemas/RepresentedCountry' subdivisions: type: array items: $ref: '#/components/schemas/Subdivision' traits: $ref: '#/components/schemas/CityTraits' InsightsResponse: type: object description: Response from the GeoIP Insights web service properties: anonymizer: $ref: '#/components/schemas/Anonymizer' city: $ref: '#/components/schemas/City' continent: $ref: '#/components/schemas/Continent' country: $ref: '#/components/schemas/Country' location: $ref: '#/components/schemas/InsightsLocation' maxmind: $ref: '#/components/schemas/MaxMindMeta' postal: $ref: '#/components/schemas/Postal' registered_country: $ref: '#/components/schemas/RegisteredCountry' represented_country: $ref: '#/components/schemas/RepresentedCountry' subdivisions: type: array items: $ref: '#/components/schemas/Subdivision' traits: $ref: '#/components/schemas/InsightsTraits' ErrorResponse: type: object description: Standard error response properties: code: type: string description: Error code example: IP_ADDRESS_INVALID error: type: string description: Human-readable error description example: The value 'foo' is not a valid IP address. responses: BadRequest: description: > There was an error with the request. Check the code and error fields for details. content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' Unauthorized: description: > There was an error authenticating the request. Verify your account ID and license key. content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' PaymentRequired: description: > The service requires payment. Check that your account has sufficient credits. content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' Forbidden: description: > The request is forbidden. Your account does not have access to this service, or the IP address is blocked. content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' NotFound: description: > No record found for the IP address. The IP address may be invalid or not in the database. content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' TooManyRequests: description: > Too many requests have been sent in a given period. Slow down your request rate. content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' InternalServerError: description: > An unexpected error occurred on MaxMind's servers. content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' tags: - name: GeoIP Country description: Country-level IP geolocation lookup - name: GeoIP City description: City-level IP geolocation lookup with postal, subdivisions, and coordinates - name: GeoIP Insights description: > Most comprehensive IP data lookup including anonymizer/VPN/proxy detection, user type, static IP score, and connection details externalDocs: description: MaxMind GeoIP Web Services Documentation url: https://dev.maxmind.com/geoip/docs/web-services/