strive
A client for the Strava V3 API.
| LTS Haskell 24.17: | 6.0.0.17 | 
| Stackage Nightly 2025-10-31: | 6.1.0.0 | 
| Latest on Hackage: | 6.1.0.0 | 
MIT licensed 
Maintained by Taylor Fausak
This version can be pinned in stack with:
strive-6.1.0.0@sha256:8f6b2060ac4e5c26b2cb44ebfe6d08178bcc6d4934dd623d7c85b7ca34efc4f7,2568Module documentation for 6.1.0.0
- Strive
- Strive.Actions
- Strive.Actions.Activities
- Strive.Actions.Athletes
- Strive.Actions.Authentication
- Strive.Actions.Clubs
- Strive.Actions.Comments
- Strive.Actions.Efforts
- Strive.Actions.Friends
- Strive.Actions.Gear
- Strive.Actions.Kudos
- Strive.Actions.Photos
- Strive.Actions.Segments
- Strive.Actions.Streams
- Strive.Actions.Uploads
 
- Strive.Aliases
- Strive.Client
- Strive.Enums
- Strive.Internal- Strive.Internal.HTTP
- Strive.Internal.Lenses
- Strive.Internal.Options
- Strive.Internal.TH
 
- Strive.Lenses
- Strive.Options
- Strive.Types
- Strive.Utilities
 
- Strive.Actions
Depends on 11 packages(full list with versions):
Strive
Strive is a Haskell client for the Strava V3 API.
- Installation
- Usage
Installation
Add it to your Cabal file:
build-depends:
  strive
