Get App Workflow
curl --request GET \
--url https://app.uselamina.ai/v1/apps/{appId}/workflow \
--header 'x-api-key: <api-key>'import requests
url = "https://app.uselamina.ai/v1/apps/{appId}/workflow"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://app.uselamina.ai/v1/apps/{appId}/workflow', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.uselamina.ai/v1/apps/{appId}/workflow",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.uselamina.ai/v1/apps/{appId}/workflow"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.uselamina.ai/v1/apps/{appId}/workflow")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.uselamina.ai/v1/apps/{appId}/workflow")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"appId": "80d4d454-8844-489f-b903-2ad65a414482",
"name": "test sync",
"nodes": [
{
"id": "aiDesignerNode-1773051929782-5yzqjkwpm",
"type": "aiDesignerNode",
"label": "aiDesignerNode"
},
{
"id": "aiDesignerNode-1773132653203-v9hn959pe",
"type": "aiDesignerNode",
"label": "aiDesignerNode"
},
{
"id": "klingVideoNode-1773149496212-nm2mjjfxi",
"type": "klingVideoNode",
"label": "klingVideoNode"
}
],
"edges": [
{
"source": "aiDesignerNode-1773051929782-5yzqjkwpm",
"target": "aiDesignerNode-1773132653203-v9hn959pe"
}
]
}
}{
"error": "Invalid API key"
}{
"error": "App not found"
}"Too many requests from this IP, please try again in a minute"Discover
Get App Workflow
Returns the underlying workflow graph for an app — the processing nodes and the edges (connections) between them. Useful for understanding how an app transforms inputs into outputs.
Each node represents a processing step (e.g. image generation, video creation, upscaling). Edges show the data flow between nodes.
GET
/
v1
/
apps
/
{appId}
/
workflow
Get App Workflow
curl --request GET \
--url https://app.uselamina.ai/v1/apps/{appId}/workflow \
--header 'x-api-key: <api-key>'import requests
url = "https://app.uselamina.ai/v1/apps/{appId}/workflow"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://app.uselamina.ai/v1/apps/{appId}/workflow', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.uselamina.ai/v1/apps/{appId}/workflow",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.uselamina.ai/v1/apps/{appId}/workflow"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.uselamina.ai/v1/apps/{appId}/workflow")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.uselamina.ai/v1/apps/{appId}/workflow")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"appId": "80d4d454-8844-489f-b903-2ad65a414482",
"name": "test sync",
"nodes": [
{
"id": "aiDesignerNode-1773051929782-5yzqjkwpm",
"type": "aiDesignerNode",
"label": "aiDesignerNode"
},
{
"id": "aiDesignerNode-1773132653203-v9hn959pe",
"type": "aiDesignerNode",
"label": "aiDesignerNode"
},
{
"id": "klingVideoNode-1773149496212-nm2mjjfxi",
"type": "klingVideoNode",
"label": "klingVideoNode"
}
],
"edges": [
{
"source": "aiDesignerNode-1773051929782-5yzqjkwpm",
"target": "aiDesignerNode-1773132653203-v9hn959pe"
}
]
}
}{
"error": "Invalid API key"
}{
"error": "App not found"
}"Too many requests from this IP, please try again in a minute"Inspect the DAG (nodes and edges) behind an app. Each node is a processing step — image generation, video creation, compositing, upscaling — and edges show the data flow between them.
Useful for agents that need to reason about what an app does before running it, or for building tooling that classifies apps by pipeline structure.
Authorizations
Workspace API key. Prefix: lma_. Example: lma_abc123...
Path Parameters
The app ID (UUID) from the List Apps response
Response
Workflow structure with nodes and edges
The workflow graph showing processing nodes and their connections
Show child attributes
Show child attributes