curl --request GET \
--url https://{host}/v1/sellers/{sellerId}/dashboard \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://{host}/v1/sellers/{sellerId}/dashboard', 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/sellers/{sellerId}/dashboard",
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/sellers/{sellerId}/dashboard"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"jsonapi": {
"version": "1.0"
},
"meta": {
"period": "7d",
"periods": [
{
"key": "7d",
"label": "Last 7 days"
},
{
"key": "30d",
"label": "Last 30 days"
},
{
"key": "year",
"label": "This year"
}
],
"from": "2026-09-30T00:00:00+02:00",
"until": "2026-10-07T00:00:00+02:00",
"revenue": 750000,
"revenueChange": 50,
"chart": {
"interval": "day",
"buckets": [
{
"start": "2026-09-30",
"amount": 500000
},
{
"start": "2026-10-01",
"amount": 0
},
{
"start": "2026-10-02",
"amount": 0
},
{
"start": "2026-10-03",
"amount": 0
},
{
"start": "2026-10-04",
"amount": 0
},
{
"start": "2026-10-05",
"amount": 0
},
{
"start": "2026-10-06",
"amount": 250000
}
]
},
"sold": 2,
"conversations": 3,
"proposals": 1,
"favorites": 4,
"watchesOnline": 37,
"mostFavorited": [
{
"rank": 1,
"watch": "1301",
"name": "Rolex Submariner Date",
"reference": "126610LN",
"price": 1250000,
"priceOnRequest": false,
"status": "available",
"image": {
"url": "https://cdn.wristler.eu/wristler-image-storage/one.jpg",
"square": "https://cdn.wristler.eu/square-medium/wristler-image-storage/one.jpg",
"squareLarge": "https://cdn.wristler.eu/square-large/wristler-image-storage/one.jpg"
},
"timesFavorited": 14
}
],
"updatedAt": "2026-10-06T12:00:00+02:00"
}
}{
"errors": [
{
"status": "404",
"code": "watch_reserved",
"title": "Not Found",
"detail": "<string>",
"meta": {},
"source": {
"pointer": "/data/attributes/reference",
"parameter": "<string>"
}
}
],
"jsonapi": {
"version": "1.0"
}
}{
"errors": [
{
"status": "404",
"code": "watch_reserved",
"title": "Not Found",
"detail": "<string>",
"meta": {},
"source": {
"pointer": "/data/attributes/reference",
"parameter": "<string>"
}
}
],
"jsonapi": {
"version": "1.0"
}
}{
"errors": [
{
"status": "404",
"code": "watch_reserved",
"title": "Not Found",
"detail": "<string>",
"meta": {},
"source": {
"pointer": "/data/attributes/reference",
"parameter": "<string>"
}
}
],
"jsonapi": {
"version": "1.0"
}
}Show dashboard figures
Scope: orders:read
The business’s dashboard over a period, counted exactly as the website’s seller
dashboard counts it. The lifetime figures (payouts, orders to fulfil, unread
threads) stay on GET /v1/sellers/{sellerId}/statistics.
period is 7d, 30d (the default) or year: the last 7 or 30 days up to and
including today, or this year so far, in Wristler’s timezone (Europe/Amsterdam).
periods lists all three with a label in the language of Accept-Language, so
the switch needs no table of its own.
Not a resource: the answer is in meta, amounts in cents.
from, until | The period, from included and until not |
revenue | What buyers paid for orders paid in the period, their service costs included: the same total the website’s chart shows |
revenueChange | revenue against the period before, in whole percents: the 7 or 30 days before, or the same days of last year for year. null when nothing was sold then |
chart.interval | day for 7d and 30d, month for year |
chart.buckets | A bar per day or month, oldest first, quiet ones as 0: start (a date) and amount |
sold | Orders paid in the period |
conversations | Conversations buyers started about the business’s watches in the period: questions, offers and requests alike. A thread the business opened itself (a message to the buyer about an order) does not count |
proposals | Deprecated, use conversations: removed in the next release. Price proposals made in the business’s conversations in the period, the buyers’ offers and its own proposals alike |
favorites | How often one of its watches was added to favourites in the period |
watchesOnline | Not the period: how many of its watches buyers can find now (status available), the website’s “Watches online”. Kept with the other figures for a minute, so a listing taken offline can take that long to count |
mostFavorited | All time, not the period: the five watches added to favourites most often, most first, sold and withdrawn listings included. watch is the listing’s id at /v1/sellers/{sellerId}/watches/{id}; image is null without a photo |
updatedAt | When these figures were counted |
The figures are kept for a minute, like statistics, and forgotten at once when
an order, a conversation or a favourite of the business changes.
For the business itself: anybody else gets 404. A period that is not one of the
three is a 400 with invalid_period.
curl --request GET \
--url https://{host}/v1/sellers/{sellerId}/dashboard \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://{host}/v1/sellers/{sellerId}/dashboard', 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/sellers/{sellerId}/dashboard",
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/sellers/{sellerId}/dashboard"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"jsonapi": {
"version": "1.0"
},
"meta": {
"period": "7d",
"periods": [
{
"key": "7d",
"label": "Last 7 days"
},
{
"key": "30d",
"label": "Last 30 days"
},
{
"key": "year",
"label": "This year"
}
],
"from": "2026-09-30T00:00:00+02:00",
"until": "2026-10-07T00:00:00+02:00",
"revenue": 750000,
"revenueChange": 50,
"chart": {
"interval": "day",
"buckets": [
{
"start": "2026-09-30",
"amount": 500000
},
{
"start": "2026-10-01",
"amount": 0
},
{
"start": "2026-10-02",
"amount": 0
},
{
"start": "2026-10-03",
"amount": 0
},
{
"start": "2026-10-04",
"amount": 0
},
{
"start": "2026-10-05",
"amount": 0
},
{
"start": "2026-10-06",
"amount": 250000
}
]
},
"sold": 2,
"conversations": 3,
"proposals": 1,
"favorites": 4,
"watchesOnline": 37,
"mostFavorited": [
{
"rank": 1,
"watch": "1301",
"name": "Rolex Submariner Date",
"reference": "126610LN",
"price": 1250000,
"priceOnRequest": false,
"status": "available",
"image": {
"url": "https://cdn.wristler.eu/wristler-image-storage/one.jpg",
"square": "https://cdn.wristler.eu/square-medium/wristler-image-storage/one.jpg",
"squareLarge": "https://cdn.wristler.eu/square-large/wristler-image-storage/one.jpg"
},
"timesFavorited": 14
}
],
"updatedAt": "2026-10-06T12:00:00+02:00"
}
}{
"errors": [
{
"status": "404",
"code": "watch_reserved",
"title": "Not Found",
"detail": "<string>",
"meta": {},
"source": {
"pointer": "/data/attributes/reference",
"parameter": "<string>"
}
}
],
"jsonapi": {
"version": "1.0"
}
}{
"errors": [
{
"status": "404",
"code": "watch_reserved",
"title": "Not Found",
"detail": "<string>",
"meta": {},
"source": {
"pointer": "/data/attributes/reference",
"parameter": "<string>"
}
}
],
"jsonapi": {
"version": "1.0"
}
}{
"errors": [
{
"status": "404",
"code": "watch_reserved",
"title": "Not Found",
"detail": "<string>",
"meta": {},
"source": {
"pointer": "/data/attributes/reference",
"parameter": "<string>"
}
}
],
"jsonapi": {
"version": "1.0"
}
}Authorizations
Response
The figures.
The response is of type object.