How do I get a list of all users from the API?

AI-generated summary

The discussion revolves around obtaining a complete list of users via the Discourse API. Initially, users noted that the /admin/users.json endpoint limits results to 100 users and lacks paging support dirkcuys. While the Export feature can retrieve all users, it’s not suitable for programmatic use Mittineague. A workaround involves using the /groups/trust_level_0/members.json endpoint, which supports pagination DeanMarkTaylor, though it requires iterating through trust levels. Some users confirmed that this approach may only need trust_level_0 since it includes all users downey. However, the lack of paging on /admin/users.json remains a concern jackzampolin. An alternative is using the Data Explorer plugin for read-only queries ryancey. Updated documentation indicates that a pageable list of users is available via the public /directory_items.json endpoint and the /admin/users/list/{flag}.json endpoint abk. To fetch all users, the new flag can be used with pagination blake, as demonstrated in a Python example [mattdm](/t/-/24261/19].

I see that I can get a list of users using the API using http://discourse.example.net/admin/users.json, but I get only 100 users and I don’t know how the paging for that works? The interface doesn’t seem to display more than 100 users if you go to the admin part.

There is no paging.
There is no scrolling.
Currently the only way to get more is to use “Export” :sadpanda:

sad panda indeed :frowning: The exported list doesn’t include the same data, and the way it happens makes it hard to grab programatically.

Any idea if paging for users is wanted by anyone else and if it is something that may be implemented at some stage?

Yes :smile:

No idea.

Any thought if this will be fixed/expanded? We really need API access to access our user lists. Limiting at 100 just doesn’t make sense.

Has this been addressed? This would be really useful to my user import script

I’d also love to see this, to use in scripts that process the whole user base in some way, like this:

Whilst not immediately obvious…

It is possible to get a list of all users via the groups API endpoint available to admins.

You’ll have to iterate over the following groups:

  • trust_level_0
  • trust_level_1
  • trust_level_2
  • trust_level_3
  • trust_level_4

But they do support both limit and offset parameters:

/groups/trust_level_0/members.json?limit=50&offset=50

This is a great workaround, but begs the question: Is there a reason these parameters are not supported on /users.json ?

It was recently noted that you only need to iterate trust_level_0:

So this API doesn’t give emails too. This means that I would have to get the whole list then interate through and pull each user individually to get all the appropriate info (admin, moderator, etc…) Is that correct

Yes I believe that is correct. I don’t think paging has been added yet to /admin/users.json.

Sorry the reply so late but that’s the first search result for “get list of all users discourse”…

You can implement read-only endpoints with the Data Explorer plugin.

  • Install the plugin
  • Create your query, with inputs if needed
  • Issue a POST request on /admin/plugins/explorer/queries/[id]/run (with [id] being your query ID)

You can also implement paging with limit/offset inputs I guess, but never tried.

For example, I’m using it to check if a given OAuth user ID is already registered on my instance through discourse-oauth2-basic.

A brief, updated answer: a pageable list of users is available in two ways:

  1. Public list of users as a "directory listing
  2. List of users by “flag” Where the {flag} in the URL should be replaced by an Enum

Cheers,
ABK

Hi for

List of users by “flag”

is there a flag to get all users? such as https://{defaultHost}/admin/users/list/all.json

I wasn’t able to fetch all users using this endpoint, any explanations?

Another solution a bit hacky but works for me:

/admin/users/list/active.json?show_emails=true&page=${page}

Using the “new” flag instead of “active” should give you ALL the users. Just sort by created ascending and it will give you all the users ordered from oldest to newest. You will still have to use pagination to fetch all the users otherwise it could be way too large of a request if you have a lot of users.

/admin/users/list/new?asc=true&order=created&page=0

Just for the record:

    for page in itertools.count(start=1):
        userlist = api_get(f"admin/users/list/new.json?page={page}")
        if not userlist:
            break
        for user in userlist:
            print(f"{user['id']:5} {user['username']}")