Skip to main content
GET
/
devices
Python
import os, requests

r = requests.get(
    "https://api.1st.app/v1/devices",
    params={"metadata.player_id": "42"},
    headers={"Authorization": f"Bearer {os.environ['ST_API_KEY']}"},
)
r.raise_for_status()
for d in r.json()["data"]:
    print(d["display_name"], d["device_id"])
{
  "data": [
    {
      "device_id": "8a72a1c7-3c91-4f5b-b39e-1d2c4e3f5a7b",
      "hardware_id": "dev:868050050000123",
      "display_name": "Locker Room North",
      "firmware_version": "1.4.2",
      "metadata": {
        "room": "locker_north",
        "hudl_player_id": "12345"
      },
      "status": "online",
      "last_seen_at": "2026-05-14T20:35:12Z",
      "signal": {
        "rssi_dbm": -78,
        "bars": 3
      }
    },
    {
      "device_id": "b3f9d2e8-7a4c-4e6f-8d1b-0c5a9e7b3d2f",
      "hardware_id": "dev:868050050000456",
      "display_name": "Recovery Pool Deck",
      "firmware_version": "1.4.2",
      "metadata": {
        "room": "recovery_pool"
      },
      "status": "stale",
      "last_seen_at": "2026-05-14T16:10:01Z",
      "signal": {
        "rssi_dbm": -91,
        "bars": 1
      }
    }
  ],
  "next_cursor": null
}

Documentation Index

Fetch the complete documentation index at: https://dev.1st.app/llms.txt

Use this file to discover all available pages before exploring further.

Authorizations

Authorization
string
header
required

Your API key. Create one at dashboard.1st.app/integrations/api-keys.

Query Parameters

cursor
string

Only needed if you have more than 1000 devices on your team (most clubs don't).

On your first call, leave this empty. If the response has a next_cursor value at the end, more devices are waiting. Send that value back here on your next call to get the next batch. Repeat until next_cursor is null.

Example:

"eyJ0ZWFtX2lkIjoiOWIzYTNi..."

metadata.{key}
string

Find devices tagged with a specific metadata value.

For example, if you tagged a device with the player ID 42 (using PATCH /v1/devices/{id}), find it with ?metadata.player_id=42.

Pass the parameter multiple times to require matches on several tags at once, e.g. ?metadata.player_id=42&metadata.position=GK returns only devices tagged with both player_id=42 AND position=GK.

Example:

"42"

Response

An array of devices and a next_cursor for the next page.

data
object[]
required
next_cursor
string | null

A bookmark for the next batch of results. Send it back as ?cursor=... on your next call to get the next batch. When you see null here, you've got all the results.