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