curl --request GET \
--url https://api.example.com/api/v1/users \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.example.com/api/v1/users"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.example.com/api/v1/users', 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.example.com/api/v1/users",
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;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/v1/users"
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(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/api/v1/users")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/users")
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{
"items": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z",
"first_name": "<string>",
"last_name": "<string>",
"email": "jsmith@example.com",
"external_user_id": "<string>",
"last_synced_at": "2023-11-07T05:31:56Z",
"last_synced_provider": "<string>",
"has_active_connection": false,
"connections": [
{
"provider": "<string>",
"status": "active",
"last_synced_at": "2023-11-07T05:31:56Z"
}
]
}
],
"total": 1,
"page": 2,
"limit": 123,
"pages": 123,
"has_next": true,
"has_prev": true
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}List Users
List users with pagination, sorting, and search.
curl --request GET \
--url https://api.example.com/api/v1/users \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.example.com/api/v1/users"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.example.com/api/v1/users', 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.example.com/api/v1/users",
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;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/v1/users"
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(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/api/v1/users")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/users")
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{
"items": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z",
"first_name": "<string>",
"last_name": "<string>",
"email": "jsmith@example.com",
"external_user_id": "<string>",
"last_synced_at": "2023-11-07T05:31:56Z",
"last_synced_provider": "<string>",
"has_active_connection": false,
"connections": [
{
"provider": "<string>",
"status": "active",
"last_synced_at": "2023-11-07T05:31:56Z"
}
]
}
],
"total": 1,
"page": 2,
"limit": 123,
"pages": 123,
"has_next": true,
"has_prev": true
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
The access token received from the authorization server in the OAuth 2.0 flow.
Headers
Query Parameters
Page number (1-based)
x >= 1Number of results per page
1 <= x <= 100Field to sort by. 'name' orders by first name, then last name, with unnamed users last
created_at, email, first_name, last_name, name, last_synced_at Sort order
asc, desc Search across first_name, last_name, and email (partial match). A term that is a valid UUID also matches that user's id exactly
Filter by exact email
Filter by external user ID. Deprecated: no data-fetching endpoint (timeseries, workouts, sleep, summaries, health-scores, etc.) accepts external_user_id - they all require the Open Wearables UUID. This field was added early in the project but never wired into those endpoints, so it only works as a filter on GET /users. Store the UUID returned by POST /users in your own system instead.
Filter by connected provider; repeat the parameter to match any of several. Matches connections in any status unless connection_status is also given
Supported data providers.
apple, samsung, garmin, google, polar, suunto, whoop, strava, oura, fitbit, ultrahuman, sensorbio, unknown, internal Narrow the provider filter to connections in this status Status of a user connection to a provider.
active, revoked, expired True: users with at least one active connection. False: users with none, including those who never connected a provider
Users whose connections have all been idle since this timestamp, including those that never synced
Optional expansions to embed in each user; repeat the parameter for several
Optional expansions for user read models, requested via the include query parameter.
connections Response
Successful Response
Show child attributes
Show child attributes
Total number of items matching the query
x >= 0Current page number (1-based)
x >= 1Number of items per page
Total number of pages.
Whether there is a next page.
Whether there is a previous page.
Was this page helpful?

