---
title: Browsers & Devices API | TestingBot API Documentation
description: List every browser, OS and real device available on the TestingBot grid,
  check device availability, and fetch the TestingBot IP ranges.
source_url:
  html: https://testingbot.com/support/api/devices
  md: https://testingbot.com/support/api/devices.md
---

# Browsers & Devices

Discover which browsers, operating systems and real devices you can run on, and look up the IP ranges to allowlist.

- **Endpoint:** api.testingbot.com
- **Version:** v1
- **Format:** JSON
- **Auth:** [HTTP Basic](https://testingbot.com/support/api#authentication)

GET `/v1/browsers`

## List supported browsers
 Returns every browser environment available on the TestingBot grid: name, version, platform, and the `browser_id` used when attaching browsers to Codeless tests. No authentication required. 
### Arguments

- **`type` string:** Filter by automation protocol: "webdriver" (default) or "rc" (legacy Selenium RC).

### Response fields

- **`selenium_name` string:** Capability value to send as `browserName` in WebDriver.
- **`name` string:** Human-readable browser identifier (e.g. "firefox", "iexplore").
- **`version` integer:** Major version number.
- **`long_version` string:** Full version string (e.g. "121.0.6167.184").
- **`platform` string:** Operating system (e.g. "WINDOWS", "MAC", "LINUX").
- **`browser_id` integer:** Unique TestingBot browser ID used to attach browsers to Codeless tests.

GET `/v1/browsers`
[cURL](https://testingbot.com#) [.NET](https://testingbot.com#) [Ruby](https://testingbot.com#) [Python](https://testingbot.com#) [PHP](https://testingbot.com#) [Java](https://testingbot.com#) [NodeJS](https://testingbot.com#)
Request

```bash
curl "https://api.testingbot.com/v1/browsers"
```

```csharp
var client = new TestingBotClient(key, secret);
var browsers = await client.Browsers.ListAsync();
```

```ruby
require 'testingbot'
api = TestingBot::Api.new(key, secret)
api.get_browsers
```

```python
import testingbotclient
tb = testingbotclient.TestingBotClient(key, secret)
tb.information.get_browsers()
```

```php
$api = new TestingBot\TestingBotAPI($key, $secret);
$api->getBrowsers();
```

```java
TestingbotREST restApi = new TestingbotREST(key, secret);
ArrayList<TestingbotBrowser> browsers = restApi.getBrowsers();
```

```javascript
const TestingBot = require('testingbot-api');

const api = new TestingBot({
  api_key: "your-tb-key",
  api_secret: "your-tb-secret"
});

const browsers = await api.getBrowsers();
```

Response

```json
[
  {"selenium_name": "IE8", "name": "iexplore", "version": 8, "platform": "WINDOWS", "browser_id": 1, "long_version": 8},
  {"selenium_name": "FF7", "name": "firefox", "version": 7, "platform": "WINDOWS", "browser_id": 22, "long_version": 7}
]
```

GET `/v1/devices`

## List physical mobile devices
 Returns every real Android and iOS device in the TestingBot grid, with an `available` flag indicating whether it can be acquired right now. Filter by `platform` for a single OS family. 
### Arguments

- **`platform` string:** Filter to a single mobile OS family. Case-insensitive.
- **`web` boolean:** Internal flag used by the dashboard — returns extra UI-only fields.

### Response fields

- **`id` integer:** Unique numeric device ID.
- **`name` string:** Marketing name (e.g. "iPhone 15 Pro").
- **`model_number` string:** Manufacturer model number (e.g. "SM-G991B").
- **`platform_name` string:** Mobile OS family (e.g. "iOS", "Android").
- **`version` string:** OS version (e.g. "17.4", "14").
- **`resolution` string:** Display resolution as `<width>x<height>` (e.g. "1170x2532").
- **`width` integer:** Display width in pixels, parsed from `resolution`.
- **`height` integer:** Display height in pixels, parsed from `resolution`.
- **`cpu` string:** CPU architecture.
- **`available` boolean:** Whether the device is free for this account to acquire right now.
- **`multiple_browsers` array of object:** Selectable browsers on this device. Only present on devices that offer more than one.

GET `/v1/devices`
[cURL](https://testingbot.com#) [.NET](https://testingbot.com#) [Ruby](https://testingbot.com#) [Python](https://testingbot.com#) [PHP](https://testingbot.com#) [Java](https://testingbot.com#) [NodeJS](https://testingbot.com#)
Request

```bash
$ curl -u key:secret "https://api.testingbot.com/v1/devices"
```

```csharp
var client = new TestingBotClient(key, secret);
var devices = await client.Devices.ListAsync();
```

```ruby
require 'testingbot'
api = TestingBot::Api.new(key, secret)
api.get_devices
```

```python
import testingbotclient
tb = testingbotclient.TestingBotClient(key, secret)
tb.information.get_devices()
```

```php
$api = new TestingBot\TestingBotAPI($key, $secret);
$api->getDevices();
```

```java
TestingbotREST restApi = new TestingbotREST(key, secret);
List<TestingbotDevice> devices = restApi.getDevices(0, 100);
```

```javascript
const TestingBot = require('testingbot-api');

const api = new TestingBot({
  api_key: "your-tb-key",
  api_secret: "your-tb-secret"
});

const devices = await api.getDevices();
```

Response

```json
[
  {
    "id": 1,
    "available": true,
    "name": "Galaxy S8",
    "model_number": "SM-G950U1",
    "platform_name": "Android",
    "version": "9.0",
    "resolution": "1080x2220",
    "multiple_browsers": [
      { "id": 1727, "name": "chrome", "version": "103" },
      { "id": 2133, "name": "firefox", "version": "98.2" },
      { "id": 2953, "name": "samsung", "version": "13.2.1.70" },
      { "id": 2954, "name": "opera", "version": "67.1" }
    ]
  },
  {
    "id": 5,
    "available": false,
    "name": "iPhone XR",
    "platform_name": "iOS",
    "version": "16.3",
    "resolution": "828x1792"
  }
]
```

GET `/v1/devices/available`

## List currently available devices
 Subset of /v1/devices filtered to devices the authenticated account can acquire right now (not in use by another customer, not under maintenance). 
### Response fields

- **`id` integer:** Unique numeric device ID.
- **`name` string:** Marketing name (e.g. "iPhone 15 Pro").
- **`model_number` string:** Manufacturer model number (e.g. "SM-G991B").
- **`platform_name` string:** Mobile OS family (e.g. "iOS", "Android").
- **`version` string:** OS version (e.g. "17.4", "14").
- **`resolution` string:** Display resolution as `<width>x<height>` (e.g. "1170x2532").
- **`width` integer:** Display width in pixels, parsed from `resolution`.
- **`height` integer:** Display height in pixels, parsed from `resolution`.
- **`cpu` string:** CPU architecture.
- **`available` boolean:** Whether the device is free for this account to acquire right now.
- **`multiple_browsers` array of object:** Selectable browsers on this device. Only present on devices that offer more than one.

GET `/v1/devices/available`
[cURL](https://testingbot.com#) [.NET](https://testingbot.com#) [Ruby](https://testingbot.com#) [Python](https://testingbot.com#) [PHP](https://testingbot.com#) [Java](https://testingbot.com#) [NodeJS](https://testingbot.com#)
Request

```bash
$ curl -u key:secret "https://api.testingbot.com/v1/devices/available"
```

```csharp
var client = new TestingBotClient(key, secret);
var devices = await client.Devices.ListAvailableAsync();
```

```ruby
require 'testingbot'
api = TestingBot::Api.new(key, secret)
api.get_available_devices
```

```python
import testingbotclient
tb = testingbotclient.TestingBotClient(key, secret)
tb.information.get_available_devices()
```

```php
$api = new TestingBot\TestingBotAPI($key, $secret);
$api->getAvailableDevices();
```

```java
TestingbotREST restApi = new TestingbotREST(key, secret);
List<TestingbotDevice> devices = restApi.getAvailableDevices();
```

```javascript
const TestingBot = require('testingbot-api');

const api = new TestingBot({
  api_key: "your-tb-key",
  api_secret: "your-tb-secret"
});

const devices = await api.getAvailableDevices();
```

Response

```json
[
  {
    "id": 1,
    "available": true,
    "name": "Galaxy S8",
    "platform_name": "Android",
    "version": "9.0",
    "resolution": "1080x2220"
  }
]
```

GET `/v1/devices/:id`

## Get a specific device
 Returns the spec and current availability for a single device by numeric ID. 
### Arguments

- **`id` integer required:** Numeric device ID.

### Response fields

- **`id` integer:** Unique numeric device ID.
- **`name` string:** Marketing name (e.g. "iPhone 15 Pro").
- **`model_number` string:** Manufacturer model number (e.g. "SM-G991B").
- **`platform_name` string:** Mobile OS family (e.g. "iOS", "Android").
- **`version` string:** OS version (e.g. "17.4", "14").
- **`resolution` string:** Display resolution as `<width>x<height>` (e.g. "1170x2532").
- **`width` integer:** Display width in pixels, parsed from `resolution`.
- **`height` integer:** Display height in pixels, parsed from `resolution`.
- **`cpu` string:** CPU architecture.
- **`available` boolean:** Whether the device is free for this account to acquire right now.
- **`multiple_browsers` array of object:** Selectable browsers on this device. Only present on devices that offer more than one.

GET `/v1/devices/:id`
[cURL](https://testingbot.com#) [.NET](https://testingbot.com#) [Ruby](https://testingbot.com#) [Python](https://testingbot.com#) [PHP](https://testingbot.com#) [Java](https://testingbot.com#) [NodeJS](https://testingbot.com#)
Request

```bash
$ curl "https://api.testingbot.com/v1/devices/:id" \
-u key:secret
```

```csharp
var client = new TestingBotClient(key, secret);
var device = await client.Devices.GetAsync(deviceId);
```

```ruby
require 'testingbot'
api = TestingBot::Api.new(key, secret)
api.get_device(device_id)
```

```python
import testingbotclient
tb = testingbotclient.TestingBotClient(key, secret)
tb.information.get_device(device_id)
```

```php
$api = new TestingBot\TestingBotAPI($key, $secret);
$api->getDevice($deviceId);
```

```java
TestingbotREST restApi = new TestingbotREST(key, secret);
TestingbotDevice device = restApi.getDevice(deviceId);
```

```javascript
const TestingBot = require('testingbot-api');

const api = new TestingBot({
  api_key: "your-tb-key",
  api_secret: "your-tb-secret"
});

const device = await api.getDevice(deviceId);
```

Response

```json
{
  "id": 12,
  "available": true,
  "name": "Galaxy S20",
  "platform_name": "Android",
  "version": "10.0",
  "resolution": "1440x3200",
  "multiple_browsers": [
    { "id": 2598, "name": "chrome", "version": "101" },
    { "id": 2919, "name": "firefox", "version": "98.2" },
    { "id": 2957, "name": "samsung", "version": "13.2.1.70" }
  ]
}
```

GET `/v1/configuration/ip-ranges`

## TestingBot IP ranges for firewall whitelisting
 Returns the up-to-date list of public IPv4 addresses used by TestingBot test machines. Allow these in your firewall when running tests against staging or production behind corporate VPN/network rules. The response is a flat JSON array of IPv4 strings (no CIDR ranges, no metadata) — re-fetch periodically since the pool changes as we scale capacity. Unauthenticated; no `key`/`secret` required. 

GET `/v1/configuration/ip-ranges`
[cURL](https://testingbot.com#) [.NET](https://testingbot.com#) [Ruby](https://testingbot.com#) [Python](https://testingbot.com#) [PHP](https://testingbot.com#) [Java](https://testingbot.com#) [NodeJS](https://testingbot.com#)
Request

```bash
$ curl "https://api.testingbot.com/v1/configuration/ip-ranges"
```

```csharp
var client = new TestingBotClient(key, secret);
var ranges = await client.Configuration.GetIpRangesAsync();
```

```ruby
require 'testingbot'
api = TestingBot::Api.new(key, secret)
api.get_ip_ranges
```

```python
import testingbotclient
tb = testingbotclient.TestingBotClient(key, secret)
tb.configuration.get_ip_ranges()
```

```php
$client = new TestingBot\Client($key, $secret);
$ranges = $client->configuration()->ipRanges(); // no authentication required
```

```java
TestingbotREST restApi = new TestingbotREST(key, secret);
JsonElement ipRanges = restApi.getIpRanges();
```

```javascript
const TestingBot = require('testingbot-api');

const api = new TestingBot({
  api_key: "your-tb-key",
  api_secret: "your-tb-secret"
});

const ipRanges = await api.getIpRanges();
```

Response

```json
[
  "109.68.162.161",
  "109.68.162.165",
  "78.20.187.211",
  "162.55.135.22",
  "95.217.83.184",
  "95.216.39.110",
  "95.216.229.109",
  "142.132.137.7",
  "195.201.167.43",
  "162.55.24.100",
  "185.223.133.13"
]
```

[Next User & Team Management](https://testingbot.com/support/api/user)
