Build endpoints
The /build endpoints are used by Langflow's frontend visual editor code.
These endpoints are part of the internal Langflow codebase.
Don't use these endpoints to run flows in applications that use your Langflow flows. To run flows in your apps, see Flow trigger endpoints.
The /build endpoints support Langflow's frontend code for building flows in the Langflow visual editor.
You can use these endpoints to build vertices and flows, as well as execute flows with streaming event responses.
You might need to use or understand these endpoints when contributing to the Langflow codebase.
Build flow and stream events
This endpoint builds and executes a flow, returning a job ID that can be used to stream execution events.
-
Send a POST request to the
/build/$FLOW_ID/flowendpoint:- Python
- JavaScript
- curl
import os
import requests
url = f"{os.getenv('LANGFLOW_URL', '')}/api/v1/build/{os.getenv('FLOW_ID', '')}/flow"
headers = {
"accept": "application/json",
"Content-Type": "application/json",
"x-api-key": f"{os.getenv('LANGFLOW_API_KEY', '')}",
}
payload = {"inputs": {"input_value": "Tell me a story"}}
response = requests.request("POST", url, headers=headers, json=payload)
response.raise_for_status()
print(response.text)const url = `${process.env.LANGFLOW_URL ?? ""}/api/v1/build/${process.env.FLOW_ID ?? ""}/flow`;
const options = {
method: 'POST',
headers: {
"accept": `application/json`,
"Content-Type": `application/json`,
"x-api-key": `${process.env.LANGFLOW_API_KEY ?? ""}`,
},
body: JSON.stringify({
"inputs": {
"input_value": "Tell me a story"
}
}),
};
fetch(url, options)
.then(async (response) => {
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const text = await response.text();
console.log(text);
})
.catch((error) => console.error(error));curl -X POST \
"$LANGFLOW_URL/api/v1/build/$FLOW_ID/flow" \
-H "accept: application/json" \
-H "Content-Type: application/json" \
-H "x-api-key: $LANGFLOW_API_KEY" \
-d '{
"inputs": {
"input_value": "Tell me a story"
}
}'Result
{
"job_id": "123e4567-e89b-12d3-a456-426614174000"
} -
After receiving a job ID from the build endpoint, use the
/build/$JOB_ID/eventsendpoint to stream the execution results:- Python
- JavaScript
- curl
import os
import requests
url = f"{os.getenv('LANGFLOW_URL', '')}/api/v1/build/{os.getenv('JOB_ID', '')}/events"
headers = {
"accept": "application/json",
"x-api-key": f"{os.getenv('LANGFLOW_API_KEY', '')}",
}
response = requests.request("GET", url, headers=headers)
response.raise_for_status()
print(response.text)const url = `${process.env.LANGFLOW_URL ?? ""}/api/v1/build/123e4567-e89b-12d3-a456-426614174000/events`;
const options = {
method: 'GET',
headers: {
"accept": `application/json`,
"x-api-key": `${process.env.LANGFLOW_API_KEY ?? ""}`,
},
};
fetch(url, options)
.then(async (response) => {
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const text = await response.text();
console.log(text);
})
.catch((error) => console.error(error));curl -X GET \
"$LANGFLOW_URL/api/v1/build/123e4567-e89b-12d3-a456-426614174000/events" \
-H "accept: application/json" \
-H "x-api-key: $LANGFLOW_API_KEY"Result
{"event": "vertices_sorted", "data": {"ids": ["ChatInput-XtBLx"], "to_run": ["Prompt-x74Ze", "ChatOutput-ylMzN", "ChatInput-XtBLx", "OpenAIModel-d1wOZ"]}}
{"event": "add_message", "data": {"timestamp": "2025-03-03T17:42:23", "sender": "User", "sender_name": "User", "session_id": "d2bbd92b-187e-4c84-b2d4-5df365704201", "text": "Tell me a story", "files": [], "error": false, "edit": false, "properties": {"text_color": "", "background_color": "", "edited": false, "source": {"id": null, "display_name": null, "source": null}, "icon": "", "allow_markdown": false, "positive_feedback": null, "state": "complete", "targets": []}, "category": "message", "content_blocks": [], "id": "28879bd8-6a68-4dd5-b658-74d643a4dd92", "flow_id": "d2bbd92b-187e-4c84-b2d4-5df365704201"}}
// ... Additional events as the flow executes ...
{"event": "end", "data": {}}
The /build/$FLOW_ID/events endpoint has a stream query parameter that defaults to true.
To disable streaming and get all events at once, set ?stream=false.
- Python
- JavaScript
- curl
import os
import requests
base = os.environ.get("LANGFLOW_URL") or os.environ.get("LANGFLOW_SERVER_URL", "")
job_id = os.environ.get("JOB_ID", "")
api_key = os.environ.get("LANGFLOW_API_KEY", "")
# Use the API's `event_delivery` query param to avoid keeping a streaming connection open.
# For local smoke tests, polling returns a finite JSON response.
url = f"{base}/api/v1/build/{job_id}/events?event_delivery=polling"
headers = {"accept": "application/json", "x-api-key": api_key}
response = requests.get(url, headers=headers, timeout=60)
response.raise_for_status()
print(response.text)
const url = `${process.env.LANGFLOW_URL ?? ""}/api/v1/build/123e4567-e89b-12d3-a456-426614174000/events?stream=false`;
const options = {
method: 'GET',
headers: {
"accept": `application/json`,
"x-api-key": `${process.env.LANGFLOW_API_KEY ?? ""}`,
},
};
fetch(url, options)
.then(async (response) => {
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const text = await response.text();
console.log(text);
})
.catch((error) => console.error(error));
curl -X GET \
"$LANGFLOW_URL/api/v1/build/123e4567-e89b-12d3-a456-426614174000/events?stream=false" \
-H "accept: application/json" \
-H "x-api-key: $LANGFLOW_API_KEY"
Build headers
| Header | Info | Example |
|---|---|---|
| Content-Type | Required. Specifies the JSON format. | "application/json" |
| accept | Optional. Specifies the response format. | "application/json" |
| x-api-key | Optional. Required only if authentication is enabled. | "sk-..." |
Build parameters
| Parameter | Type | Description |
|---|---|---|
| inputs | object | Optional. Input values for flow components. |
| data | object | Optional. Flow data to override stored configuration. |
| files | array[string] | Optional. List of file paths to use. |
| start_component_id | string | Optional. ID of the component where the execution should start. Component id values can be found in Langflow JSON files |
| stop_component_id | string | Optional. ID of the component where the execution should stop. Component id values can be found in Langflow JSON files. |
| log_builds | Boolean | Whether to record build logs. Default: Enabled (true). |
Set start and stop points
The /build endpoint accepts optional values for start_component_id and stop_component_id to control where the flow run starts and stops.
Setting stop_component_id for a component triggers the same behavior as clicking Run component on that component in the visual editor: The specified component and all dependent components leading up to that component will run.
The following example stops flow execution at an OpenAI component:
- Python
- JavaScript
- curl
import os
import requests
url = f"{os.getenv('LANGFLOW_URL', '')}/api/v1/build/{os.getenv('FLOW_ID', '')}/flow"
headers = {
"accept": "application/json",
"Content-Type": "application/json",
"x-api-key": f"{os.getenv('LANGFLOW_API_KEY', '')}",
}
payload = {"stop_component_id": "OpenAIModel-Uksag"}
response = requests.request("POST", url, headers=headers, json=payload)
response.raise_for_status()
print(response.text)
const url = `${process.env.LANGFLOW_URL ?? ""}/api/v1/build/${process.env.FLOW_ID ?? ""}/flow`;
const options = {
method: 'POST',
headers: {
"accept": `application/json`,
"Content-Type": `application/json`,
"x-api-key": `${process.env.LANGFLOW_API_KEY ?? ""}`,
},
body: JSON.stringify({
"stop_component_id": "OpenAIModel-Uksag"
}),
};
fetch(url, options)
.then(async (response) => {
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const text = await response.text();
console.log(text);
})
.catch((error) => console.error(error));
curl -X POST \
"$LANGFLOW_URL/api/v1/build/$FLOW_ID/flow" \
-H "accept: application/json" \
-H "Content-Type: application/json" \
-H "x-api-key: $LANGFLOW_API_KEY" \
-d '{"stop_component_id": "OpenAIModel-Uksag"}'
Override flow parameters
The /build endpoint also accepts inputs for data directly, instead of using the values stored in the Langflow database.
This is useful for running flows without having to pass custom values through the visual editor.
- Python
- JavaScript
- curl
import os
import requests
url = f"{os.getenv('LANGFLOW_URL', '')}/api/v1/build/{os.getenv('FLOW_ID', '')}/flow"
headers = {
"accept": "application/json",
"Content-Type": "application/json",
"x-api-key": f"{os.getenv('LANGFLOW_API_KEY', '')}",
}
payload = {
"data": {"nodes": [], "edges": []},
"inputs": {"input_value": "Your custom input here", "session": "session_id"},
}
response = requests.request("POST", url, headers=headers, json=payload)
response.raise_for_status()
print(response.text)
const url = `${process.env.LANGFLOW_URL ?? ""}/api/v1/build/${process.env.FLOW_ID ?? ""}/flow`;
const options = {
method: 'POST',
headers: {
"accept": `application/json`,
"Content-Type": `application/json`,
"x-api-key": `${process.env.LANGFLOW_API_KEY ?? ""}`,
},
body: JSON.stringify({
"data": {
"nodes": [],
"edges": []
},
"inputs": {
"input_value": "Your custom input here",
"session": "session_id"
}
}),
};
fetch(url, options)
.then(async (response) => {
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const text = await response.text();
console.log(text);
})
.catch((error) => console.error(error));
curl -X POST \
"$LANGFLOW_URL/api/v1/build/$FLOW_ID/flow" \
-H "accept: application/json" \
-H "Content-Type: application/json" \
-H "x-api-key: $LANGFLOW_API_KEY" \
-d '{
"data": {
"nodes": [],
"edges": []
},
"inputs": {
"input_value": "Your custom input here",
"session": "session_id"
}
}'
Result
{ "job_id": "0bcc7f23-40b4-4bfa-9b8a-a44181fd1175" }
See also
Was this page helpful?