---
title: Bulk User Agent Parser - Multi User Agent Parsing
version: 1.0.0
description: Parse multiple User-Agent strings in a single POST request to obtain detailed browser, device, operating system, and rendering engine information for each string. Supports up to 20,000 User-Agent strings per request; exceeding that returns a 413, not a 400. Each entry in the response array mirrors the shape of a single User Agent Parser result --- including browser/app name and version, device hardware (name, type, brand, CPU), layout engine data, and operating system metadata --- in the same order as the request. A malformed/unparsable (but non-empty) string does not fail the batch; it simply comes back with every classification field set to `Hacker`, just like the single-lookup endpoint. An empty string or `null` anywhere in the array does fail the whole request with a `400`, not a per-item error --- there is no partial-failure array shape for this endpoint.
openapi: 3.1.1
servers:
  - https://api.apifreaks.com/v1.0
paths: 1
operations: 1
schemas: 7
---

## Table of Contents

- [Bulk User Agent Parser - Multi User Agent Parsing v1.0.0](#bulk-user-agent-parser-multi-user-agent-parsing-v100)
  - [Authentication](#authentication)
  - [User Agent APIs](#user-agent-apis)
    - [bulkParseUserAgent](#bulkparseuseragent)
      - [Parameters](#parameters)
      - [Responses](#responses)
  - [Schemas](#schemas)
    - [BulkUserAgentRequest](#bulkuseragentrequest)
    - [BulkUserAgentParserResponse](#bulkuseragentparserresponse)
    - [UserAgentParserResponse](#useragentparserresponse)
    - [Device](#device)
    - [Engine](#engine)
    - [OperatingSystem](#operatingsystem)
    - [ErrorResponse](#errorresponse)



# Bulk User Agent Parser - Multi User Agent Parsing v1.0.0

Parse multiple User-Agent strings in a single POST request to obtain detailed browser, device, operating system, and rendering engine information for each string. Supports up to 20,000 User-Agent strings per request; exceeding that returns a 413, not a 400. Each entry in the response array mirrors the shape of a single User Agent Parser result --- including browser/app name and version, device hardware (name, type, brand, CPU), layout engine data, and operating system metadata --- in the same order as the request. A malformed/unparsable (but non-empty) string does not fail the batch; it simply comes back with every classification field set to `Hacker`, just like the single-lookup endpoint. An empty string or `null` anywhere in the array does fail the whole request with a `400`, not a per-item error --- there is no partial-failure array shape for this endpoint.

Base URLs:

* [https://api.apifreaks.com/v1.0](https://api.apifreaks.com/v1.0)

## Authentication

* API Key (ApiKeyAuthHeader)
    - Parameter Name: **X-apiKey**, in: header. Pass your API key via the X-apiKey request header.

* API Key (ApiKeyAuthQuery)
    - Parameter Name: **apiKey**, in: query. Pass your API key via the apiKey query parameter.

## User Agent APIs

### bulkParseUserAgent

`POST /user-agent/lookup`

*Parse multiple User-Agent strings in a single request to obtain browser, device, and operating system details*

Parse up to 20,000 User-Agent strings simultaneously in a single request. Returns structured details about the browser, device, layout engine, and operating system for each string.

> Body parameter

```json
{
  "uaStrings": [
    "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)"
  ]
}
```

#### Parameters

|Name|In|Type|Required|Description|
|---|---|---|---|---|
|format|query|string|false|Format of the response. Possible values: json, xml.|
|body|body|[BulkUserAgentRequest](#bulkuseragentrequest)|true|none|

##### Enumerated Values

|Parameter|Value|
|---|---|
|format|json|
|format|xml|

> Example responses

> Successful response with parsed user agent data for each input string

```json
[
  {
    "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": "??"
    }
  },
  {
    "user_agent_string": "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)",
    "name": "Kindle",
    "type": "Browser",
    "version": "3.0",
    "version_major": "3",
    "device": {
      "name": "Amazon Kindle",
      "type": "eReader",
      "brand": "Amazon",
      "cpu": "Unknown"
    },
    "engine": {
      "name": "AppleWebKit",
      "type": "Browser",
      "version": "528.5",
      "version_major": "528"
    },
    "operating_system": {
      "name": "FireOS",
      "type": "Mobile",
      "version": "??",
      "version_major": "??",
      "build": "??"
    }
  }
]
```

```json
[
  {
    "user_agent_string": "asdkjaslkdjaslkdj12312",
    "name": "Hacker",
    "type": "Hacker",
    "version": "Hacker",
    "version_major": "Hacker",
    "device": {
      "name": "Hacker",
      "type": "Hacker",
      "brand": "Hacker",
      "cpu": "Unknown"
    },
    "engine": {
      "name": "Hacker",
      "type": "Hacker",
      "version": "Hacker",
      "version_major": "Hacker"
    },
    "operating_system": {
      "name": "Hacker",
      "type": "Hacker",
      "version": "Hacker",
      "version_major": "Hacker",
      "build": "??"
    }
  },
  {
    "user_agent_string": "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)",
    "name": "Googlebot",
    "type": "Robot",
    "version": "2.1",
    "version_major": "2",
    "device": {
      "name": "Google",
      "type": "Robot",
      "brand": "Google",
      "cpu": "Unknown"
    },
    "engine": {
      "name": "Googlebot",
      "type": "Robot",
      "version": "??",
      "version_major": "??"
    },
    "operating_system": {
      "name": "Google Cloud",
      "type": "Cloud",
      "version": "??",
      "version_major": "??",
      "build": "??"
    }
  }
]
```

> Bad Request — Invalid/missing request body, or an empty/null string anywhere in uaStrings (fails the whole batch, not a per-item error)

```json
{
  "error": "Invalid request body Exception",
  "message": "Please provide data in required format in request body",
  "path": "/v1.0/user-agent/lookup",
  "status": 400,
  "timestamp": "2026-07-24T10:16:11.030Z"
}
```

```json
{
  "message": "'userAgentString' must not be empty or null"
}
```

> Payload Too Large — More than 20,000 strings in uaStrings

```json
{
  "error": "Payload too large Exception",
  "message": "Maximum request body size limit exceeded",
  "path": "/v1.0/user-agent/lookup",
  "status": 413,
  "timestamp": "2026-09-15T10:04:24.154Z"
}
```

#### Responses

|Status|Meaning|Description|Schema|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful response with parsed user agent data for each input string|[BulkUserAgentParserResponse](#bulkuseragentparserresponse)|
|400|[Bad Request](https://tools.ietf.org/html/rfc7231#section-6.5.1)|Bad Request — Invalid/missing request body, or an empty/null string anywhere in uaStrings (fails the whole batch, not a per-item error)|[ErrorResponse](#errorresponse)|
|413|[Payload Too Large](https://tools.ietf.org/html/rfc7231#section-6.5.11)|Payload Too Large — More than 20,000 strings in uaStrings|[ErrorResponse](#errorresponse)|

#### Response Headers

|Status|Header|Type|Format|Description|
|---|---|---|---|---|
|200|X-AF-Credits-Cost|integer||Specifies the number of credits consumed by the current request.|
|400|X-AF-Credits-Cost|integer||Specifies the number of credits consumed by the current request.|

To perform this operation, you must be authenticated by means of one of the following methods:
ApiKeyAuthHeader, ApiKeyAuthQuery

## Schemas

### BulkUserAgentRequest

Request body containing an array of User-Agent strings to parse.

#### Properties

|Name|Type|Required|Restrictions|Description|
|---|---|---|---|---|
|uaStrings|[string]|true|none|Array of User-Agent strings to parse. Maximum 20,000 strings per request — exceeding that returns a 413.|

### BulkUserAgentParserResponse

UserAgentParserResponse

#### Properties

|Name|Type|Required|Restrictions|Description|
|---|---|---|---|---|
|UserAgentParserResponse|[[UserAgentParserResponse](#useragentparserresponse)]|false|none|Array of per-string parsed User-Agent results, one entry per input string, in the same order as the request. Unlike the bulk IP lookup endpoint, there is no per-item error variant here: a malformed (non-empty) string still parses to a full result with every field set to "Hacker" (see UserAgentParserResponse). An empty string or null anywhere in the request array fails the entire request with a 400 instead of producing a per-item error entry --- see the 400 response.|

### UserAgentParserResponse

Parsed User-Agent result containing browser, device, engine, and operating system information. When the User-Agent string is malformed or cannot be parsed, every field across this object and its nested device/engine/operating_system objects is set to the literal string "Hacker" instead of the request failing.

#### Properties

|Name|Type|Required|Restrictions|Description|
|---|---|---|---|---|
|user_agent_string|string|true|none|The raw User-Agent string that was parsed for browser, device, and operating system details.|
|name|string|true|none|Name of the browser, crawler, or application identified from the User-Agent string.|
|type|string|true|none|Category of the agent. Possible values: Browser, Browser Webview, Mobile App, Robot Mobile, Cloud Application, Email Client, Voice, Special, Testclient, Hacker, Unknown.|
|version|string|true|none|Full version string of the browser or application. "??" when the version could not be determined; "Hacker" when the User-Agent string itself is malformed/unparsable.|
|version_major|string|true|none|Major version number extracted from the version string. "??" when the version could not be determined; "Hacker" when the User-Agent string itself is malformed/unparsable.|
|device|[Device](#device)|true|none|Hardware device information extracted from the User-Agent string.|
|engine|[Engine](#engine)|true|none|Layout or rendering engine information extracted from the User-Agent string.|
|operating_system|[OperatingSystem](#operatingsystem)|true|none|Operating system information extracted from the User-Agent string.|

### Device

Hardware device information extracted from the User-Agent string.

#### Properties

|Name|Type|Required|Restrictions|Description|
|---|---|---|---|---|
|name|string|true|none|Device name or model identifier of the hardware used.|
|type|string|true|none|Device category. Possible values: Desktop, Mobile, Tablet, Phone, Watch, Virtual Reality, eReader, Set-top box, TV, Game Console, Handheld Game Console, Voice, Robot, Robot Mobile, Robot Imitator, Hacker, Anonymized, Unknown.|
|brand|string|true|none|Device manufacturer or brand name.|
|cpu|string|true|none|CPU architecture or model identifier of the device.|

### Engine

Layout or rendering engine information extracted from the User-Agent string.

#### Properties

|Name|Type|Required|Restrictions|Description|
|---|---|---|---|---|
|name|string|true|none|Name of the layout or rendering engine (e.g., Blink, Gecko, WebKit).|
|type|string|true|none|Engine category. Possible values: Browser, Mobile App, Hacker, Robot, Unknown.|
|version|string|true|none|Full version string of the layout engine. "??" when unknown; "Hacker" when the User-Agent string itself is malformed/unparsable.|
|version_major|string|true|none|Major version number of the layout engine. "??" when unknown; "Hacker" when the User-Agent string itself is malformed/unparsable.|

### OperatingSystem

Operating system information extracted from the User-Agent string.

#### Properties

|Name|Type|Required|Restrictions|Description|
|---|---|---|---|---|
|name|string|true|none|Name of the operating system (e.g., Windows, Android, Ubuntu).|
|type|string|true|none|Operating system category. Possible values: Desktop, Mobile, Game Console, Embedded, Cloud, Hacker, Anonymized, Unknown.|
|version|string|true|none|Full version string of the operating system. "??" when unknown; "Hacker" when the User-Agent string itself is malformed/unparsable.|
|version_major|string|true|none|Major version number of the operating system. "??" when unknown; "Hacker" when the User-Agent string itself is malformed/unparsable.|
|build|string|true|none|Build number or identifier of the operating system. "??" when unknown.|

### ErrorResponse

Standard error envelope returned by the API on failed requests. Request-body-level errors (missing/empty/wrong-type body) include all five fields; per-item validation errors (empty/null string in uaStrings) include only message.

#### Properties

|Name|Type|Required|Restrictions|Description|
|---|---|---|---|---|
|error|string|false|none|Short error category or exception type.|
|message|string|true|none|Human-readable error message describing the failure.|
|path|string|false|none|API endpoint path that produced the error.|
|status|integer|false|none|HTTP status code returned with the error.|
|timestamp|string(date-time)|false|none|Timestamp when the error occurred (ISO 8601).|
