Prezent AutoGenerator API

Long-running and synchronous endpoints that generate and manipulate AI-authored presentations from prompts, files, and assets.

Operations 14

POST /api/v1/autogenerations Create an AutoGenerator job #
GET /api/v1/autogenerations/{callback_id} Read an AutoGenerator job #
POST /api/v1/autogenerations/lookups Look up multiple AutoGenerator jobs in one call #
POST /api/v1/autogenerator/meta Fetch slide-metadata for asset IDs #
POST /api/v1/autogenerations/{callback_id}/downloads Create a download artefact for an AutoGenerator deck #
POST /api/v1/autogenerations/{callback_id}/regenerations Create a regeneration of an AutoGenerator deck #
POST /api/v1/autogenerations/{callback_id}/node-changes Create a node-level change on an AutoGenerator slide #
POST /api/v1/autogenerator/slide-data Fetch slide data for a single slide callback #
POST /api/v1/autogenerations/{callback_id}/image-extractions Create an image-extraction for an AutoGenerator deck #
POST /api/v1/autogenerator/brand-image-search Search the caller's brand-image library #
POST /api/v1/autogenerator/library-image-search Search the configured stock-image library #
POST /api/v1/autogenerations/{callback_id}/image-replacements Create an image replacement on an AutoGenerator slide #
POST /api/v1/autogenerations/{callback_id}/reactions Create a reaction on an AutoGenerator deck #
POST /api/v1/autogenerations/{callback_id}/slide-actions Create a per-slide action on an AutoGenerator deck #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/prezent-autogenerator-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

prezent-autogenerator-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Prezent Platform Auto Generator API
  version: 1.0.0
  summary: Agent-ready REST API for Prezent's content-generation and template-conversion services.
  description: "The Prezent Platform API exposes Prezent's AutoGenerator, Template Converter,\nAudiences, Themes, and File-upload services as a uniform JSON HTTP API.\n\nThis contract describes the **target agent-ready shape** of the API: every\ndocumented endpoint returns a uniform success envelope `{ \"success\": true,\n\"data\": { ... } }` or a uniform error envelope `{ \"success\": false,\n\"data\": null, \"error\": { \"code\": \"...\", \"message\": \"...\", \"details\": { ... } } }`.\nError codes are drawn from a stable catalog (see `ErrorCode`). The contract\nis additive: handlers may continue to emit legacy keys alongside the\ndocumented ones for backwards compatibility, so schemas explicitly allow\nadditional properties at the envelope and data levels.\n\nSeveral endpoints kick off long-running background work and return a\n`callback_id` that the client polls against a corresponding status\nendpoint. The canonical async polling endpoint for the Template Converter\nfamily is **`GET /api/v2/template-converter/status/{callback_id}`** which\nuses strict HTTP-status mapping (200 only on workflow success, 4xx/5xx on\nworkflow failure). The v1 polling endpoint at\n`/api/v1/template-converter/status/{callbackId}` (and its REST alias\n`GET /api/v1/template-conversions/{callback_id}`) continues to be served\nwith legacy semantics (HTTP 200 with `status` field) and is intentionally\nomitted from this documentation.\n\n**REST resource aliases (v1.1).** AutoGenerator and Template Converter\nendpoints are documented here under their REST-resource path names\n(`/api/v1/autogenerations`, `/api/v1/template-conversions`). The legacy\nRPC-style paths under `/api/v1/autogenerator/*` and\n`/api/v1/template-converter/*` continue to be served indefinitely; they\nreturn a `Deprecation: true` header pointing to the successor alias.\n\n**Conventions that apply to every endpoint** (full reference in the\ncompanion guides on this documentation site):\n\n- **Auth:** API key as a Bearer token — `Authorization: Bearer <key>`.\n  Each key is scoped to an allow-list of endpoint paths; an out-of-scope\n  call returns `404 ENDPOINT_NOT_FOUND`.\n- **Rate limits:** gateway throttle 10 req/s sustained, 5 burst,\n  1,000 req/day per key; per-company per-category 60-second sliding\n  windows; annual quotas (50,000 slide generations/yr, 1,000,000\n  downloads/yr). Limit breaches return `429` with `error.code`\n  `TOO_MANY_REQUESTS` (gateway), `RATE_LIMIT_EXCEEDED` (per-category),\n  or `USAGE_LIMIT_EXCEEDED` (annual).\n- **Errors:** every error uses the `{ success:false, data:null, error:{\n  code, message, details } }` envelope with stable, documented `code`\n  values.\n- **Idempotency & pagination:** mutating requests accept an\n  `Idempotency-Key`; list endpoints accept opt-in `limit`/`cursor`\n  paging.\n\n**Building with an AI agent?** Prezent ships a first-class Model Context\nProtocol (MCP) server. The hosted endpoint is\n`https://mcp.myprezent.com/mcp` (OAuth 2.1, works with Claude.ai Custom\nConnectors); a local stdio server is published on PyPI as\n`prezent-mcp-server` and plugs into Claude Desktop, Cursor, Cline,\nContinue, and Zed. The MCP tools wrap the same REST endpoints\ndescribed here.\n\n**Official SDKs.** Typed REST clients are published for Python and\nTypeScript (`prezent-sdk`) — generated from and versioned against this\nspec. For other languages, generate a client from this document.\n\n**Out of scope of this document:** SCIM endpoints under `/api/v1/scim/*`.\nThose endpoints conform to RFC 7644 (SCIM 2.0) and follow a different\nenvelope (`schemas`, `Resources`, `totalResults`, etc.). They are\ndocumented separately at /docs/scim-user-management.\n"
  x-out-of-scope-note: 'SCIM endpoints (`/api/v1/scim/*`) are NOT included in this spec. They

    follow RFC 7644 (SCIM 2.0) and are documented in a separate document at

    /docs/scim-user-management.

    '
  contact:
    name: Prezent API Support
    email: support@prezent.ai
    url: https://prezent.ai
  license:
    name: Proprietary - Prezent, Inc.
    url: https://prezent.ai/terms
