API Reference
Key Admin
Numbers and call routing

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

GET/domains/~/moh

Returns 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)
FieldTypeNotes
filenamestring
ordinal-orderinteger
file-duration-secondsintegerFile duration, in seconds.
file-size-kilobytesstring
created-datetimestringCreated (date and time).
file-access-urlstring
file-script-textstring
file-sourcestring
text-to-speech-voice-idstringID of the text to speech voice. Default en-US-Wavenet-C
text-to-speech-languagestring Default en_US
FromNamestring
FromUserstring
FromHoststring
NmsAnistring
recorded-datetimestringRecorded (date and time).
NmsRecStartTimestring
NmsRecDurationstring
TimeZonestring
transcriptionstring

Count hold music files

GET/domains/~/moh/count

Returns 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

GET/domains/~/msg

Returns 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)
FieldTypeNotes
filenamestring
ordinal-orderinteger
file-duration-secondsintegerFile duration, in seconds.
file-size-kilobytesstring
created-datetimestringCreated (date and time).
file-access-urlstring
file-script-textstring
file-sourcestring
text-to-speech-voice-idstringID of the text to speech voice. Default en-US-Wavenet-C
text-to-speech-languagestring Default en_US
FromNamestring
FromUserstring
FromHoststring
NmsAnistring
recorded-datetimestringRecorded (date and time).
NmsRecStartTimestring
NmsRecDurationstring
TimeZonestring
transcriptionstring

Count hold messages

GET/domains/~/msg/count

Returns 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)

POST/domains/~/moh

Adds 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

FieldTypeNotes
synchronous requiredstringSet to yes to wait until the change is finished before the response comes back. One of: yes, no Default no
indexintegerThe audio slot number.
script requiredstringWords to turn into speech.
convertstringSet to yes to convert the audio to the format the system needs. One of: yes, no Default no
encodingstringHow the file is encoded, for example base64.
base64_filestringThe 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)
FieldTypeNotes
codeintegerHTTP status code.
messagestringWhat happened, in words.

Upload hold music (file upload)

POST/domains/~/moh

Adds 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

FieldTypeNotes
scriptstringWords to turn into speech.
Filestring (binary)The audio file.
indexintegerThe audio slot number.
convertstringSet to yes to convert the audio to the format the system needs.
synchronous requiredstringSet 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

POST/domains/~/moh

Adds 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

FieldTypeNotes
synchronous requiredstringSet to yes to wait until the change is finished before the response comes back. One of: yes, no Default no
indexintegerThe audio slot number.
script requiredstringWords to turn into speech.
voice_languagestringLanguage for text to speech, like en-US. Default en-US
voice_idstringWhich 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)
FieldTypeNotes
filenamestring
ordinal-orderinteger
file-duration-secondsintegerFile duration, in seconds.
file-size-kilobytesstring
created-datetimestringCreated (date and time).
file-access-urlstring
file-script-textstring
file-sourcestring
text-to-speech-voice-idstringID of the text to speech voice. Default en-US-Wavenet-C
text-to-speech-languagestring Default en_US
FromNamestring
FromUserstring
FromHoststring
NmsAnistring
recorded-datetimestringRecorded (date and time).
NmsRecStartTimestring
NmsRecDurationstring
TimeZonestring
transcriptionstring

Create a hold message

POST/domains/~/msg

Adds a new hold message on the account.

Write Key Admin switch: Greetings and music on hold, Write.

Request body multipart/form-data

FieldTypeNotes
scriptstringWords to turn into speech.
Filestring (binary)The audio file.
indexintegerThe audio slot number.
convertstringSet to yes to convert the audio to the format the system needs.
synchronous requiredstringSet 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)

PUT/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

NameInTypeNotes
index requiredpathstringThe slot number of the audio file, as returned when you list them.

Request body application/json

FieldTypeNotes
synchronous requiredstringSet to yes to wait until the change is finished before the response comes back. One of: yes, no Default no
script requiredstringWords to turn into speech.
convertstringSet to yes to convert the audio to the format the system needs. One of: yes, no Default no
encodingstringHow the file is encoded, for example base64.
base64_filestringThe 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)
FieldTypeNotes
codeintegerHTTP status code.
messagestringWhat happened, in words.

