Skip to content

User-Agent Parser

Try for free

Parse User-Agent strings in bulk into browser, version, OS, device type, brand and model, rendering engine and CPU, plus a bot verdict with the bot's name and category (search engines, AI crawlers, monitors, HTTP clients, headless browsers). Paste strings, raw access-log lines or a dataset. No login or API key needed.

🧭 User-Agent Parser

Turn raw User-Agent strings into clean columns: browser and version, operating system, device type, brand and model, rendering engine, CPU, and a bot verdict that names the bot and its category (search engines, AI crawlers, monitors, social previews, HTTP clients, headless browsers). Paste a list, raw access-log lines or a whole dataset; 1,000 distinct strings take about half a minute, with no login or API key. $0.34 per 1,000 User-Agents on the Free plan, platform usage included.

✨ Why use User-Agent Parser?

  • 🤖 Bots with a name — not just isBot: you get botName, botCategory, the company behind it and its documentation link, and isAiBot for GPTBot, ClaudeBot, PerplexityBot, ChatGPT-User and other AI crawlers and assistants.
  • 📱 Real device detail — desktop, smartphone, tablet, tv, console, wearable, car browser and more, with brand and marketing model names (SM-S918B becomes Samsung Galaxy S23 Ultra).
  • 📜 Paste your logs as they are — Apache/Nginx combined logs, IIS/W3C lines and JSON lines: the User-Agent of every line is picked out for you.
  • 🔁 Pay once per distinct string — repeated User-Agents are merged into one row with a count, so a 100,000-line log with 2,000 distinct agents costs 2,000 rows.
  • 📊 Flat columns — one row per string, ready for CSV, Excel, a dataframe or a database join on userAgent.
  • 🔒 Nothing leaves the run — parsing happens inside the run with built-in rule sets; your strings are not sent to any outside service.

🎯 Use cases

  • 🕷️ Spot AI crawlers in your logs — filter to bots and see which AI companies fetch your pages, before you write robots.txt rules.
  • 📈 Analytics enrichment — add browser, OS and device columns to server-side events, sign-ups or orders.
  • 🧹 Traffic-quality checks — separate HTTP clients (curl, python-requests, Go-http-client), headless browsers and monitors from real visitors before you report or bill traffic.
  • 🛠️ Support and QA — decode the User-Agent a customer sent you into "Chrome 131 on Windows 10, desktop".
  • 🔗 Pipelines — parse the results of another run (a log export, a form tool, a webhook dataset) by picking its dataset.

🚀 How to use

  1. Paste User-Agent strings into User-Agent strings, or paste log lines into Log text, or pick a dataset under Parse a dataset.
  2. Optional: keep only bots or only browsers with Bots, and set Max results.
  3. Click Start. A short list is done in a few seconds; 1,000 distinct strings take about half a minute.
  4. Download the rows as JSON, CSV or Excel, or read them through the API.

📥 Input

FieldWhat it does
userAgentsUser-Agent strings, one per entry. userAgent (a single string) is accepted too.
logTextAccess-log lines or one User-Agent per line; the User-Agent of each line is picked out.
datasetIdA dataset of one of your runs whose records hold User-Agents.
userAgentFieldDataset field with the string (dot path for nested fields). Empty: userAgent, user_agent, user-agent, ua and similar are found automatically.
deduplicateOn (default): one row per distinct string with its count. Off: one row per entry.
botFilterall (default), bots (bots, crawlers, HTTP clients, headless browsers) or humans (browsers and apps).
maxItemsSave at most this many rows. Empty: all.
{
  "userAgents": [
    "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
    "Mozilla/5.0 (compatible; GPTBot/1.2; +https://openai.com/gptbot)"
  ],
  "logText": "66.249.66.1 - - [13/Nov/2026:10:00:00 +0000] \"GET / HTTP/1.1\" 200 512 \"-\" \"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)\"",
  "botFilter": "all"
}

📤 Output

