> This page is for Beam.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://mediakind.ferndocs.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://mediakind.ferndocs.com/_mcp/server.

# List Devices

GET https://app.mk.io/api/v1/projects/{project_name}/fleet/devices/{name}/software

List software available to preload on the specified device.

RBAC Capability Required: `fleet.devicesoftware.get`

Reference: https://mediakind.ferndocs.com/beam/api/fleets/devices/list-devices

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Request

### Path parameters

- `project_name` (string, required)
- `name` (string, required)

### Query parameters

- `$orderby` (string, optional) — Specifies the key by which the result collection should be ordered.
- `$filter` (string, optional) — Restricts the set of items returned.
- `$top` (string, optional) — Specifies a non-negative integer `n` that limits the number of items returned from a collection. The service returns the number of available items up to but not greater than the specified value `n`.
- `$skiptoken` (string, optional) — Specifies a start offset to support paginated results. Use `@odata.nextLink` in the result object to enumerate the collection - it will be present only if there's more than one page of entities.
- `$label_key` (string, optional) — Filters the set to the specified label key. If multiple $label_keys are specified, matching items must have all labels.
- `$label` (string, optional) — Filters the set to the specified label key/value pair. Supports equality, inequality, and inexact matching. If multiple values are provided for the same key, items matching either value will be returned.

## Response

### 200

A list of software

- `supplemental` (ListResponseSupplementalSchema, required) — Supplemental info
- `value` (list of DeviceSoftwareGetBody, required) — A list of software versions available for this device.
- `@odata.nextLink` (string, optional) — @odata.nextLink URL if the page length and number of items match.

## Errors

### 400 Bad Request Error

Bad Request

- `error` (ErrorDetail, required) — Pertinent information about the error
- `ref` (string, required) — A reference to the request that caused the error.
- `status` (integer, required) — The HTTP status code

### 401 Unauthorized Error

Unauthorized

- `error` (ErrorDetail, required) — Pertinent information about the error
- `ref` (string, required) — A reference to the request that caused the error.
- `status` (integer, required) — The HTTP status code

### 403 Forbidden Error

Forbidden

- `error` (ErrorDetail, required) — Pertinent information about the error
- `ref` (string, required) — A reference to the request that caused the error.
- `status` (integer, required) — The HTTP status code

### 404 Not Found Error

Not Found

- `error` (ErrorDetail, required) — Pertinent information about the error
- `ref` (string, required) — A reference to the request that caused the error.
- `status` (integer, required) — The HTTP status code

### 429 Too Many Requests Error

Too Many Requests

- `error` (ErrorDetail, required) — Pertinent information about the error
- `ref` (string, required) — A reference to the request that caused the error.
- `status` (integer, required) — The HTTP status code

### 500 Internal Server Error

Internal Server Error

- `error` (ErrorDetail, required) — Pertinent information about the error
- `ref` (string, required) — A reference to the request that caused the error.
- `status` (integer, required) — The HTTP status code

## Types

### ListResponseSupplementalSchema

- `count` (integer, required) — Number of items returned
- `kind` (string, required) — Type of items in the list
- `operation` (string, required) — Operation type. Should always say 'list'
- `pagination` (PaginationInfoSchema, required) — Pagination info
- `subscription` (ProjectInfoSchema, optional) — Project info

### DeviceSoftwareGetBody

- `metadata` (DefaultMetadata, required) — Software metadata.
- `spec` (SoftwareGetSpec, required) — Software specification.
- `status` (DeviceSoftwareStatusSpec, required) — Device-context status for this software release.
- `kind` (string, optional) — Software

### ErrorDetail

- `code` (string, required) — The error code.
- `detail` (string, required) — The error message.
- `extraDetail` (map from string to any, optional) — Extra information regarding this error.

### PaginationInfoSchema

- `end` (integer, required) — Position of the last item in the list
- `records` (integer, required) — Total number of items returned in the list
- `start` (integer, required) — Position of the first item in the list
- `total` (integer, required) — Total number of items in the project

### ProjectInfoSchema

- `id` (string, required) — Project ID
- `name` (string, required) — Project name

### DefaultMetadata

- `displayName` (string, required) — A human-readable name for the resource.
- `labels` (map from string to string, optional) — A dictionary of labels associated with the resource. Maximum number of labels: 32. Maximum length of a label or value: 256 characters. Label: alphanumeric, hyphens and underscores. Value: alphanumeric, hyphens, underscores and spaces.

### SoftwareGetSpec

- `released` (string, required) — The date the software was released.
- `deprecatedOn` (string, optional, default: ) — The date the software was deprecated.
- `displayName` (string, optional, default: ) — An optional display name of the software.
- `minimumVersion` (string, optional, default: ) — Minimum software version required on a standalone device before upgrading to this release.
- `minimumVersionHA` (string, optional, default: ) — Minimum software version required on an HA node before upgrading to this release.
- `version` (string, optional) — A version string.

### DeviceSoftwareStatusSpec

- `downgradeCompatible` (boolean, required) — Whether switching to this release is safe from an underlying component perspective. False if this release has a lower minimum version requirement than the currently installed release (or nearest known release for dev builds). True when no suitable reference release can be found (fail open).
- `upgradeCompatible` (boolean, required) — Whether the device's current software version meets the applicable minimum version requirement for upgrading to this release. Uses the HA minimum for HA nodes and the standalone minimum for standalone devices.

## Examples

**Response**

```json
{
  "supplemental": {
    "count": 1,
    "kind": "string",
    "operation": "string",
    "pagination": {
      "end": 1,
      "records": 1,
      "start": 1,
      "total": 1
    },
    "subscription": {
      "id": "string",
      "name": "string"
    }
  },
  "value": [
    {
      "metadata": {
        "displayName": "string",
        "labels": {}
      },
      "spec": {
        "released": "2025-03-24",
        "deprecatedOn": "2025-03-25",
        "displayName": "beam",
        "minimumVersion": "1.5",
        "minimumVersionHA": "1.7",
        "version": "1.0.0.0"
      },
      "status": {
        "downgradeCompatible": true,
        "upgradeCompatible": true
      },
      "kind": "string"
    }
  ],
  "@odata.nextLink": "string"
}
```

**SDK Code**

```python
import requests

url = "https://app.mk.io/api/v1/projects/project_name/fleet/devices/name/software"

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript
const url = 'https://app.mk.io/api/v1/projects/project_name/fleet/devices/name/software';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://app.mk.io/api/v1/projects/project_name/fleet/devices/name/software"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://app.mk.io/api/v1/projects/project_name/fleet/devices/name/software")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://app.mk.io/api/v1/projects/project_name/fleet/devices/name/software")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://app.mk.io/api/v1/projects/project_name/fleet/devices/name/software', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://app.mk.io/api/v1/projects/project_name/fleet/devices/name/software");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://app.mk.io/api/v1/projects/project_name/fleet/devices/name/software")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```