Replace hold music (file upload)

PUT/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

NameInTypeNotes
index requiredpathstringThe slot number of the audio file, as returned when you list them.

Request body multipart/form-data

FieldTypeNotes
scriptstringWords to turn into speech.
Filestring (binary)The audio file.
convertstringSet to yes to convert the audio to the format the system needs.
synchronous requiredstringSet 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

PUT/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

NameInTypeNotes
index requiredpathstringThe slot number of the audio file, as returned when you list them.

Request body application/json

FieldTypeNotes
synchronous requiredstringSet to yes to wait until the change is finished before the response comes back. One of: yes, no Default no
script requiredstringWords to turn into speech.
voice_languagestringLanguage for text to speech, like en-US. Default en-US
voice_idstringWhich 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)
FieldTypeNotes
filenamestring
ordinal-orderinteger
file-duration-secondsintegerFile duration, in seconds.
file-size-kilobytesstring
created-datetimestringCreated (date and time).
file-access-urlstring
file-script-textstring
file-sourcestring
text-to-speech-voice-idstringID of the text to speech voice. Default en-US-Wavenet-C
text-to-speech-languagestring Default en_US
FromNamestring
FromUserstring
FromHoststring
NmsAnistring
recorded-datetimestringRecorded (date and time).
NmsRecStartTimestring
NmsRecDurationstring
TimeZonestring
transcriptionstring

Update a hold message

PUT/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

NameInTypeNotes
index requiredpathstringThe slot number of the audio file, as returned when you list them.

Request body multipart/form-data

FieldTypeNotes
scriptstringWords to turn into speech.
Filestring (binary)The audio file.
convertstringSet to yes to convert the audio to the format the system needs.
synchronous requiredstringSet 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

DELETE/domains/~/moh/{index}

Removes a hold music file. This can't be undone.

Write Key Admin switch: Greetings and music on hold, Write.

Parameters

NameInTypeNotes
index requiredpathstringThe 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

DELETE/domains/~/msg/{index}

Removes a hold message. This can't be undone.

Write Key Admin switch: Greetings and music on hold, Write.

Parameters

NameInTypeNotes
index requiredpathstringThe 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

GET/domains/~/users/{user}/greetings

Returns the voicemail greetings for one user.

Read Key Admin switch: Greetings and music on hold, Read. Read only keys also work.

Parameters

NameInTypeNotes
user requiredpathstringThe 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)
FieldTypeNotes
filenamestring
ordinal-orderinteger
file-duration-secondsintegerFile duration, in seconds.
file-size-kilobytesstring
created-datetimestringCreated (date and time).
file-access-urlstring
file-script-textstring
file-sourcestring
text-to-speech-voice-idstringID of the text to speech voice. Default en-US-Wavenet-C
text-to-speech-languagestring Default en_US
FromNamestring
FromUserstring
FromHoststring
NmsAnistring
recorded-datetimestringRecorded (date and time).
NmsRecStartTimestring
NmsRecDurationstring
TimeZonestring
transcriptionstring

Count voicemail greetings for a user

GET/domains/~/users/{user}/greetings/count

Returns 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

NameInTypeNotes
user requiredpathstringThe 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

GET/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

NameInTypeNotes
user requiredpathstringThe user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16
index requiredpathstringThe 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)
FieldTypeNotes
filenamestring
ordinal-orderinteger
file-duration-secondsintegerFile duration, in seconds.
file-size-kilobytesstring
created-datetimestringCreated (date and time).
file-access-urlstring
file-script-textstring
file-sourcestring
text-to-speech-voice-idstringID of the text to speech voice. Default en-US-Wavenet-C
text-to-speech-languagestring Default en_US
FromNamestring
FromUserstring
FromHoststring
NmsAnistring
recorded-datetimestringRecorded (date and time).
NmsRecStartTimestring
NmsRecDurationstring
TimeZonestring
transcriptionstring

List hold music files for a user

GET/domains/~/users/{user}/moh

Returns the hold music files for one user.

Read Key Admin switch: Greetings and music on hold, Read. Read only keys also work.

