curl --request GET \
--url https://api.recoupable.dev/api/content/estimate \
--header 'x-api-key: <api-key>'import requests
url = "https://api.recoupable.dev/api/content/estimate"
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://api.recoupable.dev/api/content/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.recoupable.dev/api/content/estimate",
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://api.recoupable.dev/api/content/estimate"
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://api.recoupable.dev/api/content/estimate")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.recoupable.dev/api/content/estimate")
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{
"workflows": [
{
"name": "Current (image-to-video)",
"perVideo": 0.82,
"steps": [
{
"name": "Generate Image",
"model": "fal-ai/nano-banana-pro/edit",
"cost": 0.04,
"note": "1 call",
"unit": "images",
"unitPrice": 0.04
}
],
"costBreakdown": {
"mostExpensiveStep": "Generate Video",
"mostExpensivePercent": 68
}
}
],
"comparison": {
"cheapest": "Budget (no upscale, LTX video)",
"cheapestPerVideo": 0.18,
"mostExpensive": "Current (audio-to-video)",
"mostExpensivePerVideo": 0.95,
"savingsPercent": 81
},
"batch": {
"count": 30,
"cheapestTotal": 5.4,
"mostExpensiveTotal": 28.5
}
}{
"error": "Unauthorized"
}Estimate Cost
Estimate the cost of running the content creation pipeline. Calculates per-step and per-video costs based on current pricing. Supports comparing multiple workflow profiles (e.g., premium vs. budget) and projecting batch costs. This endpoint is informational only — it does not trigger any pipeline execution or spend credits.
curl --request GET \
--url https://api.recoupable.dev/api/content/estimate \
--header 'x-api-key: <api-key>'import requests
url = "https://api.recoupable.dev/api/content/estimate"
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://api.recoupable.dev/api/content/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.recoupable.dev/api/content/estimate",
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://api.recoupable.dev/api/content/estimate"
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://api.recoupable.dev/api/content/estimate")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.recoupable.dev/api/content/estimate")
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{
"workflows": [
{
"name": "Current (image-to-video)",
"perVideo": 0.82,
"steps": [
{
"name": "Generate Image",
"model": "fal-ai/nano-banana-pro/edit",
"cost": 0.04,
"note": "1 call",
"unit": "images",
"unitPrice": 0.04
}
],
"costBreakdown": {
"mostExpensiveStep": "Generate Video",
"mostExpensivePercent": 68
}
}
],
"comparison": {
"cheapest": "Budget (no upscale, LTX video)",
"cheapestPerVideo": 0.18,
"mostExpensive": "Current (audio-to-video)",
"mostExpensivePerVideo": 0.95,
"savingsPercent": 81
},
"batch": {
"count": 30,
"cheapestTotal": 5.4,
"mostExpensiveTotal": 28.5
}
}{
"error": "Unauthorized"
}Authorizations
Your Recoup API key. Learn more.
Query Parameters
Which workflow to estimate. false for image-to-video, true for audio-to-video. If omitted, estimates the default image-to-video workflow.
false
Number of videos to project costs for. Use this to answer questions like "how much would 30 videos cost?"
x >= 11
When true, returns estimates for all available workflow profiles (premium, budget, mid) for side-by-side comparison.
false
Response
Cost estimate calculated successfully
Cost estimates based on current pricing. When compare is false, the workflows array contains a single entry. When true, it contains all available profiles.
Was this page helpful?
