Followers

📘

full code repo https://github.com/lens-protocol/lens-api-examples

This query returns the wallet addresses which are following a profile

API Design

query Followers {
  followers(request: { 
                profileId: "0x01",
              limit: 10
             }) {
       items {
      wallet {
        address
        defaultProfile {
          id
          name
          bio
          attributes {
            displayType
            traitType
            key
            value
          }
          followNftAddress
            metadata
          isDefault
          handle
          picture {
            ... on NftImage {
              contractAddress
              tokenId
              uri
              verified
            }
            ... on MediaSet {
              original {
                url
                mimeType
              }
            }
          }
          coverPicture {
            ... on NftImage {
              contractAddress
              tokenId
              uri
              verified
            }
            ... on MediaSet {
              original {
                url
                mimeType
              }
            }
          }
          ownedBy
          dispatcher {
            address
            canUseRelay
          }
          stats {
            totalFollowers
            totalFollowing
            totalPosts
            totalComments
            totalMirrors
            totalPublications
            totalCollects
          }
          followModule {
            ... on FeeFollowModuleSettings {
              type
              contractAddress
              amount {
                asset {
                  name
                  symbol
                  decimals
                  address
                }
                value
              }
              recipient
            }
            ... on ProfileFollowModuleSettings {
             type
            }
            ... on RevertFollowModuleSettings {
             type
            }
          }
        }
      }
      totalAmountOfTimesFollowed
    }
    pageInfo {
      prev
      next
      totalCount
    }
  }
}
{
  "data": {
    "followers": {
      "items": [
        {
          "wallet": {
            "address": "0x2376e9C7C604D1827bA9aCb1293Dc8b4DA2f0DB3",
            "defaultProfile": {
              "id": "0x14",
              "name": null,
              "bio": null,
              "attributes": [
                {
                  "displayType": null,
                  "traitType": null,
                  "key": "custom_field",
                  "value": "yes this is custom"
                }
                ],
              "followNftAddress": null,
                "metadata": "ipfs://QmSfyMcnh1wnJHrAWCBjZHapTS859oNSsuDFiAPPdAHgHP",
              "isDefault": true,
              "handle": "no12",
              "picture": null,
              "coverPicture": null,
              "ownedBy": "0x2376e9C7C604D1827bA9aCb1293Dc8b4DA2f0DB3",
              "dispatcher": null,
              "stats": {
                "totalFollowers": 1,
                "totalFollowing": 4,
                "totalPosts": 0,
                "totalComments": 0,
                "totalMirrors": 0,
                "totalPublications": 0,
                "totalCollects": 0
              },
              "followModule": null
            }
          },
          "totalAmountOfTimesFollowed": 1
        },
        {
          "wallet": {
            "address": "0xD020E01C0c90Ab005A01482d34B808874345FD82",
            "defaultProfile": null,
            "totalAmountOfProfiles": 0
          },
          "totalAmountOfTimesFollowed": 2
        },
        {
          "wallet": {
            "address": "0xEEA0C1f5ab0159dba749Dc0BAee462E5e293daaF",
            "defaultProfile": {
              "id": "0x032f1a",
              "name": null,
              "bio": null,
              "attributes": [
                {
                  "displayType": null,
                  "traitType": null,
                  "key": "custom_field",
                  "value": "yes this is custom"
                }
                ],
              "followNftAddress": null,
                "metadata": "ipfs://QmSfyMcnh1wnJHrAWCBjZHapTS859oNSsuDFiAPPdAHgHP",
              "isDefault": true,
              "handle": "foobar222",
              "picture": null,
              "coverPicture": null,
              "ownedBy": "0xEEA0C1f5ab0159dba749Dc0BAee462E5e293daaF",
              "dispatcher": {
                "address": "0xEEA0C1f5ab0159dba749Dc0BAee462E5e293daaF",
                "canUseRelay": false
              },
              "stats": {
                "totalFollowers": 0,
                "totalFollowing": 1,
                "totalPosts": 4,
                "totalComments": 0,
                "totalMirrors": 0,
                "totalPublications": 4,
                "totalCollects": 0
              },
              "followModule": {
                "type": "FeeFollowModule",
                "contractAddress": "0xBc20957342419BE3449DB77f89DEAdcb95cb32f5",
                "amount": {
                  "asset": {
                    "name": "WETH",
                    "symbol": "WETH",
                    "decimals": 18,
                    "address": "0x3C68CE8504087f89c640D02d133646d98e64ddd9"
                  },
                  "value": "0.01"
                },
                "recipient": "0xEEA0C1f5ab0159dba749Dc0BAee462E5e293daaF"
              }
            }
          },
          "totalAmountOfTimesFollowed": 3
        },
        {
          "wallet": {
            "address": "0x3A5bd1E37b099aE3386D13947b6a90d97675e5e3",
            "defaultProfile": {
              "id": "0x02b047",
              "name": null,
              "bio": null,
              "attributes": [
                {
                  "displayType": null,
                  "traitType": null,
                  "key": "custom_field",
                  "value": "yes this is custom"
                }
                ],
              "followNftAddress": null,
                "metadata": "ipfs://QmSfyMcnh1wnJHrAWCBjZHapTS859oNSsuDFiAPPdAHgHP",
              "isDefault": true,
              "handle": "yoginth",
              "picture": null,
              "coverPicture": null,
              "ownedBy": "0x3A5bd1E37b099aE3386D13947b6a90d97675e5e3",
              "dispatcher": null,
              "stats": {
                "totalFollowers": 3,
                "totalFollowing": 3,
                "totalPosts": 0,
                "totalComments": 0,
                "totalMirrors": 2,
                "totalPublications": 2,
                "totalCollects": 0
              },
              "followModule": null
            }
          },
          "totalAmountOfTimesFollowed": 3
        },
        {
          "wallet": {
            "address": "0x9260363c60A6782c2B6a702594B75F6e7CC096aC",
            "defaultProfile": {
              "id": "0x032e41",
              "name": null,
                            "bio": null,
              "attributes": [
                {
                  "displayType": null,
                  "traitType": null,
                  "key": "custom_field",
                  "value": "yes this is custom"
                }
                ],
              "followNftAddress": null,
                "metadata": "ipfs://QmSfyMcnh1wnJHrAWCBjZHapTS859oNSsuDFiAPPdAHgHP",
              "isDefault": true,
              "handle": "gaming",
              "picture": null,
              "coverPicture": null,
              "ownedBy": "0x9260363c60A6782c2B6a702594B75F6e7CC096aC",
              "dispatcher": null,
              "stats": {
                "totalFollowers": 0,
                "totalFollowing": 4,
                "totalPosts": 0,
                "totalComments": 0,
                "totalMirrors": 0,
                "totalPublications": 0,
                "totalCollects": 0
              },
              "followModule": null
            }
          },
          "totalAmountOfTimesFollowed": 1
        }
      ],
      "pageInfo": {
        "prev": "{\"offset\":0}",
        "next": "{\"offset\":5}",
        "totalCount": 5
      }
    }
  }
}
type Query {
  followers(request: FollowersRequest!): PaginatedFollowersResult!
}

