User Agent parsing, as one API call.
Hand the User Agent API any user-agent string (or none at all) and get back one structured JSON record: the client, rendering engine, operating system, and device, plus whether the agent is a bot, an AI crawler, or an AI assistant.
Hardware resolves against 50,000+ device models, so a raw model code comes back as the phone people actually call it. Read-only, one bearer token, no SDK.
Try a real request
// Fires a real request against the demo API key.
// Matched against 50,000+ device models, so hardware comes back by name.
// Click the button below to run it. The response opens in the Explorer panel.
const response = await fetch(
'https://api.restcountries.com/user-agent/v1',
{ headers: { 'Authorization': 'Bearer rc_live_demo' } }
);
const result = await response.json();
Inside one record
Every block on every parse
One record under data.objects, always the same shape. A value the string doesn't reveal comes back null. There are no optional keys.
{
"ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36",
"label": "Chrome on macOS",
"client": {
"label": "Google Chrome (v150)",
"name": "Chrome",
"type": "browser",
"version": { "full": "150.0.0.0", "major": 150 },
"logo": { "url_svg": "https://brands.restcountries.com/v1/svg/chrome/logo.svg" },
"wordmark": { "url_svg": "https://brands.restcountries.com/v1/svg/chrome/wordmark.svg" },
"maker": {
"name": "Google",
"logo": { "url_svg": "https://brands.restcountries.com/v1/svg/google/logo.svg" },
"wordmark": { "url_svg": "https://brands.restcountries.com/v1/svg/google/wordmark.svg" },
"links": { "wikipedia": "https://en.wikipedia.org/wiki/Google", "official": "https://www.google.com/" }
},
"engine": {
"label": "Google Blink (v150)",
"name": "Blink",
"version": { "full": "150.0.0.0", "major": 150 },
"logo": { "url_svg": "https://brands.restcountries.com/v1/svg/blink/logo.svg" },
"wordmark": null,
"maker": {
"name": "Google",
"logo": { "url_svg": "https://brands.restcountries.com/v1/svg/google/logo.svg" },
"wordmark": { "url_svg": "https://brands.restcountries.com/v1/svg/google/wordmark.svg" },
"links": { "wikipedia": "https://en.wikipedia.org/wiki/Google", "official": "https://www.google.com/" }
}
},
"attributes": { "is_android": false, "is_chrome": true, "is_chromium": false, "is_chromium_based": true, "is_edge": false, "is_safari": false, "is_firefox": false, "is_headless": false, "is_internet_explorer": false, "is_opera": false, "is_web_view": false }
},
"operator": null,
"os": {
"label": "Apple macOS (v10)",
"name": "macOS",
"version": { "full": "10.15.7", "major": 10 },
"logo": { "url_svg": "https://brands.restcountries.com/v1/svg/macos/logo.svg" },
"wordmark": { "url_svg": "https://brands.restcountries.com/v1/svg/macos/wordmark.svg" },
"maker": {
"name": "Apple",
"logo": { "url_svg": "https://brands.restcountries.com/v1/svg/apple/logo.svg" },
"wordmark": { "url_svg": "https://brands.restcountries.com/v1/svg/apple/wordmark.svg" },
"links": { "wikipedia": "https://en.wikipedia.org/wiki/Apple_Inc.", "official": "https://www.apple.com/" }
}
},
"device": {
"label": "Apple Macintosh",
"name": "Macintosh",
"type": "desktop",
"maker": {
"name": "Apple",
"logo": { "url_svg": "https://brands.restcountries.com/v1/svg/apple/logo.svg" },
"wordmark": { "url_svg": "https://brands.restcountries.com/v1/svg/apple/wordmark.svg" },
"links": { "wikipedia": "https://en.wikipedia.org/wiki/Apple_Inc.", "official": "https://www.apple.com/" }
},
"attributes": { "is_camera": false, "is_desktop": true, "is_media_player": false, "is_mobile": false, "is_phone": false, "is_set_top_box": false, "is_smart_tv": false, "is_tablet": false, "is_watch": false, "is_wearable": false }
},
"flags": { "is_ai_assistant": false, "is_ai_crawler": false, "is_bot": false, "is_crawler": false }
}
Common questions
Before you wire it in
What do I pass in?
A user-agent string via ?ua=, or nothing at all, in which case the API parses the User-Agent header the request itself came in with. Either way you get back one record.
Does it detect bots and AI agents?
Yes. Every parse carries is_bot, plus dedicated flags for AI crawlers (GPTBot, ClaudeBot) and live AI-assistant fetches (ChatGPT-User), so you can tell an indexer from a user-triggered request.
Is there an SDK to install?
No. It's a single read-only GET endpoint returning JSON, authenticated with one bearer token. See the full reference →
Start parsing agents today.
Free tier covers most prototypes. Point at /user-agent/v1 and go.