ScriptHaul API
Log inGet API key

Video facts

GET /v1/video returns facts ScriptHaul already knows: video metadata, cached languages, and known caption tracks. It costs 0 and does not trigger a transcript fetch or a YouTube Data API request.

curl --get https://api.scripthaul.com/v1/video \
  -H "Authorization: Bearer $SCRIPTHAUL_API_KEY" \
  --data-urlencode "video_id=jNQXAC9IVRw"

Unknown fields are null, not guesses. video.status is unknown until ScriptHaul has attempted the video; fetched, no_captions, unavailable, or error afterwards, with error_class for the last two. An empty cached_languages list means no cached track is known; it does not prove the video has no captions. caption_tracks lists the tracks seen on the last fetch and selected the one that was delivered.

{
  "ok": true,
  "video": {
    "id": "jNQXAC9IVRw",
    "title": "Me at the zoo",
    "channel_id": "UC4QobU6STFB0P71PMvOGN5A",
    "channel_title": "jawed",
    "published_at": null,
    "duration": 19,
    "status": "fetched",
    "error_class": null,
    "fetched_at": "2026-09-04 12:00:00"
  },
  "cached_languages": [
    {"language_code": "en", "kind": "manual", "cached_at": "2026-09-04T12:00:00.000Z"}
  ],
  "caption_tracks": [
    {"language_code": "en", "kind": "manual", "name": "English"}
  ],
  "selected": {"language_code": "en", "kind": "manual"}
}

Cold single-video transcript delivery gets title, channel, and length from the relay's existing player response. It does not spend a Data API unit.

Read facts in four languages

This route is read-only and costs zero credits. Maintained runnable variants are in the examples directory.

curl --get https://api.scripthaul.com/v1/video \
  -H "Authorization: Bearer $SCRIPTHAUL_API_KEY" \
  --data-urlencode "video_id=jNQXAC9IVRw"
import os, urllib.request
request = urllib.request.Request("https://api.scripthaul.com/v1/video?video_id=jNQXAC9IVRw")
request.add_header("Authorization", f"Bearer {os.environ['SCRIPTHAUL_API_KEY']}")
print(urllib.request.urlopen(request).read().decode())
const response = await fetch("https://api.scripthaul.com/v1/video?video_id=jNQXAC9IVRw", {
  headers: { Authorization: `Bearer ${process.env.SCRIPTHAUL_API_KEY}` },
});
console.log(await response.json());
req, _ := http.NewRequest("GET", "https://api.scripthaul.com/v1/video?video_id=jNQXAC9IVRw", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("SCRIPTHAUL_API_KEY"))
response, err := http.DefaultClient.Do(req)
if err != nil { log.Fatal(err) }
defer response.Body.Close()
io.Copy(os.Stdout, response.Body)