You will see the paging result behavior repeated a lot in the API, this is to allow you to fetch a certain amount and then page it for the most optimal request speed. Every time something is wrapped in a paging result you will always get returned a pageInfo which holds the cursors for the previous and next alongside the total count which exists in the database. These cursors are just pointers for the server to get to the next result and do not need to be understood by your client or server. If you ever want to then page to the next result you can pass these previous and next cursor in the request cursor property.

Full code example

// this is showing you how you use it with react for example
// if your using node or something else you can import using
// @apollo/client/core!
import { apolloClient } from './apollo-client';
import { gql } from '@apollo/client'

const GET_FOLLOWERS = `
  query($request: FollowersRequest!) {
    followers(request: $request) { 
             items {
        wallet {
          address
          defaultProfile {
            id
            name
            bio
            handle
                        followNftAddress
                        metadata
            picture {
              ... on NftImage {
                contractAddress
                tokenId
                uri
                verified
              }
              ... on MediaSet {
                original {
                  url
                  mimeType
                }
              }
            }
            coverPicture {
              ... on NftImage {
                contractAddress
                tokenId
                uri
                verified
              }
              ... on MediaSet {
                original {
                  url
                  mimeType
                }
              }
            }
            ownedBy
            dispatcher {
              address
              canUseRelay
            }
            stats {
              totalFollowers
              totalFollowing
              totalPosts
              totalComments
              totalMirrors
              totalPublications
              totalCollects
            }
            followModule {
              ... on FeeFollowModuleSettings {
                type
                contractAddress
                amount {
                  asset {
                    name
                    symbol
                    decimals
                    address
                  }
                  value
                }
                recipient
              }
              ... on ProfileFollowModuleSettings {
               type
              }
              ... on RevertFollowModuleSettings {
               type
              }
            }
          }
        }
        totalAmountOfTimesFollowed
      }
      pageInfo {
        prev
        next
        totalCount
      }
        }
  }
`

export const followers = (profileId) => {
   return apolloClient.query({
    query: gql(GET_FOLLOWERS),
    variables: {
      request: {
        profileId,
        limit: 10
      },
    },
  })
}
// this is showing you how you use it with react for example
// if your using node or something else you can import using
// @apollo/client/core!
import { ApolloClient, InMemoryCache, HttpLink, ApolloLink } from '@apollo/client'

const httpLink = new HttpLink({ uri: 'https://api-mumbai.lens.dev/' });

// example how you can pass in the x-access-token into requests using `ApolloLink`
const authLink = new ApolloLink((operation, forward) => {
  // Retrieve the authorization token from local storage.
  // if your using node etc you have to handle your auth different
  const token = localStorage.getItem('auth_token');

  // Use the setContext method to set the HTTP headers.
  operation.setContext({
    headers: {
      'x-access-token': token ? `Bearer ${token}` : ''
    }
  });

  // Call the next link in the middleware chain.
  return forward(operation);
});

export const apolloClient = new ApolloClient({
  link: authLink.concat(httpLink),
  cache: new InMemoryCache(),
})

Did this page help you?