Skip to content

One call for a group screen: the group, upcoming events and roster counts

GET
/groups/{groupId}/overview
curl --request GET \
--url https://app.grouperly.com/api/v2/groups/example/overview \
--header 'Authorization: Bearer <token>'

Include= adds parts, each needing its own scope: upcomingEvents (events.read; up to 5), rosterCounts (roster.read), positions (positions.read; the first page of active positions). Asking for one without its scope is a 403 insufficient_scope. Open join requests and cards come later.

groupId
required
string

The credential’s group

include
string

Comma-separated related data to add: upcomingEvents, rosterCounts, positions. Anything else is a 400.

OK

Media typeapplication/json
object
group
required
object
id
required
string
name
required
string
slug
required

The group’s page address, www.grouperly.com/. It can change: leaders can change it, and the group pages’ rollout replaces one that breaks the address rules (2.26.4). Keep track of a group by its id.

string
type
required
string
description
required
string | null
metadata
required

The group profile: subtype and the fields its vertical’s descriptor declares (profile.fields), e.g. { subtype: “PACK”, unitNumber: “1232” } for a scouting unit. Groups in a vertical are checked against its descriptor when saved; others record anything

object
vertical
required

The vertical the group belongs to, e.g. “scouting” (added in 2.1.0)

string | null
memberCount
required
integer
youthCount
required

Youth entries on the roster (added in 2.3.0). For an app without roster.youth.read it’s all it learns about them: /contacts leaves them out.

integer
subgroupCount
required
integer
createdAt
required
string format: date-time
updatedAt
required
string format: date-time
upcomingEvents

Present only with include=upcomingEvents.

Array<object>
object
id
required
string
groupId
required
string
seriesId
required
string | null
iterationLabel
required

E.g. “2026” for a yearly series

string | null
name
required
string
description
required
string | null
status
required
string
Allowed values: DRAFT PLANNED ACTIVE COMPLETED CANCELLED
startsAt
required
string | null format: date-time
endsAt
required
string | null format: date-time
allDay
required
boolean
timezone
required

IANA zone, e.g. “America/Chicago”

string | null
location
required
object
name
required
string | null
url
required
string | null
rsvp
required
object
enabled
required
boolean
deadline
required
string | null format: date-time
maxAttendees
required
integer | null
paymentRequired
required

A place counts only once it is paid for, or while its checkout is open (added in 2.12.0)

boolean
cost
required
object
perPerson
required
One of:
object
amount
required

A decimal string, e.g. “25.00”: never a float.

string
/^-?\d+\.\d{2}$/
currency
required

ISO 4217, e.g. “USD”.

string
/^[A-Z]{3}$/
description
required
string | null
paymentInstructions
required
string | null
circle
required
One of:
object
id
required
string
name
required

E.g. “Wolf Den”

string
kind
required
object
key
required

E.g. “den”

string
singular
required

E.g. “Den”

string
plural
required

E.g. “Dens”

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

Present only with include=rsvpCounts.

object
going
required

Responses that said Going (households, not people)

integer
notGoing
required
integer
maybe
required
integer
pending
required
integer
totalAttendees
required

People on Going and Maybe responses. A response with no attendee rows counts as the responder plus its guest count (since 2.9.0; it counted 0 before).

integer
goingPeople
required

People on Going responses: what the event’s capacity counts (added in 2.9.0)

integer
maybePeople
required

People on Maybe responses (added in 2.9.0)

integer
paidAttendees
required

People on Going responses with a price who are paid for (added in 2.11.0)

integer
heldAttendees
required

People on Going responses whose checkout is holding their place (added in 2.11.0)

integer
unpaidAttendees
required

People on Going responses still owed for, in full or in part (added in 2.11.0)

integer
confirmedAttendees
required

People on Going responses with a place when payment is required to hold one: paid for, in checkout, or free with nothing owed on their response (added in 2.12.0)

integer
ticketTypes

Present only with include=ticketTypes.

Array<object>
object
id
required
string
name
required
string
description
required
string | null
price
required
object
amount
required

A decimal string, e.g. “25.00”: never a float.

string
/^-?\d+\.\d{2}$/
currency
required

ISO 4217, e.g. “USD”.

string
/^[A-Z]{3}$/
active
required
boolean
leaders

Who leads the event: whoever holds its organizer or lead role, then the leaders of its circle. Always on one event; on the list with include=leaders. A leader who may be a youth is left out without roster.youth.read (added in 2.18.0).

Array<object>
object
userId
required
string
contactId
required

Their roster entry in the event’s group, as on RSVP attendees; null if they have none

string | null
name
required

The roster’s name, else the account’s

string | null
role
required

ORGANIZER or LEAD: an event role, given in Grouperly. CIRCLE_LEADER: a leader of the event’s circle, through a roster entry linked to their account. Someone holding two is listed for each. More may be added: treat one you don’t know as a leader.

string
viewer

The signed-in person’s relation to the event. Only for an app’s access token; a group key isn’t a person (added in 2.18.0).

object
isLeader
required

The signed-in person is one of the event’s leaders: they hold its organizer or lead role, or lead its circle. The group’s owners and admins aren’t, unless they hold a role (their role is on /me/groups).

boolean
rosterCounts

Present only with include=rosterCounts.

object
adults
required
integer
youth
required
integer
positions

Present only with include=positions.

object
items
required
Array<object>
object
id
required
string
name
required
string
description
required
string | null
category
required
string
Allowed values: LEADERSHIP OFFICER COORDINATOR COMMITTEE VOLUNTEER GENERAL
maxHolders
required

How many may hold it at once; null for any number

integer | null
sortOrder
required

Lower comes first

integer
active
required

Only active positions take new holders

boolean
holderCount
required

Everyone who holds it now

integer
holders
required

Who holds it now, earliest first. An app without roster.youth.read isn’t told which youth hold it: they’re counted in holderCount but not listed.

Array<object>
object
assignmentId
required
string
userId
required
string
name
required
string | null
startedAt
required
string format: date-time
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
{
"upcomingEvents": [
{
"status": "DRAFT"
}
],
"positions": {
"items": [
{
"category": "LEADERSHIP"
}
]
}
}
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)

Not found (not_found)

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"
}
}