Read organization analytics

Returns engagement, membership and content-safety figures for one organization over a date range.

It uses POST because the query is a list of metric objects. It is still a read, so sending it again changes nothing.

Padlet computes analytics in the background. If a metric is not ready, the response is 202 Accepted, the metric is listed in meta.pending, and Retry-After says how many seconds to wait. Send the same request again until the response is 200 and meta.pending is empty. A query can take several minutes. A pending metric is missing from data; do not treat it as zero.

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 required

This endpoint works only for organizations Padlet has enrolled. To enroll, email [email protected]. Until then, every call returns 404.

📘

Before you start

  • API key. Get one from your developer settings and send it as the X-API-KEY header. The key must belong to an admin of the organization, or a teacher for a classroom.
  • org_id. Call GET /me?include=organizations. It lists every wksp_ organization your key belongs to. org_ organizations on padlet.org are not supported yet.
🔄

A 202 means "not ready yet"

Padlet computes analytics in the background. If a metric is not ready, the response is 202 Accepted, the metric is listed in meta.pending, and the Retry-After header says how many seconds to wait.

Wait, then send the same request again. Repeat until the response is 200 and meta.pending is empty. A query can take several minutes.

A pending metric is missing from data. Do not treat it as zero.

Returns engagement, membership and content-safety figures for one organization over a date range.

The endpoint uses POST because the query is a list of metric objects. It is still a read: sending it again changes nothing. Each retry does count toward the limit of 60 requests an hour, so wait for Retry-After between polls.

Request body

FieldTypeNotes
metricsarrayRequired. 1 to 25 metrics. See Query limit
metrics[].namestringA metric from the catalog
metrics[].<property>string or arraySee the catalog. An array splits the result by each value. userType is the exception, see below
dimensionsarraySend ["month"] for a monthly series. Every metric in the request must support it
from, tostringStart and end days, inclusive, as YYYY-MM-DD. Send both or neither. Default: the past 365 days

Date range rules:

  • The range can be at most 24 months long.
  • from cannot be earlier than January, five years ago.
  • to cannot be later than the current month.

Breaking any of these returns 400.

Query limit

Padlet runs one query per metric, and one per value when a property is an array (except userType). A request can run at most 50 queries. Split larger requests into several calls.

Metric catalog

MetricPropertiesMonthly
memberCountstatus: active, inactive, invited, joined, all · userType: rolesyes
newMemberCount—yes
padletCountuserType: roles, monthly onlyyes
postCountuserType: roles, monthly onlyyes
commentCountuserType: roles, monthly onlyyes
reactionCountuserType: roles, monthly onlyyes
visitorCount—yes
peerInteractionCountuserType: roles — requiredyes
wallEngagementMinutesuserType: roles, plus anonymousno
attachmentCountByCategoryuserType: roles — requiredno
scannedItemCount—no
scannedItemCountByType—no
avgScanTimeMs—no
flaggedItemCount—no
flaggedItemCountByCategory—no
moderationCatchRatePercent—no
topPadletssortBy: posts, visitors — requiredno
topUserssortBy: posts, padlets — required · userType: rolesno
topMediamediaType: video, audio — requiredno
subscription—no

How to read the table:

  • required: you must send this property. The metric has no all-members total.
  • monthly only: you can send userType only together with dimensions: ["month"]. Otherwise the request returns 400. Leaving out both is fine: {"name": "postCount"} returns one number.

Not every property value has a monthly form. For example, memberCount with status: ["active", "inactive"] and dimensions: ["month"] returns a 400 that names the unsupported combination.

userType

userType takes a single role or a list of roles. A list is one combined group, not a split by role. For example, ["teacher", "admin"] returns one figure for teachers and admins together.

Roles depend on the organization type:

OrganizationRoles
Schoolowner, admin, teacher, student, guest
Classroomowner, teacher, student
Teamowner, admin, maker, contributor, guest

The endpoint accepts every role name for every organization type. A role the organization cannot have returns 0, not an error. For example, admin in a classroom returns 0.

all must be sent alone. ["all", "teacher"] returns 400.

Metric notes

  • memberCount: status invited and joined also need userType.
  • wallEngagementMinutes: with no userType, or with all, the figure includes anonymous visitors. To count members only, list their roles.
  • Content-safety metrics (scannedItemCount through moderationCatchRatePercent): available for schools and classrooms only. A team organization gets a 400.

What the figures cover

Membership counts use the organization's current members. A member who has left is not counted, even for a date range before they left.

memberCount statusCounts
all, joinedCurrent members who joined on or before to
activeCurrent members who contributed anything in the range
inactiveCurrent members minus active
invitedInvitations open right now. Ignores from and to

All other metrics (padlets, posts, comments, reactions, visitors, engagement minutes) count only activity inside the range.

Response

Each metric in attributes.metrics has a name, its properties and its data.

