import { PhosraClient } from "@phosra/sdk";
const phosra = new PhosraClient({
baseUrl: "https://phosra-api-sandbox-production.up.railway.app/api/v1",
accessToken: process.env.PHOSRA_API_KEY,
});
const result = await phosra.devices.list("a11ce0fa-0000-4000-8000-0000000000a1");
console.log(result);
curl -sS "https://phosra-api-sandbox-production.up.railway.app/api/v1/children/a11ce0fa-0000-4000-8000-0000000000a1/devices" \
-H "Authorization: Bearer $PHOSRA_API_KEY"
import os, requests
BASE = "https://phosra-api-sandbox-production.up.railway.app/api/v1"
res = requests.get(
f"{BASE}/children/a11ce0fa-0000-4000-8000-0000000000a1/devices",
headers={"Authorization": f"Bearer {os.environ['PHOSRA_API_KEY']}"},
)
print(res.status_code, res.json())
package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
base := "https://phosra-api-sandbox-production.up.railway.app/api/v1"
req, _ := http.NewRequest("GET", base+"/children/a11ce0fa-0000-4000-8000-0000000000a1/devices", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("PHOSRA_API_KEY"))
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
out, _ := io.ReadAll(resp.Body)
fmt.Println(resp.Status, string(out))
}
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://phosra-api-sandbox-production.up.railway.app/api/v1/children/{childID}/devices",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}HttpResponse<String> response = Unirest.get("https://phosra-api-sandbox-production.up.railway.app/api/v1/children/{childID}/devices")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://phosra-api-sandbox-production.up.railway.app/api/v1/children/{childID}/devices")
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[
{
"id": "5e0a9c37-1b64-4d82-96f3-2c8a7e0b4d19",
"child_id": "ca02f5d1-fee8-4201-b5ca-fdc8be506e1e",
"family_id": "fcdf4277-ba14-4732-8db5-0369b2c88d8b",
"platform_id": "nextdns",
"device_name": "Ada's iPhone",
"device_model": "iPhone15,3",
"os_version": "18.5",
"app_version": "2.4.0",
"apns_token": "8f7d3c1b2a90e64f5d8c7b6a1f0e9d3c2b1a0f9e8d7c6b5a4f3e2d1c0b9a8f7e6",
"capabilities": [
"FamilyControls",
"ManagedSettings",
"DeviceActivity"
],
"enforcement_summary": {},
"last_seen_at": "2026-07-05T22:04:18Z",
"last_policy_version": 0,
"status": "active",
"created_at": "2026-06-18T14:32:07Z",
"updated_at": "2026-06-30T09:15:44Z"
}
]{
"error": "Bad Request",
"message": "child_name is required",
"code": 400
}{
"error": "Unauthorized",
"message": "missing or invalid Authorization header",
"code": 401
}{
"error": "Forbidden",
"message": "not a member of this family",
"code": 403
}{
"error": "Not Found",
"message": "policy not found",
"code": 404
}{
"error": "Too Many Requests",
"message": "rate limit exceeded",
"code": 429
}{
"error": "Internal Server Error",
"message": "internal error",
"code": 500
}List a child's devices
List registered devices for a child
import { PhosraClient } from "@phosra/sdk";
const phosra = new PhosraClient({
baseUrl: "https://phosra-api-sandbox-production.up.railway.app/api/v1",
accessToken: process.env.PHOSRA_API_KEY,
});
const result = await phosra.devices.list("a11ce0fa-0000-4000-8000-0000000000a1");
console.log(result);
curl -sS "https://phosra-api-sandbox-production.up.railway.app/api/v1/children/a11ce0fa-0000-4000-8000-0000000000a1/devices" \
-H "Authorization: Bearer $PHOSRA_API_KEY"
import os, requests
BASE = "https://phosra-api-sandbox-production.up.railway.app/api/v1"
res = requests.get(
f"{BASE}/children/a11ce0fa-0000-4000-8000-0000000000a1/devices",
headers={"Authorization": f"Bearer {os.environ['PHOSRA_API_KEY']}"},
)
print(res.status_code, res.json())
package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
base := "https://phosra-api-sandbox-production.up.railway.app/api/v1"
req, _ := http.NewRequest("GET", base+"/children/a11ce0fa-0000-4000-8000-0000000000a1/devices", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("PHOSRA_API_KEY"))
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
out, _ := io.ReadAll(resp.Body)
fmt.Println(resp.Status, string(out))
}
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://phosra-api-sandbox-production.up.railway.app/api/v1/children/{childID}/devices",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}HttpResponse<String> response = Unirest.get("https://phosra-api-sandbox-production.up.railway.app/api/v1/children/{childID}/devices")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://phosra-api-sandbox-production.up.railway.app/api/v1/children/{childID}/devices")
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[
{
"id": "5e0a9c37-1b64-4d82-96f3-2c8a7e0b4d19",
"child_id": "ca02f5d1-fee8-4201-b5ca-fdc8be506e1e",
"family_id": "fcdf4277-ba14-4732-8db5-0369b2c88d8b",
"platform_id": "nextdns",
"device_name": "Ada's iPhone",
"device_model": "iPhone15,3",
"os_version": "18.5",
"app_version": "2.4.0",
"apns_token": "8f7d3c1b2a90e64f5d8c7b6a1f0e9d3c2b1a0f9e8d7c6b5a4f3e2d1c0b9a8f7e6",
"capabilities": [
"FamilyControls",
"ManagedSettings",
"DeviceActivity"
],
"enforcement_summary": {},
"last_seen_at": "2026-07-05T22:04:18Z",
"last_policy_version": 0,
"status": "active",
"created_at": "2026-06-18T14:32:07Z",
"updated_at": "2026-06-30T09:15:44Z"
}
]{
"error": "Bad Request",
"message": "child_name is required",
"code": 400
}{
"error": "Unauthorized",
"message": "missing or invalid Authorization header",
"code": 401
}{
"error": "Forbidden",
"message": "not a member of this family",
"code": 403
}{
"error": "Not Found",
"message": "policy not found",
"code": 404
}{
"error": "Too Many Requests",
"message": "rate limit exceeded",
"code": 429
}{
"error": "Internal Server Error",
"message": "internal error",
"code": 500
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Response
Device list
Unique identifier for this resource.
Identifier of the child this resource belongs to.
Identifier of the family this resource belongs to.
Identifier of the associated platform.
User-assigned device name (e.g. "Ada's iPhone").
Hardware model identifier (e.g. iPhone15,3).
Operating-system version reported by the device (e.g. 18.5).
Version of the Phosra app installed on the device.
Apple Push Notification service device token; null until the device registers for push.
Apple frameworks the device supports (e.g. FamilyControls, ManagedSettings, DeviceActivity)
Per-category enforcement results from the device's last enforcement_status report
RFC 3339 timestamp.
Policy version the device last successfully applied.
Current lifecycle state of the resource.
active, inactive, revoked RFC 3339 timestamp of when the resource was created.
RFC 3339 timestamp of the resource's most recent update.