{"components":{"responses":{},"schemas":{"User":{"description":"User information","example":{"application_user_id":"ext-user-123","first_name":"John","id":123,"last_name":"Doe","role":"teacher"},"properties":{"application_user_id":{"description":"External user ID from the application","type":"string"},"first_name":{"description":"User's first name","nullable":true,"type":"string"},"id":{"description":"The internal ID of the user","type":"integer"},"last_name":{"description":"User's last name","nullable":true,"type":"string"},"role":{"description":"User role","enum":["teacher","student"],"type":"string"}},"required":["id","application_user_id","role"],"title":"User","type":"object"},"UserCreateResponse":{"description":"Response for user creation","example":{"user_id":123},"properties":{"user_id":{"description":"The internal ID of the created user","type":"integer"}},"required":["user_id"],"title":"UserCreateResponse","type":"object"},"StandardSubject":{"description":"Information about a subject a standard belongs to","example":{"id":123,"name":"Math","school_level":"elementary","subject_area":"math"},"properties":{"id":{"description":"The ID of the subject","nullable":true,"type":"integer"},"name":{"description":"The name of the subject","type":"string"},"school_level":{"description":"The school level (e.g. \"elementary\")","type":"string"},"subject_area":{"description":"The subject area (e.g. \"math\", \"science\")","type":"string"}},"title":"StandardSubject","type":"object"},"AssignmentActivitySummary":{"description":"Summary of an assignment activity","properties":{"content_id":{"nullable":true,"type":"integer"},"fluency_facts":{"items":{"properties":{"a":{"type":"integer"},"b":{"type":"integer"},"op":{"type":"string"}},"type":"object"},"nullable":true,"type":"array"},"id":{"type":"integer"},"order":{"description":"Activity ordering key","format":"float","type":"number"},"play_duration_seconds":{"nullable":true,"type":"integer"},"standard_id":{"nullable":true,"type":"integer"},"type":{"type":"string"}},"title":"AssignmentActivitySummary","type":"object"},"StudentAggregatesResponse":{"description":"Aggregates for a student sourced by application_user_id","properties":{"application_user_id":{"type":"string"},"by_assignment":{"$ref":"#/components/schemas/PagedAny"},"by_standard":{"$ref":"#/components/schemas/PagedAny"},"student_id":{"type":"integer"}},"title":"StudentAggregatesResponse","type":"object"},"AssignmentJoinRequest":{"description":"Request for creating a join link for an assignment","example":{"application_user_id":"student-456","target":"awakening"},"properties":{"application_user_id":{"description":"The application user ID of the student joining the assignment","type":"string"},"target":{"description":"The execution target for the join link","enum":["awakening","web"],"type":"string"}},"required":["application_user_id","target"],"title":"AssignmentJoinRequest","type":"object"},"StandardAggregatesResponse":{"description":"Aggregates for a standard grouped by student","properties":{"standard_id":{"type":"integer"},"students":{"$ref":"#/components/schemas/PagedAny"}},"title":"StandardAggregatesResponse","type":"object"},"AssignmentCreateRequest":{"description":"Request for creating a new assignment","oneOf":[{"$ref":"#/components/schemas/AssignmentLegacyCreateRequest"},{"$ref":"#/components/schemas/AssignmentMultiCreateRequest"}],"title":"AssignmentCreateRequest"},"ContentItem":{"description":"Basic information about a content item (game, etc.)","example":{"content_type":"game","description":"Math travel of Eva is an action puzzle game. Eva a little girl helps her aged grandpa. She faces some risk through her travel. Run and defend the little girl from the enemies.","estimated_duration":13,"game":"Math Travel Of Eva","id":2252,"image":"https://releases-cdn.legendsoflearning.com/legends/image/upload/c_fill,h_400,w_400/game/image/mm9makn2oufejaig6fmg","stats":{"composite_rating_avg":3.506604101494612,"composite_rating_score":22.756997322101768,"content_integration_avg":3.2727272727272725,"ease_of_play_avg":1.4166666666666667,"id":2252,"student_rating_avg":3.5846367744177963,"student_rating_count":5754,"teacher_rating_avg":3.4285714285714284,"teacher_rating_count":35},"supports_ipad":false,"supports_tts":true,"type":"instructional","version":{"api_version":"v2","id":5904,"language_key":"game/language/1559584327-distanceLanguage.json","url":"https://game-cdn.legendsoflearning.com/content-deploy/1333/index.html"},"video_preview_url":"https://www.youtube.com/watch?v=BnpKJrZisYM"},"properties":{"content_type":{"description":"The container type of content","enum":["game","simulation","video","hands_on"],"type":"string"},"description":{"description":"A brief description of the content item","nullable":true,"type":"string"},"estimated_duration":{"description":"Estimated duration in minutes","type":"integer"},"game":{"description":"The title of the content item","type":"string"},"id":{"description":"The unique identifier for the content item","type":"integer"},"image":{"description":"URL to the content thumbnail image","type":"string"},"stats":{"description":"Content statistics and ratings","nullable":true,"properties":{"composite_rating_avg":{"description":"Composite rating average","format":"float","nullable":true,"type":"number"},"composite_rating_score":{"description":"Composite rating score","format":"float","nullable":true,"type":"number"},"content_integration_avg":{"description":"Content integration average","format":"float","nullable":true,"type":"number"},"ease_of_play_avg":{"description":"Ease of play average","format":"float","nullable":true,"type":"number"},"id":{"description":"Stats ID matching content ID","nullable":true,"type":"integer"},"student_rating_avg":{"description":"Student rating average","format":"float","nullable":true,"type":"number"},"student_rating_count":{"description":"Number of student ratings","nullable":true,"type":"integer"},"teacher_rating_avg":{"description":"Teacher rating average","format":"float","nullable":true,"type":"number"},"teacher_rating_count":{"description":"Number of teacher ratings","nullable":true,"type":"integer"}},"type":"object"},"supports_ipad":{"description":"Whether the content supports iPad","type":"boolean"},"supports_tts":{"description":"Whether the content supports text-to-speech","type":"boolean"},"type":{"description":"The derived type of content","enum":["instructional","question","simulation","video","hands_on"],"type":"string"},"version":{"description":"Content version information","properties":{"api_version":{"description":"API version the content uses","type":"string"},"id":{"description":"Version ID","type":"integer"},"language_key":{"description":"Language file key","nullable":true,"type":"string"},"url":{"description":"URL to load the content","nullable":true,"type":"string"}},"type":"object"},"video_preview_url":{"description":"URL to video preview","nullable":true,"type":"string"}},"required":["id","type","version","description","content_type"],"title":"ContentItem","type":"object"},"StandardDetail":{"description":"Detailed information about a standard","example":{"grade_levels":["k"],"id":4086,"image_key":"4.NF.A.2","image_url":"https://content.legendsoflearning.com/standards/4.NF.A.2.png","standard":"Addition and Subtraction Word Problems","standard_code":"K.OA.A.2","subject":{"id":123,"name":"Math","school_level":"elementary","subject_area":"math"}},"properties":{"description":{"description":"Additional description or details about the standard","nullable":true,"type":"string"},"grade_levels":{"description":"The grade levels associated with this standard","items":{"description":"The grade level (e.g. \"k\", \"1\", \"2\")","type":"string"},"type":"array"},"id":{"description":"The ID of the standard","type":"integer"},"image_key":{"description":"The key for the standard's image, used to retrieve the image from Legends of Learning's content site","type":"string"},"image_url":{"description":"The URL for the standard's image","type":"string"},"standard":{"description":"The name/description of the standard","type":"string"},"standard_code":{"description":"The code of the standard (e.g. \"K.OA.A.2\")","type":"string"},"subject":{"$ref":"#/components/schemas/StandardSubject"}},"title":"StandardDetail","type":"object"},"OAuth2TokenRequest":{"description":"Request for obtaining an OAuth2 access token","example":{"client_id":"YOUR_CLIENT_ID","client_secret":"YOUR_CLIENT_SECRET","grant_type":"client_credentials"},"properties":{"client_id":{"description":"The client ID provided during application registration","type":"string"},"client_secret":{"description":"The client secret provided during application registration","type":"string"},"grant_type":{"description":"Must be set to 'client_credentials' for this flow","enum":["client_credentials"],"type":"string"}},"required":["client_id","client_secret","grant_type"],"title":"OAuth2TokenRequest","type":"object"},"PaginationMeta":{"description":"Pagination metadata","example":{"page":1,"page_size":2,"total_count":150,"total_pages":75},"properties":{"page":{"description":"The current page number","type":"integer"},"page_size":{"description":"The number of results per page","type":"integer"},"total_count":{"description":"The total number of results","type":"integer"},"total_pages":{"description":"The total number of pages","type":"integer"}},"title":"PaginationMeta","type":"object"},"Standard":{"description":"Educational standard associated with content","example":{"code":"K.OA.A.2","description":"Solve addition and subtraction word problems...","id":1001,"standard_set":"CCSS"},"properties":{"code":{"description":"Standard code (e.g., 'K.OA.A.2')","type":"string"},"description":{"description":"Full text of the standard","type":"string"},"id":{"description":"Unique identifier for the standard","type":"integer"},"standard_set":{"description":"The standard set this belongs to (e.g., 'CCSS')","type":"string"}},"required":["id","code","description","standard_set"],"title":"Standard","type":"object"},"ContentListResponse":{"description":"Response containing a paginated list of content items","example":{"entries":[{"content_type":"game","description":"Math travel of Eva is an action puzzle game. Eva a little girl helps her aged grandpa. She faces some risk through her travel. Run and defend the little girl from the enemies.","estimated_duration":13,"game":"Math Travel Of Eva","id":2252,"image":"https://releases-cdn.legendsoflearning.com/legends/image/upload/c_fill,h_400,w_400/game/image/mm9makn2oufejaig6fmg","stats":{"composite_rating_avg":3.506604101494612,"composite_rating_score":22.756997322101768,"content_integration_avg":3.2727272727272725,"ease_of_play_avg":1.4166666666666667,"id":2252,"student_rating_avg":3.5846367744177963,"student_rating_count":5754,"teacher_rating_avg":3.4285714285714284,"teacher_rating_count":35},"supports_ipad":false,"supports_tts":true,"type":"instructional","version":{"api_version":"v2","id":5904,"language_key":"game/language/1559584327-distanceLanguage.json","url":"https://game-cdn.legendsoflearning.com/content-deploy/1333/index.html"},"video_preview_url":"https://www.youtube.com/watch?v=BnpKJrZisYM"}],"page_number":1,"page_size":20,"total_entries":5596,"total_pages":280},"properties":{"entries":{"description":"List of content items","items":{"$ref":"#/components/schemas/ContentItem"},"type":"array"},"page_number":{"description":"Current page number","type":"integer"},"page_size":{"description":"Number of items per page","type":"integer"},"total_entries":{"description":"Total number of content items matching the query","type":"integer"},"total_pages":{"description":"Total number of pages of results","type":"integer"}},"required":["total_pages","page_size","entries","page_number","total_entries"],"title":"ContentListResponse","type":"object"},"AssignmentDetailResponse":{"description":"Assignment detail with optional players page and view variants","properties":{"assignment":{"properties":{"activities":{"items":{"$ref":"#/components/schemas/AssignmentActivitySummary"},"nullable":true,"type":"array"},"end_date":{"nullable":true,"type":"string"},"id":{"type":"integer"},"name":{"nullable":true,"type":"string"},"start_date":{"nullable":true,"type":"string"},"status":{"type":"string"}},"type":"object"},"by_activity":{"items":{"type":"object"},"type":"array"},"by_activity_by_player":{"items":{"type":"object"},"type":"array"},"by_player":{"items":{"type":"object"},"type":"array"},"by_standard":{"items":{"type":"object"},"type":"array"},"by_standard_by_student":{"items":{"type":"object"},"type":"array"},"players":{"$ref":"#/components/schemas/PagedAny"}},"title":"AssignmentDetailResponse","type":"object"},"SearchHighlight":{"description":"Highlighted search results","properties":{"field":{"description":"The field that matched the query","type":"string"},"indices":{"description":"When the field is an array of strings, this is the index of the string that matched the query","items":{"type":"integer"},"nullable":true,"type":"array"},"snippets":{"description":"HTML snippets for highlighting what matched out of the field text; snippets are not always provided","items":{"$ref":"#/components/schemas/SearchSnippet"},"type":"array"}},"title":"SearchHighlight","type":"object"},"SearchRequest":{"description":"Parameters for the global search endpoint. Defaults to a broad game search when filters are omitted.","example":{"content_type":"game","game_types":["instructional","simulation"],"grade_levels":["4","5"],"page":1,"page_size":10,"q":"fractions","standard_set":"CCSS","subject_areas":["math"]},"properties":{"content_type":{"default":"game","description":"Primary result type to return.","enum":["game","video","hands_on","standard"],"type":"string"},"game_types":{"description":"Filter game results by type.","items":{"enum":["instructional","quiz","simulation"],"type":"string"},"type":"array"},"grade_levels":{"description":"Filter by grade level tags (K-12).","items":{"enum":["K","1","2","3","4","5","6","7","8","9","10","11","12"],"type":"string"},"type":"array"},"max_lexile_level":{"description":"Upper bound for Lexile level on content results.","nullable":true,"type":"integer"},"page":{"description":"Page number (1-indexed). Defaults to 1 when omitted.","type":"integer"},"page_size":{"description":"Number of results per page. Defaults to 10 when omitted.","type":"integer"},"q":{"description":"Full-text query term. Empty string returns popular content.","type":"string"},"standard_set":{"description":"Limit results to a specific standard set identifier (e.g. 'CCSS').","nullable":true,"type":"string"},"subject_areas":{"description":"Filter by subject area tags.","items":{"enum":["math","science","social studies"],"type":"string"},"type":"array"}},"title":"SearchRequest","type":"object"},"UserCreateRequest":{"description":"Request for creating a new user","example":{"application_user_id":"ext-user-123","email":"john.doe@school.edu","first_name":"John","google_sub":"123456789012345678901","last_name":"Doe","role":"teacher"},"properties":{"application_user_id":{"description":"External user ID from the application","type":"string"},"email":{"description":"User's email address. If provided and a user with this email already exists, the existing user will be linked to this application instead of creating a new user. Email matching is case-insensitive.","nullable":true,"type":"string"},"first_name":{"description":"User's first name","nullable":true,"type":"string"},"google_sub":{"description":"Google subject identifier (google_unique_id) to link the user to a Google account","nullable":true,"type":"string"},"last_name":{"description":"User's last name","nullable":true,"type":"string"},"role":{"description":"User role","enum":["teacher","student"],"type":"string"}},"required":["application_user_id","role"],"title":"UserCreateRequest","type":"object"},"OAuth2ErrorResponse":{"description":"Error response for API requests","example":{"error":"invalid_client","error_description":"Client authentication failed due to unknown client, no client authentication included, or unsupported authentication method."},"properties":{"error":{"description":"Error message","type":"string"},"error_description":{"description":"Error description","type":"string"},"errors":{"description":"Multiple errors may be returned in an array","type":"array"}},"required":["error"],"title":"OAuth2ErrorResponse","type":"object"},"AssignmentJoinResponse":{"description":"Response containing the join URL for an assignment","example":{"join_url":"https://example.com/join-link/abc123xyz"},"properties":{"join_url":{"description":"The URL that can be used to join the assignment","type":"string"}},"required":["join_url"],"title":"AssignmentJoinResponse","type":"object"},"StandardSet":{"description":"Information about a standard set","example":{"id":"AL Math","name":"Alabama Math","subject_area":"math"},"properties":{"id":{"description":"The ID of the standard set","type":"string"},"name":{"description":"The display name of the standard set","type":"string"},"subject_area":{"description":"The subject area of the standard set","type":"string"}},"required":["id","name","subject_area"],"title":"StandardSet","type":"object"},"OAuth2RevokeRequest":{"description":"Request for revoking an OAuth2 access token","example":{"token":"YOUR_ACCESS_TOKEN"},"properties":{"token":{"description":"The token to revoke","type":"string"}},"required":["token"],"title":"OAuth2RevokeRequest","type":"object"},"AssignmentCreateResponse":{"description":"Response containing the created assignment ID","example":{"assignment_id":5678},"properties":{"assignment_id":{"description":"The ID of the created assignment","type":"integer"}},"required":["assignment_id"],"title":"AssignmentCreateResponse","type":"object"},"OAuth2TokenResponse":{"description":"Response containing an OAuth2 access token","example":{"access_token":"YOUR_ACCESS_TOKEN","expires_in":7200,"token_type":"bearer"},"properties":{"access_token":{"description":"The access token","type":"string"},"expires_in":{"description":"Expiration time in seconds","type":"integer"},"token_type":{"description":"The token type","enum":["bearer"],"type":"string"}},"required":["access_token","token_type","expires_in"],"title":"OAuth2TokenResponse","type":"object"},"AssignmentMultiCreateRequest":{"description":"Multi-activity create request","properties":{"activities":{"description":"Array of activity objects. Each entry may specify a type explicitly or rely on inference.","items":{"additionalProperties":true,"properties":{"awakening_type":{"description":"Optional subtype when type=awakening_activity. Accepts mastery, focus, timed, fluency, or their awakening_* equivalents.","nullable":true,"type":"string"},"content_id":{"nullable":true,"type":"integer"},"fluency_facts":{"description":"Optional explicit fluency facts for awakening_fluency. Each fact includes integer a, integer b, and op add/sub/mul/div.","items":{"properties":{"a":{"type":"integer"},"b":{"type":"integer"},"op":{"enum":["add","sub","mul","div"],"type":"string"}},"required":["a","b","op"],"type":"object"},"nullable":true,"type":"array"},"order":{"format":"float","nullable":true,"type":"number"},"play_duration_seconds":{"description":"Required for awakening_timed activities.","nullable":true,"type":"integer"},"standard_id":{"nullable":true,"type":"integer"},"type":{"description":"Optional explicit activity type. Supports explicit Awakening partner activity types, and 'focus' / 'focus_area' remain accepted aliases for mastery-style Awakening activities.","enum":["mini_game","video","awakening_activity","focus","focus_area","awakening_focus","awakening_mastery","awakening_timed","awakening_fluency"],"type":"string"}},"type":"object"},"nullable":true,"type":"array"},"application_user_id":{"description":"Teacher application user ID","type":"string"},"dry_run":{"description":"If true, validates and returns activities without creation","nullable":true,"type":"boolean"},"idempotency_key":{"description":"Optional idempotency key (Idempotency-Key header is also supported)","nullable":true,"type":"string"},"name":{"description":"Optional assignment name","nullable":true,"type":"string"}},"required":["application_user_id"],"title":"AssignmentMultiCreateRequest","type":"object"},"UserUpdateRequest":{"description":"Request for updating an existing user","example":{"email":"jane.smith@school.edu","first_name":"Jane","google_sub":"123456789012345678901","last_name":"Smith"},"properties":{"email":{"description":"User's email address","nullable":true,"type":"string"},"first_name":{"description":"User's first name","nullable":true,"type":"string"},"google_sub":{"description":"Google subject identifier (google_unique_id) to link the user to a Google account","nullable":true,"type":"string"},"last_name":{"description":"User's last name","nullable":true,"type":"string"}},"title":"UserUpdateRequest","type":"object"},"ContentDetailResponse":{"description":"Detailed information about a specific content item","example":{"banner":null,"concepts":[{"concept":"Use knowledge of relative size of units to reason.","concept_ident":"RETIRED_mc_4.MD.A.2_8"}],"content_type":"game","description":"Math travel of Eva is an action puzzle game. Eva a little girl helps her aged grandpa. She faces some risk through her travel. Run and defend the little girl from the enemies. You will have interesting questions and will have fun throughout the game.","developer_instructions":"Eva travels to different stores to help Grandpa.","discussion_questions_after":"How do you convert a numbers measured in meters or kilometers?","discussion_questions_before":"How do you convert a numbers in a unit to a number in a different unit?","estimated_duration":13,"game":"Math Travel Of Eva","game_developer_id":455,"grade_levels":["3","4","5"],"id":2252,"image":"https://releases-cdn.legendsoflearning.com/legends/image/upload/c_fill,h_400,w_400/game/image/mm9makn2oufejaig6fmg","instructions":null,"is_available":true,"is_question_game":false,"lexile_level":505,"saves_progress":false,"short_name":"Math Travel Of Eva","sponsorship_image_url":null,"sponsorship_link_url":null,"standards":[{"id":"1778","image_key":"math/4.MD.A.2.jpg","ngss_dci_name":"4.MD.A.2","standard":"Measurement Quantities Word Problems"}],"stats":{"composite_rating_avg":3.506604101494612,"composite_rating_score":22.756997322101768,"content_integration_avg":3.2727272727272725,"ease_of_play_avg":1.4166666666666667,"id":2252,"student_rating_avg":3.5846367744177963,"student_rating_count":5754,"teacher_rating_avg":3.4285714285714284,"teacher_rating_count":35},"supports_ipad":false,"supports_spanish":true,"supports_tts":true,"type":"instructional","version":{"api_version":"v2","id":9482,"language_key":"game/language/1569632129-distanceLanguage.json","url":"https://game-cdn.legendsoflearning.com/content-deploy/3198/index.html"},"video":"games/videos/sgv21tuwjgqzhqlsidas","video_preview_url":"https://www.youtube.com/watch?v=BnpKJrZisYM","vocabulary":"liter, milliliter, grams, kilograms, metric, distance, time"},"properties":{"banner":{"description":"Banner text","enum":["new","updated","featured"],"nullable":true,"type":"string"},"concepts":{"description":"Learning concepts covered by this content","items":{"properties":{"concept":{"description":"Concept description","type":"string"},"concept_ident":{"description":"Concept identifier","type":"string"}},"type":"object"},"type":"array"},"content_type":{"description":"The container type of content","enum":["game","simulation","video","hands_on"],"type":"string"},"description":{"description":"A detailed description of the content item","type":"string"},"developer_instructions":{"description":"Instructions from the developer on how to use the content","nullable":true,"type":"string"},"discussion_questions_after":{"description":"Discussion questions to use after using the content","nullable":true,"type":"string"},"discussion_questions_before":{"description":"Discussion questions to use before using the content","nullable":true,"type":"string"},"estimated_duration":{"description":"Estimated duration in minutes","type":"integer"},"game":{"description":"The title of the content item","type":"string"},"game_developer_id":{"description":"ID of the developer who created the content","nullable":true,"type":"integer"},"grade_levels":{"description":"Grade levels this content is suitable for","items":{"type":"string"},"type":"array"},"id":{"description":"The unique identifier for the content item","type":"integer"},"image":{"description":"URL to the content thumbnail image","type":"string"},"instructions":{"description":"Instructions for using the content","nullable":true,"type":"string"},"is_available":{"description":"Whether the content is currently available for use","type":"boolean"},"is_question_game":{"description":"Whether the content is a question-based game","type":"boolean"},"lexile_level":{"description":"Lexile reading level measure","nullable":true,"type":"integer"},"saves_progress":{"description":"Whether the content saves progress between sessions","type":"boolean"},"short_name":{"description":"Short name/title for the content","nullable":true,"type":"string"},"sponsorship_image_url":{"description":"URL to sponsorship image","nullable":true,"type":"string"},"sponsorship_link_url":{"description":"URL to sponsorship link","nullable":true,"type":"string"},"standards":{"description":"Educational standards covered by this content","items":{"properties":{"id":{"description":"Standard ID","type":"string"},"image_key":{"description":"Key for the standard's image","type":"string"},"ngss_dci_name":{"description":"Standard code","type":"string"},"standard":{"description":"Standard name/description","type":"string"}},"type":"object"},"type":"array"},"stats":{"description":"Content statistics and ratings","properties":{"composite_rating_avg":{"description":"Composite rating average","format":"float","type":"number"},"composite_rating_score":{"description":"Composite rating score","format":"float","type":"number"},"content_integration_avg":{"description":"Content integration average","format":"float","type":"number"},"ease_of_play_avg":{"description":"Ease of play average","format":"float","type":"number"},"id":{"description":"Stats ID matching content ID","type":"integer"},"student_rating_avg":{"description":"Student rating average","format":"float","type":"number"},"student_rating_count":{"description":"Number of student ratings","type":"integer"},"teacher_rating_avg":{"description":"Teacher rating average","format":"float","type":"number"},"teacher_rating_count":{"description":"Number of teacher ratings","type":"integer"}},"type":"object"},"supports_ipad":{"description":"Whether the content supports iPad","type":"boolean"},"supports_spanish":{"description":"Whether the content supports Spanish language","nullable":true,"type":"boolean"},"supports_tts":{"description":"Whether the content supports text-to-speech","type":"boolean"},"type":{"description":"The derived type of content","enum":["instructional","question","simulation","video","hands_on"],"type":"string"},"version":{"description":"Content version information","properties":{"api_version":{"description":"API version the content uses","type":"string"},"id":{"description":"Version ID","type":"integer"},"language_key":{"description":"Language file key","nullable":true,"type":"string"},"url":{"description":"URL to load the content","type":"string"}},"type":"object"},"video":{"description":"Video resource identifier","nullable":true,"type":"string"},"video_preview_url":{"description":"URL to video preview","nullable":true,"type":"string"},"vocabulary":{"description":"Key vocabulary words used in the content","nullable":true,"type":"string"}},"required":["id","content_type","game","description","image"],"title":"ContentDetailResponse","type":"object"},"ContentReviewsResponse":{"description":"Response containing content reviews and rating statistics","example":{"entries":[{"created_at":"2024-01-01T00:00:00","id":123,"review":"Great content!","score":5,"teacher":{"id":456,"name":"John Doe"},"tester_display_name":null,"upvotes_count":10},{"created_at":"2024-01-02T00:00:00","id":124,"review":"Good learning experience","score":4,"teacher":null,"tester_display_name":"Test User","upvotes_count":5}],"page_number":1,"page_size":20,"stats":{"composite_rating_avg":4.3,"composite_rating_score":4.3,"content_integration_avg":4.2,"ease_of_play_avg":4.0,"student_rating_avg":4.2,"student_rating_count":20,"student_rating_score_summary":{"3":2,"4":8,"5":10},"suggested_use_summary":null,"teacher_rating_avg":4.5,"teacher_rating_count":10,"teacher_rating_score_summary":{"4":5,"5":5}},"total_entries":2,"total_pages":1},"properties":{"entries":{"description":"List of content reviews","items":{"properties":{"created_at":{"description":"Review creation timestamp","format":"datetime","type":"string"},"id":{"description":"Review ID","type":"integer"},"review":{"description":"Review text","type":"string"},"score":{"description":"Rating score (1-5)","type":"integer"},"teacher":{"description":"Teacher information if review is from a teacher","nullable":true,"properties":{"id":{"description":"Teacher ID","type":"integer"},"name":{"description":"Teacher's name","type":"string"}},"type":"object"},"tester_display_name":{"description":"Display name if review is from a tester","nullable":true,"type":"string"},"upvotes_count":{"description":"Number of upvotes on the review","type":"integer"}},"type":"object"},"type":"array"},"page_number":{"description":"Current page number","type":"integer"},"page_size":{"description":"Number of items per page","type":"integer"},"stats":{"description":"Aggregated rating statistics","nullable":true,"properties":{"composite_rating_avg":{"description":"Average composite rating","format":"float","nullable":true,"type":"number"},"composite_rating_score":{"description":"Composite rating score","format":"float","nullable":true,"type":"number"},"content_integration_avg":{"description":"Average content integration rating","format":"float","nullable":true,"type":"number"},"ease_of_play_avg":{"description":"Average ease of play rating","format":"float","nullable":true,"type":"number"},"student_rating_avg":{"description":"Average student rating","format":"float","nullable":true,"type":"number"},"student_rating_count":{"description":"Number of student ratings","nullable":true,"type":"integer"},"student_rating_score_summary":{"description":"Summary of student ratings by score","nullable":true,"type":"object"},"suggested_use_summary":{"description":"Summary of suggested use ratings","nullable":true,"type":"object"},"teacher_rating_avg":{"description":"Average teacher rating","format":"float","nullable":true,"type":"number"},"teacher_rating_count":{"description":"Number of teacher ratings","nullable":true,"type":"integer"},"teacher_rating_score_summary":{"description":"Summary of teacher ratings by score","nullable":true,"type":"object"}},"type":"object"},"total_entries":{"description":"Total number of reviews","type":"integer"},"total_pages":{"description":"Total number of pages","type":"integer"}},"required":["entries","page_number","page_size","total_pages","total_entries"],"title":"ContentReviewsResponse","type":"object"},"AssignmentLegacyCreateRequest":{"description":"Legacy single-activity create request","properties":{"application_user_id":{"description":"Teacher application user ID","type":"string"},"content_id":{"description":"Required when type=content","type":"integer"},"standard_id":{"description":"Required when type=standard","type":"integer"},"type":{"description":"Legacy payload type (standard or content)","enum":["standard","content"],"type":"string"}},"required":["type","application_user_id"],"title":"AssignmentLegacyCreateRequest","type":"object"},"StandardsResponse":{"description":"Response containing a list of standards for a standard set","example":{"entries":[{"grade_levels":["k"],"id":4086,"image_key":"4.NF.A.2","image_url":"https://content.legendsoflearning.com/standards/4.NF.A.2.png","standard":"Addition and Subtraction Word Problems","standard_code":"K.OA.A.2","subject":{"id":123,"name":"Math","school_level":"elementary","subject_area":"math"}}],"meta":{"page":1,"page_size":2,"total_count":150,"total_pages":75}},"properties":{"entries":{"description":"The list of standards","items":{"$ref":"#/components/schemas/StandardDetail"},"type":"array"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"title":"StandardsResponse","type":"object"},"ErrorResponse":{"description":"Standard error response format matching API error bodies","example":{"error":{"code":"invalid_parameters","docs_url":"/api/v3/docs/openapi#tag/Assignments","message":"Validation failed for the request body","request_id":"abc123"},"errors":{"standard_id":"is invalid"}},"properties":{"error":{"properties":{"code":{"description":"Stable machine-readable error code","type":"string"},"docs_url":{"description":"Optional docs URL","nullable":true,"type":"string"},"hint":{"description":"Optional hint to fix the request","nullable":true,"type":"string"},"message":{"description":"Human-readable error message","type":"string"},"request_id":{"description":"Request identifier for tracing","nullable":true,"type":"string"}},"type":"object"},"errors":{"description":"Field-level validation errors","nullable":true,"type":"object"}},"required":["error"],"title":"ErrorResponse","type":"object"},"PagedAny":{"description":"Generic paginated response with any entries","properties":{"entries":{"items":{"type":"object"},"type":"array"},"page_number":{"type":"integer"},"page_size":{"type":"integer"},"total_entries":{"type":"integer"},"total_pages":{"type":"integer"}},"title":"PagedAny","type":"object"},"StandardSetResponse":{"description":"Response containing a list of standard sets","example":{"page":1,"per_page":2,"results":[{"id":"AL Math","name":"Alabama Math","subject_area":"math"},{"id":"AL Science","name":"Alabama Science","subject_area":"science"}],"total_count":53},"properties":{"page":{"description":"The page number","type":"integer"},"per_page":{"description":"The number of results per page","type":"integer"},"results":{"description":"The list of standard sets","items":{"$ref":"#/components/schemas/StandardSet"},"type":"array"},"total_count":{"description":"The total number of results","type":"integer"}},"required":["total_count","page","per_page","results"],"title":"StandardSetResponse","type":"object"},"SearchResponse":{"description":"Paginated search response containing content and standard hits.","example":{"hits":[{"content_type":"standard","highlights":[],"id":"f6c95fcd-0601-4f8c-86f5-871d8fe8f10c","standard":{"description":"Solve addition and subtraction word problems within 10.","grade_levels":["K"],"id":4086,"image":"math/4.NF.A.2.jpg","name":"Addition and Subtraction Word Problems","standard_code":"K.OA.A.2","standard_set":"CCSS","subject_area":["math"]}},{"content":{"content_type":"game","description":"Action puzzle game focused on distance measurement.","game_type":"instructional","grade_levels":["3","4"],"id":2252,"lexile_level":null,"name":"Math Travel Of Eva","subject_areas":["math"],"thumbnail_url":"https://releases-cdn.legendsoflearning.com/legends/image/upload/..."},"content_type":"content","highlights":[],"id":"0f0b1d8a-8b37-4f0b-9d19-43a0fe6f09fd"}],"page":1,"per_page":2,"total_count":42},"properties":{"hits":{"description":"Search hits for the requested page","items":{"$ref":"#/components/schemas/SearchHit"},"type":"array"},"page":{"description":"Current page number","type":"integer"},"per_page":{"description":"Number of hits per page","type":"integer"},"total_count":{"description":"Total hits across all pages","type":"integer"}},"title":"SearchResponse","type":"object"},"SearchHit":{"description":"A single search result","properties":{"content":{"description":"Populated when content_type is content (games/videos/hands-on).","nullable":true,"properties":{"content_type":{"type":"string"},"description":{"nullable":true,"type":"string"},"game_type":{"nullable":true,"type":"string"},"grade_levels":{"items":{"type":"string"},"type":"array"},"id":{"type":"integer"},"lexile_level":{"nullable":true,"type":"integer"},"name":{"type":"string"},"subject_areas":{"items":{"type":"string"},"type":"array"},"thumbnail_url":{"nullable":true,"type":"string"}},"type":"object"},"content_type":{"description":"Result classification (game/content/standard).","enum":["standard","content"],"type":"string"},"highlights":{"description":"Highlight metadata from the search index.","items":{"$ref":"#/components/schemas/SearchHighlight"},"type":"array"},"id":{"description":"Opaque identifier for the hit from ElasticSearch.","type":"string"},"standard":{"description":"Populated when content_type is standard.","nullable":true,"properties":{"description":{"nullable":true,"type":"string"},"grade_levels":{"items":{"type":"string"},"type":"array"},"id":{"type":"integer"},"image":{"nullable":true,"type":"string"},"name":{"type":"string"},"standard_code":{"nullable":true,"type":"string"},"standard_set":{"nullable":true,"type":"string"},"subject_area":{"items":{"type":"string"},"type":"array"}},"type":"object"}},"title":"SearchHit","type":"object"},"SearchSnippet":{"description":"HTML snippet with highlighted search matches","properties":{"matched_tokens":{"description":"The tokens that matched the query","items":{"type":"string"},"type":"array"},"snippet":{"description":"HTML text with highlights applied to the tokens that matched the query","type":"string"}},"title":"SearchSnippet","type":"object"},"ApplicationMeResponse":{"description":"Current application metadata with resolved partner display fields","example":{"id":42,"name":"xtramath","partner":{"background_color":"#4A90D9","code":"xtramath","display_name":"XtraMath","logo_url":"https://example.com/logo.png","return_url":"https://xtramath.org"},"scopes":"users:read users:write"},"properties":{"id":{"description":"Application ID","type":"integer"},"name":{"description":"Application name","type":"string"},"partner":{"description":"Partner display fields with application-level overrides","nullable":true,"properties":{"background_color":{"description":"Background color (app override or partner default)","nullable":true,"type":"string"},"code":{"description":"Partner code","type":"string"},"display_name":{"description":"Display name (app override or partner default)","nullable":true,"type":"string"},"logo_url":{"description":"Logo URL (app override or partner default)","nullable":true,"type":"string"},"return_url":{"description":"Return URL (app override or partner default)","nullable":true,"type":"string"}},"type":"object"},"scopes":{"description":"Granted OAuth2 scopes","type":"string"}},"required":["id","name","scopes"],"title":"ApplicationMeResponse","type":"object"}},"securitySchemes":{"oauth2":{"description":"OAuth2 Client Credentials Flow. Credentials can be sent in the request body as application/x-www-form-urlencoded or in application/json format.","flows":{"clientCredentials":{"scopes":{},"tokenUrl":"/api/v3/oauth2/token"}},"type":"oauth2"}}},"info":{"description":"<h1>API documentation for Legends of Learning V3 API</h1>\n\n<h2>Getting Started</h2>\n\n<h3>Application Registration</h3>\n\n<p>In order to use the API, an application must be registered.</p>\n\n<ol>\n  <li>Contact the Legends of Learning team to register your application with the following information:\n    <ul>\n      <li>Application name</li>\n      <li>Redirect URL (if applicable)</li>\n    </ul>\n  </li>\n  <li>Obtain credentials from Legends of Learning:\n    <ul>\n      <li>Client ID</li>\n      <li>Client Secret (⚠️ Keep secure, never expose in client-side code)</li>\n    </ul>\n  </li>\n</ol>\n\n<h3>Authorization Flow</h3>\n\n<p>The integration uses OAuth 2.0 with Client Credentials flow, ensuring secure\ncommunication between platforms. Each application receives its own set of\ncredentials and can only access its own users and data.</p>\n\n<ol>\n  <li>Get access token:\n    <pre><code>POST /api/v3/oauth2/token\nContent-Type: application/x-www-form-urlencoded\nAccept: application/json\n<br/>\ngrant_type=client_credentials&\nclient_id=YOUR_CLIENT_ID&\nclient_secret=YOUR_CLIENT_SECRET</code></pre>\n<br/>\n    Response:\n    <pre><code>{\n  \"access_token\": \"YOUR_ACCESS_TOKEN\",\n  \"token_type\": \"bearer\",\n  \"expires_in\": 3600\n}</code></pre>\n  </li>\n  <li>Use token in API requests:\n    <pre><code>GET /api/v3/content\nAuthorization: Bearer YOUR_ACCESS_TOKEN</code></pre>\n  </li>\n</ol>\n\n<h4>Authorization Flow Diagram</h4>\n\nMERMAID_AUTHORIZATION_FLOW\n\n<h2>Sample Scenario</h2>\n\n<h3>Overview</h3>\n\n<p>The Assignment API provides endpoints for creating assignments and generating join URLs for students:</p>\n<ol>\n  <li>Find a standard for an assignment</li>\n  <li>Create an assignment</li>\n  <li>Generate join URLs for student access</li>\n</ol>\n\nUsers must be registered in Legends of Learning in order to facilitate reporting.\n\n<h3>Complete Flow</h3>\n\n<p>This sequence diagram illustrates the complete workflow between Teacher, Student, XtraMath Server, and Legends of Learning Server:</p>\n\n<h4>Step 1: Search for Standards</h4>\n<ul>\n  <li>Teacher searches for standards in XtraMath</li>\n  <li>XtraMath server calls Legends of Learning API to search for standards</li>\n  <li>Teacher selects from returned standards</li>\n</ul>\n\n<h4>Step 2: Create Assignment</h4>\n<ul>\n  <li>Teacher creates an Awakening assignment</li>\n  <li>XtraMath creates user if needed (for first-time teachers)</li>\n  <li>XtraMath creates the assignment via the API</li>\n  <li>Teacher publishes the assignment to students</li>\n</ul>\n\n<h4>Step 3: Student Joins Assignment</h4>\n<ul>\n  <li>Student views the Awakening assignment</li>\n  <li>When student chooses to play, XtraMath creates user if needed</li>\n  <li>XtraMath requests a join URL from the API</li>\n  <li>Student is redirected to or shown embedded content with the join URL</li>\n</ul>\n\n<h4>Step 4: Alternative - User Login Link Flow</h4>\n<ul>\n  <li>Partner application requests a login link for a user (without creating an assignment)</li>\n  <li>User is created automatically if they don't exist</li>\n  <li>Legends of Learning returns a login link URL</li>\n  <li>When user visits the login link, they are automatically signed in and redirected based on their role:\n    <ul>\n      <li>Students are redirected to Awakening</li>\n      <li>Teachers are redirected to the Teacher App</li>\n    </ul>\n  </li>\n</ul>\n\n<h4>Sample Interaction Flow</h4>\n\nMERMAID_SAMPLE_FLOW\n","title":"LoL API v3","version":"3.0"},"openapi":"3.0.0","paths":{"/v3/applications/me":{"get":{"callbacks":{},"deprecated":false,"description":"Returns the current application's metadata including partner display field overrides. The application is identified from the OAuth2 Bearer token.","operationId":"Applications.Controller.show","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationMeResponse"}}},"description":"Application metadata with resolved partner display fields"}},"security":[{"oauth2":[]}],"summary":"Get current application","tags":["Applications"]}},"/v3/assignments":{"get":{"callbacks":{},"deprecated":false,"description":"Returns assignments accessible to the calling application. Filter by teacher external id via application_user_id. Include activities via include=activities.","operationId":"AssignmentsController.index","parameters":[{"in":"query","name":"page","required":false,"schema":{"type":"integer"}},{"in":"query","name":"page_size","required":false,"schema":{"type":"integer"}},{"description":"Comma-separated list of related resources to include (currently supports 'activities')","in":"query","name":"include","required":false,"schema":{"type":"string"}},{"in":"query","name":"application_user_id","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagedAny"}}},"description":"Assignments page"}},"security":[{"oauth2":[]}],"summary":"List assignments","tags":["Assignments"]},"post":{"callbacks":{},"deprecated":false,"description":"Creates a new assignment for a teacher user. Supports legacy single-activity and multi-activity payloads.","operationId":"AssignmentsController.create","parameters":[{"description":"Idempotency key to deduplicate assignment creation","in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"examples":{"content":{"description":"Create a content-based (mini-game) assignment","summary":"Content Assignment","value":{"application_user_id":"teacher-123","content_id":5678,"standard_id":4321,"type":"content"}},"multi_activity":{"description":"Create multiple activities with explicit Awakening partner activity types","summary":"Multi-activity Assignment","value":{"activities":[{"content_id":5678,"standard_id":4321},{"fluency_facts":[{"a":3,"b":4,"op":"add"},{"a":6,"b":7,"op":"add"}],"standard_id":4321,"type":"awakening_fluency"}],"application_user_id":"teacher-123","name":"STEM rotation"}},"shorthand":{"description":"Specify content_ids and optional standard","summary":"Shorthand multi-activity","value":{"application_user_id":"teacher-123","content_ids":[5678,9012],"standard_id":4321}},"standard":{"description":"Create a standard-based (Awakening) assignment","summary":"Standard Assignment","value":{"application_user_id":"teacher-123","standard_id":1234,"type":"standard"}},"timed_activity":{"description":"Create an Awakening timed activity with required duration","summary":"Timed Awakening Activity","value":{"activities":[{"play_duration_seconds":600,"standard_id":4321,"type":"awakening_timed"}],"application_user_id":"teacher-123","name":"Timed practice"}}},"schema":{"$ref":"#/components/schemas/AssignmentCreateRequest"}}},"description":"Assignment creation parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivitiesPreviewResponse"}}},"description":"Activities preview"},"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignmentCreateResponse"}}},"description":"Assignment created successfully"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Invalid parameters"}},"security":[{"oauth2":[]}],"summary":"Create an assignment","tags":["Assignments"]}},"/v3/assignments/{id}":{"get":{"callbacks":{},"deprecated":false,"description":"Returns assignment details. Supports include and multiple view variants (activity, activity_by_player, player, standard, standard_by_student).","operationId":"AssignmentsController.show","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"}},{"in":"query","name":"page","required":false,"schema":{"type":"integer"}},{"in":"query","name":"page_size","required":false,"schema":{"type":"integer"}},{"description":"Comma-separated list of related resources to include (currently supports 'activities')","in":"query","name":"include","required":false,"schema":{"type":"string"}},{"description":"Choose a view variant (default: player)","in":"query","name":"view","required":false,"schema":{"enum":["activity","activity_by_player","player","standard","standard_by_student"],"type":"string"}},{"description":"Comma-separated standard IDs (e.g. '123,456')","in":"query","name":"standard_ids","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignmentDetailResponse"}}},"description":"Assignment detail"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not found"}},"security":[{"oauth2":[]}],"summary":"Get assignment details","tags":["Assignments"]}},"/v3/assignments/{id}/joins":{"post":{"callbacks":{},"deprecated":false,"description":"Creates a join URL for a student to access an assignment","operationId":"AssignmentsController.join","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignmentJoinRequest"}}},"description":"Join link creation parameters","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignmentJoinResponse"}}},"description":"Join link created successfully"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Assignment not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Invalid parameters"}},"security":[{"oauth2":[]}],"summary":"Create an assignment join link","tags":["Assignments"]}},"/v3/content":{"get":{"callbacks":{},"deprecated":false,"description":"This endpoint retrieves a paginated list of content items (games, etc.)","operationId":"ContentController.index","parameters":[{"description":"The page number to return (default is 1)","in":"query","name":"page","required":false,"schema":{"type":"integer"}},{"description":"Number of results per page (default is 20)","in":"query","name":"per_page","required":false,"schema":{"type":"integer"}},{"description":"Comma-separated standard IDs to include","in":"query","name":"standard_ids","required":false,"schema":{"type":"string"}},{"description":"Filter by derived game_type (instructional, question, simulation, video, hands_on)","in":"query","name":"game_type","required":false,"schema":{"type":"string"}},{"description":"Filter by source content_type (game, simulation, video, hands_on)","in":"query","name":"content_type","required":false,"schema":{"type":"string"}},{"description":"Filter for content supporting text-to-speech","in":"query","name":"supports_tts","required":false,"schema":{"type":"boolean"}},{"description":"Filter for content supporting iPad","in":"query","name":"supports_ipad","required":false,"schema":{"type":"boolean"}},{"description":"Filter for multilingual content","in":"query","name":"multi_language","required":false,"schema":{"type":"boolean"}},{"description":"Filter for content that saves progress","in":"query","name":"saves_progress","required":false,"schema":{"type":"boolean"}},{"description":"Comma-separated list of content IDs to retrieve","in":"query","name":"ids","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentListResponse"}}},"description":"List of content items"}},"security":[{"oauth2":[]}],"summary":"List content items","tags":["Content"]}},"/v3/content/{id}":{"get":{"callbacks":{},"deprecated":false,"description":"This endpoint retrieves detailed information about a specific content item by ID","operationId":"ContentController.show","parameters":[{"description":"The ID of the content item to retrieve","in":"path","name":"id","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentDetailResponse"}}},"description":"Content item details"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Content item not found"}},"security":[{"oauth2":[]}],"summary":"Get a specific content item","tags":["Content"]}},"/v3/content/{id}/reviews":{"get":{"callbacks":{},"deprecated":false,"description":"This endpoint retrieves reviews and rating statistics for a specific content item","operationId":"Content.ReviewsController.index","parameters":[{"description":"The ID of the content item to retrieve reviews for","in":"path","name":"id","required":true,"schema":{"type":"integer"}},{"description":"The page number to return (default is 1)","in":"query","name":"page","required":false,"schema":{"type":"integer"}},{"description":"The number of results per page (default is 20)","in":"query","name":"page_size","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentReviewsResponse"}}},"description":"Content reviews and rating statistics"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Content not found"}},"security":[{"oauth2":[]}],"summary":"Get reviews for a content item","tags":["Content"]}},"/v3/oauth2/revoke":{"post":{"callbacks":{},"deprecated":false,"description":"Revoke an OAuth2 access token","operationId":"OAuthController.revoke_token","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuth2RevokeRequest"}}},"description":"Token to revoke","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{},"type":"object"}}},"description":"Empty response"}},"summary":"Revoke an OAuth2 access token","tags":["OAuth2"]}},"/v3/oauth2/token":{"post":{"callbacks":{},"deprecated":false,"description":"Exchange client credentials for an access token","operationId":"OAuthController.create_token","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuth2TokenRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/OAuth2TokenRequest"}}},"description":"Client credentials","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuth2TokenResponse"}}},"description":"Access token response"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuth2ErrorResponse"}}},"description":"Unauthorized"}},"summary":"Get an OAuth2 access token","tags":["OAuth2"]}},"/v3/searches":{"post":{"callbacks":{},"deprecated":false,"description":"This endpoint is used to search for standards","operationId":"SearchController.search","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}},"description":"Search parameters","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}},"description":"Search results"}},"security":[{"oauth2":[]}],"summary":"Search for standards","tags":["Search"]}},"/v3/standard_sets":{"get":{"callbacks":{},"deprecated":false,"description":"This endpoint is used to retrieve a list of standard sets","operationId":"StandardSetController.index","parameters":[{"description":"Alias for page_size, kept for backwards compatibility","in":"query","name":"per_page","required":false,"schema":{"type":"integer"}},{"description":"The number of results per page (default is 10)","in":"query","name":"page_size","required":false,"schema":{"type":"integer"}},{"description":"The page number to return (default is 1)","in":"query","name":"page","required":false,"schema":{"type":"integer"}},{"description":"The subject area to filter by (e.g. \"math\", \"science\") (default is all subject areas)","in":"query","name":"subject_area","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardSetResponse"}}},"description":"List of standard sets"}},"security":[{"oauth2":[]}],"summary":"Get standard sets","tags":["Standards"]}},"/v3/standard_sets/{id}/standards":{"get":{"callbacks":{},"deprecated":false,"description":"This endpoint retrieves standards for a specific standard set","operationId":"StandardsController.index","parameters":[{"description":"The ID of the standard set to retrieve standards for","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"The page number to return (default is 1)","in":"query","name":"page","required":false,"schema":{"type":"integer"}},{"description":"The number of results per page (default is 30)","in":"query","name":"page_size","required":false,"schema":{"type":"integer"}},{"description":"Filter results by subject ID","in":"query","name":"subject_id","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardsResponse"}}},"description":"List of standards for the standard set"}},"security":[{"oauth2":[]}],"summary":"Get standards for a standard set","tags":["Standards"]}},"/v3/standards/{id}":{"get":{"callbacks":{},"deprecated":false,"description":"Returns aggregates for a standard grouped by students.","operationId":"StandardsController.show","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"}},{"in":"query","name":"page","required":false,"schema":{"type":"integer"}},{"in":"query","name":"page_size","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardAggregatesResponse"}}},"description":"Standard aggregates"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Invalid standard id"}},"security":[{"oauth2":[]}],"summary":"Get standard aggregates by student","tags":["Standards"]}},"/v3/students/{application_user_id}":{"get":{"callbacks":{},"deprecated":false,"description":"Returns student aggregates by assignment or standard for the calling application user.","operationId":"StudentsController.show","parameters":[{"in":"path","name":"application_user_id","required":true,"schema":{"type":"string"}},{"description":"View type (default: assignment)","in":"query","name":"view","required":false,"schema":{"enum":["assignment","standard"],"type":"string"}},{"in":"query","name":"page","required":false,"schema":{"type":"integer"}},{"in":"query","name":"page_size","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudentAggregatesResponse"}}},"description":"Student aggregates"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not found"}},"security":[{"oauth2":[]}],"summary":"Get student aggregates","tags":["Students"]}},"/v3/users":{"get":{"callbacks":{},"deprecated":false,"description":"This endpoint retrieves a list of users associated with the current application. Supports pagination via page and page_size params.","operationId":"UsersController.index","parameters":[{"description":"The page number to return (default is 1)","in":"query","name":"page","required":false,"schema":{"type":"integer"}},{"description":"The number of results per page (default is 1000, max is 1000)","in":"query","name":"page_size","required":false,"schema":{"type":"integer"}},{"description":"Filter users by role ('teacher' or 'student')","in":"query","name":"role","required":false,"schema":{"enum":["teacher","student"],"type":"string"}},{"description":"Filter users by application user ID","in":"query","name":"application_user_id","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/User"},"type":"array"}}},"description":"List of users"}},"security":[{"oauth2":[]}],"summary":"List users","tags":["Users"]},"post":{"callbacks":{},"deprecated":false,"description":"This endpoint creates a new user associated with the current application","operationId":"UsersController.create","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreateRequest"}}},"description":"User creation parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreateResponse"}}},"description":"User already exists with identical parameters"},"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreateResponse"}}},"description":"User created successfully"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Invalid parameters or user already exists with different parameters"}},"security":[{"oauth2":[]}],"summary":"Create a user","tags":["Users"]}},"/v3/users/login_link":{"post":{"callbacks":{},"deprecated":false,"description":"Creates a short-lived login link that signs the specified user in without creating an assignment. The user will be created automatically if they do not exist.","operationId":"UsersController.login_link","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginLinkRequest"}}},"description":"Login link parameters","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginLinkResponse"}}},"description":"Login link created"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Invalid parameters"}},"security":[{"oauth2":[]}],"summary":"Create a login link","tags":["Users"]}},"/v3/users/{id}":{"get":{"callbacks":{},"deprecated":false,"description":"This endpoint retrieves information about a specific user by ID","operationId":"UsersController.show","parameters":[{"description":"The ID of the user to retrieve","in":"path","name":"id","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}},"description":"User details"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"User not found"}},"security":[{"oauth2":[]}],"summary":"Get a specific user","tags":["Users"]},"put":{"callbacks":{},"deprecated":false,"description":"This endpoint updates information about a specific user by ID","operationId":"UsersController.update","parameters":[{"description":"The ID of the user to update","in":"path","name":"id","required":true,"schema":{"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdateRequest"}}},"description":"User update parameters","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}},"description":"User updated successfully"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"User not found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Invalid parameters or attempted to change immutable fields"}},"security":[{"oauth2":[]}],"summary":"Update a user","tags":["Users"]}}},"security":[],"servers":[{"url":"https://app.smartlittlecookies.com/api","variables":{}}],"tags":[]}