curl --request DELETE \
--url https://{host}/v1/me \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/vnd.api+json' \
--data '
{
"data": {
"type": "users",
"attributes": {
"code": "284193",
"reason": "other",
"reasonNote": "I only wanted to look around."
}
}
}
'const options = {
method: 'DELETE',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/vnd.api+json'},
body: JSON.stringify({
data: {
type: 'users',
attributes: {code: '284193', reason: 'other', reasonNote: 'I only wanted to look around.'}
}
})
};
fetch('https://{host}/v1/me', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_POSTFIELDS => json_encode([
'data' => [
'type' => 'users',
'attributes' => [
'code' => '284193',
'reason' => 'other',
'reasonNote' => 'I only wanted to look around.'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/vnd.api+json"
],
]);
$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"
payload = { "data": {
"type": "users",
"attributes": {
"code": "284193",
"reason": "other",
"reasonNote": "I only wanted to look around."
}
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/vnd.api+json"
}
response = requests.delete(url, json=payload, headers=headers)
print(response.text){
"jsonapi": {
"version": "1.0"
},
"meta": {
"deletedAt": "2026-09-26T19:04:00+02:00",
"purgesAt": "2026-10-26T19:04:00+01:00",
"restorableUntil": "2026-10-26T19:04:00+01:00"
}
}{
"errors": [
{
"status": "404",
"code": "watch_reserved",
"title": "Not Found",
"detail": "<string>",
"meta": {},
"source": {
"pointer": "/data/attributes/reference",
"parameter": "<string>"
}
}
],
"jsonapi": {
"version": "1.0"
}
}{
"jsonapi": {
"version": "1.0"
},
"errors": [
{
"status": "409",
"code": "account_has_open_orders",
"title": "Conflict",
"detail": "You have an order that is not finished yet. We cannot delete your account while somebody is waiting to send you a watch, or waiting to be paid.",
"meta": {
"orders": [
"202600123"
]
}
}
]
}{
"errors": [
{
"status": "404",
"code": "watch_reserved",
"title": "Not Found",
"detail": "<string>",
"meta": {},
"source": {
"pointer": "/data/attributes/reference",
"parameter": "<string>"
}
}
],
"jsonapi": {
"version": "1.0"
}
}Delete account
Scope: account:write. The Wristler app only.
Step two: spends the code from POST /v1/me/deletion and closes the account.
Everything is signed out at once — every token on every device, the push
registrations, and the browser sessions. This answer is the last thing the app will
be able to read, which is why it carries the dates rather than answering 204.
The account is not gone yet. For thirty days it is only marked, and signing in
cancels the deletion — no support ticket, no link that expires. After
meta.purgesAt the person is anonymised and the account is closed for good.
What survives, anonymised: orders, payments and invoices. They are a seller’s bookkeeping and ours as much as this person’s, and we are required to keep them, so the account they point at loses its name rather than the records losing their account. Their messages stay for the same reason — removing them would empty out the other side of a conversation. Everything that is only theirs goes: the address book, favourites, saved searches, notifications, devices, blocks.
422 deletion_code_invalid covers a wrong code, a missing one, and an expired one.
Five wrong guesses throw the code away, and a new one has to be asked for.
Why they are leaving, optional. reason is one of no_longer_needed,
bought_elsewhere, too_many_emails, privacy, bad_experience or other — the
same list, labelled, is in meta.reasons of POST /v1/me/deletion. reasonNote
(at most 1000 characters) is kept only with other and dropped with anything else;
it is not required, even then. Leave both out and the deletion goes ahead the same.
They are checked before the code is spent, so a bad one does not cost a code:
422 deletion_reason_invalid (with meta.allowed) or
422 deletion_reason_note_invalid (with meta.max). Support is told about every
deletion, with the reason when there is one.
curl --request DELETE \
--url https://{host}/v1/me \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/vnd.api+json' \
--data '
{
"data": {
"type": "users",
"attributes": {
"code": "284193",
"reason": "other",
"reasonNote": "I only wanted to look around."
}
}
}
'const options = {
method: 'DELETE',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/vnd.api+json'},
body: JSON.stringify({
data: {
type: 'users',
attributes: {code: '284193', reason: 'other', reasonNote: 'I only wanted to look around.'}
}
})
};
fetch('https://{host}/v1/me', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_POSTFIELDS => json_encode([
'data' => [
'type' => 'users',
'attributes' => [
'code' => '284193',
'reason' => 'other',
'reasonNote' => 'I only wanted to look around.'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/vnd.api+json"
],
]);
$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"
payload = { "data": {
"type": "users",
"attributes": {
"code": "284193",
"reason": "other",
"reasonNote": "I only wanted to look around."
}
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/vnd.api+json"
}
response = requests.delete(url, json=payload, headers=headers)
print(response.text){
"jsonapi": {
"version": "1.0"
},
"meta": {
"deletedAt": "2026-09-26T19:04:00+02:00",
"purgesAt": "2026-10-26T19:04:00+01:00",
"restorableUntil": "2026-10-26T19:04:00+01:00"
}
}{
"errors": [
{
"status": "404",
"code": "watch_reserved",
"title": "Not Found",
"detail": "<string>",
"meta": {},
"source": {
"pointer": "/data/attributes/reference",
"parameter": "<string>"
}
}
],
"jsonapi": {
"version": "1.0"
}
}{
"jsonapi": {
"version": "1.0"
},
"errors": [
{
"status": "409",
"code": "account_has_open_orders",
"title": "Conflict",
"detail": "You have an order that is not finished yet. We cannot delete your account while somebody is waiting to send you a watch, or waiting to be paid.",
"meta": {
"orders": [
"202600123"
]
}
}
]
}{
"errors": [
{
"status": "404",
"code": "watch_reserved",
"title": "Not Found",
"detail": "<string>",
"meta": {},
"source": {
"pointer": "/data/attributes/reference",
"parameter": "<string>"
}
}
],
"jsonapi": {
"version": "1.0"
}
}Authorizations
Body
Response
Closed, with the date there is no way back from.