Parameters

NameInTypeNotes
user requiredpathstringThe 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)
FieldTypeNotes
filenamestring
ordinal-orderinteger
file-duration-secondsintegerFile duration, in seconds.
file-size-kilobytesstring
created-datetimestringCreated (date and time).
file-access-urlstring
file-script-textstring
file-sourcestring
text-to-speech-voice-idstringID of the text to speech voice. Default en-US-Wavenet-C
text-to-speech-languagestring Default en_US
FromNamestring
FromUserstring
FromHoststring
NmsAnistring
recorded-datetimestringRecorded (date and time).
NmsRecStartTimestring
NmsRecDurationstring
TimeZonestring
transcriptionstring

Count hold music files for a user

GET/domains/~/users/{user}/moh/count

Returns 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

NameInTypeNotes
user requiredpathstringThe 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

GET/domains/~/users/{user}/msg

Returns the hold messages for one user.

Read Key Admin switch: Greetings and music on hold, Read. Read only keys also work.

Parameters

NameInTypeNotes
user requiredpathstringThe 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)
FieldTypeNotes
filenamestring
ordinal-orderinteger
file-duration-secondsintegerFile duration, in seconds.
file-size-kilobytesstring
created-datetimestringCreated (date and time).
file-access-urlstring
file-script-textstring
file-sourcestring
text-to-speech-voice-idstringID of the text to speech voice. Default en-US-Wavenet-C
text-to-speech-languagestring Default en_US
FromNamestring
FromUserstring
FromHoststring
NmsAnistring
recorded-datetimestringRecorded (date and time).
NmsRecStartTimestring
NmsRecDurationstring
TimeZonestring
transcriptionstring

Count hold messages for a user

GET/domains/~/users/{user}/msg/count

Returns 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

NameInTypeNotes
user requiredpathstringThe 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

GET/domains/~/users/{user}/voices

Returns 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

NameInTypeNotes
user requiredpathstringThe user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16
scriptquerystringThe 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

GET/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

NameInTypeNotes
user requiredpathstringThe user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16
language requiredpathstringLanguage code, like en-US.
genderquerystringOnly return voices of this gender.
vendorquerystringOnly return voices from this speech engine.
idquerystringThe ID of the item, as returned when you list or create it.
namequerystringThe 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)
FieldTypeNotes
genderstring
idstringThe item's ID.
languageCodestring
namestring
typestringThe kind of item.
subTypestring

Upload a voicemail greeting (base64)

POST/domains/~/users/{user}/greetings

Adds a voicemail greeting for a user. Send the audio as base64 inside JSON.

Write Key Admin switch: Greetings and music on hold, Write.

Parameters

NameInTypeNotes
user requiredpathstringThe user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16

Request body application/json

FieldTypeNotes
synchronous requiredstringSet to yes to wait until the change is finished before the response comes back. One of: yes, no Default no
indexintegerThe audio slot number.
script requiredstringWords to turn into speech.
convertstringSet to yes to convert the audio to the format the system needs. One of: yes, no Default no
encodingstringHow the file is encoded, for example base64.
base64_filestringThe audio file as a base64 string.
voice_languagestringLanguage for text to speech, like en-US. Default en-US
voice_idstringWhich 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)
FieldTypeNotes
codeintegerHTTP status code.
messagestringWhat happened, in words.

Upload a voicemail greeting (file upload)

POST/domains/~/users/{user}/greetings

Adds a voicemail greeting for a user using a multipart form upload.

Write Key Admin switch: Greetings and music on hold, Write.

Parameters

NameInTypeNotes
user requiredpathstringThe user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16

Request body multipart/form-data

FieldTypeNotes
scriptstringWords to turn into speech.
Filestring (binary)The audio file.
indexintegerThe audio slot number.
convertstringSet to yes to convert the audio to the format the system needs.
synchronous requiredstringSet 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

POST/domains/~/users/{user}/greetings

Adds a voicemail greeting for a user by turning a script into speech.

Write Key Admin switch: Greetings and music on hold, Write.

Parameters

NameInTypeNotes
user requiredpathstringThe user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16

Request body application/json

