Voiceflow bearer token
curl --request POST \
--url https://realtime-api.voiceflow.com/v1/stable/message \
--header 'Authorization: Bearer <token>'
--header 'Content-Type: application/json' \
--data '{
"variants": [
{
"text": "<string>",
"delay": 0,
"condition": "<StableMessageVariantCondition>"
}
]
}'const response = await fetch('https://realtime-api.voiceflow.com/v1/stable/message?projectID=<projectID>&environmentAlias=<environmentAlias>', {
method: 'POST',
headers: {
Authorization: 'Bearer <token>',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"variants": [
{
"text": "<string>",
"delay": 0,
"condition": "<StableMessageVariantCondition>"
}
]
}),
});
const data = await response.json();import requests
response = requests.post(
'https://realtime-api.voiceflow.com/v1/stable/message?projectID=<projectID>&environmentAlias=<environmentAlias>',
headers={'Authorization': 'Bearer <token>'},
json={
"variants": [
{
"text": "<string>",
"delay": 0,
"condition": "<StableMessageVariantCondition>"
}
]
},
)
data = response.json()vf message create --project-id <projectID> --environment-alias <environmentAlias> \
< body.json{
"message": {
"id": "<string>",
"variants": [
{
"id": "<string>",
"text": "<MarkdownLikeString>",
"delay": 0,
"condition": "<StableMessageVariantCondition>",
"createdAt": "2026-09-10T00:00:00.000Z",
"updatedAt": "2026-09-10T00:00:00.000Z",
"updatedByID": 0
}
],
"createdAt": "2026-09-10T00:00:00.000Z",
"updatedAt": "2026-09-10T00:00:00.000Z",
"createdByID": 0,
"updatedByID": 0
},
"unresolvedReferences": [
{
"path": "<string>",
"token": "<string>",
"reason": "unknown"
}
]
}Creates a message, which is a set of variants that say the same thing in different words, and returns it with its ID. The message belongs to nothing until a tool slot, workflow step, or reprompt holds its ID.
curl --request POST \
--url https://realtime-api.voiceflow.com/v1/stable/message \
--header 'Authorization: Bearer <token>'
--header 'Content-Type: application/json' \
--data '{
"variants": [
{
"text": "<string>",
"delay": 0,
"condition": "<StableMessageVariantCondition>"
}
]
}'const response = await fetch('https://realtime-api.voiceflow.com/v1/stable/message?projectID=<projectID>&environmentAlias=<environmentAlias>', {
method: 'POST',
headers: {
Authorization: 'Bearer <token>',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"variants": [
{
"text": "<string>",
"delay": 0,
"condition": "<StableMessageVariantCondition>"
}
]
}),
});
const data = await response.json();import requests
response = requests.post(
'https://realtime-api.voiceflow.com/v1/stable/message?projectID=<projectID>&environmentAlias=<environmentAlias>',
headers={'Authorization': 'Bearer <token>'},
json={
"variants": [
{
"text": "<string>",
"delay": 0,
"condition": "<StableMessageVariantCondition>"
}
]
},
)
data = response.json()vf message create --project-id <projectID> --environment-alias <environmentAlias> \
< body.json{
"message": {
"id": "<string>",
"variants": [
{
"id": "<string>",
"text": "<MarkdownLikeString>",
"delay": 0,
"condition": "<StableMessageVariantCondition>",
"createdAt": "2026-09-10T00:00:00.000Z",
"updatedAt": "2026-09-10T00:00:00.000Z",
"updatedByID": 0
}
],
"createdAt": "2026-09-10T00:00:00.000Z",
"updatedAt": "2026-09-10T00:00:00.000Z",
"createdByID": 0,
"updatedByID": 0
},
"unresolvedReferences": [
{
"path": "<string>",
"token": "<string>",
"reason": "unknown"
}
]
}Authorizations
Query Parameters
Body
The variants, in stored order. They are alternatives: the runtime says one of them each time. The first variant cannot carry a condition.
Show child attributes
Message text shown to the end user. Limited markdown: bold, _italic_, <u>underline</u>, ~~strikethrough~~, [label](url). {variable_name} inserts a variable or entity, {variable_name.path} a field of a variable. Escape a literal { or \ with a backslash. A name matching neither is stored as literal text and reported in unresolvedReferences; secrets are not available here.
Response
201 - application/jsonReturns the new message with its variants and IDs, and unresolvedReferences for any variable or reference in the text that did not resolve.
Show child attributes
Every variant, in stored order. Variants are alternatives: the runtime says one of them each time. The first variant cannot be given a condition.
Show child attributes
Message text shown to the end user. Limited markdown: bold, _italic_, <u>underline</u>, ~~strikethrough~~, [label](url). {variable_name} inserts a variable or entity, {variable_name.path} a field of a variable. Escape a literal { or \ with a backslash. A name matching neither is stored as literal text and reported in unresolvedReferences; secrets are not available here.
References this write kept as literal text instead of binding, each with the reason. The write still succeeded.
Show child attributes
unknown: no variable or entity of that name. secret-not-allowed: the name is a project secret and this field does not accept one. path-on-non-variable: only a variable has fields. resource-id: a bare resource id, not a name. invalid-name: outside the ^\w{1,64}$ name grammar. dangling: the reference rendered as a bare id, because its row is gone or its name is outside the name grammar.
unknown, secret-not-allowed, path-on-non-variable, resource-id, invalid-name, danglingWas this page helpful?
Thanks for your feedback.