---
title: "Course Asset"
method: GET
path: "/courses/{slug}/{asset}"
---

# Course Asset

`GET /courses/{slug}/{asset}`

## Request

- Base URL: `https://owlgrouptrading.com` (the document declares no server; this is the origin it was published from)
- URL: `https://owlgrouptrading.com/courses/{slug}/{asset}`
- Auth: none declared

Serve an asset under /courses/<slug>/... from the GCS bucket.

Media (mp4/m4a/…) is **302-redirected straight to the public GCS URL** rather
than proxied. The old code buffered the whole object into memory and returned
it as one Response(content=…); Cloud Run caps a non-chunked response at 32 MiB,
so a chapter video larger than that (tomorrows-trades mka-3.mp4 was 36 MiB)
came back as an empty HTTP 500 and the browser's <video> showed a black screen.
A redirect sidesteps the proxy, the middleware, and the 32 MiB ceiling entirely,
lets GCS serve range/seek natively at any size, and offloads media bandwidth
off Cloud Run. Non-media assets (scenes.json, vtt, png — all tiny, same-origin
so JS fetch() has no CORS issue) are still proxied through.

## Path parameters

- `slug` string, required
- `asset` string, required

## Response `200`

Successful Response

- unknown

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/owlgrouptrading/apis/edge-s2-briefing-service.md) · [All operations](https://skmtc.dev/owlgrouptrading/apis/edge-s2-briefing-service/llms.txt) · [OpenAPI document](https://skmtc.dev/owlgrouptrading/apis/edge-s2-briefing-service/revisions/fba9aeca6fc2?raw)