FieldTypeNotes
synchronous requiredstringSet to yes to wait until the change is finished before the response comes back. One of: yes, no Default no
indexintegerThe audio slot number.
script requiredstringWords to turn into speech.
voice_languagestringLanguage for text to speech, like en-US. Default en-US
voice_idstringWhich 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)

POST/domains/~/users/{user}/moh

Adds 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

NameInTypeNotes
user requiredpathstringThe user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16

Request body application/json

FieldTypeNotes
synchronous requiredstringSet to yes to wait until the change is finished before the response comes back. One of: yes, no Default no
indexintegerThe audio slot number.
script requiredstringWords to turn into speech.
convertstringSet to yes to convert the audio to the format the system needs. One of: yes, no Default no
encodingstringHow the file is encoded, for example base64.
base64_filestringThe 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)
FieldTypeNotes
codeintegerHTTP status code.
messagestringWhat happened, in words.

Upload hold music for a user (file upload)

POST/domains/~/users/{user}/moh

Adds a hold music file for one user using a multipart form upload.

Write Key Admin switch: Greetings and music on hold, Write.

Parameters

NameInTypeNotes
user requiredpathstringThe user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16

Request body multipart/form-data

FieldTypeNotes
scriptstringWords to turn into speech.
Filestring (binary)The audio file.
indexintegerThe audio slot number.
convertstringSet to yes to convert the audio to the format the system needs.
synchronous requiredstringSet 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

POST/domains/~/users/{user}/moh

Adds hold audio for one user by turning a script into speech.

Write Key Admin switch: Greetings and music on hold, Write.

Parameters

NameInTypeNotes
user requiredpathstringThe user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16

Request body application/json

FieldTypeNotes
synchronous requiredstringSet to yes to wait until the change is finished before the response comes back. One of: yes, no Default no
indexintegerThe audio slot number.
script requiredstringWords to turn into speech.
voice_languagestringLanguage for text to speech, like en-US. Default en-US
voice_idstringWhich 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)
FieldTypeNotes
filenamestring
ordinal-orderinteger
file-duration-secondsintegerFile duration, in seconds.
file-size-kilobytesstring
created-datetimestringCreated (date and time).
file-access-urlstring
file-script-textstring
file-sourcestring
text-to-speech-voice-idstringID of the text to speech voice. Default en-US-Wavenet-C
text-to-speech-languagestring Default en_US
FromNamestring
FromUserstring
FromHoststring
NmsAnistring
recorded-datetimestringRecorded (date and time).
NmsRecStartTimestring
NmsRecDurationstring
TimeZonestring
transcriptionstring

Create a hold message for a user

POST/domains/~/users/{user}/msg

Adds a new hold message for one user.

Write Key Admin switch: Greetings and music on hold, Write.

Parameters

NameInTypeNotes
user requiredpathstringThe user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16

Request body multipart/form-data

FieldTypeNotes
scriptstringWords to turn into speech.
Filestring (binary)The audio file.
indexintegerThe audio slot number.
convertstringSet to yes to convert the audio to the format the system needs.
synchronous requiredstringSet 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)

PUT/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

NameInTypeNotes
user requiredpathstringThe user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16
index requiredpathstringThe slot number of the audio file, as returned when you list them.

Request body application/json

FieldTypeNotes
synchronous requiredstringSet to yes to wait until the change is finished before the response comes back. One of: yes, no Default no
indexintegerThe audio slot number.
script requiredstringWords to turn into speech.
convertstringSet to yes to convert the audio to the format the system needs. One of: yes, no Default no
encodingstringHow the file is encoded, for example base64.
base64_filestringThe audio file as a base64 string.
voice_languagestringLanguage for text to speech, like en-US. Default en-US
voice_idstringWhich 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)
FieldTypeNotes
codeintegerHTTP status code.
messagestringWhat happened, in words.

Replace a voicemail greeting (file upload)

PUT/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

NameInTypeNotes
user requiredpathstringThe user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16
index requiredpathstringThe slot number of the audio file, as returned when you list them.

Request body multipart/form-data

