Voiceflow bearer token
curl --request POST \
--url https://realtime-api.voiceflow.com/v1/stable/message/batch \
--header 'Authorization: Bearer <token>'
--header 'Content-Type: application/json' \
--data '{
"messages": [
{
"variants": [
"<StableMessageVariantCreateRequest>"
]
}
]
}'const response = await fetch('https://realtime-api.voiceflow.com/v1/stable/message/batch?projectID=<projectID>&environmentAlias=<environmentAlias>', {
method: 'POST',
headers: {
Authorization: 'Bearer <token>',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"messages": [
{
"variants": [
"<StableMessageVariantCreateRequest>"
]
}
]
}),
});
const data = await response.json();import requests
response = requests.post(
'https://realtime-api.voiceflow.com/v1/stable/message/batch?projectID=<projectID>&environmentAlias=<environmentAlias>',
headers={'Authorization': 'Bearer <token>'},
json={
"messages": [
{
"variants": [
"<StableMessageVariantCreateRequest>"
]
}
]
},
)
data = response.json()vf message create-many --project-id <projectID> --environment-alias <environmentAlias> \
< body.json{
"messages": [
{
"id": "<string>",
"variants": [
"<StableMessageVariant>"
],
"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 several messages in one call, each with its own variants. None of them belongs to anything until a tool slot, workflow step, or reprompt holds its ID.
curl --request POST \
--url https://realtime-api.voiceflow.com/v1/stable/message/batch \
--header 'Authorization: Bearer <token>'
--header 'Content-Type: application/json' \
--data '{
"messages": [
{
"variants": [
"<StableMessageVariantCreateRequest>"
]
}
]
}'const response = await fetch('https://realtime-api.voiceflow.com/v1/stable/message/batch?projectID=<projectID>&environmentAlias=<environmentAlias>', {
method: 'POST',
headers: {
Authorization: 'Bearer <token>',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"messages": [
{
"variants": [
"<StableMessageVariantCreateRequest>"
]
}
]
}),
});
const data = await response.json();import requests
response = requests.post(
'https://realtime-api.voiceflow.com/v1/stable/message/batch?projectID=<projectID>&environmentAlias=<environmentAlias>',
headers={'Authorization': 'Bearer <token>'},
json={
"messages": [
{
"variants": [
"<StableMessageVariantCreateRequest>"
]
}
]
},
)
data = response.json()vf message create-many --project-id <projectID> --environment-alias <environmentAlias> \
< body.json{
"messages": [
{
"id": "<string>",
"variants": [
"<StableMessageVariant>"
],
"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 messages to create, at most 50. Each entry is the body of a single create. The response lists them in this order.
Show child attributes
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 messages, in request order, with their variants and IDs, and unresolvedReferences for any variable or reference in the text that did not resolve.
The created messages, in request order.
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.