servers:
- url: https://api.prezent.ai
  description: Production (canonical)
- url: https://uatstage-api.myprezent.com
  description: UAT (user acceptance testing)
- url: https://devstage-api.myprezent.com
  description: Development
security:
- BearerAuth: []
tags:
- name: AutoGenerator
  description: Long-running and synchronous endpoints that generate and manipulate AI-authored presentations from prompts, files, and assets.
paths:
  /api/v1/autogenerations:
    post:
      tags:
      - AutoGenerator
      summary: Create an AutoGenerator job
      description: 'Kicks off a background pipeline that turns the supplied prompt,

        context files, and assets into a Prezent presentation. Returns a

        `callback_id` that the caller polls via

        `GET /api/v1/autogenerations/{callback_id}` until `status` is

        `success` or `failed`.

        '
      operationId: createAutogeneration
      x-rate-limit-category: autogenerator
      parameters:
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AutoGeneratorStartRequest'
      responses:
        '200':
          description: Job accepted; client must poll for completion.
          headers:
            Idempotency-Replayed:
              $ref: '#/components/headers/IdempotencyReplayed'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AutoGeneratorStartResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/IdempotencyConflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
        '504':
          $ref: '#/components/responses/GatewayTimeout'
  /api/v1/autogenerations/{callback_id}:
    get:
      tags:
      - AutoGenerator
      summary: Read an AutoGenerator job
      description: 'Returns the current state of a previously started AutoGenerator job.

        The `status` field in the response data is one of

        `in_progress`, `success`, or `failed`. Once `success`, the payload

        also contains the generated slides, extracted images, theme/audience

        metadata, and other context required to display or further edit

        the deck.


        For the same `callback_id`, polling after `status=success` returns

        the same cached payload.

        '
      operationId: getAutogeneration
      x-rate-limit-category: autogenerator
      parameters:
      - $ref: '#/components/parameters/CallbackIdPath'
      - in: query
        name: deck_callback_id
        required: false
        description: Original deck callback id when polling a regenerate sub-job.
        schema:
          type: string
      - in: query
        name: operation
        required: false
        description: Sub-operation hint (used by regenerate flows).
        schema:
          type: string
      - in: query
        name: status_auto_polling
        required: false
        description: Pass `true` to indicate the caller is auto-polling; affects how stalled jobs are surfaced.
        schema:
          type: string
          enum:
          - 'true'
          - 'false'
      responses:
        '200':
          description: Current job status returned.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AutoGeneratorStatusResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
        '504':
          $ref: '#/components/responses/GatewayTimeout'
  /api/v1/autogenerations/lookups:
    post:
      tags:
      - AutoGenerator
      summary: Look up multiple AutoGenerator jobs in one call
      description: 'Returns layout metadata for each `callback_id` in the request. Use

        when rendering a list view that needs many decks at once.

        '
      operationId: createAutogenerationLookup
      x-rate-limit-category: autogenerator
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AutoGeneratorStatusBulkRequest'
      responses:
        '200':
          description: Bulk status returned.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AutoGeneratorStatusBulkResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
        '504':
          $ref: '#/components/responses/GatewayTimeout'
  /api/v1/autogenerator/meta:
    post:
      tags:
      - AutoGenerator
      summary: Fetch slide-metadata for asset IDs
      description: 'Returns slide-level metadata (titles, layout codes, thumbnails) for

        each asset id provided. Used by editors that need to enrich a slide

        list without re-running generation.

        '
      operationId: getAutoGeneratorMeta
      x-rate-limit-category: autogenerator
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AutoGeneratorMetaRequest'
      responses:
        '200':
          description: Metadata returned for each asset id.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AutoGeneratorMetaResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
        '504':
          $ref: '#/components/responses/GatewayTimeout'
  /api/v1/autogenerations/{callback_id}/downloads:
    post:
      tags:
      - AutoGenerator
      summary: Create a download artefact for an AutoGenerator deck
      description: 'Synchronously merges all slides for the given `callback_id` into a

        single PowerPoint (or PDF, depending on `outputFormat`) and returns

        a signed download URL. The merge step can take up to 60 seconds.

        Subject to the `AUTO_GEN_DOWNLOAD` usage limit in addition to the

        normal rate limits.

        '
      operationId: createAutogenerationDownload
      x-rate-limit-category: autogenerator
      parameters:
      - $ref: '#/components/parameters/CallbackIdPath'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AutoGeneratorDownloadRequest'
      responses:
        '200':
          description: Merged deck produced; signed URL returned.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AutoGeneratorDownloadResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
        '504':
          $ref: '#/components/responses/GatewayTimeout'
  /api/v1/autogenerations/{callback_id}/regenerations:
    post:
      tags:
      - AutoGenerator
      summary: Create a regeneration of an AutoGenerator deck
      description: 'Re-runs a portion of an existing AutoGenerator deck — typically a

        slide, node, or section — and returns a new `callback_id` to poll.

        Counted as a fresh generation against the `AUTO_GEN` usage cap.

        '
      operationId: createAutogenerationRegeneration
      x-rate-limit-category: autogenerator
      parameters:
      - $ref: '#/components/parameters/CallbackIdPath'
      - in: query
        name: operation
        required: true
        description: The regenerate sub-operation (for example `node_change`, `slide_regenerate`).
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AutoGeneratorRegenerateRequest'
      responses:
        '200':
          description: Regenerate job accepted; poll the returned `new_callback_id`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AutoGeneratorRegenerateResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
        '504':
          $ref: '#/components/responses/GatewayTimeout'
  /api/v1/autogenerations/{callback_id}/node-changes:
    post:
      tags:
      - AutoGenerator
      summary: Create a node-level change on an AutoGenerator slide
      description: 'Mutates a single node (text, image, shape) within a slide of an

        existing deck. Returns the updated slide payload synchronously.

        '
      operationId: createAutogenerationNodeChange
      x-rate-limit-category: autogenerator
      parameters:
      - $ref: '#/components/parameters/CallbackIdPath'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AutoGeneratorNodeChangeRequest'
      responses:
        '200':
          description: Node change applied.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AutoGeneratorGenericDataResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
        '504':
          $ref: '#/components/responses/GatewayTimeout'
  /api/v1/autogenerator/slide-data:
    post:
      tags:
      - AutoGenerator
      summary: Fetch slide data for a single slide callback
      description: 'Returns the raw slide-data document (text, images, layout,

        speaker notes) for the given `slide_callback_id`.

        '
      operationId: getAutoGeneratorSlideData
      x-rate-limit-category: autogenerator
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AutoGeneratorSlideDataRequest'
      responses:
        '200':
          description: Slide data returned.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AutoGeneratorGenericDataResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
        '504':
          $ref: '#/components/responses/GatewayTimeout'
  /api/v1/autogenerations/{callback_id}/image-extractions:
    post:
      tags:
      - AutoGenerator
      summary: Create an image-extraction for an AutoGenerator deck
      description: 'Reads the PowerPoint at the given S3 location and returns the list

        of embedded images. If `force_update` is true, re-runs extraction

        even when cached results exist.

        '
      operationId: createAutogenerationImageExtraction
      x-rate-limit-category: autogenerator
      parameters:
      - $ref: '#/components/parameters/CallbackIdPath'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AutoGeneratorExtractImagesRequest'
      responses:
        '200':
          description: Image list returned.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AutoGeneratorGenericDataResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
        '504':
          $ref: '#/components/responses/GatewayTimeout'
  /api/v1/autogenerator/brand-image-search:
    post:
      tags:
      - AutoGenerator
      summary: Search the caller's brand-image library
      description: 'Returns brand images that match the query string, ordered by

        relevance. Supports `skip` and `limit` for pagination.

        '
      operationId: searchAutoGeneratorBrandImages
      x-rate-limit-category: autogenerator
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AutoGeneratorBrandImageSearchRequest'
      responses:
        '200':
          description: Matching brand images returned.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AutoGeneratorMessageDataResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
        '504':
          $ref: '#/components/responses/GatewayTimeout'
  /api/v1/autogenerator/library-image-search:
    post:
      tags:
      - AutoGenerator
      summary: Search the configured stock-image library
      description: 'Searches the configured stock image provider (Adobe Stock or

        Freepik, depending on company configuration). Supports

        `limit`/`offset` pagination. If `searchKey` is omitted, the

        handler infers it from the supplied slide context.

        '
      operationId: searchAutoGeneratorLibraryImages
      x-rate-limit-category: autogenerator
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AutoGeneratorLibraryImageSearchRequest'
      responses:
        '200':
          description: Matching library images returned.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AutoGeneratorMessageDataResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
        '504':
          $ref: '#/components/responses/GatewayTimeout'
  /api/v1/autogenerations/{callback_id}/image-replacements:
    post:
      tags:
      - AutoGenerator
      summary: Create an image replacement on an AutoGenerator slide
      description: 'Swaps an image on a slide with a new image sourced from the

        caller''s workspace, Adobe Stock, Freepik, a previously uploaded

        file, an extracted image, or S3.

        '
      operationId: createAutogenerationImageReplacement
      x-rate-limit-category: autogenerator
      parameters:
      - $ref: '#/components/parameters/CallbackIdPath'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AutoGeneratorReplaceImageRequest'
      responses:
        '200':
          description: Image replacement completed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AutoGeneratorMessageDataResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
        '504':
          $ref: '#/components/responses/GatewayTimeout'
  /api/v1/autogenerations/{callback_id}/reactions:
    post:
      tags:
      - AutoGenerator
      summary: Create a reaction on an AutoGenerator deck
      description: 'Persists a user reaction (like) or qualitative feedback against a

        previously generated deck/slide. When `type` is `feedback`,

        `shareDetails` must be provided.

        '
      operationId: createAutogenerationReaction
      x-rate-limit-category: autogenerator
      parameters:
      - $ref: '#/components/parameters/CallbackIdPath'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AutoGeneratorReactionFeedbackRequest'
      responses:
        '200':
          description: Reaction/feedback stored.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AutoGeneratorReactionFeedbackResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
        '504':
          $ref: '#/components/responses/GatewayTimeout'
  /api/v1/autogenerations/{callback_id}/slide-actions:
    post:
      tags:
      - AutoGenerator
      summary: Create a per-slide action on an AutoGenerator deck
      description: 'Performs one of four actions against a slide: `duplicate`,

        `delete`, `add_sources_to_slides_note`, or `speaker_notes`. The

        required body fields depend on `action`.

        '
      operationId: createAutogenerationSlideAction
      x-rate-limit-category: autogenerator
      parameters:
      - $ref: '#/components/parameters/CallbackIdPath'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AutoGeneratorSlideActionsRequest'
      responses:
        '200':
          description: Slide action completed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AutoGeneratorSlideActionsResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
        '504':
          $ref: '#/components/responses/GatewayTimeout'
