How to Download Twitter Spaces That Aren't Yours
July 2023 update: Twitter seems to have broken this API now. I think a keen developer who knows GraphQL could possibly reconstruct the query since they probably just moved some fields around. please email or DM me if you are working on this.
the current two best ways are:
- yt-dlp (download cookies from browser, privacy beware but jt works)
- https://github.com/Chiplis/moonbird (confirmed that it works on first try and is fast, requires Rust toolchain)
I recently caught the tail end of a TimescaleDB Twitter space that I wanted to snip for my mixtape in future. Spaces are only saved for a few days so if you want them beyond that you will have to download it. However, Twitter only lets the host of the space download. I tried using youtube-dl for it but it is currently unsupported.
89z on GitHub is very actively maintaining his own project that interfaces with some arbitrary social media: https://github.com/89z/mech and answered my questions enough to get me using it!
The project bundles releases only for Windows, so here’s a quick sequence of instructions for Mac.
In case you are a nontechnical person arriving from Google - these instructions are meant for developers but written out step by step as faithfully as I can. The only prerequisite you need is:
but I won’t spend any time teaching you how to use the terminal.
The primary piece of knowledge you need is the Twitter Space ID. Given a Twitter space URL
https://twitter.com/i/spaces/1YqGoprjyQEJv, the space ID is
1YqGoprjyQEJv. No API key is needed as far as I can tell, which is just peachy.
IMPORTANT - this process does not work for Twitter Super Follows Spaces as far as I can tell. If you are a developer, you MAY be able to fork the project to modify it. Let me know if you do.
I’ve now had enough support load that i realize I should just upload the binary myself so you can just use it.
If you trust that i’m not doing anything funky, go to https://github.com/sw-yx/mech/releases/tag/swyx-fork-v1 and download that
then, open your terminal to the same folder where that binary exists, and:
chmod +x twitter # for first time only ./twitter -c YOUR_SPACE_ID_HERE
You may need to also set permissions in
We’re going to use @89z’s mech project, but as of the time that he used to support Twitter Spaces. so bear with me:
# make sure you have `git` installed! git clone https://github.com/89z/mech cd mech git reset 5b977a09590b883584662a656a14d393337411c1 --hard # old twitter functionality was removed https://github.com/89z/mech/issues/71 cd cmd/twitter # make sure you have `go` installed! go build
This builds a binary called
# mac ./twitter -c YOUR_SPACE_ID_HERE # windows twitter -c YOUR_SPACE_ID_HERE
This starts the download:
$ ./twitter -c 1YqGoprjyQEJv POST https://api.twitter.com/1.1/guest/activate.json GET https://twitter.com/i/api/graphql/Uv5R_-Chxbn1FEkyUkSW2w/AudioSpaceById?variables=%7B%22id%22%3A%221RDGlgoYkDkKL%22%2C%22isMetatagsQuery%22%3Afalse%2C%22withBirdwatchPivots%22%3Afalse%2C%22withDownvotePerspective%22%3Afalse%2C%22withReactionsMetadata%22%3Afalse%2C%22withReactionsPerspective%22%3Afalse%2C%22withReplays%22%3Afalse%2C%22withScheduledSpaces%22%3Afalse%2C%22withSuperFollowsTweetFields%22%3Afalse%2C%22withSuperFollowsUserFields%22%3Afalse%7D GET https://twitter.com/i/api/1.1/live_video_stream/status/28_1496228425874374659 GET https://prod-fastly-us-east-1.video.pscp.tv/Transcoding/v1/hls/Ze8MHZCOuvGIbhBQYBAevAIotnQEwAixsGxoUgsOOJaJsf0Qm6Kxhwt3JH77MIxknSr_2nobkgkUDyYP9YwzbQ/non_transcode/us-east-1/periscope-replay-direct-prod-us-east-1-public/audio-space/playlist_16801097405082696033.m3u8?type=replay 0/1299 /Transcoding/v1/hls/Ze8MHZCOuvGIbhBQYBAevAIotnQEwAixsGxoUgsOOJaJsf0Qm6Kxhwt3JH77MIxknSr_2nobkgkUDyYP9YwzbQ/non_transcode/us-east-1/periscope-replay-direct-prod-us-east-1-public/audio-space/chunk_1645642768437487255_0_a.aac 1/1299 /Transcoding/v1/hls/Ze8MHZCOuvGIbhBQYBAevAIotnQEwAixsGxoUgsOOJaJsf0Qm6Kxhwt3JH77MIxknSr_2nobkgkUDyYP9YwzbQ/non_transcode/us-east-1/periscope-replay-direct-prod-us-east-1-public/audio-space/chunk_1645642768440813639_1_a.aac 2/1299 /Transcoding/v1/hls/Ze8MHZCOuvGIbhBQYBAevAIotnQEwAixsGxoUgsOOJaJsf0Qm6Kxhwt3JH77MIxknSr_2nobkgkUDyYP9YwzbQ/non_transc # and so on...
The final file is an
aac file which is still annoying but at least convertible and playable in Audacity.
# make sure you have `git` installed! git clone https://github.com/89z/mech cd mech # update: v1.49 onwards has the twitter spaces support again! https://github.com/89z/mech/issues/18#issuecomment-1058789325 git reset --hard v1.46.6 # only if you need to pin to a specific version that supports Twitter spaces, otherwise delete this line cd cmd/twitter go build