slideforge-dev Jobs API

The jobs API from slideforge-dev — 11 operation(s) for jobs.

Operations 12

GET /v1/jobs List your jobs #
GET /v1/jobs/{job_id} Get job status #
DELETE /v1/jobs/{job_id} Delete a job #
GET /v1/jobs/{job_id}/versions Get all versions of a slide #
POST /v1/jobs/{job_id}/download-url Mint a fresh short-lived, single-use download URL for an owned job #
GET /v1/jobs/{job_id}/pptx Download PPTX for a completed job #
GET /v1/jobs/{job_id}/preview Download PNG preview for a completed job #
GET /v1/jobs/{job_id}/preview/{size} Download sized preview (sm=256px, md=640px) #
GET /v1/jobs/{job_id}/contact_sheet Download the whole-deck contact-sheet PNG #
GET /v1/jobs/{job_id}/contact_sheet/{size} Download sized deck contact sheet (sm/md) #
GET /v1/jobs/{job_id}/slides/{slide_number}/preview Download per-slide preview PNG #
GET /v1/jobs/{job_id}/pdf Download PDF for a completed job #

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/slideforge-dev:slideforge-dev-jobs-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 form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

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

OpenAPI Specification

slideforge-dev-jobs-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: SlideForge Jobs API
  description: 'Agent-first PowerPoint generation. Send structured slide intents (a `form` plus typed fields) or a brief; get back a real, editable `.pptx`. The draw path is deterministic — no model renders your slide, so supplied numbers and text come out verbatim. Every response carries `status`, `fidelity` and `warnings` so an automated caller can tell whether the output is usable. $0.05 per slide; an unusable slide is not billed. Authenticate with a SlideForge API key (`Authorization: Bearer sf_live_…` or `X-API-Key`) — new accounts include 60 free slides, no credit card: https://slideforge.dev/sign-up'
  version: 5.356.0
