curl --request POST \
--url https://{your-subdomain}.neetocal.com/api/external/v2/meetings/{meeting_sid}/add-on-services \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--data '
{
"name": "Sauna",
"description": "20 minutes in the sauna",
"duration": 30,
"price": 25.5,
"position": 1
}
'const options = {
method: 'POST',
headers: {'X-Api-Key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Sauna',
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', 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"
payload = {
"name": "Sauna",
"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.post(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"
}
}Create add-on service
Create an add-on service for a scheduling link. People booking the scheduling link can choose it, which adds its duration to the booking and its price to the amount charged. Images can only be added from the NeetoCal app.
curl --request POST \
--url https://{your-subdomain}.neetocal.com/api/external/v2/meetings/{meeting_sid}/add-on-services \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--data '
{
"name": "Sauna",
"description": "20 minutes in the sauna",
"duration": 30,
"price": 25.5,
"position": 1
}
'const options = {
method: 'POST',
headers: {'X-Api-Key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Sauna',
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', 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"
payload = {
"name": "Sauna",
"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.post(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"
Body
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. 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
Position to insert the add-on service at, from 1 to the current number of add-on services plus one. The add-on services at and after that position move down by one. Defaults to the end of the list.
1
Response
Created - Add-on service created 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"