curl --request PUT \
--url https://{your-subdomain}.neetocal.com/api/external/v2/meetings/{meeting_sid}/add-on-services/{id} \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--data '
{
"name": "Deep tissue massage",
"description": "20 minutes in the sauna",
"duration": 30,
"price": 25.5,
"position": 1
}
'const options = {
method: 'PUT',
headers: {'X-Api-Key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Deep tissue massage',
description: '20 minutes in the sauna',
duration: 30,
price: 25.5,
position: 1
})
};
fetch('https://{your-subdomain}.neetocal.com/api/external/v2/meetings/{meeting_sid}/add-on-services/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{your-subdomain}.neetocal.com/api/external/v2/meetings/{meeting_sid}/add-on-services/{id}"
payload = {
"name": "Deep tissue massage",
"description": "20 minutes in the sauna",
"duration": 30,
"price": 25.5,
"position": 1
}
headers = {
"X-Api-Key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text){
"add_on_service": {
"id": "77150ec6-d4f0-4665-98f0-34bda69f7b3a",
"name": "Sauna",
"description": "20 minutes in the sauna",
"duration": 30,
"position": 1,
"price": "25.5",
"currency": "usd",
"payment_provider": "stripe",
"created_at": "2026-10-06T18:26:08.033Z",
"updated_at": "2026-10-06T18:26:08.264Z"
}
}Update add-on service
Update an add-on service of a scheduling link. Send only the fields you want to change. Omitting price leaves the current price unchanged. Bookings already made keep the name, duration and price they were booked with.
curl --request PUT \
--url https://{your-subdomain}.neetocal.com/api/external/v2/meetings/{meeting_sid}/add-on-services/{id} \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--data '
{
"name": "Deep tissue massage",
"description": "20 minutes in the sauna",
"duration": 30,
"price": 25.5,
"position": 1
}
'const options = {
method: 'PUT',
headers: {'X-Api-Key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Deep tissue massage',
description: '20 minutes in the sauna',
duration: 30,
price: 25.5,
position: 1
})
};
fetch('https://{your-subdomain}.neetocal.com/api/external/v2/meetings/{meeting_sid}/add-on-services/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{your-subdomain}.neetocal.com/api/external/v2/meetings/{meeting_sid}/add-on-services/{id}"
payload = {
"name": "Deep tissue massage",
"description": "20 minutes in the sauna",
"duration": 30,
"price": 25.5,
"position": 1
}
headers = {
"X-Api-Key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text){
"add_on_service": {
"id": "77150ec6-d4f0-4665-98f0-34bda69f7b3a",
"name": "Sauna",
"description": "20 minutes in the sauna",
"duration": 30,
"position": 1,
"price": "25.5",
"currency": "usd",
"payment_provider": "stripe",
"created_at": "2026-10-06T18:26:08.033Z",
"updated_at": "2026-10-06T18:26:08.264Z"
}
}{your-subdomain} with your workspace’s subdomain. Learn how to find your subdomain in Workspace subdomain.
Headers
Use the X-Api-Key header to provide your workspace API key. Refer to Authentication for more information.
Path Parameters
The unique identifier (SID) of the scheduling link you want to use. You can get sid in different ways. Visit the scheduling link page and then click on "Settings" > "Show SID". That will give you sid. You can also get this from the response of the List scheduling links endpoint, where it appears as the sid property for each scheduling link in the response.
"vj5pgkh"
The unique identifier of the add-on service. You can get this id from the response of the List add-on services endpoint.
"77150ec6-d4f0-4665-98f0-34bda69f7b3a"
Body
Name of the add-on service shown to the person booking.
"Deep tissue massage"
Description of the add-on service.
"20 minutes in the sauna"
Minutes the add-on service adds to the booking. Must be 0 for group meetings, because everyone in a group meeting shares the same slot.
0 <= x <= 144030
Price in the major unit of the scheduling link's currency, for example 25.5. The currency and payment provider are taken from the scheduling link's fee, so a positive price needs payments to be enabled on the scheduling link. Pass 0 or null to make the add-on service free. A price above the payment provider's maximum for the currency returns a 422 error.
25.5
New position, from 1 to the current number of add-on services. The other add-on services shift to make room.
1
Response
OK - Add-on service updated successfully
Hide child attributes
Hide child attributes
Unique identifier for the add-on service.
"77150ec6-d4f0-4665-98f0-34bda69f7b3a"
Name of the add-on service shown to the person booking.
"Sauna"
Description of the add-on service.
"20 minutes in the sauna"
Minutes the add-on service adds to the booking.
0 <= x <= 144030
Display order of the add-on service, starting at 1.
1
Price of the add-on service in the major unit of currency, returned as a decimal string to keep its exact value (the request takes it as a number). null when the add-on service is free.
"25.5"
Currency of price, taken from the scheduling link's fee. null when the add-on service is free.
"usd"
Payment provider used to collect price, taken from the scheduling link's fee. null when the add-on service is free.
"stripe"
Timestamp when the add-on service was created.
"2026-10-06T18:26:08.033Z"
Timestamp when the add-on service was last updated.
"2026-10-06T18:26:08.264Z"