properties shows what Padlet used, not a copy of your request:

  • A property you left out comes back as all.
  • A single userType comes back as a one-item list.
  • Duplicate values are removed.

To match an entry in meta.pending or meta.errors to your request, compare the name and these properties.

Shape of data

You asked fordata is
A plain countA number, like 42
dimensions: ["month"]A list of monthly rows. See Monthly row keys
A property as an arrayAn object with one key per value, like { "active": 12, "inactive": 3 }. Each value has the shape it would have on its own, for example a list of monthly rows
topPadlets, topUsers, topMediaA list of up to 10 items, each with a hashid, a name or title, and its figures. The limit of 10 is fixed. There is no pagination
attachmentCountByCategoryA list of { category, count }
scannedItemCountByType, flaggedItemCountByCategoryAn object of numbers, keyed by item type or flag category
subscriptionAn object with billing dates, status and seat count. See below

Monthly row keys

Each row has a month and one figure. The figure's key depends on the metric:

KeyMetrics
valuememberCount, padletCount, postCount, commentCount, peerInteractionCount
countnewMemberCount, reactionCount
visitorsvisitorCount

subscription

  • Dates and status show the current billing state, whatever the range.
  • Seat count is as of the last day of the range, or today if the range ends in the future.
  • Seat count is null if the range covers more than one billing term, or goes back further than the billing history.

Meta

FieldNotes
statusready: every metric was returned. pending: at least one is still being computed. partial: nothing is pending, but at least one metric failed
dateRangeThe date range used. The default range does not start on the first of a month
pendingMetrics still being computed, on a 202
retryAfterSeconds to wait before sending the request again. Same as the Retry-After header
errorsMetrics that failed. They are missing from data, not returned as zero

A partial response returns 200, not a 5xx. If every metric failed, metrics is empty. Always check meta.status before reading data.

Errors

CodeMeaning
400Unknown metric, invalid property value, bad or too-long date range, duplicate metric, more than 50 queries, or malformed JSON (BAD_JSON)
401API key missing or revoked
404Organization not found, not enrolled, or your key has no analytics access to it. All three look the same
406Unsupported Accept header. Send application/vnd.api+json or leave it out
415Unsupported Content-Type. Send application/json. Some clients send form encoding by default
429More than 60 requests in an hour for this API key and organization. Polls count too. Retry-After says how many seconds to wait

Example

curl -X POST https://api.padlet.dev/v1/organizations/$ORG_ID/analytics \
  -H "X-API-KEY: $PADLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "metrics": [
      { "name": "padletCount" },
      { "name": "memberCount", "status": "active", "userType": ["teacher", "admin", "owner"] }
    ],
    "dimensions": ["month"]
  }'
{
  "data": {
    "id": "wksp_1oRLGeKoGK9DPvOw",
    "type": "organizationAnalytics",
    "attributes": {
      "metrics": [
        { "name": "padletCount", "properties": { "userType": "all" }, "data": [{ "month": "2026-08", "value": 1 }] },
        {
          "name": "memberCount",
          "properties": { "status": "active", "userType": ["teacher", "admin", "owner"] },
          "data": [{ "month": "2026-08", "value": 1 }]
        }
      ]
    }
  },
  "meta": { "status": "ready", "dateRange": { "from": "2026-08-03", "to": "2027-08-03" } }
}
Path Params
string
required
length between 16 and 22

Hashid of the organization where you are an admin, or a teacher for a classroom. Read it
from GET /me?include=organizations, which lists every wksp_ organization your key
belongs to. org_ organizations on padlet.org are not supported yet.

Body Params
metrics
array of objects
required
length between 1 and 25

The metrics to read. To compare two role groups, list the same metric twice with different properties. Two entries with the same name and properties return 400. A request can run at most 50 queries. Split larger requests into several calls.

metrics*
string
enum
required

A metric from the catalog on the Analytics page.

enum

memberCount only. invited and joined also need userType. An array returns one figure per status.

enum

Roles to count. Leave out to count every member.

Roles depend on the organization type: teacher and student in a school or classroom, maker and contributor in a team.

An array is one combined group, not a split by role. To compare roles, list the metric once per role. all must be sent alone.

wallEngagementMinutes also accepts anonymous for signed-out visitors. Without userType, that metric already includes them. List roles to leave them out.

enum

topPadlets: posts or visitors. topUsers: posts or padlets. Required.

enum

topMedia only: video or audio. Required.

dimensions
array of strings

Send ["month"] for a monthly series instead of one figure for the whole range. Every metric in the request must support it, or the request returns 400.

dimensions
Allowed:
string
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$

Start day, inclusive, as YYYY-MM-DD. Send both from and to, or neither for the past 365 days.

string
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$

End day, inclusive, as YYYY-MM-DD. The range can be at most 24 months long.

Headers
string
enum
Defaults to application/vnd.api+json

Generated from available request content types

Allowed:
Responses

Language
Credentials
Header
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/vnd.api+json