Owner Abhishek P

V1 API MCQ Actions

Source: OpenAPI 3.1.0 spec + src/api/v1/mcq_attrs/routes.py, src/api/v1/mcq_attrs/schemas.py Tag: MCQ Actions - Attempt, bookmark, reactions on MCQs.

All endpoints require Bearer Token authentication. All mutation endpoints return encrypted empty payload. User ID is extracted from JWT claims.


POST /mcqs_attrs/reactions

Summary: Like/Dislike MCQ

Bulk like/dislike interactions on MCQs.

Parameters

NameInRequiredDescription
course_idqueryrequiredCourse ID
x-dev-timeheaderoptionalEpoch ms (13 digits)

Request Body

{
  "reactions": [
    {
      "mcq_id": "60d5ec49f1b2c72e4c8b4567",
      "reaction_status": 1
    },
    {
      "mcq_id": "60d5ec49f1b2c72e4c8b4568",
      "reaction_status": 3
    }
  ]
}
FieldTypeRequiredDescription
reactionsarrayrequiredArray of reaction operations
reactions[].mcq_idObjectIdrequiredMCQ to react to
reactions[].reaction_statusintegerrequiredLIKE=1, DISLIKE=2, NONE=3 (removes reaction)

Success Response

{
  "status": "success",
  "is_data_encrypted": 0,
  "data": null,
  "error": null,
  "app_actions": null
}

GET /mcqs_attrs/sync

Summary: List MCQ Reactions

Retrieve a paginated list of the user’s MCQ attributes (reactions, bookmarks, attempts) with forward-only pagination based on updated_at timestamp.

Parameters

NameInRequiredConstraintsDescription
course_idqueryrequiredCourseEnumCourse ID
limitqueryoptional1-120, default 10Number of results to return
next_cursorqueryoptionalbase64 stringForward pagination cursor
prev_cursorqueryoptionalbase64 stringBackward pagination cursor
x-dev-timeheaderoptional13 digitsEpoch ms

Success Response

{
  "status": "success",
  "is_data_encrypted": 0,
  "data": [
    {
      "id": "60d5ec49f1b2c72e4c8baaaa",
      "mcq_id": "60d5ec49f1b2c72e4c8b4567",
      "last_attempt_option": "option_2",
      "guessed": false,
      "bookmark_status": 1,
      "bookmark_collection_ids": [
        "60d5ec49f1b2c72e4c8bcccc",
        "60d5ec49f1b2c72e4c8bdddd"
      ],
      "bookmarked_at": 1714400000000,
      "like_status": 1,
      "root_taxonomy_id": "60d5ec49f1b2c72e4c8b0001",
      "taxonomy_ids": [
        "60d5ec49f1b2c72e4c8b0001",
        "60d5ec49f1b2c72e4c8b0002",
        "60d5ec49f1b2c72e4c8b0003"
      ],
      "year": 2023
    }
  ],
  "error": null,
  "app_actions": null,
  "pagination": {
    "next_cursor": "eyJ1cGRhdGVkX2F0IjoxNzE0NDAwMDAwMDAwfQ==",
    "prev_cursor": null,
    "limit": 10,
    "has_more": true
  }
}
FieldTypeDescription
last_attempt_optionstring/nullMost recent attempt: "option_1" through "option_4", or null if never attempted
guessedbooleanWhether the latest attempt was marked as guessed
bookmark_statusintegerBOOKMARKED=1, NOT_BOOKMARKED=2
bookmark_collection_idsarrayCollection IDs this MCQ is bookmarked into. Empty if not bookmarked
bookmarked_atinteger/nullEpoch ms when bookmarked. Independent of updated_at. null if never bookmarked
like_statusintegerLIKE=1, DISLIKE=2, NONE=3
root_taxonomy_idObjectId/nullDenormalized L1 taxonomy from the MCQ
taxonomy_idsarray/null[L1, L2, L3] denormalized from the MCQ
yearinteger/nullMCQ year, denormalized from the MCQ

POST /mcqs_attrs/bookmark

Summary: Bookmark MCQ

Bulk bookmark MCQs into collections.

Parameters

NameInRequiredDescription
course_idqueryrequiredCourse ID
x-dev-timeheaderoptionalEpoch ms (13 digits)

Request Body

{
  "bookmarks": [
    {
      "mcq_id": "60d5ec49f1b2c72e4c8b4567",
      "bookmark_status": 1,
      "collection_ids": ["60d5ec49f1b2c72e4c8bcccc"]
    },
    {
      "mcq_id": "60d5ec49f1b2c72e4c8b4568",
      "bookmark_status": 2,
      "collection_ids": ["60d5ec49f1b2c72e4c8bcccc"]
    }
  ]
}
FieldTypeRequiredDescription
bookmarksarrayrequiredArray of bookmark operations
bookmarks[].mcq_idObjectIdrequiredMCQ to bookmark
bookmarks[].bookmark_statusintegerrequiredBOOKMARKED=1, NOT_BOOKMARKED=2
bookmarks[].collection_idsarrayconditionalCollection IDs to add/remove from

Conditions:

  • When bookmark_status=1 (BOOKMARKED): collection_ids can be omitted or empty (defaults to “All Bookmarks” collection)
  • When bookmark_status=2 (NOT_BOOKMARKED): collection_ids must be provided and non-empty; error 1006 (VALIDATION_FAILED) if missing

Success Response

{
  "status": "success",
  "is_data_encrypted": 0,
  "data": null,
  "error": null,
  "app_actions": null
}

POST /mcqs_attrs/attempt

Summary: Attempt MCQ

Submit MCQ attempt answers (bulk). Records the user’s selected option for each MCQ.

Parameters

NameInRequiredDescription
course_idqueryrequiredCourse ID
x-dev-timeheaderoptionalEpoch ms (13 digits)

Request Body

{
  "attempts": [
    {
      "mcq_id": "60d5ec49f1b2c72e4c8b4567",
      "selected_option": "option_2",
      "guessed": false
    },
    {
      "mcq_id": "60d5ec49f1b2c72e4c8b4568",
      "selected_option": -1,
      "guessed": null
    }
  ]
}
FieldTypeRequiredDescription
attemptsarrayrequiredArray of attempt operations
attempts[].mcq_idObjectIdrequiredMCQ being attempted
attempts[].selected_optionstring or integerrequired"option_1" through "option_4", or -1 for skipped
attempts[].guessedboolean/nulloptionaltrue = user marked as guess, null = do not update existing value

Success Response

{
  "status": "success",
  "is_data_encrypted": 0,
  "data": null,
  "error": null,
  "app_actions": null
}