curl --request POST \
--url https://api.gridbeds.com/api/v1/distribution/listing-stats \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"data": [
{
"property_id": "prp_1qnykkykp69yv8d59hxk5410m9",
"date": "2023-12-25",
"views": 500000000,
"clicks_to_booking": 500000000,
"impressions": 500000000,
"saves": 500000000
}
]
}
'import requests
url = "https://api.gridbeds.com/api/v1/distribution/listing-stats"
payload = { "data": [
{
"property_id": "prp_1qnykkykp69yv8d59hxk5410m9",
"date": "2023-12-25",
"views": 500000000,
"clicks_to_booking": 500000000,
"impressions": 500000000,
"saves": 500000000
}
] }
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({
data: [
{
property_id: 'prp_1qnykkykp69yv8d59hxk5410m9',
date: '2023-12-25',
views: 500000000,
clicks_to_booking: 500000000,
impressions: 500000000,
saves: 500000000
}
]
})
};
fetch('https://api.gridbeds.com/api/v1/distribution/listing-stats', 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.gridbeds.com/api/v1/distribution/listing-stats",
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([
'data' => [
[
'property_id' => 'prp_1qnykkykp69yv8d59hxk5410m9',
'date' => '2023-12-25',
'views' => 500000000,
'clicks_to_booking' => 500000000,
'impressions' => 500000000,
'saves' => 500000000
]
]
]),
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;
}{
"accepted": 2,
"received_at": "2026-10-16T09:30:00Z"
}{
"type": "https://api.gridbeds.com/problems/not-found",
"title": "<string>",
"status": 499,
"instance": "<string>",
"code": "invalid_parameters",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"errors": [
{
"detail": "<string>",
"code": "<string>",
"parameter": "<string>",
"header": "<string>",
"pointer": "<string>"
}
],
"detail": "<string>"
}{
"type": "https://api.gridbeds.com/problems/not-found",
"title": "<string>",
"status": 499,
"instance": "<string>",
"code": "invalid_parameters",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"detail": "<string>"
}{
"type": "https://api.gridbeds.com/problems/not-found",
"title": "<string>",
"status": 499,
"instance": "<string>",
"code": "invalid_parameters",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"required_scopes": [
"read:catalog"
],
"detail": "<string>"
}{
"type": "https://api.gridbeds.com/problems/not-found",
"title": "<string>",
"status": 499,
"instance": "<string>",
"code": "invalid_parameters",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"detail": "<string>"
}{
"type": "https://api.gridbeds.com/problems/not-found",
"title": "<string>",
"status": 499,
"instance": "<string>",
"code": "invalid_parameters",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"detail": "<string>"
}{
"type": "https://api.gridbeds.com/problems/not-found",
"title": "<string>",
"status": 499,
"instance": "<string>",
"code": "invalid_parameters",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"detail": "<string>"
}Report daily statistics of your listings, at most 1000 property-days per request
Daily aggregates, one item per property and property-local date. Idempotent per (property_id, date):
a resend overwrites the day, so send today’s partial figures as often as you like and correct a past day by
sending it again. All or nothing: a request with any invalid item stores nothing and answers 400 with an
errors[] entry per invalid item (pointer /data/<index>/<member>); fix and resend the whole batch, which
the idempotency makes safe. A per-item result (a 207-style answer) is deliberately not offered: it leaves a
batch half applied and every client to reconcile it, for no gain when a resend is free.
An item is invalid when its property was never distributed to you (unknown_property), when its date is after
the property’s today or more than 90 days before it (date_out_of_range), or when the batch names the same
(property_id, date) twice (duplicate_day). A property withdrawn or deleted since still takes days on
which it was distributed. Days are kept 25 months, so a host can compare a month with the same month a year
before, then deleted. A request costs max(1, ceil(items / 100)) units of your rate limit.
curl --request POST \
--url https://api.gridbeds.com/api/v1/distribution/listing-stats \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"data": [
{
"property_id": "prp_1qnykkykp69yv8d59hxk5410m9",
"date": "2023-12-25",
"views": 500000000,
"clicks_to_booking": 500000000,
"impressions": 500000000,
"saves": 500000000
}
]
}
'import requests
url = "https://api.gridbeds.com/api/v1/distribution/listing-stats"
payload = { "data": [
{
"property_id": "prp_1qnykkykp69yv8d59hxk5410m9",
"date": "2023-12-25",
"views": 500000000,
"clicks_to_booking": 500000000,
"impressions": 500000000,
"saves": 500000000
}
] }
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({
data: [
{
property_id: 'prp_1qnykkykp69yv8d59hxk5410m9',
date: '2023-12-25',
views: 500000000,
clicks_to_booking: 500000000,
impressions: 500000000,
saves: 500000000
}
]
})
};
fetch('https://api.gridbeds.com/api/v1/distribution/listing-stats', 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.gridbeds.com/api/v1/distribution/listing-stats",
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([
'data' => [
[
'property_id' => 'prp_1qnykkykp69yv8d59hxk5410m9',
'date' => '2023-12-25',
'views' => 500000000,
'clicks_to_booking' => 500000000,
'impressions' => 500000000,
'saves' => 500000000
]
]
]),
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;
}{
"accepted": 2,
"received_at": "2026-10-16T09:30:00Z"
}{
"type": "https://api.gridbeds.com/problems/not-found",
"title": "<string>",
"status": 499,
"instance": "<string>",
"code": "invalid_parameters",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"errors": [
{
"detail": "<string>",
"code": "<string>",
"parameter": "<string>",
"header": "<string>",
"pointer": "<string>"
}
],
"detail": "<string>"
}{
"type": "https://api.gridbeds.com/problems/not-found",
"title": "<string>",
"status": 499,
"instance": "<string>",
"code": "invalid_parameters",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"detail": "<string>"
}{
"type": "https://api.gridbeds.com/problems/not-found",
"title": "<string>",
"status": 499,
"instance": "<string>",
"code": "invalid_parameters",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"required_scopes": [
"read:catalog"
],
"detail": "<string>"
}{
"type": "https://api.gridbeds.com/problems/not-found",
"title": "<string>",
"status": 499,
"instance": "<string>",
"code": "invalid_parameters",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"detail": "<string>"
}{
"type": "https://api.gridbeds.com/problems/not-found",
"title": "<string>",
"status": 499,
"instance": "<string>",
"code": "invalid_parameters",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"detail": "<string>"
}{
"type": "https://api.gridbeds.com/problems/not-found",
"title": "<string>",
"status": 499,
"instance": "<string>",
"code": "invalid_parameters",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"detail": "<string>"
}Autorizzazioni
A key starts with gbd_live_ (production) or gbd_test_ (sandbox) and ends in a CRC32 checksum of its
secret part, so a mistyped or truncated key is refused before any lookup, as is a key of the other
environment. The prefix is registered with public secret scanners (GitHub secret scanning, TruffleHog,
GitGuardian): a key found in a public repository is revoked at once and your technical contact is told.
Gridbeds stores only a hash of each key. One partner may hold two keys per environment during a rotation.
Operations list the scopes they need; the scopes are OAuth 2.0 scope tokens, so short-lived access tokens
from a client-credentials grant can be offered later beside keys, with the same scopes and no change to any
operation.
Corpo
1 - 1000 elementsShow child attributes
Show child attributes