Skip to content

List Decola Progress

Endpoint used to list student learning progress (storyboard activity and course enrollments) for the institution in the JWT. Designed for RX pull by an external cron (e.g. iFood Decola). Pagination uses an opaque cursor (no global total / COUNT).

Note: This endpoint is served by Toolzz LXP API (Encore decola service), not by the institution monolith domain. Use the LXP API base URL (e.g. https://lxp.prod.api.toolzz.media).

Warning: Requires a JWT for ADMIN (privilegio_id = 2) or MANAGER (privilegio_id = 5). Report rows include only active students (privilegio_id = 4).

Terminal window
curl --request GET \
--url 'https://lxp.prod.api.toolzz.media/api/v1/decola/progress?limit=100' \
--header 'Authorization: Bearer <token>' \
--header 'Accept: application/json'

With optional date filter (D-1 incremental ingest):

Terminal window
curl --request GET \
--url 'https://lxp.prod.api.toolzz.media/api/v1/decola/progress?limit=100&date_field=completion_date&date_from=2026-07-14&date_to=2026-07-14' \
--header 'Authorization: Bearer <token>'
{
"data": [
{
"user_email": "ana.restaurante@toolzz.local",
"user_name": "Ana Costa Restaurante",
"cnpj": "22.222.222/0001-05",
"schools": ["Escola Sede Decola Teste"],
"storyboard_title": "Gestão de Estoque em Restaurantes",
"storyboard_id": "sb70131892014dec014",
"storyboard_likes": 0,
"storyboard_dislikes": 0,
"storyboard_completed": false,
"storyboard_views": 1,
"storyboard_updated": "2026-07-02T06:03:57.000Z",
"storyboard_start_date": "2026-07-02T06:03:57.000Z",
"storyboard_end_date": null,
"course_name": null,
"course_id": null,
"enrollment_date": null,
"completion_date": null,
"grade": null,
"completion_percentage": null
},
{
"user_email": "ana.restaurante@toolzz.local",
"user_name": "Ana Costa Restaurante",
"cnpj": "22.222.222/0001-05",
"schools": ["Escola Sede Decola Teste"],
"storyboard_title": null,
"storyboard_id": null,
"storyboard_likes": null,
"storyboard_dislikes": null,
"storyboard_completed": null,
"storyboard_views": null,
"storyboard_updated": null,
"storyboard_start_date": null,
"storyboard_end_date": null,
"course_name": "Segurança Alimentar Avançada",
"course_id": 70131801,
"enrollment_date": "2026-05-24T06:03:57.000Z",
"completion_date": null,
"grade": null,
"completion_percentage": 0
}
],
"pagination": {
"limit": 100,
"next_cursor": "eyJuIjoiLi4uIn0",
"has_more": true
}
}

ParameterTypeDescriptionRequired
AuthorizationStringJWT access token (Bearer <token>). Institution is taken from the JWT institution claim.Yes
ParameterTypeDescriptionRequired
limitnumberItems per page. Default 100. Maximum controlled by secret DecolaMaxPerPage (default 100).No
cursorstringOpaque cursor from the previous response (pagination.next_cursor). Omit on the first page.No
date_fromstringStart of date range (YYYY-MM-DD or ISO-8601). Must be sent together with date_to.No
date_tostringEnd of date range (YYYY-MM-DD or ISO-8601). Must be sent together with date_from.No
date_fieldstringRequired when dates are set. One of: storyboard_updated, storyboard_start_date, storyboard_end_date, enrollment_date, completion_date.Conditionally

KeyTypeDescription
dataarrayProgress rows for the current page.
data[].user_emailstring | nullStudent email.
data[].user_namestring | nullStudent name.
data[].cnpjstring | nullCompany CNPJ from personal data.
data[].schoolsstring[]School titles linked to the student.
data[].storyboard_*mixedFilled on storyboard rows; null on course rows.
data[].course_* / enrollment_date / completion_date / grade / completion_percentagemixedFilled on course rows; null on storyboard rows.
pagination.limitnumberRequested page size.
pagination.next_cursorstring | nullCursor for the next page; null when finished.
pagination.has_morebooleantrue if more pages are available.

Each item is either a storyboard row or a course row (MySQL UNION ALL). The other type’s fields are null.

completion_percentage on course rows is derived per student+course (completed contents ÷ course contents × 100). It is not stored as a column and is not an average of the page.


  1. Call without cursor.
  2. Process data.
  3. If pagination.has_more is true, call again with cursor=pagination.next_cursor.
  4. Repeat until has_more is false.

There is no total / total_pages — the API does not run a full-table COUNT.


HTTPCodeWhen
400invalid_argumentInvalid limit, cursor, or incomplete/invalid date filter
401unauthenticatedMissing or invalid JWT
403permission_deniedUser is not ADMIN or MANAGER in the institution
429resource_exhaustedRate limit (60 requests/minute per institution)
503unavailableMySQL unavailable
504deadline_exceededMySQL query exceeded DecolaMysqlQueryTimeoutMs

Example:

{
"code": "permission_denied",
"message": "Access denied. Only administrators or managers can access this endpoint.",
"details": null
}

  • Requires valid JWT with ADMIN or MANAGER privilege (auth: true).
  • Data is scoped to the institution from the token.
  • Report subjects are active students only (privilegio_id = 4).
  • Responses may be cached in Redis (~30 minutes) per institution + cursor + limit + date filter.