Skip to content

Instantly share code, notes, and snippets.

@michaellihs
Last active October 6, 2024 11:49
Show Gist options
  • Save michaellihs/bb262e2c6ee93093485361de282c242d to your computer and use it in GitHub Desktop.
Save michaellihs/bb262e2c6ee93093485361de282c242d to your computer and use it in GitHub Desktop.
Upload tracks to Strava from the Command Line

Upload GPS Tracks to Strava from your Command Line

This short tutorial describes how to upload GPS tracks to Strava using your command line interface / shell. It requires no special tools or any 3rd party code.

1. Generate an API Key

Run the following steps with your user logged in to Strava in your browser!

Strava uses OAuth to authenticate against 3rd party applications. In order to authenticate to your Strava account from your command line, you first have to generate an API key. Therefore go to this page https://strava.github.io/api/v3/oauth/ and create a new API. The settings are as follows:

  • Application Name chose whatever name you like (does not matter for our use case)
  • Website chose whatever website you want to use (needs to be a valid url, e.g. [http://google.com] (does not matter for our use case)
  • Callback Domain any domain name that should be used as a callback (does not matter for our use case)

After you saved your API, you need to upload a image for it.

Open the https://strava.github.io/api/v3/oauth/ page again and copy the following values to a text editor

  • Client ID - an ID for your application, used later on to identify your App
  • Secret - a secret token generated for you (not your OAuth Token!)

2. Generate an OAuth Token

For the purpose of generating the OAuth token, this documentation helps a lot https://strava.github.io/api/v3/oauth/.

  1. Open the following URL (replace CLIENT_ID with the ID from above):

    https://www.strava.com/oauth/authorize?client_id=CLIENT_ID&response_type=code&redirect_uri=http%3A%2F%2Flocalhost&scope=activity:write&state=mystate&approval_prompt=force
    

    make sure to properly quote the redirect URL

  2. Click "Authorise"

  3. Cope the Code from the URL that is given as the URL code parameter

  4. Run the following CURL request, to get the final OAuth token (replace CLIENT_ID, CLIENT_SECRET and CODE accordingly):

    curl -X POST https://www.strava.com/oauth/token \
      -F client_id=CLIENT_ID \
      -F client_secret=CLIENT_SECRET \
      -F code=CODE
  5. Copy the access_token from the JSON response - this is your OAuth token

3. Upload your tracks

Now comes the funny part. Use the following command to upload a track to Strava:

curl -X POST https://www.strava.com/api/v3/uploads \
    -H "Authorization: Bearer OAUTH_TOKEN" 
    -F file=@"PATH_TO_FILE" -F data_type="tcx"

other data_types can be fit, fit.gz, tcx, tcx.gz, gpx, gpx.gz

To check the status of your update, use the id from the JSON response and run

curl https://www.strava.com/api/v3/uploads/ID -H "Authorization: Bearer OAUTH_TOKEN"

If you want to upload a directory with files, use the following command

 for i in `ls /path/to/files/*.tcx`
   do curl -X POST https://www.strava.com/api/v3/uploads -H "Authorization: Bearer OAUTH_TOKEN" -F file=@"$i" -F data_type="tcx"
 done

Further References

@oliviertassinari
Copy link

With Strava rate limiting https://developers.strava.com/docs/rate-limits/.

The default overall rate limit allows 200 requests every 15 minutes, with up to 2,000 requests per day. The default “non-upload” rate limit allows 100 requests every 15 minutes, with up to 1,000 requests per day.

I had to add sleep 6

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment