Export branded carousel slides
Give this prompt to your AI agent. The agent does the task for you.
Read https://thirds.ai/docs/carousels and help me turn a multi-page thirds.ai template into ordered carousel images or a PDF, with a clear credit cost.
Keep one saved template and treat each page as a slide. Open the editor, add or reorder pages, then open Export. Choose the slides and the order, check the credit cost, and click the button. A refresh never spends a credit.
A PDF of the selected slides costs one credit. Each successful image costs one credit. Failed slides cost nothing. Retry failed slides does not charge slides that already succeeded.
Copy the launch checklist to start with five portrait slides, or open a PDF you already saved.
Export from the editor
Open a PDF template with two or more pages. Export lists every slide. Leave every box checked to keep the document order, or clear boxes and keep the remaining slides in page order.
Choose One PDF for a single file, or Images ZIP for PNG, JPEG, or WebP files. The button shows the cost before you start. When images finish, download each slide or the ZIP. Retry failed slides if a member fails.
API
Pin the template version. Reuse an idempotency key only for the same body.
This request makes ordered images from the launch checklist pages:
curl --fail-with-body --silent --show-error https://thirds.ai/v1/carousels \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: YOUR_UNIQUE_CAROUSEL_REQUEST' \
--data '{"template_id":"tpl_00000000000000000000000000000000","version":1,"format":"png","pages":["cover","message","offer","proof","action"],"data":{"brand":"Northline Studio","series":"Launch week","headline":"Five slides for one launch week.","cover_line":"A Fieldnote Labs product launch.","date":"21 September 2026","message_title":"Show the change in one sentence.","message_body":"Every client sees the same numbers.","offer_label":"The offer","offer":"14 days","offer_detail":"One owner for every slide.","quote":"The questions finally matched.","attribution":"Maya Chen","role":"Operations lead, Fieldnote Labs","action":"Start this week","action_note":"Export the set as images."}}'const response = await fetch("https://thirds.ai/v1/carousels", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Idempotency-Key": "YOUR_UNIQUE_CAROUSEL_REQUEST"
},
body: JSON.stringify({
"template_id": "tpl_00000000000000000000000000000000",
"version": 1,
"format": "png",
"pages": [
"cover",
"message",
"offer",
"proof",
"action"
],
"data": {
"brand": "Northline Studio",
"series": "Launch week",
"headline": "Five slides for one launch week.",
"cover_line": "A Fieldnote Labs product launch.",
"date": "21 September 2026",
"message_title": "Show the change in one sentence.",
"message_body": "Every client sees the same numbers.",
"offer_label": "The offer",
"offer": "14 days",
"offer_detail": "One owner for every slide.",
"quote": "The questions finally matched.",
"attribution": "Maya Chen",
"role": "Operations lead, Fieldnote Labs",
"action": "Start this week",
"action_note": "Export the set as images."
}
}),
redirect: "error",
signal: AbortSignal.timeout(30000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}; Retry-After: ${response.headers.get("retry-after") ?? "none"}`);
console.log(await response.text());import json
from urllib.error import HTTPError
from urllib.request import HTTPRedirectHandler, Request, build_opener
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
request = Request("https://thirds.ai/v1/carousels",
method="POST",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Idempotency-Key": "YOUR_UNIQUE_CAROUSEL_REQUEST"
},
data=json.dumps({
"template_id": "tpl_00000000000000000000000000000000",
"version": 1,
"format": "png",
"pages": [
"cover",
"message",
"offer",
"proof",
"action"
],
"data": {
"brand": "Northline Studio",
"series": "Launch week",
"headline": "Five slides for one launch week.",
"cover_line": "A Fieldnote Labs product launch.",
"date": "21 September 2026",
"message_title": "Show the change in one sentence.",
"message_body": "Every client sees the same numbers.",
"offer_label": "The offer",
"offer": "14 days",
"offer_detail": "One owner for every slide.",
"quote": "The questions finally matched.",
"attribution": "Maya Chen",
"role": "Operations lead, Fieldnote Labs",
"action": "Start this week",
"action_note": "Export the set as images."
}
}).encode("utf-8"),
)
try:
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(response.read().decode("utf-8"))
except HTTPError as error:
retry = error.headers.get("Retry-After", "none")
raise RuntimeError(f"HTTP {error.code}; Retry-After: {retry}") from NonePoll GET /v1/carousels/{id} until state is complete, partial, or failed. Then download archive_url. POST /v1/carousels/{id}/retry admits failed slides only.
This request makes one PDF of two slides in that order:
curl --fail-with-body --silent --show-error https://thirds.ai/v1/pdf \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: YOUR_UNIQUE_PDF_REQUEST' \
--data '{"template_id":"tpl_00000000000000000000000000000000","version":1,"pages":["cover","action"],"data":{"brand":"Northline Studio","series":"Launch week","headline":"Five slides for one launch week.","cover_line":"A Fieldnote Labs product launch.","date":"21 September 2026","message_title":"Show the change.","message_body":"Every client sees the same numbers.","offer_label":"The offer","offer":"14 days","offer_detail":"One owner for every slide.","quote":"The questions finally matched.","attribution":"Maya Chen","role":"Operations lead, Fieldnote Labs","action":"Start this week","action_note":"Export the set as a PDF."},"pdf":{"width":"1080px","height":"1350px"},"wait":false}'const response = await fetch("https://thirds.ai/v1/pdf", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Idempotency-Key": "YOUR_UNIQUE_PDF_REQUEST"
},
body: JSON.stringify({
"template_id": "tpl_00000000000000000000000000000000",
"version": 1,
"pages": [
"cover",
"action"
],
"data": {
"brand": "Northline Studio",
"series": "Launch week",
"headline": "Five slides for one launch week.",
"cover_line": "A Fieldnote Labs product launch.",
"date": "21 September 2026",
"message_title": "Show the change.",
"message_body": "Every client sees the same numbers.",
"offer_label": "The offer",
"offer": "14 days",
"offer_detail": "One owner for every slide.",
"quote": "The questions finally matched.",
"attribution": "Maya Chen",
"role": "Operations lead, Fieldnote Labs",
"action": "Start this week",
"action_note": "Export the set as a PDF."
},
"pdf": {
"width": "1080px",
"height": "1350px"
},
"wait": false
}),
redirect: "error",
signal: AbortSignal.timeout(30000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}; Retry-After: ${response.headers.get("retry-after") ?? "none"}`);
console.log(await response.text());import json
from urllib.error import HTTPError
from urllib.request import HTTPRedirectHandler, Request, build_opener
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
request = Request("https://thirds.ai/v1/pdf",
method="POST",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Idempotency-Key": "YOUR_UNIQUE_PDF_REQUEST"
},
data=json.dumps({
"template_id": "tpl_00000000000000000000000000000000",
"version": 1,
"pages": [
"cover",
"action"
],
"data": {
"brand": "Northline Studio",
"series": "Launch week",
"headline": "Five slides for one launch week.",
"cover_line": "A Fieldnote Labs product launch.",
"date": "21 September 2026",
"message_title": "Show the change.",
"message_body": "Every client sees the same numbers.",
"offer_label": "The offer",
"offer": "14 days",
"offer_detail": "One owner for every slide.",
"quote": "The questions finally matched.",
"attribution": "Maya Chen",
"role": "Operations lead, Fieldnote Labs",
"action": "Start this week",
"action_note": "Export the set as a PDF."
},
"pdf": {
"width": "1080px",
"height": "1350px"
},
"wait": False
}).encode("utf-8"),
)
try:
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(response.read().decode("utf-8"))
except HTTPError as error:
retry = error.headers.get("Retry-After", "none")
raise RuntimeError(f"HTTP {error.code}; Retry-After: {retry}") from NoneDuplicate or unknown page ids return invalid_request with field pages. Use 1 to 100 different, known page ids. The selected canvases together stay within 128 million pixels.
Node 24:
const response = await fetch("https://thirds.ai/v1/carousels", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.THIRDS_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": "YOUR_UNIQUE_CAROUSEL_REQUEST",
},
body: JSON.stringify({
template_id: "tpl_00000000000000000000000000000000",
version: 1,
format: "png",
pages: ["cover", "action"],
data: { brand: "Northline Studio", action: "Start this week" },
}),
});
const carousel = await response.json();
Python 3:
import os
import urllib.request
request = urllib.request.Request(
"https://thirds.ai/v1/carousels",
data=b'{"template_id":"tpl_00000000000000000000000000000000","version":1,"format":"png","pages":["cover","action"],"data":{"brand":"Northline Studio"}}',
headers={
"Authorization": f"Bearer {os.environ['THIRDS_API_KEY']}",
"Content-Type": "application/json",
"Idempotency-Key": "YOUR_UNIQUE_CAROUSEL_REQUEST",
},
method="POST",
)
See credits, PDF and image options, and the carousel API.