GET /v1/platform/slides/:id
Returns the current status and details of a slide generation request. Use this endpoint to poll for completion when using async mode, or to check the result of a previous request.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
id | string | The slide request ID returned by the create endpoint. |
Example Request
curl https://api.tutorflow.io/v1/platform/slides/61f1b111-0df3-4de3-a83f-d4b10304949d \
-H "Authorization: Bearer tf_platform_..."Response
Returns the same SlideResDto structure as the create endpoint. See
Create Slide for the full list of fields.
When the slide generation is still in progress, isTerminal will be false
and pollAfterMs will indicate how long to wait before polling again.
Example Response (Completed)
{
"id": "61f1b111-0df3-4de3-a83f-d4b10304949d",
"slideId": "669b977b-0007-40b9-8339-2b4e1d8e7c8e",
"status": "COMPLETED",
"isTerminal": true,
"title": "The Mediterranean Diet, Explained",
"description": "A 6-slide overview of the Mediterranean diet's foods, health benefits, and a one-week meal plan.",
"language": "en",
"theme": null,
"slideCount": 6,
"slug": "the-mediterranean-diet-explained-1602dc2c",
"tier": "default",
"mode": "sync",
"priceSnapshot": {
"category": "slide",
"catalogKey": "slide.default",
"tier": "default",
"unit": "slide",
"unitPrice": 0.03,
"units": 6,
"amountUsd": 0.18,
"currency": "USD",
"source": "platform_pricing_catalog_v2"
},
"shareToken": "fda025e5ea364bf30ea46671582d6859",
"editToken": "187d1d98e7cfe5190da4e2cc24bbf65d",
"editTokenExpiresAt": "2026-04-25T14:14:40.890Z",
"previewUrl": "https://tutorflow.io/en/platform/slides/edit/187d1d98e7cfe5190da4e2cc24bbf65d",
"publicUrl": "https://tutorflow.io/en/platform/slides/fda025e5ea364bf30ea46671582d6859",
"idempotencyKey": null,
"idempotentReplay": null,
"createdAt": "2026-04-25T04:14:15.756Z",
"completedAt": "2026-04-25T04:14:40.940Z",
"pollAfterMs": null
}Example Response (Pending)
While a request is pending, only the request-side fields are populated.
Result-side fields (slideId, slideCount, shareToken, editToken,
previewUrl, publicUrl, completedAt) are omitted until generation
completes.
{
"id": "61f1b111-0df3-4de3-a83f-d4b10304949d",
"slideId": null,
"status": "PROCESSING",
"isTerminal": false,
"title": null,
"language": "en",
"theme": null,
"tier": "default",
"mode": "async",
"priceSnapshot": {
"category": "slide",
"catalogKey": "slide.default",
"tier": "default",
"unit": "slide",
"unitPrice": 0.03,
"units": 6,
"amountUsd": 0.18,
"currency": "USD",
"source": "platform_pricing_catalog_v2"
},
"idempotencyKey": null,
"idempotentReplay": null,
"createdAt": "2026-04-25T04:14:15.756Z",
"pollAfterMs": 3000
}Polling Pattern (Async)
const create = await fetch('/v1/platform/slides', {
method: 'POST',
headers: { Authorization: `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ prompt, mode: 'async' }),
}).then((r) => r.json())
let result = create
while (!result.isTerminal) {
await new Promise((r) => setTimeout(r, result.pollAfterMs ?? 3000))
result = await fetch(`/v1/platform/slides/${create.id}`, {
headers: { Authorization: `Bearer ${apiKey}` },
}).then((r) => r.json())
}
// result.previewUrl and result.publicUrl are now populatedGet-by-Edit-Token
If you only have an editToken (not the request id), use:
curl https://api.tutorflow.io/v1/platform/slides/edit/{editToken}This returns a SlideEditResDto with the resolved TipTap content (fetched
from S3), title, outline, theme, visibility, and refreshed editTokenExpiresAt.
This is the endpoint the editor itself calls.