IPGeolocation.io User Agent API

API endpoints for parsing user agent strings into browser, device, layout engine, and operating system details. Supports single lookups via request header, custom string lookups via JSON body, and bulk parsing of up to 50,000 strings per request. Also detects bots, crawlers, and malicious or malformed user agent strings.

Operations 3

GET /v3/user-agent IPGeolocation.io Parse User Agent String (auto-detect or Explicit Header) #
POST /v3/user-agent IPGeolocation.io Parse Custom User Agent String (payload) #
POST /v3/user-agent-bulk IPGeolocation.io Bulk Parse User Agent Strings #

Documentation

Specifications

Other Resources

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/ipgeolocation-user-agent-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

ipgeolocation-user-agent-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: 'IPGeolocation.io: User Agent API'
  version: '3.0'
  description: Parse browser, device, and operating system details from a User Agent string.
  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: User Agent
  description: 'API endpoints for parsing user agent strings into browser, device, layout engine,

    and operating system details. Supports single lookups via request header, custom

    string lookups via JSON body, and bulk parsing of up to 50,000 strings per request.

    Also detects bots, crawlers, and malicious or malformed user agent strings.'
  externalDocs:
    description: User Agent API documentation
    url: https://ipgeolocation.io/documentation/user-agent-api.html
paths:
  /v3/user-agent:
    get:
      operationId: parseUserAgent
      summary: IPGeolocation.io Parse User Agent String (auto-detect or Explicit Header)
      description: 'Parses a user agent string and returns browser, device, and operating system

        details. Also detects bots, crawlers, and malicious or malformed user agent strings.


        This endpoint supports two usage modes:


        **Mode 1 — Auto-detect caller''s user agent:**

        Omit the `User-Agent` header entirely. The API will parse the user agent string

        of the calling client automatically. This is the default browser behavior — when

        executed in browser JavaScript, the header is appended automatically and no

        additional configuration is needed.


        **Mode 2 — Explicit user agent header:**

        Pass any user agent string in the `User-Agent` request header. The API parses

        that string instead of detecting the caller''s own user agent. Use this to

        simulate or test specific user agent strings server-side.


        Each successful lookup consumes **1 credit**.'
      tags:
      - User Agent
      parameters:
      - $ref: '#/components/parameters/ApiKey'
      - name: User-Agent
        in: header
        required: false
        description: 'The user agent string to parse. When omitted, the API automatically parses

          the user agent of the calling client. When provided, the supplied string is

          parsed instead.

          '
        schema:
          type: string
        example: Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
      responses:
        '200':
          description: Parsed user agent details for the resolved user agent string.
          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/UserAgentResponse'
              example:
                user_agent_string: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9
                name: Safari
                type: Browser
                version: 9.0.2
                version_major: '9'
                device:
                  name: Apple Macintosh
                  type: Desktop
                  brand: Apple
                  cpu: Intel
                engine:
                  name: AppleWebKit
                  type: Browser
                  version: 601.3.9
                  version_major: '601'
                operating_system:
                  name: Mac OS
                  type: Desktop
                  version: 10.11.2
                  version_major: '10.11'
                  build: ??
            application/xml:
              schema:
                $ref: '#/components/schemas/UserAgentResponse'
              example: "<LinkedHashMap>\n  <user_agent_string>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9</user_agent_string>\n  <name>Safari</name>\n  <type>Browser</type>\n  <version>9.0.2</version>\n  <version_major>9</version_major>\n  <device>\n      <name>Apple Macintosh</name>\n      <type>Desktop</type>\n      <brand>Apple</brand>\n      <cpu>Intel</cpu>\n  </device>\n  <engine>\n      <name>AppleWebKit</name>\n      <type>Browser</type>\n      <version>601.3.9</version>\n      <version_major>601</version_major>\n  </engine>\n  <operating_system>\n      <name>Mac OS</name>\n      <type>Desktop</type>\n      <version>10.11.2</version>\n      <version_major>10.11</version_major>\n      <build>??</build>\n  </operating_system>\n</LinkedHashMap>\n"
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '405':
          $ref: '#/components/responses/MethodNotAllowed'
        '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
    post:
      operationId: parseCustomUserAgent
      summary: IPGeolocation.io Parse Custom User Agent String (payload)
      description: 'Parses a custom user agent string supplied in the JSON request body and returns

        browser, device, and operating system details.


        **Mode 3 — Custom user agent string via POST body:**

        Pass the user agent string as the `uaString` field in a JSON payload. This is

        intended for server-side use cases where the string to be parsed is different

        from the caller''s own user agent and is known at request time.


        This endpoint is available on **paid plans only**.


        Each successful lookup consumes **1 credit**.'
      tags:
      - User Agent
      parameters:
      - $ref: '#/components/parameters/ApiKey'
      requestBody:
        required: true
        description: JSON body containing the custom user agent string to parse.
        content:
          application/json:
            schema:
              type: object
              required:
              - uaString
              properties:
                uaString:
                  type: string
                  description: The custom user agent string to parse.
                  example: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9
            examples:
              ParseCustomUserAgentRequestExample:
                summary: Default parseCustomUserAgent request
                x-microcks-default: true
                value:
                  ips:
                  - 8.8.8.8
                  - 1.1.1.1
      responses:
        '200':
          description: Parsed user agent details for the submitted user agent string.
          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/UserAgentResponse'
              example:
                user_agent_string: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9
                name: Safari
                type: Browser
                version: 9.0.2
                version_major: '9'
                device:
                  name: Apple Macintosh
                  type: Desktop
                  brand: Apple
                  cpu: Intel
                engine:
                  name: AppleWebKit
                  type: Browser
                  version: 601.3.9
                  version_major: '601'
                operating_system:
                  name: Mac OS
                  type: Desktop
                  version: 10.11.2
                  version_major: '10.11'
                  build: ??
            application/xml:
              schema:
                $ref: '#/components/schemas/UserAgentResponse'
              example: "<LinkedHashMap>\n  <user_agent_string>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9</user_agent_string>\n  <name>Safari</name>\n  <type>Browser</type>\n  <version>9.0.2</version>\n  <version_major>9</version_major>\n  <device>\n      <name>Apple Macintosh</name>\n      <type>Desktop</type>\n      <brand>Apple</brand>\n      <cpu>Intel</cpu>\n  </device>\n  <engine>\n      <name>AppleWebKit</name>\n      <type>Browser</type>\n      <version>601.3.9</version>\n      <version_major>601</version_major>\n  </engine>\n  <operating_system>\n      <name>Mac OS</name>\n      <type>Desktop</type>\n      <version>10.11.2</version>\n      <version_major>10.11</version_major>\n      <build>??</build>\n  </operating_system>\n</LinkedHashMap>\n"
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '405':
          $ref: '#/components/responses/MethodNotAllowed'
        '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/user-agent-bulk:
    post:
      operationId: parseUserAgentBulk
      summary: IPGeolocation.io Bulk Parse User Agent Strings
      description: 'Parses up to **50,000 user agent strings** in a single request.


        Pass a JSON body containing the `uaStrings` array. Each entry in the array

        is parsed independently. The total credits charged equals the number of strings

        in the array.


        This endpoint is available on **paid plans only**.'
      tags:
      - User Agent
      parameters:
      - $ref: '#/components/parameters/ApiKey'
      requestBody:
        required: true
        description: JSON body containing the array of user agent strings to parse.
        content:
          application/json:
            schema:
              type: object
              required:
              - uaStrings
              properties:
                uaStrings:
                  type: array
                  description: 'Array of user agent strings to parse. Maximum 50,000 entries per request.

                    '
                  maxItems: 50000
                  minItems: 1
                  items:
                    type: string
                  example:
                  - Mozilla/5.0 (Linux; Android 8.0.0; SM-G960F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36
                  - Mozilla/5.0 (X11; U; Linux armv7l like Android; en-us) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/533.2+ Kindle/3.0+
                  - Mozilla/5.0 (Linux; U; en-US) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) Version/4.0 Kindle/3.0 (screen 600x800; rotate)
            examples:
              ParseUserAgentBulkRequestExample:
                summary: Default parseUserAgentBulk request
                x-microcks-default: true
                value:
                  ips:
                  - 8.8.8.8
                  - 1.1.1.1
      responses:
        '200':
          description: 'Array of parsed user agent results, one object per submitted string,

            in the same order as the input array.

            '
          headers:
            X-Credits-Charged:
              description: 'Total number of API credits consumed by this request.

                Equals the number of user agent strings submitted.

                '
              schema:
                type: number
                example: 3
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/UserAgentResponse'
              example:
              - user_agent_string: Mozilla/5.0 (Linux; Android 8.0.0; SM-G960F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36
                name: Chrome
                type: Browser
                version: 62.0.3202.84
                version_major: '62'
                device:
                  name: Samsung SM-G960F
                  type: Phone
                  brand: Samsung
                  cpu: Unknown
                engine:
                  name: Blink
                  type: Browser
                  version: '62.0'
                  version_major: '62'
                operating_system:
                  name: Android
                  type: Mobile
                  version: 8.0.0
                  version_major: '8'
                  build: R16NW
              - user_agent_string: Mozilla/5.0 (X11; U; Linux armv7l like Android; en-us) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/533.2+ Kindle/3.0+
                name: Kindle
                type: Browser
                version: '3.0'
                version_major: '3'
                device:
                  name: Amazon Kindle
                  type: eReader
                  brand: Amazon
                  cpu: ARMv7l
                engine:
                  name: AppleWebKit
                  type: Browser
                  version: '531.2'
                  version_major: '531'
                operating_system:
                  name: FireOS
                  type: Mobile
                  version: ??
                  version_major: ??
                  build: ??
            application/xml:
              schema:
                type: array
                xml:
                  name: ArrayList
                  wrapped: true
                items:
                  $ref: '#/components/schemas/UserAgentResponse'
                  xml:
                    name: item
              example: "<ArrayList>\n  <item>\n      <user_agent_string>Mozilla/5.0 (Linux; Android 8.0.0; SM-G960F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36</user_agent_string>\n      <name>Chrome</name>\n      <type>Browser</type>\n      <version>62.0.3202.84</version>\n      <version_major>62</version_major>\n      <device>\n          <name>Samsung SM-G960F</name>\n          <type>Phone</type>\n          <brand>Samsung</brand>\n          <cpu>Unknown</cpu>\n      </device>\n      <engine>\n          <name>Blink</name>\n          <type>Browser</type>\n          <version>62.0</version>\n          <version_major>62</version_major>\n      </engine>\n      <operating_system>\n          <name>Android</name>\n          <type>Mobile</type>\n          <version>8.0.0</version>\n          <version_major>8</version_major>\n          <build>R16NW</build>\n      </operating_system>\n  </item>\n  <item>\n      <user_agent_string>Mozilla/5.0 (X11; U; Linux armv7l like Android; en-us) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/533.2+ Kindle/3.0+</user_agent_string>\n      <name>Kindle</name>\n      <type>Browser</type>\n      <version>3.0</version>\n      <version_major>3</version_major>\n      <device>\n          <name>Amazon Kindle</name>\n          <type>eReader</type>\n          <brand>Amazon</brand>\n          <cpu>ARMv7l</cpu>\n      </device>\n      <engine>\n          <name>AppleWebKit</name>\n          <type>Browser</type>\n          <version>531.2</version>\n          <version_major>531</version_major>\n      </engine>\n      <operating_system>\n          <name>FireOS</name>\n          <type>Mobile</type>\n          <version>??</version>\n          <version_major>??</version_major>\n          <build>??</build>\n      </operating_system>\n  </item>\n</ArrayList>\n"
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '405':
          $ref: '#/components/responses/MethodNotAllowed'
        '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
components:
  responses:
    InternalServerError:
      description: 'Internal Server Error. The server encountered an unexpected condition

        that prevented it from fulfilling the request. If the issue persists,

        contact support@ipgeolocation.io.

        '
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            message: Something went wrong on the server side.
    HttpVersionNotSupported:
      description: 'HTTP Version Not Supported. The server does not support the HTTP protocol

        version used in the request.

        '
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            message: HTTP version not supported.
    BadGateway:
      description: 'Bad Gateway. The API server received an invalid response from an upstream

        server while processing the request. This is usually temporary.

        '
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            message: Upstream service error. Please try again later.
    GatewayTimeout:
      description: 'Gateway Timeout. The API server did not receive a timely response from

        an upstream server.

        '
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            message: The server timed out while processing the request.
    ClientClosedRequest:
      description: 'Client Closed Request. Returned when the client sets a very short timeout,

        causing the connection to close before the server responds.

        '
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            message: Client closed the request before the server could respond.
    TooManyRequests:
      description: "Too Many Requests. Returned for one of the following reasons:\n- The API usage limit has been reached for a free subscription.\n- The API usage limit has been reached for a paid subscription with\n  status 'past due', 'deleted', or 'trial expired'.\n- The surcharge API usage limit has been reached.\n"
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            usageLimitReached:
              summary: API usage limit reached
              value:
                message: You have exceeded the limit of PLAN_USAGE_LIMIT requests per PLAN_INERVAL for your subscribed PLAN plan. Please throttle your requests or upgrade your plan to continue using IPGeolocation API without interruption.
            surchargeLimitReached:
              summary: Surcharge usage limit reached
              value:
                message: You have reached the surcharge amount limit of PLAN_USAGE_LIMIT_AND_SURCHARGE_LIMIT on your subscribed PLAN plan. Please throttle your requests or upgrade your plan to continue using IPGeolocation API without interruption.
    MethodNotAllowed:
      description: 'Method Not Allowed. Returned when an unsupported HTTP method is used.


        - `/v3/user-agent` supports GET and POST.

        - `/v3/user-agent-bulk` supports POST only.

        '
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            getNotAllowedForBulk:
              summary: GET used on bulk endpoint
              value:
                message: Request method 'GET' is not supported
    ServiceUnavailable:
      description: 'Service Unavailable. The API is temporarily unavailable due to maintenance

        or overload. Please try again later.

        '
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            message: Service temporarily unavailable. Please try again later.
    Unauthorized:
      description: 'Unauthorized. Returned for one of the following reasons:

        - The `apiKey` URL parameter is missing from the request.

        - The provided API key is not valid.

        - The request is made using an API key of a database subscription.

        - The account has been disabled or locked due to illegal activity.

        - Requests are made after the subscription trial has expired.

        - The subscription is paused or not active.

        - The account’s active-until date has passed.

        - A paid feature is accessed using a free subscription.

        - The bulk user agent parsing endpoint is called using a free subscription API key.

        '
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            missingApiKey:
              summary: Missing API key
              value:
                message: Please provide an API key (as 'apiKey=YOUR_API_KEY' URL parameter) to use IPGeolocation API. To get your free API Key, sign up at https://app.ipgeolocation.io/login
            invalidApiKey:
              summary: Invalid API key
              value:
                message: Provided API key is not valid. Contact technical support for assistance at support@ipgeolocation.io
            databaseSubscriptionKey:
              summary: Database subscription API key used
              value:
                message: You cannot query IPGeolocation API on a database plan subscription.
            lockedAccount:
              summary: Account locked or disabled
              value:
                message: Your account has been locked to use IPGeolocation API. Contact technical support for assistance at support@ipgeolocation.io
            expiredTrial:
              summary: Subscription trial expired
              value:
                message: Your subscription has expired. Please subscribe to a paid plan to continue using IPGeolocation API.
            inactiveSubscription:
              summary: Subscription inactive or paused
              value:
                message: Your subscription is not active.
            expiredAccount:
              summary: Account active-until date passed
              value:
                message: Your subscription has been paused. Please resume your subscription to use IPGeolocation API.
            freePlanPaidFeature:
              summary: Paid feature accessed on free plan
              value:
                message: Custom User-Agent lookup is not supported on your current subscription. This feature is available to all paid subscriptions only.
            bulkOnFreePlan:
              summary: Bulk endpoint called with free subscription key
              value:
                message: Bulk User-Agent lookup is not supported on your current subscription. This feature is available to all paid subscriptions only.
    BadRequest:
      description: "Bad Request. Returned for one of the following reasons:\n- Special characters ( ) [ ] { } | ^ ` are passed in the API URL (either in parameters or values), especially in the API key.\n- The `uaString` is empty or null when calling `/v3/user-agent`(POST).\n- The `uaStrings` array is empty, or the JSON body does not contain a `uaStrings`\n  field when calling `/v3/user-agent-bulk`.\n- More than 50,000 user agent strings are provided in a single bulk request.\n"
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            specialCharacters:
              summary: Invalid special characters in request
              value:
                message: Invalid character found in the request target.
            emptyUaString:
              summary: Empty or null user agent string
              value:
                message: User-Agent string must not be blank
            emptyBulkList:
              summary: Empty uaStrings array or missing field
              value:
                message: User-Agent strings for bulk lookup are missing
            bulkLimitExceeded:
              summary: More than 50,000 strings in bulk request
              value:
                message: No. of lookup queries cannot be more than 50000
  parameters:
    ApiKey:
      name: apiKey
      in: query
      required: false
      description: 'Your IPGeolocation API key. Required unless Request Origin (CORS) authentication

        is configured for your domain on a paid plan. Get your key from the

        [IPGeolocation dashboard](https://app.ipgeolocation.io/).

        '
      schema:
        type: string
      example: YOUR_API_KEY
  schemas:
    OperatingSystem:
      type: object
      description: Operating system information extracted from the user agent string.
      properties:
        name:
          type: string
          description: Name of the operating system.
          example: Mac OS
        type:
          type: string
          description: 'Type of the operating system. See possible values in the documentation.

            '
          example: Desktop
        version:
          type: string
          description: Full version string of the operating system. May be `"??"` if unknown.
          example: 10.11.2
        version_major:
          type: string
          description: Major version of the operating system. May be `"??"` if unknown.
          example: '10.11'
        build:
          type: string
          description: Build identifier of the operating system. May be `"??"` if unknown.
          example: ??
    ErrorResponse:
      type: object
      description: 'Returned for any non-200 response. Contains only a human-readable `message`.

        Message text can vary by status and condition; examples in this spec are

        representative, not exhaustive, and should not be treated as stable machine codes.

        '
      required:
      - message
      properties:
        message:
          type: string
          description: Human-readable explanation of what went wrong. Use HTTP status for control flow.
          example: User agent string is empty or null.
    Device:
      type: object
      description: Hardware device information extracted from the user agent string.
      properties:
        name:
          type: string
          description: Name of the device (e.g. model name or manufacturer).
          example: Apple Macintosh
        type:
          type: string
          description: 'Type of the device. See possible values in the documentation.

            '
          example: Desktop
        brand:
          type: string
          description: Brand or manufacturer of the device.
          example: Apple
        cpu:
          type: string
          description: CPU architecture or model of the device. May be `"Unknown"`.
          example: Intel
    UserAgentResponse:
      type: object
      description: 'Parsed user agent details including browser, device, layout engine, and

        operating system information. Also indicates bots, crawlers, or malicious

        user agent strings.

        '
      properties:
        user_agent_string:
          type: string
          description: The raw user agent string that was parsed.
          example: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9
        name:
          type: string
          description: 'Name of the detected agent (e.g. browser name, bot name, or `"Hacker"`

            if the string is malformed or contains injected scripts).

            '
          example: Safari
        type:
          type: string
          description: 'Type of the detected user agent. See possible values in the documentation.

            '
          example: Browser
        version:
          type: string
          description: Full version string of the detected agent.
          example: 9.0.2
        version_major:
          type: string
          description: Major version of the detected agent.
          example: '9'
        device:
          $ref: '#/components/schemas/Device'
        engine:
          $ref: '#/components/schemas/Engine'
        operating_system:
          $ref: '#/components/schemas/OperatingSystem'
    Engine:
      type: object
      description: Layout engine information extracted from the user agent string.
      properties:
        name:
          type: string
          description: Name of the layout engine (e.g. `"AppleWebKit"`, `"Blink"`, `"Gecko"`).
          example: AppleWebKit
        type:
          type: string
          description: 'Type of the layout engine. See possible values in the documentation.

            '
          example: Browser
        version:
          type: string
          description: Full version string of the layout engine. May be `"??"` if unknown.
          example: 601.3.9
        version_major:
          type: string
          description: Major version of the layout engine. May be `"??"` if unknown.
          example: '601'
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: query
      name: apiKey
      description: 'API key passed as the `apiKey` query parameter. Get yours from the

        [IPGeolocation dashboard](https://app.ipgeolocation.io/). For client-side

        usage, consider using Request Origin (CORS) authentication instead to

        avoid exposing your key.

        '
externalDocs:
  description: IPGeolocation User Agent API documentation
  url: https://ipgeolocation.io/documentation/user-agent-api.html