FieldTypeNotes
scriptstringWords to turn into speech.
Filestring (binary)The audio file.
convertstringSet to yes to convert the audio to the format the system needs.
synchronousstringSet 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

PUT/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

NameInTypeNotes
user requiredpathstringThe user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16
index requiredpathstringThe slot number of the audio file, as returned when you list them.

Request body application/json

FieldTypeNotes
synchronous requiredstringSet to yes to wait until the change is finished before the response comes back. One of: yes, no Default no
script requiredstringWords to turn into speech.
convertstringSet to yes to convert the audio to the format the system needs. One of: yes, no Default no
encodingstringHow the file is encoded, for example base64.
base64_filestringThe audio file as a base64 string.
voice_languagestringLanguage for text to speech, like en-US. Default en-US
voice_idstringWhich 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)

PUT/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

NameInTypeNotes
user requiredpathstringThe user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16
index requiredpathstringThe slot number of the audio file, as returned when you list them.

Request body application/json

FieldTypeNotes
synchronous requiredstringSet to yes to wait until the change is finished before the response comes back. One of: yes, no Default no
script requiredstringWords to turn into speech.
convertstringSet to yes to convert the audio to the format the system needs. One of: yes, no Default no
encodingstringHow the file is encoded, for example base64.
base64_filestringThe 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)
FieldTypeNotes
codeintegerHTTP status code.
messagestringWhat happened, in words.

Replace a user's hold music (file upload)

PUT/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

NameInTypeNotes
user requiredpathstringThe user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16
index requiredpathstringThe slot number of the audio file, as returned when you list them.

Request body multipart/form-data

FieldTypeNotes
scriptstringWords to turn into speech.
Filestring (binary)The audio file.
convertstringSet to yes to convert the audio to the format the system needs.
synchronous requiredstringSet 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

PUT/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

NameInTypeNotes
user requiredpathstringThe user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16
index requiredpathstringThe slot number of the audio file, as returned when you list them.

Request body application/json

FieldTypeNotes
synchronous requiredstringSet to yes to wait until the change is finished before the response comes back. One of: yes, no Default no
script requiredstringWords to turn into speech.
voice_languagestringLanguage for text to speech, like en-US. Default en-US
voice_idstringWhich 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)
FieldTypeNotes
filenamestring
ordinal-orderinteger
file-duration-secondsintegerFile duration, in seconds.
file-size-kilobytesstring
created-datetimestringCreated (date and time).
file-access-urlstring
file-script-textstring
file-sourcestring
text-to-speech-voice-idstringID of the text to speech voice. Default en-US-Wavenet-C
text-to-speech-languagestring Default en_US
FromNamestring
FromUserstring
FromHoststring
NmsAnistring
recorded-datetimestringRecorded (date and time).
NmsRecStartTimestring
NmsRecDurationstring
TimeZonestring
transcriptionstring

Update a user's hold message

PUT/domains/~/users/{user}/msg/{index}

Changes one of a user's hold messages.

Write Key Admin switch: Greetings and music on hold, Write.

Parameters

NameInTypeNotes
user requiredpathstringThe user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16
index requiredpathstringThe slot number of the audio file, as returned when you list them.

Request body multipart/form-data

FieldTypeNotes
scriptstringWords to turn into speech.
Filestring (binary)The audio file.
convertstringSet to yes to convert the audio to the format the system needs.
synchronous requiredstringSet 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

DELETE/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

NameInTypeNotes
user requiredpathstringThe user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16
index requiredpathstringThe 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)
FieldTypeNotes
codeintegerHTTP status code.
messagestringWhat happened, in words.

Delete a user's hold music file

DELETE/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

NameInTypeNotes
user requiredpathstringThe user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16
index requiredpathstringThe 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

DELETE/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

NameInTypeNotes
user requiredpathstringThe user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16
index requiredpathstringThe 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

POST/domains/~/users/{user}/voices

Turns 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

NameInTypeNotes
user requiredpathstringThe user ID, usually their extension number, like 1001. Default ~ Min length 0 Max length 16

Request body application/json

FieldTypeNotes
script requiredstringWords to turn into speech.
voice_languagestringLanguage for text to speech, like en-US. Default en-US
voice_idstringWhich 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.