Inspect & Repair (Deck Doctor)

A deterministic quality report for any .pptx — not just decks SlideForge rendered. Text overflow (measured with real font metrics), content hidden behind opaque shapes (z-order), off-canvas leftovers, WCAG contrast, tiny fonts, hidden slides. No LLM anywhere: your file is analyzed, never sent to a model. Inspect is free; deterministic repair is $0.02 per repaired slide.

POST/v1/inspect

Deck Quality Report for any .pptx. Free — 30/hr, max 25 MB / first 50 slides. Findings carry a machine-stable code, severity, message, remedy, and the offending shape id. Coverage fields state honestly how much of the deck the checks could resolve (inherited theme values are skipped, never guessed). Hidden slides are marked and cannot fail the deck.

Parameters

NameTypeRequiredDescription
job_idstringoptionalInspect a deck you rendered on SlideForge (one of job_id / pptx_url / pptx_base64).
pptx_urlstringoptionalHTTPS URL of any .pptx — yours or anyone's. SlideForge did not need to render it.
pptx_base64stringoptionalInline .pptx bytes, base64. Max 25 MB / first 50 slides.

Response

200
{
  "status": "review",
  "slides_total": 30,
  "canvas": {
    "w_in": 13.33,
    "h_in": 7.5,
    "aspect": "16:9"
  },
  "summary": {
    "errors": 0,
    "warnings": 12,
    "off_canvas": 8,
    "hidden_texts": 2,
    "low_contrast": 2,
    "min_font_pt": 8.5,
    "editable_text_ratio": 1,
    "font_size_coverage": 1,
    "contrast_coverage": 0.82,
    "worst_slides": [
      3,
      11
    ]
  },
  "slides": [
    {
      "i": 3,
      "findings": [
        {
          "code": "content_hidden",
          "severity": "warning",
          "message": "\"Copyright 2026 ...\" is 100% hidden behind \"Picture 2\" (drawn on top)",
          "remedy": "reorder the shapes, move the text, or delete it if it is leftover content",
          "shape_id": 14,
          "other_id": 9
        }
      ]
    }
  ]
}

Examples

curl -X POST https://api.slideforge.dev/v1/inspect \
  -H "Authorization: Bearer sf_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pptx_url": "https://example.com/any-deck.pptx"}'

POST /v1/repair

Deterministic fixes for inspect findings — never your words. Repair changes font sizes (measured shrink-to-fit, floor 9pt), raises sub-floor fonts when they still fit, deletes fully-invisible parked shapes, and adjusts text color to WCAG AA (hue preserved). No characters are ever altered, and the response carries a computed visible_text_untouched proof plus a before/after report diff. Anything ambiguous is returned in flagged_not_fixed with a remedy instead of being guessed at.

  • $0.02 per repaired slide (≥1 fix applied). A run that changes nothing bills nothing.
  • dry_run: true returns the exact plan — and therefore the exact price — free.
  • The repaired deck persists as a normal job: signed .pptx + preview URLs.
curl
# 1. Free quote: the exact fix plan + price, nothing changed
curl -X POST https://api.slideforge.dev/v1/repair \
  -H "Authorization: Bearer sf_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pptx_url": "https://example.com/any-deck.pptx", "dry_run": true}'

# 2. Apply — $0.02 per slide that actually received a fix
curl -X POST https://api.slideforge.dev/v1/repair \
  -H "Authorization: Bearer sf_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pptx_url": "https://example.com/any-deck.pptx"}'

job_id / pptx_url / pptx_base64 (string)Same source union as /v1/inspect — exactly one.

actions (string[])Subset of shrink_to_fit, raise_min_font, remove_off_canvas, fix_contrast. Default: all.

dry_run (boolean)Return the exact fix plan and price without changing anything. Free.

name (string)Human-readable job name for the repaired deck.

Why it's trustworthy

Findings are validated against rendered pixels in our eval harness (remove the occluding shape, re-render, diff the ink), and the engine is hardened on real-world decks — Google Slides exports, mixed-size text frames, rotated labels, hidden draft slides. What it can't resolve it reports as coverage, never as a guess. Typical inspect time: under a second for a 30-slide deck.