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)