Get Slide

Retrieve the status and details of a slide generation request.

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

ParameterTypeDescription
idstringThe 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 populated

Get-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.