{"openapi":"3.1.0","info":{"title":"GGS personal agent API","version":"1.1.0","description":"Read public information, optionally validate, then submit one complete enrolment. Validation, receipt, email delivery and school approval are separate facts."},"servers":[{"url":"/","description":"The origin serving this API."}],"paths":{"/api/v1/school.json":{"get":{"operationId":"getSchoolInformation","summary":"Read dated public school information","description":"updatedAt records the public projection editorial date. fees[].year records applicability; publishedAt records source publication or null. Join grades[].documents[].type to documentTypes[].id. Required flags depend on grade. Named links are objects; links.documents is a list. Every link object contains uncertainties.","responses":{"200":{"description":"Public facts, source links and uncertainties. Amounts are whole toea in PGK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolInformation"}}}}}}},"/api/v1/intake/validate":{"post":{"operationId":"validateApplication","summary":"Check a manifest or complete packet without submitting","security":[],"description":"Validation uses the same current admission rules as submission. JSON contains a manifest object and declared document descriptors, within 32768 bytes total. Multipart uses the existing packet and checks actual sizes and supported file signatures. Maximum request: 31457280 bytes. Maximum manifest: 32768 bytes. At most 7 files, each at most 10485760 bytes; combined files at most 29360128 bytes. Validation creates no permit, application, stored file, review job or correspondence. It reserves no submission capacity. It does not guarantee later acceptance. No Authorization or Idempotency-Key is required. Process-local guards allow 120 requests per client address per minute and 60 requests per permit per minute. These guards reset on restart and apply separately on each process. Validation also allows 10 requests per address per minute per process. Submission and validation share two packet slots; at most one validation can run.","parameters":[{"name":"Origin","in":"header","required":false,"description":"Required only for multipart requests. Send the API origin.","schema":{"type":"string","format":"uri"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntakeValidationRequest"}},"multipart/form-data":{"schema":{"type":"object","additionalProperties":false,"properties":{"manifest":{"type":"string","contentMediaType":"application/json","contentSchema":{"$ref":"#/components/schemas/IntakeManifest"},"description":"JSON text with student, guardian and guardianAuthorityAsserted. Connected service requests remain in browser forms."},"birth-certificate":{"type":"string","format":"binary","title":"Birth certificate or other ID","description":"Your child’s birth certificate, passport or other identity document. Required for every applicant. Accepted formats: pdf, jpeg, png, webp, heic. The server checks sizes and file signatures."},"photo":{"type":"string","format":"binary","title":"Passport-sized photo","description":"A recent photo of your child’s face against a plain background. Required for every applicant. Accepted formats: pdf, jpeg, png, webp, heic. The server checks sizes and file signatures."},"fee-receipt":{"type":"string","format":"binary","title":"K500 enrolment fee receipt","description":"The receipt or bank deposit slip for the non-refundable K500 enrolment fee. Required for every applicant. Accepted formats: pdf, jpeg, png, webp, heic. The server checks sizes and file signatures."},"school-report":{"type":"string","format":"binary","title":"Most recent school report","description":"Your child’s latest report card or academic transcript. Required from Grade 1. Optional for Early Learning. Accepted formats: pdf, jpeg, png, webp, heic. The server checks sizes and file signatures."},"certificate":{"type":"string","format":"binary","title":"Grade 8 or Grade 10 certificate","description":"For Grade 9, the Grade 8 certificate. For Grade 11, the Grade 10 certificate. Required for Grade 9 and Grade 11 entry. Accepted formats: pdf, jpeg, png, webp, heic. The server checks sizes and file signatures."},"character-report":{"type":"string","format":"binary","title":"Behaviour or character report","description":"A letter or report from your child’s current school, if you have one. Include one if you have it. Accepted formats: pdf, jpeg, png, webp, heic. The server checks sizes and file signatures."},"medical":{"type":"string","format":"binary","title":"Medical or legal documents","description":"Anything the school should know about: a medical condition, custody arrangements or a court order. Only if they apply to your child. Accepted formats: pdf, jpeg, png, webp, heic. The server checks sizes and file signatures."}},"required":["manifest"]}}}},"responses":{"200":{"description":"valid=true confirms current rules. fileContentsChecked is false for descriptors and true for actual sizes and signatures.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntakeValidationResult"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"403":{"description":"The framework origin check rejected the multipart request. Send Origin equal to the API origin. This response can be plain text."},"409":{"description":"connected_review_required: complete the connected family application on the website.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"413":{"description":"input_too_large: reduce the request, manifest, individual file or combined files.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"415":{"description":"unsupported_media_type: send the documented content type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"422":{"description":"invalid_input or incomplete: correct error.fields. Missing files use documents.<type>, for example documents.photo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"429":{"description":"rate_limited: wait before another request. Process-local request limits and durable creation budgets have different windows.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}},"Retry-After":{"description":"Seconds before another attempt. This is retry pacing; an hourly or daily quota can remain exhausted.","schema":{"type":"string","pattern":"^[0-9]+$"}}}},"500":{"description":"validation_failed: validation could not finish. No application was submitted. Retry validation when the service recovers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"503":{"description":"api_inactive: validation is suspended. server_busy: wait before retrying validation. No application was submitted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}},"Retry-After":{"description":"Seconds before another attempt. This is retry pacing; an hourly or daily quota can remain exhausted.","schema":{"type":"string","pattern":"^[0-9]+$"}}}}}}},"/api/v1/intake/permits":{"post":{"operationId":"issueIntakePermit","summary":"Automatically request a create-only permit","security":[],"description":"One permit can receive one application within 86400 seconds. It cannot open existing applications. Only its hash is stored. Save the key privately before posting a packet. Process-local guards allow 120 requests per client address per minute and 60 requests per permit per minute. These guards reset on restart and apply separately on each process. A process-local guard allows 30 permit requests per address per hour. Durable issuance budgets allow 30 permits per address per rolling hour and 300 globally per UTC day.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyRequest"}}}},"responses":{"201":{"description":"A permit was issued. This does not establish parent approval.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntakePermit"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"400":{"description":"invalid_input or idempotency_key_required: correct the request before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"413":{"description":"input_too_large: reduce the request, manifest, individual file or combined files.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"415":{"description":"unsupported_media_type: send the documented content type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"422":{"description":"invalid_input or incomplete: correct error.fields. Missing files use documents.<type>, for example documents.photo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"429":{"description":"rate_limited: wait before another request. Process-local request limits and durable creation budgets have different windows.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}},"Retry-After":{"description":"Seconds before another attempt. This is retry pacing; an hourly or daily quota can remain exhausted.","schema":{"type":"string","pattern":"^[0-9]+$"}}}},"500":{"description":"internal_error: submission outcome can be uncertain. Keep the permit and retry key, then recover the receipt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"503":{"description":"api_inactive: intake is suspended. server_busy: wait before retrying. Keep any saved submission attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}},"Retry-After":{"description":"Seconds before another attempt. This is retry pacing; an hourly or daily quota can remain exhausted.","schema":{"type":"string","pattern":"^[0-9]+$"}}}}}}},"/api/v1/intake/applications":{"post":{"operationId":"submitNewEnrolment","summary":"Receive one complete new enrolment packet","security":[{"intakePermit":[]}],"description":"Maximum request: 31457280 bytes. Maximum manifest: 32768 bytes. At most 7 files, each at most 10485760 bytes; combined files at most 29360128 bytes. Required files follow the grade rules in school.json. Entry year must be the current year or either following year. Ages must be two through twenty-two. Current date checks do not invalidate an identical accepted replay. guardianAuthorityAsserted records the caller assertion; it does not prove parent approval. Receipt recovery lasts 7 days. Process-local guards allow 120 requests per client address per minute and 60 requests per permit per minute. These guards reset on restart and apply separately on each process. Durable budgets allow 100 new applications and 1073741824 attempted staged bytes globally per UTC day. Matching accepted replays consume no additional application allowance. School email waits for review. Email caps postpone correspondence while retaining the receipt. They allow 100 per audience per UTC day and 6 parent receipts per recipient per UTC day.","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Save one key per attempt. Retry the same normalized manifest and file bytes with the same permit and key.","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8,128}$"}},{"name":"Origin","in":"header","required":true,"description":"Send the API origin for multipart requests. This header is not an authentication credential.","schema":{"type":"string","format":"uri"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","additionalProperties":false,"properties":{"manifest":{"type":"string","contentMediaType":"application/json","contentSchema":{"$ref":"#/components/schemas/IntakeManifest"},"description":"JSON text with student, guardian and guardianAuthorityAsserted. Connected service requests remain in browser forms."},"birth-certificate":{"type":"string","format":"binary","title":"Birth certificate or other ID","description":"Your child’s birth certificate, passport or other identity document. Required for every applicant. Accepted formats: pdf, jpeg, png, webp, heic. The server checks sizes and file signatures."},"photo":{"type":"string","format":"binary","title":"Passport-sized photo","description":"A recent photo of your child’s face against a plain background. Required for every applicant. Accepted formats: pdf, jpeg, png, webp, heic. The server checks sizes and file signatures."},"fee-receipt":{"type":"string","format":"binary","title":"K500 enrolment fee receipt","description":"The receipt or bank deposit slip for the non-refundable K500 enrolment fee. Required for every applicant. Accepted formats: pdf, jpeg, png, webp, heic. The server checks sizes and file signatures."},"school-report":{"type":"string","format":"binary","title":"Most recent school report","description":"Your child’s latest report card or academic transcript. Required from Grade 1. Optional for Early Learning. Accepted formats: pdf, jpeg, png, webp, heic. The server checks sizes and file signatures."},"certificate":{"type":"string","format":"binary","title":"Grade 8 or Grade 10 certificate","description":"For Grade 9, the Grade 8 certificate. For Grade 11, the Grade 10 certificate. Required for Grade 9 and Grade 11 entry. Accepted formats: pdf, jpeg, png, webp, heic. The server checks sizes and file signatures."},"character-report":{"type":"string","format":"binary","title":"Behaviour or character report","description":"A letter or report from your child’s current school, if you have one. Include one if you have it. Accepted formats: pdf, jpeg, png, webp, heic. The server checks sizes and file signatures."},"medical":{"type":"string","format":"binary","title":"Medical or legal documents","description":"Anything the school should know about: a medical condition, custody arrangements or a court order. Only if they apply to your child. Accepted formats: pdf, jpeg, png, webp, heic. The server checks sizes and file signatures."}},"required":["manifest"]}}}},"responses":{"200":{"description":"The identical attempt returned its receipt without another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntakeReceipt"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"201":{"description":"The packet and immutable receipt were recorded. This does not prove email delivery or school approval.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntakeReceipt"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"400":{"description":"invalid_input or idempotency_key_required: correct the request before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"401":{"description":"invalid_permit, revoked_permit or expired_permit: creation is unavailable. Recover a submitted receipt before obtaining another permit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"403":{"description":"The framework origin check rejected the multipart request. Send Origin equal to the API origin. This response can be plain text."},"409":{"description":"idempotency_conflict or permit_consumed: retain the saved attempt. in_progress: wait and recover its receipt. connected_review_required: use the connected browser application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}},"Retry-After":{"description":"Seconds before another attempt. This is retry pacing; an hourly or daily quota can remain exhausted.","schema":{"type":"string","pattern":"^[0-9]+$"}}}},"410":{"description":"receipt_expired: contact the school before submitting again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"413":{"description":"input_too_large: reduce the request, manifest, individual file or combined files.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"415":{"description":"unsupported_media_type: send the documented content type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"422":{"description":"invalid_input or incomplete: correct error.fields. Missing files use documents.<type>, for example documents.photo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"429":{"description":"rate_limited: wait before another request. Process-local request limits and durable creation budgets have different windows.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}},"Retry-After":{"description":"Seconds before another attempt. This is retry pacing; an hourly or daily quota can remain exhausted.","schema":{"type":"string","pattern":"^[0-9]+$"}}}},"500":{"description":"internal_error: submission outcome can be uncertain. Keep the permit and retry key, then recover the receipt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"503":{"description":"api_inactive: intake is suspended. server_busy: wait before retrying. Keep any saved submission attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}},"Retry-After":{"description":"Seconds before another attempt. This is retry pacing; an hourly or daily quota can remain exhausted.","schema":{"type":"string","pattern":"^[0-9]+$"}}}}}}},"/api/v1/intake/receipt":{"get":{"operationId":"getIntakeReceipt","summary":"Recover only this permit’s minimal receipt","security":[{"intakePermit":[]}],"description":"Send the permit in Authorization. Keep credentials and references out of URLs. Creation expires after one day. Receipt recovery lasts 7 days after submission. A missing receipt does not prove that an in-progress request failed. Process-local guards allow 120 requests per client address per minute and 60 requests per permit per minute. These guards reset on restart and apply separately on each process. Receipt reads consume no application allowance.","responses":{"200":{"description":"The permit’s immutable receipt, without family, file or school-decision details.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntakeReceipt"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"401":{"description":"invalid_permit, revoked_permit or expired_permit: creation is unavailable. Recover a submitted receipt before obtaining another permit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"404":{"description":"receipt_not_found: no receipt is recorded yet. Keep the saved attempt; an in-progress submission can still finish.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"410":{"description":"receipt_expired: contact the school before submitting again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"429":{"description":"rate_limited: wait before another request. Process-local request limits and durable creation budgets have different windows.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}},"Retry-After":{"description":"Seconds before another attempt. This is retry pacing; an hourly or daily quota can remain exhausted.","schema":{"type":"string","pattern":"^[0-9]+$"}}}},"500":{"description":"internal_error: submission outcome can be uncertain. Keep the permit and retry key, then recover the receipt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}}}},"503":{"description":"api_inactive: intake is suspended. server_busy: wait before retrying. Keep any saved submission attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Cache-Control":{"description":"Private responses always use no-store.","schema":{"type":"string","const":"no-store"}},"Retry-After":{"description":"Seconds before another attempt. This is retry pacing; an hourly or daily quota can remain exhausted.","schema":{"type":"string","pattern":"^[0-9]+$"}}}}}}}},"components":{"securitySchemes":{"intakePermit":{"type":"http","scheme":"bearer","description":"A create-only permit for one new application and its minimal receipt. No existing application reads, edits, downloads or assessments."}},"schemas":{"SchoolInformation":{"type":"object","properties":{"schemaVersion":{"type":"number","const":1},"revision":{"type":"string","pattern":"^[a-f0-9]{64}$"},"updatedAt":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"Editorial update date of this public projection. This is not school verification or a fee publication date."},"school":{"type":"object","properties":{"name":{"type":"string"},"address":{"type":"array","items":{"type":"string"}},"phone":{"type":"object","properties":{"display":{"type":"string"},"href":{"type":"string"}},"required":["display","href"],"additionalProperties":false},"email":{"type":"string","format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"bursarEmail":{"type":"string","format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"receptionHours":{"type":"string"},"sourceUrl":{"type":"string","format":"uri"}},"required":["name","address","phone","email","bursarEmail","receptionHours","sourceUrl"],"additionalProperties":false},"sections":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"grades":{"type":"string"},"summary":{"type":"string"},"campus":{"type":["string","null"]},"sourceUrl":{"type":"string","format":"uri"}},"required":["id","name","grades","summary","campus","sourceUrl"],"additionalProperties":false}},"admissions":{"type":"object","properties":{"sourceUrl":{"type":"string","format":"uri"},"applyUrl":{"type":"string","format":"uri"},"documentTypes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"hint":{"type":"string"},"requiredWhen":{"type":"string","description":"Source wording for conditional requirements. Read with the grade-specific required flag."}},"required":["id","label","hint","requiredWhen"],"additionalProperties":false}},"uploads":{"type":"object","properties":{"formats":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"mimeType":{"type":"string"}},"required":["id","mimeType"],"additionalProperties":false}},"maxFileBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxFiles":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxTotalFileBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxManifestBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxRequestBytes":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["formats","maxFileBytes","maxFiles","maxTotalFileBytes","maxManifestBytes","maxRequestBytes"],"additionalProperties":false},"grades":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"section":{"type":"string"},"documents":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","description":"Join this type to documentTypes[].id for its label, hint and conditions."},"required":{"type":"boolean"}},"required":["type","required"],"additionalProperties":false}}},"required":["id","label","section","documents"],"additionalProperties":false}},"uncertainties":{"type":"array","items":{"type":"string"}}},"required":["sourceUrl","applyUrl","documentTypes","uploads","grades","uncertainties"],"additionalProperties":false},"fees":{"type":"array","items":{"type":"object","properties":{"year":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"publishedAt":{"anyOf":[{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},{"type":"null"}],"description":"Publication date stated by the fee source, or null when unknown. The fee year is separate."},"currency":{"type":"string","const":"PGK"},"terms":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"tuition":{"type":"array","items":{"type":"object","properties":{"grades":{"type":"array","items":{"type":"string"}},"annualToea":{"type":"integer","minimum":0,"maximum":9007199254740991},"termToea":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["grades","annualToea","termToea"],"additionalProperties":false}},"boarding":{"type":"object","properties":{"grades":{"type":"array","items":{"type":"string"}},"annualToea":{"type":"integer","minimum":0,"maximum":9007199254740991},"termToea":{"type":"integer","minimum":0,"maximum":9007199254740991},"monthToea":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["grades","annualToea","termToea","monthToea"],"additionalProperties":false},"graduationLevy":{"type":"object","properties":{"grade":{"type":"string"},"amountToea":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["grade","amountToea"],"additionalProperties":false},"lunch":{"type":"object","properties":{"termToea":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["termToea"],"additionalProperties":false},"afterSchool":{"type":"object","properties":{"grades":{"type":"array","items":{"type":"string"}},"termToea":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["grades","termToea"],"additionalProperties":false},"reEnrolmentFeeToea":{"type":"integer","minimum":0,"maximum":9007199254740991},"holdingDepositFraction":{"type":"number","minimum":0,"maximum":1},"monthlyAdminFeeToea":{"type":"integer","minimum":0,"maximum":9007199254740991},"due":{"type":"object","properties":{"annual":{"type":"string"},"termly":{"type":"string"},"monthly":{"type":"string"}},"required":["annual","termly","monthly"],"additionalProperties":false},"earlyBird":{"type":"string"},"sourceUrls":{"type":"array","items":{"type":"string","format":"uri"}},"uncertainties":{"type":"array","items":{"type":"string"}}},"required":["year","publishedAt","currency","terms","tuition","boarding","graduationLevy","lunch","afterSchool","reEnrolmentFeeToea","holdingDepositFraction","monthlyAdminFeeToea","due","earlyBird","sourceUrls","uncertainties"],"additionalProperties":false}},"links":{"type":"object","properties":{"calendar":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"uncertainties":{"type":"array","items":{"type":"string"}}},"required":["url","uncertainties"],"additionalProperties":false},"shop":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"uncertainties":{"type":"array","items":{"type":"string"}}},"required":["url","uncertainties"],"additionalProperties":false},"news":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"uncertainties":{"type":"array","items":{"type":"string"}}},"required":["url","uncertainties"],"additionalProperties":false},"careers":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"uncertainties":{"type":"array","items":{"type":"string"}}},"required":["url","uncertainties"],"additionalProperties":false},"documents":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"uncertainties":{"type":"array","items":{"type":"string"}},"id":{"type":"string"}},"required":["url","uncertainties","id"],"additionalProperties":false}}},"required":["calendar","shop","news","careers","documents"],"additionalProperties":false}},"required":["schemaVersion","revision","updatedAt","school","sections","admissions","fees","links"],"additionalProperties":false},"EmptyRequest":{"type":"object","properties":{},"additionalProperties":false},"IntakePermit":{"type":"object","properties":{"key":{"type":"string","pattern":"^ggsi_[A-Za-z0-9_-]{40,100}$"},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"expiresIn":{"type":"number","const":86400}},"required":["key","expiresAt","expiresIn"],"additionalProperties":false},"IntakeManifest":{"type":"object","properties":{"student":{"type":"object","properties":{"givenNames":{"type":"string","minLength":1,"maxLength":80},"familyName":{"type":"string","minLength":1,"maxLength":80},"preferredName":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}]},"dateOfBirth":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"gender":{"type":"string","enum":["female","male"]},"province":{"type":"string","enum":["Autonomous Region of Bougainville","Central","Chimbu","East New Britain","East Sepik","Eastern Highlands","Enga","Gulf","Hela","Jiwaka","Madang","Manus","Milne Bay","Morobe","National Capital District","New Ireland","Northern (Oro)","Sandaun (West Sepik)","Southern Highlands","West New Britain","Western","Western Highlands","Outside Papua New Guinea"]},"grade":{"type":"string","enum":["day-care","kindergarten","preparatory","grade-1","grade-2","grade-3","grade-4","grade-5","grade-6","grade-7","grade-8","grade-9","grade-10","grade-11","grade-12"]},"entryYear":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"entryTerm":{"type":"string","enum":["1","2","3","4"]},"attendance":{"type":"string","enum":["day","boarding"]},"currentSchool":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}]},"currentGrade":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}]},"supportNeeds":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}]}},"required":["givenNames","familyName","dateOfBirth","gender","province","grade","entryYear","entryTerm","attendance"],"additionalProperties":false},"guardian":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"relationship":{"type":"string","enum":["mother","father","guardian","other"]},"phone":{"type":"string","pattern":"^\\+?[0-9 ()-]{7,20}$"},"email":{"type":"string","maxLength":160,"format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"address":{"type":"string","minLength":1,"maxLength":400},"secondName":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}]},"secondPhone":{"anyOf":[{"type":"string","pattern":"^(\\+?[0-9 ()-]{7,20})?$"},{"type":"null"}]}},"required":["name","relationship","phone","email","address"],"additionalProperties":false},"guardianAuthorityAsserted":{"type":"boolean","const":true}},"required":["student","guardian","guardianAuthorityAsserted"],"additionalProperties":false},"IntakeValidationRequest":{"type":"object","properties":{"manifest":{"type":"object","properties":{"student":{"type":"object","properties":{"givenNames":{"type":"string","minLength":1,"maxLength":80},"familyName":{"type":"string","minLength":1,"maxLength":80},"preferredName":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}]},"dateOfBirth":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"gender":{"type":"string","enum":["female","male"]},"province":{"type":"string","enum":["Autonomous Region of Bougainville","Central","Chimbu","East New Britain","East Sepik","Eastern Highlands","Enga","Gulf","Hela","Jiwaka","Madang","Manus","Milne Bay","Morobe","National Capital District","New Ireland","Northern (Oro)","Sandaun (West Sepik)","Southern Highlands","West New Britain","Western","Western Highlands","Outside Papua New Guinea"]},"grade":{"type":"string","enum":["day-care","kindergarten","preparatory","grade-1","grade-2","grade-3","grade-4","grade-5","grade-6","grade-7","grade-8","grade-9","grade-10","grade-11","grade-12"]},"entryYear":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"entryTerm":{"type":"string","enum":["1","2","3","4"]},"attendance":{"type":"string","enum":["day","boarding"]},"currentSchool":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}]},"currentGrade":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}]},"supportNeeds":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}]}},"required":["givenNames","familyName","dateOfBirth","gender","province","grade","entryYear","entryTerm","attendance"],"additionalProperties":false},"guardian":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"relationship":{"type":"string","enum":["mother","father","guardian","other"]},"phone":{"type":"string","pattern":"^\\+?[0-9 ()-]{7,20}$"},"email":{"type":"string","maxLength":160,"format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"address":{"type":"string","minLength":1,"maxLength":400},"secondName":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}]},"secondPhone":{"anyOf":[{"type":"string","pattern":"^(\\+?[0-9 ()-]{7,20})?$"},{"type":"null"}]}},"required":["name","relationship","phone","email","address"],"additionalProperties":false},"guardianAuthorityAsserted":{"type":"boolean","const":true}},"required":["student","guardian","guardianAuthorityAsserted"],"additionalProperties":false},"documents":{"maxItems":7,"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["birth-certificate","photo","fee-receipt","school-report","certificate","character-report","medical"]},"fileName":{"type":"string"},"format":{"type":"string","enum":["pdf","jpeg","png","webp","heic"]},"bytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["type","fileName","format","bytes"],"additionalProperties":false}}},"required":["manifest","documents"],"additionalProperties":false},"IntakeValidationResult":{"type":"object","properties":{"valid":{"type":"boolean","const":true},"fileContentsChecked":{"type":"boolean"}},"required":["valid","fileContentsChecked"],"additionalProperties":false},"Student":{"type":"object","properties":{"givenNames":{"type":"string","minLength":1,"maxLength":80},"familyName":{"type":"string","minLength":1,"maxLength":80},"preferredName":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}]},"dateOfBirth":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"gender":{"type":"string","enum":["female","male"]},"province":{"type":"string","enum":["Autonomous Region of Bougainville","Central","Chimbu","East New Britain","East Sepik","Eastern Highlands","Enga","Gulf","Hela","Jiwaka","Madang","Manus","Milne Bay","Morobe","National Capital District","New Ireland","Northern (Oro)","Sandaun (West Sepik)","Southern Highlands","West New Britain","Western","Western Highlands","Outside Papua New Guinea"]},"grade":{"type":"string","enum":["day-care","kindergarten","preparatory","grade-1","grade-2","grade-3","grade-4","grade-5","grade-6","grade-7","grade-8","grade-9","grade-10","grade-11","grade-12"]},"entryYear":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"entryTerm":{"type":"string","enum":["1","2","3","4"]},"attendance":{"type":"string","enum":["day","boarding"]},"currentSchool":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}]},"currentGrade":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}]},"supportNeeds":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}]}},"required":["givenNames","familyName","dateOfBirth","gender","province","grade","entryYear","entryTerm","attendance"],"additionalProperties":false},"Guardian":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"relationship":{"type":"string","enum":["mother","father","guardian","other"]},"phone":{"type":"string","pattern":"^\\+?[0-9 ()-]{7,20}$"},"email":{"type":"string","maxLength":160,"format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"address":{"type":"string","minLength":1,"maxLength":400},"secondName":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}]},"secondPhone":{"anyOf":[{"type":"string","pattern":"^(\\+?[0-9 ()-]{7,20})?$"},{"type":"null"}]}},"required":["name","relationship","phone","email","address"],"additionalProperties":false},"IntakeReceipt":{"type":"object","properties":{"reference":{"type":"string","pattern":"^GGS-[0-9A-Z]{6}$"},"status":{"type":"string","const":"submitted"},"revision":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"submittedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["reference","status","revision","submittedAt"],"additionalProperties":false},"ApiError":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_input","incomplete","idempotency_key_required","invalid_permit","revoked_permit","expired_permit","receipt_expired","permit_consumed","idempotency_conflict","in_progress","connected_review_required","input_too_large","unsupported_media_type","rate_limited","server_busy","api_inactive","internal_error","receipt_not_found","validation_failed"]},"message":{"type":"string"},"fields":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"array","items":{"type":"string"}}}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false,"examples":[{"error":{"code":"incomplete","message":"Include all required details and documents.","fields":{"documents.photo":["Include a passport-sized photo."]}}},{"error":{"code":"invalid_input","message":"Check the packet fields.","fields":{"student.dateOfBirth":["Please check the date of birth."]}}}]}}}}