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, shareToken, editToken, previewUrl,
publicUrl, completedAt) are omitted until generation completes.
Request-side fields such as language, theme, slideCount, mode, and
priceSnapshot may already be present.
{
"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 editor content string
(fetched from S3), title, outline, theme, visibility, and refreshed
editTokenExpiresAt. This is the endpoint the editor itself calls.
Public Share-Token Endpoint
curl https://api.tutorflow.io/v1/platform/slides/public/{shareToken}This endpoint requires no Platform API key and returns the same SlideResDto
shape for the public read-only viewer. Use GET /v1/platform/slides/:id for
owned API-key polling and management, and use the public route only when you
already have the shareToken.