Estimate workflow price
curl --request POST \
--url https://api.app.layer.ai/api/v1/workspaces/{workspace_id}/workflows/{workflow_id}/estimate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"inputs": {}
}'import requests
url = "https://api.app.layer.ai/api/v1/workspaces/{workspace_id}/workflows/{workflow_id}/estimate"
payload = { "inputs": {} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({inputs: {}})
};
fetch('https://api.app.layer.ai/api/v1/workspaces/{workspace_id}/workflows/{workflow_id}/estimate', 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://api.app.layer.ai/api/v1/workspaces/{workspace_id}/workflows/{workflow_id}/estimate",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'inputs' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.app.layer.ai/api/v1/workspaces/{workspace_id}/workflows/{workflow_id}/estimate"
payload := strings.NewReader("{\n \"inputs\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.app.layer.ai/api/v1/workspaces/{workspace_id}/workflows/{workflow_id}/estimate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"inputs\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.app.layer.ai/api/v1/workspaces/{workspace_id}/workflows/{workflow_id}/estimate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"inputs\": {}\n}"
response = http.request(request)
puts response.read_body{
"estimated_price_creative_units": 123,
"output_counts": [
{
"output": {
"name": "<string>",
"type": "<string>",
"description": "<string>",
"value_schema": {},
"display_name": "<string>"
},
"count": 123
}
],
"workspace_balance_creative_units": 123,
"estimated_remaining_balance_creative_units": 123,
"has_sufficient_creative_units": true
}{
"type": "https://api.layer.ai/errors/ERROR_CODE",
"title": "Error Title",
"status": 400,
"detail": "Human-readable description."
}{
"type": "https://api.layer.ai/errors/ERROR_CODE",
"title": "Error Title",
"status": 400,
"detail": "Human-readable description."
}{
"type": "https://api.layer.ai/errors/ERROR_CODE",
"title": "Error Title",
"status": 400,
"detail": "Human-readable description."
}{
"type": "https://api.layer.ai/errors/ERROR_CODE",
"title": "Error Title",
"status": 400,
"detail": "Human-readable description."
}{
"type": "https://api.layer.ai/errors/ERROR_CODE",
"title": "Error Title",
"status": 400,
"detail": "Human-readable description."
}{
"type": "https://api.layer.ai/errors/ERROR_CODE",
"title": "Error Title",
"status": 400,
"detail": "Human-readable description."
}{
"type": "https://api.layer.ai/errors/ERROR_CODE",
"title": "Error Title",
"status": 400,
"detail": "Human-readable description."
}Workflows
Estimate workflow price
Estimate the Creative Units cost of running a workflow with given inputs.
POST
/
v1
/
workspaces
/
{workspace_id}
/
workflows
/
{workflow_id}
/
estimate
Estimate workflow price
curl --request POST \
--url https://api.app.layer.ai/api/v1/workspaces/{workspace_id}/workflows/{workflow_id}/estimate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"inputs": {}
}'import requests
url = "https://api.app.layer.ai/api/v1/workspaces/{workspace_id}/workflows/{workflow_id}/estimate"
payload = { "inputs": {} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({inputs: {}})
};
fetch('https://api.app.layer.ai/api/v1/workspaces/{workspace_id}/workflows/{workflow_id}/estimate', 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://api.app.layer.ai/api/v1/workspaces/{workspace_id}/workflows/{workflow_id}/estimate",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'inputs' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.app.layer.ai/api/v1/workspaces/{workspace_id}/workflows/{workflow_id}/estimate"
payload := strings.NewReader("{\n \"inputs\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.app.layer.ai/api/v1/workspaces/{workspace_id}/workflows/{workflow_id}/estimate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"inputs\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.app.layer.ai/api/v1/workspaces/{workspace_id}/workflows/{workflow_id}/estimate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"inputs\": {}\n}"
response = http.request(request)
puts response.read_body{
"estimated_price_creative_units": 123,
"output_counts": [
{
"output": {
"name": "<string>",
"type": "<string>",
"description": "<string>",
"value_schema": {},
"display_name": "<string>"
},
"count": 123
}
],
"workspace_balance_creative_units": 123,
"estimated_remaining_balance_creative_units": 123,
"has_sufficient_creative_units": true
}{
"type": "https://api.layer.ai/errors/ERROR_CODE",
"title": "Error Title",
"status": 400,
"detail": "Human-readable description."
}{
"type": "https://api.layer.ai/errors/ERROR_CODE",
"title": "Error Title",
"status": 400,
"detail": "Human-readable description."
}{
"type": "https://api.layer.ai/errors/ERROR_CODE",
"title": "Error Title",
"status": 400,
"detail": "Human-readable description."
}{
"type": "https://api.layer.ai/errors/ERROR_CODE",
"title": "Error Title",
"status": 400,
"detail": "Human-readable description."
}{
"type": "https://api.layer.ai/errors/ERROR_CODE",
"title": "Error Title",
"status": 400,
"detail": "Human-readable description."
}{
"type": "https://api.layer.ai/errors/ERROR_CODE",
"title": "Error Title",
"status": 400,
"detail": "Human-readable description."
}{
"type": "https://api.layer.ai/errors/ERROR_CODE",
"title": "Error Title",
"status": 400,
"detail": "Human-readable description."
}Authorizations
Personal Access Token or OAuth2 JWT. Create a PAT at app.layer.ai → Settings → Personal Access Tokens.
Body
application/json
Workflow inputs matching the workflow's input schema.
Response
Successful Response
Total estimated Creative Units price for this run.
Expected output count for each workflow output parameter.
Show child attributes
Show child attributes
Usable Creative Units balance (total balance minus reserved by in-progress generations).
Usable balance after subtracting the estimated price. Can be negative.
Whether the workspace has enough available Creative Units to cover the estimated price.
⌘I