# Scribe 5-Minute Preflight Runbook

Use this before deep debugging.

## 1) Confirm the Right Product

- File-based or storage-based transcription -> stay on `scribe`.
- Live meeting media stream or botless live transcription -> use `rtms` instead.
- Meeting bot that joins and records before transcription -> chain Meeting SDK Linux first.

## 2) Confirm Credentials

- Build-platform issuer credential pair available.
- JWT generation uses `HS256` with one-hour-or-less expiry.
- Secret stays server-side.
- Reject placeholder values such as `${ZOOM_API_KEY}` and `${ZOOM_API_SECRET}`. They can make a naive health check look configured while every real call still fails.

## 3) Confirm Mode Selection

- **Fast mode** for one short file and immediate JSON response.
- **Batch mode** for many files, long recordings, or archive-style processing.
- **Browser microphone pseudo-streaming** for short repeated chunks uploaded through the async fast-mode wrapper.
- Fast mode current limits from the API spec:
  - maximum file size: `100 MB`
  - maximum duration: `2 hours`
- If fast mode is exposed through a hosted browser UI, prefer an async wrapper:
  - browser uploads once
  - backend returns `202` with a request ID
  - frontend polls for completion
  This avoids losing successful transcriptions to edge/client timeout races.
- Observed hosted timing from the deployed sample:
  - ~17.2 MB MP4 completed in ~26s
  - ~38.6 MB MP4 completed in ~26-37s
  - ~59.2 MB MP4 completed in ~32-34s on the backend
  - some ~59.2 MB requests still surfaced as frontend `504` even though the backend later completed with `200`
  Treat these as deployment observations, not hard API guarantees.
- Recommended starting browser mic cadence:
  - chunk size: `5 seconds`
  - acceptable range: `5-10 seconds`
  - keep only `2-3` chunks in flight at once
  This gives incremental transcript updates without trying to hold a single long browser request open.
- For browser mic capture, rotate the recorder per chunk so each uploaded blob is a standalone file.
  Do not assume `MediaRecorder.start(timeslice)` later chunks will always be independently transcribable.
- Do not treat this as the default production solution for live transcription.
  Prefer `rtms` when the user actually needs a live-audio product instead of a browser demo.

## 4) Confirm Storage / Webhook Inputs

- Fast mode file URL or upload path resolves.
- Batch input/output URIs are valid.
- AWS or pre-signed access is set correctly for S3 mode.
- Webhook URL is public HTTPS if you expect notifications.

## 5) Confirm Post-Processing Contract

- Decide whether downstream code expects `text_display`, segments, or word-level timings.
- Decide whether channel separation or diarization is required before shipping.

## 6) Quick Probes

- JWT generation works locally.
- `POST /aiservices/scribe/transcribe` succeeds with a known small file.
- For browser-uploaded files, backend forwarding should use `multipart/form-data` to Zoom, not a JSON `data:` URI wrapper.
- Batch submit returns `201` with `job_id`.
- Webhook signature verification works with the configured secret.

## 7) Fast Decision Tree

- `401`/auth failure -> wrong credential pair or expired JWT.
- Fast mode returns schema error -> wrong request body or config fields.
- Fast mode returns `413 Request Entity Too Large` before the app logs anything -> reverse proxy limit, not Scribe.
- Frontend returns `504` but backend logs later show `200` -> browser/edge timeout race; poll by request ID instead of assuming failure.
- Browser mic feature needs true continuous low-latency media instead of chunked uploads -> switch to `rtms`, not `scribe`.
- Browser mic chunk 1 works but chunk 2 onward is empty -> recorder/container boundary issue; restart the recorder for each chunk.
- Batch jobs queue but never complete -> storage auth / URI / webhook issues.
- Missing transcripts for some files -> inspect `/jobs/{jobId}/files` before re-submitting whole batch.

## 8) Source Checkpoints

### Official docs

- https://developers.zoom.us/docs/ai-services/
- https://developers.zoom.us/docs/ai-services/scribe/
- https://developers.zoom.us/api-hub/ai-services/methods/endpoints.json

### Raw docs in repo tooling output

- `tools/zoom-crawler/raw-docs/developers.zoom.us/docs/ai-services/`
