[{"data":1,"prerenderedAt":7738},["ShallowReactive",2],{"api-nav":3,"api-errors":351},[4,28,57,95,115,301,317,331],{"id":5,"title":6,"links":7,"groups":27},"start","Start here",[8,11,15,18,21,24],{"title":9,"to":10},"Overview","\u002Fapi",{"title":12,"to":13,"status":14},"Quickstart","\u002Fapi\u002Fquickstart","available",{"title":16,"to":17,"status":14},"Environments","\u002Fapi\u002Fenvironments",{"title":19,"to":20,"status":14},"Authentication","\u002Fapi\u002Fauthentication",{"title":22,"to":23,"status":14},"Organizations","\u002Fapi\u002Forganizations",{"title":25,"to":26,"status":14},"Permissions","\u002Fapi\u002Fpermissions",[],{"id":29,"title":30,"links":31,"groups":56},"concepts","Concepts",[32,35,38,41,44,47,50,53],{"title":33,"to":34,"status":14},"Requests and responses","\u002Fapi\u002Frequests-and-responses",{"title":36,"to":37,"status":14},"Identifiers","\u002Fapi\u002Fidentifiers",{"title":39,"to":40,"status":14},"Pagination","\u002Fapi\u002Fpagination",{"title":42,"to":43},"Errors","\u002Fapi\u002Ferrors",{"title":45,"to":46,"status":14},"Rate limits","\u002Fapi\u002Frate-limits",{"title":48,"to":49,"status":14},"Retries","\u002Fapi\u002Fretries-and-idempotency",{"title":51,"to":52,"status":14},"Security","\u002Fapi\u002Fsecurity",{"title":54,"to":55,"status":14},"Versioning","\u002Fapi\u002Fversioning",[],{"id":58,"title":59,"links":60,"groups":94},"resources","Guides",[61,64,67,70,73,76,79,82,85,88,91],{"title":62,"to":63,"status":14},"Students","\u002Fapi\u002Fguides\u002Fstudents",{"title":65,"to":66,"status":14},"Bulk registration","\u002Fapi\u002Fguides\u002Fbulk-registration",{"title":68,"to":69,"status":14},"Passwords","\u002Fapi\u002Fguides\u002Fpasswords",{"title":71,"to":72,"status":14},"Supervisors","\u002Fapi\u002Fguides\u002Fsupervisors",{"title":74,"to":75,"status":14},"Reference data","\u002Fapi\u002Fguides\u002Freference-data",{"title":77,"to":78,"status":14},"API account","\u002Fapi\u002Fguides\u002Fapi-account",{"title":80,"to":81,"status":14},"Sign-in links","\u002Fapi\u002Fguides\u002Fsign-in-links",{"title":83,"to":84,"status":14},"Exams","\u002Fapi\u002Fguides\u002Fexams",{"title":86,"to":87,"status":14},"Applications","\u002Fapi\u002Fguides\u002Fapplications",{"title":89,"to":90,"status":14},"Group challenges","\u002Fapi\u002Fguides\u002Fgroup-challenges",{"title":92,"to":93,"status":14},"Certificates and reports","\u002Fapi\u002Fguides\u002Fcertificates-and-reports",[],{"id":96,"title":97,"links":98,"groups":114},"tutorials","Tutorials",[99,102,105,108,111],{"title":100,"to":101,"status":14},"Register and apply","\u002Fapi\u002Ftutorials\u002Fregister-and-apply",{"title":103,"to":104,"status":14},"Send a student to the panel","\u002Fapi\u002Ftutorials\u002Fsend-student-to-panel",{"title":106,"to":107,"status":14},"Change an application","\u002Fapi\u002Ftutorials\u002Fchange-an-application",{"title":109,"to":110,"status":14},"Collect results","\u002Fapi\u002Ftutorials\u002Fcollect-results",{"title":112,"to":113,"status":14},"Token handling","\u002Fapi\u002Ftutorials\u002Ftoken-handling",[],{"id":116,"title":117,"links":118,"groups":125},"reference","Reference",[119,122],{"title":120,"to":121},"All endpoints","\u002Fapi\u002Freference",{"title":123,"to":124},"Sandbox console","\u002Fapi\u002Fconsole",[126,135,145,166,206,212,230,255,271],{"tag":127,"slug":128,"links":129},"Health","health",[130],{"title":131,"to":132,"method":133,"deprecated":134},"Check that the API is up","\u002Fapi\u002Freference\u002Fget-health","GET",false,{"tag":77,"slug":136,"links":137},"api-account",[138,142],{"title":139,"to":140,"method":141,"deprecated":134},"Revoke the token you send, before it expires","\u002Fapi\u002Freference\u002Frevoke-token","POST",{"title":143,"to":144,"method":133,"deprecated":134},"Fetch the API account your token belongs to","\u002Fapi\u002Freference\u002Fget-current-api-account",{"tag":74,"slug":146,"links":147},"reference-data",[148,151,154,157,160,163],{"title":149,"to":150,"method":133,"deprecated":134},"List the countries a student can be registered in","\u002Fapi\u002Freference\u002Flist-countries",{"title":152,"to":153,"method":133,"deprecated":134},"Fetch one country by its id","\u002Fapi\u002Freference\u002Fget-country",{"title":155,"to":156,"method":133,"deprecated":134},"List the grades a student can be registered with","\u002Fapi\u002Freference\u002Flist-grades",{"title":158,"to":159,"method":133,"deprecated":134},"Fetch one grade by its id","\u002Fapi\u002Freference\u002Fget-grade",{"title":161,"to":162,"method":133,"deprecated":134},"List the organizations and their ids","\u002Fapi\u002Freference\u002Flist-organizations",{"title":164,"to":165,"method":133,"deprecated":134},"Fetch one organization by its id","\u002Fapi\u002Freference\u002Fget-organization",{"tag":62,"slug":167,"links":168},"students",[169,172,175,178,181,184,187,191,194,197,200,203],{"title":170,"to":171,"method":133,"deprecated":134},"List your students","\u002Fapi\u002Freference\u002Flist-students",{"title":173,"to":174,"method":141,"deprecated":134},"Register a student","\u002Fapi\u002Freference\u002Fregister-student",{"title":176,"to":177,"method":141,"deprecated":134},"Check a registration without registering the student","\u002Fapi\u002Freference\u002Fcheck-student-registration",{"title":179,"to":180,"method":141,"deprecated":134},"Register many students at once","\u002Fapi\u002Freference\u002Fcreate-student-import",{"title":182,"to":183,"method":133,"deprecated":134},"Follow a batch of students you sent","\u002Fapi\u002Freference\u002Fget-student-import",{"title":185,"to":186,"method":133,"deprecated":134},"Fetch one of your students","\u002Fapi\u002Freference\u002Fget-student",{"title":188,"to":189,"method":190,"deprecated":134},"Update one of your students","\u002Fapi\u002Freference\u002Fupdate-student","PUT",{"title":192,"to":193,"method":190,"deprecated":134},"Set the sign-in password of one of your students","\u002Fapi\u002Freference\u002Fset-student-password",{"title":195,"to":196,"method":133,"deprecated":134},"List your students who can use this organization","\u002Fapi\u002Freference\u002Flist-org-students",{"title":198,"to":199,"method":133,"deprecated":134},"Fetch one of your students, if they can use this organization","\u002Fapi\u002Freference\u002Fget-org-student",{"title":201,"to":202,"method":190,"deprecated":134},"Update one of your students and give them access to this organization","\u002Fapi\u002Freference\u002Fupdate-org-student",{"title":204,"to":205,"method":190,"deprecated":134},"Link one of your students to a supervisor on this organization","\u002Fapi\u002Freference\u002Flink-student-supervisor",{"tag":80,"slug":207,"links":208},"sign-in-links",[209],{"title":210,"to":211,"method":141,"deprecated":134},"Create a single-use sign-in link for one of your students","\u002Fapi\u002Freference\u002Fcreate-signin-link",{"tag":83,"slug":213,"links":214},"exams",[215,218,221,224,227],{"title":216,"to":217,"method":133,"deprecated":134},"List the exams open for applications","\u002Fapi\u002Freference\u002Flist-exams",{"title":219,"to":220,"method":133,"deprecated":134},"List an organization’s exam categories","\u002Fapi\u002Freference\u002Flist-exam-categories",{"title":222,"to":223,"method":133,"deprecated":134},"Fetch one exam category","\u002Fapi\u002Freference\u002Fget-exam-category",{"title":225,"to":226,"method":133,"deprecated":134},"List the exams one of your students can apply to","\u002Fapi\u002Freference\u002Flist-available-exams",{"title":228,"to":229,"method":133,"deprecated":134},"Fetch one exam that is open for applications","\u002Fapi\u002Freference\u002Fget-exam",{"tag":86,"slug":231,"links":232},"applications",[233,236,239,242,245,248,251],{"title":234,"to":235,"method":133,"deprecated":134},"List your students’ applications in this organization","\u002Fapi\u002Freference\u002Flist-applications",{"title":237,"to":238,"method":141,"deprecated":134},"Enter one of your students for an exam","\u002Fapi\u002Freference\u002Fcreate-application",{"title":240,"to":241,"method":133,"deprecated":134},"List your students’ applications for one exam","\u002Fapi\u002Freference\u002Flist-exam-applications",{"title":243,"to":244,"method":133,"deprecated":134},"List one of your students’ applications in this organization","\u002Fapi\u002Freference\u002Flist-student-applications",{"title":246,"to":247,"method":133,"deprecated":134},"Fetch one of your students’ applications","\u002Fapi\u002Freference\u002Fget-application",{"title":249,"to":250,"method":190,"deprecated":134},"Move one of your students’ applications to another exam","\u002Fapi\u002Freference\u002Fmove-application",{"title":252,"to":253,"method":254,"deprecated":134},"Withdraw one of your students from an exam","\u002Fapi\u002Freference\u002Fdelete-application","DELETE",{"tag":256,"slug":257,"links":258},"Documents","documents",[259,262,265,268],{"title":260,"to":261,"method":133,"deprecated":134},"Download a certificate file","\u002Fapi\u002Freference\u002Fdownload-certificate",{"title":263,"to":264,"method":133,"deprecated":134},"List one of your students’ released certificates","\u002Fapi\u002Freference\u002Flist-student-certificates",{"title":266,"to":267,"method":133,"deprecated":134},"Download a result report file","\u002Fapi\u002Freference\u002Fdownload-report",{"title":269,"to":270,"method":133,"deprecated":134},"List one of your students’ released result reports","\u002Fapi\u002Freference\u002Flist-student-reports",{"tag":89,"slug":272,"links":273},"group-challenges",[274,277,280,283,286,289,292,295,298],{"title":275,"to":276,"method":133,"deprecated":134},"List the group challenges an organization runs","\u002Fapi\u002Freference\u002Flist-group-challenges",{"title":278,"to":279,"method":133,"deprecated":134},"Fetch one group challenge","\u002Fapi\u002Freference\u002Fget-group-challenge",{"title":281,"to":282,"method":133,"deprecated":134},"List the groups your students are in for a group challenge","\u002Fapi\u002Freference\u002Flist-group-challenge-groups",{"title":284,"to":285,"method":133,"deprecated":134},"Fetch one group, with its steps and files","\u002Fapi\u002Freference\u002Fget-group-challenge-group",{"title":287,"to":288,"method":133,"deprecated":134},"List what has happened in one group","\u002Fapi\u002Freference\u002Flist-group-challenge-activity",{"title":290,"to":291,"method":141,"deprecated":134},"Send a group’s finished work for one of your students","\u002Fapi\u002Freference\u002Fsubmit-group-challenge-work",{"title":293,"to":294,"method":141,"deprecated":134},"Submit one step of a group for one of your students","\u002Fapi\u002Freference\u002Fsubmit-group-challenge-step",{"title":296,"to":297,"method":133,"deprecated":134},"List your students’ eligibility and groups for a group challenge","\u002Fapi\u002Freference\u002Flist-group-challenge-students",{"title":299,"to":300,"method":133,"deprecated":134},"Fetch one of your students’ eligibility and group for a group challenge","\u002Fapi\u002Freference\u002Fget-group-challenge-student",{"id":302,"title":303,"links":304,"groups":316},"clients","Clients",[305,307,310,313],{"title":9,"to":306,"status":14},"\u002Fapi\u002Fclients",{"title":308,"to":309,"status":14},"Node.js","\u002Fapi\u002Fclients\u002Fnode",{"title":311,"to":312,"status":14},"PHP","\u002Fapi\u002Fclients\u002Fphp",{"title":314,"to":315,"status":14},"Build your own","\u002Fapi\u002Fclients\u002Fbuild-your-own",[],{"id":318,"title":319,"links":320,"groups":330},"agents","AI agents",[321,324,327],{"title":322,"to":323},"AI connections","\u002Fapi\u002Fmcp",{"title":325,"to":326},"What it can do","\u002Fapi\u002Fmcp\u002Ftools",{"title":328,"to":329},"Agent skills","\u002Fapi\u002Fskills",[],{"id":332,"title":333,"links":334,"groups":350},"help","Help",[335,338,341,344,347],{"title":336,"to":337,"status":14},"Glossary","\u002Fapi\u002Fglossary",{"title":339,"to":340,"status":14},"FAQ","\u002Fapi\u002Ffaq",{"title":342,"to":343,"status":14},"Troubleshooting","\u002Fapi\u002Ftroubleshooting",{"title":345,"to":346,"status":14},"Support","\u002Fapi\u002Fsupport",{"title":348,"to":349},"Changelog","\u002Fapi\u002Fchangelog",[],{"returnedBy":352,"messages":819,"envelope":1030,"cards":1031,"guides":7737},{"bad_request":353,"unauthorized":528,"forbidden":552,"too_many_requests":622,"internal_error":629,"not_found":639,"conflict":712,"payload_too_large":791,"unsupported_media_type":798,"unprocessable_entity":802,"service_unavailable":806},[354,359,368,373,376,403,406,409,412,415,418,421,424,427,430,435,446,449,452,455,458,463,468,471,474,477,482,485,492,495,502,509,522,525],{"when":355,"ops":356},"The token could not be read back or has no `exp`. A token that passed authentication always can, so you should never see this; nothing was revoked.",[357],{"slug":358,"method":141,"summary":139},"revoke-token",{"when":360,"ops":361},"`id` is not 24 hexadecimal digits.",[362,364,366],{"slug":363,"method":133,"summary":152},"get-country",{"slug":365,"method":133,"summary":158},"get-grade",{"slug":367,"method":133,"summary":164},"get-organization",{"when":369,"ops":370},"`email` is empty, is given twice, or holds a value that is not an email address.",[371],{"slug":372,"method":133,"summary":170},"list-students",{"when":374,"ops":375},"`email` lists more than 100 addresses.",[371],{"when":377,"ops":378},"The body is not valid JSON, breaks a field’s rules, or has a field this operation does not accept (\"property \u003Cname> should not exist\").",[379,381,383,385,387,389,391,393,395,397,399,401],{"slug":380,"method":141,"summary":173},"register-student",{"slug":382,"method":141,"summary":176},"check-student-registration",{"slug":384,"method":141,"summary":179},"create-student-import",{"slug":386,"method":190,"summary":188},"update-student",{"slug":388,"method":190,"summary":192},"set-student-password",{"slug":390,"method":190,"summary":201},"update-org-student",{"slug":392,"method":190,"summary":204},"link-student-supervisor",{"slug":394,"method":141,"summary":210},"create-signin-link",{"slug":396,"method":141,"summary":237},"create-application",{"slug":398,"method":190,"summary":249},"move-application",{"slug":400,"method":141,"summary":290},"submit-group-challenge-work",{"slug":402,"method":141,"summary":293},"submit-group-challenge-step",{"when":404,"ops":405},"`country` is not the `_id` of a country `listCountries` lists, or the country has no two-letter code to begin a username with.",[379],{"when":407,"ops":408},"`grade`, `city` or `school` matches nothing: no record has that `_id`, and none has that name (within `country`, and for a school within `city` too).",[379],{"when":410,"ops":411},"`lastName` is missing or empty.",[379,381],{"when":413,"ops":414},"`birth` is not `DD\u002FMM\u002FYYYY`, or is not a date that exists, such as `31\u002F02\u002F2008`.",[379,381],{"when":416,"ops":417},"`password` is shorter than 5 characters, longer than 72 bytes, or contains the student’s own name or email address.",[379],{"when":419,"ops":420},"`password` was sent. The check never takes one: leave it out, and send it with `registerStudent` only.",[381],{"when":422,"ops":423},"A row breaks one of `registerStudent`’s rules. The message names the row and the property, counting rows from 0.",[383],{"when":425,"ops":426},"`students` has fewer than 30 rows or more than 1000. Below 30, call `registerStudent` per student.",[383],{"when":428,"ops":429},"A row carries `password`, which this operation does not take, or any other property it does not accept.",[383],{"when":431,"ops":432},"`importId` is not 24 hexadecimal digits.",[433],{"slug":434,"method":133,"summary":182},"get-student-import",{"when":436,"ops":437},"`studentId` is not 24 hexadecimal digits.",[438,385,387,440,442,444],{"slug":439,"method":133,"summary":185},"get-student",{"slug":441,"method":133,"summary":225},"list-available-exams",{"slug":443,"method":133,"summary":243},"list-student-applications",{"slug":445,"method":133,"summary":299},"get-group-challenge-student",{"when":447,"ops":448},"`email` is `null`: an address can be changed, not removed.",[385],{"when":450,"ops":451},"`firstName`, `lastName`, `birth`, `sex`, `phone` or `activatedPlatformsThisSeason` is `null`, or `firstName` or `lastName` is empty. These can be changed, not removed; clear `phone` with `\"\"`.",[385,389],{"when":453,"ops":454},"`country`, `grade`, `city` or `school` matches nothing or is `null`, or a `city` or `school` name cannot be looked up because the student has no country, or no city for a school.",[385],{"when":456,"ops":457},"`password` contains the student’s first name, surname, username or email address, as stored.",[387],{"when":459,"ops":460},"`signedIn` is given, and is neither `true` nor `false`.",[461],{"slug":462,"method":133,"summary":195},"list-org-students",{"when":464,"ops":465},"`studentId` is not a well-formed id.",[466,389,391],{"slug":467,"method":133,"summary":198},"get-org-student",{"when":469,"ops":470},"`country`, `grade`, `city` or `school` matches no record, by id or by name, or a `city` or `school` name was sent for a student with no country (or, for a school, no city) to look it up in.",[389],{"when":472,"ops":473},"`email` is `null`: an address can be changed, not removed. Any other value that is not an address is refused by the body’s rules (\"email must be an email\").",[389],{"when":475,"ops":476},"`redirect` is not a path on the panel: it needs one leading `\u002F`, and no whitespace or backslash anywhere.",[393],{"when":478,"ops":479},"`categoryId` is not 24 hexadecimal digits.",[480],{"slug":481,"method":133,"summary":222},"get-exam-category",{"when":483,"ops":484},"The student has no grade. Every exam is restricted to a set of grades, so no exam could be offered; set one first.",[440],{"when":486,"ops":487},"`examId` is not 24 hexadecimal digits.",[488,490],{"slug":489,"method":133,"summary":228},"get-exam",{"slug":491,"method":133,"summary":240},"list-exam-applications",{"when":493,"ops":494},"The exam is open, but the student has no grade. Set one with `updateOrgStudent` or `updateStudent`, then try again.",[395,397],{"when":496,"ops":497},"`applicationId` is not 24 hexadecimal digits.",[498,397,500],{"slug":499,"method":133,"summary":246},"get-application",{"slug":501,"method":254,"summary":252},"delete-application",{"when":503,"ops":504},"`userId` is not 24 hexadecimal digits.",[505,507],{"slug":506,"method":133,"summary":263},"list-student-certificates",{"slug":508,"method":133,"summary":269},"list-student-reports",{"when":510,"ops":511},"`challengeId` is not 24 hexadecimal digits.",[512,514,516,518,399,401,520,444],{"slug":513,"method":133,"summary":278},"get-group-challenge",{"slug":515,"method":133,"summary":281},"list-group-challenge-groups",{"slug":517,"method":133,"summary":284},"get-group-challenge-group",{"slug":519,"method":133,"summary":287},"list-group-challenge-activity",{"slug":521,"method":133,"summary":296},"list-group-challenge-students",{"when":523,"ops":524},"`groupId` is not 24 hexadecimal digits.",[516,518,399,401],{"when":526,"ops":527},"`stepId` is not 24 hexadecimal digits.",[401],[529],{"when":530,"ops":531},"The token is missing or malformed, is not signed with your account’s `apiSecret`, breaks the `iat` and `exp` rules, has expired or been revoked, or its account is not active. All of these answer the same.",[357,532,534,362,536,364,538,366,371,379,381,383,433,438,385,387,461,466,389,391,393,540,542,480,440,488,544,395,490,442,498,397,500,546,505,548,507,550,512,514,516,518,399,401,520,444],{"slug":533,"method":133,"summary":143},"get-current-api-account",{"slug":535,"method":133,"summary":149},"list-countries",{"slug":537,"method":133,"summary":155},"list-grades",{"slug":539,"method":133,"summary":161},"list-organizations",{"slug":541,"method":133,"summary":216},"list-exams",{"slug":543,"method":133,"summary":219},"list-exam-categories",{"slug":545,"method":133,"summary":234},"list-applications",{"slug":547,"method":133,"summary":260},"download-certificate",{"slug":549,"method":133,"summary":266},"download-report",{"slug":551,"method":133,"summary":275},"list-group-challenges",[553,556,559,562,565,568,571,574,577,580,583,586,589,592,595,598,601,604,607,610,613,616,619],{"when":554,"ops":555},"The token is valid, but no role on your account allows `api\u002F*` on `mto`, the organization every operation without `:organizationId` acts on, or a role denies it.",[357,532],{"when":557,"ops":558},"The token is valid, but no role on your account allows `country\u002Fread` on `mto`, the organization every operation without `:organizationId` acts on, or a role denies it.",[534,362],{"when":560,"ops":561},"The token is valid, but no role on your account allows `grade\u002Fread` on `mto`, the organization every operation without `:organizationId` acts on, or a role denies it.",[536,364],{"when":563,"ops":564},"The token is valid, but no role on your account allows `organization\u002Fread` on `mto`, the organization every operation without `:organizationId` acts on, or a role denies it.",[538,366],{"when":566,"ops":567},"The token is valid, but no role on your account allows `student\u002Fread` on `mto`, the organization every operation without `:organizationId` acts on, or a role denies it.",[371,438],{"when":569,"ops":570},"The token is valid, but no role on your account allows `student\u002Fcreate` on `mto`, the organization every operation without `:organizationId` acts on, or a role denies it.",[379,381,383,433],{"when":572,"ops":573},"`password` was sent, and your account does not hold `auth\u002Fsignin` on `mto`. Nothing was written.",[379],{"when":575,"ops":576},"The token is valid, but no role on your account allows `student\u002Fupdate` on `mto`, the organization every operation without `:organizationId` acts on, or a role denies it.",[385],{"when":578,"ops":579},"The token is valid, but no role on your account allows `auth\u002Fsignin` on `mto`, the organization every operation without `:organizationId` acts on, or a role denies it.",[387],{"when":581,"ops":582},"The token is valid, but no role on your account allows `student\u002Fread` on the organization in the path, or a role denies it.",[461,466],{"when":584,"ops":585},"The token is valid, but no role on your account allows `student\u002Fupdate` on the organization in the path, or a role denies it.",[389,391],{"when":587,"ops":588},"The token is valid, but no role on your account allows `auth\u002Fsignin` on the organization in the path, or a role denies it.",[393],{"when":590,"ops":591},"The student has no access to this organization: their `activatedPlatformsThisSeason` holds neither its `slug` nor `common`. Grant it with `updateOrgStudent`, then ask again.",[393],{"when":593,"ops":594},"The token is valid, but no role on your account allows `exam\u002Fread` on the organization in the path, or a role denies it.",[540,440,488],{"when":596,"ops":597},"The token is valid, but no role on your account allows `exam-category\u002Fread` on the organization in the path, or a role denies it.",[542,480],{"when":599,"ops":600},"The token is valid, but no role on your account allows `application\u002Fread` on the organization in the path, or a role denies it.",[544,490,442,498],{"when":602,"ops":603},"The token is valid, but no role on your account allows `application\u002Fcreate` on the organization in the path, or a role denies it.",[395],{"when":605,"ops":606},"The token is valid, but no role on your account allows `application\u002Fupdate` on the organization in the path, or a role denies it.",[397],{"when":608,"ops":609},"The token is valid, but no role on your account allows `application\u002Fdelete` on the organization in the path, or a role denies it.",[500],{"when":611,"ops":612},"The token is valid, but no role on your account allows `certificate\u002Fread` on the organization in the path, or a role denies it.",[546,505],{"when":614,"ops":615},"The token is valid, but no role on your account allows `report\u002Fread` on the organization in the path, or a role denies it.",[548,507],{"when":617,"ops":618},"The token is valid, but no role on your account allows `group-challenge\u002Fread` on the organization in the path, or a role denies it.",[550,512,514,516,518,520,444],{"when":620,"ops":621},"The token is valid, but no role on your account allows `group-challenge\u002Fsubmit` on the organization in the path, or a role denies it.",[399,401],[623,626],{"when":624,"ops":625},"Your account has made more than 100 requests to this operation in the current 60-second window. Wait the seconds in `Retry-After` before sending again.",[357,532,534,362,536,364,538,366,371,379,381,433,438,385,387,461,466,389,391,393,540,542,480,440,488,544,395,490,442,498,397,500,546,505,548,507,550,512,514,516,518,399,401,520,444],{"when":627,"ops":628},"Your account has made more than 10 requests to this operation in the current hour. Wait the seconds in `Retry-After` before sending again. This operation has a budget of its own, lower than the 100 per 60 seconds every other operation gets.",[383],[630,633,636],{"when":631,"ops":632},"Something failed on our side. Retry later, and quote `request_id` if it goes on.",[357,532,534,362,536,364,538,366,371,379,381,383,433,438,385,387,461,466,389,391,393,540,542,480,440,488,544,395,490,442,498,397,500,546,505,548,507,550,512,514,516,518,399,401,520,444],{"when":634,"ops":635},"The link could not be issued. Send the request again.",[393],{"when":637,"ops":638},"File storage is not configured or could not be reached.",[546,548],[640,643,646,649,652,655,658,661,664,667,670,673,676,679,682,685,688,691,694,697,700,703,706,709],{"when":641,"ops":642},"No country `listCountries` lists has this `_id`: it matches no country, or it names one of the reserved ones.",[362],{"when":644,"ops":645},"No grade has this `_id`.",[364],{"when":647,"ops":648},"No organization `listOrganizations` lists has this `_id`.",[366],{"when":650,"ops":651},"Bulk registration is not switched on for the environment you are calling. Nothing was queued. Ask support before you build against it.",[383],{"when":653,"ops":654},"No import of yours has this `importId`, it has expired, or bulk registration is not switched on for the environment you are calling. An import another account sent answers the same.",[433],{"when":656,"ops":657},"No student of yours has this `studentId`. A student another account registered answers the same.",[438,385,387],{"when":659,"ops":660},"`organizationId` is not the `_id` of an organization.",[461,466,389,391,393,540,542,480,440,488,544,395,490,442,498,397,500,546,505,548,507,550,512,514,516,518,399,401,520,444],{"when":662,"ops":663},"No student of yours with this id can use this organization: unknown, another account’s, or not activated here.",[466],{"when":665,"ops":666},"No student of yours has this `studentId`. A student registered by another account answers the same.",[389,393],{"when":668,"ops":669},"Any refusal: the student is not yours, this organization has no record of them yet (they have never signed in to it), or no supervisor of this organization has this username.",[391],{"when":671,"ops":672},"`categoryId` names no category in this organization.",[480],{"when":674,"ops":675},"No student of yours has this id: it is nobody’s, or another account’s. Both answer the same.",[440],{"when":677,"ops":678},"No exam in the organization has this id.",[488],{"when":680,"ops":681},"The exam exists but is not open for applications: it is closed to applications, its sitting has started or passed, or its category is inactive.",[488],{"when":683,"ops":684},"No student of yours has this id: it matches nobody, or another account registered the student.",[395,442,505,507,399,401,444],{"when":686,"ops":687},"`examId` is not the `_id` of an exam in this organization.",[395,397],{"when":689,"ops":690},"No application of your students has this id: it matches nothing, or the application belongs to another account’s student. Both get the same answer.",[498,397,500],{"when":692,"ops":693},"No certificate has this id or shortId, it is not released, it belongs to another account's student, it has no file attached, or its file is missing from storage. Every one of these answers the same, so the status says nothing about another account's ids.",[546],{"when":695,"ops":696},"No report has this id or shortId, it is not released, it belongs to another account's student, it has no file attached, or its file is missing from storage. Every one of these answers the same, so the status says nothing about another account's ids.",[548],{"when":698,"ops":699},"Group challenges are not switched on for this organization. The answer is the one an unknown path gets; nothing was read.",[550,512,514,516,518,399,401,520,444],{"when":701,"ops":702},"No group challenge of this organization has this id, or it is not published: a draft, archived or deleted challenge answers the same.",[512,514,516,518,399,401,520,444],{"when":704,"ops":705},"No group of this challenge has this id that one of your students is an active member of: a missing group, a deleted one and another account’s get the same answer.",[516,518],{"when":707,"ops":708},"No group of this challenge has this id with the student as an active member: a missing group, a deleted one and one the student is not in get the same answer.",[399,401],{"when":710,"ops":711},"The group has no step with this id. A group has its steps once the teacher confirms it.",[401],[713,716,719,722,725,728,731,734,737,740,743,746,749,752,755,758,761,764,767,770,773,776,779,782,785,788],{"when":714,"ops":715},"One of your students already has this email address. The message ends with that student’s `_id`.",[379],{"when":717,"ops":718},"Another account registered this email address. The message does not say whose it is.",[379],{"when":720,"ops":721},"You already have an import that has not finished. Read it, and send the next one when it has.",[383],{"when":723,"ops":724},"`email` is changed to an address already registered, by your account or another. The message does not say whose it is.",[385],{"when":726,"ops":727},"The student has confirmed their email address, so the password is theirs to change.",[387],{"when":729,"ops":730},"`email` is already another student’s address. The answer does not say whose.",[389],{"when":732,"ops":733},"The student has never signed in to this organization, so it holds no record of them yet. Send them a sign-in link (`createSigninLink`), and try again once they have used it.",[395,442,399,401,444],{"when":735,"ops":736},"The exam is not open: applications to it are switched off, its sitting date has passed, or its category is inactive.",[395,397],{"when":738,"ops":739},"The exam does not accept the student’s grade. The message names the grades it does accept, such as \"Exam is not available for grade 8. It accepts grade 9, 10.\"",[395,397],{"when":741,"ops":742},"The exam is restricted to countries the student is not in. The message names the countries it is offered in.",[395,397],{"when":744,"ops":745},"The exam has no language set, so it is offered to no student.",[395,397],{"when":747,"ops":748},"For any other reason, `listAvailableExams` leaves the exam out for this student.",[395,397],{"when":750,"ops":751},"The student already holds another exam in the same category on the same sitting, and nobody can sit both. Move that application (`moveApplication`) instead.",[395,397],{"when":753,"ops":754},"The student has started or handed in the exam. Their answers belong to its questions, so the application stays where it is.",[397],{"when":756,"ops":757},"The category of the application’s current exam does not accept the new exam’s category as a replacement. The message names the current category.",[397],{"when":759,"ops":760},"The current exam is in the AI Challenge category and the student has already used some of their image quota.",[397],{"when":762,"ops":763},"The payment is settled and the new exam costs something different. This API neither charges a difference nor refunds; the message names both figures.",[397],{"when":765,"ops":766},"The payment is settled. Cancelling a paid application is a refund, which happens outside this API.",[500],{"when":768,"ops":769},"The student has never signed in to this organization, so it holds no record of them.",[505,507],{"when":771,"ops":772},"The organizers have closed the challenge (`status: closed`).",[399,401],{"when":774,"ops":775},"Now is before `windowStart` or after `windowEnd`. `details` carries both.",[399,401],{"when":777,"ops":778},"The teacher is still preparing the group (`status: awaiting_payment`).",[399,401],{"when":780,"ops":781},"The teacher has not confirmed the group yet (`status: draft`), so it has no steps.",[399,401],{"when":783,"ops":784},"A step is not submitted yet. `details` counts them.",[399],{"when":786,"ops":787},"The step is still locked: the steps before it are not all submitted.",[401],{"when":789,"ops":790},"Nothing has been uploaded for the step yet. A member uploads the work in the panel or the app first; retrying does not help.",[401],[792,795],{"when":793,"ops":794},"The body is larger than 100 kB.",[379,381,385,387,389,391,393,395,397,399,401],{"when":796,"ops":797},"The body is larger than 1.5 MB.",[383],[799],{"when":800,"ops":801},"The body declares a charset that is not a UTF one (send UTF-8), or a `Content-Encoding` other than gzip, deflate or br.",[379,381,383,385,387,389,391,393,395,397,399,401],[803],{"when":804,"ops":805},"One or more rows cannot be registered. Nothing was queued. `error.details.rows` lists every row at fault with a `code` to branch on: `invalid_field`, `unexpected_field`, `unknown_reference`, `duplicate_in_request`, `email_taken_by_your_student` (with that student’s `_id`) and `email_unavailable`, which never says who holds the address. The list is left out, and only counted, when the only problem is unavailable addresses and your account has already been shown those rows several times today.",[383],[807,810,813,816],{"when":808,"ops":809},"This server is already checking another batch. Nothing was queued; wait the seconds in `Retry-After` and send it again.",[383],{"when":811,"ops":812},"Bulk registration is paused for a scheduled window, such as an exam morning. Nothing was queued; `Retry-After` is how long the window lasts. An import already queued is not lost — it waits and then runs.",[383],{"when":814,"ops":815},"Checking the batch took too long. Nothing was queued; send it again, or in smaller batches.",[383],{"when":817,"ops":818},"Someone else — a member in the panel or the app, or another request of yours — is changing the group at this moment. Nothing was written. Wait the second in `Retry-After` and send the same request again.",[399,401],[820,825,828,831,834,837,840,843,846,849,852,855,858,861,864,867,870,873,876,879,882,885,888,891,896,899,902,907,910,913,916,919,922,925,928,931,934,937,940,943,948,951,954,957,960,963,966,969,972,975,978,981,984,987,990,993,996,1001,1006,1011,1016,1021,1024,1027],{"status":821,"code":822,"message":823,"ops":824},400,"bad_request","birth must be a real date in DD\u002FMM\u002FYYYY format",[379,381],{"status":821,"code":822,"message":826,"ops":827},"country is not a known country.",[379],{"status":821,"code":822,"message":829,"ops":830},"email must be a valid email address",[385,389],{"status":821,"code":822,"message":832,"ops":833},"email must be given once, as one or more email addresses separated by commas",[371],{"status":821,"code":822,"message":835,"ops":836},"email must list at most 100 addresses",[371],{"status":821,"code":822,"message":838,"ops":839},"Invalid token format.",[357],{"status":821,"code":822,"message":841,"ops":842},"Invalid value for '_id': expected ObjectId.",[362,364,366,433,438,385,387,389,391,480,440,488,442,498,397,500,505,507],{"status":821,"code":822,"message":844,"ops":845},"Invalid value for 'challengeId': expected ObjectId.",[512,514,516,518,399,401,520,444],{"status":821,"code":822,"message":847,"ops":848},"Invalid value for 'exam': expected ObjectId.",[490],{"status":821,"code":822,"message":850,"ops":851},"Invalid value for 'groupId': expected ObjectId.",[516,518,399,401],{"status":821,"code":822,"message":853,"ops":854},"Invalid value for 'mainId': expected ObjectId.",[466],{"status":821,"code":822,"message":856,"ops":857},"Invalid value for 'stepId': expected ObjectId.",[401],{"status":821,"code":822,"message":859,"ops":860},"Invalid value for 'studentId': expected ObjectId.",[444],{"status":821,"code":822,"message":862,"ops":863},"lastName should not be empty",[379,381,385,389],{"status":821,"code":822,"message":865,"ops":866},"password must not contain the student's own name, username or email address",[387],{"status":821,"code":822,"message":868,"ops":869},"property password should not exist",[381,383],{"status":821,"code":822,"message":871,"ops":872},"redirect must be a site-relative path starting with \"\u002F\" (e.g. \"\u002Fdashboard\")",[393],{"status":821,"code":822,"message":874,"ops":875},"school is not a known school. This API does not create reference data.",[389],{"status":821,"code":822,"message":877,"ops":878},"signedIn must be true or false",[461],{"status":821,"code":822,"message":880,"ops":881},"Student has no grade set, and every exam is restricted to a set of grades. Set one with PUT \u002F:organizationId\u002Fstudent\u002F:studentId before applying.",[395,397],{"status":821,"code":822,"message":883,"ops":884},"Student has no grade set, and every exam is restricted to a set of grades. Set one with PUT \u002F:organizationId\u002Fstudent\u002F:studentId before listing exams.",[440],{"status":821,"code":822,"message":886,"ops":887},"students must contain at least 30 elements",[383],{"status":821,"code":822,"message":889,"ops":890},"students.4.birth birth must be a real date in DD\u002FMM\u002FYYYY format",[383],{"status":892,"code":893,"message":894,"ops":895},403,"forbidden","Insufficient role permissions",[357,532,534,362,536,364,538,366,371,379,381,383,433,438,385,387,461,466,389,391,393,540,542,480,440,488,544,395,490,442,498,397,500,546,505,548,507,550,512,514,516,518,399,401,520,444],{"status":892,"code":893,"message":897,"ops":898},"Setting a student's password needs the auth\u002Fsignin permission on mto, the same grant a sign-in link needs.",[379],{"status":892,"code":893,"message":900,"ops":901},"Student is not activated for organization stem.",[393],{"status":903,"code":904,"message":905,"ops":906},404,"not_found","Application not found!",[498,397,500],{"status":903,"code":904,"message":908,"ops":909},"Category not found!",[480],{"status":903,"code":904,"message":911,"ops":912},"Country not found!",[362],{"status":903,"code":904,"message":914,"ops":915},"Exam is not open for application, so it is not available through this API.",[488],{"status":903,"code":904,"message":917,"ops":918},"Exam not found!",[488,395,397],{"status":903,"code":904,"message":920,"ops":921},"Grade not found!",[364],{"status":903,"code":904,"message":923,"ops":924},"Group challenge not found!",[512,514,516,518,399,401,520,444],{"status":903,"code":904,"message":926,"ops":927},"Group not found!",[516,518,399,401],{"status":903,"code":904,"message":929,"ops":930},"Import not found!",[433],{"status":903,"code":904,"message":932,"ops":933},"Not found!",[391,546,548],{"status":903,"code":904,"message":935,"ops":936},"Organization not found!",[366,461,466,389,391,393,540,542,480,440,488,544,395,490,442,498,397,500,546,505,548,507,550,512,514,516,518,399,401,520,444],{"status":903,"code":904,"message":938,"ops":939},"Step not found!",[401],{"status":903,"code":904,"message":941,"ops":942},"Student not found!",[438,385,387,466,389,393,440,395,442,505,507,399,401,444],{"status":944,"code":945,"message":946,"ops":947},409,"conflict","A student with that email is already registered to this account (6650a1b2c3d4e5f6a7b8c9d0).",[379],{"status":944,"code":945,"message":949,"ops":950},"Application has been paid for and cannot be deleted. Cancelling a paid application requires a refund, which this API does not perform.",[500],{"status":944,"code":945,"message":952,"ops":953},"Every step has to be submitted before the group’s work can be sent.",[399],{"status":944,"code":945,"message":955,"ops":956},"Exam has no language set, so it is not offered to students and cannot be applied to.",[395,397],{"status":944,"code":945,"message":958,"ops":959},"Exam is not available to this student. Only exams returned by GET \u002F:organizationId\u002Fexam\u002Favailable\u002F:studentId can be applied to.",[395,397],{"status":944,"code":945,"message":961,"ops":962},"Exam is not open for application. Only exams returned by GET \u002F:organizationId\u002Fexam can be applied to.",[395,397],{"status":944,"code":945,"message":964,"ops":965},"Nothing has been uploaded for this step yet. A member of the group uploads the work first.",[401],{"status":944,"code":945,"message":967,"ops":968},"That email address is already registered.",[379,385,389],{"status":944,"code":945,"message":970,"ops":971},"The group challenge takes no submissions outside its dates (windowStart to windowEnd).",[399,401],{"status":944,"code":945,"message":973,"ops":974},"The group is still being prepared by its teacher, so it has no steps yet.",[399,401],{"status":944,"code":945,"message":976,"ops":977},"The teacher has not confirmed the group yet, so it has no steps yet.",[399,401],{"status":944,"code":945,"message":979,"ops":980},"This exam has already been started and can no longer be changed.",[397],{"status":944,"code":945,"message":982,"ops":983},"This group challenge is closed.",[399,401],{"status":944,"code":945,"message":985,"ops":986},"This step is not open yet: the steps before it come first.",[401],{"status":944,"code":945,"message":988,"ops":989},"This student has confirmed their email address, so the password is theirs to change. Send them a sign-in link with POST \u002Fv1\u002F:organizationId\u002Fauth\u002Fsignin.",[387],{"status":944,"code":945,"message":991,"ops":992},"Training has already started for this AI Challenge application, so it can no longer be moved.",[397],{"status":944,"code":945,"message":994,"ops":995},"You already have an import that has not finished. Read it, and send the next one when it has. (65f0c2a1d3e4f5a6b7c8d901)",[383],{"status":997,"code":998,"message":999,"ops":1000},413,"payload_too_large","request entity too large",[379,381,383,385,387,389,391,393,395,397,399,401],{"status":1002,"code":1003,"message":1004,"ops":1005},415,"unsupported_media_type","unsupported charset \"ISO-8859-1\"",[379,381,383,385,387,389,391,393,395,397,399,401],{"status":1007,"code":1008,"message":1009,"ops":1010},422,"unprocessable_entity","3 of 250 rows cannot be registered. Nothing was registered and no import was queued; error.details.rows lists every problem.",[383],{"status":1012,"code":1013,"message":1014,"ops":1015},500,"internal_error","Could not issue a sign-in token, please retry.",[393],{"status":1017,"code":1018,"message":1019,"ops":1020},503,"service_unavailable","Bulk registration is paused for a scheduled window. Nothing was queued; send it again after the time in Retry-After.",[383],{"status":1017,"code":1018,"message":1022,"ops":1023},"Checking this batch took too long. Nothing was registered and no import was queued. Send it again later, or in smaller batches.",[383],{"status":1017,"code":1018,"message":1025,"ops":1026},"The group is being changed by someone else. Try again in a second.",[399,401],{"status":1017,"code":1018,"message":1028,"ops":1029},"This server is already checking another import. Send it again in a few seconds.",[383],"{\n  \"error\": {\n    \"code\": \"not_found\",\n    \"message\": \"Not found!\",\n    \"documentation_url\": \"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#not_found\",\n    \"request_id\": \"0b5c6d0e-8f7a-4b1c-9d2e-3f4a5b6c7d8e\",\n    \"details\": {}\n  }\n}",[1032,1280,2248,3213,4092,4687,5528,5724,6007,6430,7196,7414],{"code":1033,"heading":1033,"status":821,"retry":1034,"summary":1035,"message":1036,"body":1037},"invalid_email","after-fix","An email address in the request is not a valid address. Reserved; no operation currently returns this code.","The email address provided is formatted incorrectly.",{"type":1038,"value":1039,"toc":1276},"minimark",[1040,1045,1065,1136,1139,1232,1236,1272],[1041,1042,1044],"h2",{"id":1043},"causes","Causes",[1046,1047,1048,1051,1052,1056,1057,1064],"p",{},[1049,1050,1033],"code",{}," is part of the error catalog, but ",[1053,1054,1055],"strong",{},"no operation currently returns it",". When a student operation rejects an email address, it answers ",[1058,1059,1061],"a",{"href":1060},"\u002Fapi\u002Ferrors#bad_request",[1049,1062,1063],{},"400 bad_request"," with one of these messages:",[1066,1067,1068,1084],"table",{},[1069,1070,1071],"thead",{},[1072,1073,1074,1078,1081],"tr",{},[1075,1076,1077],"th",{},"Message",[1075,1079,1080],{},"Operations",[1075,1082,1083],{},"Cause",[1085,1086,1087,1104,1118],"tbody",{},[1072,1088,1089,1095,1098],{},[1090,1091,1092],"td",{},[1049,1093,1094],{},"email must be an email",[1090,1096,1097],{},"register a student, update a student, update an organization student",[1090,1099,1100,1103],{},[1049,1101,1102],{},"email"," isn't a valid address.",[1072,1105,1106,1111,1113],{},[1090,1107,1108],{},[1049,1109,1110],{},"email should not be empty",[1090,1112,1097],{},[1090,1114,1115,1117],{},[1049,1116,1102],{}," is missing at registration, which requires one, or was sent as an empty string.",[1072,1119,1120,1124,1127],{},[1090,1121,1122],{},[1049,1123,829],{},[1090,1125,1126],{},"update a student, update an organization student",[1090,1128,1129,1131,1132,1135],{},[1049,1130,1102],{}," was sent as ",[1049,1133,1134],{},"null",". An update can change the address but can't remove it.",[1046,1137,1138],{},"If this code ever appears, it will look like this:",[1140,1141,1146],"pre",{"className":1142,"code":1143,"language":1144,"meta":1145,"style":1145},"language-json shiki shiki-themes github-light-high-contrast github-dark-high-contrast","{\n  \"error\": {\n    \"code\": \"invalid_email\",\n    \"message\": \"The email address provided is formatted incorrectly.\",\n    \"documentation_url\": \"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#invalid_email\",\n    \"request_id\": \"0b5c6d0e-8f7a-4b1c-9d2e-3f4a5b6c7d8e\"\n  }\n}\n","json","",[1049,1147,1148,1157,1167,1183,1196,1209,1220,1226],{"__ignoreMap":1145},[1149,1150,1153],"span",{"class":1151,"line":1152},"line",1,[1149,1154,1156],{"class":1155},"suds8","{\n",[1149,1158,1160,1164],{"class":1151,"line":1159},2,[1149,1161,1163],{"class":1162},"sne4z","  \"error\"",[1149,1165,1166],{"class":1155},": {\n",[1149,1168,1170,1173,1176,1180],{"class":1151,"line":1169},3,[1149,1171,1172],{"class":1162},"    \"code\"",[1149,1174,1175],{"class":1155},": ",[1149,1177,1179],{"class":1178},"sT6z2","\"invalid_email\"",[1149,1181,1182],{"class":1155},",\n",[1149,1184,1186,1189,1191,1194],{"class":1151,"line":1185},4,[1149,1187,1188],{"class":1162},"    \"message\"",[1149,1190,1175],{"class":1155},[1149,1192,1193],{"class":1178},"\"The email address provided is formatted incorrectly.\"",[1149,1195,1182],{"class":1155},[1149,1197,1199,1202,1204,1207],{"class":1151,"line":1198},5,[1149,1200,1201],{"class":1162},"    \"documentation_url\"",[1149,1203,1175],{"class":1155},[1149,1205,1206],{"class":1178},"\"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#invalid_email\"",[1149,1208,1182],{"class":1155},[1149,1210,1212,1215,1217],{"class":1151,"line":1211},6,[1149,1213,1214],{"class":1162},"    \"request_id\"",[1149,1216,1175],{"class":1155},[1149,1218,1219],{"class":1178},"\"0b5c6d0e-8f7a-4b1c-9d2e-3f4a5b6c7d8e\"\n",[1149,1221,1223],{"class":1151,"line":1222},7,[1149,1224,1225],{"class":1155},"  }\n",[1149,1227,1229],{"class":1151,"line":1228},8,[1149,1230,1231],{"class":1155},"}\n",[1041,1233,1235],{"id":1234},"fixes","Fixes",[1237,1238,1239,1252,1255,1269],"ul",{},[1240,1241,1242,1243,1245,1246,1248,1249,1251],"li",{},"Handle ",[1049,1244,1033],{}," the same way as a ",[1049,1247,822],{}," about the ",[1049,1250,1102],{}," field, so your client keeps working if the code starts being used.",[1240,1253,1254],{},"Validate addresses in your own forms before you send them, and trim spaces around them.",[1240,1256,1257,1258,1264,1265,1268],{},"The API stores addresses in lower case, and each address can belong to only one student on the whole platform. A valid address that is already taken answers ",[1058,1259,1261],{"href":1260},"\u002Fapi\u002Ferrors#conflict",[1049,1262,1263],{},"409 conflict",", not ",[1049,1266,1267],{},"400",".",[1240,1270,1271],{},"Fix the address and send the request again. Sending it again unchanged gets the same answer.",[1273,1274,1275],"style",{},"html pre.shiki code .suds8, html code.shiki .suds8{--shiki-default:#0E1116;--shiki-dark:#F0F3F6}html pre.shiki code .sne4z, html code.shiki .sne4z{--shiki-default:#024C1A;--shiki-dark:#72F088}html pre.shiki code .sT6z2, html code.shiki .sT6z2{--shiki-default:#032563;--shiki-dark:#ADDCFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":1145,"searchDepth":1159,"depth":1169,"links":1277},[1278,1279],{"id":1043,"depth":1159,"text":1044},{"id":1234,"depth":1159,"text":1235},{"code":822,"heading":822,"status":821,"retry":1034,"summary":1281,"message":1282,"body":1283},"The body, a path parameter or a referenced value is invalid. The message names the first problem found.","The request was malformed or contained invalid parameters.",{"type":1038,"value":1284,"toc":2234},[1285,1287,1297,1362,1367,1389,1392,1432,1436,1439,1710,1739,1743,1809,1813,1826,1952,1956,2006,2015,2019,2049,2053,2066,2070,2091,2095,2131,2133,2220,2232],[1041,1286,1044],{"id":1043},[1046,1288,1289,1290,1292,1293,1296],{},"A ",[1049,1291,1267],{}," means the API could not accept the request as it was sent. Nothing was changed. The message names ",[1053,1294,1295],{},"the first problem found",". If a body has several, fix that one and send it again to see the next.",[1140,1298,1300],{"className":1142,"code":1299,"language":1144,"meta":1145,"style":1145},"{\n  \"error\": {\n    \"code\": \"bad_request\",\n    \"message\": \"property participated should not exist\",\n    \"documentation_url\": \"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#bad_request\",\n    \"request_id\": \"3a2b1c0d-9e8f-4a7b-b6c5-d4e3f2a1b0c9\"\n  }\n}\n",[1049,1301,1302,1306,1312,1323,1334,1345,1354,1358],{"__ignoreMap":1145},[1149,1303,1304],{"class":1151,"line":1152},[1149,1305,1156],{"class":1155},[1149,1307,1308,1310],{"class":1151,"line":1159},[1149,1309,1163],{"class":1162},[1149,1311,1166],{"class":1155},[1149,1313,1314,1316,1318,1321],{"class":1151,"line":1169},[1149,1315,1172],{"class":1162},[1149,1317,1175],{"class":1155},[1149,1319,1320],{"class":1178},"\"bad_request\"",[1149,1322,1182],{"class":1155},[1149,1324,1325,1327,1329,1332],{"class":1151,"line":1185},[1149,1326,1188],{"class":1162},[1149,1328,1175],{"class":1155},[1149,1330,1331],{"class":1178},"\"property participated should not exist\"",[1149,1333,1182],{"class":1155},[1149,1335,1336,1338,1340,1343],{"class":1151,"line":1198},[1149,1337,1201],{"class":1162},[1149,1339,1175],{"class":1155},[1149,1341,1342],{"class":1178},"\"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#bad_request\"",[1149,1344,1182],{"class":1155},[1149,1346,1347,1349,1351],{"class":1151,"line":1211},[1149,1348,1214],{"class":1162},[1149,1350,1175],{"class":1155},[1149,1352,1353],{"class":1178},"\"3a2b1c0d-9e8f-4a7b-b6c5-d4e3f2a1b0c9\"\n",[1149,1355,1356],{"class":1151,"line":1222},[1149,1357,1225],{"class":1155},[1149,1359,1360],{"class":1151,"line":1228},[1149,1361,1231],{"class":1155},[1363,1364,1366],"h3",{"id":1365},"a-field-the-operation-doesnt-accept","A field the operation doesn't accept",[1066,1368,1369,1377],{},[1069,1370,1371],{},[1072,1372,1373,1375],{},[1075,1374,1077],{},[1075,1376,1083],{},[1085,1378,1379],{},[1072,1380,1381,1386],{},[1090,1382,1383],{},[1049,1384,1385],{},"property \u003Cname> should not exist",[1090,1387,1388],{},"The body carries a field the operation doesn't declare. The API refuses unknown fields rather than ignoring them, so a request never silently does less than you asked.",[1046,1390,1391],{},"Some common examples:",[1237,1393,1394,1407,1416],{},[1240,1395,1396,1399,1400,1403,1404,1268],{},[1049,1397,1398],{},"password"," sent to ",[1049,1401,1402],{},"PUT \u002Fv1\u002Fstudent\u002F{studentId}"," or to the organization student update. Passwords have ",[1058,1405,1406],{"href":193},"their own route",[1240,1408,1409,1412,1413,1268],{},[1049,1410,1411],{},"studentId"," sent to the application move. The move takes only ",[1049,1414,1415],{},"examId",[1240,1417,1418,1421,1422,1421,1425,1421,1428,1431],{},[1049,1419,1420],{},"userType",", ",[1049,1423,1424],{},"roles",[1049,1426,1427],{},"emailConfirmed",[1049,1429,1430],{},"participated"," or any other field copied out of a record.",[1363,1433,1435],{"id":1434},"a-value-in-the-wrong-format","A value in the wrong format",[1046,1437,1438],{},"The API checks every field it accepts. Typical messages:",[1066,1440,1441,1449],{},[1069,1442,1443],{},[1072,1444,1445,1447],{},[1075,1446,1077],{},[1075,1448,1083],{},[1085,1450,1451,1461,1472,1486,1501,1514,1541,1572,1587,1607,1625,1638,1651,1668,1678,1697],{},[1072,1452,1453,1457],{},[1090,1454,1455],{},[1049,1456,1094],{},[1090,1458,1459,1103],{},[1049,1460,1102],{},[1072,1462,1463,1467],{},[1090,1464,1465],{},[1049,1466,1110],{},[1090,1468,1469,1471],{},[1049,1470,1102],{}," is missing at registration, or is an empty string.",[1072,1473,1474,1478],{},[1090,1475,1476],{},[1049,1477,829],{},[1090,1479,1480,1481,1483,1484,1135],{},"An update sent ",[1049,1482,1102],{}," as ",[1049,1485,1134],{},[1072,1487,1488,1493],{},[1090,1489,1490],{},[1049,1491,1492],{},"firstName should not be empty",[1090,1494,1495,1498,1499,1268],{},[1049,1496,1497],{},"firstName"," is missing or empty at registration, or an update sent it empty or ",[1049,1500,1134],{},[1072,1502,1503,1507],{},[1090,1504,1505],{},[1049,1506,862],{},[1090,1508,1509,1510,1513],{},"The same, for ",[1049,1511,1512],{},"lastName",". It is required at registration too.",[1072,1515,1516,1527],{},[1090,1517,1518,1421,1521,1421,1524],{},[1049,1519,1520],{},"firstName must be a string",[1049,1522,1523],{},"lastName must be a string",[1049,1525,1526],{},"grade must be a string",[1090,1528,1529,1530,1533,1534,1537,1538,1268],{},"The field was sent as something other than a string, such as the number ",[1049,1531,1532],{},"9",". The same message pattern applies to ",[1049,1535,1536],{},"city"," and ",[1049,1539,1540],{},"school",[1072,1542,1543,1547],{},[1090,1544,1545],{},[1049,1546,823],{},[1090,1548,1549,1552,1553,1556,1557,1560,1561,1563,1564,1567,1568,1571],{},[1049,1550,1551],{},"birth"," isn't ",[1049,1554,1555],{},"DD\u002FMM\u002FYYYY",", names a day that doesn't exist, such as ",[1049,1558,1559],{},"31\u002F02\u002F2010",", or an update sent it as ",[1049,1562,1134],{},". ",[1049,1565,1566],{},"2010-05-14"," is refused. Use ",[1049,1569,1570],{},"14\u002F05\u002F2010",". Registration and both student updates check it the same way.",[1072,1573,1574,1579],{},[1090,1575,1576],{},[1049,1577,1578],{},"sex must be one of the following values: m, f, n",[1090,1580,1581,1584,1585,1268],{},[1049,1582,1583],{},"sex"," has another value, or an update sent it as ",[1049,1586,1134],{},[1072,1588,1589,1594],{},[1090,1590,1591],{},[1049,1592,1593],{},"phone must be a string",[1090,1595,1596,1599,1600,1602,1603,1606],{},[1049,1597,1598],{},"phone"," isn't a string, or was sent as ",[1049,1601,1134],{},". Leave it out instead, or on an update send ",[1049,1604,1605],{},"\"\""," to clear a student's phone number.",[1072,1608,1609,1614],{},[1090,1610,1611],{},[1049,1612,1613],{},"country must be a mongodb id",[1090,1615,1616,1619,1620,1268],{},[1049,1617,1618],{},"country"," takes an id only, from ",[1058,1621,1622],{"href":150},[1049,1623,1624],{},"GET \u002Fv1\u002Fcountry",[1072,1626,1627,1635],{},[1090,1628,1629,1421,1632],{},[1049,1630,1631],{},"studentId must be a mongodb id",[1049,1633,1634],{},"examId must be a mongodb id",[1090,1636,1637],{},"The id isn't 24 hexadecimal characters.",[1072,1639,1640,1645],{},[1090,1641,1642],{},[1049,1643,1644],{},"email2 must be empty",[1090,1646,1647,1650],{},[1049,1648,1649],{},"email2"," must be left out or empty.",[1072,1652,1653,1657],{},[1090,1654,1655],{},[1049,1656,871],{},[1090,1658,1659,1660,1663,1664,1667],{},"A sign-in link's ",[1049,1661,1662],{},"redirect"," is a full URL, starts with ",[1049,1665,1666],{},"\u002F\u002F",", or contains a backslash or whitespace.",[1072,1669,1670,1675],{},[1090,1671,1672],{},[1049,1673,1674],{},"supervisorUsername should not be empty",[1090,1676,1677],{},"The supervisor link needs a username.",[1072,1679,1680,1685],{},[1090,1681,1682],{},[1049,1683,1684],{},"activatedPlatformsThisSeason must be an array",[1090,1686,1687,1690,1691,1693,1694,1268],{},[1049,1688,1689],{},"activatedPlatformsThisSeason"," isn't a list, or was sent as ",[1049,1692,1134],{},", which registration and both updates refuse. Leave the field out instead: an update then keeps the student's list as it is, and registration stores ",[1049,1695,1696],{},"[\"common\"]",[1072,1698,1699,1704],{},[1090,1700,1701],{},[1049,1702,1703],{},"each value in activatedPlatformsThisSeason must be a string",[1090,1705,1706,1707,1709],{},"A value in ",[1049,1708,1689],{}," isn't a string.",[1046,1711,1706,1712,1714,1715,1718,1719,1421,1722,1421,1725,1421,1728,1537,1731,1734,1735,1738],{},[1049,1713,1689],{}," that isn't ",[1049,1716,1717],{},"common"," or one of the slugs ",[1049,1720,1721],{},"stem",[1049,1723,1724],{},"hilingua",[1049,1726,1727],{},"neo",[1049,1729,1730],{},"gmath",[1049,1732,1733],{},"coding"," is refused with a message listing the values allowed. ",[1049,1736,1737],{},"mto"," is refused too: every student is on the core record already.",[1363,1740,1742],{"id":1741},"a-password-that-breaks-the-rules","A password that breaks the rules",[1066,1744,1745,1753],{},[1069,1746,1747],{},[1072,1748,1749,1751],{},[1075,1750,1077],{},[1075,1752,1083],{},[1085,1754,1755,1769,1779,1789],{},[1072,1756,1757,1766],{},[1090,1758,1759,1762,1763],{},[1049,1760,1761],{},"password must be longer than or equal to 5 characters"," or ",[1049,1764,1765],{},"password must be at least 5 characters long",[1090,1767,1768],{},"It is shorter than 5 characters. Either message can come first.",[1072,1770,1771,1776],{},[1090,1772,1773],{},[1049,1774,1775],{},"password must be a string",[1090,1777,1778],{},"It isn't a string, for example a number.",[1072,1780,1781,1786],{},[1090,1782,1783],{},[1049,1784,1785],{},"password must be at most 72 bytes long, because bcrypt ignores anything past that",[1090,1787,1788],{},"It is longer than 72 bytes. Characters outside ASCII take more than one byte each.",[1072,1790,1791,1795],{},[1090,1792,1793],{},[1049,1794,865],{},[1090,1796,1797,1798,1801,1802,1421,1804,1537,1806,1808],{},"It contains the student's first name, surname, username, email address or the part of the address before the ",[1049,1799,1800],{},"@",". Details shorter than 4 characters aren't checked. At registration the password is compared with the ",[1049,1803,1497],{},[1049,1805,1512],{},[1049,1807,1102],{}," in the same body. On the password route it is compared with the student's stored record, username included.",[1363,1810,1812],{"id":1811},"reference-data-that-doesnt-exist","Reference data that doesn't exist",[1046,1814,1815,1816,1421,1818,1421,1821,1537,1823,1825],{},"The API resolves ",[1049,1817,1618],{},[1049,1819,1820],{},"grade",[1049,1822,1536],{},[1049,1824,1540],{}," to existing records, and never creates new ones:",[1066,1827,1828,1836],{},[1069,1829,1830],{},[1072,1831,1832,1834],{},[1075,1833,1077],{},[1075,1835,1083],{},[1085,1837,1838,1847,1870,1895,1905,1914,1928,1942],{},[1072,1839,1840,1844],{},[1090,1841,1842],{},[1049,1843,826],{},[1090,1845,1846],{},"No country has that id, or it is one of the countries that can't be selected.",[1072,1848,1849,1854],{},[1090,1850,1851],{},[1049,1852,1853],{},"grade is not a known grade.",[1090,1855,1856,1857,1859,1860,1537,1862,1175,1864,1421,1867],{},"You gave ",[1049,1858,1820],{}," as an id, and no grade has it. The same message pattern applies to ",[1049,1861,1536],{},[1049,1863,1540],{},[1049,1865,1866],{},"city is not a known city.",[1049,1868,1869],{},"school is not a known school.",[1072,1871,1872,1877],{},[1090,1873,1874],{},[1049,1875,1876],{},"grade is not a known grade. This API does not create reference data.",[1090,1878,1856,1879,1881,1882,1885,1886,1889,1890,1268],{},[1049,1880,1820],{}," as a name, and no grade has it. Grade names are ",[1049,1883,1884],{},"1"," to ",[1049,1887,1888],{},"12",". See ",[1058,1891,1892],{"href":156},[1049,1893,1894],{},"GET \u002Fv1\u002Fgrade",[1072,1896,1897,1902],{},[1090,1898,1899],{},[1049,1900,1901],{},"city is not a known city. This API does not create reference data.",[1090,1903,1904],{},"No city has that name in the student's country.",[1072,1906,1907,1911],{},[1090,1908,1909],{},[1049,1910,874],{},[1090,1912,1913],{},"No school has that name in the student's country and city.",[1072,1915,1916,1921],{},[1090,1917,1918],{},[1049,1919,1920],{},"city was given as a name, which can only be resolved together with country.",[1090,1922,1923,1924,1927],{},"You gave a city by name, and the API has no country to look it up in. The same message, starting ",[1049,1925,1926],{},"school was given as a name",", means a school name with no country or no city to look it up in. On an update, the student's stored country and city are used when the body leaves them out.",[1072,1929,1930,1935],{},[1090,1931,1932],{},[1049,1933,1934],{},"grade must be the id of a grade or its name.",[1090,1936,1937,1938,1537,1940,1268],{},"The value is only spaces. The same pattern applies to ",[1049,1939,1536],{},[1049,1941,1540],{},[1072,1943,1944,1949],{},[1090,1945,1946],{},[1049,1947,1948],{},"country is not a known country, so no username can be issued for this student.",[1090,1950,1951],{},"The country can't be used to build the student's username.",[1363,1953,1955],{"id":1954},"an-id-in-the-path-that-isnt-an-id","An id in the path that isn't an id",[1066,1957,1958,1966],{},[1069,1959,1960],{},[1072,1961,1962,1964],{},[1075,1963,1077],{},[1075,1965,1083],{},[1085,1967,1968,1977,1992],{},[1072,1969,1970,1974],{},[1090,1971,1972],{},[1049,1973,841],{},[1090,1975,1976],{},"A student, application, exam, country, grade, organization or category id in the path isn't 24 hexadecimal characters.",[1072,1978,1979,1983],{},[1090,1980,1981],{},[1049,1982,847],{},[1090,1984,1509,1985,1988,1989,1268],{},[1049,1986,1987],{},"{examId}"," in ",[1049,1990,1991],{},"GET ...\u002Fapplication\u002Fexam-applications\u002F{examId}",[1072,1993,1994,1998],{},[1090,1995,1996],{},[1049,1997,853],{},[1090,1999,1509,2000,1988,2003,1268],{},[1049,2001,2002],{},"{studentId}",[1049,2004,2005],{},"GET \u002Fv1\u002F{organizationId}\u002Fstudent\u002F{studentId}",[1046,2007,2008,2011,2012,1268],{},[1049,2009,2010],{},"{organizationId}"," is the exception. A malformed organization id answers ",[1049,2013,2014],{},"404 Organization not found!",[1363,2016,2018],{"id":2017},"a-student-record-that-isnt-complete","A student record that isn't complete",[1066,2020,2021,2029],{},[1069,2022,2023],{},[1072,2024,2025,2027],{},[1075,2026,1077],{},[1075,2028,1083],{},[1085,2030,2031,2040],{},[1072,2032,2033,2037],{},[1090,2034,2035],{},[1049,2036,883],{},[1090,2038,2039],{},"The exam picker for a student with no grade.",[1072,2041,2042,2046],{},[1090,2043,2044],{},[1049,2045,880],{},[1090,2047,2048],{},"Creating or moving an application for a student with no grade.",[1363,2050,2052],{"id":2051},"a-body-that-isnt-valid-json","A body that isn't valid JSON",[1046,2054,2055,2056,1421,2059,1762,2062,2065],{},"A body that can't be parsed as JSON is refused with a message from the JSON parser that says where parsing failed. So is a body sent with ",[1049,2057,2058],{},"Content-Encoding: gzip",[1049,2060,2061],{},"deflate",[1049,2063,2064],{},"br"," that doesn't decompress. Both are checked before your token.",[1363,2067,2069],{"id":2068},"other-operation-specific-cases","Other operation-specific cases",[1237,2071,2072,2078],{},[1240,2073,2074,2077],{},[1049,2075,2076],{},"Unknown organization: \u003Cslug>",": the organization exists, but the API doesn't serve its records.",[1240,2079,2080,1537,2083,2085,2086,2090],{},[1049,2081,2082],{},"No token provided.",[1049,2084,838],{}," from ",[1058,2087,2088],{"href":140},[1049,2089,358],{},". A token that passed authentication always has what that operation needs, so you should never see these.",[1363,2092,2094],{"id":2093},"not-a-400","Not a 400",[1237,2096,2097,2112],{},[1240,2098,1289,2099,2108,2109,2111],{},[1053,2100,2101,2102,1762,2105],{},"missing or out-of-range ",[1049,2103,2104],{},"page",[1049,2106,2107],{},"limit"," is never refused. The API uses the default or clamps the value (see ",[1058,2110,39],{"href":40},").",[1240,2113,1289,2114,2120,2121,2124,2125,2127,2128,1268],{},[1053,2115,2116,2117],{},"body sent with the wrong ",[1049,2118,2119],{},"Content-Type",", such as ",[1049,2122,2123],{},"text\u002Fplain",", is ignored rather than refused. You then get the validation errors of an empty body, for example ",[1049,2126,1631],{},". Send ",[1049,2129,2130],{},"Content-Type: application\u002Fjson",[1041,2132,1235],{"id":1234},[2134,2135,2136,2142,2152,2175,2201,2207,2215],"ol",{},[1240,2137,2138,2141],{},[1053,2139,2140],{},"Read the message."," It names the field and the problem.",[1240,2143,2144,2147,2148,2151],{},[1053,2145,2146],{},"Send only documented fields."," Build each body from the fields on the operation's ",[1058,2149,2150],{"href":121},"reference page",", not from a whole record.",[1240,2153,2154,2157,2158,2160,2161,1421,2163,1421,2166,1762,2169,2160,2172,2174],{},[1053,2155,2156],{},"Use the documented formats:"," ",[1049,2159,1555],{}," for ",[1049,2162,1551],{},[1049,2164,2165],{},"m",[1049,2167,2168],{},"f",[1049,2170,2171],{},"n",[1049,2173,1583],{},", and 24-character hexadecimal ids.",[1240,2176,2177,2180,2181,2085,2183,2187,2188,2190,2191,1885,2193,2195,2196,1537,2198,2200],{},[1053,2178,2179],{},"Resolve reference data first."," Take ",[1049,2182,1618],{},[1058,2184,2185],{"href":150},[1049,2186,1624],{},". Give ",[1049,2189,1820],{}," as its id or its name (",[1049,2192,1884],{},[1049,2194,1888],{},"). Give ",[1049,2197,1536],{},[1049,2199,1540],{}," as ids or as names that exist in the student's country.",[1240,2202,2203,2206],{},[1053,2204,2205],{},"Complete the student"," (for example set a grade) before listing exams or applying.",[1240,2208,2209,2214],{},[1053,2210,2211,2212],{},"Send ",[1049,2213,2130],{}," with a UTF-8 body.",[1240,2216,2217,2218,1268],{},"Fix the problem and send the request again. Sending it again unchanged always gets the same ",[1049,2219,1267],{},[1046,2221,2222,2223,2226,2227,2229,2230,1268],{},"Field-by-field rules are on the ",[1058,2224,2225],{"href":121},"reference pages"," and in ",[1058,2228,62],{"href":63},". Request formats in general are in ",[1058,2231,33],{"href":34},[1273,2233,1275],{},{"title":1145,"searchDepth":1159,"depth":1169,"links":2235},[2236,2247],{"id":1043,"depth":1159,"text":1044,"children":2237},[2238,2239,2240,2241,2242,2243,2244,2245,2246],{"id":1365,"depth":1169,"text":1366},{"id":1434,"depth":1169,"text":1435},{"id":1741,"depth":1169,"text":1742},{"id":1811,"depth":1169,"text":1812},{"id":1954,"depth":1169,"text":1955},{"id":2017,"depth":1169,"text":2018},{"id":2051,"depth":1169,"text":2052},{"id":2068,"depth":1169,"text":2069},{"id":2093,"depth":1169,"text":2094},{"id":1234,"depth":1159,"text":1235},{"code":2249,"heading":2249,"status":2250,"retry":1034,"summary":2251,"message":2252,"body":2253},"unauthorized",401,"The token is missing, malformed, expired, revoked, or not signed with an active account's apiSecret.","Authentication is required or the provided credentials are invalid.",{"type":1038,"value":2254,"toc":3202},[2255,2257,2269,2315,2380,2391,2395,2433,2437,2471,2475,2483,2487,2499,2503,2612,2616,2627,2629,3188,3199],[1041,2256,1044],{"id":1043},[1046,2258,2259,2260,2265,2266,2268],{},"Every operation except ",[1058,2261,2262],{"href":132},[1049,2263,2264],{},"GET \u002Fv1\u002Fhealth"," needs a bearer token that you sign yourself (see ",[1058,2267,19],{"href":20},"). When the token fails any check, the answer is always the same:",[1140,2270,2274],{"className":2271,"code":2272,"language":2273,"meta":1145,"style":1145},"language-http shiki shiki-themes github-light-high-contrast github-dark-high-contrast","HTTP\u002F1.1 401 Unauthorized\nContent-Type: application\u002Fjson; charset=utf-8\nX-Request-Id: 7c1e9a52-3b8f-4d0e-9a41-2f6b8c0d5e17\n","http",[1049,2275,2276,2295,2305],{"__ignoreMap":1145},[1149,2277,2278,2282,2285,2289,2292],{"class":1151,"line":1152},[1149,2279,2281],{"class":2280},"sHUrx","HTTP",[1149,2283,2284],{"class":1155},"\u002F",[1149,2286,2288],{"class":2287},"s-5SL","1.1",[1149,2290,2291],{"class":2287}," 401",[1149,2293,2294],{"class":1178}," Unauthorized\n",[1149,2296,2297,2299,2302],{"class":1151,"line":1159},[1149,2298,2119],{"class":1162},[1149,2300,2301],{"class":2280},":",[1149,2303,2304],{"class":1178}," application\u002Fjson; charset=utf-8\n",[1149,2306,2307,2310,2312],{"class":1151,"line":1169},[1149,2308,2309],{"class":1162},"X-Request-Id",[1149,2311,2301],{"class":2280},[1149,2313,2314],{"class":1178}," 7c1e9a52-3b8f-4d0e-9a41-2f6b8c0d5e17\n",[1140,2316,2318],{"className":1142,"code":2317,"language":1144,"meta":1145,"style":1145},"{\n  \"error\": {\n    \"code\": \"unauthorized\",\n    \"message\": \"Authentication is required or the provided credentials are invalid.\",\n    \"documentation_url\": \"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#unauthorized\",\n    \"request_id\": \"7c1e9a52-3b8f-4d0e-9a41-2f6b8c0d5e17\"\n  }\n}\n",[1049,2319,2320,2324,2330,2341,2352,2363,2372,2376],{"__ignoreMap":1145},[1149,2321,2322],{"class":1151,"line":1152},[1149,2323,1156],{"class":1155},[1149,2325,2326,2328],{"class":1151,"line":1159},[1149,2327,1163],{"class":1162},[1149,2329,1166],{"class":1155},[1149,2331,2332,2334,2336,2339],{"class":1151,"line":1169},[1149,2333,1172],{"class":1162},[1149,2335,1175],{"class":1155},[1149,2337,2338],{"class":1178},"\"unauthorized\"",[1149,2340,1182],{"class":1155},[1149,2342,2343,2345,2347,2350],{"class":1151,"line":1185},[1149,2344,1188],{"class":1162},[1149,2346,1175],{"class":1155},[1149,2348,2349],{"class":1178},"\"Authentication is required or the provided credentials are invalid.\"",[1149,2351,1182],{"class":1155},[1149,2353,2354,2356,2358,2361],{"class":1151,"line":1198},[1149,2355,1201],{"class":1162},[1149,2357,1175],{"class":1155},[1149,2359,2360],{"class":1178},"\"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#unauthorized\"",[1149,2362,1182],{"class":1155},[1149,2364,2365,2367,2369],{"class":1151,"line":1211},[1149,2366,1214],{"class":1162},[1149,2368,1175],{"class":1155},[1149,2370,2371],{"class":1178},"\"7c1e9a52-3b8f-4d0e-9a41-2f6b8c0d5e17\"\n",[1149,2373,2374],{"class":1151,"line":1222},[1149,2375,1225],{"class":1155},[1149,2377,2378],{"class":1151,"line":1228},[1149,2379,1231],{"class":1155},[1046,2381,2382,2383,2386,2387,2390],{},"The API never says which check failed, so that a leaked key or token tells its finder nothing. You have to find the cause yourself, from the list below. The token is checked before the organization in the path, your permissions and the fields in the request body. A request with a bad token therefore gets ",[1049,2384,2385],{},"401"," whatever else is wrong with it. Only two things are checked earlier: whether the path exists (an unknown path answers ",[1049,2388,2389],{},"404"," with no token at all), and the raw body, meaning its size, its encoding, and whether it is valid JSON.",[1363,2392,2394],{"id":2393},"the-header","The header",[1237,2396,2397,2404,2422],{},[1240,2398,2399,2400,2403],{},"There is no ",[1049,2401,2402],{},"Authorization"," header.",[1240,2405,2406,2407,2410,2411,2414,2415,1537,2418,2421],{},"The header isn't exactly ",[1049,2408,2409],{},"Bearer \u003Ctoken>",": the word ",[1049,2412,2413],{},"Bearer"," with a capital B, one space, then the token. ",[1049,2416,2417],{},"bearer \u003Ctoken>",[1049,2419,2420],{},"Bearer  \u003Ctoken>"," (two spaces) are both refused.",[1240,2423,2424,2425,2428,2429,2432],{},"The header carries your ",[1049,2426,2427],{},"apiSecret"," or your ",[1049,2430,2431],{},"apiKey"," instead of a signed token.",[1363,2434,2436],{"id":2435},"the-tokens-header","The token's header",[1237,2438,2439,2442,2455],{},[1240,2440,2441],{},"The value is not a JWT (three base64url parts separated by dots).",[1240,2443,2399,2444,2447,2448,2450,2451,2454],{},[1049,2445,2446],{},"kid",", or it is not your ",[1049,2449,2431],{}," exactly: ",[1049,2452,2453],{},"key_"," followed by 24 characters. A common mistake is a library that puts the key in the payload but not in the header.",[1240,2456,2457,2458,1563,2461,1421,2464,1537,2467,2470],{},"The algorithm is not ",[1049,2459,2460],{},"HS256",[1049,2462,2463],{},"HS512",[1049,2465,2466],{},"RS256",[1049,2468,2469],{},"none"," are all refused.",[1363,2472,2474],{"id":2473},"the-account","The account",[1237,2476,2477],{},[1240,2478,2479,2480,2482],{},"No active account has that ",[1049,2481,2431],{},". It has been deactivated, it was mistyped, or it was never issued. Changes an operator makes to your account take effect within 60 seconds.",[1363,2484,2486],{"id":2485},"the-signature","The signature",[1237,2488,2489],{},[1240,2490,2491,2492,2494,2495,2498],{},"The token wasn't signed with your ",[1049,2493,2427],{},", or the secret was altered on the way. Typical cases: a trailing newline or quotes picked up from a configuration file, or a library that base64-decodes the key before using it. Sign with the whole string, including ",[1049,2496,2497],{},"secret_",", as UTF-8 bytes.",[1363,2500,2502],{"id":2501},"the-claims","The claims",[1066,2504,2505,2515],{},[1069,2506,2507],{},[1072,2508,2509,2512],{},[1075,2510,2511],{},"Claim",[1075,2513,2514],{},"Refused when",[1085,2516,2517,2532,2545,2563,2574,2584,2593,2602],{},[1072,2518,2519,2524],{},[1090,2520,2521],{},[1049,2522,2523],{},"sub",[1090,2525,2526,2527,2529,2530,1268],{},"It isn't your ",[1049,2528,2431],{},", the same value as ",[1049,2531,2446],{},[1072,2533,2534,2542],{},[1090,2535,2536,1421,2539],{},[1049,2537,2538],{},"iat",[1049,2540,2541],{},"exp",[1090,2543,2544],{},"Either is missing, or isn't a number of seconds.",[1072,2546,2547,2553],{},[1090,2548,2549,1421,2551],{},[1049,2550,2538],{},[1049,2552,2541],{},[1090,2554,2555,2556,2559,2560,2562],{},"They are in milliseconds (JavaScript's ",[1049,2557,2558],{},"Date.now()","). An ",[1049,2561,2538],{}," in milliseconds lies far in the future.",[1072,2564,2565,2569],{},[1090,2566,2567],{},[1049,2568,2541],{},[1090,2570,2571,2572,1268],{},"It isn't later than ",[1049,2573,2538],{},[1072,2575,2576,2581],{},[1090,2577,2578],{},[1049,2579,2580],{},"exp - iat",[1090,2582,2583],{},"It is more than 3600 seconds (one hour).",[1072,2585,2586,2590],{},[1090,2587,2588],{},[1049,2589,2538],{},[1090,2591,2592],{},"It is more than 30 seconds ahead of the API's clock. Your server's clock is fast.",[1072,2594,2595,2599],{},[1090,2596,2597],{},[1049,2598,2541],{},[1090,2600,2601],{},"It passed more than 30 seconds ago. The token has expired.",[1072,2603,2604,2609],{},[1090,2605,2606],{},[1049,2607,2608],{},"nbf",[1090,2610,2611],{},"You don't need this claim. If you send it, the token is refused until 30 seconds before the time it names.",[1363,2613,2615],{"id":2614},"revocation","Revocation",[1237,2617,2618],{},[1240,2619,2620,2621,2626],{},"The token was revoked with ",[1058,2622,2623],{"href":140},[1049,2624,2625],{},"POST \u002Fv1\u002Fapi-account\u002Frevoke-token",". Revocation applies to that one token. Sign a new one.",[1041,2628,1235],{"id":1234},[2134,2630,2631,3150,3156,3165,3171],{},[1240,2632,2633,2636,2637,2887],{},[1053,2634,2635],{},"Decode your token locally and compare it with the rules."," Never paste a token into a website.",[1140,2638,2642],{"className":2639,"code":2640,"language":2641,"meta":1145,"style":1145},"language-js shiki shiki-themes github-light-high-contrast github-dark-high-contrast","\u002F\u002F Prints what the API will check. Node.js, no dependencies.\nconst [h, p] = token.split('.');\nconst header = JSON.parse(Buffer.from(h, 'base64url').toString());\nconst claims = JSON.parse(Buffer.from(p, 'base64url').toString());\nconst now = Math.floor(Date.now() \u002F 1000);\nconsole.log({\n  algIsHS256: header.alg === 'HS256',\n  kidIsKey: header.kid === process.env.MTO_API_KEY,\n  subIsKey: claims.sub === process.env.MTO_API_KEY,\n  lifetime: claims.exp - claims.iat, \u002F\u002F must be 1..3600\n  iatAheadBy: claims.iat - now, \u002F\u002F must be \u003C= 30\n  secondsLeft: claims.exp - now, \u002F\u002F must be > -30\n});\n","js",[1049,2643,2644,2650,2687,2725,2755,2786,2797,2810,2825,2839,2854,2868,2881],{"__ignoreMap":1145},[1149,2645,2646],{"class":1151,"line":1152},[1149,2647,2649],{"class":2648},"sLBg1","\u002F\u002F Prints what the API will check. Node.js, no dependencies.\n",[1149,2651,2652,2655,2658,2661,2663,2665,2668,2671,2674,2678,2681,2684],{"class":1151,"line":1159},[1149,2653,2654],{"class":2280},"const",[1149,2656,2657],{"class":1155}," [",[1149,2659,2660],{"class":2287},"h",[1149,2662,1421],{"class":1155},[1149,2664,1046],{"class":2287},[1149,2666,2667],{"class":1155},"] ",[1149,2669,2670],{"class":2280},"=",[1149,2672,2673],{"class":1155}," token.",[1149,2675,2677],{"class":2676},"sKwhi","split",[1149,2679,2680],{"class":1155},"(",[1149,2682,2683],{"class":1178},"'.'",[1149,2685,2686],{"class":1155},");\n",[1149,2688,2689,2691,2694,2697,2700,2702,2705,2708,2711,2714,2717,2719,2722],{"class":1151,"line":1169},[1149,2690,2654],{"class":2280},[1149,2692,2693],{"class":2287}," header",[1149,2695,2696],{"class":2280}," =",[1149,2698,2699],{"class":2287}," JSON",[1149,2701,1268],{"class":1155},[1149,2703,2704],{"class":2676},"parse",[1149,2706,2707],{"class":1155},"(Buffer.",[1149,2709,2710],{"class":2676},"from",[1149,2712,2713],{"class":1155},"(h, ",[1149,2715,2716],{"class":1178},"'base64url'",[1149,2718,2111],{"class":1155},[1149,2720,2721],{"class":2676},"toString",[1149,2723,2724],{"class":1155},"());\n",[1149,2726,2727,2729,2732,2734,2736,2738,2740,2742,2744,2747,2749,2751,2753],{"class":1151,"line":1185},[1149,2728,2654],{"class":2280},[1149,2730,2731],{"class":2287}," claims",[1149,2733,2696],{"class":2280},[1149,2735,2699],{"class":2287},[1149,2737,1268],{"class":1155},[1149,2739,2704],{"class":2676},[1149,2741,2707],{"class":1155},[1149,2743,2710],{"class":2676},[1149,2745,2746],{"class":1155},"(p, ",[1149,2748,2716],{"class":1178},[1149,2750,2111],{"class":1155},[1149,2752,2721],{"class":2676},[1149,2754,2724],{"class":1155},[1149,2756,2757,2759,2762,2764,2767,2770,2773,2776,2779,2781,2784],{"class":1151,"line":1198},[1149,2758,2654],{"class":2280},[1149,2760,2761],{"class":2287}," now",[1149,2763,2696],{"class":2280},[1149,2765,2766],{"class":1155}," Math.",[1149,2768,2769],{"class":2676},"floor",[1149,2771,2772],{"class":1155},"(Date.",[1149,2774,2775],{"class":2676},"now",[1149,2777,2778],{"class":1155},"() ",[1149,2780,2284],{"class":2280},[1149,2782,2783],{"class":2287}," 1000",[1149,2785,2686],{"class":1155},[1149,2787,2788,2791,2794],{"class":1151,"line":1211},[1149,2789,2790],{"class":1155},"console.",[1149,2792,2793],{"class":2676},"log",[1149,2795,2796],{"class":1155},"({\n",[1149,2798,2799,2802,2805,2808],{"class":1151,"line":1222},[1149,2800,2801],{"class":1155},"  algIsHS256: header.alg ",[1149,2803,2804],{"class":2280},"===",[1149,2806,2807],{"class":1178}," 'HS256'",[1149,2809,1182],{"class":1155},[1149,2811,2812,2815,2817,2820,2823],{"class":1151,"line":1228},[1149,2813,2814],{"class":1155},"  kidIsKey: header.kid ",[1149,2816,2804],{"class":2280},[1149,2818,2819],{"class":1155}," process.env.",[1149,2821,2822],{"class":2287},"MTO_API_KEY",[1149,2824,1182],{"class":1155},[1149,2826,2828,2831,2833,2835,2837],{"class":1151,"line":2827},9,[1149,2829,2830],{"class":1155},"  subIsKey: claims.sub ",[1149,2832,2804],{"class":2280},[1149,2834,2819],{"class":1155},[1149,2836,2822],{"class":2287},[1149,2838,1182],{"class":1155},[1149,2840,2842,2845,2848,2851],{"class":1151,"line":2841},10,[1149,2843,2844],{"class":1155},"  lifetime: claims.exp ",[1149,2846,2847],{"class":2280},"-",[1149,2849,2850],{"class":1155}," claims.iat, ",[1149,2852,2853],{"class":2648},"\u002F\u002F must be 1..3600\n",[1149,2855,2857,2860,2862,2865],{"class":1151,"line":2856},11,[1149,2858,2859],{"class":1155},"  iatAheadBy: claims.iat ",[1149,2861,2847],{"class":2280},[1149,2863,2864],{"class":1155}," now, ",[1149,2866,2867],{"class":2648},"\u002F\u002F must be \u003C= 30\n",[1149,2869,2871,2874,2876,2878],{"class":1151,"line":2870},12,[1149,2872,2873],{"class":1155},"  secondsLeft: claims.exp ",[1149,2875,2847],{"class":2280},[1149,2877,2864],{"class":1155},[1149,2879,2880],{"class":2648},"\u002F\u002F must be > -30\n",[1149,2882,2884],{"class":1151,"line":2883},13,[1149,2885,2886],{"class":1155},"});\n",[1140,2888,2892],{"className":2889,"code":2890,"language":2891,"meta":1145,"style":1145},"language-php shiki shiki-themes github-light-high-contrast github-dark-high-contrast","\u003C?php\n[$h, $p] = explode('.', $token);\n$decode = fn (string $part) => json_decode(base64_decode(strtr($part, '-_', '+\u002F')), true);\n$header = $decode($h);\n$claims = $decode($p);\n$now = time();\nvar_dump([\n    'algIsHS256' => $header['alg'] === 'HS256',\n    'kidIsKey' => $header['kid'] === getenv('MTO_API_KEY'),\n    'subIsKey' => $claims['sub'] === getenv('MTO_API_KEY'),\n    'lifetime' => $claims['exp'] - $claims['iat'],\n    'iatAheadBy' => $claims['iat'] - $now,\n    'secondsLeft' => $claims['exp'] - $now,\n]);\n","php",[1049,2893,2894,2902,2919,2970,2980,2990,3003,3011,3033,3060,3085,3109,3127,3144],{"__ignoreMap":1145},[1149,2895,2896,2899],{"class":1151,"line":1152},[1149,2897,2898],{"class":2280},"\u003C?",[1149,2900,2901],{"class":2287},"php\n",[1149,2903,2904,2907,2909,2912,2914,2916],{"class":1151,"line":1159},[1149,2905,2906],{"class":1155},"[$h, $p] ",[1149,2908,2670],{"class":2280},[1149,2910,2911],{"class":2287}," explode",[1149,2913,2680],{"class":1155},[1149,2915,2683],{"class":1178},[1149,2917,2918],{"class":1155},", $token);\n",[1149,2920,2921,2924,2926,2929,2932,2935,2938,2941,2943,2946,2948,2951,2954,2957,2959,2962,2965,2968],{"class":1151,"line":1169},[1149,2922,2923],{"class":1155},"$decode ",[1149,2925,2670],{"class":2280},[1149,2927,2928],{"class":2280}," fn",[1149,2930,2931],{"class":1155}," (",[1149,2933,2934],{"class":2280},"string",[1149,2936,2937],{"class":1155}," $part) => ",[1149,2939,2940],{"class":2287},"json_decode",[1149,2942,2680],{"class":1155},[1149,2944,2945],{"class":2287},"base64_decode",[1149,2947,2680],{"class":1155},[1149,2949,2950],{"class":2287},"strtr",[1149,2952,2953],{"class":1155},"($part, ",[1149,2955,2956],{"class":1178},"'-_'",[1149,2958,1421],{"class":1155},[1149,2960,2961],{"class":1178},"'+\u002F'",[1149,2963,2964],{"class":1155},")), ",[1149,2966,2967],{"class":2287},"true",[1149,2969,2686],{"class":1155},[1149,2971,2972,2975,2977],{"class":1151,"line":1185},[1149,2973,2974],{"class":1155},"$header ",[1149,2976,2670],{"class":2280},[1149,2978,2979],{"class":1155}," $decode($h);\n",[1149,2981,2982,2985,2987],{"class":1151,"line":1198},[1149,2983,2984],{"class":1155},"$claims ",[1149,2986,2670],{"class":2280},[1149,2988,2989],{"class":1155}," $decode($p);\n",[1149,2991,2992,2995,2997,3000],{"class":1151,"line":1211},[1149,2993,2994],{"class":1155},"$now ",[1149,2996,2670],{"class":2280},[1149,2998,2999],{"class":2287}," time",[1149,3001,3002],{"class":1155},"();\n",[1149,3004,3005,3008],{"class":1151,"line":1222},[1149,3006,3007],{"class":2287},"var_dump",[1149,3009,3010],{"class":1155},"([\n",[1149,3012,3013,3016,3019,3022,3025,3027,3029,3031],{"class":1151,"line":1228},[1149,3014,3015],{"class":1178},"    'algIsHS256'",[1149,3017,3018],{"class":2280}," =>",[1149,3020,3021],{"class":1155}," $header[",[1149,3023,3024],{"class":1178},"'alg'",[1149,3026,2667],{"class":1155},[1149,3028,2804],{"class":2280},[1149,3030,2807],{"class":1178},[1149,3032,1182],{"class":1155},[1149,3034,3035,3038,3040,3042,3045,3047,3049,3052,3054,3057],{"class":1151,"line":2827},[1149,3036,3037],{"class":1178},"    'kidIsKey'",[1149,3039,3018],{"class":2280},[1149,3041,3021],{"class":1155},[1149,3043,3044],{"class":1178},"'kid'",[1149,3046,2667],{"class":1155},[1149,3048,2804],{"class":2280},[1149,3050,3051],{"class":2287}," getenv",[1149,3053,2680],{"class":1155},[1149,3055,3056],{"class":1178},"'MTO_API_KEY'",[1149,3058,3059],{"class":1155},"),\n",[1149,3061,3062,3065,3067,3070,3073,3075,3077,3079,3081,3083],{"class":1151,"line":2841},[1149,3063,3064],{"class":1178},"    'subIsKey'",[1149,3066,3018],{"class":2280},[1149,3068,3069],{"class":1155}," $claims[",[1149,3071,3072],{"class":1178},"'sub'",[1149,3074,2667],{"class":1155},[1149,3076,2804],{"class":2280},[1149,3078,3051],{"class":2287},[1149,3080,2680],{"class":1155},[1149,3082,3056],{"class":1178},[1149,3084,3059],{"class":1155},[1149,3086,3087,3090,3092,3094,3097,3099,3101,3103,3106],{"class":1151,"line":2856},[1149,3088,3089],{"class":1178},"    'lifetime'",[1149,3091,3018],{"class":2280},[1149,3093,3069],{"class":1155},[1149,3095,3096],{"class":1178},"'exp'",[1149,3098,2667],{"class":1155},[1149,3100,2847],{"class":2280},[1149,3102,3069],{"class":1155},[1149,3104,3105],{"class":1178},"'iat'",[1149,3107,3108],{"class":1155},"],\n",[1149,3110,3111,3114,3116,3118,3120,3122,3124],{"class":1151,"line":2870},[1149,3112,3113],{"class":1178},"    'iatAheadBy'",[1149,3115,3018],{"class":2280},[1149,3117,3069],{"class":1155},[1149,3119,3105],{"class":1178},[1149,3121,2667],{"class":1155},[1149,3123,2847],{"class":2280},[1149,3125,3126],{"class":1155}," $now,\n",[1149,3128,3129,3132,3134,3136,3138,3140,3142],{"class":1151,"line":2883},[1149,3130,3131],{"class":1178},"    'secondsLeft'",[1149,3133,3018],{"class":2280},[1149,3135,3069],{"class":1155},[1149,3137,3096],{"class":1178},[1149,3139,2667],{"class":1155},[1149,3141,2847],{"class":2280},[1149,3143,3126],{"class":1155},[1149,3145,3147],{"class":1151,"line":3146},14,[1149,3148,3149],{"class":1155},"]);\n",[1240,3151,3152,3155],{},[1053,3153,3154],{},"Keep your server's clock synchronized"," with NTP. Clock drift is the usual reason a token that worked yesterday fails today.",[1240,3157,3158,3161,3162,3164],{},[1053,3159,3160],{},"Sign a fresh token and send the request once more."," That covers an expired or revoked token. If the fresh token also gets ",[1049,3163,2385],{},", stop retrying: repeating the same token will not change the answer.",[1240,3166,3167,3170],{},[1053,3168,3169],{},"Check that the account is still active."," If every token fails, even a correctly built one, your account may have been deactivated. Contact us.",[1240,3172,3173,3176,3177,3183,3184,3187],{},[1053,3174,3175],{},"Still stuck?"," Email ",[1053,3178,3179],{},[1058,3180,3182],{"href":3181},"mailto:info@main-team.org","info@main-team.org"," with the ",[1049,3185,3186],{},"request_id"," and the UTC time of a failing request. The reason for the refusal is recorded against that id. Never send the token or your secret.",[1046,3189,1289,3190,3192,3193,3196,3197,1268],{},[1049,3191,2385],{}," doesn't count against your ",[1058,3194,3195],{"href":46},"rate limit",". Token caching and clock handling are covered step by step in ",[1058,3198,112],{"href":113},[1273,3200,3201],{},"html pre.shiki code .sHUrx, html code.shiki .sHUrx{--shiki-default:#A0111F;--shiki-dark:#FF9492}html pre.shiki code .suds8, html code.shiki .suds8{--shiki-default:#0E1116;--shiki-dark:#F0F3F6}html pre.shiki code .s-5SL, html code.shiki .s-5SL{--shiki-default:#023B95;--shiki-dark:#91CBFF}html pre.shiki code .sT6z2, html code.shiki .sT6z2{--shiki-default:#032563;--shiki-dark:#ADDCFF}html pre.shiki code .sne4z, html code.shiki .sne4z{--shiki-default:#024C1A;--shiki-dark:#72F088}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sLBg1, html code.shiki .sLBg1{--shiki-default:#66707B;--shiki-dark:#BDC4CC}html pre.shiki code .sKwhi, html code.shiki .sKwhi{--shiki-default:#622CBC;--shiki-dark:#DBB7FF}",{"title":1145,"searchDepth":1159,"depth":1169,"links":3203},[3204,3212],{"id":1043,"depth":1159,"text":1044,"children":3205},[3206,3207,3208,3209,3210,3211],{"id":2393,"depth":1169,"text":2394},{"id":2435,"depth":1169,"text":2436},{"id":2473,"depth":1169,"text":2474},{"id":2485,"depth":1169,"text":2486},{"id":2501,"depth":1169,"text":2502},{"id":2614,"depth":1169,"text":2615},{"id":1234,"depth":1159,"text":1235},{"code":893,"heading":893,"status":892,"retry":1034,"summary":3214,"message":3215,"body":3216},"Your account lacks the permission this operation needs on this organization, or an access rule of the operation itself refused the request.","You do not have permission to access this resource.",{"type":1038,"value":3217,"toc":4076},[3218,3220,3226,3291,3297,3303,3350,3353,3538,3543,3549,3557,3577,3581,3587,3606,3610,3644,3646,3652,3684,3690,3694,3712,3716,3733,3796,4060,4073],[1041,3219,1044],{"id":1043},[1046,3221,1289,3222,3225],{},[1049,3223,3224],{},"403"," always means the API knows who you are: your token passed every check. What failed is whether your account may do this particular thing. There are three situations, and the message tells them apart.",[1140,3227,3229],{"className":1142,"code":3228,"language":1144,"meta":1145,"style":1145},"{\n  \"error\": {\n    \"code\": \"forbidden\",\n    \"message\": \"Insufficient role permissions\",\n    \"documentation_url\": \"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#forbidden\",\n    \"request_id\": \"c2a4f0e1-9d3b-4b8e-a6f7-51e0d2c9b813\"\n  }\n}\n",[1049,3230,3231,3235,3241,3252,3263,3274,3283,3287],{"__ignoreMap":1145},[1149,3232,3233],{"class":1151,"line":1152},[1149,3234,1156],{"class":1155},[1149,3236,3237,3239],{"class":1151,"line":1159},[1149,3238,1163],{"class":1162},[1149,3240,1166],{"class":1155},[1149,3242,3243,3245,3247,3250],{"class":1151,"line":1169},[1149,3244,1172],{"class":1162},[1149,3246,1175],{"class":1155},[1149,3248,3249],{"class":1178},"\"forbidden\"",[1149,3251,1182],{"class":1155},[1149,3253,3254,3256,3258,3261],{"class":1151,"line":1185},[1149,3255,1188],{"class":1162},[1149,3257,1175],{"class":1155},[1149,3259,3260],{"class":1178},"\"Insufficient role permissions\"",[1149,3262,1182],{"class":1155},[1149,3264,3265,3267,3269,3272],{"class":1151,"line":1198},[1149,3266,1201],{"class":1162},[1149,3268,1175],{"class":1155},[1149,3270,3271],{"class":1178},"\"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#forbidden\"",[1149,3273,1182],{"class":1155},[1149,3275,3276,3278,3280],{"class":1151,"line":1211},[1149,3277,1214],{"class":1162},[1149,3279,1175],{"class":1155},[1149,3281,3282],{"class":1178},"\"c2a4f0e1-9d3b-4b8e-a6f7-51e0d2c9b813\"\n",[1149,3284,3285],{"class":1151,"line":1222},[1149,3286,1225],{"class":1155},[1149,3288,3289],{"class":1151,"line":1228},[1149,3290,1231],{"class":1155},[1363,3292,3294,3295],{"id":3293},"a-missing-permission-insufficient-role-permissions","A missing permission: ",[1049,3296,894],{},[1046,3298,3299,3300,3302],{},"Every operation needs a permission, and your account holds permissions as roles (see ",[1058,3301,25],{"href":26},"). The request is allowed only when both of these hold:",[1237,3304,3305,3343],{},[1240,3306,3307,3308,3311,3312],{},"An ",[1053,3309,3310],{},"allow"," role matches all three of the following:\n",[1237,3313,3314,3321,3337],{},[1240,3315,3316,3317,3320],{},"its ",[1053,3318,3319],{},"action"," grants the operation's action, directly or through a wildcard;",[1240,3322,3316,3323,3326,3327,3330,3331,3333,3334,3336],{},[1053,3324,3325],{},"target"," is ",[1049,3328,3329],{},"*"," or the organization the request acts on. That is the organization in the path, or ",[1049,3332,1737],{}," for routes without ",[1049,3335,2010],{},";",[1240,3338,3316,3339,3342],{},[1053,3340,3341],{},"authorized"," is empty or your account's own id.",[1240,3344,3345,3346,3349],{},"No ",[1053,3347,3348],{},"disallow"," role matches the same three.",[1046,3351,3352],{},"The usual reasons a request is refused:",[1066,3354,3355,3368],{},[1069,3356,3357],{},[1072,3358,3359,3362,3365],{},[1075,3360,3361],{},"You called",[1075,3363,3364],{},"Your account holds",[1075,3366,3367],{},"Why it's refused",[1085,3369,3370,3399,3428,3451,3479,3504,3524],{},[1072,3371,3372,3377,3386],{},[1090,3373,3374],{},[1049,3375,3376],{},"GET \u002Fv1\u002Fstudent",[1090,3378,3379,3380,3383,3384],{},"allow ",[1049,3381,3382],{},"student\u002F*"," on ",[1049,3385,1721],{},[1090,3387,3388,3389,3391,3392,3394,3395,1762,3397,1268],{},"Routes without ",[1049,3390,2010],{}," act on ",[1049,3393,1737],{},". The role needs target ",[1049,3396,1737],{},[1049,3398,3329],{},[1072,3400,3401,3410,3416],{},[1090,3402,3403,3406,3407],{},[1049,3404,3405],{},"POST \u002Fv1\u002F{organizationId}\u002Fauth\u002Fsignin",", with stem's ",[1049,3408,3409],{},"_id",[1090,3411,3379,3412,3383,3414],{},[1049,3413,3382],{},[1049,3415,1721],{},[1090,3417,3418,3421,3422,1762,3424,3427],{},[1049,3419,3420],{},"auth\u002Fsignin"," is its own action. No ",[1049,3423,3382],{},[1049,3425,3426],{},"api\u002F*"," role includes it.",[1072,3429,3430,3435,3441],{},[1090,3431,3432],{},[1049,3433,3434],{},"PUT \u002Fv1\u002Fstudent\u002F{studentId}\u002Fpassword",[1090,3436,3379,3437,3383,3439],{},[1049,3438,3420],{},[1049,3440,1721],{},[1090,3442,3443,3444,3446,3447,3383,3449,1268],{},"The password route has no ",[1049,3445,2010],{},", so it needs ",[1049,3448,3420],{},[1049,3450,1737],{},[1072,3452,3453,3458,3465],{},[1090,3454,3455],{},[1049,3456,3457],{},"GET \u002Fv1\u002Fapi-account\u002Fvalidate-me",[1090,3459,3379,3460,3383,3463],{},[1049,3461,3462],{},"*\u002Fread",[1049,3464,3329],{},[1090,3466,3467,3468,3470,3471,1421,3473,1762,3476,3478],{},"The account routes need ",[1049,3469,3426],{},". Only ",[1049,3472,3426],{},[1049,3474,3475],{},"*\u002F*",[1049,3477,3329],{}," grant it.",[1072,3480,3481,3488,3501],{},[1090,3482,3483,3406,3486],{},[1049,3484,3485],{},"DELETE \u002Fv1\u002F{organizationId}\u002Fapplication\u002F{applicationId}",[1049,3487,3409],{},[1090,3489,3379,3490,3383,3493,3495,3496,3383,3499],{},[1049,3491,3492],{},"application\u002F*",[1049,3494,3329],{},", disallow ",[1049,3497,3498],{},"application\u002Fdelete",[1049,3500,3329],{},[1090,3502,3503],{},"A matching disallow always wins.",[1072,3505,3506,3514,3521],{},[1090,3507,3508,3511,3512],{},[1049,3509,3510],{},"GET \u002Fv1\u002F{organizationId}\u002Fexam",", with neo's ",[1049,3513,3409],{},[1090,3515,3379,3516,3383,3519],{},[1049,3517,3518],{},"exam\u002Fread",[1049,3520,1721],{},[1090,3522,3523],{},"The role covers stem only.",[1072,3525,3526,3529,3535],{},[1090,3527,3528],{},"Anything",[1090,3530,3531,3532,3534],{},"a role whose ",[1049,3533,3341],{}," is another account's id",[1090,3536,3537],{},"That role applies to nobody.",[1046,3539,3540,3541,1268],{},"A refusal for a missing permission comes before the operation does anything, and it doesn't count against your ",[1058,3542,3195],{"href":46},[1363,3544,3546,3547],{"id":3545},"a-password-at-registration-without-authsignin","A password at registration without ",[1049,3548,3420],{},[1140,3550,3555],{"className":3551,"code":3553,"language":3554},[3552],"language-text","Setting a student's password needs the auth\u002Fsignin permission on mto, the same grant a sign-in link needs.\n","text",[1049,3556,3553],{"__ignoreMap":1145},[1046,3558,3559,3564,3565,3568,3569,3571,3572,3383,3574,3576],{},[1058,3560,3561],{"href":174},[1049,3562,3563],{},"POST \u002Fv1\u002Fstudent"," needs ",[1049,3566,3567],{},"student\u002Fcreate",". If the body also carries a ",[1049,3570,1398],{},", the account needs ",[1049,3573,3420],{},[1049,3575,1737],{}," as well, because a password you set is a sign-in as the student. The request is refused before anything is written.",[1363,3578,3580],{"id":3579},"a-sign-in-link-for-a-student-without-access-to-the-organization","A sign-in link for a student without access to the organization",[1140,3582,3585],{"className":3583,"code":3584,"language":3554},[3552],"Student is not activated for organization stem.\n",[1049,3586,3584],{"__ignoreMap":1145},[1046,3588,3589,3593,3594,3596,3597,3599,3600,3602,3603,3605],{},[1058,3590,3591],{"href":211},[1049,3592,3405],{}," only mints a link into an organization the student has access to. That means their ",[1049,3595,1689],{}," holds ",[1049,3598,1717],{}," (every organization) or that organization's slug. A student registered without ",[1049,3601,1689],{}," gets ",[1049,3604,1696],{},", so this only happens to students whose list you set yourself. Nothing is written for a refused request.",[1363,3607,3609],{"id":3608},"what-is-not-a-403","What is not a 403",[1237,3611,3612,3623,3635],{},[1240,3613,3614,3326,3617,1268],{},[1053,3615,3616],{},"A bad or expired token",[1058,3618,3620],{"href":3619},"\u002Fapi\u002Ferrors#unauthorized",[1049,3621,3622],{},"401 unauthorized",[1240,3624,3625,3326,3628,3634],{},[1053,3626,3627],{},"A record that belongs to another account",[1058,3629,3631],{"href":3630},"\u002Fapi\u002Ferrors#not_found",[1049,3632,3633],{},"404 not_found",". The API never confirms that someone else's record exists.",[1240,3636,3637,3640,3641,3643],{},[1053,3638,3639],{},"An unconfirmed email address"," is not a reason for any ",[1049,3642,3224],{},". A sign-in link is issued either way.",[1041,3645,1235],{"id":1234},[1363,3647,3649,3650],{"id":3648},"for-insufficient-role-permissions","For ",[1049,3651,894],{},[2134,3653,3654,3663,3673],{},[1240,3655,3656,3657,3659,3660,1268],{},"Work out which permission the operation needs, and on which organization, from the operation's page in the ",[1058,3658,116],{"href":121}," or the ",[1058,3661,3662],{"href":26},"permission matrix",[1240,3664,3665,3666,3670,3671,1268],{},"Compare it with the roles your account holds. ",[1058,3667,3668],{"href":144},[1049,3669,3457],{}," lists them, if your account holds ",[1049,3672,3426],{},[1240,3674,3675,3676,3680,3681,3683],{},"Ask for the missing role at ",[1053,3677,3678],{},[1058,3679,3182],{"href":3181},". Name the operation and the organization, and quote a ",[1049,3682,3186],{},". Only an operator can change roles, and a change takes effect within 60 seconds.",[1046,3685,3686,3687,3689],{},"Re-signing your token or retrying will not help. The same request keeps getting ",[1049,3688,3224],{}," until the role changes.",[1363,3691,3693],{"id":3692},"for-a-password-at-registration","For a password at registration",[1046,3695,3696,3697,3383,3699,3701,3702,3704,3705,3708,3709,2111],{},"Either ask for ",[1049,3698,3420],{},[1049,3700,1737],{},", or register the student without a ",[1049,3703,1398],{}," and send them into the panel with a ",[1058,3706,3707],{"href":81},"sign-in link",". Links are the safer choice anyway (see ",[1058,3710,51],{"href":3711},"\u002Fapi\u002Fsecurity#passwords",[1363,3713,3715],{"id":3714},"for-a-student-without-access-to-the-organization","For a student without access to the organization",[1046,3717,3718,3719,3724,3725,3728,3729,3732],{},"Give the student access with ",[1058,3720,3721],{"href":202},[1049,3722,3723],{},"PUT \u002Fv1\u002F{organizationId}\u002Fstudent\u002F{studentId}",", then mint the link again. An empty body adds this organization to the student's list and changes nothing else. Here the student was on ",[1049,3726,3727],{},"[\"neo\"]",", and ",[1049,3730,3731],{},"$ORGANIZATION_ID"," is stem's:",[1140,3734,3738],{"className":3735,"code":3736,"language":3737,"meta":1145,"style":1145},"language-bash shiki shiki-themes github-light-high-contrast github-dark-high-contrast","curl -X PUT \"https:\u002F\u002Fapi.main-team.org\u002Fv1\u002F$ORGANIZATION_ID\u002Fstudent\u002F652f1c9b8e4b2a0012a3c4d5\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{}'\n","bash",[1049,3739,3740,3763,3779,3788],{"__ignoreMap":1145},[1149,3741,3742,3746,3749,3752,3755,3757,3760],{"class":1151,"line":1152},[1149,3743,3745],{"class":3744},"soyes","curl",[1149,3747,3748],{"class":2287}," -X",[1149,3750,3751],{"class":1178}," PUT",[1149,3753,3754],{"class":1178}," \"https:\u002F\u002Fapi.main-team.org\u002Fv1\u002F",[1149,3756,3731],{"class":1155},[1149,3758,3759],{"class":1178},"\u002Fstudent\u002F652f1c9b8e4b2a0012a3c4d5\"",[1149,3761,3762],{"class":2280}," \\\n",[1149,3764,3765,3768,3771,3774,3777],{"class":1151,"line":1159},[1149,3766,3767],{"class":2287},"  -H",[1149,3769,3770],{"class":1178}," \"Authorization: Bearer ",[1149,3772,3773],{"class":1155},"$TOKEN",[1149,3775,3776],{"class":1178},"\"",[1149,3778,3762],{"class":2280},[1149,3780,3781,3783,3786],{"class":1151,"line":1169},[1149,3782,3767],{"class":2287},[1149,3784,3785],{"class":1178}," \"Content-Type: application\u002Fjson\"",[1149,3787,3762],{"class":2280},[1149,3789,3790,3793],{"class":1151,"line":1185},[1149,3791,3792],{"class":2287},"  -d",[1149,3794,3795],{"class":1178}," '{}'\n",[1140,3797,3799],{"className":1142,"code":3798,"language":1144,"meta":1145,"style":1145},"{\n  \"success\": true,\n  \"message\": \"Student updated successfully.\",\n  \"data\": {\n    \"_id\": \"652f1c9b8e4b2a0012a3c4d5\",\n    \"username\": \"XXB1047\",\n    \"firstName\": \"Lena\",\n    \"lastName\": \"Hoffmann\",\n    \"fullName\": \"Lena Hoffmann\",\n    \"email\": \"lena.hoffmann@example.com\",\n    \"emailConfirmed\": false,\n    \"phone\": \"+49 30 1234567\",\n    \"birth\": \"14\u002F05\u002F2010\",\n    \"sex\": \"f\",\n    \"country\": \"630e0182c53dc79a6836e67e\",\n    \"city\": \"630e0190c53dc79a6836f101\",\n    \"school\": \"630e01a4c53dc79a68370a2b\",\n    \"grade\": \"630e01826836e67ec53dc7a6\",\n    \"activatedPlatformsThisSeason\": [\"neo\", \"stem\"],\n    \"createdAt\": \"2026-09-01T08:12:44.302Z\",\n    \"updatedAt\": \"2026-09-15T10:02:09.118Z\"\n  }\n}\n",[1049,3800,3801,3805,3816,3828,3835,3847,3859,3871,3883,3895,3907,3919,3931,3943,3955,3968,3981,3994,4007,4026,4039,4050,4055],{"__ignoreMap":1145},[1149,3802,3803],{"class":1151,"line":1152},[1149,3804,1156],{"class":1155},[1149,3806,3807,3810,3812,3814],{"class":1151,"line":1159},[1149,3808,3809],{"class":1162},"  \"success\"",[1149,3811,1175],{"class":1155},[1149,3813,2967],{"class":2287},[1149,3815,1182],{"class":1155},[1149,3817,3818,3821,3823,3826],{"class":1151,"line":1169},[1149,3819,3820],{"class":1162},"  \"message\"",[1149,3822,1175],{"class":1155},[1149,3824,3825],{"class":1178},"\"Student updated successfully.\"",[1149,3827,1182],{"class":1155},[1149,3829,3830,3833],{"class":1151,"line":1185},[1149,3831,3832],{"class":1162},"  \"data\"",[1149,3834,1166],{"class":1155},[1149,3836,3837,3840,3842,3845],{"class":1151,"line":1198},[1149,3838,3839],{"class":1162},"    \"_id\"",[1149,3841,1175],{"class":1155},[1149,3843,3844],{"class":1178},"\"652f1c9b8e4b2a0012a3c4d5\"",[1149,3846,1182],{"class":1155},[1149,3848,3849,3852,3854,3857],{"class":1151,"line":1211},[1149,3850,3851],{"class":1162},"    \"username\"",[1149,3853,1175],{"class":1155},[1149,3855,3856],{"class":1178},"\"XXB1047\"",[1149,3858,1182],{"class":1155},[1149,3860,3861,3864,3866,3869],{"class":1151,"line":1222},[1149,3862,3863],{"class":1162},"    \"firstName\"",[1149,3865,1175],{"class":1155},[1149,3867,3868],{"class":1178},"\"Lena\"",[1149,3870,1182],{"class":1155},[1149,3872,3873,3876,3878,3881],{"class":1151,"line":1228},[1149,3874,3875],{"class":1162},"    \"lastName\"",[1149,3877,1175],{"class":1155},[1149,3879,3880],{"class":1178},"\"Hoffmann\"",[1149,3882,1182],{"class":1155},[1149,3884,3885,3888,3890,3893],{"class":1151,"line":2827},[1149,3886,3887],{"class":1162},"    \"fullName\"",[1149,3889,1175],{"class":1155},[1149,3891,3892],{"class":1178},"\"Lena Hoffmann\"",[1149,3894,1182],{"class":1155},[1149,3896,3897,3900,3902,3905],{"class":1151,"line":2841},[1149,3898,3899],{"class":1162},"    \"email\"",[1149,3901,1175],{"class":1155},[1149,3903,3904],{"class":1178},"\"lena.hoffmann@example.com\"",[1149,3906,1182],{"class":1155},[1149,3908,3909,3912,3914,3917],{"class":1151,"line":2856},[1149,3910,3911],{"class":1162},"    \"emailConfirmed\"",[1149,3913,1175],{"class":1155},[1149,3915,3916],{"class":2287},"false",[1149,3918,1182],{"class":1155},[1149,3920,3921,3924,3926,3929],{"class":1151,"line":2870},[1149,3922,3923],{"class":1162},"    \"phone\"",[1149,3925,1175],{"class":1155},[1149,3927,3928],{"class":1178},"\"+49 30 1234567\"",[1149,3930,1182],{"class":1155},[1149,3932,3933,3936,3938,3941],{"class":1151,"line":2883},[1149,3934,3935],{"class":1162},"    \"birth\"",[1149,3937,1175],{"class":1155},[1149,3939,3940],{"class":1178},"\"14\u002F05\u002F2010\"",[1149,3942,1182],{"class":1155},[1149,3944,3945,3948,3950,3953],{"class":1151,"line":3146},[1149,3946,3947],{"class":1162},"    \"sex\"",[1149,3949,1175],{"class":1155},[1149,3951,3952],{"class":1178},"\"f\"",[1149,3954,1182],{"class":1155},[1149,3956,3958,3961,3963,3966],{"class":1151,"line":3957},15,[1149,3959,3960],{"class":1162},"    \"country\"",[1149,3962,1175],{"class":1155},[1149,3964,3965],{"class":1178},"\"630e0182c53dc79a6836e67e\"",[1149,3967,1182],{"class":1155},[1149,3969,3971,3974,3976,3979],{"class":1151,"line":3970},16,[1149,3972,3973],{"class":1162},"    \"city\"",[1149,3975,1175],{"class":1155},[1149,3977,3978],{"class":1178},"\"630e0190c53dc79a6836f101\"",[1149,3980,1182],{"class":1155},[1149,3982,3984,3987,3989,3992],{"class":1151,"line":3983},17,[1149,3985,3986],{"class":1162},"    \"school\"",[1149,3988,1175],{"class":1155},[1149,3990,3991],{"class":1178},"\"630e01a4c53dc79a68370a2b\"",[1149,3993,1182],{"class":1155},[1149,3995,3997,4000,4002,4005],{"class":1151,"line":3996},18,[1149,3998,3999],{"class":1162},"    \"grade\"",[1149,4001,1175],{"class":1155},[1149,4003,4004],{"class":1178},"\"630e01826836e67ec53dc7a6\"",[1149,4006,1182],{"class":1155},[1149,4008,4010,4013,4016,4019,4021,4024],{"class":1151,"line":4009},19,[1149,4011,4012],{"class":1162},"    \"activatedPlatformsThisSeason\"",[1149,4014,4015],{"class":1155},": [",[1149,4017,4018],{"class":1178},"\"neo\"",[1149,4020,1421],{"class":1155},[1149,4022,4023],{"class":1178},"\"stem\"",[1149,4025,3108],{"class":1155},[1149,4027,4029,4032,4034,4037],{"class":1151,"line":4028},20,[1149,4030,4031],{"class":1162},"    \"createdAt\"",[1149,4033,1175],{"class":1155},[1149,4035,4036],{"class":1178},"\"2026-09-01T08:12:44.302Z\"",[1149,4038,1182],{"class":1155},[1149,4040,4042,4045,4047],{"class":1151,"line":4041},21,[1149,4043,4044],{"class":1162},"    \"updatedAt\"",[1149,4046,1175],{"class":1155},[1149,4048,4049],{"class":1178},"\"2026-09-15T10:02:09.118Z\"\n",[1149,4051,4053],{"class":1151,"line":4052},22,[1149,4054,1225],{"class":1155},[1149,4056,4058],{"class":1151,"line":4057},23,[1149,4059,1231],{"class":1155},[1046,4061,4062,4063,4066,4067,4069,4070,4072],{},"This needs ",[1049,4064,4065],{},"student\u002Fupdate"," on that organization. The update only ever adds: the organizations already on the list stay, and a list that already holds ",[1049,4068,1717],{}," is left as it is. If you send ",[1049,4071,1689],{},", the values in it are added instead, so name this organization in it.",[1273,4074,4075],{},"html pre.shiki code .suds8, html code.shiki .suds8{--shiki-default:#0E1116;--shiki-dark:#F0F3F6}html pre.shiki code .sne4z, html code.shiki .sne4z{--shiki-default:#024C1A;--shiki-dark:#72F088}html pre.shiki code .sT6z2, html code.shiki .sT6z2{--shiki-default:#032563;--shiki-dark:#ADDCFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .soyes, html code.shiki .soyes{--shiki-default:#702C00;--shiki-dark:#FFB757}html pre.shiki code .s-5SL, html code.shiki .s-5SL{--shiki-default:#023B95;--shiki-dark:#91CBFF}html pre.shiki code .sHUrx, html code.shiki .sHUrx{--shiki-default:#A0111F;--shiki-dark:#FF9492}",{"title":1145,"searchDepth":1159,"depth":1169,"links":4077},[4078,4086],{"id":1043,"depth":1159,"text":1044,"children":4079},[4080,4082,4084,4085],{"id":3293,"depth":1169,"text":4081},"A missing permission: Insufficient role permissions",{"id":3545,"depth":1169,"text":4083},"A password at registration without auth\u002Fsignin",{"id":3579,"depth":1169,"text":3580},{"id":3608,"depth":1169,"text":3609},{"id":1234,"depth":1159,"text":1235,"children":4087},[4088,4090,4091],{"id":3648,"depth":1169,"text":4089},"For Insufficient role permissions",{"id":3692,"depth":1169,"text":3693},{"id":3714,"depth":1169,"text":3715},{"code":904,"heading":904,"status":903,"retry":4093,"summary":4094,"message":4095,"body":4096},"never","The path, the organization or the record doesn't exist, or it belongs to another account, which the API never distinguishes from missing.","The requested resource could not be found.",{"type":1038,"value":4097,"toc":4673},[4098,4100,4109,4174,4180,4184,4214,4218,4257,4265,4269,4298,4302,4326,4328,4361,4363,4405,4408,4440,4444,4521,4525,4570,4572,4655,4671],[1041,4099,1044],{"id":1043},[1046,4101,1289,4102,4104,4105,4108],{},[1049,4103,2389],{}," means the API has nothing to show you at this address. For records this is deliberate in one important way. ",[1053,4106,4107],{},"A record that belongs to another API account answers exactly like a record that doesn't exist",", so no account can find out what another account holds.",[1140,4110,4112],{"className":1142,"code":4111,"language":1144,"meta":1145,"style":1145},"{\n  \"error\": {\n    \"code\": \"not_found\",\n    \"message\": \"Student not found!\",\n    \"documentation_url\": \"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#not_found\",\n    \"request_id\": \"5d0f3b6a-1c2e-4f7a-8b9d-0e1f2a3b4c5d\"\n  }\n}\n",[1049,4113,4114,4118,4124,4135,4146,4157,4166,4170],{"__ignoreMap":1145},[1149,4115,4116],{"class":1151,"line":1152},[1149,4117,1156],{"class":1155},[1149,4119,4120,4122],{"class":1151,"line":1159},[1149,4121,1163],{"class":1162},[1149,4123,1166],{"class":1155},[1149,4125,4126,4128,4130,4133],{"class":1151,"line":1169},[1149,4127,1172],{"class":1162},[1149,4129,1175],{"class":1155},[1149,4131,4132],{"class":1178},"\"not_found\"",[1149,4134,1182],{"class":1155},[1149,4136,4137,4139,4141,4144],{"class":1151,"line":1185},[1149,4138,1188],{"class":1162},[1149,4140,1175],{"class":1155},[1149,4142,4143],{"class":1178},"\"Student not found!\"",[1149,4145,1182],{"class":1155},[1149,4147,4148,4150,4152,4155],{"class":1151,"line":1198},[1149,4149,1201],{"class":1162},[1149,4151,1175],{"class":1155},[1149,4153,4154],{"class":1178},"\"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#not_found\"",[1149,4156,1182],{"class":1155},[1149,4158,4159,4161,4163],{"class":1151,"line":1211},[1149,4160,1214],{"class":1162},[1149,4162,1175],{"class":1155},[1149,4164,4165],{"class":1178},"\"5d0f3b6a-1c2e-4f7a-8b9d-0e1f2a3b4c5d\"\n",[1149,4167,4168],{"class":1151,"line":1222},[1149,4169,1225],{"class":1155},[1149,4171,4172],{"class":1151,"line":1228},[1149,4173,1231],{"class":1155},[1046,4175,4176,4177,4179],{},"The message differs from operation to operation, and some operations use one message for several causes. Branch on the status and ",[1049,4178,1049],{},", and use the message only to decide what to check.",[1363,4181,4183],{"id":4182},"the-path","The path",[1066,4185,4186,4194],{},[1069,4187,4188],{},[1072,4189,4190,4192],{},[1075,4191,1077],{},[1075,4193,1083],{},[1085,4195,4196],{},[1072,4197,4198,4203],{},[1090,4199,4200],{},[1049,4201,4202],{},"Cannot GET \u002Fv1\u002Fstudents",[1090,4204,4205,4206,4209,4210,4213],{},"No operation has that path and method: a typo, a missing ",[1049,4207,4208],{},"\u002Fv1",", or the wrong method (for example ",[1049,4211,4212],{},"PATCH",", which the API doesn't use). This answer needs no token.",[1363,4215,4217],{"id":4216},"the-organization","The organization",[1066,4219,4220,4228],{},[1069,4221,4222],{},[1072,4223,4224,4226],{},[1075,4225,1077],{},[1075,4227,1083],{},[1085,4229,4230],{},[1072,4231,4232,4236],{},[1090,4233,4234],{},[1049,4235,935],{},[1090,4237,4238,4240,4241,4244,4245,4247,4248,4250,4251,2085,4253,1268],{},[1049,4239,2010],{}," isn't 24 hexadecimal characters, or no organization that ",[1049,4242,4243],{},"GET \u002Fv1\u002Forganization"," lists has that id (",[1049,4246,1737],{},", the core record, isn't in that list). The most common mistake is putting the slug (",[1049,4249,1721],{},") in the path instead of the organization's ",[1049,4252,3409],{},[1058,4254,4255],{"href":162},[1049,4256,4243],{},[1046,4258,4259,4260,4262,4263,1268],{},"The organization is checked after your token, so a request with an invalid token gets ",[1049,4261,2385],{}," whatever the id. An unknown organization doesn't count against your ",[1058,4264,3195],{"href":46},[1363,4266,4268],{"id":4267},"a-student","A student",[1066,4270,4271,4281],{},[1069,4272,4273],{},[1072,4274,4275,4277,4279],{},[1075,4276,1077],{},[1075,4278,1080],{},[1075,4280,1083],{},[1085,4282,4283],{},[1072,4284,4285,4289,4292],{},[1090,4286,4287],{},[1049,4288,941],{},[1090,4290,4291],{},"get or update a student, get or update an organization student, set a password, create a sign-in link, create an application, the exam picker, list a student's applications, certificates or reports",[1090,4293,4294,4295,4297],{},"No student with that id belongs to your account. Either it doesn't exist, or another account registered it. These operations take the student's core ",[1049,4296,3409],{},", the one registration gave you. Reading a student through an organization also answers this for a student of yours without access to that organization.",[1363,4299,4301],{"id":4300},"a-supervisor-link","A supervisor link",[1066,4303,4304,4312],{},[1069,4305,4306],{},[1072,4307,4308,4310],{},[1075,4309,1077],{},[1075,4311,1083],{},[1085,4313,4314],{},[1072,4315,4316,4320],{},[1090,4317,4318],{},[1049,4319,932],{},[1090,4321,4322,4325],{},[1058,4323,4324],{"href":205},"Linking a supervisor"," answers every refusal the same way. The possible causes: the student isn't yours; the student hasn't signed in to this organization yet, so it holds no copy of them; the username is blank; no user of that organization has the username; or its owner isn't a supervisor.",[1363,4327,86],{"id":231},[1066,4329,4330,4340],{},[1069,4331,4332],{},[1072,4333,4334,4336,4338],{},[1075,4335,1077],{},[1075,4337,1080],{},[1075,4339,1083],{},[1085,4341,4342],{},[1072,4343,4344,4348,4351],{},[1090,4345,4346],{},[1049,4347,905],{},[1090,4349,4350],{},"get, move or delete an application",[1090,4352,4353,4354,4357,4358,4360],{},"No application of your students has that id ",[1053,4355,4356],{},"in this organization",": it doesn't exist there, or another account's student holds it, and the two answer alike. Each organization keeps its own applications, so an id from stem is unknown on neo. A second ",[1049,4359,254],{}," of the same application also gets this.",[1363,4362,83],{"id":213},[1066,4364,4365,4375],{},[1069,4366,4367],{},[1072,4368,4369,4371,4373],{},[1075,4370,1077],{},[1075,4372,1080],{},[1075,4374,1083],{},[1085,4376,4377,4389],{},[1072,4378,4379,4383,4386],{},[1090,4380,4381],{},[1049,4382,917],{},[1090,4384,4385],{},"get an exam, create or move an application",[1090,4387,4388],{},"No exam with that id exists in this organization. Exams belong to one organization.",[1072,4390,4391,4395,4398],{},[1090,4392,4393],{},[1049,4394,914],{},[1090,4396,4397],{},"get an exam",[1090,4399,4400,4401,4404],{},"The exam exists but isn't open: applications are closed, its sitting has passed, or its category isn't active. Creating an application for it answers ",[1049,4402,4403],{},"409"," instead.",[1363,4406,92],{"id":4407},"certificates-and-reports",[1066,4409,4410,4420],{},[1069,4411,4412],{},[1072,4413,4414,4416,4418],{},[1075,4415,1077],{},[1075,4417,1080],{},[1075,4419,1083],{},[1085,4421,4422],{},[1072,4423,4424,4428,4431],{},[1090,4425,4426],{},[1049,4427,932],{},[1090,4429,4430],{},"download a certificate or report",[1090,4432,4433,4434,1762,4436,4439],{},"Every refusal looks the same: no document has that ",[1049,4435,3409],{},[1049,4437,4438],{},"shortId"," in this organization; it hasn't been released yet; a report has been withdrawn; it belongs to another account's student; it has no file attached; or its file is missing from storage.",[1363,4441,4443],{"id":4442},"reference-data-and-exam-categories","Reference data and exam categories",[1066,4445,4446,4456],{},[1069,4447,4448],{},[1072,4449,4450,4452,4454],{},[1075,4451,1077],{},[1075,4453,1080],{},[1075,4455,1083],{},[1085,4457,4458,4471,4485,4507],{},[1072,4459,4460,4464,4469],{},[1090,4461,4462],{},[1049,4463,911],{},[1090,4465,4466],{},[1058,4467,4468],{"href":153},"get a country",[1090,4470,1846],{},[1072,4472,4473,4477,4482],{},[1090,4474,4475],{},[1049,4476,920],{},[1090,4478,4479],{},[1058,4480,4481],{"href":159},"get a grade",[1090,4483,4484],{},"No grade has that id.",[1072,4486,4487,4491,4496],{},[1090,4488,4489],{},[1049,4490,935],{},[1090,4492,4493],{},[1058,4494,4495],{"href":165},"get an organization",[1090,4497,4498,4499,4503,4504,4506],{},"No organization in ",[1058,4500,4501],{"href":162},[1049,4502,4243],{}," has that id. ",[1049,4505,1737],{},", the core record, isn't in that list.",[1072,4508,4509,4513,4518],{},[1090,4510,4511],{},[1049,4512,908],{},[1090,4514,4515],{},[1058,4516,4517],{"href":223},"get an exam category",[1090,4519,4520],{},"No exam category has that id in this organization.",[1363,4522,4524],{"id":4523},"not-a-404","Not a 404",[1237,4526,4527,4546],{},[1240,4528,4529,3326,4532,4534,4535,4537,4538,4540,4541,4543,4544,1268],{},[1053,4530,4531],{},"An id that isn't 24 hexadecimal characters",[1049,4533,1063],{},", for example ",[1049,4536,841],{}," Two exceptions: ",[1049,4539,2010],{}," answers ",[1049,4542,2014],{},", and the download routes treat anything that isn't an id as a ",[1049,4545,4438],{},[1240,4547,4548,4551,4552,4554,4555,4558,4559,4562,4563,4566,4567,1268],{},[1053,4549,4550],{},"An empty list"," is never a ",[1049,4553,2389],{},". It is ",[1049,4556,4557],{},"200"," with ",[1049,4560,4561],{},"\"data\": []"," and a ",[1049,4564,4565],{},"total"," of ",[1049,4568,4569],{},"0",[1041,4571,1235],{"id":1234},[2134,4573,4574,4586,4599,4617,4623,4629,4640],{},[1240,4575,4576,4579,4580,4582,4583,4585],{},[1053,4577,4578],{},"Check the path"," against the ",[1058,4581,116],{"href":121},": the ",[1049,4584,4208],{}," prefix, the spelling, and the method.",[1240,4587,4588,4593,4594,4598],{},[1053,4589,4590,4591],{},"Use the organization's ",[1049,4592,3409],{},", not its slug. Get it from ",[1058,4595,4596],{"href":162},[1049,4597,4243],{}," and store it.",[1240,4600,4601,4604,4605,4607,4608,4610,4611,4614,4615,1268],{},[1053,4602,4603],{},"Use the right id for the student."," Operations take the core ",[1049,4606,3409],{}," you got at registration. An ",[1049,4609,3409],{}," you read off an application, a certificate or another organization's data is that organization's own id for the student. Use its ",[1049,4612,4613],{},"mainId"," instead. See ",[1058,4616,36],{"href":37},[1240,4618,4619,4622],{},[1053,4620,4621],{},"Use the organization the record lives in."," Applications, exams, certificates and reports belong to one organization. Call the routes of that organization.",[1240,4624,4625,4628],{},[1053,4626,4627],{},"Check which account you are using."," Records belong to the account that registered the student. A second account, even your own, cannot see them.",[1240,4630,4631,4634,4635,4637,4638,1268],{},[1053,4632,4633],{},"For the supervisor link",", make sure the student has followed a ",[1058,4636,3707],{"href":81}," into this organization at least once, then check the username with the supervisor. See ",[1058,4639,71],{"href":72},[1240,4641,4642,4645,4646,1421,4649,4652,4653,1268],{},[1053,4643,4644],{},"For downloads",", list the student's documents first (",[1058,4647,4648],{"href":264},"certificates",[1058,4650,4651],{"href":270},"reports",") and download only what the list returns. A document that hasn't been released yet, or a report that has been withdrawn, is neither listed nor served. See ",[1058,4654,92],{"href":93},[1046,4656,4657,4658,4660,4661,4663,4664,4666,4667,2111],{},"Don't retry a ",[1049,4659,2389],{}," unchanged: the same request gets the same answer. The one exception is a ",[1049,4662,254],{}," you retried after a timeout, where a ",[1049,4665,2389],{}," usually means your first attempt worked (see ",[1058,4668,4670],{"href":4669},"\u002Fapi\u002Fretries-and-idempotency#deleting-an-application","Retries and idempotency",[1273,4672,1275],{},{"title":1145,"searchDepth":1159,"depth":1169,"links":4674},[4675,4686],{"id":1043,"depth":1159,"text":1044,"children":4676},[4677,4678,4679,4680,4681,4682,4683,4684,4685],{"id":4182,"depth":1169,"text":4183},{"id":4216,"depth":1169,"text":4217},{"id":4267,"depth":1169,"text":4268},{"id":4300,"depth":1169,"text":4301},{"id":231,"depth":1169,"text":86},{"id":213,"depth":1169,"text":83},{"id":4407,"depth":1169,"text":92},{"id":4442,"depth":1169,"text":4443},{"id":4523,"depth":1169,"text":4524},{"id":1234,"depth":1159,"text":1235},{"code":945,"heading":945,"status":944,"retry":1034,"summary":4688,"message":4689,"body":4690},"A duplicate email, a student who hasn't signed in to the organization yet, an exam the student can't take, an application whose state blocks the change, or a group challenge step or group that can't be submitted yet.","The request conflicts with the current state of the resource.",{"type":1038,"value":4691,"toc":5515},[4692,4694,4702,4767,4771,4809,4812,4853,4856,4882,4886,4908,4914,4918,4931,5006,5012,5016,5019,5073,5076,5080,5097,5181,5278,5293,5297,5318,5320,5325,5492,5513],[1041,4693,1044],{"id":1043},[1046,4695,1289,4696,4698,4699,4701],{},[1049,4697,4403],{}," means your request is well-formed and allowed, but something about the current state of the data blocks it. Nothing was changed. Every ",[1049,4700,4403],{}," message names the state that blocked the request, so read it before deciding what to do.",[1140,4703,4705],{"className":1142,"code":4704,"language":1144,"meta":1145,"style":1145},"{\n  \"error\": {\n    \"code\": \"conflict\",\n    \"message\": \"Exam is not available for grade 11. It accepts grade 9, 10.\",\n    \"documentation_url\": \"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#conflict\",\n    \"request_id\": \"9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b\"\n  }\n}\n",[1049,4706,4707,4711,4717,4728,4739,4750,4759,4763],{"__ignoreMap":1145},[1149,4708,4709],{"class":1151,"line":1152},[1149,4710,1156],{"class":1155},[1149,4712,4713,4715],{"class":1151,"line":1159},[1149,4714,1163],{"class":1162},[1149,4716,1166],{"class":1155},[1149,4718,4719,4721,4723,4726],{"class":1151,"line":1169},[1149,4720,1172],{"class":1162},[1149,4722,1175],{"class":1155},[1149,4724,4725],{"class":1178},"\"conflict\"",[1149,4727,1182],{"class":1155},[1149,4729,4730,4732,4734,4737],{"class":1151,"line":1185},[1149,4731,1188],{"class":1162},[1149,4733,1175],{"class":1155},[1149,4735,4736],{"class":1178},"\"Exam is not available for grade 11. It accepts grade 9, 10.\"",[1149,4738,1182],{"class":1155},[1149,4740,4741,4743,4745,4748],{"class":1151,"line":1198},[1149,4742,1201],{"class":1162},[1149,4744,1175],{"class":1155},[1149,4746,4747],{"class":1178},"\"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#conflict\"",[1149,4749,1182],{"class":1155},[1149,4751,4752,4754,4756],{"class":1151,"line":1211},[1149,4753,1214],{"class":1162},[1149,4755,1175],{"class":1155},[1149,4757,4758],{"class":1178},"\"9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b\"\n",[1149,4760,4761],{"class":1151,"line":1222},[1149,4762,1225],{"class":1155},[1149,4764,4765],{"class":1151,"line":1228},[1149,4766,1231],{"class":1155},[1363,4768,4770],{"id":4769},"email-addresses","Email addresses",[1066,4772,4773,4783],{},[1069,4774,4775],{},[1072,4776,4777,4779,4781],{},[1075,4778,1077],{},[1075,4780,1080],{},[1075,4782,1083],{},[1085,4784,4785,4798],{},[1072,4786,4787,4792,4795],{},[1090,4788,4789],{},[1049,4790,4791],{},"A student with that email is already registered to this account (652f1c9b8e4b2a0012a3c4d5).",[1090,4793,4794],{},"register a student",[1090,4796,4797],{},"You have already registered a student with this address. The id in parentheses is theirs.",[1072,4799,4800,4804,4806],{},[1090,4801,4802],{},[1049,4803,967],{},[1090,4805,1097],{},[1090,4807,4808],{},"Another student already has this address. Email addresses are unique across the whole platform, and the API doesn't say whose it is. At registration this means another account holds it, or another registration of the same new address, sent at the same moment, finished first. On an update it can also be another of your own students.",[1363,4810,65],{"id":4811},"bulk-registration",[1066,4813,4814,4824],{},[1069,4815,4816],{},[1072,4817,4818,4820,4822],{},[1075,4819,1077],{},[1075,4821,1080],{},[1075,4823,1083],{},[1085,4825,4826],{},[1072,4827,4828,4832,4835],{},[1090,4829,4830],{},[1049,4831,994],{},[1090,4833,4834],{},"register many students at once",[1090,4836,4837,4838,4841,4842,4846,4847,4850,4851,1268],{},"One import per account runs at a time. The id in parentheses is the one that is running: read it with ",[1049,4839,4840],{},"getStudentImport",", and send the next batch when it has finished. Sending the ",[4843,4844,4845],"em",{},"same"," rows again is not a conflict — it answers ",[1049,4848,4849],{},"202"," with the import you already have. See ",[1058,4852,65],{"href":66},[1363,4854,68],{"id":4855},"passwords",[1066,4857,4858,4868],{},[1069,4859,4860],{},[1072,4861,4862,4864,4866],{},[1075,4863,1077],{},[1075,4865,1080],{},[1075,4867,1083],{},[1085,4869,4870],{},[1072,4871,4872,4876,4879],{},[1090,4873,4874],{},[1049,4875,988],{},[1090,4877,4878],{},"set a password",[1090,4880,4881],{},"Once a student has confirmed their address, the account is theirs. A password set over theirs would lock them out.",[1363,4883,4885],{"id":4884},"a-student-who-hasnt-signed-in-to-the-organization-yet","A student who hasn't signed in to the organization yet",[1066,4887,4888,4896],{},[1069,4889,4890],{},[1072,4891,4892,4894],{},[1075,4893,1077],{},[1075,4895,1080],{},[1085,4897,4898],{},[1072,4899,4900,4905],{},[1090,4901,4902],{},[1049,4903,4904],{},"Student has never signed in to stem, so stem holds no record for them. Generate a sign-in link first with POST \u002F:organizationId\u002Fauth\u002Fsignin.",[1090,4906,4907],{},"create an application, list a student's applications, list a student's certificates, list a student's reports",[1046,4909,4910,4911,4913],{},"Each organization keeps its own copy of a student, and the student's first sign-in to that organization creates it. A student you have only registered through the API has no copy yet, so there is nothing in that organization to attach an application to. (The exam picker works without a copy. Linking a supervisor answers ",[1049,4912,2389],{}," instead.)",[1363,4915,4917],{"id":4916},"exams-a-student-cant-take","Exams a student can't take",[1046,4919,4920,1537,4923,4926,4927,4930],{},[1049,4921,4922],{},"POST \u002Fv1\u002F{organizationId}\u002Fapplication",[1049,4924,4925],{},"PUT \u002Fv1\u002F{organizationId}\u002Fapplication\u002F{applicationId}"," only accept an exam that the ",[1058,4928,4929],{"href":226},"exam picker"," would offer this student. When it wouldn't, the message names the first rule that refused it:",[1066,4932,4933,4941],{},[1069,4934,4935],{},[1072,4936,4937,4939],{},[1075,4938,1077],{},[1075,4940,1083],{},[1085,4942,4943,4952,4965,4978,4987,4996],{},[1072,4944,4945,4949],{},[1090,4946,4947],{},[1049,4948,961],{},[1090,4950,4951],{},"Applications are closed, the sitting has passed, or the exam's category isn't active.",[1072,4953,4954,4959],{},[1090,4955,4956],{},[1049,4957,4958],{},"Exam is not available for grade 11. It accepts grade 9, 10.",[1090,4960,4961,4962],{},"The student's grade isn't one the exam accepts. An exam with no grades says ",[1049,4963,4964],{},"It accepts no grades.",[1072,4966,4967,4972],{},[1090,4968,4969],{},[1049,4970,4971],{},"Exam is not available in this student’s country. It is offered in Germany, Austria.",[1090,4973,4974,4975],{},"The exam is limited to certain countries, and the student's isn't one of them. If none of those countries can be named, the message ends ",[1049,4976,4977],{},"It is offered in no country this API can resolve.",[1072,4979,4980,4984],{},[1090,4981,4982],{},[1049,4983,955],{},[1090,4985,4986],{},"No student can pick this exam.",[1072,4988,4989,4993],{},[1090,4990,4991],{},[1049,4992,958],{},[1090,4994,4995],{},"The picker withholds it for another reason.",[1072,4997,4998,5003],{},[1090,4999,5000],{},[1049,5001,5002],{},"Student already has an application for Science on this sitting. Two exams in one category on one date cannot both be sat.",[1090,5004,5005],{},"The student already holds a different exam in the same category on the same sitting. Nobody can sit two papers at once.",[1046,5007,5008,5009,5011],{},"A student with no grade at all gets ",[1049,5010,1063],{}," instead, because the student record is incomplete.",[1363,5013,5015],{"id":5014},"moving-an-application","Moving an application",[1046,5017,5018],{},"Besides the exam rules above, a move is refused when:",[1066,5020,5021,5029],{},[1069,5022,5023],{},[1072,5024,5025,5027],{},[1075,5026,1077],{},[1075,5028,1083],{},[1085,5030,5031,5040,5050,5059],{},[1072,5032,5033,5037],{},[1090,5034,5035],{},[1049,5036,979],{},[1090,5038,5039],{},"The student has started or handed in the exam.",[1072,5041,5042,5047],{},[1090,5043,5044],{},[1049,5045,5046],{},"An application for Science cannot be moved to that category.",[1090,5048,5049],{},"The current exam's category doesn't accept the new exam's category as a replacement.",[1072,5051,5052,5056],{},[1090,5053,5054],{},[1049,5055,991],{},[1090,5057,5058],{},"The application is for an AI Challenge exam, and the student has already used some of their AI Challenge image quota. This applies whether or not the application has been paid for.",[1072,5060,5061,5066],{},[1090,5062,5063],{},[1049,5064,5065],{},"Application has been paid for at 25, and that exam costs 30. Moving it would change what the payment bought, and this API neither charges a difference nor refunds.",[1090,5067,5068,5069,5072],{},"The application has a settled payment, and the new exam has a different price. A paid application ",[1053,5070,5071],{},"can"," move to an exam with the same price.",[1046,5074,5075],{},"The checks run in this order: started, then the exam exists, then the exam rules, then the category replacement, then the sitting clash, then AI Challenge, then the price.",[1363,5077,5079],{"id":5078},"group-challenge-submits","Group challenge submits",[1046,5081,5082,1537,5087,5092,5093,5096],{},[1058,5083,5084],{"href":294},[1049,5085,5086],{},"submitGroupChallengeStep",[1058,5088,5089],{"href":291},[1049,5090,5091],{},"submitGroupChallengeWork"," say why they refused in ",[1049,5094,5095],{},"error.details.reason",". Branch on it, not on the message:",[1140,5098,5100],{"className":1142,"code":5099,"language":1144,"meta":1145,"style":1145},"{\n  \"error\": {\n    \"code\": \"conflict\",\n    \"message\": \"Nothing has been uploaded for this step yet. A member of the group uploads the work first.\",\n    \"documentation_url\": \"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#conflict\",\n    \"request_id\": \"3c2b1a0f-9e8d-4c7b-a6f5-e4d3c2b1a0f9\",\n    \"details\": { \"reason\": \"step_empty\" }\n  }\n}\n",[1049,5101,5102,5106,5112,5122,5133,5143,5154,5173,5177],{"__ignoreMap":1145},[1149,5103,5104],{"class":1151,"line":1152},[1149,5105,1156],{"class":1155},[1149,5107,5108,5110],{"class":1151,"line":1159},[1149,5109,1163],{"class":1162},[1149,5111,1166],{"class":1155},[1149,5113,5114,5116,5118,5120],{"class":1151,"line":1169},[1149,5115,1172],{"class":1162},[1149,5117,1175],{"class":1155},[1149,5119,4725],{"class":1178},[1149,5121,1182],{"class":1155},[1149,5123,5124,5126,5128,5131],{"class":1151,"line":1185},[1149,5125,1188],{"class":1162},[1149,5127,1175],{"class":1155},[1149,5129,5130],{"class":1178},"\"Nothing has been uploaded for this step yet. A member of the group uploads the work first.\"",[1149,5132,1182],{"class":1155},[1149,5134,5135,5137,5139,5141],{"class":1151,"line":1198},[1149,5136,1201],{"class":1162},[1149,5138,1175],{"class":1155},[1149,5140,4747],{"class":1178},[1149,5142,1182],{"class":1155},[1149,5144,5145,5147,5149,5152],{"class":1151,"line":1211},[1149,5146,1214],{"class":1162},[1149,5148,1175],{"class":1155},[1149,5150,5151],{"class":1178},"\"3c2b1a0f-9e8d-4c7b-a6f5-e4d3c2b1a0f9\"",[1149,5153,1182],{"class":1155},[1149,5155,5156,5159,5162,5165,5167,5170],{"class":1151,"line":1222},[1149,5157,5158],{"class":1162},"    \"details\"",[1149,5160,5161],{"class":1155},": { ",[1149,5163,5164],{"class":1162},"\"reason\"",[1149,5166,1175],{"class":1155},[1149,5168,5169],{"class":1178},"\"step_empty\"",[1149,5171,5172],{"class":1155}," }\n",[1149,5174,5175],{"class":1151,"line":1228},[1149,5176,1225],{"class":1155},[1149,5178,5179],{"class":1151,"line":2827},[1149,5180,1231],{"class":1155},[1066,5182,5183,5194],{},[1069,5184,5185],{},[1072,5186,5187,5192],{},[1075,5188,5189],{},[1049,5190,5191],{},"details.reason",[1075,5193,1083],{},[1085,5195,5196,5206,5226,5239,5249,5259],{},[1072,5197,5198,5203],{},[1090,5199,5200],{},[1049,5201,5202],{},"challenge_closed",[1090,5204,5205],{},"The organizers have closed the challenge.",[1072,5207,5208,5213],{},[1090,5209,5210],{},[1049,5211,5212],{},"window_closed",[1090,5214,5215,5216,5219,5220,1537,5223,1268],{},"Now is outside the challenge's dates; ",[1049,5217,5218],{},"details"," also carries ",[1049,5221,5222],{},"windowStart",[1049,5224,5225],{},"windowEnd",[1072,5227,5228,5236],{},[1090,5229,5230,1421,5233],{},[1049,5231,5232],{},"payment_pending",[1049,5234,5235],{},"group_not_confirmed",[1090,5237,5238],{},"The teacher has not confirmed the group yet, so it has no steps.",[1072,5240,5241,5246],{},[1090,5242,5243],{},[1049,5244,5245],{},"step_locked",[1090,5247,5248],{},"The step before this one is not submitted yet.",[1072,5250,5251,5256],{},[1090,5252,5253],{},[1049,5254,5255],{},"step_empty",[1090,5257,5258],{},"Nothing has been uploaded for the step.",[1072,5260,5261,5266],{},[1090,5262,5263],{},[1049,5264,5265],{},"steps_incomplete",[1090,5267,5268,5269,5271,5272,1537,5275,1268],{},"A step is not submitted yet; ",[1049,5270,5218],{}," counts ",[1049,5273,5274],{},"stepsSubmitted",[1049,5276,5277],{},"stepCount",[1046,5279,5280,5281,5284,5285,4558,5287,1889,5290,1268],{},"Submitting again something that was already submitted is ",[1053,5282,5283],{},"not"," a conflict: it answers ",[1049,5286,4557],{},[1049,5288,5289],{},"changed: false",[1058,5291,89],{"href":5292},"\u002Fapi\u002Fguides\u002Fgroup-challenges#submitting-for-your-student",[1363,5294,5296],{"id":5295},"deleting-an-application","Deleting an application",[1066,5298,5299,5307],{},[1069,5300,5301],{},[1072,5302,5303,5305],{},[1075,5304,1077],{},[1075,5306,1083],{},[1085,5308,5309],{},[1072,5310,5311,5315],{},[1090,5312,5313],{},[1049,5314,949],{},[1090,5316,5317],{},"A payment has been settled for this application. An application for a free exam counts as unpaid and can be deleted.",[1041,5319,1235],{"id":1234},[1046,5321,1289,5322,5324],{},[1049,5323,4403],{}," never goes away if you send the same request unchanged. Change the state or the request first.",[1066,5326,5327,5337],{},[1069,5328,5329],{},[1072,5330,5331,5334],{},[1075,5332,5333],{},"You got",[1075,5335,5336],{},"Do this",[1085,5338,5339,5359,5368,5378,5391,5409,5422,5430,5438,5446,5454,5462,5481],{},[1072,5340,5341,5347],{},[1090,5342,5343,5344],{},"Email already registered ",[1053,5345,5346],{},"to this account",[1090,5348,5349,5350,5355,5356,2111],{},"Don't register again. Use the id in the message: fetch the student with ",[1058,5351,5352],{"href":186},[1049,5353,5354],{},"GET \u002Fv1\u002Fstudent\u002F{studentId}",", or update them. After a timed-out registration, this is how you learn it worked (see ",[1058,5357,48],{"href":5358},"\u002Fapi\u002Fretries-and-idempotency#registering-a-student",[1072,5360,5361,5365],{},[1090,5362,5363],{},[1049,5364,967],{},[1090,5366,5367],{},"At registration, check first that you didn't send the same registration twice at once. If you didn't, the address belongs to another account and can't be used, so ask the student for another one. On an update, check whether one of your own students already has the address.",[1072,5369,5370,5373],{},[1090,5371,5372],{},"Student has confirmed their email",[1090,5374,5375,5376,1268],{},"Don't set a password. Send the student a ",[1058,5377,3707],{"href":81},[1072,5379,5380,5383],{},[1090,5381,5382],{},"Student never signed in to the organization",[1090,5384,5385,5386,5390],{},"Mint a sign-in link with ",[1058,5387,5388],{"href":211},[1049,5389,3405],{},", have the student follow it once, then retry.",[1072,5392,5393,5396],{},[1090,5394,5395],{},"Exam not open, or not for this student",[1090,5397,5398,5399,5404,5405,5408],{},"Pick an exam from ",[1058,5400,5401],{"href":226},[1049,5402,5403],{},"GET \u002Fv1\u002F{organizationId}\u002Fexam\u002Favailable\u002F{studentId}"," and post a leaf's ",[1049,5406,5407],{},"matchedExam._id",". Every exam that list returns passes these rules.",[1072,5410,5411,5414],{},[1090,5412,5413],{},"Wrong grade or country",[1090,5415,5416,5417,5421],{},"If the student's record is wrong, correct it with ",[1058,5418,5419],{"href":202},[1049,5420,3723],{},", then check the picker again.",[1072,5423,5424,5427],{},[1090,5425,5426],{},"Category clash on a sitting",[1090,5428,5429],{},"Move the existing application instead of creating a second one, or choose another sitting.",[1072,5431,5432,5435],{},[1090,5433,5434],{},"Started exam, AI Challenge",[1090,5436,5437],{},"The application can't be moved.",[1072,5439,5440,5443],{},[1090,5441,5442],{},"Category replacement refused",[1090,5444,5445],{},"Moves from this category to that one aren't allowed. Choose an exam in a category the current one accepts.",[1072,5447,5448,5451],{},[1090,5449,5450],{},"Different price on a paid application",[1090,5452,5453],{},"Choose an exam with the same price, or contact the organization about a refund. The API cannot charge or refund.",[1072,5455,5456,5459],{},[1090,5457,5458],{},"Paid application can't be deleted",[1090,5460,5461],{},"The API cannot refund. Contact the organization.",[1072,5463,5464,5471],{},[1090,5465,5466,5467,1762,5469],{},"A group challenge submit, ",[1049,5468,5255],{},[1049,5470,5265],{},[1090,5472,5473,5474,1421,5477,5480],{},"Wait for the group's members to upload and submit their work in the panel or the app; read the group (",[1049,5475,5476],{},"canSubmit",[1049,5478,5479],{},"canFinalSubmit",") before trying again. Don't retry in a loop.",[1072,5482,5483,5489],{},[1090,5484,5485,5486],{},"A group challenge submit, any other ",[1049,5487,5488],{},"reason",[1090,5490,5491],{},"The challenge or the group is not ready, or no longer takes work. Nothing you send changes that.",[1046,5493,5494,5499,5500,5503,5504,5506,5507,5510,5511,1268],{},[1053,5495,1289,5496,5498],{},[1049,5497,4403],{}," on a retried create may mean the create worked."," If a ",[1049,5501,5502],{},"POST \u002Fapplication"," timed out and the retry answers ",[1049,5505,4403],{}," because the exam has since closed, the first attempt may still have created the application. Check the student's applications before you give up. See ",[1058,5508,4670],{"href":5509},"\u002Fapi\u002Fretries-and-idempotency#creating-an-application",". The full application rules are in ",[1058,5512,86],{"href":87},[1273,5514,1275],{},{"title":1145,"searchDepth":1159,"depth":1169,"links":5516},[5517,5527],{"id":1043,"depth":1159,"text":1044,"children":5518},[5519,5520,5521,5522,5523,5524,5525,5526],{"id":4769,"depth":1169,"text":4770},{"id":4811,"depth":1169,"text":65},{"id":4855,"depth":1169,"text":68},{"id":4884,"depth":1169,"text":4885},{"id":4916,"depth":1169,"text":4917},{"id":5014,"depth":1169,"text":5015},{"id":5078,"depth":1169,"text":5079},{"id":5295,"depth":1169,"text":5296},{"id":1234,"depth":1159,"text":1235},{"code":998,"heading":998,"status":997,"retry":1034,"summary":5529,"message":5530,"body":5531},"The request body is over the limit: 100 kB, or 1.5 MB on createStudentImport, which takes a list of students.","The request body is larger than the API accepts.",{"type":1038,"value":5532,"toc":5720},[5533,5535,5552,5588,5653,5660,5678,5687,5693,5695,5714,5717],[1041,5534,1044],{"id":1043},[1046,5536,5537,5538,5541,5542,5547,5548,5551],{},"The API accepts JSON request bodies up to ",[1053,5539,5540],{},"100 kB"," (102,400 bytes), with one exception:\n",[1058,5543,5544],{"href":180},[1049,5545,5546],{},"createStudentImport"," takes up to ",[1053,5549,5550],{},"1.5 MB",", because a\nlist of 1000 students does not fit in 100 kB. A larger body is refused before anything else\nhappens, before your token is even checked:",[1140,5553,5555],{"className":2271,"code":5554,"language":2273,"meta":1145,"style":1145},"HTTP\u002F1.1 413 Payload Too Large\nContent-Type: application\u002Fjson; charset=utf-8\nX-Request-Id: 4f3e2d1c-0b9a-4876-a543-210fedcba987\n",[1049,5556,5557,5571,5579],{"__ignoreMap":1145},[1149,5558,5559,5561,5563,5565,5568],{"class":1151,"line":1152},[1149,5560,2281],{"class":2280},[1149,5562,2284],{"class":1155},[1149,5564,2288],{"class":2287},[1149,5566,5567],{"class":2287}," 413",[1149,5569,5570],{"class":1178}," Payload Too Large\n",[1149,5572,5573,5575,5577],{"class":1151,"line":1159},[1149,5574,2119],{"class":1162},[1149,5576,2301],{"class":2280},[1149,5578,2304],{"class":1178},[1149,5580,5581,5583,5585],{"class":1151,"line":1169},[1149,5582,2309],{"class":1162},[1149,5584,2301],{"class":2280},[1149,5586,5587],{"class":1178}," 4f3e2d1c-0b9a-4876-a543-210fedcba987\n",[1140,5589,5591],{"className":1142,"code":5590,"language":1144,"meta":1145,"style":1145},"{\n  \"error\": {\n    \"code\": \"payload_too_large\",\n    \"message\": \"request entity too large\",\n    \"documentation_url\": \"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#payload_too_large\",\n    \"request_id\": \"4f3e2d1c-0b9a-4876-a543-210fedcba987\"\n  }\n}\n",[1049,5592,5593,5597,5603,5614,5625,5636,5645,5649],{"__ignoreMap":1145},[1149,5594,5595],{"class":1151,"line":1152},[1149,5596,1156],{"class":1155},[1149,5598,5599,5601],{"class":1151,"line":1159},[1149,5600,1163],{"class":1162},[1149,5602,1166],{"class":1155},[1149,5604,5605,5607,5609,5612],{"class":1151,"line":1169},[1149,5606,1172],{"class":1162},[1149,5608,1175],{"class":1155},[1149,5610,5611],{"class":1178},"\"payload_too_large\"",[1149,5613,1182],{"class":1155},[1149,5615,5616,5618,5620,5623],{"class":1151,"line":1185},[1149,5617,1188],{"class":1162},[1149,5619,1175],{"class":1155},[1149,5621,5622],{"class":1178},"\"request entity too large\"",[1149,5624,1182],{"class":1155},[1149,5626,5627,5629,5631,5634],{"class":1151,"line":1198},[1149,5628,1201],{"class":1162},[1149,5630,1175],{"class":1155},[1149,5632,5633],{"class":1178},"\"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#payload_too_large\"",[1149,5635,1182],{"class":1155},[1149,5637,5638,5640,5642],{"class":1151,"line":1211},[1149,5639,1214],{"class":1162},[1149,5641,1175],{"class":1155},[1149,5643,5644],{"class":1178},"\"4f3e2d1c-0b9a-4876-a543-210fedcba987\"\n",[1149,5646,5647],{"class":1151,"line":1222},[1149,5648,1225],{"class":1155},[1149,5650,5651],{"class":1151,"line":1228},[1149,5652,1231],{"class":1155},[1046,5654,5655,5656,5659],{},"No operation but the import needs anything near 100 kB. The largest body the rest of the API takes\nis one student registration, a dozen short fields. A ",[1049,5657,5658],{},"413"," almost always means the body contains\nsomething it shouldn't:",[1237,5661,5662,5665,5668,5675],{},[1240,5663,5664],{},"a whole record, or several, copied out of your own system;",[1240,5666,5667],{},"a file or an image encoded as base64 (no operation accepts files);",[1240,5669,5670,5671,5674],{},"a list of students sent to an operation that handles one student at a time — see ",[1058,5672,5673],{"href":66},"Bulk\nregistration"," for the one that takes a list;",[1240,5676,5677],{},"a bug that repeats or nests data.",[1046,5679,5680,5681,5683,5684,5686],{},"A realistic import row is 250 to 450 bytes, so 1000 of them is about 0.45 MB: a ",[1049,5682,5658],{}," on\n",[1049,5685,5546],{}," means something other than the students is in the body.",[1046,5688,5689,5690,5692],{},"Because the body is refused before authentication, a ",[1049,5691,5658],{}," tells you nothing about your token or permissions, and nothing was read or written.",[1041,5694,1235],{"id":1234},[1237,5696,5697,5705,5711],{},[1240,5698,5699,5700,5704],{},"Send only the documented fields for the operation. A body with extra fields would be refused with ",[1058,5701,5702],{"href":1060},[1049,5703,1063],{}," even if it were small.",[1240,5706,5707,5708,5710],{},"Send one request per student, application or change. There are no bulk operations. See ",[1058,5709,45],{"href":46}," for how to pace a batch.",[1240,5712,5713],{},"Log the size of the body you are about to send, and look for the field that makes it large.",[1046,5715,5716],{},"Sending the same body again always gets the same answer.",[1273,5718,5719],{},"html pre.shiki code .sHUrx, html code.shiki .sHUrx{--shiki-default:#A0111F;--shiki-dark:#FF9492}html pre.shiki code .suds8, html code.shiki .suds8{--shiki-default:#0E1116;--shiki-dark:#F0F3F6}html pre.shiki code .s-5SL, html code.shiki .s-5SL{--shiki-default:#023B95;--shiki-dark:#91CBFF}html pre.shiki code .sT6z2, html code.shiki .sT6z2{--shiki-default:#032563;--shiki-dark:#ADDCFF}html pre.shiki code .sne4z, html code.shiki .sne4z{--shiki-default:#024C1A;--shiki-dark:#72F088}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":1145,"searchDepth":1159,"depth":1169,"links":5721},[5722,5723],{"id":1043,"depth":1159,"text":1044},{"id":1234,"depth":1159,"text":1235},{"code":1003,"heading":1003,"status":1002,"retry":1034,"summary":5725,"message":5726,"body":5727},"The request body's charset isn't UTF-8, or its Content-Encoding isn't gzip, deflate or br.","The request body is in a character set or encoding the API does not read.",{"type":1038,"value":5728,"toc":6001},[5729,5731,5742,5817,5878,5881,5885,5908,5910,5944,5995,5998],[1041,5730,1044],{"id":1043},[1046,5732,5733,5734,1421,5737,1762,5739,5741],{},"The API reads JSON bodies in UTF-8. You can send them uncompressed, or compressed with ",[1049,5735,5736],{},"gzip",[1049,5738,2061],{},[1049,5740,2064],{},". A body it can't decode is refused before your token is checked:",[1140,5743,5745],{"className":1142,"code":5744,"language":1144,"meta":1145,"style":1145},"{\n  \"error\": {\n    \"code\": \"unsupported_media_type\",\n    \"message\": \"unsupported charset \\\"ISO-8859-1\\\"\",\n    \"documentation_url\": \"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#unsupported_media_type\",\n    \"request_id\": \"8b7a6c5d-4e3f-4a2b-9c1d-0e9f8a7b6c5d\"\n  }\n}\n",[1049,5746,5747,5751,5757,5768,5789,5800,5809,5813],{"__ignoreMap":1145},[1149,5748,5749],{"class":1151,"line":1152},[1149,5750,1156],{"class":1155},[1149,5752,5753,5755],{"class":1151,"line":1159},[1149,5754,1163],{"class":1162},[1149,5756,1166],{"class":1155},[1149,5758,5759,5761,5763,5766],{"class":1151,"line":1169},[1149,5760,1172],{"class":1162},[1149,5762,1175],{"class":1155},[1149,5764,5765],{"class":1178},"\"unsupported_media_type\"",[1149,5767,1182],{"class":1155},[1149,5769,5770,5772,5774,5777,5780,5783,5785,5787],{"class":1151,"line":1185},[1149,5771,1188],{"class":1162},[1149,5773,1175],{"class":1155},[1149,5775,5776],{"class":1178},"\"unsupported charset ",[1149,5778,5779],{"class":2280},"\\\"",[1149,5781,5782],{"class":1178},"ISO-8859-1",[1149,5784,5779],{"class":2280},[1149,5786,3776],{"class":1178},[1149,5788,1182],{"class":1155},[1149,5790,5791,5793,5795,5798],{"class":1151,"line":1198},[1149,5792,1201],{"class":1162},[1149,5794,1175],{"class":1155},[1149,5796,5797],{"class":1178},"\"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#unsupported_media_type\"",[1149,5799,1182],{"class":1155},[1149,5801,5802,5804,5806],{"class":1151,"line":1211},[1149,5803,1214],{"class":1162},[1149,5805,1175],{"class":1155},[1149,5807,5808],{"class":1178},"\"8b7a6c5d-4e3f-4a2b-9c1d-0e9f8a7b6c5d\"\n",[1149,5810,5811],{"class":1151,"line":1222},[1149,5812,1225],{"class":1155},[1149,5814,5815],{"class":1151,"line":1228},[1149,5816,1231],{"class":1155},[1066,5818,5819,5827],{},[1069,5820,5821],{},[1072,5822,5823,5825],{},[1075,5824,1077],{},[1075,5826,1083],{},[1085,5828,5829,5858],{},[1072,5830,5831,5835],{},[1090,5832,5833],{},[1049,5834,1004],{},[1090,5836,5837,5838,5840,5841,1762,5844,5847,5848,1175,5851,5854,5855,1268],{},"The ",[1049,5839,2119],{}," header names a charset the API doesn't read, for example ",[1049,5842,5843],{},"application\u002Fjson; charset=iso-8859-1",[1049,5845,5846],{},"windows-1252",". The charset name must start with ",[1049,5849,5850],{},"utf-",[1049,5852,5853],{},"charset=utf8",", without the hyphen, is refused as ",[1049,5856,5857],{},"unsupported charset \"UTF8\"",[1072,5859,5860,5865],{},[1090,5861,5862],{},[1049,5863,5864],{},"unsupported content encoding \"zstd\"",[1090,5866,5837,5867,5870,5871,1421,5873,1537,5875,5877],{},[1049,5868,5869],{},"Content-Encoding"," header names a compression the API doesn't read. Only ",[1049,5872,5736],{},[1049,5874,2061],{},[1049,5876,2064],{}," are accepted, or no encoding at all.",[1046,5879,5880],{},"Nothing was read or written.",[1363,5882,5884],{"id":5883},"not-a-415","Not a 415",[1046,5886,5887,5888,2120,5891,1762,5893,5896,5897,5900,5901,5904,5905,5907],{},"A body sent with a ",[1053,5889,5890],{},"different content type",[1049,5892,2123],{},[1049,5894,5895],{},"application\u002Fx-www-form-urlencoded",", is not refused with ",[1049,5898,5899],{},"415",". The API doesn't read it at all, and you get the validation errors of an empty body instead, such as ",[1049,5902,5903],{},"400 studentId must be a mongodb id",". If every field seems to be \"missing\", check your ",[1049,5906,2119],{}," first.",[1041,5909,1235],{"id":1234},[1237,5911,5912,5925,5938],{},[1240,5913,2211,5914,5916,5917,5920,5921,5924],{},[1049,5915,2130],{},". Adding ",[1049,5918,5919],{},"; charset=utf-8"," is optional. If you add it, spell it ",[1049,5922,5923],{},"utf-8"," with the hyphen.",[1240,5926,5927,5928,5931,5932,5934,5935,1268],{},"Encode the body as UTF-8. Most JSON libraries do this by default. In PHP, make sure your strings are UTF-8 before calling ",[1049,5929,5930],{},"json_encode",". It fails on invalid UTF-8 and returns ",[1049,5933,3916],{},", so use ",[1049,5936,5937],{},"JSON_THROW_ON_ERROR",[1240,5939,5940,5941,5943],{},"Leave the body uncompressed, or use ",[1049,5942,5736],{},". Bodies are small, so compression gains little.",[1140,5945,5947],{"className":3735,"code":5946,"language":3737,"meta":1145,"style":1145},"curl -X POST \"https:\u002F\u002Fapi.main-team.org\u002Fv1\u002F$ORGANIZATION_ID\u002Fauth\u002Fsignin\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson; charset=utf-8\" \\\n  -d '{\"studentId\":\"652f1c9b8e4b2a0012a3c4d5\",\"redirect\":\"\u002Fdashboard\"}'\n",[1049,5948,5949,5967,5979,5988],{"__ignoreMap":1145},[1149,5950,5951,5953,5955,5958,5960,5962,5965],{"class":1151,"line":1152},[1149,5952,3745],{"class":3744},[1149,5954,3748],{"class":2287},[1149,5956,5957],{"class":1178}," POST",[1149,5959,3754],{"class":1178},[1149,5961,3731],{"class":1155},[1149,5963,5964],{"class":1178},"\u002Fauth\u002Fsignin\"",[1149,5966,3762],{"class":2280},[1149,5968,5969,5971,5973,5975,5977],{"class":1151,"line":1159},[1149,5970,3767],{"class":2287},[1149,5972,3770],{"class":1178},[1149,5974,3773],{"class":1155},[1149,5976,3776],{"class":1178},[1149,5978,3762],{"class":2280},[1149,5980,5981,5983,5986],{"class":1151,"line":1169},[1149,5982,3767],{"class":2287},[1149,5984,5985],{"class":1178}," \"Content-Type: application\u002Fjson; charset=utf-8\"",[1149,5987,3762],{"class":2280},[1149,5989,5990,5992],{"class":1151,"line":1185},[1149,5991,3792],{"class":2287},[1149,5993,5994],{"class":1178}," '{\"studentId\":\"652f1c9b8e4b2a0012a3c4d5\",\"redirect\":\"\u002Fdashboard\"}'\n",[1046,5996,5997],{},"Sending the same request again always gets the same answer.",[1273,5999,6000],{},"html pre.shiki code .suds8, html code.shiki .suds8{--shiki-default:#0E1116;--shiki-dark:#F0F3F6}html pre.shiki code .sne4z, html code.shiki .sne4z{--shiki-default:#024C1A;--shiki-dark:#72F088}html pre.shiki code .sT6z2, html code.shiki .sT6z2{--shiki-default:#032563;--shiki-dark:#ADDCFF}html pre.shiki code .sHUrx, html code.shiki .sHUrx{--shiki-default:#A0111F;--shiki-dark:#FF9492}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .soyes, html code.shiki .soyes{--shiki-default:#702C00;--shiki-dark:#FFB757}html pre.shiki code .s-5SL, html code.shiki .s-5SL{--shiki-default:#023B95;--shiki-dark:#91CBFF}",{"title":1145,"searchDepth":1159,"depth":1169,"links":6002},[6003,6006],{"id":1043,"depth":1159,"text":1044,"children":6004},[6005],{"id":5883,"depth":1169,"text":5884},{"id":1234,"depth":1159,"text":1235},{"code":1008,"heading":1008,"status":1007,"retry":1034,"summary":6008,"message":6009,"body":6010},"One or more rows of a bulk student import cannot be registered. Nothing was queued; error.details.rows names every row at fault.","The request was well-formed but could not be processed.",{"type":1038,"value":6011,"toc":6426},[6012,6014,6028,6034,6303,6338,6341,6377,6379,6423],[1041,6013,1044],{"id":1043},[1046,6015,6016,6017,1175,6020,6024,6025],{},"One operation answers ",[1049,6018,6019],{},"422",[1058,6021,6022],{"href":180},[1049,6023,5546],{},", when\nthe batch is well-formed but one or more of its rows cannot be registered. ",[1053,6026,6027],{},"Nothing was queued and\nnothing was registered.",[1046,6029,6030,6031,2301],{},"It is the one refusal on this API that cannot be one sentence, so it carries ",[1049,6032,6033],{},"error.details",[1140,6035,6037],{"className":1142,"code":6036,"language":1144,"meta":1145,"style":1145},"{\n  \"error\": {\n    \"code\": \"unprocessable_entity\",\n    \"message\": \"3 of 250 rows cannot be registered. Nothing was registered and no import was queued; error.details.rows lists every problem.\",\n    \"documentation_url\": \"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#unprocessable_entity\",\n    \"request_id\": \"e1d2c3b4-a5f6-4e7d-8c9b-0a1f2e3d4c5b\",\n    \"details\": {\n      \"total\": 250,\n      \"rejected\": 3,\n      \"truncated\": false,\n      \"rows\": [\n        { \"row\": 4, \"field\": \"birth\", \"code\": \"invalid_field\", \"message\": \"birth must be a real date in DD\u002FMM\u002FYYYY format\" },\n        { \"row\": 17, \"field\": \"email\", \"code\": \"email_taken_by_your_student\", \"message\": \"One of your students already has this email address.\", \"studentId\": \"652f1c9b8e4b2a0012a3c4d5\" },\n        { \"row\": 31, \"field\": \"email\", \"code\": \"duplicate_in_request\", \"message\": \"Row 12 has the same email address.\", \"duplicateOf\": 12 }\n      ]\n    }\n  }\n}\n",[1049,6038,6039,6043,6049,6060,6071,6082,6093,6099,6111,6123,6134,6142,6188,6237,6285,6290,6295,6299],{"__ignoreMap":1145},[1149,6040,6041],{"class":1151,"line":1152},[1149,6042,1156],{"class":1155},[1149,6044,6045,6047],{"class":1151,"line":1159},[1149,6046,1163],{"class":1162},[1149,6048,1166],{"class":1155},[1149,6050,6051,6053,6055,6058],{"class":1151,"line":1169},[1149,6052,1172],{"class":1162},[1149,6054,1175],{"class":1155},[1149,6056,6057],{"class":1178},"\"unprocessable_entity\"",[1149,6059,1182],{"class":1155},[1149,6061,6062,6064,6066,6069],{"class":1151,"line":1185},[1149,6063,1188],{"class":1162},[1149,6065,1175],{"class":1155},[1149,6067,6068],{"class":1178},"\"3 of 250 rows cannot be registered. Nothing was registered and no import was queued; error.details.rows lists every problem.\"",[1149,6070,1182],{"class":1155},[1149,6072,6073,6075,6077,6080],{"class":1151,"line":1198},[1149,6074,1201],{"class":1162},[1149,6076,1175],{"class":1155},[1149,6078,6079],{"class":1178},"\"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#unprocessable_entity\"",[1149,6081,1182],{"class":1155},[1149,6083,6084,6086,6088,6091],{"class":1151,"line":1211},[1149,6085,1214],{"class":1162},[1149,6087,1175],{"class":1155},[1149,6089,6090],{"class":1178},"\"e1d2c3b4-a5f6-4e7d-8c9b-0a1f2e3d4c5b\"",[1149,6092,1182],{"class":1155},[1149,6094,6095,6097],{"class":1151,"line":1222},[1149,6096,5158],{"class":1162},[1149,6098,1166],{"class":1155},[1149,6100,6101,6104,6106,6109],{"class":1151,"line":1228},[1149,6102,6103],{"class":1162},"      \"total\"",[1149,6105,1175],{"class":1155},[1149,6107,6108],{"class":2287},"250",[1149,6110,1182],{"class":1155},[1149,6112,6113,6116,6118,6121],{"class":1151,"line":2827},[1149,6114,6115],{"class":1162},"      \"rejected\"",[1149,6117,1175],{"class":1155},[1149,6119,6120],{"class":2287},"3",[1149,6122,1182],{"class":1155},[1149,6124,6125,6128,6130,6132],{"class":1151,"line":2841},[1149,6126,6127],{"class":1162},"      \"truncated\"",[1149,6129,1175],{"class":1155},[1149,6131,3916],{"class":2287},[1149,6133,1182],{"class":1155},[1149,6135,6136,6139],{"class":1151,"line":2856},[1149,6137,6138],{"class":1162},"      \"rows\"",[1149,6140,6141],{"class":1155},": [\n",[1149,6143,6144,6147,6150,6152,6155,6157,6160,6162,6165,6167,6170,6172,6175,6177,6180,6182,6185],{"class":1151,"line":2870},[1149,6145,6146],{"class":1155},"        { ",[1149,6148,6149],{"class":1162},"\"row\"",[1149,6151,1175],{"class":1155},[1149,6153,6154],{"class":2287},"4",[1149,6156,1421],{"class":1155},[1149,6158,6159],{"class":1162},"\"field\"",[1149,6161,1175],{"class":1155},[1149,6163,6164],{"class":1178},"\"birth\"",[1149,6166,1421],{"class":1155},[1149,6168,6169],{"class":1162},"\"code\"",[1149,6171,1175],{"class":1155},[1149,6173,6174],{"class":1178},"\"invalid_field\"",[1149,6176,1421],{"class":1155},[1149,6178,6179],{"class":1162},"\"message\"",[1149,6181,1175],{"class":1155},[1149,6183,6184],{"class":1178},"\"birth must be a real date in DD\u002FMM\u002FYYYY format\"",[1149,6186,6187],{"class":1155}," },\n",[1149,6189,6190,6192,6194,6196,6199,6201,6203,6205,6208,6210,6212,6214,6217,6219,6221,6223,6226,6228,6231,6233,6235],{"class":1151,"line":2883},[1149,6191,6146],{"class":1155},[1149,6193,6149],{"class":1162},[1149,6195,1175],{"class":1155},[1149,6197,6198],{"class":2287},"17",[1149,6200,1421],{"class":1155},[1149,6202,6159],{"class":1162},[1149,6204,1175],{"class":1155},[1149,6206,6207],{"class":1178},"\"email\"",[1149,6209,1421],{"class":1155},[1149,6211,6169],{"class":1162},[1149,6213,1175],{"class":1155},[1149,6215,6216],{"class":1178},"\"email_taken_by_your_student\"",[1149,6218,1421],{"class":1155},[1149,6220,6179],{"class":1162},[1149,6222,1175],{"class":1155},[1149,6224,6225],{"class":1178},"\"One of your students already has this email address.\"",[1149,6227,1421],{"class":1155},[1149,6229,6230],{"class":1162},"\"studentId\"",[1149,6232,1175],{"class":1155},[1149,6234,3844],{"class":1178},[1149,6236,6187],{"class":1155},[1149,6238,6239,6241,6243,6245,6248,6250,6252,6254,6256,6258,6260,6262,6265,6267,6269,6271,6274,6276,6279,6281,6283],{"class":1151,"line":3146},[1149,6240,6146],{"class":1155},[1149,6242,6149],{"class":1162},[1149,6244,1175],{"class":1155},[1149,6246,6247],{"class":2287},"31",[1149,6249,1421],{"class":1155},[1149,6251,6159],{"class":1162},[1149,6253,1175],{"class":1155},[1149,6255,6207],{"class":1178},[1149,6257,1421],{"class":1155},[1149,6259,6169],{"class":1162},[1149,6261,1175],{"class":1155},[1149,6263,6264],{"class":1178},"\"duplicate_in_request\"",[1149,6266,1421],{"class":1155},[1149,6268,6179],{"class":1162},[1149,6270,1175],{"class":1155},[1149,6272,6273],{"class":1178},"\"Row 12 has the same email address.\"",[1149,6275,1421],{"class":1155},[1149,6277,6278],{"class":1162},"\"duplicateOf\"",[1149,6280,1175],{"class":1155},[1149,6282,1888],{"class":2287},[1149,6284,5172],{"class":1155},[1149,6286,6287],{"class":1151,"line":3957},[1149,6288,6289],{"class":1155},"      ]\n",[1149,6291,6292],{"class":1151,"line":3970},[1149,6293,6294],{"class":1155},"    }\n",[1149,6296,6297],{"class":1151,"line":3983},[1149,6298,1225],{"class":1155},[1149,6300,6301],{"class":1151,"line":3996},[1149,6302,1231],{"class":1155},[1046,6304,6305,6308,6309,6311,6312,6314,6315,1421,6318,1421,6321,1421,6324,1182,6327,1537,6330,6333,6334,6337],{},[1049,6306,6307],{},"row"," counts from 0, so it is the index in the ",[1049,6310,167],{}," array you sent. Each row's ",[1049,6313,1049],{}," is one\nof ",[1049,6316,6317],{},"invalid_field",[1049,6319,6320],{},"unexpected_field",[1049,6322,6323],{},"unknown_reference",[1049,6325,6326],{},"duplicate_in_request",[1049,6328,6329],{},"email_taken_by_your_student",[1049,6331,6332],{},"email_unavailable","; ",[1058,6335,5673],{"href":6336},"\u002Fapi\u002Fguides\u002Fbulk-registration#when-a-batch-is-refused"," explains each of them.",[1046,6339,6340],{},"The other kinds of problem are reported with other codes, as they always were:",[1066,6342,6343,6353],{},[1069,6344,6345],{},[1072,6346,6347,6350],{},[1075,6348,6349],{},"The problem",[1075,6351,6352],{},"What you get",[1085,6354,6355,6366],{},[1072,6356,6357,6360],{},[1090,6358,6359],{},"A value in the request is invalid: wrong format, unknown field, reference data that doesn't exist, a student without a grade",[1090,6361,6362],{},[1058,6363,6364],{"href":1060},[1049,6365,1063],{},[1072,6367,6368,6371],{},[1090,6369,6370],{},"The request is valid, but the current state of a record blocks it: a duplicate email on a single registration, a closed exam, a paid application",[1090,6372,6373],{},[1058,6374,6375],{"href":1260},[1049,6376,1263],{},[1041,6378,1235],{"id":1234},[1237,6380,6381,6388,6391,6405,6413],{},[1240,6382,6383,6384,6387],{},"Read ",[1049,6385,6386],{},"error.details.rows",", fix every row it names, and send the whole batch again. One round trip\ntells you everything; there is nothing to undo, because nothing was registered.",[1240,6389,6390],{},"Don't retry it unchanged: the same rows will be refused the same way.",[1240,6392,6393,6396,6397,6400,6401,6404],{},[1049,6394,6395],{},"truncated: true"," means ",[1049,6398,6399],{},"rows"," is shorter than ",[1049,6402,6403],{},"rejected",". Fix what is listed and send it again to\nsee the rest.",[1240,6406,6407,6409,6410,6412],{},[1049,6408,6399],{}," can be empty with ",[1049,6411,6403],{}," counted, when the only problem is addresses that cannot be\nregistered and your account has already been shown those rows several times that day.",[1240,6414,6415,6416,6419,6420,6422],{},"Keep a default branch for unknown error codes in your client, keyed on the status class (see\n",[1058,6417,54],{"href":6418},"\u002Fapi\u002Fversioning#build-a-tolerant-client","), and ignore a ",[1049,6421,5218],{}," you do not\nrecognise.",[1273,6424,6425],{},"html pre.shiki code .suds8, html code.shiki .suds8{--shiki-default:#0E1116;--shiki-dark:#F0F3F6}html pre.shiki code .sne4z, html code.shiki .sne4z{--shiki-default:#024C1A;--shiki-dark:#72F088}html pre.shiki code .sT6z2, html code.shiki .sT6z2{--shiki-default:#032563;--shiki-dark:#ADDCFF}html pre.shiki code .s-5SL, html code.shiki .s-5SL{--shiki-default:#023B95;--shiki-dark:#91CBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":1145,"searchDepth":1159,"depth":1169,"links":6427},[6428,6429],{"id":1043,"depth":1159,"text":1044},{"id":1234,"depth":1159,"text":1235},{"code":6431,"heading":6431,"status":6432,"retry":6433,"summary":6434,"message":6435,"body":6436},"too_many_requests",429,"after-retry-after","Your account used up this operation's budget: 100 requests per 60 seconds, or 10 an hour on createStudentImport. Wait Retry-After.","Too many requests to this operation. Wait the number of seconds in Retry-After, then try again.",{"type":1038,"value":6437,"toc":7190},[6438,6440,6447,6466,6512,6577,6583,6586,6625,6628,6650,6668,6672,6681,6684,6733,6793,6795,6848,7011,7178,7187],[1041,6439,1044],{"id":1043},[1046,6441,6442,6443,6446],{},"Each API account may make ",[1053,6444,6445],{},"100 requests per 60 seconds to each operation",". The 101st request to an operation within one window is refused.",[1046,6448,6449,6450,6454,6455,6458,6459,6462,6463,1268],{},"One operation has a budget of its own:\n",[1058,6451,6452],{"href":180},[1049,6453,5546],{}," takes ",[1053,6456,6457],{},"10 requests an hour",", because\none request to it registers up to 1000 students. Its ",[1049,6460,6461],{},"429"," reads the same way; only the numbers\ndiffer. See ",[1058,6464,65],{"href":6465},"\u002Fapi\u002Fguides\u002Fbulk-registration#limits",[1140,6467,6469],{"className":2271,"code":6468,"language":2273,"meta":1145,"style":1145},"HTTP\u002F1.1 429 Too Many Requests\nRetry-After: 60\nContent-Type: application\u002Fjson; charset=utf-8\nX-Request-Id: 2c3d4e5f-6a7b-4c8d-9e0f-1a2b3c4d5e6f\n",[1049,6470,6471,6485,6495,6503],{"__ignoreMap":1145},[1149,6472,6473,6475,6477,6479,6482],{"class":1151,"line":1152},[1149,6474,2281],{"class":2280},[1149,6476,2284],{"class":1155},[1149,6478,2288],{"class":2287},[1149,6480,6481],{"class":2287}," 429",[1149,6483,6484],{"class":1178}," Too Many Requests\n",[1149,6486,6487,6490,6492],{"class":1151,"line":1159},[1149,6488,6489],{"class":1162},"Retry-After",[1149,6491,2301],{"class":2280},[1149,6493,6494],{"class":1178}," 60\n",[1149,6496,6497,6499,6501],{"class":1151,"line":1169},[1149,6498,2119],{"class":1162},[1149,6500,2301],{"class":2280},[1149,6502,2304],{"class":1178},[1149,6504,6505,6507,6509],{"class":1151,"line":1185},[1149,6506,2309],{"class":1162},[1149,6508,2301],{"class":2280},[1149,6510,6511],{"class":1178}," 2c3d4e5f-6a7b-4c8d-9e0f-1a2b3c4d5e6f\n",[1140,6513,6515],{"className":1142,"code":6514,"language":1144,"meta":1145,"style":1145},"{\n  \"error\": {\n    \"code\": \"too_many_requests\",\n    \"message\": \"Too many requests to this operation. Wait the number of seconds in Retry-After, then try again.\",\n    \"documentation_url\": \"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#too_many_requests\",\n    \"request_id\": \"2c3d4e5f-6a7b-4c8d-9e0f-1a2b3c4d5e6f\"\n  }\n}\n",[1049,6516,6517,6521,6527,6538,6549,6560,6569,6573],{"__ignoreMap":1145},[1149,6518,6519],{"class":1151,"line":1152},[1149,6520,1156],{"class":1155},[1149,6522,6523,6525],{"class":1151,"line":1159},[1149,6524,1163],{"class":1162},[1149,6526,1166],{"class":1155},[1149,6528,6529,6531,6533,6536],{"class":1151,"line":1169},[1149,6530,1172],{"class":1162},[1149,6532,1175],{"class":1155},[1149,6534,6535],{"class":1178},"\"too_many_requests\"",[1149,6537,1182],{"class":1155},[1149,6539,6540,6542,6544,6547],{"class":1151,"line":1185},[1149,6541,1188],{"class":1162},[1149,6543,1175],{"class":1155},[1149,6545,6546],{"class":1178},"\"Too many requests to this operation. Wait the number of seconds in Retry-After, then try again.\"",[1149,6548,1182],{"class":1155},[1149,6550,6551,6553,6555,6558],{"class":1151,"line":1198},[1149,6552,1201],{"class":1162},[1149,6554,1175],{"class":1155},[1149,6556,6557],{"class":1178},"\"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#too_many_requests\"",[1149,6559,1182],{"class":1155},[1149,6561,6562,6564,6566],{"class":1151,"line":1211},[1149,6563,1214],{"class":1162},[1149,6565,1175],{"class":1155},[1149,6567,6568],{"class":1178},"\"2c3d4e5f-6a7b-4c8d-9e0f-1a2b3c4d5e6f\"\n",[1149,6570,6571],{"class":1151,"line":1222},[1149,6572,1225],{"class":1155},[1149,6574,6575],{"class":1151,"line":1228},[1149,6576,1231],{"class":1155},[1046,6578,6579,6580,6582],{},"The message says what to do. Its wording may change, so rely on the status and ",[1049,6581,1049],{},", never on the message.",[1046,6584,6585],{},"How the limit is counted:",[1237,6587,6588,6594,6606,6612],{},[1240,6589,6590,6593],{},[1053,6591,6592],{},"Per account."," Calls from all your servers share one budget. Spreading a batch over more servers or addresses doesn't raise it.",[1240,6595,6596,6599,6600,1537,6603,1268],{},[1053,6597,6598],{},"Per operation."," Each operation has its own budget, so listing students and reading one student are counted separately, and a burst on one operation doesn't slow the others. All calls to one operation share its budget, whatever ids are in the path. That includes calls to the same operation on different organizations. Two operations never share a budget, even when they do similar work, such as ",[1058,6601,6602],{"href":171},"listing your students",[1058,6604,6605],{"href":196},"listing an organization's students",[1240,6607,6608,6611],{},[1053,6609,6610],{},"In fixed windows."," A window starts with its first counted request and lasts 60 seconds.",[1240,6613,6614,6617,6618,6620,6621,6624],{},[1053,6615,6616],{},"After the limit, the operation is closed for 60 seconds."," The block starts with the request that went over the limit and lasts a full 60 seconds, even if the window had only a few seconds left. So the first ",[1049,6619,6461],{}," says ",[1049,6622,6623],{},"Retry-After: 60",", and later ones give the seconds left in the block. Requests you send during the block are refused too. They aren't counted, and they don't extend it.",[1046,6626,6627],{},"Not counted at all:",[1237,6629,6630,6642,6645],{},[1240,6631,6632,6633,6635,6636,6638,6639,6641],{},"requests refused for authentication (",[1049,6634,2385],{},"), for a missing permission (",[1049,6637,3224],{},") or for an unknown organization (",[1049,6640,2014],{},");",[1240,6643,6644],{},"requests to a path that doesn't exist;",[1240,6646,6647,6649],{},[1049,6648,2264],{},", which no account's budget covers (the per-address limit below still applies).",[1046,6651,6652,6653,6655,6656,6658,6659,6661,6662,6664,6665,6667],{},"A request the operation itself refuses, such as a ",[1049,6654,1267],{}," for a field, a ",[1049,6657,2389],{}," for a record or a ",[1049,6660,4403],{},", has passed these checks, so it is counted. A body refused before your token is checked (a ",[1049,6663,5658],{},", a ",[1049,6666,5899],{}," or malformed JSON) is not.",[1363,6669,6671],{"id":6670},"a-429-without-the-json-envelope","A 429 without the JSON envelope",[1046,6673,6674,6675,6677,6678,6680],{},"The network in front of the API also limits how fast each client address may send requests. It counts every request from that address, with or without a token, and it is separate from your account's budget. A request refused there gets a ",[1049,6676,6461],{}," that doesn't carry the JSON error envelope above and has no ",[1049,6679,3186],{},". Wait about 10 seconds, then continue at a steadier pace. Spread a large batch evenly over time instead of sending it in bursts.",[1046,6682,6683],{},"Every counted response carries headers that tell you where you stand, so you can slow down before you hit the limit:",[1140,6685,6687],{"className":2271,"code":6686,"language":2273,"meta":1145,"style":1145},"HTTP\u002F1.1 200 OK\nX-RateLimit-Limit: 100\nX-RateLimit-Remaining: 42\nX-RateLimit-Reset: 18\n",[1049,6688,6689,6703,6713,6723],{"__ignoreMap":1145},[1149,6690,6691,6693,6695,6697,6700],{"class":1151,"line":1152},[1149,6692,2281],{"class":2280},[1149,6694,2284],{"class":1155},[1149,6696,2288],{"class":2287},[1149,6698,6699],{"class":2287}," 200",[1149,6701,6702],{"class":1178}," OK\n",[1149,6704,6705,6708,6710],{"class":1151,"line":1159},[1149,6706,6707],{"class":1162},"X-RateLimit-Limit",[1149,6709,2301],{"class":2280},[1149,6711,6712],{"class":1178}," 100\n",[1149,6714,6715,6718,6720],{"class":1151,"line":1169},[1149,6716,6717],{"class":1162},"X-RateLimit-Remaining",[1149,6719,2301],{"class":2280},[1149,6721,6722],{"class":1178}," 42\n",[1149,6724,6725,6728,6730],{"class":1151,"line":1185},[1149,6726,6727],{"class":1162},"X-RateLimit-Reset",[1149,6729,2301],{"class":2280},[1149,6731,6732],{"class":1178}," 18\n",[1066,6734,6735,6745],{},[1069,6736,6737],{},[1072,6738,6739,6742],{},[1075,6740,6741],{},"Header",[1075,6743,6744],{},"Meaning",[1085,6746,6747,6756,6765,6774],{},[1072,6748,6749,6753],{},[1090,6750,6751],{},[1049,6752,6707],{},[1090,6754,6755],{},"Requests allowed per window on this operation.",[1072,6757,6758,6762],{},[1090,6759,6760],{},[1049,6761,6717],{},[1090,6763,6764],{},"Requests left in the current window.",[1072,6766,6767,6771],{},[1090,6768,6769],{},[1049,6770,6727],{},[1090,6772,6773],{},"Seconds until the current window ends.",[1072,6775,6776,6780],{},[1090,6777,6778],{},[1049,6779,6489],{},[1090,6781,6782,6783,6785,6786,6788,6789,6792],{},"On a ",[1049,6784,6461],{}," only: seconds to wait before sending to this operation again. The ",[1049,6787,6461],{}," itself carries no ",[1049,6790,6791],{},"X-RateLimit-*"," headers.",[1041,6794,1235],{"id":1234},[2134,6796,6797,6809,6820,6842],{},[1240,6798,6799,6805,6806,6808],{},[1053,6800,6801,6802,6804],{},"Wait at least ",[1049,6803,6489],{}," seconds",", then send the request again. A ",[1049,6807,6461],{}," is refused before the operation runs, so resending is safe for every operation, including registration.",[1240,6810,6811,6816,6817,6819],{},[1053,6812,6813,6814,1268],{},"Pace yourself with ",[1049,6815,6717],{}," When it gets low, pause until ",[1049,6818,6727],{}," seconds have passed rather than running into the limit.",[1240,6821,6822,6825],{},[1053,6823,6824],{},"Make fewer calls:",[1237,6826,6827,6834,6837],{},[1240,6828,6829,6830,6833],{},"Page with ",[1049,6831,6832],{},"limit=100"," (the maximum) instead of the default 20. That is five times fewer calls for the same list.",[1240,6835,6836],{},"Cache reference data, such as countries, grades, organizations and exam categories. It rarely changes.",[1240,6838,6839,6840,2111],{},"Don't poll. Fetch results on a schedule, for example a nightly job (see ",[1058,6841,109],{"href":110},[1240,6843,6844,6847],{},[1053,6845,6846],{},"Throttle on your side."," Keep a simple counter per operation. Don't send more than 100 requests to one operation in 60 seconds from all of your workers combined, across every organization.",[1140,6849,6851],{"className":2639,"code":6850,"language":2641,"meta":1145,"style":1145},"\u002F\u002F Wait out a 429, honoring Retry-After. Other statuses are returned to the caller.\nasync function withRateLimit(send) {\n  for (;;) {\n    const res = await send();\n    if (res.status !== 429) return res;\n    const seconds = Number(res.headers.get('retry-after') ?? '60');\n    await new Promise((resolve) => setTimeout(resolve, (seconds + Math.random()) * 1000));\n  }\n}\n",[1049,6852,6853,6858,6877,6885,6903,6925,6957,7003,7007],{"__ignoreMap":1145},[1149,6854,6855],{"class":1151,"line":1152},[1149,6856,6857],{"class":2648},"\u002F\u002F Wait out a 429, honoring Retry-After. Other statuses are returned to the caller.\n",[1149,6859,6860,6863,6866,6869,6871,6874],{"class":1151,"line":1159},[1149,6861,6862],{"class":2280},"async",[1149,6864,6865],{"class":2280}," function",[1149,6867,6868],{"class":2676}," withRateLimit",[1149,6870,2680],{"class":1155},[1149,6872,6873],{"class":3744},"send",[1149,6875,6876],{"class":1155},") {\n",[1149,6878,6879,6882],{"class":1151,"line":1169},[1149,6880,6881],{"class":2280},"  for",[1149,6883,6884],{"class":1155}," (;;) {\n",[1149,6886,6887,6890,6893,6895,6898,6901],{"class":1151,"line":1185},[1149,6888,6889],{"class":2280},"    const",[1149,6891,6892],{"class":2287}," res",[1149,6894,2696],{"class":2280},[1149,6896,6897],{"class":2280}," await",[1149,6899,6900],{"class":2676}," send",[1149,6902,3002],{"class":1155},[1149,6904,6905,6908,6911,6914,6916,6919,6922],{"class":1151,"line":1198},[1149,6906,6907],{"class":2280},"    if",[1149,6909,6910],{"class":1155}," (res.status ",[1149,6912,6913],{"class":2280},"!==",[1149,6915,6481],{"class":2287},[1149,6917,6918],{"class":1155},") ",[1149,6920,6921],{"class":2280},"return",[1149,6923,6924],{"class":1155}," res;\n",[1149,6926,6927,6929,6931,6933,6936,6939,6942,6944,6947,6949,6952,6955],{"class":1151,"line":1211},[1149,6928,6889],{"class":2280},[1149,6930,6804],{"class":2287},[1149,6932,2696],{"class":2280},[1149,6934,6935],{"class":2676}," Number",[1149,6937,6938],{"class":1155},"(res.headers.",[1149,6940,6941],{"class":2676},"get",[1149,6943,2680],{"class":1155},[1149,6945,6946],{"class":1178},"'retry-after'",[1149,6948,6918],{"class":1155},[1149,6950,6951],{"class":2280},"??",[1149,6953,6954],{"class":1178}," '60'",[1149,6956,2686],{"class":1155},[1149,6958,6959,6962,6965,6968,6971,6974,6976,6979,6982,6985,6988,6990,6993,6996,6998,7000],{"class":1151,"line":1222},[1149,6960,6961],{"class":2280},"    await",[1149,6963,6964],{"class":2280}," new",[1149,6966,6967],{"class":2287}," Promise",[1149,6969,6970],{"class":1155},"((",[1149,6972,6973],{"class":3744},"resolve",[1149,6975,6918],{"class":1155},[1149,6977,6978],{"class":2280},"=>",[1149,6980,6981],{"class":2676}," setTimeout",[1149,6983,6984],{"class":1155},"(resolve, (seconds ",[1149,6986,6987],{"class":2280},"+",[1149,6989,2766],{"class":1155},[1149,6991,6992],{"class":2676},"random",[1149,6994,6995],{"class":1155},"()) ",[1149,6997,3329],{"class":2280},[1149,6999,2783],{"class":2287},[1149,7001,7002],{"class":1155},"));\n",[1149,7004,7005],{"class":1151,"line":1228},[1149,7006,1225],{"class":1155},[1149,7008,7009],{"class":1151,"line":2827},[1149,7010,1231],{"class":1155},[1140,7012,7014],{"className":2889,"code":7013,"language":2891,"meta":1145,"style":1145},"\u003C?php\n\u002F\u002F Wait out a 429, honoring Retry-After. $send returns ['status' => int, 'headers' => array, ...].\nfunction withRateLimit(callable $send): array\n{\n    while (true) {\n        $res = $send();\n        if ($res['status'] !== 429) {\n            return $res;\n        }\n        $seconds = (float) ($res['headers']['retry-after'] ?? 60);\n        usleep((int) (($seconds + mt_rand() \u002F mt_getrandmax()) * 1_000_000));\n    }\n}\n",[1049,7015,7016,7022,7027,7047,7051,7062,7072,7091,7099,7104,7136,7170,7174],{"__ignoreMap":1145},[1149,7017,7018,7020],{"class":1151,"line":1152},[1149,7019,2898],{"class":2280},[1149,7021,2901],{"class":2287},[1149,7023,7024],{"class":1151,"line":1159},[1149,7025,7026],{"class":2648},"\u002F\u002F Wait out a 429, honoring Retry-After. $send returns ['status' => int, 'headers' => array, ...].\n",[1149,7028,7029,7032,7034,7036,7039,7042,7044],{"class":1151,"line":1169},[1149,7030,7031],{"class":2280},"function",[1149,7033,6868],{"class":2676},[1149,7035,2680],{"class":1155},[1149,7037,7038],{"class":2280},"callable",[1149,7040,7041],{"class":1155}," $send)",[1149,7043,2301],{"class":2280},[1149,7045,7046],{"class":2280}," array\n",[1149,7048,7049],{"class":1151,"line":1185},[1149,7050,1156],{"class":1155},[1149,7052,7053,7056,7058,7060],{"class":1151,"line":1198},[1149,7054,7055],{"class":2280},"    while",[1149,7057,2931],{"class":1155},[1149,7059,2967],{"class":2287},[1149,7061,6876],{"class":1155},[1149,7063,7064,7067,7069],{"class":1151,"line":1211},[1149,7065,7066],{"class":1155},"        $res ",[1149,7068,2670],{"class":2280},[1149,7070,7071],{"class":1155}," $send();\n",[1149,7073,7074,7077,7080,7083,7085,7087,7089],{"class":1151,"line":1222},[1149,7075,7076],{"class":2280},"        if",[1149,7078,7079],{"class":1155}," ($res[",[1149,7081,7082],{"class":1178},"'status'",[1149,7084,2667],{"class":1155},[1149,7086,6913],{"class":2280},[1149,7088,6481],{"class":2287},[1149,7090,6876],{"class":1155},[1149,7092,7093,7096],{"class":1151,"line":1228},[1149,7094,7095],{"class":2280},"            return",[1149,7097,7098],{"class":1155}," $res;\n",[1149,7100,7101],{"class":1151,"line":2827},[1149,7102,7103],{"class":1155},"        }\n",[1149,7105,7106,7109,7111,7113,7116,7119,7122,7125,7127,7129,7131,7134],{"class":1151,"line":2841},[1149,7107,7108],{"class":1155},"        $seconds ",[1149,7110,2670],{"class":2280},[1149,7112,2931],{"class":1155},[1149,7114,7115],{"class":2280},"float",[1149,7117,7118],{"class":1155},") ($res[",[1149,7120,7121],{"class":1178},"'headers'",[1149,7123,7124],{"class":1155},"][",[1149,7126,6946],{"class":1178},[1149,7128,2667],{"class":1155},[1149,7130,6951],{"class":2280},[1149,7132,7133],{"class":2287}," 60",[1149,7135,2686],{"class":1155},[1149,7137,7138,7141,7143,7146,7149,7151,7154,7156,7158,7161,7163,7165,7168],{"class":1151,"line":2856},[1149,7139,7140],{"class":2287},"        usleep",[1149,7142,6970],{"class":1155},[1149,7144,7145],{"class":2280},"int",[1149,7147,7148],{"class":1155},") (($seconds ",[1149,7150,6987],{"class":2280},[1149,7152,7153],{"class":2287}," mt_rand",[1149,7155,2778],{"class":1155},[1149,7157,2284],{"class":2280},[1149,7159,7160],{"class":2287}," mt_getrandmax",[1149,7162,6995],{"class":1155},[1149,7164,3329],{"class":2280},[1149,7166,7167],{"class":2287}," 1_000_000",[1149,7169,7002],{"class":1155},[1149,7171,7172],{"class":1151,"line":2870},[1149,7173,6294],{"class":1155},[1149,7175,7176],{"class":1151,"line":2883},[1149,7177,1231],{"class":1155},[1046,7179,7180,7181,7183,7184,7186],{},"See ",[1058,7182,45],{"href":46}," for budgeting a whole batch, and ",[1058,7185,4670],{"href":49}," for combining this with other retries.",[1273,7188,7189],{},"html pre.shiki code .sHUrx, html code.shiki .sHUrx{--shiki-default:#A0111F;--shiki-dark:#FF9492}html pre.shiki code .suds8, html code.shiki .suds8{--shiki-default:#0E1116;--shiki-dark:#F0F3F6}html pre.shiki code .s-5SL, html code.shiki .s-5SL{--shiki-default:#023B95;--shiki-dark:#91CBFF}html pre.shiki code .sT6z2, html code.shiki .sT6z2{--shiki-default:#032563;--shiki-dark:#ADDCFF}html pre.shiki code .sne4z, html code.shiki .sne4z{--shiki-default:#024C1A;--shiki-dark:#72F088}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sLBg1, html code.shiki .sLBg1{--shiki-default:#66707B;--shiki-dark:#BDC4CC}html pre.shiki code .sKwhi, html code.shiki .sKwhi{--shiki-default:#622CBC;--shiki-dark:#DBB7FF}html pre.shiki code .soyes, html code.shiki .soyes{--shiki-default:#702C00;--shiki-dark:#FFB757}",{"title":1145,"searchDepth":1159,"depth":1169,"links":7191},[7192,7195],{"id":1043,"depth":1159,"text":1044,"children":7193},[7194],{"id":6670,"depth":1169,"text":6671},{"id":1234,"depth":1159,"text":1235},{"code":1013,"heading":1013,"status":1012,"retry":7197,"summary":7198,"message":7199,"body":7200},"with-backoff","An unexpected failure on the API's side. The operation may or may not have completed.","An unexpected error occurred.",{"type":1038,"value":7201,"toc":7408},[7202,7204,7213,7278,7286,7326,7335,7339,7345,7347,7406],[1041,7203,1044],{"id":1043},[1046,7205,1289,7206,7209,7210,7212],{},[1049,7207,7208],{},"500"," means the API failed while handling your request, for a reason that has nothing to do with what you sent. The failure is logged with its ",[1049,7211,3186],{},". The details are never included in the response.",[1140,7214,7216],{"className":1142,"code":7215,"language":1144,"meta":1145,"style":1145},"{\n  \"error\": {\n    \"code\": \"internal_error\",\n    \"message\": \"An unexpected error occurred.\",\n    \"documentation_url\": \"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#internal_error\",\n    \"request_id\": \"6f5e4d3c-2b1a-4098-8765-43210fedcba9\"\n  }\n}\n",[1049,7217,7218,7222,7228,7239,7250,7261,7270,7274],{"__ignoreMap":1145},[1149,7219,7220],{"class":1151,"line":1152},[1149,7221,1156],{"class":1155},[1149,7223,7224,7226],{"class":1151,"line":1159},[1149,7225,1163],{"class":1162},[1149,7227,1166],{"class":1155},[1149,7229,7230,7232,7234,7237],{"class":1151,"line":1169},[1149,7231,1172],{"class":1162},[1149,7233,1175],{"class":1155},[1149,7235,7236],{"class":1178},"\"internal_error\"",[1149,7238,1182],{"class":1155},[1149,7240,7241,7243,7245,7248],{"class":1151,"line":1185},[1149,7242,1188],{"class":1162},[1149,7244,1175],{"class":1155},[1149,7246,7247],{"class":1178},"\"An unexpected error occurred.\"",[1149,7249,1182],{"class":1155},[1149,7251,7252,7254,7256,7259],{"class":1151,"line":1198},[1149,7253,1201],{"class":1162},[1149,7255,1175],{"class":1155},[1149,7257,7258],{"class":1178},"\"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#internal_error\"",[1149,7260,1182],{"class":1155},[1149,7262,7263,7265,7267],{"class":1151,"line":1211},[1149,7264,1214],{"class":1162},[1149,7266,1175],{"class":1155},[1149,7268,7269],{"class":1178},"\"6f5e4d3c-2b1a-4098-8765-43210fedcba9\"\n",[1149,7271,7272],{"class":1151,"line":1222},[1149,7273,1225],{"class":1155},[1149,7275,7276],{"class":1151,"line":1228},[1149,7277,1231],{"class":1155},[1046,7279,1289,7280,7282,7283,7285],{},[1049,7281,7208],{}," can arrive on any operation, even while your token is still being checked, if something on our side is briefly unavailable. Most ",[1049,7284,7208],{},"s carry the generic message above. A few name what happened:",[1066,7287,7288,7300],{},[1069,7289,7290],{},[1072,7291,7292,7294,7297],{},[1075,7293,1077],{},[1075,7295,7296],{},"Operation",[1075,7298,7299],{},"What happened",[1085,7301,7302,7314],{},[1072,7303,7304,7308,7311],{},[1090,7305,7306],{},[1049,7307,1014],{},[1090,7309,7310],{},"create a sign-in link",[1090,7312,7313],{},"The link could not be issued. Nothing was issued, so retry at once.",[1072,7315,7316,7321,7323],{},[1090,7317,7318],{},[1049,7319,7320],{},"File storage is not configured on this server.",[1090,7322,4430],{},[1090,7324,7325],{},"Downloads are unavailable on our side. Report it.",[1046,7327,7328,7331,7332,7334],{},[1053,7329,7330],{},"The operation may or may not have completed."," A ",[1049,7333,7208],{}," can happen after a write has already been made. That matters for operations that aren't safe to repeat.",[1363,7336,7338],{"id":7337},"downloads-that-stop-halfway","Downloads that stop halfway",[1046,7340,7341,7342,7344],{},"If a certificate or report download fails after the file has started to arrive, the API can no longer send a status. It closes the connection instead. Your client sees a transfer that ends early or a network error, not a ",[1049,7343,7208],{},". Download the file again from the start.",[1041,7346,1235],{"id":1234},[2134,7348,7349,7361,7375,7393],{},[1240,7350,7351,7354,7355,7357,7358,1268],{},[1053,7352,7353],{},"Retry with backoff if the operation is safe to repeat."," Every ",[1049,7356,133],{}," is, and so are application create, move and delete, the student updates, setting a password, the supervisor link, sign-in link requests and revoking a token. Wait about 1 second, then 2, then 4, with some randomness, and give up after five attempts. See ",[1058,7359,4670],{"href":7360},"\u002Fapi\u002Fretries-and-idempotency#backing-off",[1240,7362,7363,2157,7366,7368,7369,7371,7372,1268],{},[1053,7364,7365],{},"For a registration, retry and read the answer.",[1049,7367,3563],{}," is not idempotent, but a repeat that answers ",[1049,7370,4403],{}," with an id in the message tells you the first attempt worked. See ",[1058,7373,7374],{"href":5358},"Registering a student",[1240,7376,7377,7380,7381,7385,7386,7388,7389,7392],{},[1053,7378,7379],{},"If many requests fail, pause."," Stop your batch. ",[1058,7382,7383],{"href":132},[1049,7384,2264],{}," tells you when the API is reachable again, but it doesn't check what your operations need, so it can answer ",[1049,7387,4557],{}," while they still fail. Before you resume, send one cheap read your account is allowed, such as ",[1049,7390,7391],{},"GET \u002Fv1\u002Fgrade?limit=1",", and wait until that succeeds.",[1240,7394,7395,7398,7399,3183,7403,7405],{},[1053,7396,7397],{},"If it keeps happening",", email ",[1053,7400,7401],{},[1058,7402,3182],{"href":3181},[1049,7404,3186],{},", the UTC time and the operation. Don't include your token or secret.",[1273,7407,1275],{},{"title":1145,"searchDepth":1159,"depth":1169,"links":7409},[7410,7413],{"id":1043,"depth":1159,"text":1044,"children":7411},[7412],{"id":7337,"depth":1169,"text":7338},{"id":1234,"depth":1159,"text":1235},{"code":1018,"heading":1018,"status":1017,"retry":7197,"summary":7415,"message":7416,"body":7417},"createStudentImport is paused or the server is busy, a group challenge submit met a group someone else was changing, or the API is not ready. Nothing was written; wait the Retry-After seconds.","Not ready.",{"type":1038,"value":7418,"toc":7733},[7419,7421,7438,7482,7512,7522,7587,7600,7616,7618,7730],[1041,7420,1044],{"id":1043},[1046,7422,7423,4540,7427,7430,7431,7434,7435,7437],{},[1058,7424,7425],{"href":180},[1049,7426,5546],{},[1049,7428,7429],{},"503"," for three reasons, and\nin every one of them ",[1053,7432,7433],{},"nothing was queued and nothing was registered",". Each carries ",[1049,7436,6489],{},",\nin seconds:",[1066,7439,7440,7450],{},[1069,7441,7442],{},[1072,7443,7444,7447],{},[1075,7445,7446],{},"Why",[1075,7448,7449],{},"What to do",[1085,7451,7452,7463,7474],{},[1072,7453,7454,7457],{},[1090,7455,7456],{},"The server is already checking another batch",[1090,7458,7459,7460,7462],{},"Wait the seconds in ",[1049,7461,6489],{}," and send it again. Checking a batch is the expensive part, and one server does one at a time.",[1072,7464,7465,7468],{},[1090,7466,7467],{},"Bulk registration is paused for a scheduled window, such as an exam morning",[1090,7469,7470,7471,7473],{},"Send it again after the window; ",[1049,7472,6489],{}," is how long it lasts. An import already queued is not lost — it waits and then runs.",[1072,7475,7476,7479],{},[1090,7477,7478],{},"Checking the batch took too long",[1090,7480,7481],{},"Send it again, or in smaller batches.",[1046,7483,7484,7488,7489,7493,7494,7496,7497,7500,7501,7488,7504,7507,7508,4558,7510,1268],{},[1058,7485,7486],{"href":294},[1049,7487,5086],{}," and\n",[1058,7490,7491],{"href":291},[1049,7492,5091],{}," answer ",[1049,7495,7429],{}," when someone\nelse — a member in the panel or the app, or another request of yours — is changing the same group at\nthat moment. ",[1053,7498,7499],{},"Nothing was written."," The answer carries ",[1049,7502,7503],{},"Retry-After: 1",[1049,7505,7506],{},"error.details.reason: busy",": wait a second and send the same request again. A retry that finds the\nwork already done answers ",[1049,7509,4557],{},[1049,7511,5289],{},[1046,7513,7514,7515,7517,7518,7521],{},"The other ",[1049,7516,7429],{}," is an internal readiness check the platform uses to decide whether an API instance\nshould receive traffic. ",[1053,7519,7520],{},"No other operation you call returns this code."," It appears in the error\ncatalog because that check shares the API's error format:",[1140,7523,7525],{"className":1142,"code":7524,"language":1144,"meta":1145,"style":1145},"{\n  \"error\": {\n    \"code\": \"service_unavailable\",\n    \"message\": \"Not ready.\",\n    \"documentation_url\": \"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#service_unavailable\",\n    \"request_id\": \"a9b8c7d6-e5f4-4321-8fed-cba987654321\"\n  }\n}\n",[1049,7526,7527,7531,7537,7548,7559,7570,7579,7583],{"__ignoreMap":1145},[1149,7528,7529],{"class":1151,"line":1152},[1149,7530,1156],{"class":1155},[1149,7532,7533,7535],{"class":1151,"line":1159},[1149,7534,1163],{"class":1162},[1149,7536,1166],{"class":1155},[1149,7538,7539,7541,7543,7546],{"class":1151,"line":1169},[1149,7540,1172],{"class":1162},[1149,7542,1175],{"class":1155},[1149,7544,7545],{"class":1178},"\"service_unavailable\"",[1149,7547,1182],{"class":1155},[1149,7549,7550,7552,7554,7557],{"class":1151,"line":1185},[1149,7551,1188],{"class":1162},[1149,7553,1175],{"class":1155},[1149,7555,7556],{"class":1178},"\"Not ready.\"",[1149,7558,1182],{"class":1155},[1149,7560,7561,7563,7565,7568],{"class":1151,"line":1198},[1149,7562,1201],{"class":1162},[1149,7564,1175],{"class":1155},[1149,7566,7567],{"class":1178},"\"https:\u002F\u002Fhub.main-team.org\u002Fapi\u002Ferrors#service_unavailable\"",[1149,7569,1182],{"class":1155},[1149,7571,7572,7574,7576],{"class":1151,"line":1211},[1149,7573,1214],{"class":1162},[1149,7575,1175],{"class":1155},[1149,7577,7578],{"class":1178},"\"a9b8c7d6-e5f4-4321-8fed-cba987654321\"\n",[1149,7580,7581],{"class":1151,"line":1222},[1149,7582,1225],{"class":1155},[1149,7584,7585],{"class":1151,"line":1228},[1149,7586,1231],{"class":1155},[1046,7588,7589,7590,7592,7593,1762,7596,7599],{},"If you receive a ",[1049,7591,7429],{},", or a ",[1049,7594,7595],{},"502",[1049,7597,7598],{},"504",", while calling the API:",[1237,7601,7602,7608],{},[1240,7603,7604,7607],{},[1053,7605,7606],{},"Without this JSON envelope",", it came from the network in front of the API, for example during maintenance. Your request may not have reached the API.",[1240,7609,7610,7615],{},[1053,7611,7612,7613],{},"With a different ",[1049,7614,1049],{},", handle that code.",[1041,7617,1235],{"id":1234},[2134,7619,7620,7628,7706,7715],{},[1240,7621,7622,7625,7626,1268],{},[1053,7623,7624],{},"Treat it as temporary."," Retry with jittered backoff (about 1, 2, 4 seconds and so on, at most five attempts), but only for operations that are safe to repeat. See ",[1058,7627,4670],{"href":49},[1240,7629,7630,2157,7633,7637,7638,7640,7641,7643,7644,7656],{},[1053,7631,7632],{},"Monitor with the health check.",[1058,7634,7635],{"href":132},[1049,7636,2264],{}," needs no token and doesn't count against your account's rate limit. It answers ",[1049,7639,4557],{}," while the API is up and reachable. It doesn't check what your operations need behind it, so it can answer ",[1049,7642,4557],{}," while they still fail:",[1140,7645,7647],{"className":3735,"code":7646,"language":3737,"meta":1145,"style":1145},"curl https:\u002F\u002Fapi.main-team.org\u002Fv1\u002Fhealth\n",[1049,7648,7649],{"__ignoreMap":1145},[1149,7650,7651,7653],{"class":1151,"line":1152},[1149,7652,3745],{"class":3744},[1149,7654,7655],{"class":1178}," https:\u002F\u002Fapi.main-team.org\u002Fv1\u002Fhealth\n",[1140,7657,7659],{"className":1142,"code":7658,"language":1144,"meta":1145,"style":1145},"{\n  \"success\": true,\n  \"message\": \"Request completed successfully.\",\n  \"data\": { \"status\": \"ok\" }\n}\n",[1049,7660,7661,7665,7675,7686,7702],{"__ignoreMap":1145},[1149,7662,7663],{"class":1151,"line":1152},[1149,7664,1156],{"class":1155},[1149,7666,7667,7669,7671,7673],{"class":1151,"line":1159},[1149,7668,3809],{"class":1162},[1149,7670,1175],{"class":1155},[1149,7672,2967],{"class":2287},[1149,7674,1182],{"class":1155},[1149,7676,7677,7679,7681,7684],{"class":1151,"line":1169},[1149,7678,3820],{"class":1162},[1149,7680,1175],{"class":1155},[1149,7682,7683],{"class":1178},"\"Request completed successfully.\"",[1149,7685,1182],{"class":1155},[1149,7687,7688,7690,7692,7695,7697,7700],{"class":1151,"line":1185},[1149,7689,3832],{"class":1162},[1149,7691,5161],{"class":1155},[1149,7693,7694],{"class":1162},"\"status\"",[1149,7696,1175],{"class":1155},[1149,7698,7699],{"class":1178},"\"ok\"",[1149,7701,5172],{"class":1155},[1149,7703,7704],{"class":1151,"line":1198},[1149,7705,1231],{"class":1155},[1240,7707,7708,7711,7712,7714],{},[1053,7709,7710],{},"Pause batches"," while responses keep failing. Once the health check answers, send one cheap read your account is allowed, such as ",[1049,7713,7391],{},", and resume when that succeeds.",[1240,7716,7717,7398,7720,7724,7725,7727,7728,1268],{},[1053,7718,7719],{},"If it lasts more than a few minutes",[1053,7721,7722],{},[1058,7723,3182],{"href":3181}," with the UTC time and any ",[1049,7726,3186],{},"s you received. See ",[1058,7729,345],{"href":346},[1273,7731,7732],{},"html pre.shiki code .suds8, html code.shiki .suds8{--shiki-default:#0E1116;--shiki-dark:#F0F3F6}html pre.shiki code .sne4z, html code.shiki .sne4z{--shiki-default:#024C1A;--shiki-dark:#72F088}html pre.shiki code .sT6z2, html code.shiki .sT6z2{--shiki-default:#032563;--shiki-dark:#ADDCFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .soyes, html code.shiki .soyes{--shiki-default:#702C00;--shiki-dark:#FFB757}html pre.shiki code .s-5SL, html code.shiki .s-5SL{--shiki-default:#023B95;--shiki-dark:#91CBFF}",{"title":1145,"searchDepth":1159,"depth":1169,"links":7734},[7735,7736],{"id":1043,"depth":1159,"text":1044},{"id":1234,"depth":1159,"text":1235},[46,49,343,346],1791554614811]