Greetings and music on hold
Audio covers hold music, hold messages, voicemail greetings and text to speech voices. Audio can be uploaded as a file, sent as base64, or generated from a script.
In the Key Admin this is the Greetings and music on hold switch. Read lets a key call the GET endpoints below. Write lets it call the ones that change data.
List hold music files
/domains/~/mohReturns the hold music files on the account.
Read Key Admin switch: Greetings and music on hold, Read. Read only keys also work.
Example request
curl -X GET "https://api.noodlevoice.com/ns-api/v2/domains/~/moh" \
-H "Authorization: Bearer $NOODLEVOICE_KEY"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/moh", {
method: "GET",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();import os, requests
r = requests.get(
"https://api.noodlevoice.com/ns-api/v2/domains/~/moh",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
)
print(r.status_code, r.json())Response 200
[
{
"filename": "string",
"ordinal-order": 1,
"file-duration-seconds": 1,
"file-size-kilobytes": "string",
"created-datetime": "2026-11-02 09:00:00",
"file-access-url": "https://example.com/webhooks/noodlevoice",
"file-script-text": "string",
"file-source": "string",
"...": "11 more fields"
}
]Response fields (19)
| Field | Type | Notes |
|---|---|---|
filename | string | |
ordinal-order | integer | |
file-duration-seconds | integer | File duration, in seconds. |
file-size-kilobytes | string | |
created-datetime | string | Created (date and time). |
file-access-url | string | |
file-script-text | string | |
file-source | string | |
text-to-speech-voice-id | string | ID of the text to speech voice. Default en-US-Wavenet-C |
text-to-speech-language | string | Default en_US |
FromName | string | |
FromUser | string | |
FromHost | string | |
NmsAni | string | |
recorded-datetime | string | Recorded (date and time). |
NmsRecStartTime | string | |
NmsRecDuration | string | |
TimeZone | string | |
transcription | string |
Count hold music files
/domains/~/moh/countReturns how many hold music files there are on the account, as {"total": n}.
Read Key Admin switch: Greetings and music on hold, Read. Read only keys also work.
Example request
curl -X GET "https://api.noodlevoice.com/ns-api/v2/domains/~/moh/count" \
-H "Authorization: Bearer $NOODLEVOICE_KEY"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/moh/count", {
method: "GET",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();import os, requests
r = requests.get(
"https://api.noodlevoice.com/ns-api/v2/domains/~/moh/count",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
)
print(r.status_code, r.json())Response 200
Returns a status code with a short JSON message.
Other responses: 400, 401, 403, 404. See errors.
List hold messages
/domains/~/msgReturns the hold messages on the account.
Read Key Admin switch: Greetings and music on hold, Read. Read only keys also work.
Example request
curl -X GET "https://api.noodlevoice.com/ns-api/v2/domains/~/msg" \
-H "Authorization: Bearer $NOODLEVOICE_KEY"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/msg", {
method: "GET",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();import os, requests
r = requests.get(
"https://api.noodlevoice.com/ns-api/v2/domains/~/msg",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
)
print(r.status_code, r.json())Response 200
[
{
"filename": "string",
"ordinal-order": 1,
"file-duration-seconds": 1,
"file-size-kilobytes": "string",
"created-datetime": "2026-11-02 09:00:00",
"file-access-url": "https://example.com/webhooks/noodlevoice",
"file-script-text": "string",
"file-source": "string",
"...": "11 more fields"
}
]Response fields (19)
| Field | Type | Notes |
|---|---|---|
filename | string | |
ordinal-order | integer | |
file-duration-seconds | integer | File duration, in seconds. |
file-size-kilobytes | string | |
created-datetime | string | Created (date and time). |
file-access-url | string | |
file-script-text | string | |
file-source | string | |
text-to-speech-voice-id | string | ID of the text to speech voice. Default en-US-Wavenet-C |
text-to-speech-language | string | Default en_US |
FromName | string | |
FromUser | string | |
FromHost | string | |
NmsAni | string | |
recorded-datetime | string | Recorded (date and time). |
NmsRecStartTime | string | |
NmsRecDuration | string | |
TimeZone | string | |
transcription | string |
Count hold messages
/domains/~/msg/countReturns how many hold messages there are on the account, as {"total": n}.
Read Key Admin switch: Greetings and music on hold, Read. Read only keys also work.
Example request
curl -X GET "https://api.noodlevoice.com/ns-api/v2/domains/~/msg/count" \
-H "Authorization: Bearer $NOODLEVOICE_KEY"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/msg/count", {
method: "GET",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();import os, requests
r = requests.get(
"https://api.noodlevoice.com/ns-api/v2/domains/~/msg/count",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
)
print(r.status_code, r.json())Response 200
Returns a status code with a short JSON message.
Other responses: 400, 401, 403, 404. See errors.
Upload hold music (base64)
/domains/~/mohAdds a hold music file for the account. Send the audio as a base64 string inside JSON.
Write Key Admin switch: Greetings and music on hold, Write.
Request body application/json
| Field | Type | Notes |
|---|---|---|
synchronous required | string | Set to yes to wait until the change is finished before the response comes back. One of: yes, no Default no |
index | integer | The audio slot number. |
script required | string | Words to turn into speech. |
convert | string | Set to yes to convert the audio to the format the system needs. One of: yes, no Default no |
encoding | string | How the file is encoded, for example base64. |
base64_file | string | The audio file as a base64 string. |
Example request
curl -X POST "https://api.noodlevoice.com/ns-api/v2/domains/~/moh" \
-H "Authorization: Bearer $NOODLEVOICE_KEY" \
-H "Content-Type: application/json" \
-d '{
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
}'const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/moh", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://api.noodlevoice.com/ns-api/v2/domains/~/moh",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
json={
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
},
)
print(r.status_code, r.json())Response 202
{
"code": 1,
"message": "Hello from NoodleVoice"
}Response fields (2)
| Field | Type | Notes |
|---|---|---|
code | integer | HTTP status code. |
message | string | What happened, in words. |
Upload hold music (file upload)
/domains/~/mohAdds a hold music file for the account using a multipart form upload.
Write Key Admin switch: Greetings and music on hold, Write.
Request body multipart/form-data
| Field | Type | Notes |
|---|---|---|
script | string | Words to turn into speech. |
File | string (binary) | The audio file. |
index | integer | The audio slot number. |
convert | string | Set to yes to convert the audio to the format the system needs. |
synchronous required | string | Set to yes to wait until the change is finished before the response comes back. |
Example request
curl -X POST "https://api.noodlevoice.com/ns-api/v2/domains/~/moh" \
-H "Authorization: Bearer $NOODLEVOICE_KEY" \
-F "synchronous=string"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/moh", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();Response 202
Returns a status code with a short JSON message.
Create hold audio from text
/domains/~/mohAdds hold audio for the account by turning a script into speech.
Write Key Admin switch: Greetings and music on hold, Write.
Request body application/json
| Field | Type | Notes |
|---|---|---|
synchronous required | string | Set to yes to wait until the change is finished before the response comes back. One of: yes, no Default no |
index | integer | The audio slot number. |
script required | string | Words to turn into speech. |
voice_language | string | Language for text to speech, like en-US. Default en-US |
voice_id | string | Which text to speech voice to use. Default en-US-Wavenet-C |
Example request
curl -X POST "https://api.noodlevoice.com/ns-api/v2/domains/~/moh" \
-H "Authorization: Bearer $NOODLEVOICE_KEY" \
-H "Content-Type: application/json" \
-d '{
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
}'const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/moh", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://api.noodlevoice.com/ns-api/v2/domains/~/moh",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
json={
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
},
)
print(r.status_code, r.json())Response 200
{
"filename": "string",
"ordinal-order": 1,
"file-duration-seconds": 1,
"file-size-kilobytes": "string",
"created-datetime": "2026-11-02 09:00:00",
"file-access-url": "https://example.com/webhooks/noodlevoice",
"file-script-text": "string",
"file-source": "string",
"...": "11 more fields"
}Response fields (19)
| Field | Type | Notes |
|---|---|---|
filename | string | |
ordinal-order | integer | |
file-duration-seconds | integer | File duration, in seconds. |
file-size-kilobytes | string | |
created-datetime | string | Created (date and time). |
file-access-url | string | |
file-script-text | string | |
file-source | string | |
text-to-speech-voice-id | string | ID of the text to speech voice. Default en-US-Wavenet-C |
text-to-speech-language | string | Default en_US |
FromName | string | |
FromUser | string | |
FromHost | string | |
NmsAni | string | |
recorded-datetime | string | Recorded (date and time). |
NmsRecStartTime | string | |
NmsRecDuration | string | |
TimeZone | string | |
transcription | string |
Create a hold message
/domains/~/msgAdds a new hold message on the account.
Write Key Admin switch: Greetings and music on hold, Write.
Request body multipart/form-data
| Field | Type | Notes |
|---|---|---|
script | string | Words to turn into speech. |
File | string (binary) | The audio file. |
index | integer | The audio slot number. |
convert | string | Set to yes to convert the audio to the format the system needs. |
synchronous required | string | Set to yes to wait until the change is finished before the response comes back. |
Example request
curl -X POST "https://api.noodlevoice.com/ns-api/v2/domains/~/msg" \
-H "Authorization: Bearer $NOODLEVOICE_KEY" \
-F "synchronous=string"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/msg", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();Response 202
Returns a status code with a short JSON message.
Replace hold music (base64)
/domains/~/moh/{index}Replaces one of the account's hold music files with audio sent as base64 inside JSON.
Write Key Admin switch: Greetings and music on hold, Write.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
index required | path | string | The slot number of the audio file, as returned when you list them. |
Request body application/json
| Field | Type | Notes |
|---|---|---|
synchronous required | string | Set to yes to wait until the change is finished before the response comes back. One of: yes, no Default no |
script required | string | Words to turn into speech. |
convert | string | Set to yes to convert the audio to the format the system needs. One of: yes, no Default no |
encoding | string | How the file is encoded, for example base64. |
base64_file | string | The audio file as a base64 string. |
Example request
curl -X PUT "https://api.noodlevoice.com/ns-api/v2/domains/~/moh/1" \
-H "Authorization: Bearer $NOODLEVOICE_KEY" \
-H "Content-Type: application/json" \
-d '{
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
}'const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/moh/1", {
method: "PUT",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
}),
});
const data = await res.json();import os, requests
r = requests.put(
"https://api.noodlevoice.com/ns-api/v2/domains/~/moh/1",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
json={
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
},
)
print(r.status_code, r.json())Response 202
{
"code": 1,
"message": "Hello from NoodleVoice"
}Response fields (2)
| Field | Type | Notes |
|---|---|---|
code | integer | HTTP status code. |
message | string | What happened, in words. |
Replace hold music (file upload)
/domains/~/moh/{index}Replaces one of the account's hold music files using a multipart form upload.
Write Key Admin switch: Greetings and music on hold, Write.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
index required | path | string | The slot number of the audio file, as returned when you list them. |
Request body multipart/form-data
| Field | Type | Notes |
|---|---|---|
script | string | Words to turn into speech. |
File | string (binary) | The audio file. |
convert | string | Set to yes to convert the audio to the format the system needs. |
synchronous required | string | Set to yes to wait until the change is finished before the response comes back. |
Example request
curl -X PUT "https://api.noodlevoice.com/ns-api/v2/domains/~/moh/1" \
-H "Authorization: Bearer $NOODLEVOICE_KEY" \
-F "synchronous=string"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/moh/1", {
method: "PUT",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();Response 202
Returns a status code with a short JSON message.
Replace hold audio with text to speech
/domains/~/moh/{index}Replaces one of the account's hold music files with speech made from a script.
Write Key Admin switch: Greetings and music on hold, Write.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
index required | path | string | The slot number of the audio file, as returned when you list them. |
Request body application/json
| Field | Type | Notes |
|---|---|---|
synchronous required | string | Set to yes to wait until the change is finished before the response comes back. One of: yes, no Default no |
script required | string | Words to turn into speech. |
voice_language | string | Language for text to speech, like en-US. Default en-US |
voice_id | string | Which text to speech voice to use. Default en-US-Wavenet-C |
Example request
curl -X PUT "https://api.noodlevoice.com/ns-api/v2/domains/~/moh/1" \
-H "Authorization: Bearer $NOODLEVOICE_KEY" \
-H "Content-Type: application/json" \
-d '{
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
}'const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/moh/1", {
method: "PUT",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
}),
});
const data = await res.json();import os, requests
r = requests.put(
"https://api.noodlevoice.com/ns-api/v2/domains/~/moh/1",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
json={
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
},
)
print(r.status_code, r.json())Response 200
{
"filename": "string",
"ordinal-order": 1,
"file-duration-seconds": 1,
"file-size-kilobytes": "string",
"created-datetime": "2026-11-02 09:00:00",
"file-access-url": "https://example.com/webhooks/noodlevoice",
"file-script-text": "string",
"file-source": "string",
"...": "11 more fields"
}Response fields (19)
| Field | Type | Notes |
|---|---|---|
filename | string | |
ordinal-order | integer | |
file-duration-seconds | integer | File duration, in seconds. |
file-size-kilobytes | string | |
created-datetime | string | Created (date and time). |
file-access-url | string | |
file-script-text | string | |
file-source | string | |
text-to-speech-voice-id | string | ID of the text to speech voice. Default en-US-Wavenet-C |
text-to-speech-language | string | Default en_US |
FromName | string | |
FromUser | string | |
FromHost | string | |
NmsAni | string | |
recorded-datetime | string | Recorded (date and time). |
NmsRecStartTime | string | |
NmsRecDuration | string | |
TimeZone | string | |
transcription | string |
Update a hold message
/domains/~/msg/{index}Changes an existing hold message. Send the fields you want to set in the body.
Write Key Admin switch: Greetings and music on hold, Write.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
index required | path | string | The slot number of the audio file, as returned when you list them. |
Request body multipart/form-data
| Field | Type | Notes |
|---|---|---|
script | string | Words to turn into speech. |
File | string (binary) | The audio file. |
convert | string | Set to yes to convert the audio to the format the system needs. |
synchronous required | string | Set to yes to wait until the change is finished before the response comes back. |
Example request
curl -X PUT "https://api.noodlevoice.com/ns-api/v2/domains/~/msg/1" \
-H "Authorization: Bearer $NOODLEVOICE_KEY" \
-F "synchronous=string"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/msg/1", {
method: "PUT",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();Response 202
Returns a status code with a short JSON message.
Delete a hold music file
/domains/~/moh/{index}Removes a hold music file. This can't be undone.
Write Key Admin switch: Greetings and music on hold, Write.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
index required | path | string | The slot number of the audio file, as returned when you list them. |
Example request
curl -X DELETE "https://api.noodlevoice.com/ns-api/v2/domains/~/moh/1" \
-H "Authorization: Bearer $NOODLEVOICE_KEY"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/moh/1", {
method: "DELETE",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();import os, requests
r = requests.delete(
"https://api.noodlevoice.com/ns-api/v2/domains/~/moh/1",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
)
print(r.status_code, r.json())Response 202
Returns a status code with a short JSON message.
Delete a hold message
/domains/~/msg/{index}Removes a hold message. This can't be undone.
Write Key Admin switch: Greetings and music on hold, Write.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
index required | path | string | The slot number of the audio file, as returned when you list them. |
Example request
curl -X DELETE "https://api.noodlevoice.com/ns-api/v2/domains/~/msg/1" \
-H "Authorization: Bearer $NOODLEVOICE_KEY"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/msg/1", {
method: "DELETE",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();import os, requests
r = requests.delete(
"https://api.noodlevoice.com/ns-api/v2/domains/~/msg/1",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
)
print(r.status_code, r.json())Response 202
Returns a status code with a short JSON message.
List voicemail greetings for a user
/domains/~/users/{user}/greetingsReturns the voicemail greetings for one user.
Read Key Admin switch: Greetings and music on hold, Read. Read only keys also work.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
Example request
curl -X GET "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings" \
-H "Authorization: Bearer $NOODLEVOICE_KEY"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings", {
method: "GET",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();import os, requests
r = requests.get(
"https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
)
print(r.status_code, r.json())Response 200
[
{
"filename": "string",
"ordinal-order": 1,
"file-duration-seconds": 1,
"file-size-kilobytes": "string",
"created-datetime": "2026-11-02 09:00:00",
"file-access-url": "https://example.com/webhooks/noodlevoice",
"file-script-text": "string",
"file-source": "string",
"...": "11 more fields"
}
]Response fields (19)
| Field | Type | Notes |
|---|---|---|
filename | string | |
ordinal-order | integer | |
file-duration-seconds | integer | File duration, in seconds. |
file-size-kilobytes | string | |
created-datetime | string | Created (date and time). |
file-access-url | string | |
file-script-text | string | |
file-source | string | |
text-to-speech-voice-id | string | ID of the text to speech voice. Default en-US-Wavenet-C |
text-to-speech-language | string | Default en_US |
FromName | string | |
FromUser | string | |
FromHost | string | |
NmsAni | string | |
recorded-datetime | string | Recorded (date and time). |
NmsRecStartTime | string | |
NmsRecDuration | string | |
TimeZone | string | |
transcription | string |
Count voicemail greetings for a user
/domains/~/users/{user}/greetings/countReturns how many voicemail greetings there are for one user, as {"total": n}.
Read Key Admin switch: Greetings and music on hold, Read. Read only keys also work.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
Example request
curl -X GET "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings/count" \
-H "Authorization: Bearer $NOODLEVOICE_KEY"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings/count", {
method: "GET",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();import os, requests
r = requests.get(
"https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings/count",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
)
print(r.status_code, r.json())Response 200
Returns a status code with a short JSON message.
Other responses: 400, 401, 403, 404. See errors.
Get a user's voicemail greeting
/domains/~/users/{user}/greetings/{index}Returns one of a user's voicemail greetings.
Read Key Admin switch: Greetings and music on hold, Read. Read only keys also work.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
index required | path | string | The slot number of the audio file, as returned when you list them. |
Example request
curl -X GET "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings/1" \
-H "Authorization: Bearer $NOODLEVOICE_KEY"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings/1", {
method: "GET",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();import os, requests
r = requests.get(
"https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings/1",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
)
print(r.status_code, r.json())Response 200
{
"filename": "string",
"ordinal-order": 1,
"file-duration-seconds": 1,
"file-size-kilobytes": "string",
"created-datetime": "2026-11-02 09:00:00",
"file-access-url": "https://example.com/webhooks/noodlevoice",
"file-script-text": "string",
"file-source": "string",
"...": "11 more fields"
}Response fields (19)
| Field | Type | Notes |
|---|---|---|
filename | string | |
ordinal-order | integer | |
file-duration-seconds | integer | File duration, in seconds. |
file-size-kilobytes | string | |
created-datetime | string | Created (date and time). |
file-access-url | string | |
file-script-text | string | |
file-source | string | |
text-to-speech-voice-id | string | ID of the text to speech voice. Default en-US-Wavenet-C |
text-to-speech-language | string | Default en_US |
FromName | string | |
FromUser | string | |
FromHost | string | |
NmsAni | string | |
recorded-datetime | string | Recorded (date and time). |
NmsRecStartTime | string | |
NmsRecDuration | string | |
TimeZone | string | |
transcription | string |
List hold music files for a user
/domains/~/users/{user}/mohReturns the hold music files for one user.
Read Key Admin switch: Greetings and music on hold, Read. Read only keys also work.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
Example request
curl -X GET "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh" \
-H "Authorization: Bearer $NOODLEVOICE_KEY"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh", {
method: "GET",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();import os, requests
r = requests.get(
"https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
)
print(r.status_code, r.json())Response 200
[
{
"filename": "string",
"ordinal-order": 1,
"file-duration-seconds": 1,
"file-size-kilobytes": "string",
"created-datetime": "2026-11-02 09:00:00",
"file-access-url": "https://example.com/webhooks/noodlevoice",
"file-script-text": "string",
"file-source": "string",
"...": "11 more fields"
}
]Response fields (19)
| Field | Type | Notes |
|---|---|---|
filename | string | |
ordinal-order | integer | |
file-duration-seconds | integer | File duration, in seconds. |
file-size-kilobytes | string | |
created-datetime | string | Created (date and time). |
file-access-url | string | |
file-script-text | string | |
file-source | string | |
text-to-speech-voice-id | string | ID of the text to speech voice. Default en-US-Wavenet-C |
text-to-speech-language | string | Default en_US |
FromName | string | |
FromUser | string | |
FromHost | string | |
NmsAni | string | |
recorded-datetime | string | Recorded (date and time). |
NmsRecStartTime | string | |
NmsRecDuration | string | |
TimeZone | string | |
transcription | string |
Count hold music files for a user
/domains/~/users/{user}/moh/countReturns how many hold music files there are for one user, as {"total": n}.
Read Key Admin switch: Greetings and music on hold, Read. Read only keys also work.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
Example request
curl -X GET "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh/count" \
-H "Authorization: Bearer $NOODLEVOICE_KEY"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh/count", {
method: "GET",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();import os, requests
r = requests.get(
"https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh/count",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
)
print(r.status_code, r.json())Response 200
Returns a status code with a short JSON message.
Other responses: 400, 401, 403, 404. See errors.
List hold messages for a user
/domains/~/users/{user}/msgReturns the hold messages for one user.
Read Key Admin switch: Greetings and music on hold, Read. Read only keys also work.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
Example request
curl -X GET "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/msg" \
-H "Authorization: Bearer $NOODLEVOICE_KEY"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/msg", {
method: "GET",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();import os, requests
r = requests.get(
"https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/msg",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
)
print(r.status_code, r.json())Response 200
[
{
"filename": "string",
"ordinal-order": 1,
"file-duration-seconds": 1,
"file-size-kilobytes": "string",
"created-datetime": "2026-11-02 09:00:00",
"file-access-url": "https://example.com/webhooks/noodlevoice",
"file-script-text": "string",
"file-source": "string",
"...": "11 more fields"
}
]Response fields (19)
| Field | Type | Notes |
|---|---|---|
filename | string | |
ordinal-order | integer | |
file-duration-seconds | integer | File duration, in seconds. |
file-size-kilobytes | string | |
created-datetime | string | Created (date and time). |
file-access-url | string | |
file-script-text | string | |
file-source | string | |
text-to-speech-voice-id | string | ID of the text to speech voice. Default en-US-Wavenet-C |
text-to-speech-language | string | Default en_US |
FromName | string | |
FromUser | string | |
FromHost | string | |
NmsAni | string | |
recorded-datetime | string | Recorded (date and time). |
NmsRecStartTime | string | |
NmsRecDuration | string | |
TimeZone | string | |
transcription | string |
Count hold messages for a user
/domains/~/users/{user}/msg/countReturns how many hold messages there are for one user, as {"total": n}.
Read Key Admin switch: Greetings and music on hold, Read. Read only keys also work.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
Example request
curl -X GET "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/msg/count" \
-H "Authorization: Bearer $NOODLEVOICE_KEY"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/msg/count", {
method: "GET",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();import os, requests
r = requests.get(
"https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/msg/count",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
)
print(r.status_code, r.json())Response 200
Returns a status code with a short JSON message.
Other responses: 400, 401, 403, 404. See errors.
Preview text to speech
/domains/~/users/{user}/voicesReturns spoken audio for the script you pass, so you can hear it before saving a greeting.
Read Key Admin switch: Greetings and music on hold, Read. Read only keys also work.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
script | query | string | The words to speak. |
Example request
curl -X GET "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/voices" \
-H "Authorization: Bearer $NOODLEVOICE_KEY"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/voices", {
method: "GET",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();import os, requests
r = requests.get(
"https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/voices",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
)
print(r.status_code, r.json())Response 200
Returns a status code with a short JSON message.
List voices for a language
/domains/~/users/{user}/voices/{language}Returns the text to speech voices available in one language.
Read Key Admin switch: Greetings and music on hold, Read. Read only keys also work.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
language required | path | string | Language code, like en-US. |
gender | query | string | Only return voices of this gender. |
vendor | query | string | Only return voices from this speech engine. |
id | query | string | The ID of the item, as returned when you list or create it. |
name | query | string | The name of the item. |
Example request
curl -X GET "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/voices/en-US" \
-H "Authorization: Bearer $NOODLEVOICE_KEY"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/voices/en-US", {
method: "GET",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();import os, requests
r = requests.get(
"https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/voices/en-US",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
)
print(r.status_code, r.json())Response 200
[
{
"gender": "string",
"id": "string",
"languageCode": "string",
"name": "Front Desk",
"type": "string",
"subType": "string"
}
]Response fields (6)
| Field | Type | Notes |
|---|---|---|
gender | string | |
id | string | The item's ID. |
languageCode | string | |
name | string | |
type | string | The kind of item. |
subType | string |
Upload a voicemail greeting (base64)
/domains/~/users/{user}/greetingsAdds a voicemail greeting for a user. Send the audio as base64 inside JSON.
Write Key Admin switch: Greetings and music on hold, Write.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
Request body application/json
| Field | Type | Notes |
|---|---|---|
synchronous required | string | Set to yes to wait until the change is finished before the response comes back. One of: yes, no Default no |
index | integer | The audio slot number. |
script required | string | Words to turn into speech. |
convert | string | Set to yes to convert the audio to the format the system needs. One of: yes, no Default no |
encoding | string | How the file is encoded, for example base64. |
base64_file | string | The audio file as a base64 string. |
voice_language | string | Language for text to speech, like en-US. Default en-US |
voice_id | string | Which text to speech voice to use. Default en-US-Wavenet-C |
Example request
curl -X POST "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings" \
-H "Authorization: Bearer $NOODLEVOICE_KEY" \
-H "Content-Type: application/json" \
-d '{
"script": "Thanks for calling. Please hold.",
"synchronous": "yes"
}'const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"script": "Thanks for calling. Please hold.",
"synchronous": "yes"
}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
json={
"script": "Thanks for calling. Please hold.",
"synchronous": "yes"
},
)
print(r.status_code, r.json())Response 202
{
"code": 1,
"message": "Hello from NoodleVoice"
}Response fields (2)
| Field | Type | Notes |
|---|---|---|
code | integer | HTTP status code. |
message | string | What happened, in words. |
Upload a voicemail greeting (file upload)
/domains/~/users/{user}/greetingsAdds a voicemail greeting for a user using a multipart form upload.
Write Key Admin switch: Greetings and music on hold, Write.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
Request body multipart/form-data
| Field | Type | Notes |
|---|---|---|
script | string | Words to turn into speech. |
File | string (binary) | The audio file. |
index | integer | The audio slot number. |
convert | string | Set to yes to convert the audio to the format the system needs. |
synchronous required | string | Set to yes to wait until the change is finished before the response comes back. |
Example request
curl -X POST "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings" \
-H "Authorization: Bearer $NOODLEVOICE_KEY" \
-F "synchronous=string"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();Response 202
Returns a status code with a short JSON message.
Create a voicemail greeting from text
/domains/~/users/{user}/greetingsAdds a voicemail greeting for a user by turning a script into speech.
Write Key Admin switch: Greetings and music on hold, Write.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
Request body application/json
| Field | Type | Notes |
|---|---|---|
synchronous required | string | Set to yes to wait until the change is finished before the response comes back. One of: yes, no Default no |
index | integer | The audio slot number. |
script required | string | Words to turn into speech. |
voice_language | string | Language for text to speech, like en-US. Default en-US |
voice_id | string | Which text to speech voice to use. Default en-US-Wavenet-C |
Example request
curl -X POST "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings" \
-H "Authorization: Bearer $NOODLEVOICE_KEY" \
-H "Content-Type: application/json" \
-d '{
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
}'const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
json={
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
},
)
print(r.status_code, r.json())Response 200
Returns a status code with a short JSON message.
Upload hold music for a user (base64)
/domains/~/users/{user}/mohAdds a hold music file for one user. Send the audio as base64 inside JSON.
Write Key Admin switch: Greetings and music on hold, Write.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
Request body application/json
| Field | Type | Notes |
|---|---|---|
synchronous required | string | Set to yes to wait until the change is finished before the response comes back. One of: yes, no Default no |
index | integer | The audio slot number. |
script required | string | Words to turn into speech. |
convert | string | Set to yes to convert the audio to the format the system needs. One of: yes, no Default no |
encoding | string | How the file is encoded, for example base64. |
base64_file | string | The audio file as a base64 string. |
Example request
curl -X POST "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh" \
-H "Authorization: Bearer $NOODLEVOICE_KEY" \
-H "Content-Type: application/json" \
-d '{
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
}'const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
json={
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
},
)
print(r.status_code, r.json())Response 202
{
"code": 1,
"message": "Hello from NoodleVoice"
}Response fields (2)
| Field | Type | Notes |
|---|---|---|
code | integer | HTTP status code. |
message | string | What happened, in words. |
Upload hold music for a user (file upload)
/domains/~/users/{user}/mohAdds a hold music file for one user using a multipart form upload.
Write Key Admin switch: Greetings and music on hold, Write.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
Request body multipart/form-data
| Field | Type | Notes |
|---|---|---|
script | string | Words to turn into speech. |
File | string (binary) | The audio file. |
index | integer | The audio slot number. |
convert | string | Set to yes to convert the audio to the format the system needs. |
synchronous required | string | Set to yes to wait until the change is finished before the response comes back. |
Example request
curl -X POST "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh" \
-H "Authorization: Bearer $NOODLEVOICE_KEY" \
-F "synchronous=string"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();Response 202
Returns a status code with a short JSON message.
Create hold audio for a user from text
/domains/~/users/{user}/mohAdds hold audio for one user by turning a script into speech.
Write Key Admin switch: Greetings and music on hold, Write.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
Request body application/json
| Field | Type | Notes |
|---|---|---|
synchronous required | string | Set to yes to wait until the change is finished before the response comes back. One of: yes, no Default no |
index | integer | The audio slot number. |
script required | string | Words to turn into speech. |
voice_language | string | Language for text to speech, like en-US. Default en-US |
voice_id | string | Which text to speech voice to use. Default en-US-Wavenet-C |
Example request
curl -X POST "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh" \
-H "Authorization: Bearer $NOODLEVOICE_KEY" \
-H "Content-Type: application/json" \
-d '{
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
}'const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
json={
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
},
)
print(r.status_code, r.json())Response 200
{
"filename": "string",
"ordinal-order": 1,
"file-duration-seconds": 1,
"file-size-kilobytes": "string",
"created-datetime": "2026-11-02 09:00:00",
"file-access-url": "https://example.com/webhooks/noodlevoice",
"file-script-text": "string",
"file-source": "string",
"...": "11 more fields"
}Response fields (19)
| Field | Type | Notes |
|---|---|---|
filename | string | |
ordinal-order | integer | |
file-duration-seconds | integer | File duration, in seconds. |
file-size-kilobytes | string | |
created-datetime | string | Created (date and time). |
file-access-url | string | |
file-script-text | string | |
file-source | string | |
text-to-speech-voice-id | string | ID of the text to speech voice. Default en-US-Wavenet-C |
text-to-speech-language | string | Default en_US |
FromName | string | |
FromUser | string | |
FromHost | string | |
NmsAni | string | |
recorded-datetime | string | Recorded (date and time). |
NmsRecStartTime | string | |
NmsRecDuration | string | |
TimeZone | string | |
transcription | string |
Create a hold message for a user
/domains/~/users/{user}/msgAdds a new hold message for one user.
Write Key Admin switch: Greetings and music on hold, Write.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
Request body multipart/form-data
| Field | Type | Notes |
|---|---|---|
script | string | Words to turn into speech. |
File | string (binary) | The audio file. |
index | integer | The audio slot number. |
convert | string | Set to yes to convert the audio to the format the system needs. |
synchronous required | string | Set to yes to wait until the change is finished before the response comes back. |
Example request
curl -X POST "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/msg" \
-H "Authorization: Bearer $NOODLEVOICE_KEY" \
-F "synchronous=string"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/msg", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();Response 202
Returns a status code with a short JSON message.
Replace a voicemail greeting (base64)
/domains/~/users/{user}/greetings/{index}Replaces a user's voicemail greeting with audio sent as base64 inside JSON.
Write Key Admin switch: Greetings and music on hold, Write.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
index required | path | string | The slot number of the audio file, as returned when you list them. |
Request body application/json
| Field | Type | Notes |
|---|---|---|
synchronous required | string | Set to yes to wait until the change is finished before the response comes back. One of: yes, no Default no |
index | integer | The audio slot number. |
script required | string | Words to turn into speech. |
convert | string | Set to yes to convert the audio to the format the system needs. One of: yes, no Default no |
encoding | string | How the file is encoded, for example base64. |
base64_file | string | The audio file as a base64 string. |
voice_language | string | Language for text to speech, like en-US. Default en-US |
voice_id | string | Which text to speech voice to use. Default en-US-Wavenet-C |
Example request
curl -X PUT "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings/1" \
-H "Authorization: Bearer $NOODLEVOICE_KEY" \
-H "Content-Type: application/json" \
-d '{
"script": "Thanks for calling. Please hold.",
"synchronous": "yes"
}'const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings/1", {
method: "PUT",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"script": "Thanks for calling. Please hold.",
"synchronous": "yes"
}),
});
const data = await res.json();import os, requests
r = requests.put(
"https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings/1",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
json={
"script": "Thanks for calling. Please hold.",
"synchronous": "yes"
},
)
print(r.status_code, r.json())Response 202
{
"code": 1,
"message": "Hello from NoodleVoice"
}Response fields (2)
| Field | Type | Notes |
|---|---|---|
code | integer | HTTP status code. |
message | string | What happened, in words. |
Replace a voicemail greeting (file upload)
/domains/~/users/{user}/greetings/{index}Replaces a user's voicemail greeting using a multipart form upload.
Write Key Admin switch: Greetings and music on hold, Write.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
index required | path | string | The slot number of the audio file, as returned when you list them. |
Request body multipart/form-data
| Field | Type | Notes |
|---|---|---|
script | string | Words to turn into speech. |
File | string (binary) | The audio file. |
convert | string | Set to yes to convert the audio to the format the system needs. |
synchronous | string | Set to yes to wait until the change is finished before the response comes back. |
Example request
curl -X PUT "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings/1" \
-H "Authorization: Bearer $NOODLEVOICE_KEY" \
-F "script=Thanks for calling. Please hold." \
-F "File=@greeting.wav" \
-F "convert=string" \
-F "synchronous=string"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings/1", {
method: "PUT",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();Response 202
Returns a status code with a short JSON message.
Replace a voicemail greeting with text to speech
/domains/~/users/{user}/greetings/{index}Replaces a user's voicemail greeting with speech made from a script.
Write Key Admin switch: Greetings and music on hold, Write.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
index required | path | string | The slot number of the audio file, as returned when you list them. |
Request body application/json
| Field | Type | Notes |
|---|---|---|
synchronous required | string | Set to yes to wait until the change is finished before the response comes back. One of: yes, no Default no |
script required | string | Words to turn into speech. |
convert | string | Set to yes to convert the audio to the format the system needs. One of: yes, no Default no |
encoding | string | How the file is encoded, for example base64. |
base64_file | string | The audio file as a base64 string. |
voice_language | string | Language for text to speech, like en-US. Default en-US |
voice_id | string | Which text to speech voice to use. Default en-US-Wavenet-C |
Example request
curl -X PUT "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings/1" \
-H "Authorization: Bearer $NOODLEVOICE_KEY" \
-H "Content-Type: application/json" \
-d '{
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
}'const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings/1", {
method: "PUT",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
}),
});
const data = await res.json();import os, requests
r = requests.put(
"https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings/1",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
json={
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
},
)
print(r.status_code, r.json())Response 200
Returns a status code with a short JSON message.
Replace a user's hold music (base64)
/domains/~/users/{user}/moh/{index}Replaces one of a user's hold music files with audio sent as base64.
Write Key Admin switch: Greetings and music on hold, Write.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
index required | path | string | The slot number of the audio file, as returned when you list them. |
Request body application/json
| Field | Type | Notes |
|---|---|---|
synchronous required | string | Set to yes to wait until the change is finished before the response comes back. One of: yes, no Default no |
script required | string | Words to turn into speech. |
convert | string | Set to yes to convert the audio to the format the system needs. One of: yes, no Default no |
encoding | string | How the file is encoded, for example base64. |
base64_file | string | The audio file as a base64 string. |
Example request
curl -X PUT "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh/1" \
-H "Authorization: Bearer $NOODLEVOICE_KEY" \
-H "Content-Type: application/json" \
-d '{
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
}'const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh/1", {
method: "PUT",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
}),
});
const data = await res.json();import os, requests
r = requests.put(
"https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh/1",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
json={
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
},
)
print(r.status_code, r.json())Response 202
{
"code": 1,
"message": "Hello from NoodleVoice"
}Response fields (2)
| Field | Type | Notes |
|---|---|---|
code | integer | HTTP status code. |
message | string | What happened, in words. |
Replace a user's hold music (file upload)
/domains/~/users/{user}/moh/{index}Replaces one of a user's hold music files using a multipart form upload.
Write Key Admin switch: Greetings and music on hold, Write.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
index required | path | string | The slot number of the audio file, as returned when you list them. |
Request body multipart/form-data
| Field | Type | Notes |
|---|---|---|
script | string | Words to turn into speech. |
File | string (binary) | The audio file. |
convert | string | Set to yes to convert the audio to the format the system needs. |
synchronous required | string | Set to yes to wait until the change is finished before the response comes back. |
Example request
curl -X PUT "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh/1" \
-H "Authorization: Bearer $NOODLEVOICE_KEY" \
-F "synchronous=string"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh/1", {
method: "PUT",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();Response 202
Returns a status code with a short JSON message.
Replace a user's hold audio with text to speech
/domains/~/users/{user}/moh/{index}Replaces one of a user's hold music files with speech made from a script.
Write Key Admin switch: Greetings and music on hold, Write.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
index required | path | string | The slot number of the audio file, as returned when you list them. |
Request body application/json
| Field | Type | Notes |
|---|---|---|
synchronous required | string | Set to yes to wait until the change is finished before the response comes back. One of: yes, no Default no |
script required | string | Words to turn into speech. |
voice_language | string | Language for text to speech, like en-US. Default en-US |
voice_id | string | Which text to speech voice to use. Default en-US-Wavenet-C |
Example request
curl -X PUT "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh/1" \
-H "Authorization: Bearer $NOODLEVOICE_KEY" \
-H "Content-Type: application/json" \
-d '{
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
}'const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh/1", {
method: "PUT",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
}),
});
const data = await res.json();import os, requests
r = requests.put(
"https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh/1",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
json={
"synchronous": "yes",
"script": "Thanks for calling. Please hold."
},
)
print(r.status_code, r.json())Response 200
{
"filename": "string",
"ordinal-order": 1,
"file-duration-seconds": 1,
"file-size-kilobytes": "string",
"created-datetime": "2026-11-02 09:00:00",
"file-access-url": "https://example.com/webhooks/noodlevoice",
"file-script-text": "string",
"file-source": "string",
"...": "11 more fields"
}Response fields (19)
| Field | Type | Notes |
|---|---|---|
filename | string | |
ordinal-order | integer | |
file-duration-seconds | integer | File duration, in seconds. |
file-size-kilobytes | string | |
created-datetime | string | Created (date and time). |
file-access-url | string | |
file-script-text | string | |
file-source | string | |
text-to-speech-voice-id | string | ID of the text to speech voice. Default en-US-Wavenet-C |
text-to-speech-language | string | Default en_US |
FromName | string | |
FromUser | string | |
FromHost | string | |
NmsAni | string | |
recorded-datetime | string | Recorded (date and time). |
NmsRecStartTime | string | |
NmsRecDuration | string | |
TimeZone | string | |
transcription | string |
Update a user's hold message
/domains/~/users/{user}/msg/{index}Changes one of a user's hold messages.
Write Key Admin switch: Greetings and music on hold, Write.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
index required | path | string | The slot number of the audio file, as returned when you list them. |
Request body multipart/form-data
| Field | Type | Notes |
|---|---|---|
script | string | Words to turn into speech. |
File | string (binary) | The audio file. |
convert | string | Set to yes to convert the audio to the format the system needs. |
synchronous required | string | Set to yes to wait until the change is finished before the response comes back. |
Example request
curl -X PUT "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/msg/1" \
-H "Authorization: Bearer $NOODLEVOICE_KEY" \
-F "synchronous=string"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/msg/1", {
method: "PUT",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();Response 202
Returns a status code with a short JSON message.
Delete a user's voicemail greeting
/domains/~/users/{user}/greetings/{index}Removes one of a user's voicemail greetings. This can't be undone.
Write Key Admin switch: Greetings and music on hold, Write.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
index required | path | string | The slot number of the audio file, as returned when you list them. |
Example request
curl -X DELETE "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings/1" \
-H "Authorization: Bearer $NOODLEVOICE_KEY"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings/1", {
method: "DELETE",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();import os, requests
r = requests.delete(
"https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/greetings/1",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
)
print(r.status_code, r.json())Response 202
{
"code": 1,
"message": "Hello from NoodleVoice"
}Response fields (2)
| Field | Type | Notes |
|---|---|---|
code | integer | HTTP status code. |
message | string | What happened, in words. |
Delete a user's hold music file
/domains/~/users/{user}/moh/{index}Removes one of a user's hold music files. This can't be undone.
Write Key Admin switch: Greetings and music on hold, Write.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
index required | path | string | The slot number of the audio file, as returned when you list them. |
Example request
curl -X DELETE "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh/1" \
-H "Authorization: Bearer $NOODLEVOICE_KEY"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh/1", {
method: "DELETE",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();import os, requests
r = requests.delete(
"https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/moh/1",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
)
print(r.status_code, r.json())Response 202
Returns a status code with a short JSON message.
Delete a user's hold message
/domains/~/users/{user}/msg/{index}Removes one of a user's hold messages. This can't be undone.
Write Key Admin switch: Greetings and music on hold, Write.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
index required | path | string | The slot number of the audio file, as returned when you list them. |
Example request
curl -X DELETE "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/msg/1" \
-H "Authorization: Bearer $NOODLEVOICE_KEY"const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/msg/1", {
method: "DELETE",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
},
});
const data = await res.json();import os, requests
r = requests.delete(
"https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/msg/1",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
)
print(r.status_code, r.json())Response 202
Returns a status code with a short JSON message.
Generate text to speech audio
/domains/~/users/{user}/voicesTurns a script into spoken audio with the voice and language you choose.
Full access No feature switch covers this endpoint. It needs a Full access key.
Parameters
| Name | In | Type | Notes |
|---|---|---|---|
user required | path | string | The user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16 |
Request body application/json
| Field | Type | Notes |
|---|---|---|
script required | string | Words to turn into speech. |
voice_language | string | Language for text to speech, like en-US. Default en-US |
voice_id | string | Which text to speech voice to use. Default en-US-Wavenet-C |
Example request
curl -X POST "https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/voices" \
-H "Authorization: Bearer $NOODLEVOICE_KEY" \
-H "Content-Type: application/json" \
-d '{
"script": "Thanks for calling. Please hold."
}'const res = await fetch("https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/voices", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.NOODLEVOICE_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"script": "Thanks for calling. Please hold."
}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://api.noodlevoice.com/ns-api/v2/domains/~/users/1001/voices",
headers={"Authorization": "Bearer " + os.environ["NOODLEVOICE_KEY"]},
json={
"script": "Thanks for calling. Please hold."
},
)
print(r.status_code, r.json())Response 200
Returns a status code with a short JSON message.