List sign-ins
curl --request GET \
--url https://{host}/v1/me/sign-ins \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://{host}/v1/me/sign-ins', 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://{host}/v1/me/sign-ins",
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;
}import requests
url = "https://{host}/v1/me/sign-ins"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"jsonapi": {
"version": "1.0"
},
"data": [
{
"type": "sign-ins",
"id": "311",
"attributes": {
"client": "app",
"device": "Wristler app on iOS",
"appVersion": "1.4.0",
"country": "NL",
"countryName": "Netherlands",
"signedInAt": "2026-10-03T08:12:44+00:00",
"current": true
}
},
{
"type": "sign-ins",
"id": "297",
"attributes": {
"client": "web",
"device": "Safari on macOS",
"appVersion": null,
"country": "BE",
"countryName": "Belgium",
"signedInAt": "2026-09-29T19:40:02+00:00",
"current": false
}
}
],
"meta": {
"total": 2
}
}{
"errors": [
{
"status": "404",
"code": "watch_reserved",
"title": "Not Found",
"detail": "<string>",
"meta": {},
"source": {
"pointer": "/data/attributes/reference",
"parameter": "<string>"
}
}
],
"jsonapi": {
"version": "1.0"
}
}Account (Security)
List sign-ins
Scope: account-security:write
Where the account is signed in now, newest first, in the app and on the website —
what a “Where you are signed in” screen draws. A session that was signed out is no
longer listed, and nor is one started more than 90 days ago. Answered whole, not
paged — at most the newest 100 — because a list somebody reads to spot a stranger
is read to the end. meta.total says how many are in the answer.
| Attribute | |
|---|---|
client | app or web |
device | What it was, in the language of Accept-Language: “Wristler app on iOS”, “Safari on macOS” |
appVersion | The app’s version at that sign-in, from X-Wristler-App; null on the website |
country | ISO 3166-1 alpha-2, from Cloudflare; null when it could not tell |
countryName | The same, as a name in the reader’s language |
signedInAt | When |
current | This is the token asking. It stays true across token refreshes |
No IP address is kept, and no place finer than the country.
A sign-in on a device the account was not used on before — the app on another
platform, or another browser or operating system; never a newer version — sends
new_sign_in by mail, to the bell and as a push. The account’s very first sign-in
does not.
GET
/
v1
/
me
/
sign-ins
List sign-ins
curl --request GET \
--url https://{host}/v1/me/sign-ins \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://{host}/v1/me/sign-ins', 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://{host}/v1/me/sign-ins",
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;
}import requests
url = "https://{host}/v1/me/sign-ins"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"jsonapi": {
"version": "1.0"
},
"data": [
{
"type": "sign-ins",
"id": "311",
"attributes": {
"client": "app",
"device": "Wristler app on iOS",
"appVersion": "1.4.0",
"country": "NL",
"countryName": "Netherlands",
"signedInAt": "2026-10-03T08:12:44+00:00",
"current": true
}
},
{
"type": "sign-ins",
"id": "297",
"attributes": {
"client": "web",
"device": "Safari on macOS",
"appVersion": null,
"country": "BE",
"countryName": "Belgium",
"signedInAt": "2026-09-29T19:40:02+00:00",
"current": false
}
}
],
"meta": {
"total": 2
}
}{
"errors": [
{
"status": "404",
"code": "watch_reserved",
"title": "Not Found",
"detail": "<string>",
"meta": {},
"source": {
"pointer": "/data/attributes/reference",
"parameter": "<string>"
}
}
],
"jsonapi": {
"version": "1.0"
}
}