curl --request POST \
--url https://api.cloud.corbado.io/v1/observe/clientEnvSearch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"userIDs": [
"<string>"
],
"limit": 100
}
'import requests
url = "https://api.cloud.corbado.io/v1/observe/clientEnvSearch"
payload = {
"userIDs": ["<string>"],
"limit": 100
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({userIDs: ['<string>'], limit: 100})
};
fetch('https://api.cloud.corbado.io/v1/observe/clientEnvSearch', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.cloud.corbado.io/v1/observe/clientEnvSearch",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'userIDs' => [
'<string>'
],
'limit' => 100
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.cloud.corbado.io/v1/observe/clientEnvSearch"
payload := strings.NewReader("{\n \"userIDs\": [\n \"<string>\"\n ],\n \"limit\": 100\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.cloud.corbado.io/v1/observe/clientEnvSearch")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"userIDs\": [\n \"<string>\"\n ],\n \"limit\": 100\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cloud.corbado.io/v1/observe/clientEnvSearch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"userIDs\": [\n \"<string>\"\n ],\n \"limit\": 100\n}"
response = http.request(request)
puts response.read_body[
{
"id": "<string>",
"handle": "<string>",
"osName": "Windows",
"clientEnvType": "web",
"createdMs": 123,
"dataWeb": [
{
"id": "<string>",
"createdMs": 123,
"osVersion": "<string>",
"browserName": "<string>",
"browserVersion": "<string>",
"privateMode": true,
"webdriver": true,
"bluetoothAvailable": true,
"conditionalMediationAvailable": true,
"userVerifyingPlatformAuthenticatorAvailable": true,
"conditionalGet": true,
"conditionalCreate": true,
"hybridTransport": true,
"passkeyPlatformAuthenticator": true,
"relatedOrigins": true,
"signalAllAcceptedCredentials": true,
"signalCurrentUserDetails": true,
"signalUnknownCredential": true,
"userVerifyingPlatformAuthenticator": true,
"extensionAppid": true,
"extensionAppidExclude": true,
"extensionCredBlob": true,
"extensionCredProps": true,
"extensionCredentialProtectionPolicy": true,
"extensionEnforceCredentialProtectionPolicy": true,
"extensionGetCredBlob": true,
"extensionHmacCreateSecret": true,
"extensionLargeBlob": true,
"extensionMinPinLength": true,
"extensionPayment": true,
"extensionPrf": true,
"maxTouchPoints": 123
}
],
"dataApp": [
{
"id": "<string>",
"createdMs": 123,
"osVersion": "<string>",
"model": "<string>",
"brand": "<string>",
"appName": "<string>",
"appVersion": "<string>",
"deviceOwnerAuth": "none",
"isBluetoothAvailable": true,
"androidGooglePlayServicesVersion": "<string>",
"locale": "<string>",
"screen": {
"widthPoints": 123,
"heightPoints": 123,
"scale": 123
}
}
],
"passwordManagers": [
{
"name": "1password",
"sources": [
"extension"
],
"firstSeenMs": 123,
"lastSeenMs": 123
}
]
}
]{
"error": {
"message": "Validation failed",
"details": [
{
"field": "projectID",
"message": "required"
}
]
}
}Search client environments
Finds observed client environments for selected Observe users.
Required API key permission: observe:clientEnvs:read.
curl --request POST \
--url https://api.cloud.corbado.io/v1/observe/clientEnvSearch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"userIDs": [
"<string>"
],
"limit": 100
}
'import requests
url = "https://api.cloud.corbado.io/v1/observe/clientEnvSearch"
payload = {
"userIDs": ["<string>"],
"limit": 100
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({userIDs: ['<string>'], limit: 100})
};
fetch('https://api.cloud.corbado.io/v1/observe/clientEnvSearch', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.cloud.corbado.io/v1/observe/clientEnvSearch",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'userIDs' => [
'<string>'
],
'limit' => 100
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.cloud.corbado.io/v1/observe/clientEnvSearch"
payload := strings.NewReader("{\n \"userIDs\": [\n \"<string>\"\n ],\n \"limit\": 100\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.cloud.corbado.io/v1/observe/clientEnvSearch")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"userIDs\": [\n \"<string>\"\n ],\n \"limit\": 100\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cloud.corbado.io/v1/observe/clientEnvSearch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"userIDs\": [\n \"<string>\"\n ],\n \"limit\": 100\n}"
response = http.request(request)
puts response.read_body[
{
"id": "<string>",
"handle": "<string>",
"osName": "Windows",
"clientEnvType": "web",
"createdMs": 123,
"dataWeb": [
{
"id": "<string>",
"createdMs": 123,
"osVersion": "<string>",
"browserName": "<string>",
"browserVersion": "<string>",
"privateMode": true,
"webdriver": true,
"bluetoothAvailable": true,
"conditionalMediationAvailable": true,
"userVerifyingPlatformAuthenticatorAvailable": true,
"conditionalGet": true,
"conditionalCreate": true,
"hybridTransport": true,
"passkeyPlatformAuthenticator": true,
"relatedOrigins": true,
"signalAllAcceptedCredentials": true,
"signalCurrentUserDetails": true,
"signalUnknownCredential": true,
"userVerifyingPlatformAuthenticator": true,
"extensionAppid": true,
"extensionAppidExclude": true,
"extensionCredBlob": true,
"extensionCredProps": true,
"extensionCredentialProtectionPolicy": true,
"extensionEnforceCredentialProtectionPolicy": true,
"extensionGetCredBlob": true,
"extensionHmacCreateSecret": true,
"extensionLargeBlob": true,
"extensionMinPinLength": true,
"extensionPayment": true,
"extensionPrf": true,
"maxTouchPoints": 123
}
],
"dataApp": [
{
"id": "<string>",
"createdMs": 123,
"osVersion": "<string>",
"model": "<string>",
"brand": "<string>",
"appName": "<string>",
"appVersion": "<string>",
"deviceOwnerAuth": "none",
"isBluetoothAvailable": true,
"androidGooglePlayServicesVersion": "<string>",
"locale": "<string>",
"screen": {
"widthPoints": 123,
"heightPoints": 123,
"scale": 123
}
}
],
"passwordManagers": [
{
"name": "1password",
"sources": [
"extension"
],
"firstSeenMs": 123,
"lastSeenMs": 123
}
]
}
]{
"error": {
"message": "Validation failed",
"details": [
{
"field": "projectID",
"message": "required"
}
]
}
}Authorizations
Use an Observe API key from the management console. The key selects the project and must grant the permission listed on the operation. Keep this key on your server.
Body
Response
Matching client environments.
Client environment container ID (format tce-<number>).
Client environment handle.
Operating system name.
Windows, macOS, Linux, iOS, iPadOS, Android, ChromeOS, Other Client environment type.
web, app Creation time in milliseconds since epoch.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Password managers seen in this client environment, either as a detected browser extension
or through a passkey of the manager created or used on this device. Detection is best-effort:
a manager missing from the list may still be installed. A manager stays listed once seen;
lastSeenMs shows when it was last seen.
Show child attributes
Show child attributes
Was this page helpful?