servers:
- url: https://api.slideforge.dev
security:
- bearerAuth: []
- apiKeyAuth: []
tags:
- name: Jobs
paths:
  /v1/jobs:
    get:
      tags:
      - Jobs
      summary: List your jobs
      description: List your recent generation jobs with optional status filter. Paginated via `limit` and `offset` parameters. Returns newest first.
      operationId: list_jobs_v1_jobs_get
      parameters:
      - name: status
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: 'Filter by status: queued, generating, executing, rendering, complete, failed'
          title: Status
        description: 'Filter by status: queued, generating, executing, rendering, complete, failed'
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          maximum: 100
          minimum: 1
          description: Max jobs to return (default 10)
          default: 10
          title: Limit
        description: Max jobs to return (default 10)
      - name: offset
        in: query
        required: false
        schema:
          type: integer
          minimum: 0
          description: Number of jobs to skip
          default: 0
          title: Offset
        description: Number of jobs to skip
      - name: detail
        in: query
        required: false
        schema:
          type: string
          description: '''compact'' (default: id, name, status, type, cost, date) or ''full'' (adds brief, signed URLs, score)'
          default: compact
          title: Detail
        description: '''compact'' (default: id, name, status, type, cost, date) or ''full'' (adds brief, signed URLs, score)'
      - name: include_children
        in: query
        required: false
        schema:
          type: boolean
          description: Include deck child slides (each carries parent_deck_id). Default false shows parents only.
          default: false
          title: Include Children
        description: Include deck child slides (each carries parent_deck_id). Default false shows parents only.
      responses:
        '200':
          description: Paginated list of jobs
          content:
            application/json:
              schema: {}
        '401':
          description: Authentication required
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/jobs/{job_id}:
    get:
      tags:
      - Jobs
      summary: Get job status
      description: Poll a generation job's status. Returns pptx_url and preview_url when complete. For deck jobs, includes per-slide progress. Includes `cost_charged` — the retail price you paid.
      operationId: get_job_status_v1_jobs__job_id__get
      parameters:
      - name: job_id
        in: path
        required: true
        schema:
          type: string
          title: Job Id
      - name: wait
        in: query
        required: false
        schema:
          type: integer
          maximum: 60
          minimum: 0
          description: 'Long-poll: hold the connection up to N seconds (max 60) waiting for terminal status. 0 = immediate response (default).'
          default: 0
          title: Wait
        description: 'Long-poll: hold the connection up to N seconds (max 60) waiting for terminal status. 0 = immediate response (default).'
      - name: fields
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: 'Comma-separated field names to include (e.g. ''status,cost_charged''). Returns only those fields + job_id. Default: all fields.'
          title: Fields
        description: 'Comma-separated field names to include (e.g. ''status,cost_charged''). Returns only those fields + job_id. Default: all fields.'
      - name: sig
        in: query
        required: false
        schema:
          type: string
          description: HMAC signature for signed-URL polling (used by MCP Apps iframe which has no Bearer token).
          default: ''
          title: Sig
        description: HMAC signature for signed-URL polling (used by MCP Apps iframe which has no Bearer token).
      - name: exp
        in: query
        required: false
        schema:
          type: string
          description: Signature expiry timestamp (unix epoch).
          default: ''
          title: Exp
        description: Signature expiry timestamp (unix epoch).
      responses:
        '200':
          description: Job status with results when complete
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobStatus'
        '404':
          description: Job not found or not owned by you
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    delete:
      tags:
      - Jobs
      summary: Delete a job
      description: Delete a job and its entire iteration chain (all versions). Also deletes associated blobs (PPTX, previews) from storage. This action is irreversible.
      operationId: delete_job_endpoint_v1_jobs__job_id__delete
      parameters:
      - name: job_id
        in: path
        required: true
        schema:
          type: string
          title: Job Id
      responses:
        '200':
          description: Job deleted successfully
          content:
            application/json:
              schema: {}
        '404':
          description: Job not found or not owned by you
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/jobs/{job_id}/versions:
    get:
      tags:
      - Jobs
      summary: Get all versions of a slide
      description: Returns the full iteration chain for a job — walks up to the root, then finds all descendants. Works from any job in the chain.
      operationId: get_job_versions_v1_jobs__job_id__versions_get
      parameters:
      - name: job_id
        in: path
        required: true
        schema:
          type: string
          title: Job Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/jobs/{job_id}/download-url:
    post:
      tags:
      - Jobs
      summary: Mint a fresh short-lived, single-use download URL for an owned job
      description: 'Artifact-security (#73): exchange an owned job for a click-time download URL — short TTL, single-use, key-versioned (instantly revocable). Ownership-gated. Prefer this over holding a long-lived render-time link, so a leaked transcript/log leaks an inert pointer, not access.'
      operationId: mint_job_download_url_v1_jobs__job_id__download_url_post
      parameters:
      - name: job_id
        in: path
        required: true
        schema:
          type: string
          title: Job Id
      requestBody:
        content:
          application/json:
            schema:
              anyOf:
              - $ref: '#/components/schemas/DownloadUrlRequest'
              - type: 'null'
              title: Body
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/jobs/{job_id}/pptx:
    get:
      tags:
      - Jobs
      summary: Download PPTX for a completed job
      description: Stream the PowerPoint file for a completed job. This URL IS the PPTX file — give it directly to users as a download link.
      operationId: get_job_pptx_v1_jobs__job_id__pptx_get
      parameters:
      - name: job_id
        in: path
        required: true
        schema:
          type: string
          title: Job Id
      - name: sig
        in: query
        required: false
        schema:
          type: string
          default: ''
          title: Sig
      - name: exp
        in: query
        required: false
        schema:
          type: string
          default: ''
          title: Exp
      - name: kv
        in: query
        required: false
        schema:
          type: string
          default: ''
          title: Kv
      - name: n
        in: query
        required: false
        schema:
          type: string
          default: ''
          title: N
      responses:
        '200':
          description: PPTX file
          content:
            application/json:
              schema: {}
            application/vnd.openxmlformats-officedocument.presentationml.presentation: {}
        '404':
          description: Job not found or no PPTX available
        '409':
          description: Job not complete
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/jobs/{job_id}/preview:
    get:
      tags:
      - Jobs
      summary: Download PNG preview for a completed job
      description: Stream the full-size slide preview PNG. Use /preview/md for 640px or /preview/sm for 256px thumbnails.
      operationId: get_job_preview_v1_jobs__job_id__preview_get
      parameters:
      - name: job_id
        in: path
        required: true
        schema:
          type: string
          title: Job Id
      - name: sig
        in: query
        required: false
        schema:
          type: string
          default: ''
          title: Sig
      - name: exp
        in: query
        required: false
        schema:
          type: string
          default: ''
          title: Exp
      - name: kv
        in: query
        required: false
        schema:
          type: string
          default: ''
          title: Kv
      - name: n
        in: query
        required: false
        schema:
          type: string
          default: ''
          title: N
      responses:
        '200':
          description: PNG image
          content:
            application/json:
              schema: {}
            image/png: {}
        '404':
          description: Job not found or no preview
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/jobs/{job_id}/preview/{size}:
    get:
      tags:
      - Jobs
      summary: Download sized preview (sm=256px, md=640px)
      description: Stream a sized preview PNG (sm/md) — via a signed link OR (Phase 2) an authenticated owner's token.
      operationId: get_job_preview_sized_v1_jobs__job_id__preview__size__get
      parameters:
      - name: job_id
        in: path
        required: true
        schema:
          type: string
          title: Job Id
      - name: size
        in: path
        required: true
        schema:
          type: string
          title: Size
      - name: sig
        in: query
        required: false
        schema:
          type: string
          default: ''
          title: Sig
      - name: exp
        in: query
        required: false
        schema:
          type: string
          default: ''
          title: Exp
      responses:
        '200':
          description: PNG image
          content:
            application/json:
              schema: {}
            image/png: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/jobs/{job_id}/contact_sheet:
    get:
      tags:
      - Jobs
      summary: Download the whole-deck contact-sheet PNG
      description: Stream a single image tiling ALL slides of a deck (failed slides shown as placeholders). Deck jobs only. Use /contact_sheet/md or /sm for smaller.
      operationId: get_deck_contact_sheet_v1_jobs__job_id__contact_sheet_get
      parameters:
      - name: job_id
        in: path
        required: true
        schema:
          type: string
          title: Job Id
      - name: sig
        in: query
        required: false
        schema:
          type: string
          default: ''
          title: Sig
      - name: exp
        in: query
        required: false
        schema:
          type: string
          default: ''
          title: Exp
      - name: kv
        in: query
        required: false
        schema:
          type: string
          default: ''
          title: Kv
      - name: n
        in: query
        required: false
        schema:
          type: string
          default: ''
          title: N
      responses:
        '200':
          description: PNG image
          content:
            application/json:
              schema: {}
            image/png: {}
        '404':
          description: Not a deck / no contact sheet
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/jobs/{job_id}/contact_sheet/{size}:
    get:
      tags:
      - Jobs
      summary: Download sized deck contact sheet (sm/md)
      operationId: get_deck_contact_sheet_sized_v1_jobs__job_id__contact_sheet__size__get
      parameters:
      - name: job_id
        in: path
        required: true
        schema:
          type: string
          title: Job Id
      - name: size
        in: path
        required: true
        schema:
          type: string
          title: Size
      - name: sig
        in: query
        required: false
        schema:
          type: string
          default: ''
          title: Sig
      - name: exp
        in: query
        required: false
        schema:
          type: string
          default: ''
          title: Exp
      responses:
        '200':
          description: PNG image
          content:
            application/json:
              schema: {}
            image/png: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/jobs/{job_id}/slides/{slide_number}/preview:
    get:
      tags:
      - Jobs
      summary: Download per-slide preview PNG
      description: Stream a 640px preview PNG for a specific slide (0-based index). Available for translate jobs that generated all-slide previews.
      operationId: get_slide_preview_v1_jobs__job_id__slides__slide_number__preview_get
      parameters:
      - name: job_id
        in: path
        required: true
        schema:
          type: string
          title: Job Id
      - name: slide_number
        in: path
        required: true
        schema:
          type: integer
          title: Slide Number
      - name: sig
        in: query
        required: false
        schema:
          type: string
          default: ''
          title: Sig
      - name: exp
        in: query
        required: false
        schema:
          type: string
          default: ''
          title: Exp
      responses:
        '200':
          description: PNG image
          content:
            application/json:
              schema: {}
            image/png: {}
        '404':
          description: Slide preview not found
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/jobs/{job_id}/pdf:
    get:
      tags:
      - Jobs
      summary: Download PDF for a completed job
      description: On-demand PDF download. First request renders the PDF from the PPTX via PrismPPTX (~200ms/slide), caches it, and streams the file. Subsequent requests serve from cache. This URL IS the PDF file — give it directly to users as a download link.
      operationId: get_job_pdf_v1_jobs__job_id__pdf_get
      parameters:
      - name: job_id
        in: path
        required: true
        schema:
          type: string
          title: Job Id
      - name: sig
        in: query
        required: false
        schema:
          type: string
          default: ''
          title: Sig
      - name: exp
        in: query
        required: false
        schema:
          type: string
          default: ''
          title: Exp
      - name: kv
        in: query
        required: false
        schema:
          type: string
          default: ''
          title: Kv
      - name: n
        in: query
        required: false
        schema:
          type: string
          default: ''
          title: N
      responses:
        '200':
          description: PDF file (application/pdf)
          content:
            application/json:
              schema: {}
            application/pdf: {}
        '404':
          description: Job not found
        '409':
          description: Job not complete
        '503':
          description: Storage not configured
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
components:
  schemas:
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
            - type: string
            - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
      type: object
      required:
      - loc
      - msg
      - type
      title: ValidationError
    QualityWarning:
      properties:
        category:
          type: string
          title: Category
        severity:
          type: string
          title: Severity
        description:
          type: string
          title: Description
        source:
          type: string
          title: Source
          default: static_linter
        location:
          anyOf:
          - type: object
          - type: 'null'
          title: Location
      type: object
      required:
      - category
      - severity
      - description
      title: QualityWarning
      description: "A single static-linter or visual-review finding (P3.2a, 2026-04-24).\n\nSurfaced on JobStatus.quality_warnings. Non-blocking — the job status\nstays `complete`/`partial`; quality_warnings is a separate signal an\nagent can read to decide whether to iterate.\n\nseverity:\n  - 'bug'        — real visual issue (text overlap, off-canvas, contrast\n                   fail, font outside legible range). MCP card surfaces\n                   a banner when any 'bug' entries exist.\n  - 'suggestion' — soft hint (high shape count, missing title zone,\n                   borderline font). Silent in the MCP card.\n\nsource:\n  - 'static_linter' — convergence/linter.py output (3.2a)\n  - 'vlm'           — Pixtral one-shot review (3.2b, future)\n  - 'report_linter' — convergence/quality/report_linter.py output"
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    JobStatus:
      properties:
        job_id:
          type: string
          title: Job Id
        name:
          anyOf:
          - type: string
          - type: 'null'
          title: Name
        status:
          type: string
          title: Status
        current_iteration:
          type: integer
          title: Current Iteration
          default: 0
        max_iterations:
          type: integer
          title: Max Iterations
          default: 5
        current_score:
          anyOf:
          - type: number
          - type: 'null'
          title: Current Score
        target_score:
          type: number
          title: Target Score
          default: 8.5
        pptx_url:
          anyOf:
          - type: string
          - type: 'null'
          title: Pptx Url
        preview_url:
          anyOf:
          - type: string
          - type: 'null'
          title: Preview Url
        pdf_url:
          anyOf:
          - type: string
          - type: 'null'
          title: Pdf Url
        final_score:
          anyOf:
          - type: number
          - type: 'null'
          title: Final Score
        score_breakdown:
          anyOf:
          - type: object
          - type: 'null'
          title: Score Breakdown
        iterations:
          anyOf:
          - type: integer
          - type: 'null'
          title: Iterations
        cost_charged:
          anyOf:
          - type: number
          - type: 'null'
          title: Cost Charged
        latency_ms:
          anyOf:
          - type: integer
          - type: 'null'
          title: Latency Ms
        strategy:
          anyOf:
          - type: string
          - type: 'null'
          title: Strategy
        slides_completed:
          anyOf:
          - type: integer
          - type: 'null'
          title: Slides Completed
        slides_failed:
          anyOf:
          - type: integer
          - type: 'null'
          title: Slides Failed
        failed_slides:
          anyOf:
          - items:
              type: object
            type: array
          - type: 'null'
          title: Failed Slides
        quality_warnings:
          anyOf:
          - items:
              $ref: '#/components/schemas/QualityWarning'
            type: array
          - type: 'null'
          title: Quality Warnings
        error:
          anyOf:
          - type: string
          - type: 'null'
          title: Error
      type: object
      required:
      - job_id
      - status
      title: JobStatus
      description: 'GET /v1/jobs/{id} response.


        Status is one of: queued, generating, executing, rendering, complete,

        partial, failed. `partial` is deck-only — set when some child slides

        succeeded and at least one failed. The deck PPTX still contains the

        successful slides; agents that previously trusted `status == "complete"`

        must now also handle `partial` (and read `failed_slides` to decide).'
    DownloadUrlRequest:
      properties:
        artifact:
          type: string
          title: Artifact
          default: pptx
      type: object
      title: DownloadUrlRequest
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: 'SlideForge API key: `Authorization: Bearer sf_live_…`. Create one at https://slideforge.dev/console/keys'
    apiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: Same key, header form — for clients that cannot set Authorization.