components:
  responses:
    InternalServerError:
      description: Unexpected server error. `error.code` is `INTERNAL_SERVER_ERROR`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            success: false
            data: null
            error:
              code: INTERNAL_SERVER_ERROR
              message: An unexpected server error occurred.
              details: {}
    Unauthorized:
      description: 'Caller did not present a valid Bearer token, or the token has

        expired. `error.code` is one of `UNAUTHORIZED`, `INVALID_API_KEY`,

        `EXPIRED_API_KEY`.

        '
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            success: false
            data: null
            error:
              code: INVALID_API_KEY
              message: API key not found or not authorized.
              details: {}
    Forbidden:
      description: Caller is authenticated but not allowed to perform this operation. `error.code` is `FORBIDDEN`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            success: false
            data: null
            error:
              code: FORBIDDEN
              message: Access to the resource is forbidden.
              details: {}
    IdempotencyConflict:
      description: 'The supplied `Idempotency-Key` was already used with a different

        request body. Reuse a key only for identical retried requests.

        '
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            success: false
            data: null
            error:
              code: IDEMPOTENCY_KEY_REUSED_WITH_DIFFERENT_BODY
              message: This Idempotency-Key was already used with a different request body.
              details: {}
    RateLimited:
      description: "Rate limit, usage limit, or gateway-level throttle exceeded.\n`error.code` is `TOO_MANY_REQUESTS` (gateway throttle),\n`RATE_LIMIT_EXCEEDED` (per-category), or `USAGE_LIMIT_EXCEEDED`\n(annual quota).\n\nDefault limits (all configurable per company/key):\n- Gateway throttle (per API key) → `TOO_MANY_REQUESTS`: 10 requests/second\n  sustained, 5 burst, 1,000 requests/day.\n- Per-company, per-category sliding 60-second window →\n  `RATE_LIMIT_EXCEEDED`. The applicable category is given by each\n  operation's `x-rate-limit-category`.\n- Annual usage quota → `USAGE_LIMIT_EXCEEDED`: 50,000 slide\n  generations/year and 1,000,000 presentation downloads/year.\n\n`X-RateLimit-Limit`/`X-RateLimit-Remaining`/`X-RateLimit-Reset` are\nreturned on successful (2xx) responses from rate-limited endpoints\nand, with `Retry-After`, on the per-category `RATE_LIMIT_EXCEEDED`\n429 (the headers declared below). The gateway `TOO_MANY_REQUESTS`\nand annual `USAGE_LIMIT_EXCEEDED` responses do not carry them. Read\n`X-RateLimit-Remaining` to self-throttle and honour `Retry-After` on\na 429.\n"
      headers:
        X-RateLimit-Limit:
          $ref: '#/components/headers/XRateLimitLimit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/XRateLimitRemaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/XRateLimitReset'
        Retry-After:
          $ref: '#/components/headers/RetryAfter'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            success: false
            data: null
            error:
              code: RATE_LIMIT_EXCEEDED
              message: Rate limit exceeded for this category. Try again later.
              details:
                category: auto_generator
                retry_after_seconds: 12
    BadRequest:
      description: Generic client error. `error.code` is one of `BAD_REQUEST`, `INVALID_JSON`, `MISSING_REQUIRED_FIELD`, `MISSING_QUERY_PARAM`, `MISSING_CALLBACK_ID`, `MISSING_SLIDES_ARRAY`, `MISSING_PROMPT`, `MISSING_TEMPLATE_ID`, `MISSING_FILE_CONTENT`, `MISSING_SHARE_DETAILS`, `INVALID_TYPE`, `INVALID_DATA`, `INVALID_DATA_TYPE`, `INVALID_PAYLOAD`, `INVALID_REQUEST`, `API_REQUEST_FAILED`, or `FILE_UPLOAD_FAILED`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            success: false
            data: null
            error:
              code: BAD_REQUEST
              message: Bad request.
              details: {}
    NotFound:
      description: 'Requested endpoint or resource does not exist. `error.code` is

        one of `ENDPOINT_NOT_FOUND`, `RESOURCE_NOT_FOUND`, `NOT_FOUND`.

        '
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            success: false
            data: null
            error:
        

# --- truncated at 32 KB (60 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/prezent/refs/heads/main/openapi/prezent-autogenerator-api-openapi.yml