Skip to main content

Converse API

The Converse API helps you quickly call an API within your flow. You can then save and use the responses received from the external API in your chatbot's code and flows.

Request Options

Calling an API involves making an HTTP request from Botpress to a named host on a server. The request aims to access a resource on the server. The following are the components of your request through which you will supply information to an API.


The request body is set in the interface below. Please ensure that your request body adheres to the specified syntax for the API you are calling.


The request headers can be set here and should respect the JSON format.


All APIs respond to every request with an HTTP status indicating whether the request was successful. The response typically comes along with a JSON response which may contain additional information. The Call API skill supports receipt and storage of this response in the following manner.


We use memory to save the response given by the API we are calling. By default, Botpress will save the response in temp.response, but you can use the memory of your choice according to the use-case.

The saved response object looks like this:

"body": <Response Body>,
"status": 200

Success / Failure

When a response returns a status code 400 and above, the request will fail and execute the On failure transition. All other status codes will result in success and execute the On success transition.


Botpress supports templating in the body and the headers to access variables stored in memory. All bot, user, session, temp, and event memory types are accessible via templating.

Debug API

There's also a secured route that requires authentication to Botpress to consume this API. Using this route, you can request more data to be included in your response using the include query params separated by commas.

JWT Token

To access this route, you need a JWT token. This requirement is in place because sensitive information destined for the chatbot back-end user is accessible via this route. For example, you can access the chatbot's decision logic.


Here is a sample request using cURL to get this token:

curl --location --request POST 'http://<>/api/v1/auth/login/basic/default' \
--header 'Content-Type: application/json' \
--data-raw '{
"email": "<YOUR-EMAIL>",
"password": "<YOUR-PASSWORD>"


In the response, you can find the JWT token and its expiration. The expiration can be configured globally using the jwtToken.duration field in the botpress.config.json file. This duration will apply to all generated JWT tokens (this applies to all users logging into Botpress).

The response body from the above request will look like this:

"status": "success",
"message": "Login successful",
"payload": {
"jwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImFkbWtsoiwic3RyYXRlZ3kiOiJkZWZhdWx0IiwidG9rZW5WZXJzaW9uIjoxLCJpc1N1cGVyQWRtaW4iOnRydWUsImlhdCI6MTYxODU3Mjk1MCwiZXhwIjoxNjE4NTc2NTUwLCJhsdwiOiJjb2xsYWJvcmF0b3JzIn0.urYZ5A8yXH3XqzSmu7GmImufSgZ0Nx6HknzuidGWnRs",
"exp": 3600000

API Request


To call the Converse API on the /secured path, you will need to include a Content-Type and an Authorization header in the POST request as follows:

"Content-Type": "application/json",
"Authorization": "Bearer {token}"

Where {token} is the JWT token provided by Botpress as described above.

Request URL

When calling the debug API, you can get the following options in addition to the standard response.

  • nlu: the output of Botpress NLU
  • state: the state object of the user conversation
  • suggestions: the reply suggestions made by the modules
  • decision: the final decision made by the Decision Engine

A sample request URL is:

POST /api/v1/bots/{botId}/converse/{userId}/secured?include=nlu,state,suggestions,decision

"type": "text",
"text": "<text here>",
"includedContexts": ["global"], // optional, for NLU context
"metadata": {} // optional, useful to send additional data for custom hooks

API Response

Below is a sample of the response given by our support bot at Botpress when it's the first time you chat with it using the converse API with all debug options included.

"responses": [
"type": "typing",
"value": true
"type": "text",
"markdown": true,
"text": "Hey there, welcome to **Botpress Support**!"
"nlu": {
"entities": [],
"language": "n/a",
"ambiguous": false,
"slots": {},
"intent": {
"name": "none",
"confidence": 1,
"context": "global"
"intents": [],
"errored": false,
"includedContexts": ["global"],
"ms": 0
"suggestions": [],
"state": {
"__stacktrace": [
"flow": "main.flow.json",
"node": "entry"
"flow": "main.flow.json",
"node": "node-aedb"
"user": {
"0": "{",
"1": "}"
"context": {},
"session": {
"lastMessages": [
"eventId": "2614565289899183",
"incomingPreview": "Hie",
"replyConfidence": 1,
"replySource": "dialogManager",
"replyDate": "2021-04-29T15:43:47.061Z",
"replyPreview": "#!builtin_text-VahTGK"
"workflows": {},
"slots": {}
"temp": {}
"decision": {
"decision": {
"reason": "no suggestion matched",
"status": "elected"
"confidence": 1,
"payloads": [],
"source": "decisionEngine",
"sourceDetails": "execute default flow"


Please note that for now, this API can't:

  • Be used to receive proactive messages (messages initiated by the bot instead of the user);
  • Be disabled, throttled, or restricted.