curl --request POST \
--url https://app.uselamina.ai/v1/content/batch \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"items": [
{
"brief": "Lifestyle photo of sneakers in urban park, golden-hour lighting",
"platform": "instagram",
"modality": "image"
},
{
"brief": "Product flat-lay of full colorway lineup, minimalist styling",
"platform": "instagram",
"modality": "image"
},
{
"brief": "15-second video of sneaker unboxing with ASMR-style close-ups",
"platform": "tiktok",
"modality": "video"
}
],
"brandProfileId": null,
"campaignId": null
}
'import requests
url = "https://app.uselamina.ai/v1/content/batch"
payload = {
"items": [
{
"brief": "Lifestyle photo of sneakers in urban park, golden-hour lighting",
"platform": "instagram",
"modality": "image"
},
{
"brief": "Product flat-lay of full colorway lineup, minimalist styling",
"platform": "instagram",
"modality": "image"
},
{
"brief": "15-second video of sneaker unboxing with ASMR-style close-ups",
"platform": "tiktok",
"modality": "video"
}
],
"brandProfileId": None,
"campaignId": None
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
items: [
{
brief: 'Lifestyle photo of sneakers in urban park, golden-hour lighting',
platform: 'instagram',
modality: 'image'
},
{
brief: 'Product flat-lay of full colorway lineup, minimalist styling',
platform: 'instagram',
modality: 'image'
},
{
brief: '15-second video of sneaker unboxing with ASMR-style close-ups',
platform: 'tiktok',
modality: 'video'
}
],
brandProfileId: null,
campaignId: null
})
};
fetch('https://app.uselamina.ai/v1/content/batch', 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/content/batch",
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([
'items' => [
[
'brief' => 'Lifestyle photo of sneakers in urban park, golden-hour lighting',
'platform' => 'instagram',
'modality' => 'image'
],
[
'brief' => 'Product flat-lay of full colorway lineup, minimalist styling',
'platform' => 'instagram',
'modality' => 'image'
],
[
'brief' => '15-second video of sneaker unboxing with ASMR-style close-ups',
'platform' => 'tiktok',
'modality' => 'video'
]
],
'brandProfileId' => null,
'campaignId' => null
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.uselamina.ai/v1/content/batch"
payload := strings.NewReader("{\n \"items\": [\n {\n \"brief\": \"Lifestyle photo of sneakers in urban park, golden-hour lighting\",\n \"platform\": \"instagram\",\n \"modality\": \"image\"\n },\n {\n \"brief\": \"Product flat-lay of full colorway lineup, minimalist styling\",\n \"platform\": \"instagram\",\n \"modality\": \"image\"\n },\n {\n \"brief\": \"15-second video of sneaker unboxing with ASMR-style close-ups\",\n \"platform\": \"tiktok\",\n \"modality\": \"video\"\n }\n ],\n \"brandProfileId\": null,\n \"campaignId\": null\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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://app.uselamina.ai/v1/content/batch")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"items\": [\n {\n \"brief\": \"Lifestyle photo of sneakers in urban park, golden-hour lighting\",\n \"platform\": \"instagram\",\n \"modality\": \"image\"\n },\n {\n \"brief\": \"Product flat-lay of full colorway lineup, minimalist styling\",\n \"platform\": \"instagram\",\n \"modality\": \"image\"\n },\n {\n \"brief\": \"15-second video of sneaker unboxing with ASMR-style close-ups\",\n \"platform\": \"tiktok\",\n \"modality\": \"video\"\n }\n ],\n \"brandProfileId\": null,\n \"campaignId\": null\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.uselamina.ai/v1/content/batch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"items\": [\n {\n \"brief\": \"Lifestyle photo of sneakers in urban park, golden-hour lighting\",\n \"platform\": \"instagram\",\n \"modality\": \"image\"\n },\n {\n \"brief\": \"Product flat-lay of full colorway lineup, minimalist styling\",\n \"platform\": \"instagram\",\n \"modality\": \"image\"\n },\n {\n \"brief\": \"15-second video of sneaker unboxing with ASMR-style close-ups\",\n \"platform\": \"tiktok\",\n \"modality\": \"video\"\n }\n ],\n \"brandProfileId\": null,\n \"campaignId\": null\n}"
response = http.request(request)
puts response.read_body{
"data": {
"batchId": "batch-001",
"total": 3,
"queued": 2,
"failed": 1,
"items": [
{
"index": 0,
"status": "queued",
"runId": "exec-001",
"workflowId": "80d4d454-8844-489f-b903-2ad65a414482",
"workflowName": "AI Product Photography"
},
{
"index": 1,
"status": "queued",
"runId": "exec-002",
"workflowId": "80d4d454-8844-489f-b903-2ad65a414482",
"workflowName": "AI Product Photography"
},
{
"index": 2,
"status": "failed",
"error": "No video-capable app found for this workspace"
}
]
}
}{
"error": "items[2].brief is required (string)"
}{
"error": "Invalid API key"
}"Too many requests from this IP, please try again in a minute"Batch Create Content
Create multiple content pieces in a single request. Brand context is resolved once and shared across all items for consistency and efficiency.
Each item in the items array is an independent content creation request with
its own brief and optional overrides. All items are executed in parallel.
Limits: Maximum 10 items per batch.
Response: Returns immediately with a batchId and per-item status. Items
that could not be started are marked as failed with an error message. Successful
items are queued with a run ID you can poll individually.
Agent usage pattern:
- Generate briefs with
POST /v1/content/brief(count: 5) - Feed all briefs into this endpoint as a batch
- Poll each
runIdfrom the response for results
curl --request POST \
--url https://app.uselamina.ai/v1/content/batch \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"items": [
{
"brief": "Lifestyle photo of sneakers in urban park, golden-hour lighting",
"platform": "instagram",
"modality": "image"
},
{
"brief": "Product flat-lay of full colorway lineup, minimalist styling",
"platform": "instagram",
"modality": "image"
},
{
"brief": "15-second video of sneaker unboxing with ASMR-style close-ups",
"platform": "tiktok",
"modality": "video"
}
],
"brandProfileId": null,
"campaignId": null
}
'import requests
url = "https://app.uselamina.ai/v1/content/batch"
payload = {
"items": [
{
"brief": "Lifestyle photo of sneakers in urban park, golden-hour lighting",
"platform": "instagram",
"modality": "image"
},
{
"brief": "Product flat-lay of full colorway lineup, minimalist styling",
"platform": "instagram",
"modality": "image"
},
{
"brief": "15-second video of sneaker unboxing with ASMR-style close-ups",
"platform": "tiktok",
"modality": "video"
}
],
"brandProfileId": None,
"campaignId": None
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
items: [
{
brief: 'Lifestyle photo of sneakers in urban park, golden-hour lighting',
platform: 'instagram',
modality: 'image'
},
{
brief: 'Product flat-lay of full colorway lineup, minimalist styling',
platform: 'instagram',
modality: 'image'
},
{
brief: '15-second video of sneaker unboxing with ASMR-style close-ups',
platform: 'tiktok',
modality: 'video'
}
],
brandProfileId: null,
campaignId: null
})
};
fetch('https://app.uselamina.ai/v1/content/batch', 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/content/batch",
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([
'items' => [
[
'brief' => 'Lifestyle photo of sneakers in urban park, golden-hour lighting',
'platform' => 'instagram',
'modality' => 'image'
],
[
'brief' => 'Product flat-lay of full colorway lineup, minimalist styling',
'platform' => 'instagram',
'modality' => 'image'
],
[
'brief' => '15-second video of sneaker unboxing with ASMR-style close-ups',
'platform' => 'tiktok',
'modality' => 'video'
]
],
'brandProfileId' => null,
'campaignId' => null
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.uselamina.ai/v1/content/batch"
payload := strings.NewReader("{\n \"items\": [\n {\n \"brief\": \"Lifestyle photo of sneakers in urban park, golden-hour lighting\",\n \"platform\": \"instagram\",\n \"modality\": \"image\"\n },\n {\n \"brief\": \"Product flat-lay of full colorway lineup, minimalist styling\",\n \"platform\": \"instagram\",\n \"modality\": \"image\"\n },\n {\n \"brief\": \"15-second video of sneaker unboxing with ASMR-style close-ups\",\n \"platform\": \"tiktok\",\n \"modality\": \"video\"\n }\n ],\n \"brandProfileId\": null,\n \"campaignId\": null\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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://app.uselamina.ai/v1/content/batch")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"items\": [\n {\n \"brief\": \"Lifestyle photo of sneakers in urban park, golden-hour lighting\",\n \"platform\": \"instagram\",\n \"modality\": \"image\"\n },\n {\n \"brief\": \"Product flat-lay of full colorway lineup, minimalist styling\",\n \"platform\": \"instagram\",\n \"modality\": \"image\"\n },\n {\n \"brief\": \"15-second video of sneaker unboxing with ASMR-style close-ups\",\n \"platform\": \"tiktok\",\n \"modality\": \"video\"\n }\n ],\n \"brandProfileId\": null,\n \"campaignId\": null\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.uselamina.ai/v1/content/batch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"items\": [\n {\n \"brief\": \"Lifestyle photo of sneakers in urban park, golden-hour lighting\",\n \"platform\": \"instagram\",\n \"modality\": \"image\"\n },\n {\n \"brief\": \"Product flat-lay of full colorway lineup, minimalist styling\",\n \"platform\": \"instagram\",\n \"modality\": \"image\"\n },\n {\n \"brief\": \"15-second video of sneaker unboxing with ASMR-style close-ups\",\n \"platform\": \"tiktok\",\n \"modality\": \"video\"\n }\n ],\n \"brandProfileId\": null,\n \"campaignId\": null\n}"
response = http.request(request)
puts response.read_body{
"data": {
"batchId": "batch-001",
"total": 3,
"queued": 2,
"failed": 1,
"items": [
{
"index": 0,
"status": "queued",
"runId": "exec-001",
"workflowId": "80d4d454-8844-489f-b903-2ad65a414482",
"workflowName": "AI Product Photography"
},
{
"index": 1,
"status": "queued",
"runId": "exec-002",
"workflowId": "80d4d454-8844-489f-b903-2ad65a414482",
"workflowName": "AI Product Photography"
},
{
"index": 2,
"status": "failed",
"error": "No video-capable app found for this workspace"
}
]
}
}{
"error": "items[2].brief is required (string)"
}{
"error": "Invalid API key"
}"Too many requests from this IP, please try again in a minute"Authorizations
Workspace API key. Prefix: lma_. Example: lma_abc123...
Body
Array of content creation requests (1-10 items).
1 - 10 elementsShow child attributes
Show child attributes
Default brand profile for all items (individual items can override).
Default campaign for all items (individual items can override).
Response
Batch creation started. Poll individual run IDs for results.
Result of a batch content creation request.
Show child attributes
Show child attributes