go-reddit is a Go client library for accessing the Reddit API.


To get a specific version from the list of versions:

go get github.com/vartanbeno/[email protected]

Or for the latest version:

go get github.com/vartanbeno/go-reddit

The repository structure for managing multiple major versions follows the one outlined here.


Make sure to have a Reddit app with a valid client id and secret. Here is a quick guide on how to create an app and get credentials.

package main

import "github.com/vartanbeno/go-reddit/v2/reddit"

func main() {
    credentials := reddit.Credentials{ID: "id", Secret: "secret", Username: "username", Password: "password"}
    client, _ := reddit.NewClient(credentials)

You can pass in a number of options to NewClient to further configure the client (see reddit/reddit-options.go). For example, to use a custom HTTP client:

httpClient := &http.Client{Timeout: time.Second * 30}
client, _ := reddit.NewClient(credentials, reddit.WithHTTPClient(httpClient))

Read-Only Mode

The DefaultClient method returns a valid, read-only client with limited access to the Reddit API, much like a logged out user. You can initialize your own and configure it further using options via NewReadonlyClient:

client, _ := reddit.NewReadonlyClient()


Configure the client from environment variables. When using this option, it's ok to pass an empty struct for the credentials.

client, _ := reddit.NewClient(reddit.Credentials{}, reddit.FromEnv)

Submit a comment.

comment, _, err := client.Comment.Submit(context.Background(), "t3_postid", "comment body")
if err != nil {
    return err
fmt.Printf("Comment permalink: %s\n", comment.Permalink)

Upvote a post.

_, err := client.Post.Upvote(context.Background(), "t3_postid")
if err != nil {
    return err

Get r/golang's top 5 posts of all time.

posts, _, err := client.Subreddit.TopPosts(context.Background(), "golang", &reddit.ListPostOptions{
    ListOptions: reddit.ListOptions{
        Limit: 5,
    Time: "all",
if err != nil {
    return err
fmt.Printf("Received %d posts.\n", len(posts))