Written after doing exactly this for a Lower Trestles session. Last updated July 10, 2026.
This assumes you pay for Surfline Premium and are saving footage of your own session for personal review, which is what Rewind exists for. Surfline's terms don't contemplate bulk downloading, so keep it personal: don't redistribute the footage or hammer their servers.
I surfed Lowers from 4:00 to 6:30 one evening and wanted to review the whole session. Surfline's rewind player is genuinely painful for this: it's hard to rewind precisely, hard to tell where you are in time, and it only shows short windows at once. What I actually wanted was one long file on disk I could scrub with J-K-L in Premiere. It turns out that file almost already exists on Surfline's servers; you just have to go get it.
I didn't do most of this by hand. I asked an AI coding agent (Claude Code, with a browser-control harness) to figure it out and download everything, and the whole thing, from "here's my open Surfline tab" to a stitched 2h48m file, took about half an hour, most of which was download time. The mechanics below are what it found, written up so a human or an agent can follow them directly.
Three facts make this easy:
camrewinds.cdn-surfline.com. Filenames embed the cam alias and the segment's UTC start time to the millisecond, e.g. wc-lowers.stream.20260709T225936127.mp4. You can't guess these timestamps, which is why you need the listing.https://services.surfline.com/cameras/recording/<alias>, where the alias is the cam's short name like wc-lowers (not the hex camId from the page URL). It returns roughly five days of clips, each with startDate, endDate, and a direct recordingUrl.The cam alias is embedded in the surf report page's HTML (search the page source for "alias" or watch the network tab, the live stream URL contains it: hls.cdn-surfline.com/oregon/wc-lowers/playlist.m3u8). Spots with multiple angles have multiple aliases; at Lowers, wc-lowers is the close-up cam and wc-lowersov is the wide overview.
Query the recording endpoint from your logged-in tab, filter to your session window in UTC.
The CDN is public. Pull segments in parallel, ~15-18 files for a 2.5-hour session.
Lossless stream copy. Three hours joins in seconds, no re-encode, no quality loss.
Plain 1080p H.264. J-K-L up to 32x, instant timeline scrubbing.
In the browser console on any surfline.com page while logged in (or via an agent's browser harness), fetch the listing and filter to your window. Times are UTC, so a 4:00pm Pacific start is 23:00Z, and a session ending after 5pm crosses a UTC date boundary:
const r = await fetch('https://services.surfline.com/cameras/recording/wc-lowers');
const clips = await r.json();
const from = Date.parse('2026-07-09T23:00:00Z'); // 4:00pm PDT
const to = Date.parse('2026-07-10T01:30:00Z'); // 6:30pm PDT
clips.filter(c => Date.parse(c.endDate) > from && Date.parse(c.startDate) < to)
.sort((a,b) => Date.parse(a.startDate) - Date.parse(b.startDate))
.map(c => c.recordingUrl)
.join('\n')
That prints one URL per 10-minute segment. Save them to a file called urls.txt, in order. (If an extension on your browser has broken fetch, the same call works as an XMLHttpRequest.)
mkdir session && cd session
# urls.txt = one recordingUrl per line, chronological
n=1; while read u; do
printf 'url = "%s"\noutput = "seg%02d.mp4"\n' "$u" $n; n=$((n+1))
done < ../urls.txt > curl.cfg
curl --parallel --parallel-max 4 --retry 3 -K curl.cfg
Mind the size: the high-bitrate Lowers close-up cam runs about 530MB per 10 minutes, so 2.5 hours was ~9GB. The wide overview cam was only ~150MB per segment. Check your disk space before starting.
for i in $(seq -w 1 17); do echo "file 'seg$i.mp4'"; done > concat.txt
ffmpeg -f concat -safe 0 -i concat.txt -c copy session.mp4
# 2h48m file, ready in seconds — no re-encode
Because -c copy is a stream copy, joining three hours of video takes seconds and loses nothing. The result is an ordinary H.264 MP4 that every editor and player handles.
The honest version of this story is that I never opened the network tab myself. I told a coding agent, Claude Code with a browser harness (CDP control of my logged-in Chrome), that I surfed 4:00 to 6:30 and wanted the footage. It read the cam alias out of my open Surfline tab, discovered the recording endpoint, filtered the clips to my window, downloaded 9GB in the background while we talked, stitched the file, and opened it on my screen. Then it did the second cam angle too.
Agent-specific notes, if you go that route:
startDate/endDate values and all URLs. Browser debug permissions can lapse mid-task, and the CDN URLs keep working long after the browser hookup dies.startDate values if you want to cross-reference the same wave across angles.-c copy was enough. Re-encoding three hours of 1080p takes an hour and only loses quality.