curl --request PUT \
--url https://api-dev.myrestoo.net/v3/customers/{customerUuid} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Restoo-Account-Id: <restoo-account-id>' \
--header 'Restoo-Partner-Id: <restoo-partner-id>' \
--data '
{
"hasGdprConsent": true,
"acceptsMarketing": true,
"name": "Steve Jobs",
"email": "steve.jobs@restoo.me",
"phone": "+34600111222",
"birthDate": "1979-03-20",
"postalCode": "28045",
"language": "en",
"country": "ES"
}
'import requests
url = "https://api-dev.myrestoo.net/v3/customers/{customerUuid}"
payload = {
"hasGdprConsent": True,
"acceptsMarketing": True,
"name": "Steve Jobs",
"email": "steve.jobs@restoo.me",
"phone": "+34600111222",
"birthDate": "1979-03-20",
"postalCode": "28045",
"language": "en",
"country": "ES"
}
headers = {
"Restoo-Partner-Id": "<restoo-partner-id>",
"Restoo-Account-Id": "<restoo-account-id>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {
'Restoo-Partner-Id': '<restoo-partner-id>',
'Restoo-Account-Id': '<restoo-account-id>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
hasGdprConsent: true,
acceptsMarketing: true,
name: 'Steve Jobs',
email: 'steve.jobs@restoo.me',
phone: '+34600111222',
birthDate: '1979-03-20',
postalCode: '28045',
language: 'en',
country: 'ES'
})
};
fetch('https://api-dev.myrestoo.net/v3/customers/{customerUuid}', 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-dev.myrestoo.net/v3/customers/{customerUuid}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'hasGdprConsent' => true,
'acceptsMarketing' => true,
'name' => 'Steve Jobs',
'email' => 'steve.jobs@restoo.me',
'phone' => '+34600111222',
'birthDate' => '1979-03-20',
'postalCode' => '28045',
'language' => 'en',
'country' => 'ES'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Restoo-Account-Id: <restoo-account-id>",
"Restoo-Partner-Id: <restoo-partner-id>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api-dev.myrestoo.net/v3/customers/{customerUuid}"
payload := strings.NewReader("{\n \"hasGdprConsent\": true,\n \"acceptsMarketing\": true,\n \"name\": \"Steve Jobs\",\n \"email\": \"steve.jobs@restoo.me\",\n \"phone\": \"+34600111222\",\n \"birthDate\": \"1979-03-20\",\n \"postalCode\": \"28045\",\n \"language\": \"en\",\n \"country\": \"ES\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Restoo-Partner-Id", "<restoo-partner-id>")
req.Header.Add("Restoo-Account-Id", "<restoo-account-id>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api-dev.myrestoo.net/v3/customers/{customerUuid}")
.header("Restoo-Partner-Id", "<restoo-partner-id>")
.header("Restoo-Account-Id", "<restoo-account-id>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"hasGdprConsent\": true,\n \"acceptsMarketing\": true,\n \"name\": \"Steve Jobs\",\n \"email\": \"steve.jobs@restoo.me\",\n \"phone\": \"+34600111222\",\n \"birthDate\": \"1979-03-20\",\n \"postalCode\": \"28045\",\n \"language\": \"en\",\n \"country\": \"ES\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-dev.myrestoo.net/v3/customers/{customerUuid}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Restoo-Partner-Id"] = '<restoo-partner-id>'
request["Restoo-Account-Id"] = '<restoo-account-id>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"hasGdprConsent\": true,\n \"acceptsMarketing\": true,\n \"name\": \"Steve Jobs\",\n \"email\": \"steve.jobs@restoo.me\",\n \"phone\": \"+34600111222\",\n \"birthDate\": \"1979-03-20\",\n \"postalCode\": \"28045\",\n \"language\": \"en\",\n \"country\": \"ES\"\n}"
response = http.request(request)
puts response.read_body{
"privateNotes": "Customer prefers a table near the terrace.",
"visitFrequency": 30,
"averageOrderAmountPerPax": 4500,
"bookingReputation": 0.85,
"bookingsCount": 25,
"visitsCount": 18,
"cancellationsCount": 3,
"noShowsCount": 2,
"firstVisitAt": "2023-05-10T20:00:00+02:00",
"lastVisitAt": "2025-03-15T21:30:00+02:00",
"firstCancellationAt": "2024-09-12T19:00:00+02:00",
"nextVisitScheduledAt": "2025-04-05T22:00:00+02:00",
"tags": [
{
"id": 1,
"name": "VIP",
"color": "#FF5733"
}
],
"uuid": "50b5571be67b477baa9dead4b290c555",
"email": "steve.jobs@restoo.me",
"phone": "+34600111222",
"birthDate": "1979-03-20",
"postalCode": "28045",
"isVip": true,
"isBusiness": false,
"language": "en",
"acceptsImportantAlerts": true,
"hasGdprConsent": true,
"acceptsMarketing": true,
"country": "ES",
"name": "Steve Jobs"
}{
"type": "about:blank",
"title": "Conflict",
"status": 409,
"code": "BOOKING_IS_NOT_ON_SEATED_GROUP",
"detail": "The booking must be on the seated group status to be ended."
}{
"type": "about:blank",
"title": "Validation Error",
"status": 422,
"code": "VALIDATION_ERROR",
"detail": "The request is not valid.",
"errors": [
{
"parameter": "status",
"reason": "The selected status is invalid."
}
]
}Update Customer
Updates an existing customer’s data. All required fields must be sent. Optional fields not sent are not modified; those sent as null are overwritten with null.
curl --request PUT \
--url https://api-dev.myrestoo.net/v3/customers/{customerUuid} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Restoo-Account-Id: <restoo-account-id>' \
--header 'Restoo-Partner-Id: <restoo-partner-id>' \
--data '
{
"hasGdprConsent": true,
"acceptsMarketing": true,
"name": "Steve Jobs",
"email": "steve.jobs@restoo.me",
"phone": "+34600111222",
"birthDate": "1979-03-20",
"postalCode": "28045",
"language": "en",
"country": "ES"
}
'import requests
url = "https://api-dev.myrestoo.net/v3/customers/{customerUuid}"
payload = {
"hasGdprConsent": True,
"acceptsMarketing": True,
"name": "Steve Jobs",
"email": "steve.jobs@restoo.me",
"phone": "+34600111222",
"birthDate": "1979-03-20",
"postalCode": "28045",
"language": "en",
"country": "ES"
}
headers = {
"Restoo-Partner-Id": "<restoo-partner-id>",
"Restoo-Account-Id": "<restoo-account-id>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {
'Restoo-Partner-Id': '<restoo-partner-id>',
'Restoo-Account-Id': '<restoo-account-id>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
hasGdprConsent: true,
acceptsMarketing: true,
name: 'Steve Jobs',
email: 'steve.jobs@restoo.me',
phone: '+34600111222',
birthDate: '1979-03-20',
postalCode: '28045',
language: 'en',
country: 'ES'
})
};
fetch('https://api-dev.myrestoo.net/v3/customers/{customerUuid}', 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-dev.myrestoo.net/v3/customers/{customerUuid}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'hasGdprConsent' => true,
'acceptsMarketing' => true,
'name' => 'Steve Jobs',
'email' => 'steve.jobs@restoo.me',
'phone' => '+34600111222',
'birthDate' => '1979-03-20',
'postalCode' => '28045',
'language' => 'en',
'country' => 'ES'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Restoo-Account-Id: <restoo-account-id>",
"Restoo-Partner-Id: <restoo-partner-id>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api-dev.myrestoo.net/v3/customers/{customerUuid}"
payload := strings.NewReader("{\n \"hasGdprConsent\": true,\n \"acceptsMarketing\": true,\n \"name\": \"Steve Jobs\",\n \"email\": \"steve.jobs@restoo.me\",\n \"phone\": \"+34600111222\",\n \"birthDate\": \"1979-03-20\",\n \"postalCode\": \"28045\",\n \"language\": \"en\",\n \"country\": \"ES\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Restoo-Partner-Id", "<restoo-partner-id>")
req.Header.Add("Restoo-Account-Id", "<restoo-account-id>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api-dev.myrestoo.net/v3/customers/{customerUuid}")
.header("Restoo-Partner-Id", "<restoo-partner-id>")
.header("Restoo-Account-Id", "<restoo-account-id>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"hasGdprConsent\": true,\n \"acceptsMarketing\": true,\n \"name\": \"Steve Jobs\",\n \"email\": \"steve.jobs@restoo.me\",\n \"phone\": \"+34600111222\",\n \"birthDate\": \"1979-03-20\",\n \"postalCode\": \"28045\",\n \"language\": \"en\",\n \"country\": \"ES\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-dev.myrestoo.net/v3/customers/{customerUuid}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Restoo-Partner-Id"] = '<restoo-partner-id>'
request["Restoo-Account-Id"] = '<restoo-account-id>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"hasGdprConsent\": true,\n \"acceptsMarketing\": true,\n \"name\": \"Steve Jobs\",\n \"email\": \"steve.jobs@restoo.me\",\n \"phone\": \"+34600111222\",\n \"birthDate\": \"1979-03-20\",\n \"postalCode\": \"28045\",\n \"language\": \"en\",\n \"country\": \"ES\"\n}"
response = http.request(request)
puts response.read_body{
"privateNotes": "Customer prefers a table near the terrace.",
"visitFrequency": 30,
"averageOrderAmountPerPax": 4500,
"bookingReputation": 0.85,
"bookingsCount": 25,
"visitsCount": 18,
"cancellationsCount": 3,
"noShowsCount": 2,
"firstVisitAt": "2023-05-10T20:00:00+02:00",
"lastVisitAt": "2025-03-15T21:30:00+02:00",
"firstCancellationAt": "2024-09-12T19:00:00+02:00",
"nextVisitScheduledAt": "2025-04-05T22:00:00+02:00",
"tags": [
{
"id": 1,
"name": "VIP",
"color": "#FF5733"
}
],
"uuid": "50b5571be67b477baa9dead4b290c555",
"email": "steve.jobs@restoo.me",
"phone": "+34600111222",
"birthDate": "1979-03-20",
"postalCode": "28045",
"isVip": true,
"isBusiness": false,
"language": "en",
"acceptsImportantAlerts": true,
"hasGdprConsent": true,
"acceptsMarketing": true,
"country": "ES",
"name": "Steve Jobs"
}{
"type": "about:blank",
"title": "Conflict",
"status": 409,
"code": "BOOKING_IS_NOT_ON_SEATED_GROUP",
"detail": "The booking must be on the seated group status to be ended."
}{
"type": "about:blank",
"title": "Validation Error",
"status": 422,
"code": "VALIDATION_ERROR",
"detail": "The request is not valid.",
"errors": [
{
"parameter": "status",
"reason": "The selected status is invalid."
}
]
}Authorizations
All requests must include the static API Key in the Authorization header using the Bearer scheme.
Headers
Unique identifier of your Partner account (defined by Restoo).
Path Parameters
The customer UUID
"50b5571be67b477baa9dead4b290c555"
Body
UpdateCustomerRequest
Request to update a customer's data.
Whether the Customer consents to their personal data being processed so the venue
can manage the Booking. Not the marketing consent — that is acceptsMarketing.
false is not accepted: without consent there is no Customer, and so no Booking.
Withdrawing a consent already given is not something this API exposes yet, and a
Customer who has withdrawn it stops appearing in Customer search
true
Indicates whether the Customer has consented to receive marketing communications
true
The full name of the Customer
3 - 255"Steve Jobs"
The Customer's email address
255"steve.jobs@restoo.me"
The Customer's phone number in E.164 format
"+34600111222"
Date of birth of the Customer in ISO 8601 format (YYYY-MM-DD)
"1979-03-20"
The Customer's postal code
12"28045"
The preferred language of the Customer, represented as an ISO 639-1 code
es, ca, it, en, de, fr, pt, eu "en"
The country of the Customer, represented as a two-letter ISO 3166-1 alpha-2 code
AF, AX, AL, DZ, AS, AD, AO, AI, AQ, AG, AR, AM, AW, AU, AT, AZ, BS, BH, BD, BB, BY, BE, BZ, BJ, BM, BT, BO, BQ, BA, BW, BV, BR, IO, BN, BG, BF, BI, CV, KH, CM, CA, KY, CF, TD, CL, CN, CX, CC, CO, KM, CG, CD, CK, CR, CI, HR, CU, CW, CY, CZ, DK, DJ, DM, DO, EC, EG, SV, GQ, ER, EE, SZ, ET, FK, FO, FJ, FI, FR, GF, PF, TF, GA, GM, GE, DE, GH, GI, GR, GL, GD, GP, GU, GT, GG, GN, GW, GY, HT, HM, VA, HN, HK, HU, IS, IN, ID, IR, IQ, IE, IM, IL, IT, JM, JP, JE, JO, KZ, KE, KI, KP, KR, XK, KW, KG, LA, LV, LB, LS, LR, LY, LI, LT, LU, MO, MG, MW, MY, MV, ML, MT, MH, MQ, MR, MU, YT, MX, FM, MD, MC, MN, ME, MS, MA, MZ, MM, NA, NR, NP, NL, NC, NZ, NI, NE, NG, NU, NF, MK, MP, NO, OM, PK, PW, PS, PA, PG, PY, PE, PH, PN, PL, PT, PR, QA, RE, RO, RU, RW, BL, SH, KN, LC, MF, PM, VC, WS, SM, ST, SA, SN, RS, SC, SL, SG, SX, SK, SI, SB, SO, ZA, GS, SS, ES, LK, SD, SR, SJ, SE, CH, SY, TW, TJ, TZ, TH, TL, TG, TK, TO, TT, TN, TR, TM, TC, TV, UG, UA, AE, GB, UM, US, UY, UZ, VU, VE, VN, VG, VI, WF, EH, YE, ZM, ZW "ES"
Response
PrivateCustomerResponse
PublicCustomerResponse
- PrivateCustomerResponse
- PublicCustomerResponse
Private Customer details.
Internal notes about the customer, visible only to venue staff
2048"Customer prefers a table near the terrace."
Average frequency of visits, expressed as the number of days between visits
x >= 030
Average order amount per guest (in cents)
x >= 04500
The customer's reputation score based on their booking behavior. Calculated by Restoo from attendance, cancellation, and no-show history.
Interpretation:
- Negative values: poor reputation.
- 0: no sufficient history (neutral).
- Positive values: good reputation
0.85
Total number of bookings made by the customer
x >= 025
Total number of completed visits by the customer
x >= 018
Total number of cancellations made by the customer
x >= 03
Total number of no-shows by the customer
x >= 02
The date and time of the customer's first visit in ISO 8601 format
"2023-05-10T20:00:00+02:00"
The date and time of the customer's most recent visit in ISO 8601 format
"2025-03-15T21:30:00+02:00"
The date and time of the customer's first cancellation in ISO 8601 format
"2024-09-12T19:00:00+02:00"
The date and time of the customer's next scheduled visit in ISO 8601 format
"2025-04-05T22:00:00+02:00"
List of customer tags
Show child attributes
Show child attributes
The Customer UUID
"50b5571be67b477baa9dead4b290c555"
The Customer's email address
"steve.jobs@restoo.me"
The Customer's phone number in E.164 format
"+34600111222"
Date of birth of the Customer in ISO 8601 format (YYYY-MM-DD)
"1979-03-20"
The Customer's postal code
12"28045"
Indicates whether the Customer is marked as VIP
true
Indicates whether the Customer is associated with a business
false
The preferred language of the Customer, represented as an ISO 639-1 code
es, ca, it, en, de, fr, pt, eu "en"
Indicates whether the customer agrees to receive important alerts related to their bookings (e.g., cancellations due to weather or unexpected incidents)
true
Indicates whether the Customer has given GDPR consent
true
Indicates whether the Customer has consented to receive marketing communications
true
The country represented as a two-letter ISO 3166-1 alpha-2 code
AF, AX, AL, DZ, AS, AD, AO, AI, AQ, AG, AR, AM, AW, AU, AT, AZ, BS, BH, BD, BB, BY, BE, BZ, BJ, BM, BT, BO, BQ, BA, BW, BV, BR, IO, BN, BG, BF, BI, CV, KH, CM, CA, KY, CF, TD, CL, CN, CX, CC, CO, KM, CG, CD, CK, CR, CI, HR, CU, CW, CY, CZ, DK, DJ, DM, DO, EC, EG, SV, GQ, ER, EE, SZ, ET, FK, FO, FJ, FI, FR, GF, PF, TF, GA, GM, GE, DE, GH, GI, GR, GL, GD, GP, GU, GT, GG, GN, GW, GY, HT, HM, VA, HN, HK, HU, IS, IN, ID, IR, IQ, IE, IM, IL, IT, JM, JP, JE, JO, KZ, KE, KI, KP, KR, XK, KW, KG, LA, LV, LB, LS, LR, LY, LI, LT, LU, MO, MG, MW, MY, MV, ML, MT, MH, MQ, MR, MU, YT, MX, FM, MD, MC, MN, ME, MS, MA, MZ, MM, NA, NR, NP, NL, NC, NZ, NI, NE, NG, NU, NF, MK, MP, NO, OM, PK, PW, PS, PA, PG, PY, PE, PH, PN, PL, PT, PR, QA, RE, RO, RU, RW, BL, SH, KN, LC, MF, PM, VC, WS, SM, ST, SA, SN, RS, SC, SL, SG, SX, SK, SI, SB, SO, ZA, GS, SS, ES, LK, SD, SR, SJ, SE, CH, SY, TW, TJ, TZ, TH, TL, TG, TK, TO, TT, TN, TR, TM, TC, TV, UG, UA, AE, GB, UM, US, UY, UZ, VU, VE, VN, VG, VI, WF, EH, YE, ZM, ZW "ES"
The full name of the Customer
3 - 255"Steve Jobs"