curl --request POST \
--url https://api.dialtu.com/api/v2/public/calendar/waitlist/entries/batch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"waitlist_id": 123,
"entries": [
{
"phone": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"email": "<string>",
"service_ids": [
123
],
"service_names": [
"<string>"
],
"priority": 1,
"preferred_professional_id": 123,
"earliest_date": "<string>",
"latest_date": "<string>",
"time_preference": "<string>",
"notes": "<string>"
}
]
}
'import requests
url = "https://api.dialtu.com/api/v2/public/calendar/waitlist/entries/batch"
payload = {
"waitlist_id": 123,
"entries": [
{
"phone": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"email": "<string>",
"service_ids": [123],
"service_names": ["<string>"],
"priority": 1,
"preferred_professional_id": 123,
"earliest_date": "<string>",
"latest_date": "<string>",
"time_preference": "<string>",
"notes": "<string>"
}
]
}
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({
waitlist_id: 123,
entries: [
{
phone: '<string>',
first_name: '<string>',
last_name: '<string>',
email: '<string>',
service_ids: [123],
service_names: ['<string>'],
priority: 1,
preferred_professional_id: 123,
earliest_date: '<string>',
latest_date: '<string>',
time_preference: '<string>',
notes: '<string>'
}
]
})
};
fetch('https://api.dialtu.com/api/v2/public/calendar/waitlist/entries/batch', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"data": {
"waitlist_id": 123,
"clients_created": 123,
"entries_created": 123,
"skipped": 123,
"summary": {},
"rows": [
{
"index": 123,
"status": "<string>",
"errors": [
"<string>"
],
"warnings": [
"<string>"
],
"phone": "<string>",
"email": "<string>",
"client_id": 123
}
]
},
"status": "success"
}Add many clients to a waiting list
Bulk version of POST /entries for one list: up to 500 rows, one
atomic write, a result per row.
Authentication: Public API Key (Bearer token)
Runs the same engine as the dashboard spreadsheet import: contacts are
matched by phone (then email) and created when unknown, rows are deduped
within the batch, and a (client, service) pair that is already waiting is
reported as already_waiting and left untouched — so re-sending a batch
is safe. With skip_invalid: false (default) any row error refuses the
whole batch with IMPORT_HAS_ERRORS; with true the valid rows are
written and the rest come back with their errors.
curl --request POST \
--url https://api.dialtu.com/api/v2/public/calendar/waitlist/entries/batch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"waitlist_id": 123,
"entries": [
{
"phone": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"email": "<string>",
"service_ids": [
123
],
"service_names": [
"<string>"
],
"priority": 1,
"preferred_professional_id": 123,
"earliest_date": "<string>",
"latest_date": "<string>",
"time_preference": "<string>",
"notes": "<string>"
}
]
}
'import requests
url = "https://api.dialtu.com/api/v2/public/calendar/waitlist/entries/batch"
payload = {
"waitlist_id": 123,
"entries": [
{
"phone": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"email": "<string>",
"service_ids": [123],
"service_names": ["<string>"],
"priority": 1,
"preferred_professional_id": 123,
"earliest_date": "<string>",
"latest_date": "<string>",
"time_preference": "<string>",
"notes": "<string>"
}
]
}
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({
waitlist_id: 123,
entries: [
{
phone: '<string>',
first_name: '<string>',
last_name: '<string>',
email: '<string>',
service_ids: [123],
service_names: ['<string>'],
priority: 1,
preferred_professional_id: 123,
earliest_date: '<string>',
latest_date: '<string>',
time_preference: '<string>',
notes: '<string>'
}
]
})
};
fetch('https://api.dialtu.com/api/v2/public/calendar/waitlist/entries/batch', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"data": {
"waitlist_id": 123,
"clients_created": 123,
"entries_created": 123,
"skipped": 123,
"summary": {},
"rows": [
{
"index": 123,
"status": "<string>",
"errors": [
"<string>"
],
"warnings": [
"<string>"
],
"phone": "<string>",
"email": "<string>",
"client_id": 123
}
]
},
"status": "success"
}Authorizations
API key created in the dashboard under Settings → API Keys. Send it as Authorization: Bearer pk_....
Body
Body of POST /calendar/waitlist/entries/batch.
Target waiting list
Up to 500 rows per call
1 - 500 elementsShow child attributes
Show child attributes
ISO-3166 alpha-2 applied to phones without a country code, e.g. CO
true: write the valid rows and report the rest; false (default): refuse the whole batch when any row has errors
true: never create contacts; unknown phones/emails are errors