FieldDescription
userAgentThe string that was parsed
countHow often it appeared in your input (1 when merging is off)
isBotTrue for crawlers, bots, HTTP client libraries and headless browsers
botName, botCategory, botProducer, botUrlWho the bot is, what kind (Search bot, AI Data Scraper, AI Assistant, AI Search Crawler, Crawler, Site Monitor, Social Media Agent, Feed Fetcher, Security Checker, HTTP client, Headless browser ...), who runs it, and its documentation page
isAiBotTrue for AI crawlers, AI assistants and AI search crawlers
browserName, browserVersion, browserMajor, browserTypeBrowser or app and its version; type is browser, mobile app, library, feed reader, media player or pim
engineName, engineVersionBlink, WebKit, Gecko, Trident, Presto ...
osName, osVersion, osFamilyWindows, iOS, iPadOS, Android, Mac, GNU/Linux, Chrome OS ...
deviceType, deviceVendor, deviceModeldesktop, smartphone, tablet, tv, console ...; brand and model
isMobileTrue for phones and tablets
cpuArchitectureamd64, ia32, arm64, arm ... when the string names it
recognizedFalse when nothing in the string matched a known browser, OS, device or bot

A run summary (rows saved, bots, entries skipped and why, duplicates merged) is saved as SUMMARY in the run's key-value store.

Example rows from a test run:

[
  {
    "userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1",
    "count": 1,
    "isBot": false,
    "botName": null,
    "botCategory": null,
    "botProducer": null,
    "botUrl": null,
    "isAiBot": false,
    "browserName": "Mobile Safari",
    "browserVersion": "17.5",
    "browserMajor": "17",
    "browserType": "browser",
    "engineName": "WebKit",
    "engineVersion": "605.1.15",
    "osName": "iOS",
    "osVersion": "17.5",
    "osFamily": "iOS",
    "deviceType": "smartphone",
    "deviceVendor": "Apple",
    "deviceModel": "iPhone",
    "isMobile": true,
    "cpuArchitecture": null,
    "recognized": true
  },
  {
    "userAgent": "Mozilla/5.0 (compatible; GPTBot/1.2; +https://openai.com/gptbot)",
    "count": 1,
    "isBot": true,
    "botName": "GPTBot",
    "botCategory": "AI Data Scraper",
    "botProducer": "OpenAI OpCo, LLC",
    "botUrl": "https://platform.openai.com/docs/bots",
    "isAiBot": true,
    "browserName": null,
    "osName": null,
    "deviceType": null,
    "isMobile": false,
    "recognized": true
  }
]

💰 Pricing

One event, User-Agent parsed, per saved row:

PlanPer User-AgentPer 1,000
Free$0.00034$0.34
Starter$0.00031$0.31
Scale$0.00029$0.29
Business$0.00027$0.27

Platform usage is included: no start fee and no compute charge on top. Examples on the Free plan: the 3-string example ≈ $0.001; 1,000 distinct User-Agents ≈ $0.34; a 50,000-line access log with 3,000 distinct agents ≈ $1.02 with merging on. Entries that are not User-Agents (empty, -, under 3 characters, control characters), log lines without one and rows left out by the bot filter are free. Your maximum cost per run is respected: the run stops at the row that would go over it and says so.

❓ FAQ

Is it legal? Yes. The actor only parses strings you provide; it does not visit any website.

Do I need a login, API key or proxy? No. Nothing is fetched from the web, so no proxy is used or billed.

How many strings can I parse? As many as you like: there is no limit on the list, the log text or the dataset. Large inputs are saved in batches as they are parsed.

Why is a field empty? User-Agents only carry what the client puts in them. Desktop strings name no device model; iPhones do not name the CPU; Chrome freezes parts of its version and platform (the finer details live in separate Client Hints headers, which are not part of the string); crawlers have no browser or device. Empty means the string does not say, not that parsing failed. recognized: false marks strings nothing matched at all; they are still parsed and charged.

Can it tell me if a visitor is really a bot? It recognizes bots that announce themselves (search engines, AI crawlers, SEO tools, monitors, social previews, feed readers, HTTP libraries, headless browsers): that is most crawler traffic. A client that sends a perfect copy of a normal browser's User-Agent looks exactly like that browser; combine with IP and behaviour data for those.

Can I schedule it or use the API? Yes: run it from the Scrape.ly API, a schedule, a webhook or an integration, or let an AI agent call it through the Scrape.ly MCP server. Pass datasetId to parse another run's results.

⚠️ Limits

  • Parsing follows the rule sets built into the current version; a brand-new browser, device or bot can show as unknown until the next update.
  • Bot detection is signature-based: it is exact on the bots it knows and cannot unmask a client that copies a normal browser string.
  • Strings longer than 8,192 characters are skipped (longer than the usual request-header limit, so not a real User-Agent).
  • count with merging on is over the whole input of the run.
//From the blog\\

Latest articles

All articles

The internet is full of data.
Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes.

No credit card. No setup calls.