List the group challenges an organization runs
- Bearer token
- Permission
group-challenge/read - Per organization
Lists the group challenges of this organization that are running or have closed, the one whose dates start latest first. A group challenge is a project students do in small groups: their teacher forms a group from their own students in the panel, and the group works through the challenge’s steps between windowStart and windowEnd, uploading its work for each step in the panel or the app.
isOpen says whether it takes work right now. Challenges the organizers have not published are not listed.
A page at a time: limit is 20 by default and at most 100.
Parameters
Path parameters
| Name | Type | Description |
|---|---|---|
organizationIdrequired | stringpattern ^[0-9a-f]{24}$ | The organization’s Example |
Query parameters
| Name | Type | Description |
|---|---|---|
pageoptional | number | Page number. Defaults to 1. Example |
limitoptional | number | Items per page. Defaults to 20, max 100. Example |
Responses
200 OK
Success: message is "Group challenges fetched successfully.".
Body
successbooleanrequiredAlways
trueon a success.one of
truemessagestringrequiredexample
Group challenges fetched successfully.paginationobject · PaginationMetarequiredWhere one page sits in the whole list.
4 fields of pagination
pagenumberrequiredThe page returned, counting from 1.
min
1example1limitnumberrequiredItems per page: the
limityou sent, 20 if you sent none, and never more than 100.min
1max100example20totalnumberrequiredItems across every page.
min
0example57totalPagesnumberrequiredPages at this
limit:total / limit, rounded up.min
0example3
dataarray of GroupChallengeResponserequired11 fields of each item
_idstringrequiredThe challenge’s id: the
challengeIdof every other operation.example
6650a1b2c3d4e5f6a7b8c9ebnamestringrequiredIts name.
example
STEM Maker Challengestatusstringrequiredpublishedwhile it runs;closedonce the organizers have closed it, when it is still readable and takes no more work. New values may be added; treat an unknown one as closed.one of
publishedclosedexample
publishedisOpenbooleanrequiredWhether it takes work right now:
published, and now is betweenwindowStartandwindowEnd.example
truewindowStartstringrequiredWhen it opens (UTC).
format
date-timeexample2026-10-01T00:00:00.000ZwindowEndstringrequiredWhen it closes (UTC), inclusive. Nothing is submitted after it: not a step, not the final work.
format
date-timeexample2026-12-21T23:59:59.999ZminStudentsobjectnullablerequiredThe fewest students a group may have.
example
2maxStudentsobjectnullablerequiredThe most students a group may have.
example
3isPaidbooleanrequiredWhether taking part costs a fee. The teacher settles it in the panel when they create the group; this API neither shows nor takes it.
example
falsegradeGroupsarray of GroupChallengeGradeGroupResponserequiredThe grade groups, in their order.
3 fields of each item
_idstringrequiredThe grade group’s id within the challenge.
example
6650a1b2c3d4e5f6a7b8c9eclabelstringrequiredIts name, for a person.
example
Group 7-8-9gradesarray of GroupChallengeGradeResponserequiredThe grades it takes. A student whose grade is in none of the grade groups cannot join the challenge.
2 fields of each item
_idstringrequiredThe grade’s id, the same
_idlistGradesreturns and a student’sgradeholds.example
6650a1b2c3d4e5f6a7b8c9d4nameobjectnullablerequiredThe grade’s name, as it was when the challenge was set up.
example
10
stepsarray of GroupChallengeStepDefinitionResponserequiredThe steps, in their order.
6 fields of each item
_idstringrequiredThe step’s id: what
submitGroupChallengeSteptakes.example
6650a1b2c3d4e5f6a7b8c9eeordernumberrequiredIts position, from 1. Steps open one after another.
example
1titlestringrequiredIts title, for a person.
example
Project proposalfileTypesarray of stringrequiredThe file types a member may upload for it, by extension, such as
pdformp4.example
["pdf","docx"]maxFileBytesobjectnullablerequiredThe largest file a member may upload for it, in bytes.
example
20971520maxFilesobjectnullablerequiredHow many files the step holds at most.
example
1
Headers
X-RateLimit-LimitintegerRequests your account may make to this operation per window (100).
X-RateLimit-RemainingintegerRequests left in the current window.
X-RateLimit-ResetintegerSeconds until the current window ends.
Example
{
"success": true,
"message": "Group challenges fetched successfully.",
"pagination": {
"page": 1,
"limit": 20,
"total": 57,
"totalPages": 3
},
"data": [
{
"_id": "6650a1b2c3d4e5f6a7b8c9eb",
"name": "STEM Maker Challenge",
"status": "published",
"isOpen": true,
"windowStart": "2026-10-01T00:00:00.000Z",
"windowEnd": "2026-12-21T23:59:59.999Z",
"minStudents": 2,
"maxStudents": 3,
"isPaid": false,
"gradeGroups": [
{
"_id": "6650a1b2c3d4e5f6a7b8c9ec",
"label": "Group 7-8-9",
"grades": [
{
"_id": "6650a1b2c3d4e5f6a7b8c9d4",
"name": "10"
}
]
}
],
"steps": [
{
"_id": "6650a1b2c3d4e5f6a7b8c9ee",
"order": 1,
"title": "Project proposal",
"fileTypes": [
"pdf",
"docx"
],
"maxFileBytes": 20971520,
"maxFiles": 1
}
]
}
]
}401 Unauthorized
unauthorized: The token is missing or malformed, is not signed with your account’s apiSecret, breaks the iat and exp rules, has expired or been revoked, or its account is not active. All of these answer the same.
When
unauthorizedThe token is missing or malformed, is not signed with your account’s
apiSecret, breaks theiatandexprules, has expired or been revoked, or its account is not active. All of these answer the same.
Example
{
"error": {
"code": "unauthorized",
"documentation_url": "https://hub.main-team.org/api/errors#unauthorized",
"message": "Authentication is required or the provided credentials are invalid.",
"request_id": "0b5c6d0e-8f7a-4b1c-9d2e-3f4a5b6c7d8e"
}
}Fields of the error body
errorobject · ErrorDetailrequiredWhat went wrong.
5 fields of error
codestringrequiredA stable machine code: branch on this. Each one is explained at
documentation_url.one of
invalid_emailbad_requestunauthorizedforbiddennot_foundconflictpayload_too_largeunsupported_media_typeunprocessable_entitytoo_many_requestsinternal_errorservice_unavailableexample
not_foundmessagestringrequiredWritten for a person, and may change: never branch on it.
example
Not found!documentation_urlstringrequiredWhere this code is explained.
format
uriexamplehttps://hub.main-team.org/api/errors#not_foundrequest_idstringrequiredThis request’s id, also sent as the
X-Request-Idresponse header: the one you sent, when it was acceptable, or else one the API made. Quote it when you report a problem.example
0b5c6d0e-8f7a-4b1c-9d2e-3f4a5b6c7d8edetailsobjectPresent only where an operation says so, and then with the shape that operation documents — the rows it could not accept, say. Treat it as absent everywhere else, and ignore a
detailsyou do not recognise.
403 Forbidden
forbidden: The token is valid, but no role on your account allows group-challenge/read on the organization in the path, or a role denies it.
When
forbiddenThe token is valid, but no role on your account allows
group-challenge/readon the organization in the path, or a role denies it.
Example
{
"error": {
"code": "forbidden",
"documentation_url": "https://hub.main-team.org/api/errors#forbidden",
"message": "Insufficient role permissions",
"request_id": "0b5c6d0e-8f7a-4b1c-9d2e-3f4a5b6c7d8e"
}
}Fields of the error body
errorobject · ErrorDetailrequiredWhat went wrong.
5 fields of error
codestringrequiredA stable machine code: branch on this. Each one is explained at
documentation_url.one of
invalid_emailbad_requestunauthorizedforbiddennot_foundconflictpayload_too_largeunsupported_media_typeunprocessable_entitytoo_many_requestsinternal_errorservice_unavailableexample
not_foundmessagestringrequiredWritten for a person, and may change: never branch on it.
example
Not found!documentation_urlstringrequiredWhere this code is explained.
format
uriexamplehttps://hub.main-team.org/api/errors#not_foundrequest_idstringrequiredThis request’s id, also sent as the
X-Request-Idresponse header: the one you sent, when it was acceptable, or else one the API made. Quote it when you report a problem.example
0b5c6d0e-8f7a-4b1c-9d2e-3f4a5b6c7d8edetailsobjectPresent only where an operation says so, and then with the shape that operation documents — the rows it could not accept, say. Treat it as absent everywhere else, and ignore a
detailsyou do not recognise.
404 Not found
not_found:organizationIdis not the_idof an organization.not_found: Group challenges are not switched on for this organization. The answer is the one an unknown path gets; nothing was read.
When
Example
{
"error": {
"code": "not_found",
"documentation_url": "https://hub.main-team.org/api/errors#not_found",
"message": "Organization not found!",
"request_id": "0b5c6d0e-8f7a-4b1c-9d2e-3f4a5b6c7d8e"
}
}Fields of the error body
errorobject · ErrorDetailrequiredWhat went wrong.
5 fields of error
codestringrequiredA stable machine code: branch on this. Each one is explained at
documentation_url.one of
invalid_emailbad_requestunauthorizedforbiddennot_foundconflictpayload_too_largeunsupported_media_typeunprocessable_entitytoo_many_requestsinternal_errorservice_unavailableexample
not_foundmessagestringrequiredWritten for a person, and may change: never branch on it.
example
Not found!documentation_urlstringrequiredWhere this code is explained.
format
uriexamplehttps://hub.main-team.org/api/errors#not_foundrequest_idstringrequiredThis request’s id, also sent as the
X-Request-Idresponse header: the one you sent, when it was acceptable, or else one the API made. Quote it when you report a problem.example
0b5c6d0e-8f7a-4b1c-9d2e-3f4a5b6c7d8edetailsobjectPresent only where an operation says so, and then with the shape that operation documents — the rows it could not accept, say. Treat it as absent everywhere else, and ignore a
detailsyou do not recognise.
429 Too many requests
too_many_requests: Your account has made more than 100 requests to this operation in the current 60-second window. Wait the seconds in Retry-After before sending again.
When
too_many_requestsYour account has made more than 100 requests to this operation in the current 60-second window. Wait the seconds in
Retry-Afterbefore sending again.
Headers
Retry-AfterintegerSeconds to wait before sending again; a request sent sooner is refused too.
Example
{
"error": {
"code": "too_many_requests",
"documentation_url": "https://hub.main-team.org/api/errors#too_many_requests",
"message": "Too many requests to this operation. Wait the number of seconds in Retry-After, then try again.",
"request_id": "0b5c6d0e-8f7a-4b1c-9d2e-3f4a5b6c7d8e"
}
}Fields of the error body
errorobject · ErrorDetailrequiredWhat went wrong.
5 fields of error
codestringrequiredA stable machine code: branch on this. Each one is explained at
documentation_url.one of
invalid_emailbad_requestunauthorizedforbiddennot_foundconflictpayload_too_largeunsupported_media_typeunprocessable_entitytoo_many_requestsinternal_errorservice_unavailableexample
not_foundmessagestringrequiredWritten for a person, and may change: never branch on it.
example
Not found!documentation_urlstringrequiredWhere this code is explained.
format
uriexamplehttps://hub.main-team.org/api/errors#not_foundrequest_idstringrequiredThis request’s id, also sent as the
X-Request-Idresponse header: the one you sent, when it was acceptable, or else one the API made. Quote it when you report a problem.example
0b5c6d0e-8f7a-4b1c-9d2e-3f4a5b6c7d8edetailsobjectPresent only where an operation says so, and then with the shape that operation documents — the rows it could not accept, say. Treat it as absent everywhere else, and ignore a
detailsyou do not recognise.
500 Internal error
internal_error: Something failed on our side. Retry later, and quote request_id if it goes on.
When
internal_errorSomething failed on our side. Retry later, and quote
request_idif it goes on.
Example
{
"error": {
"code": "internal_error",
"documentation_url": "https://hub.main-team.org/api/errors#internal_error",
"message": "An unexpected error occurred.",
"request_id": "0b5c6d0e-8f7a-4b1c-9d2e-3f4a5b6c7d8e"
}
}Fields of the error body
errorobject · ErrorDetailrequiredWhat went wrong.
5 fields of error
codestringrequiredA stable machine code: branch on this. Each one is explained at
documentation_url.one of
invalid_emailbad_requestunauthorizedforbiddennot_foundconflictpayload_too_largeunsupported_media_typeunprocessable_entitytoo_many_requestsinternal_errorservice_unavailableexample
not_foundmessagestringrequiredWritten for a person, and may change: never branch on it.
example
Not found!documentation_urlstringrequiredWhere this code is explained.
format
uriexamplehttps://hub.main-team.org/api/errors#not_foundrequest_idstringrequiredThis request’s id, also sent as the
X-Request-Idresponse header: the one you sent, when it was acceptable, or else one the API made. Quote it when you report a problem.example
0b5c6d0e-8f7a-4b1c-9d2e-3f4a5b6c7d8edetailsobjectPresent only where an operation says so, and then with the shape that operation documents — the rows it could not accept, say. Treat it as absent everywhere else, and ignore a
detailsyou do not recognise.