@examplary/sdk 2.2.1 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -381,7 +381,7 @@ interface paths {
381
381
  patch?: never;
382
382
  trace?: never;
383
383
  };
384
- "/me": {
384
+ "/exams/{id}/sessions": {
385
385
  parameters: {
386
386
  query?: never;
387
387
  header?: never;
@@ -389,121 +389,127 @@ interface paths {
389
389
  cookie?: never;
390
390
  };
391
391
  /**
392
- * Get me
393
- * @description Get the current user's account details.
392
+ * List exam sessions
393
+ * @description Get a list of all student sessions for an exam, representing a set of answers from a student.
394
394
  */
395
- get: operations["me.get"];
395
+ get: operations["exams.sessions.list"];
396
396
  put?: never;
397
- post?: never;
397
+ /**
398
+ * Create session
399
+ * @description Manually create a session, possibly from uploaded data.
400
+ */
401
+ post: operations["exams.sessions.import"];
398
402
  delete?: never;
399
403
  options?: never;
400
404
  head?: never;
401
- /**
402
- * Update me
403
- * @description Update the current user's account details.
404
- */
405
- patch: operations["me.update"];
405
+ patch?: never;
406
406
  trace?: never;
407
407
  };
408
- "/media/upload": {
408
+ "/exams/{id}/sessions/scan": {
409
409
  parameters: {
410
410
  query?: never;
411
411
  header?: never;
412
412
  path?: never;
413
413
  cookie?: never;
414
414
  };
415
+ get?: never;
416
+ put?: never;
415
417
  /**
416
- * Get file upload URL
417
- * @description Returns a signed URL for uploading a file, and a public URL for accessing it afterwards.
418
+ * Get answers from scan
419
+ * @description Scan student answers from a document.
418
420
  */
419
- get: operations["media.upload"];
420
- put?: never;
421
- post?: never;
421
+ post: operations["exams.sessions.scan"];
422
422
  delete?: never;
423
423
  options?: never;
424
424
  head?: never;
425
425
  patch?: never;
426
426
  trace?: never;
427
427
  };
428
- "/org": {
428
+ "/exams/{id}/sessions/scan-document": {
429
429
  parameters: {
430
430
  query?: never;
431
431
  header?: never;
432
432
  path?: never;
433
433
  cookie?: never;
434
434
  };
435
- /** Get organization */
436
- get: operations["org.get"];
435
+ get?: never;
437
436
  put?: never;
438
- post?: never;
439
- /** Delete organization */
440
- delete: operations["org.delete"];
437
+ /**
438
+ * Scan document for student answers
439
+ * @description Start a background task to extract student answers from an uploaded PDF document.
440
+ */
441
+ post: operations["exams.sessions.scanDocument"];
442
+ delete?: never;
441
443
  options?: never;
442
444
  head?: never;
443
- /** Update organization */
444
- patch: operations["org.update"];
445
+ patch?: never;
445
446
  trace?: never;
446
447
  };
447
- "/org/custom-domain": {
448
+ "/exams/{id}/sessions/{sessionId}": {
448
449
  parameters: {
449
450
  query?: never;
450
451
  header?: never;
451
452
  path?: never;
452
453
  cookie?: never;
453
454
  };
454
- /** Get custom domain configuration */
455
- get: operations["org.customDomain.get"];
455
+ /**
456
+ * Get exam session
457
+ * @description Get a single exam session by its ID, representing a set of answers from a student.
458
+ */
459
+ get: operations["exams.sessions.get"];
456
460
  put?: never;
457
- /** Update custom domain configuration */
458
- post: operations["org.customDomain.update"];
459
- delete?: never;
461
+ post?: never;
462
+ /**
463
+ * Delete exam session
464
+ * @description Remove an exam session.
465
+ */
466
+ delete: operations["exams.sessions.delete"];
460
467
  options?: never;
461
468
  head?: never;
462
469
  patch?: never;
463
470
  trace?: never;
464
471
  };
465
- "/orgs": {
472
+ "/exams/{id}/sessions/{sessionId}/feedback": {
466
473
  parameters: {
467
474
  query?: never;
468
475
  header?: never;
469
476
  path?: never;
470
477
  cookie?: never;
471
478
  };
472
- /** List all organizations */
473
- get: operations["orgs.list"];
479
+ get?: never;
474
480
  put?: never;
475
481
  /**
476
- * Create a new organization
477
- * @description Create a new workspace to collaborate with others on exams.
482
+ * Provide feedback
483
+ * @description Set teacher feedback and/or a grade for a specific question in an exam session.
478
484
  */
479
- post: operations["orgs.create"];
485
+ post: operations["exams.sessions.saveFeedback"];
480
486
  delete?: never;
481
487
  options?: never;
482
488
  head?: never;
483
489
  patch?: never;
484
490
  trace?: never;
485
491
  };
486
- "/api-keys": {
492
+ "/exams/{id}/sessions/{sessionId}/overall-feedback": {
487
493
  parameters: {
488
494
  query?: never;
489
495
  header?: never;
490
496
  path?: never;
491
497
  cookie?: never;
492
498
  };
499
+ get?: never;
500
+ put?: never;
493
501
  /**
494
- * Get API key
495
- * @description Get the API key for the current org/user combination. Creates one if none exists.
502
+ * Provide overall feedback
503
+ * @description Set teacher feedback for the test as a whole in an exam session.
496
504
  */
497
- get: operations["apiKeys.get"];
498
- put?: never;
499
- post?: never;
505
+ post: operations["exams.sessions.saveOverallFeedback"];
500
506
  delete?: never;
501
507
  options?: never;
502
508
  head?: never;
503
509
  patch?: never;
504
510
  trace?: never;
505
511
  };
506
- "/api-keys/reset": {
512
+ "/exams/{id}/sessions/{sessionId}/generate-overall-feedback": {
507
513
  parameters: {
508
514
  query?: never;
509
515
  header?: never;
@@ -513,41 +519,37 @@ interface paths {
513
519
  get?: never;
514
520
  put?: never;
515
521
  /**
516
- * Reset API key
517
- * @description Invalidate old API keys for this org/user and create a new one.
522
+ * Generate overall feedback
523
+ * @description Generate feedback for the test as a whole in an exam session.
518
524
  */
519
- post: operations["apiKeys.reset"];
525
+ post: operations["exams.sessions.generateOverallFeedback"];
520
526
  delete?: never;
521
527
  options?: never;
522
528
  head?: never;
523
529
  patch?: never;
524
530
  trace?: never;
525
531
  };
526
- "/attributes": {
532
+ "/exams/{id}/sessions/{sessionId}/suggestions/accept-all": {
527
533
  parameters: {
528
534
  query?: never;
529
535
  header?: never;
530
536
  path?: never;
531
537
  cookie?: never;
532
538
  };
533
- /**
534
- * List attributes
535
- * @description Get all custom attributes configured for the current workspace.
536
- */
537
- get: operations["attributes.list"];
539
+ get?: never;
538
540
  put?: never;
539
541
  /**
540
- * Create attribute
541
- * @description Create a new custom attribute in the current workspace.
542
+ * Accept AI grading suggestions
543
+ * @description Accept all AI-generated grading suggestions for the exam session.
542
544
  */
543
- post: operations["attributes.create"];
545
+ post: operations["exams.sessions.acceptAllSuggestions"];
544
546
  delete?: never;
545
547
  options?: never;
546
548
  head?: never;
547
549
  patch?: never;
548
550
  trace?: never;
549
551
  };
550
- "/attributes/reorder": {
552
+ "/exams/{id}/sessions/{sessionId}/suggestions/{questionId}/accept": {
551
553
  parameters: {
552
554
  query?: never;
553
555
  header?: never;
@@ -557,17 +559,17 @@ interface paths {
557
559
  get?: never;
558
560
  put?: never;
559
561
  /**
560
- * Reorder attributes
561
- * @description Update the position of multiple attributes at once.
562
+ * Accept single AI grading suggestion
563
+ * @description Accept a single AI-generated grading suggestion for the exam session.
562
564
  */
563
- post: operations["attributes.reorder"];
565
+ post: operations["exams.sessions.acceptSuggestion"];
564
566
  delete?: never;
565
567
  options?: never;
566
568
  head?: never;
567
569
  patch?: never;
568
570
  trace?: never;
569
571
  };
570
- "/attributes/{id}": {
572
+ "/exams/{id}/sessions/{sessionId}/answers/{questionId}": {
571
573
  parameters: {
572
574
  query?: never;
573
575
  header?: never;
@@ -576,22 +578,18 @@ interface paths {
576
578
  };
577
579
  get?: never;
578
580
  put?: never;
579
- /**
580
- * Update attribute
581
- * @description Update an existing attribute in the current workspace.
582
- */
583
- post: operations["attributes.update"];
584
- /**
585
- * Delete attribute
586
- * @description Delete a custom attribute from the current workspace. Default attributes cannot be deleted.
587
- */
588
- delete: operations["attributes.delete"];
581
+ post?: never;
582
+ delete?: never;
589
583
  options?: never;
590
584
  head?: never;
591
- patch?: never;
585
+ /**
586
+ * Edit answer
587
+ * @description Edit a single answer in an exam session.
588
+ */
589
+ patch: operations["exams.sessions.editAnswer"];
592
590
  trace?: never;
593
591
  };
594
- "/taxonomies": {
592
+ "/exams/{id}/sessions/{sessionId}/comments": {
595
593
  parameters: {
596
594
  query?: never;
597
595
  header?: never;
@@ -599,23 +597,23 @@ interface paths {
599
597
  cookie?: never;
600
598
  };
601
599
  /**
602
- * Get taxonomies
603
- * @description Get a list available taxonomies, including defaults and taxonomies created in the current workspace.
600
+ * List session comments
601
+ * @description Get a list of all comments left on a student's assessment session.
604
602
  */
605
- get: operations["taxonomies.list"];
603
+ get: operations["exams.sessions.comments.list"];
606
604
  put?: never;
607
605
  /**
608
- * Create taxonomy
609
- * @description Save a new taxonomy in the current workspace.
606
+ * Create session comment
607
+ * @description Add a new comment to a question in a student's assessment session.
610
608
  */
611
- post: operations["taxonomies.create"];
609
+ post: operations["exams.sessions.comments.create"];
612
610
  delete?: never;
613
611
  options?: never;
614
612
  head?: never;
615
613
  patch?: never;
616
614
  trace?: never;
617
615
  };
618
- "/taxonomies/{id}": {
616
+ "/exams/{id}/sessions/{sessionId}/comments/{commentId}": {
619
617
  parameters: {
620
618
  query?: never;
621
619
  header?: never;
@@ -624,66 +622,62 @@ interface paths {
624
622
  };
625
623
  get?: never;
626
624
  put?: never;
625
+ post?: never;
627
626
  /**
628
- * Update taxonomy
629
- * @description Update an existing taxonomy in the current workspace.
630
- */
631
- post: operations["taxonomies.update"];
632
- /**
633
- * Delete taxonomy
634
- * @description Delete a taxonomy from the current workspace. This fails if there are any exams associated with the taxonomy.
627
+ * Delete session comment
628
+ * @description Remove a comment from a session.
635
629
  */
636
- delete: operations["taxonomies.delete"];
630
+ delete: operations["exams.sessions.comments.delete"];
637
631
  options?: never;
638
632
  head?: never;
639
- patch?: never;
633
+ /**
634
+ * Update session comment
635
+ * @description Edit the body of an existing session comment.
636
+ */
637
+ patch: operations["exams.sessions.comments.update"];
640
638
  trace?: never;
641
639
  };
642
- "/permissions/autocomplete": {
640
+ "/exams/{id}/questions/import": {
643
641
  parameters: {
644
642
  query?: never;
645
643
  header?: never;
646
644
  path?: never;
647
645
  cookie?: never;
648
646
  };
647
+ get?: never;
648
+ put?: never;
649
649
  /**
650
- * Autocomplete users and groups
651
- * @description Search for users and groups to share with. Returns matches by name or email. Respects restricted group visibility.
650
+ * Import questions
651
+ * @description Import questions into an exam from a file. Support Word, PDF, Moodle quiz XML and plain text files.
652
652
  */
653
- get: operations["permissions.autocomplete"];
654
- put?: never;
655
- post?: never;
653
+ post: operations["exams.questions.import"];
656
654
  delete?: never;
657
655
  options?: never;
658
656
  head?: never;
659
657
  patch?: never;
660
658
  trace?: never;
661
659
  };
662
- "/permissions/{resource}": {
660
+ "/exams/{id}/questions/generate": {
663
661
  parameters: {
664
662
  query?: never;
665
663
  header?: never;
666
664
  path?: never;
667
665
  cookie?: never;
668
666
  };
669
- /**
670
- * Get sharing permissions
671
- * @description Get a list of users, groups and orgs that have access to a specific resource.
672
- */
673
- get: operations["permissions.list"];
667
+ get?: never;
674
668
  put?: never;
675
669
  /**
676
- * Create permission
677
- * @description Create a new permission for a specific resource, or update the role of an existing actor.
670
+ * Generate question
671
+ * @description Generate a new question for the exam using an AI prompt.
678
672
  */
679
- post: operations["permissions.assign"];
673
+ post: operations["exams.questions.generate"];
680
674
  delete?: never;
681
675
  options?: never;
682
676
  head?: never;
683
677
  patch?: never;
684
678
  trace?: never;
685
679
  };
686
- "/permissions/{resource}/{actor}": {
680
+ "/exams/{id}/questions/{questionId}": {
687
681
  parameters: {
688
682
  query?: never;
689
683
  header?: never;
@@ -691,67 +685,59 @@ interface paths {
691
685
  cookie?: never;
692
686
  };
693
687
  /**
694
- * Get actor role
695
- * @description Get the role of a specific actor for a specific resource.
688
+ * Get question
689
+ * @description Retrieve a question by its ID.
696
690
  */
697
- get: operations["permissions.getActorRole"];
691
+ get: operations["exams.questions.get"];
698
692
  put?: never;
699
693
  post?: never;
700
- /**
701
- * Remove permission
702
- * @description Remove a permission for a specific actor on a specific resource.
703
- */
704
- delete: operations["permissions.delete"];
694
+ delete?: never;
705
695
  options?: never;
706
696
  head?: never;
707
697
  patch?: never;
708
698
  trace?: never;
709
699
  };
710
- "/student-levels": {
700
+ "/exams/{id}/questions/{questionId}/generate": {
711
701
  parameters: {
712
702
  query?: never;
713
703
  header?: never;
714
704
  path?: never;
715
705
  cookie?: never;
716
706
  };
707
+ get?: never;
708
+ put?: never;
717
709
  /**
718
- * List available student levels
719
- * @description Get a list of available default student levels.
710
+ * Regenerate question
711
+ * @description Update a question using an AI prompt.
720
712
  */
721
- get: operations["studentLevels.list"];
722
- put?: never;
723
- post?: never;
713
+ post: operations["exams.questions.regenerate"];
724
714
  delete?: never;
725
715
  options?: never;
726
716
  head?: never;
727
717
  patch?: never;
728
718
  trace?: never;
729
719
  };
730
- "/users": {
720
+ "/exams/{id}/export/qti3-zip": {
731
721
  parameters: {
732
722
  query?: never;
733
723
  header?: never;
734
724
  path?: never;
735
725
  cookie?: never;
736
726
  };
737
- /**
738
- * List users
739
- * @description Get a list of all users in the workspace.
740
- */
741
- get: operations["users.list"];
727
+ get?: never;
742
728
  put?: never;
743
729
  /**
744
- * Create user
745
- * @description Create a new user in the workspace.
730
+ * Export QTI 3 package
731
+ * @description Export an exam as a QTI 3 ZIP package.
746
732
  */
747
- post: operations["users.create"];
733
+ post: operations["exams.export.qti3Zip"];
748
734
  delete?: never;
749
735
  options?: never;
750
736
  head?: never;
751
737
  patch?: never;
752
738
  trace?: never;
753
739
  };
754
- "/users/{id}": {
740
+ "/exams/{id}/export/qti21-zip": {
755
741
  parameters: {
756
742
  query?: never;
757
743
  header?: never;
@@ -760,22 +746,18 @@ interface paths {
760
746
  };
761
747
  get?: never;
762
748
  put?: never;
763
- post?: never;
764
749
  /**
765
- * Delete user
766
- * @description Delete a user from the workspace.
750
+ * Export QTI 2.1 package
751
+ * @description Export an exam as a QTI 2.1 ZIP package.
767
752
  */
768
- delete: operations["users.delete"];
753
+ post: operations["exams.export.qti21Zip"];
754
+ delete?: never;
769
755
  options?: never;
770
756
  head?: never;
771
- /**
772
- * Update user role
773
- * @description Update a user's role within the workspace.
774
- */
775
- patch: operations["users.update"];
757
+ patch?: never;
776
758
  trace?: never;
777
759
  };
778
- "/exams/{id}/sessions": {
760
+ "/exams": {
779
761
  parameters: {
780
762
  query?: never;
781
763
  header?: never;
@@ -783,23 +765,23 @@ interface paths {
783
765
  cookie?: never;
784
766
  };
785
767
  /**
786
- * List exam sessions
787
- * @description Get a list of all student sessions for an exam, representing a set of answers from a student.
768
+ * List exams
769
+ * @description Get a list of all exams within your workspace.
788
770
  */
789
- get: operations["exams.sessions.list"];
771
+ get: operations["exams.list"];
790
772
  put?: never;
791
773
  /**
792
- * Create session
793
- * @description Manually create a session, possibly from uploaded data.
774
+ * Create exam
775
+ * @description Create a new exam within your workspace.
794
776
  */
795
- post: operations["exams.sessions.import"];
777
+ post: operations["exams.create"];
796
778
  delete?: never;
797
779
  options?: never;
798
780
  head?: never;
799
781
  patch?: never;
800
782
  trace?: never;
801
783
  };
802
- "/exams/{id}/sessions/scan": {
784
+ "/exams/import": {
803
785
  parameters: {
804
786
  query?: never;
805
787
  header?: never;
@@ -809,61 +791,45 @@ interface paths {
809
791
  get?: never;
810
792
  put?: never;
811
793
  /**
812
- * Get answers from scan
813
- * @description Scan student answers from a document.
794
+ * Import exam
795
+ * @description Create an exam by importing one or more source materials (e.g. an existing exam).
814
796
  */
815
- post: operations["exams.sessions.scan"];
797
+ post: operations["exams.import"];
816
798
  delete?: never;
817
799
  options?: never;
818
800
  head?: never;
819
801
  patch?: never;
820
802
  trace?: never;
821
803
  };
822
- "/exams/{id}/sessions/scan-document": {
804
+ "/exams/{id}": {
823
805
  parameters: {
824
806
  query?: never;
825
807
  header?: never;
826
808
  path?: never;
827
809
  cookie?: never;
828
810
  };
829
- get?: never;
830
- put?: never;
831
811
  /**
832
- * Scan document for student answers
833
- * @description Start a background task to extract student answers from an uploaded PDF document.
812
+ * Get exam
813
+ * @description Get a single exam by its ID.
834
814
  */
835
- post: operations["exams.sessions.scanDocument"];
836
- delete?: never;
837
- options?: never;
838
- head?: never;
839
- patch?: never;
840
- trace?: never;
841
- };
842
- "/exams/{id}/sessions/{sessionId}": {
843
- parameters: {
844
- query?: never;
845
- header?: never;
846
- path?: never;
847
- cookie?: never;
848
- };
815
+ get: operations["exams.get"];
816
+ put?: never;
849
817
  /**
850
- * Get exam session
851
- * @description Get a single exam session by its ID, representing a set of answers from a student.
818
+ * Update exam
819
+ * @description Update an existing exam.
852
820
  */
853
- get: operations["exams.sessions.get"];
854
- put?: never;
855
- post?: never;
821
+ post: operations["exams.update"];
856
822
  /**
857
- * Delete exam session
858
- * @description Remove an exam session.
823
+ * Delete exam
824
+ * @description Delete the exam.
859
825
  */
860
- delete: operations["exams.sessions.delete"];
826
+ delete: operations["exams.delete"];
861
827
  options?: never;
862
828
  head?: never;
863
829
  patch?: never;
864
830
  trace?: never;
865
831
  };
866
- "/exams/{id}/sessions/{sessionId}/feedback": {
832
+ "/exams/{id}/duplicate": {
867
833
  parameters: {
868
834
  query?: never;
869
835
  header?: never;
@@ -873,17 +839,17 @@ interface paths {
873
839
  get?: never;
874
840
  put?: never;
875
841
  /**
876
- * Provide feedback
877
- * @description Set teacher feedback and/or a grade for a specific question in an exam session.
842
+ * Duplicate exam
843
+ * @description Duplicate the exam's questions and settings to a new exam.
878
844
  */
879
- post: operations["exams.sessions.saveFeedback"];
845
+ post: operations["exams.duplicate"];
880
846
  delete?: never;
881
847
  options?: never;
882
848
  head?: never;
883
849
  patch?: never;
884
850
  trace?: never;
885
851
  };
886
- "/exams/{id}/sessions/{sessionId}/overall-feedback": {
852
+ "/exams/{id}/print": {
887
853
  parameters: {
888
854
  query?: never;
889
855
  header?: never;
@@ -893,17 +859,17 @@ interface paths {
893
859
  get?: never;
894
860
  put?: never;
895
861
  /**
896
- * Provide overall feedback
897
- * @description Set teacher feedback for the test as a whole in an exam session.
862
+ * Print exam
863
+ * @description Export an exam to a PDF file or Word document.
898
864
  */
899
- post: operations["exams.sessions.saveOverallFeedback"];
865
+ post: operations["exams.print"];
900
866
  delete?: never;
901
867
  options?: never;
902
868
  head?: never;
903
869
  patch?: never;
904
870
  trace?: never;
905
871
  };
906
- "/exams/{id}/sessions/{sessionId}/generate-overall-feedback": {
872
+ "/exams/{id}/generate": {
907
873
  parameters: {
908
874
  query?: never;
909
875
  header?: never;
@@ -913,17 +879,17 @@ interface paths {
913
879
  get?: never;
914
880
  put?: never;
915
881
  /**
916
- * Generate overall feedback
917
- * @description Generate feedback for the test as a whole in an exam session.
882
+ * Generate exam
883
+ * @description Initiate a job to generate new questions for the exam using AI, based on the source materials and metadata specified.
918
884
  */
919
- post: operations["exams.sessions.generateOverallFeedback"];
885
+ post: operations["exams.startGeneration"];
920
886
  delete?: never;
921
887
  options?: never;
922
888
  head?: never;
923
889
  patch?: never;
924
890
  trace?: never;
925
891
  };
926
- "/exams/{id}/sessions/{sessionId}/suggestions/accept-all": {
892
+ "/exams/{id}/generate/cancel": {
927
893
  parameters: {
928
894
  query?: never;
929
895
  header?: never;
@@ -933,157 +899,159 @@ interface paths {
933
899
  get?: never;
934
900
  put?: never;
935
901
  /**
936
- * Accept AI grading suggestions
937
- * @description Accept all AI-generated grading suggestions for the exam session.
902
+ * Cancel exam generation
903
+ * @description Cancel an ongoing job to generate new questions for the exam using AI.
938
904
  */
939
- post: operations["exams.sessions.acceptAllSuggestions"];
905
+ post: operations["exams.cancelGeneration"];
940
906
  delete?: never;
941
907
  options?: never;
942
908
  head?: never;
943
909
  patch?: never;
944
910
  trace?: never;
945
911
  };
946
- "/exams/{id}/sessions/{sessionId}/suggestions/{questionId}/accept": {
912
+ "/exams/{id}/context-suggestions": {
947
913
  parameters: {
948
914
  query?: never;
949
915
  header?: never;
950
916
  path?: never;
951
917
  cookie?: never;
952
918
  };
953
- get?: never;
954
- put?: never;
955
919
  /**
956
- * Accept single AI grading suggestion
957
- * @description Accept a single AI-generated grading suggestion for the exam session.
920
+ * Get exam context suggestions
921
+ * @description Get AI-generated suggestions for context/instructions to include in the exam generation prompt, based on the source materials linked to the exam.
958
922
  */
959
- post: operations["exams.sessions.acceptSuggestion"];
923
+ get: operations["exams.getContextSuggestions"];
924
+ put?: never;
925
+ post?: never;
960
926
  delete?: never;
961
927
  options?: never;
962
928
  head?: never;
963
929
  patch?: never;
964
930
  trace?: never;
965
931
  };
966
- "/exams/{id}/sessions/{sessionId}/answers/{questionId}": {
932
+ "/me": {
967
933
  parameters: {
968
934
  query?: never;
969
935
  header?: never;
970
936
  path?: never;
971
937
  cookie?: never;
972
938
  };
973
- get?: never;
939
+ /**
940
+ * Get me
941
+ * @description Get the current user's account details.
942
+ */
943
+ get: operations["me.get"];
974
944
  put?: never;
975
945
  post?: never;
976
946
  delete?: never;
977
947
  options?: never;
978
948
  head?: never;
979
949
  /**
980
- * Edit answer
981
- * @description Edit a single answer in an exam session.
950
+ * Update me
951
+ * @description Update the current user's account details.
982
952
  */
983
- patch: operations["exams.sessions.editAnswer"];
953
+ patch: operations["me.update"];
984
954
  trace?: never;
985
955
  };
986
- "/exams/{id}/questions/import": {
956
+ "/media/upload": {
987
957
  parameters: {
988
958
  query?: never;
989
959
  header?: never;
990
960
  path?: never;
991
961
  cookie?: never;
992
962
  };
993
- get?: never;
994
- put?: never;
995
963
  /**
996
- * Import questions
997
- * @description Import questions into an exam from a file. Support Word, PDF, Moodle quiz XML and plain text files.
964
+ * Get file upload URL
965
+ * @description Returns a signed URL for uploading a file, and a public URL for accessing it afterwards.
998
966
  */
999
- post: operations["exams.questions.import"];
967
+ get: operations["media.upload"];
968
+ put?: never;
969
+ post?: never;
1000
970
  delete?: never;
1001
971
  options?: never;
1002
972
  head?: never;
1003
973
  patch?: never;
1004
974
  trace?: never;
1005
975
  };
1006
- "/exams/{id}/questions/generate": {
976
+ "/org": {
1007
977
  parameters: {
1008
978
  query?: never;
1009
979
  header?: never;
1010
980
  path?: never;
1011
981
  cookie?: never;
1012
982
  };
1013
- get?: never;
983
+ /** Get organization */
984
+ get: operations["org.get"];
1014
985
  put?: never;
1015
- /**
1016
- * Generate question
1017
- * @description Generate a new question for the exam using an AI prompt.
1018
- */
1019
- post: operations["exams.questions.generate"];
1020
- delete?: never;
986
+ post?: never;
987
+ /** Delete organization */
988
+ delete: operations["org.delete"];
1021
989
  options?: never;
1022
990
  head?: never;
1023
- patch?: never;
991
+ /** Update organization */
992
+ patch: operations["org.update"];
1024
993
  trace?: never;
1025
994
  };
1026
- "/exams/{id}/questions/{questionId}": {
995
+ "/org/custom-domain": {
1027
996
  parameters: {
1028
997
  query?: never;
1029
998
  header?: never;
1030
999
  path?: never;
1031
1000
  cookie?: never;
1032
1001
  };
1033
- /**
1034
- * Get question
1035
- * @description Retrieve a question by its ID.
1036
- */
1037
- get: operations["exams.questions.get"];
1002
+ /** Get custom domain configuration */
1003
+ get: operations["org.customDomain.get"];
1038
1004
  put?: never;
1039
- post?: never;
1005
+ /** Update custom domain configuration */
1006
+ post: operations["org.customDomain.update"];
1040
1007
  delete?: never;
1041
1008
  options?: never;
1042
1009
  head?: never;
1043
1010
  patch?: never;
1044
1011
  trace?: never;
1045
1012
  };
1046
- "/exams/{id}/questions/{questionId}/generate": {
1013
+ "/orgs": {
1047
1014
  parameters: {
1048
1015
  query?: never;
1049
1016
  header?: never;
1050
1017
  path?: never;
1051
1018
  cookie?: never;
1052
1019
  };
1053
- get?: never;
1020
+ /** List all organizations */
1021
+ get: operations["orgs.list"];
1054
1022
  put?: never;
1055
1023
  /**
1056
- * Regenerate question
1057
- * @description Update a question using an AI prompt.
1024
+ * Create a new organization
1025
+ * @description Create a new workspace to collaborate with others on exams.
1058
1026
  */
1059
- post: operations["exams.questions.regenerate"];
1027
+ post: operations["orgs.create"];
1060
1028
  delete?: never;
1061
1029
  options?: never;
1062
1030
  head?: never;
1063
1031
  patch?: never;
1064
1032
  trace?: never;
1065
1033
  };
1066
- "/exams/{id}/export/qti3-zip": {
1034
+ "/api-keys": {
1067
1035
  parameters: {
1068
1036
  query?: never;
1069
1037
  header?: never;
1070
1038
  path?: never;
1071
1039
  cookie?: never;
1072
1040
  };
1073
- get?: never;
1074
- put?: never;
1075
1041
  /**
1076
- * Export QTI 3 package
1077
- * @description Export an exam as a QTI 3 ZIP package.
1042
+ * Get API key
1043
+ * @description Get the API key for the current org/user combination. Creates one if none exists.
1078
1044
  */
1079
- post: operations["exams.export.qti3Zip"];
1045
+ get: operations["apiKeys.get"];
1046
+ put?: never;
1047
+ post?: never;
1080
1048
  delete?: never;
1081
1049
  options?: never;
1082
1050
  head?: never;
1083
1051
  patch?: never;
1084
1052
  trace?: never;
1085
1053
  };
1086
- "/exams/{id}/export/qti21-zip": {
1054
+ "/api-keys/reset": {
1087
1055
  parameters: {
1088
1056
  query?: never;
1089
1057
  header?: never;
@@ -1093,17 +1061,17 @@ interface paths {
1093
1061
  get?: never;
1094
1062
  put?: never;
1095
1063
  /**
1096
- * Export QTI 2.1 package
1097
- * @description Export an exam as a QTI 2.1 ZIP package.
1064
+ * Reset API key
1065
+ * @description Invalidate old API keys for this org/user and create a new one.
1098
1066
  */
1099
- post: operations["exams.export.qti21Zip"];
1067
+ post: operations["apiKeys.reset"];
1100
1068
  delete?: never;
1101
1069
  options?: never;
1102
1070
  head?: never;
1103
1071
  patch?: never;
1104
1072
  trace?: never;
1105
1073
  };
1106
- "/exams": {
1074
+ "/attributes": {
1107
1075
  parameters: {
1108
1076
  query?: never;
1109
1077
  header?: never;
@@ -1111,23 +1079,23 @@ interface paths {
1111
1079
  cookie?: never;
1112
1080
  };
1113
1081
  /**
1114
- * List exams
1115
- * @description Get a list of all exams within your workspace.
1082
+ * List attributes
1083
+ * @description Get all custom attributes configured for the current workspace.
1116
1084
  */
1117
- get: operations["exams.list"];
1085
+ get: operations["attributes.list"];
1118
1086
  put?: never;
1119
1087
  /**
1120
- * Create exam
1121
- * @description Create a new exam within your workspace.
1088
+ * Create attribute
1089
+ * @description Create a new custom attribute in the current workspace.
1122
1090
  */
1123
- post: operations["exams.create"];
1091
+ post: operations["attributes.create"];
1124
1092
  delete?: never;
1125
1093
  options?: never;
1126
1094
  head?: never;
1127
1095
  patch?: never;
1128
1096
  trace?: never;
1129
1097
  };
1130
- "/exams/import": {
1098
+ "/attributes/reorder": {
1131
1099
  parameters: {
1132
1100
  query?: never;
1133
1101
  header?: never;
@@ -1137,65 +1105,65 @@ interface paths {
1137
1105
  get?: never;
1138
1106
  put?: never;
1139
1107
  /**
1140
- * Import exam
1141
- * @description Create an exam by importing one or more source materials (e.g. an existing exam).
1108
+ * Reorder attributes
1109
+ * @description Update the position of multiple attributes at once.
1142
1110
  */
1143
- post: operations["exams.import"];
1111
+ post: operations["attributes.reorder"];
1144
1112
  delete?: never;
1145
1113
  options?: never;
1146
1114
  head?: never;
1147
1115
  patch?: never;
1148
1116
  trace?: never;
1149
1117
  };
1150
- "/exams/{id}": {
1118
+ "/attributes/{id}": {
1151
1119
  parameters: {
1152
1120
  query?: never;
1153
1121
  header?: never;
1154
1122
  path?: never;
1155
1123
  cookie?: never;
1156
1124
  };
1157
- /**
1158
- * Get exam
1159
- * @description Get a single exam by its ID.
1160
- */
1161
- get: operations["exams.get"];
1125
+ get?: never;
1162
1126
  put?: never;
1163
1127
  /**
1164
- * Update exam
1165
- * @description Update an existing exam.
1128
+ * Update attribute
1129
+ * @description Update an existing attribute in the current workspace.
1166
1130
  */
1167
- post: operations["exams.update"];
1131
+ post: operations["attributes.update"];
1168
1132
  /**
1169
- * Delete exam
1170
- * @description Delete the exam.
1133
+ * Delete attribute
1134
+ * @description Delete a custom attribute from the current workspace. Default attributes cannot be deleted.
1171
1135
  */
1172
- delete: operations["exams.delete"];
1136
+ delete: operations["attributes.delete"];
1173
1137
  options?: never;
1174
1138
  head?: never;
1175
1139
  patch?: never;
1176
1140
  trace?: never;
1177
1141
  };
1178
- "/exams/{id}/duplicate": {
1142
+ "/taxonomies": {
1179
1143
  parameters: {
1180
1144
  query?: never;
1181
1145
  header?: never;
1182
1146
  path?: never;
1183
1147
  cookie?: never;
1184
1148
  };
1185
- get?: never;
1149
+ /**
1150
+ * Get taxonomies
1151
+ * @description Get a list available taxonomies, including defaults and taxonomies created in the current workspace.
1152
+ */
1153
+ get: operations["taxonomies.list"];
1186
1154
  put?: never;
1187
1155
  /**
1188
- * Duplicate exam
1189
- * @description Duplicate the exam's questions and settings to a new exam.
1156
+ * Create taxonomy
1157
+ * @description Save a new taxonomy in the current workspace.
1190
1158
  */
1191
- post: operations["exams.duplicate"];
1159
+ post: operations["taxonomies.create"];
1192
1160
  delete?: never;
1193
1161
  options?: never;
1194
1162
  head?: never;
1195
1163
  patch?: never;
1196
1164
  trace?: never;
1197
1165
  };
1198
- "/exams/{id}/print": {
1166
+ "/taxonomies/{id}": {
1199
1167
  parameters: {
1200
1168
  query?: never;
1201
1169
  header?: never;
@@ -1205,57 +1173,65 @@ interface paths {
1205
1173
  get?: never;
1206
1174
  put?: never;
1207
1175
  /**
1208
- * Print exam
1209
- * @description Export an exam to a PDF file or Word document.
1176
+ * Update taxonomy
1177
+ * @description Update an existing taxonomy in the current workspace.
1210
1178
  */
1211
- post: operations["exams.print"];
1212
- delete?: never;
1179
+ post: operations["taxonomies.update"];
1180
+ /**
1181
+ * Delete taxonomy
1182
+ * @description Delete a taxonomy from the current workspace. This fails if there are any exams associated with the taxonomy.
1183
+ */
1184
+ delete: operations["taxonomies.delete"];
1213
1185
  options?: never;
1214
1186
  head?: never;
1215
1187
  patch?: never;
1216
1188
  trace?: never;
1217
1189
  };
1218
- "/exams/{id}/generate": {
1190
+ "/permissions/autocomplete": {
1219
1191
  parameters: {
1220
1192
  query?: never;
1221
1193
  header?: never;
1222
1194
  path?: never;
1223
1195
  cookie?: never;
1224
1196
  };
1225
- get?: never;
1226
- put?: never;
1227
1197
  /**
1228
- * Generate exam
1229
- * @description Initiate a job to generate new questions for the exam using AI, based on the source materials and metadata specified.
1198
+ * Autocomplete users and groups
1199
+ * @description Search for users and groups to share with. Returns matches by name or email. Respects restricted group visibility.
1230
1200
  */
1231
- post: operations["exams.startGeneration"];
1232
- delete?: never;
1201
+ get: operations["permissions.autocomplete"];
1202
+ put?: never;
1203
+ post?: never;
1204
+ delete?: never;
1233
1205
  options?: never;
1234
1206
  head?: never;
1235
1207
  patch?: never;
1236
1208
  trace?: never;
1237
1209
  };
1238
- "/exams/{id}/generate/cancel": {
1210
+ "/permissions/{resource}": {
1239
1211
  parameters: {
1240
1212
  query?: never;
1241
1213
  header?: never;
1242
1214
  path?: never;
1243
1215
  cookie?: never;
1244
1216
  };
1245
- get?: never;
1217
+ /**
1218
+ * Get sharing permissions
1219
+ * @description Get a list of users, groups and orgs that have access to a specific resource.
1220
+ */
1221
+ get: operations["permissions.list"];
1246
1222
  put?: never;
1247
1223
  /**
1248
- * Cancel exam generation
1249
- * @description Cancel an ongoing job to generate new questions for the exam using AI.
1224
+ * Create permission
1225
+ * @description Create a new permission for a specific resource, or update the role of an existing actor.
1250
1226
  */
1251
- post: operations["exams.cancelGeneration"];
1227
+ post: operations["permissions.assign"];
1252
1228
  delete?: never;
1253
1229
  options?: never;
1254
1230
  head?: never;
1255
1231
  patch?: never;
1256
1232
  trace?: never;
1257
1233
  };
1258
- "/exams/{id}/context-suggestions": {
1234
+ "/permissions/{resource}/{actor}": {
1259
1235
  parameters: {
1260
1236
  query?: never;
1261
1237
  header?: never;
@@ -1263,10 +1239,34 @@ interface paths {
1263
1239
  cookie?: never;
1264
1240
  };
1265
1241
  /**
1266
- * Get exam context suggestions
1267
- * @description Get AI-generated suggestions for context/instructions to include in the exam generation prompt, based on the source materials linked to the exam.
1242
+ * Get actor role
1243
+ * @description Get the role of a specific actor for a specific resource.
1268
1244
  */
1269
- get: operations["exams.getContextSuggestions"];
1245
+ get: operations["permissions.getActorRole"];
1246
+ put?: never;
1247
+ post?: never;
1248
+ /**
1249
+ * Remove permission
1250
+ * @description Remove a permission for a specific actor on a specific resource.
1251
+ */
1252
+ delete: operations["permissions.delete"];
1253
+ options?: never;
1254
+ head?: never;
1255
+ patch?: never;
1256
+ trace?: never;
1257
+ };
1258
+ "/student-levels": {
1259
+ parameters: {
1260
+ query?: never;
1261
+ header?: never;
1262
+ path?: never;
1263
+ cookie?: never;
1264
+ };
1265
+ /**
1266
+ * List available student levels
1267
+ * @description Get a list of available default student levels.
1268
+ */
1269
+ get: operations["studentLevels.list"];
1270
1270
  put?: never;
1271
1271
  post?: never;
1272
1272
  delete?: never;
@@ -1275,6 +1275,54 @@ interface paths {
1275
1275
  patch?: never;
1276
1276
  trace?: never;
1277
1277
  };
1278
+ "/users": {
1279
+ parameters: {
1280
+ query?: never;
1281
+ header?: never;
1282
+ path?: never;
1283
+ cookie?: never;
1284
+ };
1285
+ /**
1286
+ * List users
1287
+ * @description Get a list of all users in the workspace.
1288
+ */
1289
+ get: operations["users.list"];
1290
+ put?: never;
1291
+ /**
1292
+ * Create user
1293
+ * @description Create a new user in the workspace.
1294
+ */
1295
+ post: operations["users.create"];
1296
+ delete?: never;
1297
+ options?: never;
1298
+ head?: never;
1299
+ patch?: never;
1300
+ trace?: never;
1301
+ };
1302
+ "/users/{id}": {
1303
+ parameters: {
1304
+ query?: never;
1305
+ header?: never;
1306
+ path?: never;
1307
+ cookie?: never;
1308
+ };
1309
+ get?: never;
1310
+ put?: never;
1311
+ post?: never;
1312
+ /**
1313
+ * Delete user
1314
+ * @description Delete a user from the workspace.
1315
+ */
1316
+ delete: operations["users.delete"];
1317
+ options?: never;
1318
+ head?: never;
1319
+ /**
1320
+ * Update user role
1321
+ * @description Update a user's role within the workspace.
1322
+ */
1323
+ patch: operations["users.update"];
1324
+ trace?: never;
1325
+ };
1278
1326
  "/practice-spaces": {
1279
1327
  parameters: {
1280
1328
  query?: never;
@@ -2149,7 +2197,30 @@ interface operations {
2149
2197
  */
2150
2198
  type: "AssociateInteraction" | "ChoiceInteraction" | "DrawingInteraction" | "EndAttemptInteraction" | "ExtendedTextInteraction" | "GapMatchInteraction" | "GraphicAssociateInteraction" | "GraphicGapMatchInteraction" | "GraphicOrderInteraction" | "HotspotInteraction" | "HottextInteraction" | "InlineChoiceInteraction" | "MatchInteraction" | "MediaInteraction" | "OrderInteraction" | "PortableCustomInteraction" | "PositionObjectInteraction" | "SelectPointInteraction" | "SliderInteraction" | "TextEntryInteraction" | "UploadInteraction";
2151
2199
  options?: {
2152
- [key: string]: string | number | boolean | unknown[] | Record<string, never>;
2200
+ [key: string]: string | number | boolean | unknown[] | {
2201
+ [key: string]: unknown;
2202
+ };
2203
+ };
2204
+ };
2205
+ };
2206
+ };
2207
+ /** @description Import configuration for various formats */
2208
+ import?: {
2209
+ /** @description QTI 3.0 import configuration for mapping incoming QTI items to this question type */
2210
+ qti3?: {
2211
+ interaction: {
2212
+ /**
2213
+ * @description The QTI interaction type this question type handles on import
2214
+ * @enum {string}
2215
+ */
2216
+ type: "AssociateInteraction" | "ChoiceInteraction" | "DrawingInteraction" | "EndAttemptInteraction" | "ExtendedTextInteraction" | "GapMatchInteraction" | "GraphicAssociateInteraction" | "GraphicGapMatchInteraction" | "GraphicOrderInteraction" | "HotspotInteraction" | "HottextInteraction" | "InlineChoiceInteraction" | "MatchInteraction" | "MediaInteraction" | "OrderInteraction" | "PortableCustomInteraction" | "PositionObjectInteraction" | "SelectPointInteraction" | "SliderInteraction" | "TextEntryInteraction" | "UploadInteraction";
2217
+ };
2218
+ /** @description Optional JSONata expression (starting with =) that must evaluate to true for this mapping to be used. Evaluated against the same context as settings: { interaction, correctResponse, points }. Useful when multiple question types handle the same interaction type (e.g. single vs multiple choice). */
2219
+ condition?: string;
2220
+ /** @description JSONata expressions mapping QTI interaction properties to question settings */
2221
+ settings?: {
2222
+ [key: string]: string | number | boolean | unknown[] | {
2223
+ [key: string]: unknown;
2153
2224
  };
2154
2225
  };
2155
2226
  };
@@ -2639,6 +2710,38 @@ interface operations {
2639
2710
  presets: {
2640
2711
  examId: string;
2641
2712
  };
2713
+ } | {
2714
+ /** @description The user ID for whom the embed session is created */
2715
+ actor: string;
2716
+ /** @description UI options for the embed session */
2717
+ theme: {
2718
+ /** @description CSS hex color code for primary UI elements, either #RRGGBB or #RGB */
2719
+ primaryColor?: string;
2720
+ /** @description CSS hex color code for background, either #RRGGBB or #RGB */
2721
+ backgroundColor?: string;
2722
+ /** @description Locale code for UI language. Currently supported: 'en', 'nl' - other values accepted, but will default to English */
2723
+ locale?: string;
2724
+ };
2725
+ /** @description Additional key-value metadata */
2726
+ metadata?: {
2727
+ [key: string]: string | number | boolean | null;
2728
+ };
2729
+ /**
2730
+ * Format: uri
2731
+ * @description Optional redirect URL after completion
2732
+ */
2733
+ returnUrl?: string;
2734
+ /**
2735
+ * Format: uri
2736
+ * @description Optional allowed origin for postMessage events
2737
+ */
2738
+ allowedOrigin?: string;
2739
+ /** @enum {string} */
2740
+ flow: "take-exam";
2741
+ /** @description Preset values for the take-exam flow */
2742
+ presets: {
2743
+ examId: string;
2744
+ };
2642
2745
  } | {
2643
2746
  /** @description The user ID for whom the embed session is created */
2644
2747
  actor: string;
@@ -2687,7 +2790,7 @@ interface operations {
2687
2790
  /** Format: uri */
2688
2791
  embedUrl: string;
2689
2792
  /** @enum {string} */
2690
- flow: "generate-exam" | "generate-question" | "edit-exam" | "edit-rubric" | "mark-answer" | "practice-space-student";
2793
+ flow: "generate-exam" | "generate-question" | "edit-exam" | "take-exam" | "edit-rubric" | "mark-answer" | "practice-space-student";
2691
2794
  actor: string;
2692
2795
  enabledResponseModes: ("return_url" | "post_message")[];
2693
2796
  /** Format: date-time */
@@ -2738,7 +2841,7 @@ interface operations {
2738
2841
  /** Format: uri */
2739
2842
  embedUrl: string;
2740
2843
  /** @enum {string} */
2741
- flow: "generate-exam" | "generate-question" | "edit-exam" | "edit-rubric" | "mark-answer" | "practice-space-student";
2844
+ flow: "generate-exam" | "generate-question" | "edit-exam" | "take-exam" | "edit-rubric" | "mark-answer" | "practice-space-student";
2742
2845
  actor: string;
2743
2846
  enabledResponseModes: ("return_url" | "post_message")[];
2744
2847
  /** Format: date-time */
@@ -2778,240 +2881,341 @@ interface operations {
2778
2881
  requestBody?: never;
2779
2882
  responses: never;
2780
2883
  };
2781
- "me.get": {
2884
+ "exams.sessions.list": {
2782
2885
  parameters: {
2783
2886
  query?: never;
2784
2887
  header?: never;
2785
- path?: never;
2888
+ path: {
2889
+ id: string;
2890
+ };
2786
2891
  cookie?: never;
2787
2892
  };
2788
2893
  requestBody?: never;
2789
2894
  responses: never;
2790
2895
  };
2791
- "me.update": {
2896
+ "exams.sessions.import": {
2792
2897
  parameters: {
2793
2898
  query?: never;
2794
2899
  header?: never;
2795
- path?: never;
2900
+ path: {
2901
+ id: string;
2902
+ };
2796
2903
  cookie?: never;
2797
2904
  };
2798
2905
  requestBody?: {
2799
2906
  content: {
2800
2907
  "application/json": {
2801
- /** @description The user's name */
2802
- name?: string;
2803
- /** @description A map of user preferences */
2804
- preferences?: {
2805
- [key: string]: unknown;
2806
- };
2908
+ studentName: string;
2909
+ /**
2910
+ * @default manual
2911
+ * @enum {string}
2912
+ */
2913
+ source?: "online-assessment" | "document-scanner" | "answer-bot" | "manual";
2914
+ answers?: {
2915
+ question: string;
2916
+ value?: (string | (string | null)[]) | null;
2917
+ completed?: boolean | null;
2918
+ context?: unknown | null;
2919
+ pointsAwarded?: number | null;
2920
+ pointsToEarn?: number | null;
2921
+ feedback?: string | null;
2922
+ scoringCriteria?: unknown | null;
2923
+ /** Format: date-time */
2924
+ savedAt?: string;
2925
+ gradedAt?: string | null;
2926
+ gradedBy?: string | null;
2927
+ gradingStatus?: ("graded" | "auto-graded") | null;
2928
+ originalValue?: (string | (string | null)[]) | null;
2929
+ editedBy?: string | null;
2930
+ editedAt?: string | null;
2931
+ masteryTopicId?: string | null;
2932
+ traceIds?: string[] | null;
2933
+ }[];
2807
2934
  };
2808
2935
  };
2809
2936
  };
2810
2937
  responses: never;
2811
2938
  };
2812
- "media.upload": {
2939
+ "exams.sessions.scan": {
2813
2940
  parameters: {
2814
- query?: {
2815
- /** @description Original attachment filename */
2816
- filename?: string;
2817
- /** @description Category of file, used for grouping */
2818
- type?: string;
2819
- /** @description MIME type of the attachment */
2820
- contentType?: string;
2821
- };
2941
+ query?: never;
2822
2942
  header?: never;
2823
- path?: never;
2943
+ path: {
2944
+ id: string;
2945
+ };
2824
2946
  cookie?: never;
2825
2947
  };
2826
2948
  requestBody?: never;
2827
- responses: {
2828
- 200: {
2829
- headers: {
2830
- [name: string]: unknown;
2831
- };
2832
- content: {
2833
- "application/json": {
2834
- /** Format: uri */
2835
- uploadUrl?: string;
2836
- /** Format: uri */
2837
- publicUrl?: string;
2838
- };
2949
+ responses: never;
2950
+ };
2951
+ "exams.sessions.scanDocument": {
2952
+ parameters: {
2953
+ query?: never;
2954
+ header?: never;
2955
+ path: {
2956
+ id: string;
2957
+ };
2958
+ cookie?: never;
2959
+ };
2960
+ requestBody?: {
2961
+ content: {
2962
+ "application/json": {
2963
+ /** Format: uri */
2964
+ documentUrl: string;
2839
2965
  };
2840
2966
  };
2841
2967
  };
2968
+ responses: never;
2842
2969
  };
2843
- "org.get": {
2970
+ "exams.sessions.get": {
2844
2971
  parameters: {
2845
2972
  query?: never;
2846
2973
  header?: never;
2847
- path?: never;
2974
+ path: {
2975
+ id: string;
2976
+ sessionId: string;
2977
+ };
2848
2978
  cookie?: never;
2849
2979
  };
2850
2980
  requestBody?: never;
2851
2981
  responses: never;
2852
2982
  };
2853
- "org.delete": {
2983
+ "exams.sessions.delete": {
2854
2984
  parameters: {
2855
2985
  query?: never;
2856
2986
  header?: never;
2857
- path?: never;
2987
+ path: {
2988
+ id: string;
2989
+ sessionId: string;
2990
+ };
2858
2991
  cookie?: never;
2859
2992
  };
2860
2993
  requestBody?: never;
2861
2994
  responses: never;
2862
2995
  };
2863
- "org.update": {
2996
+ "exams.sessions.saveFeedback": {
2864
2997
  parameters: {
2865
2998
  query?: never;
2866
2999
  header?: never;
2867
- path?: never;
3000
+ path: {
3001
+ id: string;
3002
+ sessionId: string;
3003
+ };
2868
3004
  cookie?: never;
2869
3005
  };
2870
3006
  requestBody?: {
2871
3007
  content: {
2872
3008
  "application/json": {
2873
- name?: string;
2874
- /** Format: uri */
2875
- logoImageUrl?: string;
2876
- menuColor?: string;
2877
- accentColor?: string;
2878
- sharingBlockPublic?: boolean;
2879
- settings?: {
2880
- /** @description Whether users can only see other users in the same groups as them. */
2881
- restrictGroupVisibility?: boolean;
2882
- /** @description Whether the organization blocks public link sharing. */
2883
- sharingBlockPublic?: boolean;
2884
- };
3009
+ /** @description Question ID to provide feedback for */
3010
+ question: string;
3011
+ /** @description Points to award for the answer */
3012
+ pointsAwarded?: number;
3013
+ /** @description Optional teacher feedback for the answer */
3014
+ feedback?: string;
2885
3015
  };
2886
3016
  };
2887
3017
  };
2888
3018
  responses: never;
2889
3019
  };
2890
- "org.customDomain.get": {
3020
+ "exams.sessions.saveOverallFeedback": {
2891
3021
  parameters: {
2892
3022
  query?: never;
2893
3023
  header?: never;
2894
- path?: never;
3024
+ path: {
3025
+ id: string;
3026
+ sessionId: string;
3027
+ };
2895
3028
  cookie?: never;
2896
3029
  };
2897
- requestBody?: never;
3030
+ requestBody?: {
3031
+ content: {
3032
+ "application/json": {
3033
+ /** @description Teacher feedback for the test as a whole */
3034
+ feedback?: string | null;
3035
+ };
3036
+ };
3037
+ };
2898
3038
  responses: never;
2899
3039
  };
2900
- "org.customDomain.update": {
3040
+ "exams.sessions.generateOverallFeedback": {
2901
3041
  parameters: {
2902
3042
  query?: never;
2903
3043
  header?: never;
2904
- path?: never;
3044
+ path: {
3045
+ id: string;
3046
+ sessionId: string;
3047
+ };
2905
3048
  cookie?: never;
2906
3049
  };
2907
- requestBody?: {
2908
- content: {
2909
- "application/json": {
2910
- customDomain?: string | null;
2911
- };
3050
+ requestBody?: never;
3051
+ responses: never;
3052
+ };
3053
+ "exams.sessions.acceptAllSuggestions": {
3054
+ parameters: {
3055
+ query?: never;
3056
+ header?: never;
3057
+ path: {
3058
+ id: string;
3059
+ sessionId: string;
2912
3060
  };
3061
+ cookie?: never;
2913
3062
  };
3063
+ requestBody?: never;
2914
3064
  responses: never;
2915
3065
  };
2916
- "orgs.list": {
3066
+ "exams.sessions.acceptSuggestion": {
2917
3067
  parameters: {
2918
3068
  query?: never;
2919
3069
  header?: never;
2920
- path?: never;
3070
+ path: {
3071
+ id: string;
3072
+ sessionId: string;
3073
+ questionId: string;
3074
+ };
2921
3075
  cookie?: never;
2922
3076
  };
2923
3077
  requestBody?: never;
2924
3078
  responses: never;
2925
3079
  };
2926
- "orgs.create": {
3080
+ "exams.sessions.editAnswer": {
2927
3081
  parameters: {
2928
3082
  query?: never;
2929
3083
  header?: never;
2930
- path?: never;
3084
+ path: {
3085
+ id: string;
3086
+ sessionId: string;
3087
+ questionId: string;
3088
+ };
2931
3089
  cookie?: never;
2932
3090
  };
2933
3091
  requestBody?: {
2934
3092
  content: {
2935
3093
  "application/json": {
2936
- name: string;
3094
+ answer: {
3095
+ question: string;
3096
+ value?: (string | (string | null)[]) | null;
3097
+ completed?: boolean | null;
3098
+ context?: unknown | null;
3099
+ };
3100
+ /** @description Whether to automatically grade the answer after editing */
3101
+ autoGrade?: boolean;
2937
3102
  };
2938
3103
  };
2939
3104
  };
2940
3105
  responses: never;
2941
3106
  };
2942
- "apiKeys.get": {
3107
+ "exams.sessions.comments.list": {
2943
3108
  parameters: {
2944
3109
  query?: never;
2945
3110
  header?: never;
2946
- path?: never;
3111
+ path: {
3112
+ id: string;
3113
+ sessionId: string;
3114
+ };
2947
3115
  cookie?: never;
2948
3116
  };
2949
3117
  requestBody?: never;
2950
3118
  responses: never;
2951
3119
  };
2952
- "apiKeys.reset": {
3120
+ "exams.sessions.comments.create": {
2953
3121
  parameters: {
2954
3122
  query?: never;
2955
3123
  header?: never;
2956
- path?: never;
3124
+ path: {
3125
+ id: string;
3126
+ sessionId: string;
3127
+ };
2957
3128
  cookie?: never;
2958
3129
  };
2959
- requestBody?: never;
3130
+ requestBody?: {
3131
+ content: {
3132
+ "application/json": {
3133
+ value?: string;
3134
+ range?: [
3135
+ number,
3136
+ number
3137
+ ];
3138
+ quotation?: string;
3139
+ inReplyTo?: string;
3140
+ /** @enum {string} */
3141
+ status?: "open" | "resolved";
3142
+ /** @description Question ID the comment is attached to */
3143
+ question: string;
3144
+ };
3145
+ };
3146
+ };
2960
3147
  responses: never;
2961
3148
  };
2962
- "attributes.list": {
3149
+ "exams.sessions.comments.delete": {
2963
3150
  parameters: {
2964
3151
  query?: never;
2965
3152
  header?: never;
2966
- path?: never;
3153
+ path: {
3154
+ id: string;
3155
+ sessionId: string;
3156
+ commentId: string;
3157
+ };
2967
3158
  cookie?: never;
2968
3159
  };
2969
3160
  requestBody?: never;
2970
3161
  responses: never;
2971
3162
  };
2972
- "attributes.create": {
3163
+ "exams.sessions.comments.update": {
2973
3164
  parameters: {
2974
3165
  query?: never;
2975
3166
  header?: never;
2976
- path?: never;
3167
+ path: {
3168
+ id: string;
3169
+ sessionId: string;
3170
+ commentId: string;
3171
+ };
2977
3172
  cookie?: never;
2978
3173
  };
2979
3174
  requestBody?: {
2980
3175
  content: {
2981
3176
  "application/json": {
2982
- name: string;
3177
+ value?: string;
3178
+ range?: [
3179
+ number,
3180
+ number
3181
+ ];
3182
+ quotation?: string;
3183
+ inReplyTo?: string;
2983
3184
  /** @enum {string} */
2984
- attributeType: "string" | "category" | "studentLevel" | "subject";
2985
- options?: string[];
2986
- showInStudentDashboard?: boolean;
2987
- showAsStudentPreference?: boolean;
2988
- position?: number;
2989
- appearanceColor?: (string) | null;
3185
+ status?: "open" | "resolved";
2990
3186
  };
2991
3187
  };
2992
3188
  };
2993
3189
  responses: never;
2994
3190
  };
2995
- "attributes.reorder": {
3191
+ "exams.questions.import": {
2996
3192
  parameters: {
2997
3193
  query?: never;
2998
3194
  header?: never;
2999
- path?: never;
3195
+ path: {
3196
+ id: string;
3197
+ };
3000
3198
  cookie?: never;
3001
3199
  };
3002
3200
  requestBody?: {
3003
3201
  content: {
3004
3202
  "application/json": {
3005
- order: {
3006
- id: string;
3007
- position: number;
3008
- }[];
3203
+ /** @description File name */
3204
+ name?: string;
3205
+ /** @description MIME type of the file, e.g. application/pdf */
3206
+ type?: string;
3207
+ /** @description URL of the file, required if no content is specified. */
3208
+ url?: string;
3209
+ /** @description Content of the file as a string, as an alternative to URL. Only supported for exports from other systems (e.g. Moodle XML). */
3210
+ content?: string;
3211
+ /** @description Whether to keep existing exam settings when importing questions via AI. */
3212
+ keepExistingSettings?: boolean;
3009
3213
  };
3010
3214
  };
3011
3215
  };
3012
3216
  responses: never;
3013
3217
  };
3014
- "attributes.update": {
3218
+ "exams.questions.generate": {
3015
3219
  parameters: {
3016
3220
  query?: never;
3017
3221
  header?: never;
@@ -3023,90 +3227,53 @@ interface operations {
3023
3227
  requestBody?: {
3024
3228
  content: {
3025
3229
  "application/json": {
3026
- name?: string;
3230
+ message: string;
3231
+ questionType?: string;
3027
3232
  /** @enum {string} */
3028
- attributeType?: "string" | "category" | "studentLevel" | "subject";
3029
- options?: string[];
3030
- showInStudentDashboard?: boolean;
3031
- showAsStudentPreference?: boolean;
3032
- position?: number;
3033
- appearanceColor?: (string) | null;
3233
+ format?: "examplary_json" | "qti_v3p0" | "qti_v2p1";
3034
3234
  };
3035
3235
  };
3036
3236
  };
3037
3237
  responses: never;
3038
3238
  };
3039
- "attributes.delete": {
3239
+ "exams.questions.get": {
3040
3240
  parameters: {
3041
- query?: never;
3241
+ query?: {
3242
+ /** @description The format to return the question in. `examplary_json` returns the question in the Examplary JSON format, while `qti_v3p0` and `qti_v2p1` return the question in QTI format version 3 and 2.1 respectively. */
3243
+ format?: "examplary_json" | "qti_v3p0" | "qti_v2p1";
3244
+ };
3042
3245
  header?: never;
3043
3246
  path: {
3247
+ /** @description Exam ID, e.g. `exam_1234`. */
3044
3248
  id: string;
3249
+ /** @description Question ID, e.g. `question_1234`, or `first` to get the first question. */
3250
+ questionId: string;
3045
3251
  };
3046
3252
  cookie?: never;
3047
3253
  };
3048
3254
  requestBody?: never;
3049
3255
  responses: never;
3050
3256
  };
3051
- "taxonomies.list": {
3052
- parameters: {
3053
- query?: never;
3054
- header?: never;
3055
- path?: never;
3056
- cookie?: never;
3057
- };
3058
- requestBody?: never;
3059
- responses: never;
3060
- };
3061
- "taxonomies.create": {
3062
- parameters: {
3063
- query?: never;
3064
- header?: never;
3065
- path?: never;
3066
- cookie?: never;
3067
- };
3068
- requestBody?: {
3069
- content: {
3070
- "application/json": {
3071
- name: string;
3072
- description?: string;
3073
- instructions?: string;
3074
- levels: {
3075
- name?: string;
3076
- instructions?: string;
3077
- }[];
3078
- };
3079
- };
3080
- };
3081
- responses: never;
3082
- };
3083
- "taxonomies.update": {
3257
+ "exams.questions.regenerate": {
3084
3258
  parameters: {
3085
3259
  query?: never;
3086
3260
  header?: never;
3087
3261
  path: {
3088
3262
  id: string;
3263
+ questionId: string;
3089
3264
  };
3090
3265
  cookie?: never;
3091
3266
  };
3092
3267
  requestBody?: {
3093
3268
  content: {
3094
3269
  "application/json": {
3095
- name: string;
3096
- description?: string;
3097
- instructions?: string;
3098
- levels: {
3099
- name?: string;
3100
- instructions?: string;
3101
- }[];
3102
- } & {
3103
- [key: string]: unknown;
3270
+ message: string;
3104
3271
  };
3105
3272
  };
3106
3273
  };
3107
3274
  responses: never;
3108
3275
  };
3109
- "taxonomies.delete": {
3276
+ "exams.export.qti3Zip": {
3110
3277
  parameters: {
3111
3278
  query?: never;
3112
3279
  header?: never;
@@ -3116,252 +3283,291 @@ interface operations {
3116
3283
  cookie?: never;
3117
3284
  };
3118
3285
  requestBody?: never;
3119
- responses: never;
3120
- };
3121
- "permissions.autocomplete": {
3122
- parameters: {
3123
- query: {
3124
- /** @description Search query (min 3 characters) */
3125
- q: string;
3126
- /** @description Type of entity to search */
3127
- type?: "user" | "group";
3128
- };
3129
- header?: never;
3130
- path?: never;
3131
- cookie?: never;
3132
- };
3133
- requestBody?: never;
3134
3286
  responses: {
3135
- /** @description List of matching users and groups. */
3287
+ /** @description URL to download the exported QTI ZIP package. */
3136
3288
  200: {
3137
3289
  headers: {
3138
3290
  [name: string]: unknown;
3139
3291
  };
3140
- content?: never;
3141
- };
3142
- /** @description Query must be at least 3 characters. */
3143
- 400: {
3144
- headers: {
3145
- [name: string]: unknown;
3292
+ content: {
3293
+ "application/json": {
3294
+ /**
3295
+ * Format: uri
3296
+ * @description URL to download the exported QTI ZIP package.
3297
+ */
3298
+ url: string;
3299
+ };
3146
3300
  };
3147
- content?: never;
3148
3301
  };
3149
3302
  };
3150
3303
  };
3151
- "permissions.list": {
3304
+ "exams.export.qti21Zip": {
3152
3305
  parameters: {
3153
3306
  query?: never;
3154
3307
  header?: never;
3155
3308
  path: {
3156
- /** @description The ID of the resource to list permissions for, e.g. `exam_1234`. */
3157
- resource: string;
3309
+ id: string;
3158
3310
  };
3159
3311
  cookie?: never;
3160
3312
  };
3161
3313
  requestBody?: never;
3162
3314
  responses: {
3163
- /** @description List of permissions for the specified resource. */
3315
+ /** @description URL to download the exported QTI ZIP package. */
3164
3316
  200: {
3165
3317
  headers: {
3166
3318
  [name: string]: unknown;
3167
3319
  };
3168
3320
  content: {
3169
3321
  "application/json": {
3170
- actor: {
3171
- id: string;
3172
- name?: string;
3173
- /** Format: uri */
3174
- avatar?: string;
3175
- /** @enum {string} */
3176
- type: "user" | "group" | "org";
3177
- /** @enum {string} */
3178
- orgRole?: "owner" | "admin" | "teacher" | "student" | "member";
3179
- };
3180
- /** @enum {string} */
3181
- role: "owner" | "manager" | "editor" | "viewer" | "participant";
3182
- /** Format: date-time */
3183
- createdAt: string;
3184
- /** Format: date-time */
3185
- updatedAt: string;
3186
- createdBy: string;
3187
- }[];
3322
+ /**
3323
+ * Format: uri
3324
+ * @description URL to download the exported QTI ZIP package.
3325
+ */
3326
+ url: string;
3327
+ };
3188
3328
  };
3189
3329
  };
3190
- /** @description No access to this resource. */
3191
- 403: {
3192
- headers: {
3193
- [name: string]: unknown;
3194
- };
3195
- content?: never;
3330
+ };
3331
+ };
3332
+ "exams.list": {
3333
+ parameters: {
3334
+ query?: {
3335
+ /** @description Optional filter by folder ID, e.g. `folder_1234`. */
3336
+ folder?: string;
3337
+ /** @description Optional filter by permission role. */
3338
+ role?: "owner" | "manager" | "editor" | "viewer" | "participant";
3196
3339
  };
3340
+ header?: never;
3341
+ path?: never;
3342
+ cookie?: never;
3197
3343
  };
3344
+ requestBody?: never;
3345
+ responses: never;
3198
3346
  };
3199
- "permissions.assign": {
3347
+ "exams.create": {
3200
3348
  parameters: {
3201
3349
  query?: never;
3202
3350
  header?: never;
3203
- path: {
3204
- /** @description The ID of the resource to assign the permission on, e.g. `exam_1234`. */
3205
- resource: string;
3206
- };
3351
+ path?: never;
3207
3352
  cookie?: never;
3208
3353
  };
3209
3354
  requestBody?: {
3210
3355
  content: {
3211
3356
  "application/json": {
3212
- /** @description The ID of the actor to assign the permission to, e.g. `user_1234`, `group_1234` or `org_1234`. */
3213
- actor: string;
3214
- /** @enum {string} */
3215
- role: "owner" | "manager" | "editor" | "viewer" | "participant";
3216
- } | {
3217
- /**
3218
- * Format: email
3219
- * @description The email of the user to add or invite.
3220
- */
3221
- email: string;
3222
- /** @enum {string} */
3223
- role: "owner" | "manager" | "editor" | "viewer" | "participant";
3224
- /**
3225
- * @description Whether to send an invitation email if the user does not exist. Defaults to false.
3226
- * @default false
3227
- */
3228
- sendInvite?: boolean;
3229
- };
3230
- };
3231
- };
3232
- responses: {
3233
- /** @description The created or updated permission. */
3234
- 201: {
3235
- headers: {
3236
- [name: string]: unknown;
3237
- };
3238
- content: {
3239
- "application/json": {
3240
- actor: {
3241
- id: string;
3242
- name?: string;
3243
- /** Format: uri */
3244
- avatar?: string;
3245
- /** @enum {string} */
3246
- type: "user" | "group" | "org";
3247
- /** @enum {string} */
3248
- orgRole?: "owner" | "admin" | "teacher" | "student" | "member";
3357
+ name: string;
3358
+ sourceMaterialIds?: string[] | null;
3359
+ context?: string | null;
3360
+ studentLevel?: string | null;
3361
+ subject?: string | null;
3362
+ language?: string | null;
3363
+ taxonomyId?: string | null;
3364
+ intendedDuration?: unknown | null;
3365
+ allowedGenerationQuestionTypes?: string[] | null;
3366
+ metadata?: {
3367
+ [key: string]: string | number | boolean | null;
3368
+ } | null;
3369
+ questions?: ({
3370
+ /** @description Question ID */
3371
+ id?: string;
3372
+ /** @description ID of the question type */
3373
+ type?: string;
3374
+ /** @description Title for the question (stem) */
3375
+ title?: string | null;
3376
+ /** @description Optional description for the question */
3377
+ description?: string | null;
3378
+ /** @description Settings for the question, often specific to the question type */
3379
+ settings?: {
3380
+ [key: string]: unknown;
3249
3381
  };
3382
+ /** @description Scoring configuration for the question */
3383
+ scoring?: {
3384
+ /** @description The type of rubric. Different rubric types have different shapes. */
3385
+ rubricType?: ("simple" | "analytical" | "holistic" | "exact-values") | null;
3386
+ /** @description The criteria for scoring the question. For 'simple' rubric type, criteria have no levels, and their points stack (total = sum of points for all criteria that apply). For 'analytical' rubric type, there should be at least one criteria, with levels. For each criteria, a matching level is picked. For 'holistic' rubric type, there should be multiple criteria, without levels (score = single selected criteria). For 'exact-values' rubric type, each criteria represents a specific value that must be matched exactly. */
3387
+ criteria?: {
3388
+ id: string;
3389
+ /** @description The title of the scoring criterion or level. Only applies to analytical levels and holistic criteria. */
3390
+ title?: string | null;
3391
+ /** @description The description of the scoring criterion or level. For analytical levels, this describes the specific requirements to earn the points for that level. For holistic criteria, this describes the overall requirement to earn the points for that criterion. */
3392
+ description?: string | null;
3393
+ /** @description The default amount of points to assign if this criterion or level is selected. */
3394
+ points?: number | null;
3395
+ /** @description The minimum amount of points that can be assigned if this criterion or level is selected. */
3396
+ minPoints?: number | null;
3397
+ /** @description The maximum amount of points that can be assigned if this criterion or level is selected. */
3398
+ maxPoints?: number | null;
3399
+ /** @description The levels of a analytical rubric criterion. Each level represents a different point value and description for the same criterion. */
3400
+ levels?: {
3401
+ id: string;
3402
+ /** @description The title of the scoring criterion or level. Only applies to analytical levels and holistic criteria. */
3403
+ title?: string | null;
3404
+ /** @description The description of the scoring criterion or level. For analytical levels, this describes the specific requirements to earn the points for that level. For holistic criteria, this describes the overall requirement to earn the points for that criterion. */
3405
+ description?: string | null;
3406
+ /** @description The default amount of points to assign if this criterion or level is selected. */
3407
+ points?: number | null;
3408
+ /** @description The minimum amount of points that can be assigned if this criterion or level is selected. */
3409
+ minPoints?: number | null;
3410
+ /** @description The maximum amount of points that can be assigned if this criterion or level is selected. */
3411
+ maxPoints?: number | null;
3412
+ }[] | null;
3413
+ }[] | null;
3414
+ /** @description Whether exact values matching should be case insensitive. Only applicable for 'exact-values' rubric type. */
3415
+ exactValuesCaseInsensitive?: boolean | null;
3416
+ /** @description Optional additional grading guidance text. */
3417
+ guidance?: string | null;
3418
+ /** @description Optional example model answer text to show to graders. */
3419
+ modelAnswer?: string | null;
3420
+ /** @description The ID of the scoring template applied, if any. */
3421
+ templateId?: string | null;
3422
+ } | null;
3423
+ /** @description Tags associated with the question for categorization and search */
3424
+ tags?: string[] | null;
3425
+ /** @description Optional external ID for the question, used to link to external systems */
3426
+ externalId?: string | null;
3427
+ /** @description Metadata for the question */
3428
+ metadata?: {
3429
+ [key: string]: string | number | boolean | null;
3430
+ } | null;
3431
+ /** @description Version number, incremented when question is edited */
3432
+ v?: number | null;
3433
+ /** @description ID of the question in the question bank */
3434
+ questionBankItemId?: string | null;
3435
+ /** @description Trace IDs for internal tracking of AI generation processes */
3436
+ traceIds?: string[] | null;
3437
+ } & {
3438
+ [key: string]: unknown;
3439
+ })[] | null;
3440
+ permissions?: {
3441
+ actor: string;
3250
3442
  /** @enum {string} */
3251
3443
  role: "owner" | "manager" | "editor" | "viewer" | "participant";
3252
- /** Format: date-time */
3253
- createdAt: string;
3254
- /** Format: date-time */
3255
- updatedAt: string;
3256
- createdBy: string;
3257
- };
3444
+ }[] | null;
3258
3445
  };
3259
3446
  };
3260
- /** @description No access to manage this resource. */
3261
- 403: {
3262
- headers: {
3263
- [name: string]: unknown;
3447
+ };
3448
+ responses: never;
3449
+ };
3450
+ "exams.import": {
3451
+ parameters: {
3452
+ query?: never;
3453
+ header?: never;
3454
+ path?: never;
3455
+ cookie?: never;
3456
+ };
3457
+ requestBody?: {
3458
+ content: {
3459
+ "application/json": {
3460
+ name: string;
3461
+ sourceMaterialIds?: string[];
3264
3462
  };
3265
- content?: never;
3266
3463
  };
3267
3464
  };
3465
+ responses: never;
3268
3466
  };
3269
- "permissions.getActorRole": {
3467
+ "exams.get": {
3270
3468
  parameters: {
3271
3469
  query?: never;
3272
3470
  header?: never;
3273
3471
  path: {
3274
- /** @description The ID of the actor to check role for, e.g. `user_abcd`. */
3275
- actor: ((string) | "me") | string;
3276
- /** @description The ID of the resource to check role for, e.g. `exam_1234`. */
3277
- resource: string;
3472
+ id: string;
3278
3473
  };
3279
3474
  cookie?: never;
3280
3475
  };
3281
3476
  requestBody?: never;
3282
- responses: {
3283
- /** @description Role of the specified actor for the specified resource. */
3284
- 200: {
3285
- headers: {
3286
- [name: string]: unknown;
3287
- };
3288
- content: {
3289
- "application/json": {
3290
- actor: {
3291
- id: string;
3292
- name?: string;
3293
- /** Format: uri */
3294
- avatar?: string;
3295
- /** @enum {string} */
3296
- type: "user" | "group" | "org";
3297
- /** @enum {string} */
3298
- orgRole?: "owner" | "admin" | "teacher" | "student" | "member";
3299
- };
3300
- /** @enum {string} */
3301
- role: "owner" | "manager" | "editor" | "viewer" | "participant";
3302
- /** Format: date-time */
3303
- createdAt: string;
3304
- /** Format: date-time */
3305
- updatedAt: string;
3306
- createdBy: string;
3307
- };
3308
- };
3477
+ responses: never;
3478
+ };
3479
+ "exams.update": {
3480
+ parameters: {
3481
+ query?: never;
3482
+ header?: never;
3483
+ path: {
3484
+ id: string;
3309
3485
  };
3310
- /** @description No access to this resource. */
3311
- 403: {
3312
- headers: {
3313
- [name: string]: unknown;
3314
- };
3315
- content?: never;
3486
+ cookie?: never;
3487
+ };
3488
+ requestBody?: never;
3489
+ responses: never;
3490
+ };
3491
+ "exams.delete": {
3492
+ parameters: {
3493
+ query?: never;
3494
+ header?: never;
3495
+ path: {
3496
+ id: string;
3316
3497
  };
3317
- /** @description The specified actor has no access to the specified resource. */
3318
- 404: {
3319
- headers: {
3320
- [name: string]: unknown;
3498
+ cookie?: never;
3499
+ };
3500
+ requestBody?: never;
3501
+ responses: never;
3502
+ };
3503
+ "exams.duplicate": {
3504
+ parameters: {
3505
+ query?: never;
3506
+ header?: never;
3507
+ path: {
3508
+ id: string;
3509
+ };
3510
+ cookie?: never;
3511
+ };
3512
+ requestBody?: {
3513
+ content: {
3514
+ "application/json": {
3515
+ name: string;
3516
+ includeSessions?: boolean;
3321
3517
  };
3322
- content?: never;
3323
3518
  };
3324
3519
  };
3520
+ responses: never;
3325
3521
  };
3326
- "permissions.delete": {
3522
+ "exams.print": {
3327
3523
  parameters: {
3328
3524
  query?: never;
3329
3525
  header?: never;
3330
3526
  path: {
3331
- resource: string;
3332
- actor: (string) | string;
3527
+ id: string;
3528
+ };
3529
+ cookie?: never;
3530
+ };
3531
+ requestBody?: never;
3532
+ responses: never;
3533
+ };
3534
+ "exams.startGeneration": {
3535
+ parameters: {
3536
+ query?: never;
3537
+ header?: never;
3538
+ path: {
3539
+ id: string;
3540
+ };
3541
+ cookie?: never;
3542
+ };
3543
+ requestBody?: never;
3544
+ responses: never;
3545
+ };
3546
+ "exams.cancelGeneration": {
3547
+ parameters: {
3548
+ query?: never;
3549
+ header?: never;
3550
+ path: {
3551
+ id: string;
3333
3552
  };
3334
3553
  cookie?: never;
3335
3554
  };
3336
3555
  requestBody?: never;
3337
- responses: {
3338
- /** @description Permission successfully removed. */
3339
- 200: {
3340
- headers: {
3341
- [name: string]: unknown;
3342
- };
3343
- content?: never;
3344
- };
3345
- /** @description No access to manage this resource. */
3346
- 403: {
3347
- headers: {
3348
- [name: string]: unknown;
3349
- };
3350
- content?: never;
3351
- };
3352
- };
3556
+ responses: never;
3353
3557
  };
3354
- "studentLevels.list": {
3558
+ "exams.getContextSuggestions": {
3355
3559
  parameters: {
3356
3560
  query?: never;
3357
3561
  header?: never;
3358
- path?: never;
3562
+ path: {
3563
+ id: string;
3564
+ };
3359
3565
  cookie?: never;
3360
3566
  };
3361
3567
  requestBody?: never;
3362
3568
  responses: never;
3363
3569
  };
3364
- "users.list": {
3570
+ "me.get": {
3365
3571
  parameters: {
3366
3572
  query?: never;
3367
3573
  header?: never;
@@ -3371,7 +3577,7 @@ interface operations {
3371
3577
  requestBody?: never;
3372
3578
  responses: never;
3373
3579
  };
3374
- "users.create": {
3580
+ "me.update": {
3375
3581
  parameters: {
3376
3582
  query?: never;
3377
3583
  header?: never;
@@ -3381,272 +3587,222 @@ interface operations {
3381
3587
  requestBody?: {
3382
3588
  content: {
3383
3589
  "application/json": {
3384
- /** Format: email */
3385
- email: string;
3590
+ /** @description The user's name */
3386
3591
  name?: string;
3387
- /**
3388
- * @default teacher
3389
- * @enum {string}
3390
- */
3391
- role?: "owner" | "admin" | "teacher" | "student" | "member";
3392
- /**
3393
- * @description Whether to send an invitation email. Defaults to false.
3394
- * @default false
3395
- */
3396
- sendInvite?: boolean;
3592
+ /** @description A map of user preferences */
3593
+ preferences?: {
3594
+ [key: string]: unknown;
3595
+ };
3397
3596
  };
3398
3597
  };
3399
3598
  };
3400
3599
  responses: never;
3401
3600
  };
3402
- "users.delete": {
3601
+ "media.upload": {
3403
3602
  parameters: {
3404
- query?: never;
3405
- header?: never;
3406
- path: {
3407
- id: string;
3603
+ query?: {
3604
+ /** @description Original attachment filename */
3605
+ filename?: string;
3606
+ /** @description Category of file, used for grouping */
3607
+ type?: string;
3608
+ /** @description MIME type of the attachment */
3609
+ contentType?: string;
3408
3610
  };
3611
+ header?: never;
3612
+ path?: never;
3409
3613
  cookie?: never;
3410
3614
  };
3411
3615
  requestBody?: never;
3412
- responses: never;
3616
+ responses: {
3617
+ 200: {
3618
+ headers: {
3619
+ [name: string]: unknown;
3620
+ };
3621
+ content: {
3622
+ "application/json": {
3623
+ /** Format: uri */
3624
+ uploadUrl?: string;
3625
+ /** Format: uri */
3626
+ publicUrl?: string;
3627
+ };
3628
+ };
3629
+ };
3630
+ };
3413
3631
  };
3414
- "users.update": {
3632
+ "org.get": {
3415
3633
  parameters: {
3416
3634
  query?: never;
3417
3635
  header?: never;
3418
- path: {
3419
- id: string;
3420
- };
3636
+ path?: never;
3421
3637
  cookie?: never;
3422
3638
  };
3423
3639
  requestBody?: never;
3424
3640
  responses: never;
3425
3641
  };
3426
- "exams.sessions.list": {
3642
+ "org.delete": {
3427
3643
  parameters: {
3428
3644
  query?: never;
3429
3645
  header?: never;
3430
- path: {
3431
- id: string;
3432
- };
3646
+ path?: never;
3433
3647
  cookie?: never;
3434
3648
  };
3435
3649
  requestBody?: never;
3436
3650
  responses: never;
3437
3651
  };
3438
- "exams.sessions.import": {
3652
+ "org.update": {
3439
3653
  parameters: {
3440
3654
  query?: never;
3441
3655
  header?: never;
3442
- path: {
3443
- id: string;
3444
- };
3656
+ path?: never;
3445
3657
  cookie?: never;
3446
3658
  };
3447
3659
  requestBody?: {
3448
3660
  content: {
3449
3661
  "application/json": {
3450
- studentName: string;
3451
- /**
3452
- * @default manual
3453
- * @enum {string}
3454
- */
3455
- source?: "online-assessment" | "document-scanner" | "answer-bot" | "manual";
3456
- answers?: {
3457
- question: string;
3458
- value?: (string | (string | null)[]) | null;
3459
- completed?: boolean | null;
3460
- context?: unknown | null;
3461
- pointsAwarded?: number | null;
3462
- pointsToEarn?: number | null;
3463
- feedback?: string | null;
3464
- scoringCriteria?: unknown | null;
3465
- /** Format: date-time */
3466
- savedAt?: string;
3467
- gradedAt?: string | null;
3468
- gradedBy?: string | null;
3469
- gradingStatus?: ("graded" | "auto-graded") | null;
3470
- originalValue?: (string | (string | null)[]) | null;
3471
- editedBy?: string | null;
3472
- editedAt?: string | null;
3473
- masteryTopicId?: string | null;
3474
- traceIds?: string[] | null;
3475
- }[];
3662
+ name?: string;
3663
+ /** Format: uri */
3664
+ logoImageUrl?: string;
3665
+ menuColor?: string;
3666
+ accentColor?: string;
3667
+ sharingBlockPublic?: boolean;
3668
+ settings?: {
3669
+ /** @description Whether users can only see other users in the same groups as them. */
3670
+ restrictGroupVisibility?: boolean;
3671
+ /** @description Whether the organization blocks public link sharing. */
3672
+ sharingBlockPublic?: boolean;
3673
+ /** @description Whether the organization blocks teachers from inviting new users. */
3674
+ sharingBlockTeachersInvitingUsers?: boolean;
3675
+ };
3476
3676
  };
3477
3677
  };
3478
3678
  };
3479
3679
  responses: never;
3480
3680
  };
3481
- "exams.sessions.scan": {
3681
+ "org.customDomain.get": {
3482
3682
  parameters: {
3483
3683
  query?: never;
3484
3684
  header?: never;
3485
- path: {
3486
- id: string;
3487
- };
3685
+ path?: never;
3488
3686
  cookie?: never;
3489
3687
  };
3490
3688
  requestBody?: never;
3491
3689
  responses: never;
3492
3690
  };
3493
- "exams.sessions.scanDocument": {
3691
+ "org.customDomain.update": {
3494
3692
  parameters: {
3495
3693
  query?: never;
3496
3694
  header?: never;
3497
- path: {
3498
- id: string;
3499
- };
3695
+ path?: never;
3500
3696
  cookie?: never;
3501
3697
  };
3502
3698
  requestBody?: {
3503
3699
  content: {
3504
3700
  "application/json": {
3505
- /** Format: uri */
3506
- documentUrl: string;
3701
+ customDomain?: string | null;
3507
3702
  };
3508
3703
  };
3509
3704
  };
3510
3705
  responses: never;
3511
3706
  };
3512
- "exams.sessions.get": {
3513
- parameters: {
3514
- query?: never;
3515
- header?: never;
3516
- path: {
3517
- id: string;
3518
- sessionId: string;
3519
- };
3520
- cookie?: never;
3521
- };
3522
- requestBody?: never;
3523
- responses: never;
3524
- };
3525
- "exams.sessions.delete": {
3707
+ "orgs.list": {
3526
3708
  parameters: {
3527
3709
  query?: never;
3528
3710
  header?: never;
3529
- path: {
3530
- id: string;
3531
- sessionId: string;
3532
- };
3711
+ path?: never;
3533
3712
  cookie?: never;
3534
3713
  };
3535
3714
  requestBody?: never;
3536
3715
  responses: never;
3537
3716
  };
3538
- "exams.sessions.saveFeedback": {
3717
+ "orgs.create": {
3539
3718
  parameters: {
3540
3719
  query?: never;
3541
3720
  header?: never;
3542
- path: {
3543
- id: string;
3544
- sessionId: string;
3545
- };
3721
+ path?: never;
3546
3722
  cookie?: never;
3547
3723
  };
3548
3724
  requestBody?: {
3549
3725
  content: {
3550
3726
  "application/json": {
3551
- /** @description Question ID to provide feedback for */
3552
- question: string;
3553
- /** @description Points to award for the answer */
3554
- pointsAwarded?: number;
3555
- /** @description Optional teacher feedback for the answer */
3556
- feedback?: string;
3727
+ name: string;
3557
3728
  };
3558
3729
  };
3559
3730
  };
3560
3731
  responses: never;
3561
3732
  };
3562
- "exams.sessions.saveOverallFeedback": {
3733
+ "apiKeys.get": {
3563
3734
  parameters: {
3564
3735
  query?: never;
3565
3736
  header?: never;
3566
- path: {
3567
- id: string;
3568
- sessionId: string;
3569
- };
3737
+ path?: never;
3570
3738
  cookie?: never;
3571
3739
  };
3572
- requestBody?: {
3573
- content: {
3574
- "application/json": {
3575
- /** @description Teacher feedback for the test as a whole */
3576
- feedback?: string | null;
3577
- };
3578
- };
3579
- };
3740
+ requestBody?: never;
3580
3741
  responses: never;
3581
3742
  };
3582
- "exams.sessions.generateOverallFeedback": {
3743
+ "apiKeys.reset": {
3583
3744
  parameters: {
3584
3745
  query?: never;
3585
3746
  header?: never;
3586
- path: {
3587
- id: string;
3588
- sessionId: string;
3589
- };
3747
+ path?: never;
3590
3748
  cookie?: never;
3591
3749
  };
3592
3750
  requestBody?: never;
3593
3751
  responses: never;
3594
3752
  };
3595
- "exams.sessions.acceptAllSuggestions": {
3753
+ "attributes.list": {
3596
3754
  parameters: {
3597
3755
  query?: never;
3598
3756
  header?: never;
3599
- path: {
3600
- id: string;
3601
- sessionId: string;
3602
- };
3757
+ path?: never;
3603
3758
  cookie?: never;
3604
3759
  };
3605
3760
  requestBody?: never;
3606
3761
  responses: never;
3607
3762
  };
3608
- "exams.sessions.acceptSuggestion": {
3763
+ "attributes.create": {
3609
3764
  parameters: {
3610
3765
  query?: never;
3611
3766
  header?: never;
3612
- path: {
3613
- id: string;
3614
- sessionId: string;
3615
- questionId: string;
3616
- };
3767
+ path?: never;
3617
3768
  cookie?: never;
3618
3769
  };
3619
- requestBody?: never;
3770
+ requestBody?: {
3771
+ content: {
3772
+ "application/json": {
3773
+ name: string;
3774
+ /** @enum {string} */
3775
+ attributeType: "string" | "category" | "studentLevel" | "subject";
3776
+ options?: string[];
3777
+ showInStudentDashboard?: boolean;
3778
+ showAsStudentPreference?: boolean;
3779
+ position?: number;
3780
+ appearanceColor?: (string) | null;
3781
+ };
3782
+ };
3783
+ };
3620
3784
  responses: never;
3621
3785
  };
3622
- "exams.sessions.editAnswer": {
3786
+ "attributes.reorder": {
3623
3787
  parameters: {
3624
3788
  query?: never;
3625
3789
  header?: never;
3626
- path: {
3627
- id: string;
3628
- sessionId: string;
3629
- questionId: string;
3630
- };
3790
+ path?: never;
3631
3791
  cookie?: never;
3632
3792
  };
3633
3793
  requestBody?: {
3634
3794
  content: {
3635
3795
  "application/json": {
3636
- answer: {
3637
- question: string;
3638
- value?: (string | (string | null)[]) | null;
3639
- completed?: boolean | null;
3640
- context?: unknown | null;
3641
- };
3642
- /** @description Whether to automatically grade the answer after editing */
3643
- autoGrade?: boolean;
3796
+ order: {
3797
+ id: string;
3798
+ position: number;
3799
+ }[];
3644
3800
  };
3645
3801
  };
3646
3802
  };
3647
3803
  responses: never;
3648
3804
  };
3649
- "exams.questions.import": {
3805
+ "attributes.update": {
3650
3806
  parameters: {
3651
3807
  query?: never;
3652
3808
  header?: never;
@@ -3658,22 +3814,20 @@ interface operations {
3658
3814
  requestBody?: {
3659
3815
  content: {
3660
3816
  "application/json": {
3661
- /** @description File name */
3662
3817
  name?: string;
3663
- /** @description MIME type of the file, e.g. application/pdf */
3664
- type?: string;
3665
- /** @description URL of the file, required if no content is specified. */
3666
- url?: string;
3667
- /** @description Content of the file as a string, as an alternative to URL. Only supported for exports from other systems (e.g. Moodle XML). */
3668
- content?: string;
3669
- /** @description Whether to keep existing exam settings when importing questions via AI. */
3670
- keepExistingSettings?: boolean;
3818
+ /** @enum {string} */
3819
+ attributeType?: "string" | "category" | "studentLevel" | "subject";
3820
+ options?: string[];
3821
+ showInStudentDashboard?: boolean;
3822
+ showAsStudentPreference?: boolean;
3823
+ position?: number;
3824
+ appearanceColor?: (string) | null;
3671
3825
  };
3672
3826
  };
3673
3827
  };
3674
3828
  responses: never;
3675
3829
  };
3676
- "exams.questions.generate": {
3830
+ "attributes.delete": {
3677
3831
  parameters: {
3678
3832
  query?: never;
3679
3833
  header?: never;
@@ -3682,54 +3836,68 @@ interface operations {
3682
3836
  };
3683
3837
  cookie?: never;
3684
3838
  };
3685
- requestBody?: {
3686
- content: {
3687
- "application/json": {
3688
- message: string;
3689
- questionType?: string;
3690
- };
3691
- };
3692
- };
3839
+ requestBody?: never;
3693
3840
  responses: never;
3694
3841
  };
3695
- "exams.questions.get": {
3842
+ "taxonomies.list": {
3696
3843
  parameters: {
3697
- query?: {
3698
- /** @description The format to return the question in. `examplary_json` returns the question in the Examplary JSON format, while `qti_v3p0` and `qti_v2p1` return the question in QTI format version 3 and 2.1 respectively. */
3699
- format?: "examplary_json" | "qti_v3p0" | "qti_v2p1";
3700
- };
3844
+ query?: never;
3701
3845
  header?: never;
3702
- path: {
3703
- /** @description Exam ID, e.g. `exam_1234`. */
3704
- id: string;
3705
- /** @description Question ID, e.g. `question_1234`, or `first` to get the first question. */
3706
- questionId: string;
3707
- };
3846
+ path?: never;
3708
3847
  cookie?: never;
3709
3848
  };
3710
3849
  requestBody?: never;
3711
3850
  responses: never;
3712
3851
  };
3713
- "exams.questions.regenerate": {
3852
+ "taxonomies.create": {
3853
+ parameters: {
3854
+ query?: never;
3855
+ header?: never;
3856
+ path?: never;
3857
+ cookie?: never;
3858
+ };
3859
+ requestBody?: {
3860
+ content: {
3861
+ "application/json": {
3862
+ name: string;
3863
+ description?: string;
3864
+ instructions?: string;
3865
+ levels: {
3866
+ name?: string;
3867
+ instructions?: string;
3868
+ }[];
3869
+ };
3870
+ };
3871
+ };
3872
+ responses: never;
3873
+ };
3874
+ "taxonomies.update": {
3714
3875
  parameters: {
3715
3876
  query?: never;
3716
3877
  header?: never;
3717
3878
  path: {
3718
3879
  id: string;
3719
- questionId: string;
3720
3880
  };
3721
3881
  cookie?: never;
3722
3882
  };
3723
3883
  requestBody?: {
3724
3884
  content: {
3725
3885
  "application/json": {
3726
- message: string;
3886
+ name: string;
3887
+ description?: string;
3888
+ instructions?: string;
3889
+ levels: {
3890
+ name?: string;
3891
+ instructions?: string;
3892
+ }[];
3893
+ } & {
3894
+ [key: string]: unknown;
3727
3895
  };
3728
3896
  };
3729
3897
  };
3730
3898
  responses: never;
3731
3899
  };
3732
- "exams.export.qti3Zip": {
3900
+ "taxonomies.delete": {
3733
3901
  parameters: {
3734
3902
  query?: never;
3735
3903
  header?: never;
@@ -3739,267 +3907,290 @@ interface operations {
3739
3907
  cookie?: never;
3740
3908
  };
3741
3909
  requestBody?: never;
3910
+ responses: never;
3911
+ };
3912
+ "permissions.autocomplete": {
3913
+ parameters: {
3914
+ query: {
3915
+ /** @description Search query (min 3 characters) */
3916
+ q: string;
3917
+ /** @description Type of entity to search */
3918
+ type?: "user" | "group";
3919
+ };
3920
+ header?: never;
3921
+ path?: never;
3922
+ cookie?: never;
3923
+ };
3924
+ requestBody?: never;
3742
3925
  responses: {
3743
- /** @description URL to download the exported QTI ZIP package. */
3926
+ /** @description List of matching users and groups. */
3744
3927
  200: {
3745
3928
  headers: {
3746
3929
  [name: string]: unknown;
3747
3930
  };
3748
- content: {
3749
- "application/json": {
3750
- /**
3751
- * Format: uri
3752
- * @description URL to download the exported QTI ZIP package.
3753
- */
3754
- url: string;
3755
- };
3931
+ content?: never;
3932
+ };
3933
+ /** @description Query must be at least 3 characters. */
3934
+ 400: {
3935
+ headers: {
3936
+ [name: string]: unknown;
3756
3937
  };
3938
+ content?: never;
3757
3939
  };
3758
3940
  };
3759
3941
  };
3760
- "exams.export.qti21Zip": {
3942
+ "permissions.list": {
3761
3943
  parameters: {
3762
3944
  query?: never;
3763
3945
  header?: never;
3764
3946
  path: {
3765
- id: string;
3947
+ /** @description The ID of the resource to list permissions for, e.g. `exam_1234`. */
3948
+ resource: string;
3766
3949
  };
3767
3950
  cookie?: never;
3768
3951
  };
3769
3952
  requestBody?: never;
3770
3953
  responses: {
3771
- /** @description URL to download the exported QTI ZIP package. */
3954
+ /** @description List of permissions for the specified resource. */
3772
3955
  200: {
3773
3956
  headers: {
3774
3957
  [name: string]: unknown;
3775
3958
  };
3776
3959
  content: {
3777
3960
  "application/json": {
3778
- /**
3779
- * Format: uri
3780
- * @description URL to download the exported QTI ZIP package.
3781
- */
3782
- url: string;
3783
- };
3784
- };
3785
- };
3786
- };
3787
- };
3788
- "exams.list": {
3789
- parameters: {
3790
- query?: {
3791
- /** @description Optional filter by folder ID, e.g. `folder_1234`. */
3792
- folder?: string;
3793
- /** @description Optional filter by permission role. */
3794
- role?: "owner" | "manager" | "editor" | "viewer" | "participant";
3795
- };
3796
- header?: never;
3797
- path?: never;
3798
- cookie?: never;
3799
- };
3800
- requestBody?: never;
3801
- responses: never;
3802
- };
3803
- "exams.create": {
3804
- parameters: {
3805
- query?: never;
3806
- header?: never;
3807
- path?: never;
3808
- cookie?: never;
3809
- };
3810
- requestBody?: {
3811
- content: {
3812
- "application/json": {
3813
- name: string;
3814
- sourceMaterialIds?: string[] | null;
3815
- context?: string | null;
3816
- studentLevel?: string | null;
3817
- subject?: string | null;
3818
- language?: string | null;
3819
- taxonomyId?: string | null;
3820
- intendedDuration?: unknown | null;
3821
- allowedGenerationQuestionTypes?: string[] | null;
3822
- metadata?: {
3823
- [key: string]: string | number | boolean | null;
3824
- } | null;
3825
- questions?: ({
3826
- /** @description Question ID */
3827
- id?: string;
3828
- /** @description ID of the question type */
3829
- type?: string;
3830
- /** @description Title for the question (stem) */
3831
- title?: string | null;
3832
- /** @description Optional description for the question */
3833
- description?: string | null;
3834
- /** @description Settings for the question, often specific to the question type */
3835
- settings?: {
3836
- [key: string]: unknown;
3961
+ actor: {
3962
+ id: string;
3963
+ name?: string;
3964
+ /** Format: uri */
3965
+ avatar?: string;
3966
+ /** @enum {string} */
3967
+ type: "user" | "group" | "org";
3968
+ /** @enum {string} */
3969
+ orgRole?: "owner" | "admin" | "teacher" | "student" | "member";
3837
3970
  };
3838
- /** @description Scoring configuration for the question */
3839
- scoring?: {
3840
- /** @description The type of rubric. Different rubric types have different shapes. */
3841
- rubricType?: ("simple" | "analytical" | "holistic" | "exact-values") | null;
3842
- /** @description The criteria for scoring the question. For 'simple' rubric type, criteria have no levels, and their points stack (total = sum of points for all criteria that apply). For 'analytical' rubric type, there should be at least one criteria, with levels. For each criteria, a matching level is picked. For 'holistic' rubric type, there should be multiple criteria, without levels (score = single selected criteria). For 'exact-values' rubric type, each criteria represents a specific value that must be matched exactly. */
3843
- criteria?: {
3844
- id: string;
3845
- /** @description The title of the scoring criterion or level. Only applies to analytical levels and holistic criteria. */
3846
- title?: string | null;
3847
- /** @description The description of the scoring criterion or level. For analytical levels, this describes the specific requirements to earn the points for that level. For holistic criteria, this describes the overall requirement to earn the points for that criterion. */
3848
- description?: string | null;
3849
- /** @description The default amount of points to assign if this criterion or level is selected. */
3850
- points?: number | null;
3851
- /** @description The minimum amount of points that can be assigned if this criterion or level is selected. */
3852
- minPoints?: number | null;
3853
- /** @description The maximum amount of points that can be assigned if this criterion or level is selected. */
3854
- maxPoints?: number | null;
3855
- /** @description The levels of a analytical rubric criterion. Each level represents a different point value and description for the same criterion. */
3856
- levels?: {
3857
- id: string;
3858
- /** @description The title of the scoring criterion or level. Only applies to analytical levels and holistic criteria. */
3859
- title?: string | null;
3860
- /** @description The description of the scoring criterion or level. For analytical levels, this describes the specific requirements to earn the points for that level. For holistic criteria, this describes the overall requirement to earn the points for that criterion. */
3861
- description?: string | null;
3862
- /** @description The default amount of points to assign if this criterion or level is selected. */
3863
- points?: number | null;
3864
- /** @description The minimum amount of points that can be assigned if this criterion or level is selected. */
3865
- minPoints?: number | null;
3866
- /** @description The maximum amount of points that can be assigned if this criterion or level is selected. */
3867
- maxPoints?: number | null;
3868
- }[] | null;
3869
- }[] | null;
3870
- /** @description Whether exact values matching should be case insensitive. Only applicable for 'exact-values' rubric type. */
3871
- exactValuesCaseInsensitive?: boolean | null;
3872
- /** @description Optional additional grading guidance text. */
3873
- guidance?: string | null;
3874
- /** @description Optional example model answer text to show to graders. */
3875
- modelAnswer?: string | null;
3876
- /** @description The ID of the scoring template applied, if any. */
3877
- templateId?: string | null;
3878
- } | null;
3879
- /** @description Tags associated with the question for categorization and search */
3880
- tags?: string[] | null;
3881
- /** @description Optional external ID for the question, used to link to external systems */
3882
- externalId?: string | null;
3883
- /** @description Metadata for the question */
3884
- metadata?: {
3885
- [key: string]: string | number | boolean | null;
3886
- } | null;
3887
- /** @description Version number, incremented when question is edited */
3888
- v?: number | null;
3889
- /** @description ID of the question in the question bank */
3890
- questionBankItemId?: string | null;
3891
- /** @description Trace IDs for internal tracking of AI generation processes */
3892
- traceIds?: string[] | null;
3893
- } & {
3894
- [key: string]: unknown;
3895
- })[] | null;
3896
- permissions?: {
3897
- actor: string;
3898
3971
  /** @enum {string} */
3899
3972
  role: "owner" | "manager" | "editor" | "viewer" | "participant";
3900
- }[] | null;
3973
+ /** Format: date-time */
3974
+ createdAt: string;
3975
+ /** Format: date-time */
3976
+ updatedAt: string;
3977
+ createdBy: string;
3978
+ }[];
3979
+ };
3980
+ };
3981
+ /** @description No access to this resource. */
3982
+ 403: {
3983
+ headers: {
3984
+ [name: string]: unknown;
3901
3985
  };
3986
+ content?: never;
3902
3987
  };
3903
3988
  };
3904
- responses: never;
3905
3989
  };
3906
- "exams.import": {
3990
+ "permissions.assign": {
3907
3991
  parameters: {
3908
3992
  query?: never;
3909
3993
  header?: never;
3910
- path?: never;
3994
+ path: {
3995
+ /** @description The ID of the resource to assign the permission on, e.g. `exam_1234`. */
3996
+ resource: string;
3997
+ };
3911
3998
  cookie?: never;
3912
3999
  };
3913
4000
  requestBody?: {
3914
4001
  content: {
3915
4002
  "application/json": {
3916
- name: string;
3917
- sourceMaterialIds?: string[];
4003
+ /** @description The ID of the actor to assign the permission to, e.g. `user_1234`, `group_1234` or `org_1234`. */
4004
+ actor: string;
4005
+ /** @enum {string} */
4006
+ role: "owner" | "manager" | "editor" | "viewer" | "participant";
4007
+ } | {
4008
+ /**
4009
+ * Format: email
4010
+ * @description The email of the user to add or invite.
4011
+ */
4012
+ email: string;
4013
+ /** @enum {string} */
4014
+ role: "owner" | "manager" | "editor" | "viewer" | "participant";
4015
+ /**
4016
+ * @description Whether to send an invitation email if the user does not exist. Defaults to false.
4017
+ * @default false
4018
+ */
4019
+ sendInvite?: boolean;
3918
4020
  };
3919
4021
  };
3920
4022
  };
3921
- responses: never;
3922
- };
3923
- "exams.get": {
3924
- parameters: {
3925
- query?: never;
3926
- header?: never;
3927
- path: {
3928
- id: string;
4023
+ responses: {
4024
+ /** @description The created or updated permission. */
4025
+ 201: {
4026
+ headers: {
4027
+ [name: string]: unknown;
4028
+ };
4029
+ content: {
4030
+ "application/json": {
4031
+ actor: {
4032
+ id: string;
4033
+ name?: string;
4034
+ /** Format: uri */
4035
+ avatar?: string;
4036
+ /** @enum {string} */
4037
+ type: "user" | "group" | "org";
4038
+ /** @enum {string} */
4039
+ orgRole?: "owner" | "admin" | "teacher" | "student" | "member";
4040
+ };
4041
+ /** @enum {string} */
4042
+ role: "owner" | "manager" | "editor" | "viewer" | "participant";
4043
+ /** Format: date-time */
4044
+ createdAt: string;
4045
+ /** Format: date-time */
4046
+ updatedAt: string;
4047
+ createdBy: string;
4048
+ };
4049
+ };
4050
+ };
4051
+ /** @description No access to manage this resource. */
4052
+ 403: {
4053
+ headers: {
4054
+ [name: string]: unknown;
4055
+ };
4056
+ content?: never;
3929
4057
  };
3930
- cookie?: never;
3931
4058
  };
3932
- requestBody?: never;
3933
- responses: never;
3934
4059
  };
3935
- "exams.update": {
4060
+ "permissions.getActorRole": {
3936
4061
  parameters: {
3937
4062
  query?: never;
3938
4063
  header?: never;
3939
4064
  path: {
3940
- id: string;
4065
+ /** @description The ID of the actor to check role for, e.g. `user_abcd`. */
4066
+ actor: ((string) | "me") | string;
4067
+ /** @description The ID of the resource to check role for, e.g. `exam_1234`. */
4068
+ resource: string;
3941
4069
  };
3942
4070
  cookie?: never;
3943
4071
  };
3944
4072
  requestBody?: never;
3945
- responses: never;
4073
+ responses: {
4074
+ /** @description Role of the specified actor for the specified resource. */
4075
+ 200: {
4076
+ headers: {
4077
+ [name: string]: unknown;
4078
+ };
4079
+ content: {
4080
+ "application/json": {
4081
+ actor: {
4082
+ id: string;
4083
+ name?: string;
4084
+ /** Format: uri */
4085
+ avatar?: string;
4086
+ /** @enum {string} */
4087
+ type: "user" | "group" | "org";
4088
+ /** @enum {string} */
4089
+ orgRole?: "owner" | "admin" | "teacher" | "student" | "member";
4090
+ };
4091
+ /** @enum {string} */
4092
+ role: "owner" | "manager" | "editor" | "viewer" | "participant";
4093
+ /** Format: date-time */
4094
+ createdAt: string;
4095
+ /** Format: date-time */
4096
+ updatedAt: string;
4097
+ createdBy: string;
4098
+ };
4099
+ };
4100
+ };
4101
+ /** @description No access to this resource. */
4102
+ 403: {
4103
+ headers: {
4104
+ [name: string]: unknown;
4105
+ };
4106
+ content?: never;
4107
+ };
4108
+ /** @description The specified actor has no access to the specified resource. */
4109
+ 404: {
4110
+ headers: {
4111
+ [name: string]: unknown;
4112
+ };
4113
+ content?: never;
4114
+ };
4115
+ };
3946
4116
  };
3947
- "exams.delete": {
4117
+ "permissions.delete": {
3948
4118
  parameters: {
3949
4119
  query?: never;
3950
4120
  header?: never;
3951
4121
  path: {
3952
- id: string;
4122
+ resource: string;
4123
+ actor: (string) | string;
3953
4124
  };
3954
4125
  cookie?: never;
3955
4126
  };
3956
4127
  requestBody?: never;
3957
- responses: never;
4128
+ responses: {
4129
+ /** @description Permission successfully removed. */
4130
+ 200: {
4131
+ headers: {
4132
+ [name: string]: unknown;
4133
+ };
4134
+ content?: never;
4135
+ };
4136
+ /** @description No access to manage this resource. */
4137
+ 403: {
4138
+ headers: {
4139
+ [name: string]: unknown;
4140
+ };
4141
+ content?: never;
4142
+ };
4143
+ };
3958
4144
  };
3959
- "exams.duplicate": {
4145
+ "studentLevels.list": {
3960
4146
  parameters: {
3961
4147
  query?: never;
3962
4148
  header?: never;
3963
- path: {
3964
- id: string;
3965
- };
4149
+ path?: never;
3966
4150
  cookie?: never;
3967
4151
  };
3968
- requestBody?: {
3969
- content: {
3970
- "application/json": {
3971
- name: string;
3972
- includeSessions?: boolean;
3973
- };
3974
- };
3975
- };
4152
+ requestBody?: never;
3976
4153
  responses: never;
3977
4154
  };
3978
- "exams.print": {
4155
+ "users.list": {
3979
4156
  parameters: {
3980
4157
  query?: never;
3981
4158
  header?: never;
3982
- path: {
3983
- id: string;
3984
- };
4159
+ path?: never;
3985
4160
  cookie?: never;
3986
4161
  };
3987
4162
  requestBody?: never;
3988
4163
  responses: never;
3989
4164
  };
3990
- "exams.startGeneration": {
4165
+ "users.create": {
3991
4166
  parameters: {
3992
4167
  query?: never;
3993
4168
  header?: never;
3994
- path: {
3995
- id: string;
3996
- };
4169
+ path?: never;
3997
4170
  cookie?: never;
3998
4171
  };
3999
- requestBody?: never;
4172
+ requestBody?: {
4173
+ content: {
4174
+ "application/json": {
4175
+ /** Format: email */
4176
+ email: string;
4177
+ name?: string;
4178
+ /**
4179
+ * @default teacher
4180
+ * @enum {string}
4181
+ */
4182
+ role?: "owner" | "admin" | "teacher" | "student" | "member";
4183
+ /**
4184
+ * @description Whether to send an invitation email. Defaults to false.
4185
+ * @default false
4186
+ */
4187
+ sendInvite?: boolean;
4188
+ };
4189
+ };
4190
+ };
4000
4191
  responses: never;
4001
4192
  };
4002
- "exams.cancelGeneration": {
4193
+ "users.delete": {
4003
4194
  parameters: {
4004
4195
  query?: never;
4005
4196
  header?: never;
@@ -4011,7 +4202,7 @@ interface operations {
4011
4202
  requestBody?: never;
4012
4203
  responses: never;
4013
4204
  };
4014
- "exams.getContextSuggestions": {
4205
+ "users.update": {
4015
4206
  parameters: {
4016
4207
  query?: never;
4017
4208
  header?: never;
@@ -4434,6 +4625,18 @@ interface operations {
4434
4625
  } & {
4435
4626
  [key: string]: unknown;
4436
4627
  };
4628
+ externalId?: string;
4629
+ parentSourceMaterialId?: string;
4630
+ summary?: string;
4631
+ factsCount?: number;
4632
+ /** @enum {string} */
4633
+ processingStatus?: "pending" | "converting" | "summarizing" | "extracting_topics" | "extracting_facts" | "completed" | "failed";
4634
+ numberOfPages?: number;
4635
+ chapterMarkers?: {
4636
+ title: string;
4637
+ startPage: number;
4638
+ endPage: number;
4639
+ }[];
4437
4640
  convertedSourceV2?: {
4438
4641
  /** Format: uri */
4439
4642
  url: string;
@@ -4456,20 +4659,8 @@ interface operations {
4456
4659
  } & {
4457
4660
  [key: string]: unknown;
4458
4661
  };
4459
- externalId?: string;
4460
- parentSourceMaterialId?: string;
4461
- cacheName?: string;
4462
- summary?: string;
4463
- factsCount?: number;
4464
- /** @enum {string} */
4465
- processingStatus?: "pending" | "converting" | "summarizing" | "extracting_topics" | "extracting_facts" | "completed" | "failed";
4466
- numberOfPages?: number;
4467
- chapterMarkers?: {
4468
- title: string;
4469
- startPage: number;
4470
- endPage: number;
4471
- }[];
4472
4662
  topics?: unknown;
4663
+ cacheName?: string;
4473
4664
  }[];
4474
4665
  };
4475
4666
  };
@@ -4528,6 +4719,18 @@ interface operations {
4528
4719
  } & {
4529
4720
  [key: string]: unknown;
4530
4721
  };
4722
+ externalId?: string;
4723
+ parentSourceMaterialId?: string;
4724
+ summary?: string;
4725
+ factsCount?: number;
4726
+ /** @enum {string} */
4727
+ processingStatus?: "pending" | "converting" | "summarizing" | "extracting_topics" | "extracting_facts" | "completed" | "failed";
4728
+ numberOfPages?: number;
4729
+ chapterMarkers?: {
4730
+ title: string;
4731
+ startPage: number;
4732
+ endPage: number;
4733
+ }[];
4531
4734
  convertedSourceV2?: {
4532
4735
  /** Format: uri */
4533
4736
  url: string;
@@ -4545,25 +4748,13 @@ interface operations {
4545
4748
  type?: string;
4546
4749
  name?: string;
4547
4750
  size?: number;
4548
- contentType?: string;
4549
- expires?: string;
4550
- } & {
4551
- [key: string]: unknown;
4552
- };
4553
- externalId?: string;
4554
- parentSourceMaterialId?: string;
4555
- cacheName?: string;
4556
- summary?: string;
4557
- factsCount?: number;
4558
- /** @enum {string} */
4559
- processingStatus?: "pending" | "converting" | "summarizing" | "extracting_topics" | "extracting_facts" | "completed" | "failed";
4560
- numberOfPages?: number;
4561
- chapterMarkers?: {
4562
- title: string;
4563
- startPage: number;
4564
- endPage: number;
4565
- }[];
4751
+ contentType?: string;
4752
+ expires?: string;
4753
+ } & {
4754
+ [key: string]: unknown;
4755
+ };
4566
4756
  topics?: unknown;
4757
+ cacheName?: string;
4567
4758
  };
4568
4759
  };
4569
4760
  };
@@ -4608,6 +4799,18 @@ interface operations {
4608
4799
  } & {
4609
4800
  [key: string]: unknown;
4610
4801
  };
4802
+ externalId?: string;
4803
+ parentSourceMaterialId?: string;
4804
+ summary?: string;
4805
+ factsCount?: number;
4806
+ /** @enum {string} */
4807
+ processingStatus?: "pending" | "converting" | "summarizing" | "extracting_topics" | "extracting_facts" | "completed" | "failed";
4808
+ numberOfPages?: number;
4809
+ chapterMarkers?: {
4810
+ title: string;
4811
+ startPage: number;
4812
+ endPage: number;
4813
+ }[];
4611
4814
  convertedSourceV2?: {
4612
4815
  /** Format: uri */
4613
4816
  url: string;
@@ -4630,20 +4833,8 @@ interface operations {
4630
4833
  } & {
4631
4834
  [key: string]: unknown;
4632
4835
  };
4633
- externalId?: string;
4634
- parentSourceMaterialId?: string;
4635
- cacheName?: string;
4636
- summary?: string;
4637
- factsCount?: number;
4638
- /** @enum {string} */
4639
- processingStatus?: "pending" | "converting" | "summarizing" | "extracting_topics" | "extracting_facts" | "completed" | "failed";
4640
- numberOfPages?: number;
4641
- chapterMarkers?: {
4642
- title: string;
4643
- startPage: number;
4644
- endPage: number;
4645
- }[];
4646
4836
  topics?: unknown;
4837
+ cacheName?: string;
4647
4838
  };
4648
4839
  };
4649
4840
  };
@@ -4730,6 +4921,18 @@ interface operations {
4730
4921
  } & {
4731
4922
  [key: string]: unknown;
4732
4923
  };
4924
+ externalId?: string;
4925
+ parentSourceMaterialId?: string;
4926
+ summary?: string;
4927
+ factsCount?: number;
4928
+ /** @enum {string} */
4929
+ processingStatus?: "pending" | "converting" | "summarizing" | "extracting_topics" | "extracting_facts" | "completed" | "failed";
4930
+ numberOfPages?: number;
4931
+ chapterMarkers?: {
4932
+ title: string;
4933
+ startPage: number;
4934
+ endPage: number;
4935
+ }[];
4733
4936
  convertedSourceV2?: {
4734
4937
  /** Format: uri */
4735
4938
  url: string;
@@ -4752,20 +4955,8 @@ interface operations {
4752
4955
  } & {
4753
4956
  [key: string]: unknown;
4754
4957
  };
4755
- externalId?: string;
4756
- parentSourceMaterialId?: string;
4757
- cacheName?: string;
4758
- summary?: string;
4759
- factsCount?: number;
4760
- /** @enum {string} */
4761
- processingStatus?: "pending" | "converting" | "summarizing" | "extracting_topics" | "extracting_facts" | "completed" | "failed";
4762
- numberOfPages?: number;
4763
- chapterMarkers?: {
4764
- title: string;
4765
- startPage: number;
4766
- endPage: number;
4767
- }[];
4768
4958
  topics?: unknown;
4959
+ cacheName?: string;
4769
4960
  };
4770
4961
  };
4771
4962
  };
@@ -5477,6 +5668,17 @@ interface operations {
5477
5668
  };
5478
5669
  }
5479
5670
 
5671
+ type Args$1 = {
5672
+ filename?: string;
5673
+ type?: string;
5674
+ contentType?: string;
5675
+ content?: Buffer | string;
5676
+ };
5677
+ type Response$1 = {
5678
+ publicUrl: string;
5679
+ uploadUrl: string;
5680
+ };
5681
+
5480
5682
  interface _PathOverrides {
5481
5683
  "questionTypes.get": {
5482
5684
  id: string;
@@ -5517,38 +5719,6 @@ interface _PathOverrides {
5517
5719
  "embedSessions.revoke": {
5518
5720
  id: string;
5519
5721
  };
5520
- "attributes.update": {
5521
- id: string;
5522
- };
5523
- "attributes.delete": {
5524
- id: string;
5525
- };
5526
- "taxonomies.update": {
5527
- id: string;
5528
- };
5529
- "taxonomies.delete": {
5530
- id: string;
5531
- };
5532
- "permissions.list": {
5533
- resource: string;
5534
- };
5535
- "permissions.assign": {
5536
- resource: string;
5537
- };
5538
- "permissions.getActorRole": {
5539
- actor: string;
5540
- resource: string;
5541
- };
5542
- "permissions.delete": {
5543
- resource: string;
5544
- actor: string;
5545
- };
5546
- "users.update": {
5547
- id: string;
5548
- };
5549
- "users.delete": {
5550
- id: string;
5551
- };
5552
5722
  "exams.sessions.list": {
5553
5723
  examId: string;
5554
5724
  };
@@ -5595,6 +5765,24 @@ interface _PathOverrides {
5595
5765
  sessionId: string;
5596
5766
  questionId: string;
5597
5767
  };
5768
+ "exams.sessions.comments.list": {
5769
+ examId: string;
5770
+ sessionId: string;
5771
+ };
5772
+ "exams.sessions.comments.create": {
5773
+ examId: string;
5774
+ sessionId: string;
5775
+ };
5776
+ "exams.sessions.comments.update": {
5777
+ examId: string;
5778
+ sessionId: string;
5779
+ commentId: string;
5780
+ };
5781
+ "exams.sessions.comments.delete": {
5782
+ examId: string;
5783
+ sessionId: string;
5784
+ commentId: string;
5785
+ };
5598
5786
  "exams.questions.import": {
5599
5787
  examId: string;
5600
5788
  };
@@ -5639,6 +5827,38 @@ interface _PathOverrides {
5639
5827
  "exams.getContextSuggestions": {
5640
5828
  examId: string;
5641
5829
  };
5830
+ "attributes.update": {
5831
+ id: string;
5832
+ };
5833
+ "attributes.delete": {
5834
+ id: string;
5835
+ };
5836
+ "taxonomies.update": {
5837
+ id: string;
5838
+ };
5839
+ "taxonomies.delete": {
5840
+ id: string;
5841
+ };
5842
+ "permissions.list": {
5843
+ resource: string;
5844
+ };
5845
+ "permissions.assign": {
5846
+ resource: string;
5847
+ };
5848
+ "permissions.getActorRole": {
5849
+ actor: string;
5850
+ resource: string;
5851
+ };
5852
+ "permissions.delete": {
5853
+ resource: string;
5854
+ actor: string;
5855
+ };
5856
+ "users.update": {
5857
+ id: string;
5858
+ };
5859
+ "users.delete": {
5860
+ id: string;
5861
+ };
5642
5862
  "practiceSpaces.get": {
5643
5863
  id: string;
5644
5864
  };
@@ -6006,553 +6226,590 @@ declare class EmbedSessions {
6006
6226
  revoke(id: string, options?: ExamplaryRequestOptions): Promise<Response<"embedSessions.revoke">>;
6007
6227
  revoke(args: Args<"embedSessions.revoke">, options?: ExamplaryRequestOptions): Promise<Response<"embedSessions.revoke">>;
6008
6228
  }
6009
- declare class Me {
6229
+ declare class ExamsSessionsComments {
6010
6230
  private readonly ctx;
6011
6231
  constructor(ctx: ClientContext);
6012
6232
  /**
6013
- * Get me
6233
+ * List session comments
6014
6234
  *
6015
- * Get the current user's account details.
6235
+ * Get a list of all comments left on a student's assessment session.
6016
6236
  *
6017
- * API endpoint: `GET /me`
6237
+ * API endpoint: `GET /exams/{examId}/sessions/{sessionId}/comments`
6018
6238
  */
6019
- get(args?: Args<"me.get">, options?: ExamplaryRequestOptions): Promise<Response<"me.get">>;
6239
+ list(args: Args<"exams.sessions.comments.list">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.comments.list">>;
6020
6240
  /**
6021
- * Update me
6241
+ * Create session comment
6022
6242
  *
6023
- * Update the current user's account details.
6243
+ * Add a new comment to a question in a student's assessment session.
6024
6244
  *
6025
- * API endpoint: `PATCH /me`
6245
+ * API endpoint: `POST /exams/{examId}/sessions/{sessionId}/comments`
6026
6246
  */
6027
- update(args?: Args<"me.update">, options?: ExamplaryRequestOptions): Promise<Response<"me.update">>;
6028
- }
6029
- declare class Media {
6030
- private readonly ctx;
6031
- constructor(ctx: ClientContext);
6247
+ create(args: Args<"exams.sessions.comments.create">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.comments.create">>;
6032
6248
  /**
6033
- * Get file upload URL
6249
+ * Update session comment
6034
6250
  *
6035
- * Returns a signed URL for uploading a file, and a public URL for accessing it afterwards.
6251
+ * Edit the body of an existing session comment.
6036
6252
  *
6037
- * API endpoint: `GET /media/upload`
6253
+ * API endpoint: `PATCH /exams/{examId}/sessions/{sessionId}/comments/{commentId}`
6254
+ */
6255
+ update(args: Args<"exams.sessions.comments.update">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.comments.update">>;
6256
+ /**
6257
+ * Delete session comment
6258
+ *
6259
+ * Remove a comment from a session.
6260
+ *
6261
+ * API endpoint: `DELETE /exams/{examId}/sessions/{sessionId}/comments/{commentId}`
6038
6262
  */
6039
- upload(args?: Args<"media.upload">, options?: ExamplaryRequestOptions): Promise<Response<"media.upload">>;
6263
+ delete(args: Args<"exams.sessions.comments.delete">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.comments.delete">>;
6040
6264
  }
6041
- declare class OrgCustomDomain {
6265
+ declare class ExamsSessions {
6042
6266
  private readonly ctx;
6267
+ readonly comments: ExamsSessionsComments;
6043
6268
  constructor(ctx: ClientContext);
6044
6269
  /**
6045
- * Get custom domain configuration
6270
+ * List exam sessions
6046
6271
  *
6047
- * API endpoint: `GET /org/custom-domain`
6272
+ * Get a list of all student sessions for an exam, representing a set of answers from a student.
6273
+ *
6274
+ * API endpoint: `GET /exams/{examId}/sessions`
6048
6275
  */
6049
- get(args?: Args<"org.customDomain.get">, options?: ExamplaryRequestOptions): Promise<Response<"org.customDomain.get">>;
6276
+ list(examId: string, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.list">>;
6277
+ list(args: Args<"exams.sessions.list">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.list">>;
6050
6278
  /**
6051
- * Update custom domain configuration
6279
+ * Create session
6052
6280
  *
6053
- * API endpoint: `POST /org/custom-domain`
6281
+ * Manually create a session, possibly from uploaded data.
6282
+ *
6283
+ * API endpoint: `POST /exams/{examId}/sessions`
6054
6284
  */
6055
- update(args?: Args<"org.customDomain.update">, options?: ExamplaryRequestOptions): Promise<Response<"org.customDomain.update">>;
6056
- }
6057
- declare class Org {
6058
- private readonly ctx;
6059
- readonly customDomain: OrgCustomDomain;
6060
- constructor(ctx: ClientContext);
6285
+ import(args: Args<"exams.sessions.import">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.import">>;
6061
6286
  /**
6062
- * Get organization
6287
+ * Get answers from scan
6063
6288
  *
6064
- * API endpoint: `GET /org`
6289
+ * Scan student answers from a document.
6290
+ *
6291
+ * API endpoint: `POST /exams/{examId}/sessions/scan`
6065
6292
  */
6066
- get(args?: Args<"org.get">, options?: ExamplaryRequestOptions): Promise<Response<"org.get">>;
6293
+ scan(examId: string, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.scan">>;
6294
+ scan(args: Args<"exams.sessions.scan">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.scan">>;
6067
6295
  /**
6068
- * Update organization
6296
+ * Scan document for student answers
6069
6297
  *
6070
- * API endpoint: `PATCH /org`
6298
+ * Start a background task to extract student answers from an uploaded PDF document.
6299
+ *
6300
+ * API endpoint: `POST /exams/{examId}/sessions/scan-document`
6071
6301
  */
6072
- update(args?: Args<"org.update">, options?: ExamplaryRequestOptions): Promise<Response<"org.update">>;
6302
+ scanDocument(args: Args<"exams.sessions.scanDocument">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.scanDocument">>;
6073
6303
  /**
6074
- * Delete organization
6304
+ * Get exam session
6075
6305
  *
6076
- * API endpoint: `DELETE /org`
6306
+ * Get a single exam session by its ID, representing a set of answers from a student.
6307
+ *
6308
+ * API endpoint: `GET /exams/{examId}/sessions/{sessionId}`
6077
6309
  */
6078
- delete(args?: Args<"org.delete">, options?: ExamplaryRequestOptions): Promise<Response<"org.delete">>;
6079
- }
6080
- declare class Orgs {
6081
- private readonly ctx;
6082
- constructor(ctx: ClientContext);
6310
+ get(args: Args<"exams.sessions.get">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.get">>;
6083
6311
  /**
6084
- * List all organizations
6312
+ * Delete exam session
6085
6313
  *
6086
- * API endpoint: `GET /orgs`
6314
+ * Remove an exam session.
6315
+ *
6316
+ * API endpoint: `DELETE /exams/{examId}/sessions/{sessionId}`
6087
6317
  */
6088
- list(args?: Args<"orgs.list">, options?: ExamplaryRequestOptions): Promise<Response<"orgs.list">>;
6318
+ delete(args: Args<"exams.sessions.delete">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.delete">>;
6089
6319
  /**
6090
- * Create a new organization
6320
+ * Provide feedback
6091
6321
  *
6092
- * Create a new workspace to collaborate with others on exams.
6322
+ * Set teacher feedback and/or a grade for a specific question in an exam session.
6093
6323
  *
6094
- * API endpoint: `POST /orgs`
6324
+ * API endpoint: `POST /exams/{examId}/sessions/{sessionId}/feedback`
6095
6325
  */
6096
- create(args?: Args<"orgs.create">, options?: ExamplaryRequestOptions): Promise<Response<"orgs.create">>;
6097
- }
6098
- declare class ApiKeys {
6099
- private readonly ctx;
6100
- constructor(ctx: ClientContext);
6326
+ saveFeedback(args: Args<"exams.sessions.saveFeedback">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.saveFeedback">>;
6101
6327
  /**
6102
- * Get API key
6328
+ * Provide overall feedback
6103
6329
  *
6104
- * Get the API key for the current org/user combination. Creates one if none exists.
6330
+ * Set teacher feedback for the test as a whole in an exam session.
6331
+ *
6332
+ * API endpoint: `POST /exams/{examId}/sessions/{sessionId}/overall-feedback`
6333
+ */
6334
+ saveOverallFeedback(args: Args<"exams.sessions.saveOverallFeedback">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.saveOverallFeedback">>;
6335
+ /**
6336
+ * Generate overall feedback
6337
+ *
6338
+ * Generate feedback for the test as a whole in an exam session.
6339
+ *
6340
+ * API endpoint: `POST /exams/{examId}/sessions/{sessionId}/generate-overall-feedback`
6341
+ */
6342
+ generateOverallFeedback(args: Args<"exams.sessions.generateOverallFeedback">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.generateOverallFeedback">>;
6343
+ /**
6344
+ * Accept AI grading suggestions
6345
+ *
6346
+ * Accept all AI-generated grading suggestions for the exam session.
6347
+ *
6348
+ * API endpoint: `POST /exams/{examId}/sessions/{sessionId}/suggestions/accept-all`
6349
+ */
6350
+ acceptAllSuggestions(args: Args<"exams.sessions.acceptAllSuggestions">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.acceptAllSuggestions">>;
6351
+ /**
6352
+ * Accept single AI grading suggestion
6353
+ *
6354
+ * Accept a single AI-generated grading suggestion for the exam session.
6105
6355
  *
6106
- * API endpoint: `GET /api-keys`
6356
+ * API endpoint: `POST /exams/{examId}/sessions/{sessionId}/suggestions/{questionId}/accept`
6107
6357
  */
6108
- get(args?: Args<"apiKeys.get">, options?: ExamplaryRequestOptions): Promise<Response<"apiKeys.get">>;
6358
+ acceptSuggestion(args: Args<"exams.sessions.acceptSuggestion">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.acceptSuggestion">>;
6109
6359
  /**
6110
- * Reset API key
6360
+ * Edit answer
6111
6361
  *
6112
- * Invalidate old API keys for this org/user and create a new one.
6362
+ * Edit a single answer in an exam session.
6113
6363
  *
6114
- * API endpoint: `POST /api-keys/reset`
6364
+ * API endpoint: `PATCH /exams/{examId}/sessions/{sessionId}/answers/{questionId}`
6115
6365
  */
6116
- reset(args?: Args<"apiKeys.reset">, options?: ExamplaryRequestOptions): Promise<Response<"apiKeys.reset">>;
6366
+ editAnswer(args: Args<"exams.sessions.editAnswer">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.editAnswer">>;
6117
6367
  }
6118
- declare class Attributes {
6368
+ declare class ExamsQuestions {
6119
6369
  private readonly ctx;
6120
6370
  constructor(ctx: ClientContext);
6121
6371
  /**
6122
- * List attributes
6123
- *
6124
- * Get all custom attributes configured for the current workspace.
6125
- *
6126
- * API endpoint: `GET /attributes`
6127
- */
6128
- list(args?: Args<"attributes.list">, options?: ExamplaryRequestOptions): Promise<Response<"attributes.list">>;
6129
- /**
6130
- * Create attribute
6372
+ * Import questions
6131
6373
  *
6132
- * Create a new custom attribute in the current workspace.
6374
+ * Import questions into an exam from a file. Support Word, PDF, Moodle quiz XML and plain text files.
6133
6375
  *
6134
- * API endpoint: `POST /attributes`
6376
+ * API endpoint: `POST /exams/{examId}/questions/import`
6135
6377
  */
6136
- create(args?: Args<"attributes.create">, options?: ExamplaryRequestOptions): Promise<Response<"attributes.create">>;
6378
+ import(args: Args<"exams.questions.import">, options?: ExamplaryRequestOptions): Promise<Response<"exams.questions.import">>;
6137
6379
  /**
6138
- * Reorder attributes
6380
+ * Generate question
6139
6381
  *
6140
- * Update the position of multiple attributes at once.
6382
+ * Generate a new question for the exam using an AI prompt.
6141
6383
  *
6142
- * API endpoint: `POST /attributes/reorder`
6384
+ * API endpoint: `POST /exams/{examId}/questions/generate`
6143
6385
  */
6144
- reorder(args?: Args<"attributes.reorder">, options?: ExamplaryRequestOptions): Promise<Response<"attributes.reorder">>;
6386
+ generate(args: Args<"exams.questions.generate">, options?: ExamplaryRequestOptions): Promise<Response<"exams.questions.generate">>;
6145
6387
  /**
6146
- * Update attribute
6388
+ * Get question
6147
6389
  *
6148
- * Update an existing attribute in the current workspace.
6390
+ * Retrieve a question by its ID.
6149
6391
  *
6150
- * API endpoint: `POST /attributes/{id}`
6392
+ * API endpoint: `GET /exams/{examId}/questions/{questionId}`
6151
6393
  */
6152
- update(args: Args<"attributes.update">, options?: ExamplaryRequestOptions): Promise<Response<"attributes.update">>;
6394
+ get(args: Args<"exams.questions.get">, options?: ExamplaryRequestOptions): Promise<Response<"exams.questions.get">>;
6153
6395
  /**
6154
- * Delete attribute
6396
+ * Regenerate question
6155
6397
  *
6156
- * Delete a custom attribute from the current workspace. Default attributes cannot be deleted.
6398
+ * Update a question using an AI prompt.
6157
6399
  *
6158
- * API endpoint: `DELETE /attributes/{id}`
6400
+ * API endpoint: `POST /exams/{examId}/questions/{questionId}/generate`
6159
6401
  */
6160
- delete(id: string, options?: ExamplaryRequestOptions): Promise<Response<"attributes.delete">>;
6161
- delete(args: Args<"attributes.delete">, options?: ExamplaryRequestOptions): Promise<Response<"attributes.delete">>;
6402
+ regenerate(args: Args<"exams.questions.regenerate">, options?: ExamplaryRequestOptions): Promise<Response<"exams.questions.regenerate">>;
6162
6403
  }
6163
- declare class Taxonomies {
6404
+ declare class ExamsExport {
6164
6405
  private readonly ctx;
6165
6406
  constructor(ctx: ClientContext);
6166
6407
  /**
6167
- * Get taxonomies
6168
- *
6169
- * Get a list available taxonomies, including defaults and taxonomies created in the current workspace.
6170
- *
6171
- * API endpoint: `GET /taxonomies`
6172
- */
6173
- list(args?: Args<"taxonomies.list">, options?: ExamplaryRequestOptions): Promise<Response<"taxonomies.list">>;
6174
- /**
6175
- * Create taxonomy
6408
+ * Export QTI 3 package
6176
6409
  *
6177
- * Save a new taxonomy in the current workspace.
6410
+ * Export an exam as a QTI 3 ZIP package.
6178
6411
  *
6179
- * API endpoint: `POST /taxonomies`
6412
+ * API endpoint: `POST /exams/{examId}/export/qti3-zip`
6180
6413
  */
6181
- create(args?: Args<"taxonomies.create">, options?: ExamplaryRequestOptions): Promise<Response<"taxonomies.create">>;
6414
+ qti3Zip(examId: string, options?: ExamplaryRequestOptions): Promise<Response<"exams.export.qti3Zip">>;
6415
+ qti3Zip(args: Args<"exams.export.qti3Zip">, options?: ExamplaryRequestOptions): Promise<Response<"exams.export.qti3Zip">>;
6182
6416
  /**
6183
- * Update taxonomy
6417
+ * Export QTI 2.1 package
6184
6418
  *
6185
- * Update an existing taxonomy in the current workspace.
6419
+ * Export an exam as a QTI 2.1 ZIP package.
6186
6420
  *
6187
- * API endpoint: `POST /taxonomies/{id}`
6421
+ * API endpoint: `POST /exams/{examId}/export/qti21-zip`
6188
6422
  */
6189
- update(args: Args<"taxonomies.update">, options?: ExamplaryRequestOptions): Promise<Response<"taxonomies.update">>;
6423
+ qti21Zip(examId: string, options?: ExamplaryRequestOptions): Promise<Response<"exams.export.qti21Zip">>;
6424
+ qti21Zip(args: Args<"exams.export.qti21Zip">, options?: ExamplaryRequestOptions): Promise<Response<"exams.export.qti21Zip">>;
6425
+ }
6426
+ declare class Exams {
6427
+ private readonly ctx;
6428
+ readonly sessions: ExamsSessions;
6429
+ readonly questions: ExamsQuestions;
6430
+ readonly export: ExamsExport;
6431
+ constructor(ctx: ClientContext);
6190
6432
  /**
6191
- * Delete taxonomy
6433
+ * List exams
6192
6434
  *
6193
- * Delete a taxonomy from the current workspace. This fails if there are any exams associated with the taxonomy.
6435
+ * Get a list of all exams within your workspace.
6194
6436
  *
6195
- * API endpoint: `DELETE /taxonomies/{id}`
6437
+ * API endpoint: `GET /exams`
6196
6438
  */
6197
- delete(id: string, options?: ExamplaryRequestOptions): Promise<Response<"taxonomies.delete">>;
6198
- delete(args: Args<"taxonomies.delete">, options?: ExamplaryRequestOptions): Promise<Response<"taxonomies.delete">>;
6199
- }
6200
- declare class Permissions {
6201
- private readonly ctx;
6202
- constructor(ctx: ClientContext);
6439
+ list(args?: Args<"exams.list">, options?: ExamplaryRequestOptions): Promise<Response<"exams.list">>;
6203
6440
  /**
6204
- * Autocomplete users and groups
6441
+ * Create exam
6205
6442
  *
6206
- * Search for users and groups to share with. Returns matches by name or email. Respects restricted group visibility.
6443
+ * Create a new exam within your workspace.
6207
6444
  *
6208
- * API endpoint: `GET /permissions/autocomplete`
6445
+ * API endpoint: `POST /exams`
6209
6446
  */
6210
- autocomplete(args: Args<"permissions.autocomplete">, options?: ExamplaryRequestOptions): Promise<Response<"permissions.autocomplete">>;
6447
+ create(args?: Args<"exams.create">, options?: ExamplaryRequestOptions): Promise<Response<"exams.create">>;
6211
6448
  /**
6212
- * Get sharing permissions
6449
+ * Import exam
6213
6450
  *
6214
- * Get a list of users, groups and orgs that have access to a specific resource.
6451
+ * Create an exam by importing one or more source materials (e.g. an existing exam).
6215
6452
  *
6216
- * API endpoint: `GET /permissions/{resource}`
6453
+ * API endpoint: `POST /exams/import`
6217
6454
  */
6218
- list(resource: string, options?: ExamplaryRequestOptions): Promise<Response<"permissions.list">>;
6219
- list(args: Args<"permissions.list">, options?: ExamplaryRequestOptions): Promise<Response<"permissions.list">>;
6455
+ import(args?: Args<"exams.import">, options?: ExamplaryRequestOptions): Promise<Response<"exams.import">>;
6220
6456
  /**
6221
- * Create permission
6457
+ * Get exam
6222
6458
  *
6223
- * Create a new permission for a specific resource, or update the role of an existing actor.
6459
+ * Get a single exam by its ID.
6224
6460
  *
6225
- * API endpoint: `POST /permissions/{resource}`
6461
+ * API endpoint: `GET /exams/{id}`
6226
6462
  */
6227
- assign(args: Args<"permissions.assign">, options?: ExamplaryRequestOptions): Promise<Response<"permissions.assign">>;
6463
+ get(id: string, options?: ExamplaryRequestOptions): Promise<Response<"exams.get">>;
6464
+ get(args: Args<"exams.get">, options?: ExamplaryRequestOptions): Promise<Response<"exams.get">>;
6228
6465
  /**
6229
- * Get actor role
6466
+ * Update exam
6230
6467
  *
6231
- * Get the role of a specific actor for a specific resource.
6468
+ * Update an existing exam.
6232
6469
  *
6233
- * API endpoint: `GET /permissions/{resource}/{actor}`
6470
+ * API endpoint: `POST /exams/{id}`
6234
6471
  */
6235
- getActorRole(args: Args<"permissions.getActorRole">, options?: ExamplaryRequestOptions): Promise<Response<"permissions.getActorRole">>;
6472
+ update(id: string, options?: ExamplaryRequestOptions): Promise<Response<"exams.update">>;
6473
+ update(args: Args<"exams.update">, options?: ExamplaryRequestOptions): Promise<Response<"exams.update">>;
6236
6474
  /**
6237
- * Remove permission
6475
+ * Delete exam
6238
6476
  *
6239
- * Remove a permission for a specific actor on a specific resource.
6477
+ * Delete the exam.
6240
6478
  *
6241
- * API endpoint: `DELETE /permissions/{resource}/{actor}`
6479
+ * API endpoint: `DELETE /exams/{id}`
6242
6480
  */
6243
- delete(args: Args<"permissions.delete">, options?: ExamplaryRequestOptions): Promise<Response<"permissions.delete">>;
6244
- }
6245
- declare class StudentLevels {
6246
- private readonly ctx;
6247
- constructor(ctx: ClientContext);
6481
+ delete(id: string, options?: ExamplaryRequestOptions): Promise<Response<"exams.delete">>;
6482
+ delete(args: Args<"exams.delete">, options?: ExamplaryRequestOptions): Promise<Response<"exams.delete">>;
6248
6483
  /**
6249
- * List available student levels
6484
+ * Duplicate exam
6250
6485
  *
6251
- * Get a list of available default student levels.
6486
+ * Duplicate the exam's questions and settings to a new exam.
6252
6487
  *
6253
- * API endpoint: `GET /student-levels`
6488
+ * API endpoint: `POST /exams/{examId}/duplicate`
6254
6489
  */
6255
- list(args?: Args<"studentLevels.list">, options?: ExamplaryRequestOptions): Promise<Response<"studentLevels.list">>;
6256
- }
6257
- declare class Users {
6258
- private readonly ctx;
6259
- constructor(ctx: ClientContext);
6490
+ duplicate(args: Args<"exams.duplicate">, options?: ExamplaryRequestOptions): Promise<Response<"exams.duplicate">>;
6260
6491
  /**
6261
- * List users
6492
+ * Print exam
6262
6493
  *
6263
- * Get a list of all users in the workspace.
6494
+ * Export an exam to a PDF file or Word document.
6264
6495
  *
6265
- * API endpoint: `GET /users`
6496
+ * API endpoint: `POST /exams/{examId}/print`
6266
6497
  */
6267
- list(args?: Args<"users.list">, options?: ExamplaryRequestOptions): Promise<Response<"users.list">>;
6498
+ print(examId: string, options?: ExamplaryRequestOptions): Promise<Response<"exams.print">>;
6499
+ print(args: Args<"exams.print">, options?: ExamplaryRequestOptions): Promise<Response<"exams.print">>;
6268
6500
  /**
6269
- * Create user
6501
+ * Generate exam
6270
6502
  *
6271
- * Create a new user in the workspace.
6503
+ * Initiate a job to generate new questions for the exam using AI, based on the source materials and metadata specified.
6272
6504
  *
6273
- * API endpoint: `POST /users`
6505
+ * API endpoint: `POST /exams/{examId}/generate`
6274
6506
  */
6275
- create(args?: Args<"users.create">, options?: ExamplaryRequestOptions): Promise<Response<"users.create">>;
6507
+ startGeneration(examId: string, options?: ExamplaryRequestOptions): Promise<Response<"exams.startGeneration">>;
6508
+ startGeneration(args: Args<"exams.startGeneration">, options?: ExamplaryRequestOptions): Promise<Response<"exams.startGeneration">>;
6276
6509
  /**
6277
- * Update user role
6510
+ * Cancel exam generation
6278
6511
  *
6279
- * Update a user's role within the workspace.
6512
+ * Cancel an ongoing job to generate new questions for the exam using AI.
6280
6513
  *
6281
- * API endpoint: `PATCH /users/{id}`
6514
+ * API endpoint: `POST /exams/{examId}/generate/cancel`
6282
6515
  */
6283
- update(id: string, options?: ExamplaryRequestOptions): Promise<Response<"users.update">>;
6284
- update(args: Args<"users.update">, options?: ExamplaryRequestOptions): Promise<Response<"users.update">>;
6516
+ cancelGeneration(examId: string, options?: ExamplaryRequestOptions): Promise<Response<"exams.cancelGeneration">>;
6517
+ cancelGeneration(args: Args<"exams.cancelGeneration">, options?: ExamplaryRequestOptions): Promise<Response<"exams.cancelGeneration">>;
6285
6518
  /**
6286
- * Delete user
6519
+ * Get exam context suggestions
6287
6520
  *
6288
- * Delete a user from the workspace.
6521
+ * Get AI-generated suggestions for context/instructions to include in the exam generation prompt, based on the source materials linked to the exam.
6289
6522
  *
6290
- * API endpoint: `DELETE /users/{id}`
6523
+ * API endpoint: `GET /exams/{examId}/context-suggestions`
6291
6524
  */
6292
- delete(id: string, options?: ExamplaryRequestOptions): Promise<Response<"users.delete">>;
6293
- delete(args: Args<"users.delete">, options?: ExamplaryRequestOptions): Promise<Response<"users.delete">>;
6525
+ getContextSuggestions(examId: string, options?: ExamplaryRequestOptions): Promise<Response<"exams.getContextSuggestions">>;
6526
+ getContextSuggestions(args: Args<"exams.getContextSuggestions">, options?: ExamplaryRequestOptions): Promise<Response<"exams.getContextSuggestions">>;
6294
6527
  }
6295
- declare class ExamsSessions {
6528
+ declare class Me {
6296
6529
  private readonly ctx;
6297
6530
  constructor(ctx: ClientContext);
6298
6531
  /**
6299
- * List exam sessions
6532
+ * Get me
6300
6533
  *
6301
- * Get a list of all student sessions for an exam, representing a set of answers from a student.
6534
+ * Get the current user's account details.
6302
6535
  *
6303
- * API endpoint: `GET /exams/{examId}/sessions`
6536
+ * API endpoint: `GET /me`
6304
6537
  */
6305
- list(examId: string, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.list">>;
6306
- list(args: Args<"exams.sessions.list">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.list">>;
6538
+ get(args?: Args<"me.get">, options?: ExamplaryRequestOptions): Promise<Response<"me.get">>;
6307
6539
  /**
6308
- * Create session
6540
+ * Update me
6309
6541
  *
6310
- * Manually create a session, possibly from uploaded data.
6542
+ * Update the current user's account details.
6311
6543
  *
6312
- * API endpoint: `POST /exams/{examId}/sessions`
6544
+ * API endpoint: `PATCH /me`
6313
6545
  */
6314
- import(args: Args<"exams.sessions.import">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.import">>;
6546
+ update(args?: Args<"me.update">, options?: ExamplaryRequestOptions): Promise<Response<"me.update">>;
6547
+ }
6548
+ declare class Media {
6549
+ private readonly ctx;
6550
+ constructor(ctx: ClientContext);
6315
6551
  /**
6316
- * Get answers from scan
6552
+ * Get file upload URL
6317
6553
  *
6318
- * Scan student answers from a document.
6554
+ * Returns a signed URL for uploading a file, and a public URL for accessing it afterwards.
6319
6555
  *
6320
- * API endpoint: `POST /exams/{examId}/sessions/scan`
6556
+ * API endpoint: `GET /media/upload`
6321
6557
  */
6322
- scan(examId: string, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.scan">>;
6323
- scan(args: Args<"exams.sessions.scan">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.scan">>;
6558
+ upload(args: Args$1, options?: ExamplaryRequestOptions): Promise<Response$1>;
6559
+ }
6560
+ declare class OrgCustomDomain {
6561
+ private readonly ctx;
6562
+ constructor(ctx: ClientContext);
6324
6563
  /**
6325
- * Scan document for student answers
6326
- *
6327
- * Start a background task to extract student answers from an uploaded PDF document.
6564
+ * Get custom domain configuration
6328
6565
  *
6329
- * API endpoint: `POST /exams/{examId}/sessions/scan-document`
6566
+ * API endpoint: `GET /org/custom-domain`
6330
6567
  */
6331
- scanDocument(args: Args<"exams.sessions.scanDocument">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.scanDocument">>;
6568
+ get(args?: Args<"org.customDomain.get">, options?: ExamplaryRequestOptions): Promise<Response<"org.customDomain.get">>;
6332
6569
  /**
6333
- * Get exam session
6334
- *
6335
- * Get a single exam session by its ID, representing a set of answers from a student.
6570
+ * Update custom domain configuration
6336
6571
  *
6337
- * API endpoint: `GET /exams/{examId}/sessions/{sessionId}`
6572
+ * API endpoint: `POST /org/custom-domain`
6338
6573
  */
6339
- get(args: Args<"exams.sessions.get">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.get">>;
6574
+ update(args?: Args<"org.customDomain.update">, options?: ExamplaryRequestOptions): Promise<Response<"org.customDomain.update">>;
6575
+ }
6576
+ declare class Org {
6577
+ private readonly ctx;
6578
+ readonly customDomain: OrgCustomDomain;
6579
+ constructor(ctx: ClientContext);
6340
6580
  /**
6341
- * Delete exam session
6342
- *
6343
- * Remove an exam session.
6581
+ * Get organization
6344
6582
  *
6345
- * API endpoint: `DELETE /exams/{examId}/sessions/{sessionId}`
6583
+ * API endpoint: `GET /org`
6346
6584
  */
6347
- delete(args: Args<"exams.sessions.delete">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.delete">>;
6585
+ get(args?: Args<"org.get">, options?: ExamplaryRequestOptions): Promise<Response<"org.get">>;
6348
6586
  /**
6349
- * Provide feedback
6350
- *
6351
- * Set teacher feedback and/or a grade for a specific question in an exam session.
6587
+ * Update organization
6352
6588
  *
6353
- * API endpoint: `POST /exams/{examId}/sessions/{sessionId}/feedback`
6589
+ * API endpoint: `PATCH /org`
6354
6590
  */
6355
- saveFeedback(args: Args<"exams.sessions.saveFeedback">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.saveFeedback">>;
6591
+ update(args?: Args<"org.update">, options?: ExamplaryRequestOptions): Promise<Response<"org.update">>;
6356
6592
  /**
6357
- * Provide overall feedback
6358
- *
6359
- * Set teacher feedback for the test as a whole in an exam session.
6593
+ * Delete organization
6360
6594
  *
6361
- * API endpoint: `POST /exams/{examId}/sessions/{sessionId}/overall-feedback`
6595
+ * API endpoint: `DELETE /org`
6362
6596
  */
6363
- saveOverallFeedback(args: Args<"exams.sessions.saveOverallFeedback">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.saveOverallFeedback">>;
6597
+ delete(args?: Args<"org.delete">, options?: ExamplaryRequestOptions): Promise<Response<"org.delete">>;
6598
+ }
6599
+ declare class Orgs {
6600
+ private readonly ctx;
6601
+ constructor(ctx: ClientContext);
6364
6602
  /**
6365
- * Generate overall feedback
6366
- *
6367
- * Generate feedback for the test as a whole in an exam session.
6603
+ * List all organizations
6368
6604
  *
6369
- * API endpoint: `POST /exams/{examId}/sessions/{sessionId}/generate-overall-feedback`
6605
+ * API endpoint: `GET /orgs`
6370
6606
  */
6371
- generateOverallFeedback(args: Args<"exams.sessions.generateOverallFeedback">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.generateOverallFeedback">>;
6607
+ list(args?: Args<"orgs.list">, options?: ExamplaryRequestOptions): Promise<Response<"orgs.list">>;
6372
6608
  /**
6373
- * Accept AI grading suggestions
6609
+ * Create a new organization
6374
6610
  *
6375
- * Accept all AI-generated grading suggestions for the exam session.
6611
+ * Create a new workspace to collaborate with others on exams.
6376
6612
  *
6377
- * API endpoint: `POST /exams/{examId}/sessions/{sessionId}/suggestions/accept-all`
6613
+ * API endpoint: `POST /orgs`
6378
6614
  */
6379
- acceptAllSuggestions(args: Args<"exams.sessions.acceptAllSuggestions">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.acceptAllSuggestions">>;
6615
+ create(args?: Args<"orgs.create">, options?: ExamplaryRequestOptions): Promise<Response<"orgs.create">>;
6616
+ }
6617
+ declare class ApiKeys {
6618
+ private readonly ctx;
6619
+ constructor(ctx: ClientContext);
6380
6620
  /**
6381
- * Accept single AI grading suggestion
6621
+ * Get API key
6382
6622
  *
6383
- * Accept a single AI-generated grading suggestion for the exam session.
6623
+ * Get the API key for the current org/user combination. Creates one if none exists.
6384
6624
  *
6385
- * API endpoint: `POST /exams/{examId}/sessions/{sessionId}/suggestions/{questionId}/accept`
6625
+ * API endpoint: `GET /api-keys`
6386
6626
  */
6387
- acceptSuggestion(args: Args<"exams.sessions.acceptSuggestion">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.acceptSuggestion">>;
6627
+ get(args?: Args<"apiKeys.get">, options?: ExamplaryRequestOptions): Promise<Response<"apiKeys.get">>;
6388
6628
  /**
6389
- * Edit answer
6629
+ * Reset API key
6390
6630
  *
6391
- * Edit a single answer in an exam session.
6631
+ * Invalidate old API keys for this org/user and create a new one.
6392
6632
  *
6393
- * API endpoint: `PATCH /exams/{examId}/sessions/{sessionId}/answers/{questionId}`
6633
+ * API endpoint: `POST /api-keys/reset`
6394
6634
  */
6395
- editAnswer(args: Args<"exams.sessions.editAnswer">, options?: ExamplaryRequestOptions): Promise<Response<"exams.sessions.editAnswer">>;
6635
+ reset(args?: Args<"apiKeys.reset">, options?: ExamplaryRequestOptions): Promise<Response<"apiKeys.reset">>;
6396
6636
  }
6397
- declare class ExamsQuestions {
6637
+ declare class Attributes {
6398
6638
  private readonly ctx;
6399
6639
  constructor(ctx: ClientContext);
6400
6640
  /**
6401
- * Import questions
6641
+ * List attributes
6402
6642
  *
6403
- * Import questions into an exam from a file. Support Word, PDF, Moodle quiz XML and plain text files.
6643
+ * Get all custom attributes configured for the current workspace.
6404
6644
  *
6405
- * API endpoint: `POST /exams/{examId}/questions/import`
6645
+ * API endpoint: `GET /attributes`
6406
6646
  */
6407
- import(args: Args<"exams.questions.import">, options?: ExamplaryRequestOptions): Promise<Response<"exams.questions.import">>;
6647
+ list(args?: Args<"attributes.list">, options?: ExamplaryRequestOptions): Promise<Response<"attributes.list">>;
6408
6648
  /**
6409
- * Generate question
6649
+ * Create attribute
6410
6650
  *
6411
- * Generate a new question for the exam using an AI prompt.
6651
+ * Create a new custom attribute in the current workspace.
6412
6652
  *
6413
- * API endpoint: `POST /exams/{examId}/questions/generate`
6653
+ * API endpoint: `POST /attributes`
6414
6654
  */
6415
- generate(args: Args<"exams.questions.generate">, options?: ExamplaryRequestOptions): Promise<Response<"exams.questions.generate">>;
6655
+ create(args?: Args<"attributes.create">, options?: ExamplaryRequestOptions): Promise<Response<"attributes.create">>;
6416
6656
  /**
6417
- * Get question
6657
+ * Reorder attributes
6418
6658
  *
6419
- * Retrieve a question by its ID.
6659
+ * Update the position of multiple attributes at once.
6420
6660
  *
6421
- * API endpoint: `GET /exams/{examId}/questions/{questionId}`
6661
+ * API endpoint: `POST /attributes/reorder`
6422
6662
  */
6423
- get(args: Args<"exams.questions.get">, options?: ExamplaryRequestOptions): Promise<Response<"exams.questions.get">>;
6663
+ reorder(args?: Args<"attributes.reorder">, options?: ExamplaryRequestOptions): Promise<Response<"attributes.reorder">>;
6424
6664
  /**
6425
- * Regenerate question
6665
+ * Update attribute
6426
6666
  *
6427
- * Update a question using an AI prompt.
6667
+ * Update an existing attribute in the current workspace.
6428
6668
  *
6429
- * API endpoint: `POST /exams/{examId}/questions/{questionId}/generate`
6669
+ * API endpoint: `POST /attributes/{id}`
6430
6670
  */
6431
- regenerate(args: Args<"exams.questions.regenerate">, options?: ExamplaryRequestOptions): Promise<Response<"exams.questions.regenerate">>;
6671
+ update(args: Args<"attributes.update">, options?: ExamplaryRequestOptions): Promise<Response<"attributes.update">>;
6672
+ /**
6673
+ * Delete attribute
6674
+ *
6675
+ * Delete a custom attribute from the current workspace. Default attributes cannot be deleted.
6676
+ *
6677
+ * API endpoint: `DELETE /attributes/{id}`
6678
+ */
6679
+ delete(id: string, options?: ExamplaryRequestOptions): Promise<Response<"attributes.delete">>;
6680
+ delete(args: Args<"attributes.delete">, options?: ExamplaryRequestOptions): Promise<Response<"attributes.delete">>;
6432
6681
  }
6433
- declare class ExamsExport {
6682
+ declare class Taxonomies {
6434
6683
  private readonly ctx;
6435
6684
  constructor(ctx: ClientContext);
6436
6685
  /**
6437
- * Export QTI 3 package
6686
+ * Get taxonomies
6438
6687
  *
6439
- * Export an exam as a QTI 3 ZIP package.
6688
+ * Get a list available taxonomies, including defaults and taxonomies created in the current workspace.
6440
6689
  *
6441
- * API endpoint: `POST /exams/{examId}/export/qti3-zip`
6690
+ * API endpoint: `GET /taxonomies`
6442
6691
  */
6443
- qti3Zip(examId: string, options?: ExamplaryRequestOptions): Promise<Response<"exams.export.qti3Zip">>;
6444
- qti3Zip(args: Args<"exams.export.qti3Zip">, options?: ExamplaryRequestOptions): Promise<Response<"exams.export.qti3Zip">>;
6692
+ list(args?: Args<"taxonomies.list">, options?: ExamplaryRequestOptions): Promise<Response<"taxonomies.list">>;
6445
6693
  /**
6446
- * Export QTI 2.1 package
6694
+ * Create taxonomy
6447
6695
  *
6448
- * Export an exam as a QTI 2.1 ZIP package.
6696
+ * Save a new taxonomy in the current workspace.
6449
6697
  *
6450
- * API endpoint: `POST /exams/{examId}/export/qti21-zip`
6698
+ * API endpoint: `POST /taxonomies`
6451
6699
  */
6452
- qti21Zip(examId: string, options?: ExamplaryRequestOptions): Promise<Response<"exams.export.qti21Zip">>;
6453
- qti21Zip(args: Args<"exams.export.qti21Zip">, options?: ExamplaryRequestOptions): Promise<Response<"exams.export.qti21Zip">>;
6454
- }
6455
- declare class Exams {
6456
- private readonly ctx;
6457
- readonly sessions: ExamsSessions;
6458
- readonly questions: ExamsQuestions;
6459
- readonly export: ExamsExport;
6460
- constructor(ctx: ClientContext);
6700
+ create(args?: Args<"taxonomies.create">, options?: ExamplaryRequestOptions): Promise<Response<"taxonomies.create">>;
6461
6701
  /**
6462
- * List exams
6702
+ * Update taxonomy
6463
6703
  *
6464
- * Get a list of all exams within your workspace.
6704
+ * Update an existing taxonomy in the current workspace.
6465
6705
  *
6466
- * API endpoint: `GET /exams`
6706
+ * API endpoint: `POST /taxonomies/{id}`
6467
6707
  */
6468
- list(args?: Args<"exams.list">, options?: ExamplaryRequestOptions): Promise<Response<"exams.list">>;
6708
+ update(args: Args<"taxonomies.update">, options?: ExamplaryRequestOptions): Promise<Response<"taxonomies.update">>;
6469
6709
  /**
6470
- * Create exam
6710
+ * Delete taxonomy
6471
6711
  *
6472
- * Create a new exam within your workspace.
6712
+ * Delete a taxonomy from the current workspace. This fails if there are any exams associated with the taxonomy.
6473
6713
  *
6474
- * API endpoint: `POST /exams`
6714
+ * API endpoint: `DELETE /taxonomies/{id}`
6475
6715
  */
6476
- create(args?: Args<"exams.create">, options?: ExamplaryRequestOptions): Promise<Response<"exams.create">>;
6716
+ delete(id: string, options?: ExamplaryRequestOptions): Promise<Response<"taxonomies.delete">>;
6717
+ delete(args: Args<"taxonomies.delete">, options?: ExamplaryRequestOptions): Promise<Response<"taxonomies.delete">>;
6718
+ }
6719
+ declare class Permissions {
6720
+ private readonly ctx;
6721
+ constructor(ctx: ClientContext);
6477
6722
  /**
6478
- * Import exam
6723
+ * Autocomplete users and groups
6479
6724
  *
6480
- * Create an exam by importing one or more source materials (e.g. an existing exam).
6725
+ * Search for users and groups to share with. Returns matches by name or email. Respects restricted group visibility.
6481
6726
  *
6482
- * API endpoint: `POST /exams/import`
6727
+ * API endpoint: `GET /permissions/autocomplete`
6483
6728
  */
6484
- import(args?: Args<"exams.import">, options?: ExamplaryRequestOptions): Promise<Response<"exams.import">>;
6729
+ autocomplete(args: Args<"permissions.autocomplete">, options?: ExamplaryRequestOptions): Promise<Response<"permissions.autocomplete">>;
6485
6730
  /**
6486
- * Get exam
6731
+ * Get sharing permissions
6487
6732
  *
6488
- * Get a single exam by its ID.
6733
+ * Get a list of users, groups and orgs that have access to a specific resource.
6489
6734
  *
6490
- * API endpoint: `GET /exams/{id}`
6735
+ * API endpoint: `GET /permissions/{resource}`
6491
6736
  */
6492
- get(id: string, options?: ExamplaryRequestOptions): Promise<Response<"exams.get">>;
6493
- get(args: Args<"exams.get">, options?: ExamplaryRequestOptions): Promise<Response<"exams.get">>;
6737
+ list(resource: string, options?: ExamplaryRequestOptions): Promise<Response<"permissions.list">>;
6738
+ list(args: Args<"permissions.list">, options?: ExamplaryRequestOptions): Promise<Response<"permissions.list">>;
6494
6739
  /**
6495
- * Update exam
6740
+ * Create permission
6496
6741
  *
6497
- * Update an existing exam.
6742
+ * Create a new permission for a specific resource, or update the role of an existing actor.
6498
6743
  *
6499
- * API endpoint: `POST /exams/{id}`
6744
+ * API endpoint: `POST /permissions/{resource}`
6500
6745
  */
6501
- update(id: string, options?: ExamplaryRequestOptions): Promise<Response<"exams.update">>;
6502
- update(args: Args<"exams.update">, options?: ExamplaryRequestOptions): Promise<Response<"exams.update">>;
6746
+ assign(args: Args<"permissions.assign">, options?: ExamplaryRequestOptions): Promise<Response<"permissions.assign">>;
6503
6747
  /**
6504
- * Delete exam
6748
+ * Get actor role
6505
6749
  *
6506
- * Delete the exam.
6750
+ * Get the role of a specific actor for a specific resource.
6507
6751
  *
6508
- * API endpoint: `DELETE /exams/{id}`
6752
+ * API endpoint: `GET /permissions/{resource}/{actor}`
6509
6753
  */
6510
- delete(id: string, options?: ExamplaryRequestOptions): Promise<Response<"exams.delete">>;
6511
- delete(args: Args<"exams.delete">, options?: ExamplaryRequestOptions): Promise<Response<"exams.delete">>;
6754
+ getActorRole(args: Args<"permissions.getActorRole">, options?: ExamplaryRequestOptions): Promise<Response<"permissions.getActorRole">>;
6512
6755
  /**
6513
- * Duplicate exam
6756
+ * Remove permission
6514
6757
  *
6515
- * Duplicate the exam's questions and settings to a new exam.
6758
+ * Remove a permission for a specific actor on a specific resource.
6516
6759
  *
6517
- * API endpoint: `POST /exams/{examId}/duplicate`
6760
+ * API endpoint: `DELETE /permissions/{resource}/{actor}`
6518
6761
  */
6519
- duplicate(args: Args<"exams.duplicate">, options?: ExamplaryRequestOptions): Promise<Response<"exams.duplicate">>;
6762
+ delete(args: Args<"permissions.delete">, options?: ExamplaryRequestOptions): Promise<Response<"permissions.delete">>;
6763
+ }
6764
+ declare class StudentLevels {
6765
+ private readonly ctx;
6766
+ constructor(ctx: ClientContext);
6520
6767
  /**
6521
- * Print exam
6768
+ * List available student levels
6522
6769
  *
6523
- * Export an exam to a PDF file or Word document.
6770
+ * Get a list of available default student levels.
6524
6771
  *
6525
- * API endpoint: `POST /exams/{examId}/print`
6772
+ * API endpoint: `GET /student-levels`
6526
6773
  */
6527
- print(examId: string, options?: ExamplaryRequestOptions): Promise<Response<"exams.print">>;
6528
- print(args: Args<"exams.print">, options?: ExamplaryRequestOptions): Promise<Response<"exams.print">>;
6774
+ list(args?: Args<"studentLevels.list">, options?: ExamplaryRequestOptions): Promise<Response<"studentLevels.list">>;
6775
+ }
6776
+ declare class Users {
6777
+ private readonly ctx;
6778
+ constructor(ctx: ClientContext);
6529
6779
  /**
6530
- * Generate exam
6780
+ * List users
6531
6781
  *
6532
- * Initiate a job to generate new questions for the exam using AI, based on the source materials and metadata specified.
6782
+ * Get a list of all users in the workspace.
6533
6783
  *
6534
- * API endpoint: `POST /exams/{examId}/generate`
6784
+ * API endpoint: `GET /users`
6535
6785
  */
6536
- startGeneration(examId: string, options?: ExamplaryRequestOptions): Promise<Response<"exams.startGeneration">>;
6537
- startGeneration(args: Args<"exams.startGeneration">, options?: ExamplaryRequestOptions): Promise<Response<"exams.startGeneration">>;
6786
+ list(args?: Args<"users.list">, options?: ExamplaryRequestOptions): Promise<Response<"users.list">>;
6538
6787
  /**
6539
- * Cancel exam generation
6788
+ * Create user
6540
6789
  *
6541
- * Cancel an ongoing job to generate new questions for the exam using AI.
6790
+ * Create a new user in the workspace.
6542
6791
  *
6543
- * API endpoint: `POST /exams/{examId}/generate/cancel`
6792
+ * API endpoint: `POST /users`
6544
6793
  */
6545
- cancelGeneration(examId: string, options?: ExamplaryRequestOptions): Promise<Response<"exams.cancelGeneration">>;
6546
- cancelGeneration(args: Args<"exams.cancelGeneration">, options?: ExamplaryRequestOptions): Promise<Response<"exams.cancelGeneration">>;
6794
+ create(args?: Args<"users.create">, options?: ExamplaryRequestOptions): Promise<Response<"users.create">>;
6547
6795
  /**
6548
- * Get exam context suggestions
6796
+ * Update user role
6549
6797
  *
6550
- * Get AI-generated suggestions for context/instructions to include in the exam generation prompt, based on the source materials linked to the exam.
6798
+ * Update a user's role within the workspace.
6551
6799
  *
6552
- * API endpoint: `GET /exams/{examId}/context-suggestions`
6800
+ * API endpoint: `PATCH /users/{id}`
6553
6801
  */
6554
- getContextSuggestions(examId: string, options?: ExamplaryRequestOptions): Promise<Response<"exams.getContextSuggestions">>;
6555
- getContextSuggestions(args: Args<"exams.getContextSuggestions">, options?: ExamplaryRequestOptions): Promise<Response<"exams.getContextSuggestions">>;
6802
+ update(id: string, options?: ExamplaryRequestOptions): Promise<Response<"users.update">>;
6803
+ update(args: Args<"users.update">, options?: ExamplaryRequestOptions): Promise<Response<"users.update">>;
6804
+ /**
6805
+ * Delete user
6806
+ *
6807
+ * Delete a user from the workspace.
6808
+ *
6809
+ * API endpoint: `DELETE /users/{id}`
6810
+ */
6811
+ delete(id: string, options?: ExamplaryRequestOptions): Promise<Response<"users.delete">>;
6812
+ delete(args: Args<"users.delete">, options?: ExamplaryRequestOptions): Promise<Response<"users.delete">>;
6556
6813
  }
6557
6814
  declare class PracticeSpacesStudents {
6558
6815
  private readonly ctx;
@@ -6938,6 +7195,7 @@ declare class Examplary {
6938
7195
  readonly library: Library;
6939
7196
  readonly oauth: Oauth;
6940
7197
  readonly embedSessions: EmbedSessions;
7198
+ readonly exams: Exams;
6941
7199
  readonly me: Me;
6942
7200
  readonly media: Media;
6943
7201
  readonly org: Org;
@@ -6948,7 +7206,6 @@ declare class Examplary {
6948
7206
  readonly permissions: Permissions;
6949
7207
  readonly studentLevels: StudentLevels;
6950
7208
  readonly users: Users;
6951
- readonly exams: Exams;
6952
7209
  readonly practiceSpaces: PracticeSpaces;
6953
7210
  readonly sourceMaterials: SourceMaterials;
6954
7211
  readonly folders: Folders;