Returns one page of an organization's members, with what each member did during a date range.
Padlet builds the member list in the background. If it is not ready, the response is 202 Accepted with an empty data list, meta.pending is ["users"], and Retry-After says how many seconds to wait. Then send the same request again. An empty list on a 202 does not mean the organization has no members.
Only current members are listed. A member who has left is not included, even for a date range before they left. Owners show as admin; there is no separate owner role.
Pilot: works only for organizations Padlet has enrolled. To enroll, contact Padlet support.
The API key must belong to an admin of the organization, or a teacher for a classroom. An unknown organization, one that is not enrolled, and a key without access all return the same 404.
Pilot: enrollment requiredThis endpoint works only for organizations Padlet has enrolled. To enroll, email [email protected]. Until then, every call returns
404.
API keyGet one from your developer settings and send it as the
X-API-KEYheader. The key must belong to an admin of the organization, or a teacher for a classroom.
A202means "not ready yet"Padlet builds the member list in the background. If it is not ready, the response is
202 Acceptedwith an emptydatalist,meta.pendingis["users"], and theRetry-Afterheader says how many seconds to wait. Wait, then send the same request again.An empty list on a
202does not mean the organization has no members.
Returns one page of an organization's members, with what each member did during a date range.
This list does not add up to memberCount. memberCount counts members who joined on or before to. This list shows every current member, whenever they joined. So meta.totalCount and memberCount can differ.
Query parameters
| Parameter | Notes |
|---|---|
from, to | Start and end days, inclusive, as YYYY-MM-DD. Send both or neither. Default: the past 365 days |
status[] | active or inactive. Sending both is the same as sending neither |
userType[] | admin, maker, teacher, student, contributor, guest. Owners count as admin |
q | Search names and emails. Not case-sensitive |
sort | name (default), email, userType, signupDate, lastActivityDate, padlets, posts, comments, reactions |
order | asc (default) or desc |
page | Starts at 1 (default) |
perPage | Default 25, maximum 100 |
To send several values, repeat the parameter with brackets: status[]=active&status[]=inactive. One value can go without brackets.
Date range rules:
- The range can be at most 24 months long.
fromcannot be earlier than January, five years ago.tocannot be later than the current month.
Other rules:
- Out-of-range values are rejected, not adjusted. A
perPageabove 100, apagebelow 1, or an unknownsort,order,statusoruserTypereturns400. (page - 1) * perPagecannot exceed 1,000,000.- Every role is accepted for every organization type. A role the organization cannot have returns no rows. For example,
makerin a classroom. - Members with no value in the sort column come first when
orderisasc, and last when it isdesc. For example, withsort=lastActivityDate, members who never did anything come first or last.
Row attributes
Each row's id is the member's user hashid.
| Attribute | Notes |
|---|---|
name | Display name. Falls back to the username if blank |
username | Padlet username. Can be null |
email | Can be null |
userType | The member's role. Owners show as admin |
active | true if the member created a padlet, post, comment or reaction in the range |
signupDate | UTC date the member signed up for Padlet. Not the date they joined this organization |
lastActivityDate | The member's latest activity in this organization, at any time. Ignores the range |
padlets | Padlets created in the range |
posts | Posts written in the range |
comments | Comments written in the range |
reactions | Reactions given in the range |
What the list covers
- Current members only. A member who has left is not listed, even for a date range before they left.
activemeans creating something. Only padlets, posts, comments and reactions count. A member who only viewed padlets isinactive.lastActivityDateis not tied to the range. It can fall before or after it. It also counts time spent on a padlet, so aninactivemember can still have a date. It isnullonly if the member has no activity in the organization at all.- There is no
ownerrole. Owners show asadmin, souserType[]=adminreturns admins and the owner together. You cannot filter for the owner alone.
Meta
| Field | Notes |
|---|---|
status | ready, pending (still being built), or failed |
dateRange | The date range the counts cover |
page | The page returned |
perPage | Rows per page |
totalCount | Rows matching your filters, across all pages |
totalPages | ceil(totalCount / perPage) |
pending | ["users"] on a 202, with retryAfter |
errors | ["users"] if building the list failed. data is empty |
A failed list returns 200, not a 5xx. Always check meta.status before reading data. An empty data with failed is an error, not an empty organization.
Errors
| Code | Meaning |
|---|---|
400 | Unknown sort, order, status or userType, page or perPage below 1, perPage above 100, offset past 1,000,000, or a bad date range |
401 | API key missing or revoked |
404 | Organization not found, not enrolled, or your key has no analytics access to it. All three look the same |
406 | Unsupported Accept header. Send application/vnd.api+json or leave it out |
429 | More than 60 requests in an hour for this API key and organization. This limit is separate from the metrics endpoint's. Retry-After says how many seconds to wait |
Example
curl "https://api.padlet.dev/v1/organizations/$ORG_ID/analytics/users?from=2026-01-01&to=2026-03-31&status[]=active&sort=posts&order=desc&perPage=2" \
-H "X-API-KEY: $PADLET_API_KEY"{
"data": [
{
"id": "user_abcd1234efgh5678",
"type": "organizationAnalyticsUser",
"attributes": {
"name": "Ada Lovelace",
"username": "ada",
"email": "[email protected]",
"userType": "teacher",
"active": true,
"signupDate": "2025-09-14",
"lastActivityDate": "2026-03-02",
"padlets": 4,
"posts": 37,
"comments": 12,
"reactions": 58
}
},
{
"id": "user_wxyz9876stuv5432",
"type": "organizationAnalyticsUser",
"attributes": {
"name": "Alan Turing",
"username": "alan",
"email": "[email protected]",
"userType": "student",
"active": true,
"signupDate": "2025-08-21",
"lastActivityDate": "2026-03-01",
"padlets": 2,
"posts": 19,
"comments": 5,
"reactions": 23
}
}
],
"meta": {
"status": "ready",
"dateRange": { "from": "2026-01-01", "to": "2026-03-31" },
"page": 1,
"perPage": 2,
"totalCount": 348,
"totalPages": 174
}
}Exporting every member
Request page=1, 2, and so on until you pass meta.totalPages. Keep from, to and every filter the same on each request. If you change a filter partway, the pages shift and you can miss or repeat members.