Or install it manually:
$ cabal update
$ cabal install strive
Usage
To use the API, you’ll need an access token. Once you have that, create a new client using the default HTTP manager.
{-# LANGUAGE OverloadedStrings #-}
import Strive
let token = "..."
client <- buildClient (Just token)
Most types implement lenses for their fields. Lenses are preferred over directly accessing the fields. For instance, instead of doing this:
client_accessToken (client { client_accessToken = "record token" })
-- "record token"
Do this:
get accessToken (set accessToken "lens token" client)
-- "lens token"
Authentication
Request access
  let authorizeUrl = buildAuthorizeUrl 1790 "http://localhost" $ with
        [ set approvalPrompt False
        , set privateScope True
        , set writeScope True
        , set state "..."
        ]
  print (authorizeUrl :: String)
Token exchange
  tokenExchangeResponse <- exchangeToken 1790 "secret" "code"
  print (tokenExchangeResponse :: Result TokenExchangeResponse)
Deauthorization
  deauthorizationResponse <- deauthorize client
  print (deauthorizationResponse :: Result DeauthorizationResponse)
Athletes
Retrieve current athlete
  currentAthlete <- getCurrentAthlete client
  print (currentAthlete :: Result AthleteDetailed)
Retrieve another athlete
  anotherAthlete <- getAthlete client 65516
  print (anotherAthlete :: Result AthleteSummary)
Update current athlete
  updatedAthlete <- updateCurrentAthlete client $ with
    [ set city (Just "Dallas")
    , set state (Just "Texas")
    , set country (Just "United States")
    , set sex (Just Male)
    , set weight (Just 72.57)
    ]
  print (updatedAthlete :: Result AthleteDetailed)
Totals and stats
  athleteStats <- getAthleteStats client 65516
  print (athleteStats :: Result AthleteStats)
List athlete K/QOMs/CRs
  athleteCrs <- getAthleteCrs client 65516 $ with
    [ set page 1
    , set perPage 2
    ]
  print (athleteCrs :: Result [EffortDetailed])
Friends and followers
List athlete friends
  currentFriends <- getCurrentFriends client $ with
    [ set page 1
    , set perPage 2
    ]
  print (currentFriends :: Result [AthleteSummary])
  friends <- getFriends client 65516 $ with
    [ set page 1
    , set perPage 2
    ]
  print (friends :: Result [AthleteSummary])
List athlete followers
  currentFollowers <- getCurrentFollowers client $ with
    [ set page 1
    , set perPage 2
    ]
  print (currentFollowers :: Result [AthleteSummary])
  followers <- getFollowers client 65516 $ with
    [ set page 1
    , set perPage 2
    ]
  print (followers :: Result [AthleteSummary])
List both following
  commonFriends <- getCommonFriends client 65516 $ with
    [ set page 1
    , set perPage 2
    ]
  print (commonFriends :: Result [AthleteSummary])
Activities
Create an activity
  createdActivity <- createActivity client "An Example" Run (UTCTime (fromGregorian 1970 0 0) 0) 10 $ with
    [ set description (Just "...")
    , set distance (Just 100.0)
    ]
  print (createdActivity :: Result ActivityDetailed)
Retrieve an activity
  activity <- getActivity client 141273622 $ with
    [ set allEfforts True
    ]
  print (activity :: Result ActivitySummary)
Update an activity
  updatedActivity <- updateActivity client 141273622 $ with
    [ set name (Just "WedEx Pit Stop")
    , set type_ (Just Ride)
    , set private (Just False)
    , set commute (Just True)
    , set trainer (Just False)
    , set gearId (Just "b387882")
    , set description Nothing
    ]
  print (updatedActivity :: Result ActivityDetailed)
Delete an activity
  deletedActivity <- deleteActivity client 162674281
  print (deletedActivity :: Result ())
List athlete activities
  currentActivities <- getCurrentActivities client $ with
    [ set before (Just (UTCTime (fromGregorian 1970 0 0) 0))
    , set after (Just (UTCTime (fromGregorian 1970 0 0) 0))
    , set page 1
    , set perPage 2
    ]
  print (currentActivities :: Result [ActivitySummary])
List related activities
  relatedActivities <- getRelatedActivities client 141273622 $ with
    [ set page 1
    , set perPage 2
    ]
  print (relatedActivities :: Result [ActivitySummary])
List friends’ activities
  feed <- getFeed client $ with
    [ set page 1
    , set perPage 2
    ]
  print (feed :: Result [ActivitySummary])
List activity zones
  activityZones <- getActivityZones client 141273622
  print (activityZones :: Result [ActivityZoneDetailed])
List activity laps
  activityLaps <- getActivityLaps client 141273622
  print (activityLaps :: Result [ActivityLapSummary])
Comments
List activity comments
  activityComments <- getActivityComments client 90112360 $ with
    [ set markdown True
    , set page 1
    , set perPage 2
    ]
  print (activityComments :: Result [CommentSummary])
Kudos
List activity kudoers
  activityKudoers <- getActivityKudoers client 141273622 $ with
    [ set page 1
    , set perPage 2
    ]
  print (activityKudoers :: Result [AthleteSummary])
Photos
List activity photos
  activityPhotos <- getActivityPhotos client 141273622
  print (activityPhotos :: Result [PhotoSummary])
Clubs
Retrieve a club
  club <- getClub client 11193
  print (club :: Result ClubDetailed)
List athlete clubs
  currentClubs <- getCurrentClubs client
  print (currentClubs :: Result [ClubSummary])
List club members
  clubMembers <- getClubMembers client 11193 $ with
    [ set page 1
    , set perPage 2
    ]
  print (clubMembers :: Result [AthleteSummary])
List club activities
  clubActivities <- getClubActivities client 11193 $ with
    [ set page 1
    , set perPage 2
    ]
  print (clubActivities :: Result [ActivitySummary])
Join a club
  joinedClub <- joinClub client 165
  print (joinedClub :: Result ())
Leave a club
  leftClub <- leaveClub client 165
  print (leftClub :: Result ())
Gear
Retrieve gear
  theGear <- getGear client "b387855"
  print (theGear :: Result GearDetailed)
Segments
Retrieve a segment
  theSegment <- getSegment client 4773104
  print (theSegment :: Result SegmentDetailed)
List starred segments
  starredSegments <- getStarredSegments client $ with
    [ set page 1
    , set perPage 2
    ]
  print (starredSegments :: Result [SegmentSummary])
List efforts
  theSegmentEfforts <- getSegmentEfforts client 4773104 $ with
    [ set athleteId (Just 65516)
    , set range (Just ((UTCTime (fromGregorian 1970 0 0) 0), (UTCTime (fromGregorian 1970 0 0) 0)))
    , set page 1
    , set perPage 2
    ]
  print (theSegmentEfforts :: Result [EffortDetailed])
Segment leaderboard
  segmentLeaderboardResponse <- getSegmentLeaderboard client 4773104 $ with
    [ set gender (Just Male)
    , set ageGroup (Just Ages0To24)
    , set weightClass (Just Kilograms65To74)
    , set following (Just True)
    , set clubId (Just 11193)
    , set dateRange (Just "this_year")
    , set contextEntries (Just 15)
    , set page 1
    , set perPage 2
    ]
  print (segmentLeaderboardResponse :: Result SegmentLeaderboardResponse)
Segment explorer
  segmentExplorerResponse <- exploreSegments client (32.0, -96.0, 33.0, -95.0) $ with
    [ set activityType Riding
    , set minCat 0
    , set maxCat 5
    ]
  print (segmentExplorerResponse :: Result SegmentExplorerResponse)
Segment efforts
Retrieve a segment effort
  segmentEffort <- getSegmentEffort client 1595370098
  print (segmentEffort :: Result EffortDetailed)
Streams
Retrieve activity streams
  activityStreams <- getActivityStreams client 141273622 [LatlngStream, WattsStream] $ with
    [ set resolution (Just Low)
    , set seriesType Time
    ]
  print (activityStreams :: Result [StreamDetailed])
Retrieve effort streams
  effortStreams <- getEffortStreams client 1595370098 [LatlngStream, WattsStream] $ with
    [ set resolution (Just Low)
    , set seriesType Time
    ]
  print (effortStreams :: Result [StreamDetailed])
Retrieve segment streams
  segmentStreams <- getSegmentStreams client 4773104 [LatlngStream, WattsStream] $ with
    [ set resolution (Just Low)
    , set seriesType Time
    ]
  print (segmentStreams :: Result [StreamDetailed])
Uploads
Upload an activity
  uploadedActivity <- uploadActivity client (pack "...") "gpx.gz" $ with
    [ set activityType (Just Ride)
    , set name (Just "An Example")
    , set description (Just "...")
    , set private True
    , set trainer False
    , set externalId (Just "...")
    ]
  print (uploadedActivity :: Result UploadStatus)
Check upload status
  upload <- getUpload client 16486788
  print (upload :: Result UploadStatus)
