Skip to content

The documents the person may see, newest first

GET
/groups/{groupId}/documents
curl --request GET \
--url 'https://app.grouperly.com/api/v2/groups/example/documents?limit=50&category=GENERAL' \
--header 'Authorization: Bearer <token>'

What they’d see in Grouperly: a leader sees every document but a HEALTH one; others see GROUP and PUBLIC ones, their own, and private ones shared with them. A key acts as its leader. A key, or an app without roster.youth.read, never gets a HEALTH document, one linked to a youth’s roster entry, or one a young person uploaded or wrote (2.21.0). A HEALTH document goes only to a first-party app, for its uploader, people it’s shared with by name, or the group’s own owners and admins, and every read of one is logged (2.26.1). Nothing taken down for review.

  • apiKey
    documents:read
  • appToken
    https://api.grouperly.com/documents.read
groupId
required
string

The credential’s group

limit
integer
default: 50 >= 1 <= 200

Items per page

cursor
string

From the previous page’s nextCursor; opaque

category
string
Allowed values: GENERAL HEALTH FINANCIAL POLICY ROSTER SCHEDULE TRAINING FORM PHOTO REPORT

Only this category (case-insensitive)

eventId
string

Only documents attached to this event

tag
string

Only documents with this tag (exact)

search
string

Name, description or file name contains this (any case)

OK

Media typeapplication/json
object
items
required
Array<object>
object
id
required
string
name
required
string
fileName
required
string
mimeType
required
string
size
required

Bytes

integer
category
required
string
Allowed values: GENERAL HEALTH FINANCIAL POLICY ROSTER SCHEDULE TRAINING FORM PHOTO REPORT
description
required
string | null
tags
required
Array<string>
visibility
required

PRIVATE documents reach only leaders, the uploader and those it was shared with

string
Allowed values: PUBLIC GROUP PRIVATE
uploadedBy
required
object
userId
required
string
name
required

Null for a youth’s upload to an app without roster.youth.read

string | null
linkedTo
required

What it is attached to: an event, a series, a member, a position, a circle…

Array<object>
object
type
required

What it’s linked to. More types may be added: ignore a link whose type you don’t know (SERIES and CIRCLE were added in 2.16.0, #245).

string
id
required
string
status
required

Its lifecycle (DECISIONS #75): DRAFT, FINAL, SUPERSEDED or HISTORICAL

string
Allowed values: DRAFT FINAL SUPERSEDED HISTORICAL
revision
required

The number of its current text (GET …/markdown), or null when it has none yet

integer | null
folder
required

Where it is in the group’s library (#245), or null when it’s in no folder

object
id
required
string
path
required

The folder and those above it, e.g. “Committee/2026”

string
createdAt
required
string format: date-time
updatedAt
required
string format: date-time
nextCursor
required

Pass as ?cursor= for the next page; null on the last page.

string | null
Example
{
"items": [
{
"category": "GENERAL",
"visibility": "PUBLIC",
"status": "DRAFT"
}
]
}
X-RateLimit-Limit
integer

Requests allowed per minute for this credential

X-RateLimit-Remaining
integer

Requests left in this window

X-RateLimit-Reset
integer

When the window ends (Unix seconds)

A query parameter is malformed or unknown (invalid_parameter, with parameter)

Media typeapplication/json
object
error
required
object
code
required

Stable and machine-readable: unauthorized, forbidden, insufficient_scope, key_owner_not_leader, app_not_installed, scope_not_allowed, app_suspended, rate_limited, not_found, invalid_parameter, invalid_body, invalid_profile, invalid_descriptor, no_profile, already_exists, not_a_member, position_inactive, position_full, already_assigned, assignment_ended, version_not_current, nothing_to_pay, payments_not_ready, payload_too_large, first_party_only, terms_required, child_account, assistant_off, not_for_assistant, assistant_failed, not_a_draft, storage_full, unavailable, internal_error. New codes may be added.

string
message
required

For people; wording may change.

string
parameter

The query parameter (invalid_parameter) or body field (invalid_body, not_a_member) at fault.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"parameter": "example"
}
}
X-RateLimit-Limit
integer

Requests allowed per minute for this credential

X-RateLimit-Remaining
integer

Requests left in this window

X-RateLimit-Reset
integer

When the window ends (Unix seconds)

Missing, unknown, revoked or expired credential (unauthorized)

Media typeapplication/json
object
error
required
object
code
required

Stable and machine-readable: unauthorized, forbidden, insufficient_scope, key_owner_not_leader, app_not_installed, scope_not_allowed, app_suspended, rate_limited, not_found, invalid_parameter, invalid_body, invalid_profile, invalid_descriptor, no_profile, already_exists, not_a_member, position_inactive, position_full, already_assigned, assignment_ended, version_not_current, nothing_to_pay, payments_not_ready, payload_too_large, first_party_only, terms_required, child_account, assistant_off, not_for_assistant, assistant_failed, not_a_draft, storage_full, unavailable, internal_error. New codes may be added.

string
message
required

For people; wording may change.

string
parameter

The query parameter (invalid_parameter) or body field (invalid_body, not_a_member) at fault.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"parameter": "example"
}
}

A key: wrong group (forbidden), missing scope (insufficient_scope), or its creator no longer leads the group (key_owner_not_leader). An app’s token: missing scope (insufficient_scope), the group hasn’t installed the app (app_not_installed) or allowed the scope (scope_not_allowed, the message has the consent link), the person may not do this in the group (forbidden), Grouperly paused the app (app_suspended), the person hasn’t accepted Grouperly’s current Terms (terms_required: refresh their token, then send them to the hub’s /account/welcome), or it’s a child’s account (child_account)

Media typeapplication/json
object
error
required
object
code
required

Stable and machine-readable: unauthorized, forbidden, insufficient_scope, key_owner_not_leader, app_not_installed, scope_not_allowed, app_suspended, rate_limited, not_found, invalid_parameter, invalid_body, invalid_profile, invalid_descriptor, no_profile, already_exists, not_a_member, position_inactive, position_full, already_assigned, assignment_ended, version_not_current, nothing_to_pay, payments_not_ready, payload_too_large, first_party_only, terms_required, child_account, assistant_off, not_for_assistant, assistant_failed, not_a_draft, storage_full, unavailable, internal_error. New codes may be added.

string
message
required

For people; wording may change.

string
parameter

The query parameter (invalid_parameter) or body field (invalid_body, not_a_member) at fault.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"parameter": "example"
}
}
X-RateLimit-Limit
integer

Requests allowed per minute for this credential

X-RateLimit-Remaining
integer

Requests left in this window

X-RateLimit-Reset
integer

When the window ends (Unix seconds)

Rate limited (rate_limited)

Media typeapplication/json
object
error
required
object
code
required

Stable and machine-readable: unauthorized, forbidden, insufficient_scope, key_owner_not_leader, app_not_installed, scope_not_allowed, app_suspended, rate_limited, not_found, invalid_parameter, invalid_body, invalid_profile, invalid_descriptor, no_profile, already_exists, not_a_member, position_inactive, position_full, already_assigned, assignment_ended, version_not_current, nothing_to_pay, payments_not_ready, payload_too_large, first_party_only, terms_required, child_account, assistant_off, not_for_assistant, assistant_failed, not_a_draft, storage_full, unavailable, internal_error. New codes may be added.

string
message
required

For people; wording may change.

string
parameter

The query parameter (invalid_parameter) or body field (invalid_body, not_a_member) at fault.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"parameter": "example"
}
}
X-RateLimit-Limit
integer

Requests allowed per minute for this credential

X-RateLimit-Remaining
integer

Requests left in this window

X-RateLimit-Reset
integer

When the window ends (Unix seconds)

Retry-After
integer

Seconds to wait

An app’s token for someone new, while Grouperly’s sign-in can’t be reached (unavailable); try again

Media typeapplication/json
object
error
required
object
code
required

Stable and machine-readable: unauthorized, forbidden, insufficient_scope, key_owner_not_leader, app_not_installed, scope_not_allowed, app_suspended, rate_limited, not_found, invalid_parameter, invalid_body, invalid_profile, invalid_descriptor, no_profile, already_exists, not_a_member, position_inactive, position_full, already_assigned, assignment_ended, version_not_current, nothing_to_pay, payments_not_ready, payload_too_large, first_party_only, terms_required, child_account, assistant_off, not_for_assistant, assistant_failed, not_a_draft, storage_full, unavailable, internal_error. New codes may be added.

string
message
required

For people; wording may change.

string
parameter

The query parameter (invalid_parameter) or body field (invalid_body, not_a_member) at fault.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"parameter": "example"
}
}