Using The SMS API (2.1)

Using The SMS API (2.1)

Idea
Overview
The API enables your systems to connect automatically with your Student Management System (SMS).

Instead of entering data manually, the API allows different programs—such as enrolment systems, finance tools, or communication platforms—to exchange information directly with SMS.

Think of the API as a “messenger” that passes information between two systems. For example, when a finance system or communication tool connects with SMS, the API transfers messages, updates, or data automatically, without the need for manual input.

Using the API helps streamline operations, reduce duplicate data entry, and ensures that information remains accurate and up to date across all connected systems.

I. Authentication

Login

Overview
Authenticates the API user and returns a JWT token for use in subsequent API requests.
Property
Value
URL
Method
POST
Auth
None (this endpoint returns the token)

Fields
Field
Description
Required
Rules
Username
The API username (email address of the RTO admin user)
Yes
Must not be null or empty. Returns 401 Unauthorized if authentication fails.
lmsToken
The API token/key issued to the RTO for API access
Yes
Must not be null or empty/whitespace. Returns 401 Unauthorized if invalid or missing.
SubDomain
The RTO subdomain identifier (RTO number)
Yes
Must not be null or empty. Returns 401 Unauthorized if the combination of Username + lmsToken + SubDomain does not match a valid RTO.

Example of Request and Response
Request:
Content-Type: application/json
{
  "Username": "admin@mytraining.edu.au",
  "lmsToken": "abc123def456ghi789",
  "SubDomain": "mytraining"
}
Response (Success):
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJydG9OdW1iZXIiOiJteXRyYWluaW5nIiwidXNlcklkIjoiMTIzIiwicm9sZSI6IkFkbWluIiwiZXhwIjoxNzE2MzI5NjAwfQ.signature"
}
Response (Failure — invalid credentials):
HTTP 401 Unauthorized



Check Student Login

Overview
Validates a student's login credentials and returns their student details if authentication is successful.
Property
Value
URL
https://api.rto.net.au/api/Student/login
MethodPOST
AuthThis API function needs a valid token added to the HTTP header for authorization

Fields
FieldDescriptionRequiredRules
EmailThe student's email addressYesMust be a valid email. Returns validation error if missing.
PasswordThe student's passwordYesReturns validation error if missing
RTOThe RTO identifier/subdomainYesReturns validation error if missing. Returns empty object {} if credentials do not match.

Example of Request and Response
Request:
Content-Type: application/json
Authorization: Bearer {token}
{
  "Email": "john.smith@example.com",
  "Password": "SecurePass123!",
  "RTO": "mytraining"
}
Response (Success):
{
  "studentID": 12345,
  "studentName": "John",
  "studentSurname": "Smith",
  "studentEmail": "john.smith@example.com",
  "rto": "mytraining"
}
Response (Failure — invalid credentials):
{}



II. Student Management

Retrieve Student List

Overview
Retrieves a list of all students for the authenticated RTO.
Property
Value
URL
https://api.rto.net.au/api/Student
MethodGET
AuthThis API function needs a valid token added to the HTTP header for authorization

Fields
No query parameters required. The endpoint uses the authenticated user's RTO number from the token.

Example of Request and Response
Request:
Authorization: Bearer {token}
Response (Success):
{
  "columns": ["StudentID", "StudentName", "StudentSurname", "StudentEmail", "..."],
  "data": [
    [12345, "John", "Smith", "john@example.com", "..."],
    [12346, "Jane", "Doe", "jane@example.com", "..."]
  ]
}



Retrieve Single Student

Overview
Retrieves details of a single student by their student ID.
Property
Value
URL
https://api.rto.net.au/api/Student/{id}
MethodGET
AuthThis API function needs a valid token added to the HTTP header for authorization

Fields
FieldDescriptionRequiredRules
id (URL path))The student ID
YesMust be a valid student number belonging to the authenticated RTO.

Example of Request and Response
Request:
Authorization: Bearer {token}
Response (Success):
[
  {
    "studentID": 12345,
    "studentName": "John",
    "studentSurname": "Smith",
    "studentEmail": "john.smith@example.com",
    "studentMobileNumber": "0412345678",
    "studentDOB": "1995-03-15",
    "studentGender": "Male",
    "studentSuburb": "Melbourne",
    "studentPostCode": "3000",
    "studentState": "VIC"
  }
]



Retrieve Student Details By ID

Overview
Retrieves full student details including custom fields and previous qualifications via the ExternalEnrolment endpoint.
Property
Value
URL
https://api.rto.net.au/api/ExternalEnrolment/Student?id={studentId}
MethodGET
AuthThis API function needs a valid token added to the HTTP header for authorization

Fields
FieldDescriptionRequiredRules
id (query parameter)The student ID
YesMust be a valid student ID belonging to the authenticated RTO. Returns 404 Not Found if student does not exist.

Example of Request and Response
Request:
Authorization: Bearer {token}
Response (Success):
{
  "data": {
    "studentId": 12345,
    "studentEmail": "john.smith@example.com",
    "studentName": "John",
    "studentSurname": "Smith",
    "studentDOB": "1995-03-15T00:00:00",
    "studentGender": "Male",
    "studentMobileNumber": "0412345678",
    "studentSuburb": "Melbourne",
    "studentPostcode": "3000",
    "studentState": "VIC",
    "studentOverseas": "N",
    "rto": "mytraining",
    "previousQualifications": [],
    "xStudentPrioEducation": []
  },
  "customFields": [
    {
      "customFieldId": 1,
      "numberValue": null,
      "textValue": "Some value",
      "toggleValue": null,
      "dropDownValue": null,
      "fieldType": "Text",
      "multiSelectValue": null
    }
  ]
}
Response (Failure — student not found):
HTTP 404 Not Found



Adding New Student 

Overview
Creates a new student with comprehensive details including address, international student information, custom fields, previous qualifications, and more.
Property
Value
URL
https://api.rto.net.au/api/ExternalEnrolment/Student
MethodPOST
AuthThis API function needs a valid token added to the HTTP header for authorization

Fields
Personal Identity
FieldDescriptionRequiredRules
rto
RTO identifier
Yes
Must match authenticated tenant/RTO
studentTitle
Title
No
String
studentName
First name
Yes (observed)
String
studentPreferredName
Preferred name
No
String
studentMiddleName
Middle name
No
String
studentSurname
Surname
Yes (observed)
String
studentDOB
Date of birth
No
Sent as yyyy-mm-dd in API payload
studentGender
Gender
No
String/code
studentCountryOfBirthCountry of birthNoString

Authentication and Email
FieldDescriptionRequiredRules
studentEmailStudent emailYesValid email
studentPasswordStudent passwordYes (observed)String
studentEmailAltAlternative emailNoValid email
emailDuplicate email used by integrationYes (integration)Mirrors studentEmail
passwordDuplicate password used by integrationYes (integration)Mirrors studentPassword

Phone and Contact
FieldDescriptionRequiredRules
studentHomeNumberHome phoneNoString
studentMobileNumberMobile phoneNoString
studentWorkNumberWork phoneNoString

Residential Address
FieldDescriptionRequiredRules
studentPropertyNameProperty/building nameNoString
studentFlatNumberFlat/unit numberNoString
studentStreetNumberStreet numberNoString
studentStreetNameStreet nameNoString
studentSuburbSuburbNoString
studentPostcodePostcodeNoString
studentStateStateNoString/code
studentCountryOfResidenceCountry of residenceNoString

Postal Address
FieldDescriptionRequiredRules
chbPostalAddressSamePostal same as residential flagNoObserved value: on
studentPostalPropertyNamePostal property nameNoString
studentPostalFlatNumberPostal flat numberNoString
studentPostalStreetNumberPostal street numberNoString
studentPostalStreetNamePostal street nameNoString
studentPostalSuburbPostal suburbNoString
studentPostalPostcodePostal postcodeNoString
studentPostalStatePostal stateNoString/code

Schooling, Residency, and AVETMISS-style Profile
FieldDescriptionRequiredRules
studyReasonReason for studyNoString
PriorQualQuestionPrior qualification questionNoFlag/string
studentIsCurrentlyAttendingSchoolCurrently attending schoolNoFlag/string
studentSchoolTypeIDSchool type IDNoString/code
commencedWhileAtSchoolFlagCommenced while at schoolNoFlag/string
studentEducationSchoolLevelIdentifierSchool level identifierNoString/code
currentSchoolLevelIDCurrent school levelNoString/code
yearHighestSchoolHighest school year completedNoYear/string
yearLeftSchool
Year left school
No
Year/string
citizenResidentCode
Citizen/resident code
No
String/code
residencyStatus
Residency status
No
String/code
citizenshipEffectiveFromDate
Citizenship effective date
No
Date string
occupationIdentifier
Occupation identifier
No
String/code
clientOccupationIdentifier
Client occupation identifier
No
String/code
clientIndustryofEmployment
Industry of employment
No
String/code
studentIndividualEmploymentStaus
Employment status
No
String
studentIndividualIndigenousStaus
Indigenous status
No
String
studentIndividualMainLanguageSpokenAtHome
Main language at home
No
String/code
studentReferralSource
Referral source
No
String
isNewToVictorianEducationSystem
New to Victorian education system
No
Flag/string
victorianStudentNumber
VSN
No
String
saceID
SACE ID
No
String
schoolLocationID
School location ID
No
String
educationIdentifier
Education identifier
No
String
learnerUniqueIdentifier
Learner unique identifier
No
String
studentUniqueStudentIdentifier
USI
No
String
programEnrolmentIdentifier
Program enrolment identifier
No
String

Disability and Health
FieldDescriptionRequiredRules
disabilityQuestionDisability questionNoFlag/String
disabilityOptionsDisability option codesNoArray of codes
disabilityEffectiveFromDateDisability effective fromNoDate string
disabilityEffectiveToDateDisability effective toNoDate string
healthHealth cover indicatorNoFlag/String
studentHasOverseasHealthCoverHas overseas health coverNoFlag/String
studentHealthCoverInsurerNameHealth cover insurerNoString
studentHealthCoverMemberNumberHealth cover membership no.NoString
studentHealthCoverExpiryDate
Health cover expiry date
No
Date string

Emergency and Guardian
FieldDescriptionRequiredRules
studentRegWelfareEmergencyContactEmergency contact nameNoString
studentRegWelfareRelationshipEmergency contact relationshipNoString
studentRegWelfareEmailEmergency contact emailNoValid email
studentRegWelfareMobilePhoneEmergency contact mobileNoString
studentGuardianFirstNameGuardian first nameNoString
studentGuardianSurnameGuardian surnameNoString
studentGuardianEmailGuardian emailNoValid email
studentGuardianPhoneGuardian phoneNoString

International / Passport / Visa / English
FieldDescriptionRequiredRules
studentOverseasOverseas student flagNoObserved values: Y/N
studentPassportStatusPassport statusNoString/flag
studentIssuedByPassport issued byNoString
studentPassportNumberPassport numberNoString
studentPassportExpiryDatePassport expiry dateNoDate string
visaVisa flagNoString/flag
studentHasCurrentVisaHas current visaNoString/flag
studentVisaTypeVisa typeNoString
studentVisaStatus
Visa status
No
String
studentVisaNumber
Visa number
No
String
studentVisaExpiryDate
Visa expiry date
No
Date string
studentVisaCurrentlyInAustralia
Currently in Australia
No
String/flag
studentEnroledWithOtherProvider
Enrolled with other provider
No
String/flag
studentVisaCountryofLodgement
Visa country of lodgement
No
Nullable string
studentVisaCityofLodgement
Visa city of lodgement
No
Nullable string
studentInternationalRefusedVisa
Visa refusal history
No
Nullable string/flag
english
English indicator
No
String/flag
studentCompletedEnglishTest
Completed English test
No
String/flag
studentInternationalEnglishTest
English test type
No
String
studentInternationalEnglishTestScore
English test score
No
String/number
studentInternationalEnglishTestDate
English test date
No
Date string
studentInternationalEnglishTestProposedDate
Proposed English test date
No
Date string
studentInternationalEnglishSkills
English skills
No
Nullable string
studentInternationalEnglishatHome
English at home
No
Nullable string

Education History and Credits
FieldDescriptionRequiredRules
qualificationQualification flagNoString/flag
studentInternationalRequestedCourseCreditsRequested course creditsNoString
previousQualificationsPrevious qualification entriesNoArray of objects
previousEducationPrevious education flagNoString/flag
xStudentPrioEducationPrior education entriesNoArray of objects with priorEducationId and recognitionId
customFieldsCustom field valuesNoArray

Example of Request and Response
Request:
Content-Type: application/json
Authorization: Bearer {token}
{
  "storeId": 1,
  "_token": "RL53JQlBmI04st1w3wfuVjchsdPna3d1idqwe1v6",
  "rto": "sms",

  "studentTitle": "Mr",
  "studentName": "API",
  "studentPreferredName": "API",
  "studentMiddleName": "Doc",
  "studentSurname": "Documentation",
  "studentEmail": "api.documentation@local.com",
  "studentEmailAlt": "alternative.email@local.com",
  "studentPassword": "Pa$$w0rd!",
  "password": "Pa$$w0rd!",
  "studentDOB": "2016-05-05",
  "studentGender": "O",
  "studentCountryOfBirth": "Africa, nfd",

  "studentHomeNumber": "+639176321411",
  "studentMobileNumber": "+639176321411",
  "studentWorkNumber": "+639176321411",

  "studentPropertyName": "Guy Kirkland",
  "studentFlatNumber": "955",
  "studentStreetNumber": "222",
  "studentStreetName": "BBB",
  "studentSuburb": "CCC",
  "studentPostcode": "1234",
  "studentState": "NT",
  "studentCountryOfResidence": "Philippines",

  "chbPostalAddressSame": "on",
  "studentPostalPropertyName": "Guy Kirkland",
  "studentPostalFlatNumber": "955",
  "studentPostalStreetNumber": "222",
  "studentPostalStreetName": "BBB",
  "studentPostalSuburb": "CCC",
  "studentPostalPostcode": "1234",
  "studentPostalState": "NT",
  "studentPostalCountryOfResidence": "Philippines",

  "studyReason": "To get a job",
  "PriorQualQuestion": "Y",
  "studentIsCurrentlyAttendingSchool": "1",
  "studentSchoolTypeID": "25",
  "commencedWhileAtSchoolFlag": "Y",
  "studentEducationSchoolLevelIdentifier": "Year 12 or equivalent",
  "currentSchoolLevelID": "08 - Currently enrolled in year 8 or below",
  "yearHighestSchool": "2018",
  "yearLeftSchool": "2018",
  "citizenResidentCode": "3",
  "residencyStatus": "17",
  "citizenshipEffectiveFromDate": "2026-05-14",
  "occupationIdentifier": "1",
  "clientOccupationIdentifier": "1",
  "clientIndustryofEmployment": "Q",
  "studentIndividualEmploymentStaus": "Unemployed – seeking part-time work",
  "studentIndividualIndigenousStaus": "Yes, Torres Strait Islander",
  "studentIndividualMainLanguageSpokenAtHome": "1201",
  "studentReferralSource": "Laboris quidem reici",
  "isNewToVictorianEducationSystem": "Y",
  "victorianStudentNumber": "88888888",
  "saceID": "SACEID111",
  "schoolLocationID": "SLID111",
  "educationIdentifier": "EID111",
  "learnerUniqueIdentifier": "LUID111",
  "studentUniqueStudentIdentifier": "ETFACERE",
  "programEnrolmentIdentifier": "1234abcd",

  "disabilityQuestion": "Y",
  "disabilityOptions": ["19"],
  "disabilityEffectiveFromDate": "2026-05-12",
  "disabilityEffectiveToDate": "2026-05-19",

  "health": "yes",
  "studentHasOverseasHealthCover": "yes",
  "studentHealthCoverInsurerName": "Test",
  "studentHealthCoverMemberNumber": "1111111111111",
  "studentHealthCoverExpiryDate": "2026-05-08",

  "studentRegWelfareEmergencyContact": "John Doe",
  "studentRegWelfareRelationship": "Friend",
  "studentRegWelfareEmail": "johndoe@email.com",
  "studentRegWelfareMobilePhone": "+639182910290",
  "studentGuardianFirstName": "Guardian",
  "studentGuardianSurname": "Surname",
  "studentGuardianEmail": "guardian.email@local.com",
  "studentGuardianPhone": "+63 917 632 1411",

  "studentOverseas": "Y",
  "studentPassportStatus": "yes",
  "studentIssuedBy": "Test",
  "studentPassportNumber": "1234567",
  "studentPassportExpiryDate": "2026-05-01",
  "visa": "yes",
  "studentHasCurrentVisa": "yes",
  "studentVisaType": "Bridging",
  "studentVisaStatus": "Issued",
  "studentVisaNumber": "12334555",
  "studentVisaExpiryDate": "2026-05-21",
  "studentVisaCurrentlyInAustralia": "yes",
  "studentEnroledWithOtherProvider": "yes",
  "studentVisaCountryofLodgement": null,
  "studentVisaCityofLodgement": null,
  "studentInternationalRefusedVisa": null,

  "english": "1",
  "studentCompletedEnglishTest": "1",
  "studentInternationalEnglishTest": "IELTS",
  "studentInternationalEnglishTestScore": "87",
  "studentInternationalEnglishTestDate": "2026-05-28",
  "studentInternationalEnglishTestProposedDate": "2026-05-28",
  "studentInternationalEnglishSkills": null,
  "studentInternationalEnglishatHome": null,

  "qualification": "yes",
  "studentInternationalRequestedCourseCredits": "Test",
  "previousEducation": "yes",
  "previousQualifications": [
    {
      "qualification": "Qualification",
      "institute": "Institute",
      "country": "Aruba",
      "completionDate": "2026-05-06"
    }
  ],
  "xStudentPrioEducation": [
    { "priorEducationId": "008", "recognitionId": "A" },
    { "priorEducationId": "410", "recognitionId": "E" },
    { "priorEducationId": "420", "recognitionId": "I" }
  ],
  "customFields": [],

  "Please_Select_Who_You_Would_Like_to_Be_Invoiced": "1",
  "companyId": null,
  "abn": null,
  "businessName": null,
  "tradingName": null,
  "acn": null,
  "mainContactEmail": null,
  "billingEmail": null,
  "billingContactName": null,
  "billingContactPhoneNo": null,
  "purchaseOrderNumber": null
}

Response (Success):
{
  "success": true,
  "msg": null,
  "newId": 67890
}
Response (Failure — email exists):
{
  "success": false,
  "msg": "Email already exists",
  "newId": 0
}
Response (Failure — invalid RTO):
{
  "success": false,
  "msg": "Invalid RTO field",
  "newId": 0
}



Update Student

Overview
Updates an existing student with comprehensive details including address, international student information, custom fields, and previous qualifications.
Property
Value
URL
https://api.rto.net.au/api/ExternalEnrolment/Student
MethodPUT
AuthThis API function needs a valid token added to the HTTP header for authorization

Fields
Personal Identity
FieldDescriptionRequiredRules
rtoRTO identifierYesMust match authenticated tenant/RTO
studentId
The student ID to update
Yes
Must be a valid student ID.
studentTitleTitleNoString
studentNameFirst nameYes (observed)String
studentPreferredNamePreferred nameNoString
studentMiddleNameMiddle nameNoString
studentSurnameSurnameYes (observed)String
studentDOBDate of birthNoSent as yyyy-mm-dd in API payload
studentGenderGenderNoString/code
studentCountryOfBirthCountry of birthNoString

Authentication and Email
FieldDescriptionRequiredRules
studentEmailStudent emailYesValid email
studentPasswordStudent passwordYes (observed)String
studentEmailAltAlternative emailNoValid email
emailDuplicate email used by integrationYes (integration)Mirrors studentEmail
passwordDuplicate password used by integrationYes (integration)Mirrors studentPassword

Phone and Contact
FieldDescriptionRequiredRules
studentHomeNumberHome phoneNoString
studentMobileNumberMobile phoneNoString
studentWorkNumberWork phoneNoString

Residential Address
FieldDescriptionRequiredRules
studentPropertyNameProperty/building nameNoString
studentFlatNumberFlat/unit numberNoString
studentStreetNumberStreet numberNoString
studentStreetNameStreet nameNoString
studentSuburbSuburbNoString
studentPostcodePostcodeNoString
studentStateStateNoString/code
studentCountryOfResidenceCountry of residenceNoString

Postal Address
FieldDescriptionRequiredRules
chbPostalAddressSamePostal same as residential flagNoObserved value: on
studentPostalPropertyNamePostal property nameNoString
studentPostalFlatNumberPostal flat numberNoString
studentPostalStreetNumberPostal street numberNoString
studentPostalStreetNamePostal street nameNoString
studentPostalSuburbPostal suburbNoString
studentPostalPostcodePostal postcodeNoString
studentPostalStatePostal stateNoString/code

Schooling, Residency, and AVETMISS-style Profile
FieldDescriptionRequiredRules
studyReasonReason for studyNoString
PriorQualQuestionPrior qualification questionNoFlag/string
studentIsCurrentlyAttendingSchoolCurrently attending schoolNoFlag/string
studentSchoolTypeIDSchool type IDNoString/code
commencedWhileAtSchoolFlagCommenced while at schoolNoFlag/string
studentEducationSchoolLevelIdentifierSchool level identifierNoString/code
currentSchoolLevelIDCurrent school levelNoString/code
yearHighestSchoolHighest school year completedNoYear/string
yearLeftSchoolYear left schoolNoYear/string
citizenResidentCodeCitizen/resident codeNoString/code
residencyStatusResidency statusNoString/code
citizenshipEffectiveFromDateCitizenship effective dateNoDate string
occupationIdentifierOccupation identifierNoString/code
clientOccupationIdentifierClient occupation identifierNoString/code
clientIndustryofEmploymentIndustry of employmentNoString/code
studentIndividualEmploymentStausEmployment statusNoString
studentIndividualIndigenousStausIndigenous statusNoString
studentIndividualMainLanguageSpokenAtHomeMain language at homeNoString/code
studentReferralSourceReferral sourceNoString
isNewToVictorianEducationSystemNew to Victorian education systemNoFlag/string
victorianStudentNumberVSNNoString
saceIDSACE IDNoString
schoolLocationIDSchool location IDNoString
educationIdentifierEducation identifierNoString
learnerUniqueIdentifierLearner unique identifierNoString
studentUniqueStudentIdentifierUSINoString
programEnrolmentIdentifier
Program enrolment identifierNoString

Disability and Health
FieldDescriptionRequiredRules
disabilityQuestionDisability questionNoFlag/String
disabilityOptionsDisability option codesNoArray of codes
disabilityEffectiveFromDateDisability effective fromNoDate string
disabilityEffectiveToDateDisability effective toNoDate string
healthHealth cover indicatorNoFlag/String
studentHasOverseasHealthCoverHas overseas health coverNoFlag/String
studentHealthCoverInsurerNameHealth cover insurerNoString
studentHealthCoverMemberNumberHealth cover membership no.NoString
studentHealthCoverExpiryDateHealth cover expiry dateNoDate string

Emergency and Guardian
FieldDescriptionRequiredRules
studentRegWelfareEmergencyContactEmergency contact nameNoString
studentRegWelfareRelationshipEmergency contact relationshipNoString
studentRegWelfareEmailEmergency contact emailNoValid email
studentRegWelfareMobilePhoneEmergency contact mobileNoString
studentGuardianFirstNameGuardian first nameNoString
studentGuardianSurnameGuardian surnameNoString
studentGuardianEmailGuardian emailNoValid email
studentGuardianPhoneGuardian phoneNoString

International / Passport / Visa / English
FieldDescriptionRequiredRules
studentOverseasOverseas student flagNoObserved values: Y/N
studentPassportStatusPassport statusNoString/flag
studentIssuedByPassport issued byNoString
studentPassportNumberPassport numberNoString
studentPassportExpiryDatePassport expiry dateNoDate string
visaVisa flagNoString/flag
studentHasCurrentVisaHas current visaNoString/flag
studentVisaTypeVisa typeNoString
studentVisaStatusVisa statusNoString
studentVisaNumberVisa numberNoString
studentVisaExpiryDateVisa expiry dateNoDate string
studentVisaCurrentlyInAustraliaCurrently in AustraliaNoString/flag
studentEnroledWithOtherProviderEnrolled with other providerNoString/flag
studentVisaCountryofLodgementVisa country of lodgementNoNullable string
studentVisaCityofLodgementVisa city of lodgementNoNullable string
studentInternationalRefusedVisaVisa refusal historyNoNullable string/flag
englishEnglish indicatorNoString/flag
studentCompletedEnglishTestCompleted English testNoString/flag
studentInternationalEnglishTestEnglish test typeNoString
studentInternationalEnglishTestScoreEnglish test scoreNoString/number
studentInternationalEnglishTestDateEnglish test dateNoDate string
studentInternationalEnglishTestProposedDateProposed English test dateNoDate string
studentInternationalEnglishSkillsEnglish skillsNoNullable string
studentInternationalEnglishatHomeEnglish at homeNoNullable string

Education History and Credits
FieldDescriptionRequiredRules
qualificationQualification flagNoString/flag
studentInternationalRequestedCourseCreditsRequested course creditsNoString
previousQualificationsPrevious qualification entriesNoArray of objects
previousEducationPrevious education flagNoString/flag
xStudentPrioEducationPrior education entriesNoArray of objects with priorEducationId and recognitionId
customFieldsCustom field valuesNoArray

Query Parameters
ParameterDescriptionRequiredRules
ensureContactExistsIf true, creates a contact record for the student if one doesn't existNoBoolean, defaults to false

Example of Request and Response
Request:
Content-Type: application/json
Authorization: Bearer {token}
{
"rto": "sms",
"studentId": 429242,
"studentTitle": "Mr",
"studentName": "API",
"studentPreferredName": "API",
"studentMiddleName": "Doc",
"studentSurname": "Documentation",
"studentEmail": "api.documentation@local.com",
"studentEmailAlt": "alternative.email@local.com",
"studentDOB": "2016-05-05",
"studentGender": "O",
"studentCountryOfBirth": "Africa, nfd",
"studentHomeNumber": "+639176321411",
"studentMobileNumber": "+639176321411",
"studentWorkNumber": "+639176321411",
"studentPropertyName": "Guy Kirkland",
"studentFlatNumber": "955",
"studentStreetNumber": "222",
"studentStreetName": "BBB",
"studentSuburb": "CCC",
"studentPostcode": "1234",
"studentState": "NT",
"studentCountryOfResidence": "Philippines",
"chbPostalAddressSame": "on",
"studentPostalPropertyName": "Guy Kirkland",
"studentPostalFlatNumber": "955",
"studentPostalStreetNumber": "222",
"studentPostalStreetName": "BBB",
"studentPostalSuburb": "CCC",
"studentPostalPostcode": "1234",
"studentPostalState": "NT",
"studentPostalCountryOfResidence": "Philippines",
"studyReason": "To get a job",
"PriorQualQuestion": "Y",
"studentIsCurrentlyAttendingSchool": "1",
"studentSchoolTypeID": "25",
"commencedWhileAtSchoolFlag": "Y",
"studentEducationSchoolLevelIdentifier": "Year 12 or equivalent",
"currentSchoolLevelID": "08 - Currently enrolled in year 8 or below",
"yearHighestSchool": "2018",
"yearLeftSchool": "2018",
"citizenResidentCode": "3",
"residencyStatus": "17",
"citizenshipEffectiveFromDate": "2026-05-14",
"occupationIdentifier": "1",
"clientOccupationIdentifier": "1",
"clientIndustryofEmployment": "Q",
"studentIndividualEmploymentStaus": "Unemployed – seeking part-time work",
"studentIndividualIndigenousStaus": "Yes, Torres Strait Islander",
"studentIndividualMainLanguageSpokenAtHome": "1201",
"studentReferralSource": "Laboris quidem reici",
"disabilityQuestion": "Y",
"disabilityOptions": ["19"],
"disabilityEffectiveFromDate": "2026-05-12",
"disabilityEffectiveToDate": "2026-05-19",
"studentRegWelfareEmergencyContact": "John Doe",
"studentRegWelfareRelationship": "Friend",
"studentRegWelfareEmail": "johndoe@email.com",
"studentRegWelfareMobilePhone": "+639182910290",
"studentGuardianFirstName": "Guardian",
"studentGuardianSurname": "Surname",
"studentGuardianEmail": "guardian.email@local.com",
"studentGuardianPhone": "+63 917 632 1411",
"studentOverseas": "Y",
"studentPassportStatus": "yes",
"studentIssuedBy": "Test",
"studentPassportNumber": "1234567",
"studentPassportExpiryDate": "2026-05-01",
"visa": "yes",
"studentHasCurrentVisa": "yes",
"studentVisaType": "Bridging",
"studentVisaStatus": "Issued",
"studentVisaNumber": "12334555",
"studentVisaExpiryDate": "2026-05-21",
"studentVisaCurrentlyInAustralia": "yes",
"studentEnroledWithOtherProvider": "yes",
"studentVisaCountryofLodgement": null,
"studentVisaCityofLodgement": null,
"studentInternationalRefusedVisa": null,
"english": "1",
"studentCompletedEnglishTest": "1",
"studentInternationalEnglishTest": "IELTS",
"studentInternationalEnglishTestScore": "87",
"studentInternationalEnglishTestDate": "2026-05-28",
"studentInternationalEnglishTestProposedDate": "2026-05-28",
"studentInternationalEnglishSkills": null,
"studentInternationalEnglishatHome": null,
"health": "yes",
"studentHasOverseasHealthCover": "yes",
"studentHealthCoverInsurerName": "Test",
"studentHealthCoverMemberNumber": "1111111111111",
"studentHealthCoverExpiryDate": "2026-05-08",
"qualification": "yes",
"studentInternationalRequestedCourseCredits": "Test",
"previousQualifications": [
{
"qualification": "Qualification",
"institute": "Institute",
"country": "Aruba",
"completionDate": "2026-05-06"
}
],
"previousEducation": "yes",
"xStudentPrioEducation": [
{ "priorEducationId": "008", "recognitionId": "A" },
{ "priorEducationId": "410", "recognitionId": "E" },
{ "priorEducationId": "420", "recognitionId": "I" }
],
"isNewToVictorianEducationSystem": "Y",
"victorianStudentNumber": "88888888",
"saceID": "SACEID111",
"learnerUniqueIdentifier": "LUID111",
"schoolLocationID": "SLID111",
"educationIdentifier": "EID111",
"programEnrolmentIdentifier": "1234abcd",
"Please_Select_Who_You_Would_Like_to_Be_Invoiced": "1",
"companyId": null,
"abn": null,
"businessName": null,
"tradingName": null,
"acn": null,
"mainContactEmail": null,
"billingEmail": null,
"billingContactName": null,
"billingContactPhoneNo": null,
"purchaseOrderNumber": null,
"customFields": []
}

Response (Success):
{
  "success": true,
  "msg": null,
  "newId": 0
}
Response (Failure — email exists):
{
  "success": false,
  "msg": "Email already exists",
  "newId": 0
}



Retrieve Student Profile Image

Overview
Retrieves the profile image for a student. Returns a default placeholder image if no profile image has been uploaded.
Property
Value
URL
https://api.rto.net.au/api/ExternalEnrolment/ProfileImage?studentId={id}
MethodGET
AuthThis API function needs a valid token added to the HTTP header for authorization

Fields
FieldDescriptionRequiredRules
studentId (query parameter)The student ID
YesMust be >= 1. Student must belong to the authenticated RTO. Returns 401 Unauthorized if student belongs to a different RTO.

Example of Request and Response
Request:
Authorization: Bearer {token}
Response (Success):
HTTP 200 OK
Content-Type: image/png
[Binary image data]



Upload Student Profile Image

Overview
Uploads or replaces the profile image for a student. The image is stored as a PNG file.
Property
Value
URL
https://api.rto.net.au/api/ExternalEnrolment/ProfileImage
MethodPOST
AuthThis API function needs a valid token added to the HTTP header for authorization
Content-Type
multipart/form-data

Fields
FieldDescriptionRequiredRules
studentIdThe student ID
YesMust be >= 1. Student must belong to the authenticated RTO. Returns 401 Unauthorized if student belongs to a different RTO.
image
The image file
Yes
Must be a valid file upload (IFormFile).

Example of Request and Response
Request:
Content-Type: multipart/form-data
Authorization: Bearer {token}
--boundary
Content-Disposition: form-data; name="studentId"
12345
--boundary
Content-Disposition: form-data; name="image"; filename="profile.png"
Content-Type: image/png
[Binary image data]
--boundary--
Response (Success):
HTTP 200 OK



Checking Student Exists By Email

Overview
Checks whether a student with the given email already exists for the specified RTO.
Property
Value
URL
https://api.rto.net.au/api/Student/ExistsByEmail
MethodPOST
AuthThis API function needs a valid token added to the HTTP header for authorization

Fields
FieldDescriptionRequiredRules
EmailThe email address to checkYesString
RtoThe RTO identifierYesString

Example of Request and Response
Request:
Content-Type: application/json
Authorization: Bearer {token}
{
  "Email": "john.smith@example.com",
  "Rto": "mytraining"
}
Response (Student exists):
true
Response (Student does not exist):
false



III. Enrolment

Add Student Enrolment (Full — with Payment/Invoicing)

Overview
Creates a full enrolment with support for payment processing references (Stripe/Payrix), invoice to employer company, custom fields, and voucher codes.
Notes: If no payment plan id passed, it will use the first payment plan of the related program instance. 
If Voucher is passed it will use the Voucher if the Voucher is valid. 
Property
Value
URL
https://api.rto.net.au/api/Enrolment/New
MethodPOST
AuthThis API function needs a valid token added to the HTTP header for authorization

Fields
FieldDescriptionRequiredRules
studentNumberThe student IDYesMust be >= 1. Returns 404 Not Found if student doesn't exist in the RTO.
groupIDThe group ID to enrol intoYesMust be >= 1.
rtoIDThe RTO identifierYesMust match the authenticated user's RTO. Returns { "success": false, "msg": "Invalid rtoID field" } if mismatched.
paymentPlanIDPayment plan IDNoMust be >= 1 if provided.
customerIdStripe customer IDConditionalRequired when paymentReference is provided and RTO uses Stripe. Returns "customerId is required" if missing.
cardIdStripe card/payment method IDConditionalRequired when paymentReference is provided and RTO uses Stripe. Returns "cardId is required" if missing.
paymentReferencePayment transaction reference (Stripe charge ID or Payrix transaction ID)NoIf provided, triggers payment processing flow.
voucherCodeVoucher/discount codeNoApplied during payment processing if provided.
studyReasonReason for studyNoString
studentSchoolTypeIDSchool type identifierNoString
schoolLocationIdSchool location identifierNoString
saceIdSACE identifierNoString
currentSchoolLevelIdCurrent school levelNoString
customFieldsArray of custom field valuesNoArray of { customFieldId, textValue/numberValue/toggleValue } objects
invoiceToCompany invoicing detailsNoObject — see sub-fields below

invoiceTo Sub-fields (for company invoicing)
FieldDescriptionRequiredRules
companyIdExisting company ID to invoiceConditionalIf provided and > 0, company must exist and belong to same RTO. Returns "CompanyId doesn't exists" if invalid.
abnABN for new companyConditionalRequired if companyId is not provided. Must not already exist. Returns "ABN alredy exists" if duplicate.
businessNameBusiness nameConditionalRequired if creating new company (no companyId). Returns "BusinessName is required" if missing.
tradingNameTrading nameNoString
acnACN numberNoString
mainContactEmailMain contact emailConditionalRequired if creating new company. Returns "MainContactEmail is required" if missing.
billingEmailBilling emailConditionalRequired if creating new company. Returns "BillingEmail is required" if missing.
billingContactNameBilling contact nameConditionalRequired if creating new company. Returns "BillingContactName is required" if missing.
billingContactPhoneNoBilling contact phoneConditionalRequired if creating new company. Returns "BillingContactPhoneNo is required" if missing.
purchaseOrderNoPurchase order numberNoString

Example of Request and Response
Request (with payment):
Content-Type: application/json
Authorization: Bearer {token}
{
  "studentNumber": 12345,
  "groupID": 100,
  "rtoID": "mytraining",
  "paymentReference": "pi_3abc123def456",
  "customerId": "cus_ABC123",
  "cardId": "pm_XYZ789",
  "voucherCode": "DISCOUNT20",
  "studyReason": "Career development",
  "customFields": [
    {
      "customFieldId": 5,
      "textValue": "Employer referral"
    }
  ]
}
Request (with company invoice):
Content-Type: application/json
Authorization: Bearer {token}
{
  "studentNumber": 12345,
  "groupID": 100,
  "rtoID": "mytraining",
  "invoiceTo": {
    "companyId": 500
  }
}
Response (Success):
{
  "success": true,
  "msg": null,
  "newId": 99001
}
Response (Failure — invalid RTO):
{
  "success": false,
  "msg": "Invalid rtoID field",
  "newId": 0
}



Retrieve Student Enrolments

Overview
Retrieves all enrolments for a specific student.
Property
Value
URL
https://api.rto.net.au/api/StudentEnrolments/{studentId}
MethodGET
AuthThis API function needs a valid token added to the HTTP header for authorization

Fields
FieldDescriptionRequiredRules
studentId (URL path or query)The student IDYesMust be a valid student number. Returns empty list if no enrolments found.

Example of Request and Response
Request:
Authorization: Bearer {token}
Response (Success):
{
  "enrolments": [
    {
      "enrolmentId": 98765,
      "studentNumber": 12345,
      "qualificationCode": "BSB50420",
      "qualificationName": "Diploma of Leadership and Management",
      "enrolmentStatus": "Enrolled",
      "startDate": "2024-01-15",
      "endDate": "2025-01-15",
      "groupName": "2024 Q1 Intake"
    }
  ]
}



Update Enrolment Status

Overview
Updates the status of an enrolment with validation to ensure the status exists and the enrolment belongs to the authenticated RTO.
Property
Value
URL
https://api.rto.net.au/api/Enrolment/Status
MethodPUT
AuthThis API function needs a valid token added to the HTTP header for authorization

Fields
FieldDescriptionRequiredRules
enrolmentIdThe enrolment ID to updateYesMust be >= 1. Enrolment must belong to the authenticated RTO. Returns 403 Forbidden with "Enrolment does not belong to RTO" if invalid.
enrolmentStatusThe new status to setYesMust not be empty. Must be a valid status configured for the RTO. Returns "Enrolment Status is not valid" (400) if the status doesn't exist. If already set to this status, returns success without making changes.

Example of Request and Response
Request:
Content-Type: application/json
Authorization: Bearer {token}
{
  "enrolmentId": 98765,
  "enrolmentStatus": "Completed"
}
Response (Success):
{
  "success": true,
  "msg": null,
  "newId": 0
}
Response (Failure — invalid status):
HTTP 400 Bad Request
"Enrolment Status is not valid"
Response (Failure — wrong RTO):
HTTP 403 Forbidden
"Enrolment does not belong to RTO"



IV. Program Instance

Retrieve List of Program Instances

Overview
Retrieves the list of program instances (delivery modes/courses) available for an RTO. Program Instance must be active and has no invalid payment plans to be returned in the list. 
Property
Value
URL
https://api.rto.net.au/api/ProgramInstance?rtoId={rtoId}
MethodGET
AuthThis API function needs a valid token added to the HTTP header for authorization

Fields
FieldDescriptionRequiredRules
rtoId (query parameter)The RTO identifierYesRequired. Returns 400 Bad Request with ModelState errors if missing.

Example of Request and Response
Request:
Authorization: Bearer {token}
Response (Success):
[
  {
    "id": 101,
    "name": "BSB50420 - Diploma of Leadership and Management (Online)",
    "qualificationCode": "BSB50420",
    "qualificationName": "Diploma of Leadership and Management",
    "deliveryMode": "Online"
  },
  {
    "id": 102,
    "name": "CHC33021 - Certificate III in Individual Support (Classroom)",
    "qualificationCode": "CHC33021",
    "qualificationName": "Certificate III in Individual Support",
    "deliveryMode": "Classroom"
  }
]



V. Group

Add Group

Overview
Creates a new attendance group (intake/schedule group) for a program instance.
Property
Value
URL
https://api.rto.net.au/api/Group
MethodPOST
AuthThis API function needs a valid token added to the HTTP header for authorization

Fields
FieldDescriptionRequiredRules
GroupNameName of the groupYesMust not be null/empty/whitespace. Returns { "success": false, "msg": "Group Name is Required" }. Max 45 characters — returns { "success": false, "msg": "Group name is too long. Please use 45 characters or less." } if exceeded.
ProgramInstanceIdThe program instance (delivery mode) IDYesMust not be null/empty/whitespace. Returns { "success": false, "msg": "Program Instance Id is Required" }. Must be a valid ID — returns { "success": false, "msg": "Program Instance Id Invalid" } if not found.
ActiveWhether the group is active for enrolmentsNoBoolean. Defaults to false if not provided.
StartDateGroup start dateConditionalRequired for Intake-type program instances. Returns { "success": false, "msg": "Start Date is Required for a Group that is Intake Related" }. Format: date string (e.g., "2024-02-01").
EndDateGroup end dateConditionalRequired for Intake-type program instances. Returns { "success": false, "msg": "End Date is Required for a Group that is Intake Related" }. Must not be before StartDate — returns { "success": false, "msg": "End Date cannot be less than Start Date" }.
AutoRemoveAuto-remove from waitlist optionNoMust be one of: "Max Students or Date", "Max Students", "Date Only", "Never", or empty string. Returns { "success": false, "msg": "Auto Remove Options is Invalid" } for invalid values.
MaxStudentsMaximum number of studentsConditionalRequired and must be > 0 when AutoRemove is "Max Students or Date" or "Max Students". Returns { "success": false, "msg": "Max Students is Required or Invalid" }.
PriorHoursHours prior to start date for auto-removalConditionalRequired and must be > 0 when AutoRemove is "Max Students or Date" or "Date Only". Returns { "success": false, "msg": "Remove Prior to Start is Required or Invalid" }.
LocationLocation identifier/nameYesMust not be null/empty/whitespace. Returns { "success": false, "msg": "Location is Required" }. Must be a valid location — returns { "success": false, "msg": "Location is Invalid" } if not found.
TrainersArray of trainer email addressesNoArray of strings. Each email must match a valid trainer in the RTO. Returns { "success": false, "msg": "Trainer not Valid" } if any email is invalid.

Example of Request and Response
Request:
Content-Type: application/json
Authorization: Bearer {token}
{
  "GroupName": "2024 Q2 Online Intake",
  "ProgramInstanceId": "101",
  "Active": true,
  "StartDate": "2024-04-01",
  "EndDate": "2025-03-31",
  "AutoRemove": "Max Students",
  "MaxStudents": 30,
  "Location": "Melbourne Campus",
}
Response (Success):
{
  "success": true,
  "msg": "Group Successfully Added",
  "groupId": 250
}
Response (Failure — invalid program instance):
{
  "success": false,
  "msg": "Program Instance Id Invalid",
  "groupId": 0
}
Response (Failure — group name too long):
{
  "success": false,
  "msg": "Group name is too long. Please use 45 characters or less.",
  "groupId": 0
}
Response (Failure — invalid trainer):
{
  "success": false,
  "msg": "Trainer not Valid",
  "groupId": 0
}



Update Group

Overview
Updates an existing attendance group. Only fields that are provided will be updated; omitted fields retain their existing values.
Property
Value
URL
https://api.rto.net.au/api/Group
MethodPUT
AuthThis API function needs a valid token added to the HTTP header for authorization

Fields
FieldDescriptionRequiredRules
GroupId
The ID of the group to update
Yes
Must not be null/empty. Returns { "success": false, "msg": "Group Id is Required" }. Must be a valid group — returns { "success": false, "msg": "Invalid Group Id" } if not found.
GroupNameUpdated group nameYesIf provided, must not be empty — returns { "success": false, "msg": "Group Name is Required" }. Max 45 characters — returns { "success": false, "msg": "Group name is too long. Please use 45 characters or less." }.
ProgramInstanceIdUpdated program instance IDNoIf provided, must not be empty — returns { "success": false, "msg": "Program Instance Id is Required" }. Cannot be changed if students are enrolled — returns { "success": false, "msg": "Program Instance cannot be changed for the Group" }. Must be valid — returns { "success": false, "msg": "Program Instance Id Invalid" }.
ActiveWhether the group is active NoBoolean. Retains existing value if omitted.
StartDateGroup start dateNoRequired for Intake-type if program instance is being set. Returns { "success": false, "msg": "Start Date is Required for a Group that is Intake Related" }.
EndDateGroup end dateNoRequired for Intake-type if program instance is being set. Returns { "success": false, "msg": "End Date is Required for a Group that is Intake Related" }. Must not be before StartDate — returns { "success": false, "msg": "End Date cannot be less than Start Date" }.
AutoRemoveAuto-remove optionNoSame rules as Add Group. Returns { "success": false, "msg": "Auto Remove Options is Invalid" } for invalid values.
MaxStudentsMaximum studentsConditionalSame rules as Add Group.
PriorHoursPrior hours for auto-removalConditionalSame rules as Add Group.
LocationLocation identifierNoIf provided, must not be empty — returns { "success": false, "msg": "Location is Required" }. Must be valid — returns { "success": false, "msg": "Location is Invalid" }.
AddTrainersArray of trainer emails to addNoEach email must be a valid trainer. Returns { "success": false, "msg": "Trainer not Valid" } if invalid. Already-assigned trainers are skipped.
RemoveTrainers
Array of trainer emails to remove
No
Each email must be a valid trainer. Returns { "success": false, "msg": "Trainer not Valid" } if invalid.

Example of Request and Response
Request:
Content-Type: application/json
Authorization: Bearer {token}
{
  "GroupId": "250",
  "GroupName": "2024 Q2 Online Intake - Updated",
  "MaxStudents": 35,
  "AddTrainers": ["newtrainer@mytraining.edu.au"],
  "RemoveTrainers": ["oldtrainer@mytraining.edu.au"]
}
Response (Success):
{
  "success": true,
  "msg": "Group Successfully Updated",
  "groupId": 250
}
Response (Failure — invalid group):
{
  "success": false,
  "msg": "Invalid Group Id",
  "groupId": 0
}
Response (Failure — cannot change program instance):
{
  "success": false,
  "msg": "Program Instance cannot be changed for the Group",
  "groupId": 0
}



Retrieve List of Groups

Overview
Retrieves the list of groups (attendance groups) available for a specific program instance.
Property
Value
URL
https://api.rto.net.au/api/Group?programInstanceId={id}
MethodGET
AuthThis API function needs a valid token added to the HTTP header for authorization

Fields
FieldDescriptionRequiredRules
programInstanceId (query parameter)The program instance IDYesMust be a valid long integer. Returns 400 Bad Request if missing or invalid.

Example of Request and Response
Request:
Authorization: Bearer {token}
Response (Success):
{
  "programInstanceType": "Intake",
  "groups": [
    {
      "id": 250,
      "name": "2024 Q2 Online Intake",
      "startDate": "2024-04-01T00:00:00",
      "endDate": "2025-03-31T00:00:00",
      "location": "Melbourne Campus",
      "isWaitlist": false
    },
    {
      "id": 251,
      "name": "2024 Q3 Online Intake",
      "startDate": "2024-07-01T00:00:00",
      "endDate": "2025-06-30T00:00:00",
      "location": "Sydney Campus",
      "isWaitlist": true
    }
  ]
}



Retrieve Payment Plans/Invoice Options

Overview
Retrieves the list of payment plans/and therefore invoices that would be created, for a specific group.
Property
Value
URL
https://api.rto.net.au/api/Invoice?groupId={id}
MethodGET
AuthThis API function needs a valid token added to the HTTP header for authorization

Fields
FieldDescriptionRequiredRules
groupId (query parameter)The group IDYesMust be a valid long integer. Returns 400 Bad Request if missing or invalid.

Example of Request and Response
Request:
Authorization: Bearer {token}
Response (Success):
[
  {
    "invoiceId": 5001,
    "studentName": "John Smith",
    "amount": 2500.00,
    "status": "Paid",
    "dueDate": "2024-04-15"
  },
  {
    "invoiceId": 5002,
    "studentName": "Jane Doe",
    "amount": 2500.00,
    "status": "Pending",
    "dueDate": "2024-05-15"
  }
]



VI. Voucher

Retrieve Voucher

Overview
Validates and retrieves voucher/discount code details for specified program instances. Returns the voucher information if valid, or an empty object if not found.
Property
Value
URL
https://api.rto.net.au/api/Voucher
MethodGET
AuthThis API function needs a valid token added to the HTTP header for authorization
Content-Type
application/json (body required even though GET)

Fields
FieldDescriptionRequiredRules
codeThe voucher code to validateYesRequired. Returns 400 Bad Request if missing.
domainThe domain/website where the voucher is being appliedYesRequired. Returns 400 Bad Request if missing.
toIdentifierThe RTO identifierYesRequired. Returns 400 Bad Request if missing.
programInstancesArray of program instance IDs to check the voucher againstYesRequired, minimum 1 item. Returns 400 Bad Request if empty or missing.

InfoNOTE: This endpoint uses HttpGet with [FromBody] — the request body must be sent with a GET request.

Example of Request and Response
Request:
Content-Type: application/json
Authorization: Bearer {token}
{
  "code": "DISCOUNT20",
  "domain": "enrol.mytraining.edu.au",
  "toIdentifier": "mytraining",
  "programInstances": [101, 102]
}
Response (Success — voucher found):
{
  "code": "DISCOUNT20",
  "discountType": "Percentage",
  "discountValue": 20,
  "validFrom": "2024-01-01",
  "validTo": "2024-12-31",
  "applicableProgramInstances": [101]
}
Response (Voucher not found):
{}



VII.  Unit

Search Unit Results

Overview
Searches for unit results within a specified date range for a given enrolment.
Property
Value
URL
https://api.rto.net.au/api/SearchUnits
MethodGET
AuthThis API function needs a valid token added to the HTTP header for authorization

Fields
FieldDescriptionRequiredRules
EnrolIDThe enrolment ID to search units forYesMust be a valid enrolment ID (long integer).
StartDateStart date for the search rangeYesDate string format.
EndDateEnd date for the search rangeYesDate string format.

Example of Request and Response
Request:
Authorization: Bearer {token}
Response (Success):
{
  "success": true,
  "msg": null,
  "unitLst": [
    {
      "unitID": "BSBCMM411",
      "unitName": "Make presentations",
      "startDate": "2024-02-01",
      "endDate": "2024-03-15",
      "outcome": "Competent",
      "completionDate": "2024-03-10"
    },
    {
      "unitID": "BSBLDR523",
      "unitName": "Lead and manage effective workplace relationships",
      "startDate": "2024-03-01",
      "endDate": "2024-05-30",
      "outcome": "Not Yet Competent",
      "completionDate": null
    }
  ]
}
Response (Failure):
{
  "success": false,
  "msg": "System.Exception: ...",
  "unitLst": null
}



Update Unit Outcomes

Overview
Updates the outcome/status for a student's unit within an enrolment. Also triggers payment reminders if applicable.
Property
Value
URL
https://api.rto.net.au/api/StudentUnits/Outcome
MethodPUT
AuthThis API function needs a valid token added to the HTTP header for authorization

Fields
FieldDescriptionRequiredRules
enrolIDThe enrolment IDYesMust be a valid enrolment ID (long integer).
UnitCodeThe unit codeYesString — the unit code (e.g., "BSBCMM411").
outcomeIdentifierNationalThe unit outcomeNoString (e.g., "Competent", "Not Yet Competent").

Example of Request and Response
Request:
PUT /api/StudentUnits/Outcome
Content-Type: application/json
Authorization: Bearer {token}
{
  "enrolID": "12345",
  "UnitCode": "BSBWHS211",
  "outcomeIdentifierNational": "Competency achieved/pass"
}
Response (Success):
{
  "success": true,
  "msg": "67890",
}
Response (Failure):
{
  "success": false,
  "msg": "System.Exception: ...",
}



VIII. Company

Retrieve Company by ABN

Overview
Retrieves company details by ABN (Australian Business Number) for the authenticated RTO.
Property
Value
URL
https://api.rto.net.au/api/Company/ABN?abn={abn}
MethodGET
AuthThis API function needs a valid token added to the HTTP header for authorization

Fields
FieldDescriptionRequiredRules
abn (query parameter)The ABN to search forYesRequired. Returns 400 Bad Request if missing. Returns "Company is inactive" (400) if company exists but is inactive.

Example of Request and Response
Request:
Authorization: Bearer {token}
Response (Success — company found):
{
  "companyId": 500,
  "abn": "12345678901",
  "businessName": "Training Corp Pty Ltd",
  "tradingName": "Training Corp",
  "mainContactEmail": "accounts@trainingcorp.com.au",
  "billingEmail": "billing@trainingcorp.com.au",
  "billingContactName": "Jane Smith",
  "billingContactPhoneNo": "0398765432"
}
Response (Company not found — returns empty/default model):
{
  "companyId": 0,
  "abn": null,
  "businessName": null
}
Response (Failure — company inactive):
HTTP 400 Bad Request
"Company is inactive"



IX. Event / Schedule

Add Event

Overview
Creates a new schedule event (class session) with optional recurrence pattern. Supports single events, weekly recurring, and monthly recurring schedules.
Property
Value
URL
https://api.rto.net.au/api/Event/schedule
MethodPOST
AuthThis API function needs a valid token added to the HTTP header for authorization

Fields
FieldDescriptionRequiredRules
ScheduleGroupUnitsArray of group/unit associationsYesArray of objects with GroupId (long) and UnitCodes (array of strings). At least one group required.
TitleEvent titleYesMust not be empty.
LocationLocation name/identifierYesMust be a valid location for the RTO.
RoomRoom nameNoString
TrainerEmailsArray of trainer email addressesNoEach must be a valid trainer email. Returns error if invalid.
ColorDisplay color for the eventNoString (hex or named color)
StartDateTimeEvent start date and timeYesFormat: "yyyy-MM-dd HH:mm" or ISO 8601. Must not be empty.
EndDateTimeEvent end date and timeYesFormat: "yyyy-MM-dd HH:mm" or ISO 8601. Must not be empty. Must be after StartDateTime.
ScheduleHoursScheduled hoursNoFormat: "HH:mm"
CustomRecurrenceRecurrence typeNoOptions: "NoRecurrence", "WeeklyDay", "MonthlyDay".
NumberOfWeeksRecurringNumber of weeks to recurConditionalRequired for "WeeklyDay" recurrence. Integer > 0.
RecurrenceStartDateRecurrence start dateConditionalRequired for recurring events. Date string.
RecurrenceStopRepeatOnSpecificDateRecurrence end dateNoDate string
RecurrenceStartTimeDefault start time for recurring eventsConditionalFormat: "HH:mm"
RecurrenceEndTimeDefault end time for recurring eventsConditionalFormat: "HH:mm"
RecurrenceScheduleHoursDefault hours per recurring sessionNoFormat: "HH:mm"
DaysArray of weekly day entriesConditionalRequired for "WeeklyDay". Array of { Day, StartTime, EndTime, ScheduledHours }.
scheduleDaterecurEveryMonthly recurrence intervalConditionalRequired for "MonthlyDay". Integer (e.g., every N months).
monthlyDayWeekWhich week of monthConditionalRequired for "MonthlyDay". Enum: First, Second, Third, Fourth, Last.
monthlyDayDayWhich day of weekConditionalRequired for "MonthlyDay". DayOfWeek enum value.

Example of Request and Response
Request (single event):
Content-Type: application/json
Authorization: Bearer {token}
{
  "ScheduleGroupUnits": [
    {
      "GroupId": 250,
      "UnitCodes": ["BSBCMM411", "BSBLDR523"]
    }
  ],
  "Title": "Leadership Workshop - Week 1",
  "Location": "Melbourne Campus",
  "Room": "Room 3A",
  "TrainerEmails": ["trainer1@mytraining.edu.au"],
  "Color": "#4285f4",
  "StartDateTime": "2024-04-01 09:00",
  "EndDateTime": "2024-04-01 17:00",
  "ScheduleHours": "08:00",
  "CustomRecurrence": "NoRecurrence"
}
Request (weekly recurring):
Content-Type: application/json
Authorization: Bearer {token}
{
  "ScheduleGroupUnits": [
    {
      "GroupId": 250,
      "UnitCodes": ["BSBCMM411"]
    }
  ],
  "Title": "Weekly Tutorial",
  "Location": "Melbourne Campus",
  "Room": "Room 2B",
  "TrainerEmails": ["trainer1@mytraining.edu.au"],
  "StartDateTime": "2024-04-01 10:00",
  "EndDateTime": "2024-04-01 12:00",
  "ScheduleHours": "02:00",
  "CustomRecurrence": "WeeklyDay",
  "NumberOfWeeksRecurring": 10,
  "RecurrenceStartDate": "2024-04-01",
  "RecurrenceStopRepeatOnSpecificDate": "2024-06-07",
  "Days": [
    { "Day": "Monday", "StartTime": "10:00", "EndTime": "12:00", "ScheduledHours": "02:00" },
    { "Day": "Wednesday", "StartTime": "14:00", "EndTime": "16:00", "ScheduledHours": "02:00" }
  ]
}
Response (Success):
{
  "success": true,
  "msg": "Schedule Successfully Added",
  "scheduleId": 3001
}
Response (Failure):
{
  "success": false,
  "msg": "Location is Invalid; Trainer not Valid",
  "scheduleId": 0
}



Update Event

Overview
Updates an existing schedule event. Supports updating a single instance, all future events, or all events in a recurrence series.
Property
Value
URL
https://api.rto.net.au/api/Event/schedule
MethodPUT
AuthThis API function needs a valid token added to the HTTP header for authorization

Fields
FieldDescriptionRequiredRules
EventId
The event/schedule ID to update
Yes
Must be a valid event ID.
UpdateOtherEvents
Scope of the update
No
1 = this instance only, 2 = all future events, 3 = all events in the occurrence. Defaults to this instance if omitted.
ScheduleGroupUnitsUpdated group/unit associationsNoArray of { GroupId, UnitCodes } objects.
TitleUpdated event titleNoString. If provided, must not be empty.
LocationUpdated locationNoMust be a valid location for the RTO.
RoomUpdated room NoString
TrainerEmailsUpdated trainer emailsNoEach must be a valid trainer.
ColorUpdated display colorNoString
StartDateTimeUpdated start date/timeNoFormat: "yyyy-MM-dd HH:mm". Must not be empty string if provided.
EndDateTimeUpdated end date/timeNoFormat: "yyyy-MM-dd HH:mm". Must not be empty string if provided. Must be after StartDateTime.
ScheduleHoursUpdated scheduled hoursNoFormat: "HH:mm"

Example of Request and Response
Request:
Content-Type: application/json
Authorization: Bearer {token}
{
  "EventId": 3001,
  "UpdateOtherEvents": 1,
  "Title": "Leadership Workshop - Week 1 (Updated)",
  "Room": "Room 5B",
  "StartDateTime": "2024-04-01 09:30",
  "EndDateTime": "2024-04-01 16:30",
  "ScheduleHours": "07:00"
}
Response (Success):
{
  "success": true,
  "msg": "Schedule Successfully Updated",
  "scheduleId": 3001
}
Response (Failure):
{
  "success": false,
  "msg": "Event not found",
  "scheduleId": 0
}



X. Reference

Schemas / Models

APIResponse
The standard response object returned by most endpoints.

{
  "success": true,        // Boolean — whether the operation succeeded
  "msg": "string",        // String — error message or contextual info (null on success)
  "newId": 0              // Long — ID of newly created record (0 if not applicable)
}
APIResponseUnits
Response object for endpoints that return unit data.

{
  "success": true,        // Boolean — whether the operation succeeded
  "msg": "string",        // String — error message (null on success)
  "unitLst": []           // Array — list of unit objects
}
APIResponseGroup
Response object for Group endpoints.

{
  "success": true,        // Boolean — whether the operation succeeded
  "msg": "string",        // String — message (success or error description)
  "groupId": 0            // Long — ID of the created/updated group
}
APIResponseSchedule
Response object for Event/Schedule endpoints.

{
  "success": true,        // Boolean — whether the operation succeeded
  "msg": "string",        // String — message (success or error description)
  "scheduleId": 0         // Long — ID of the created/updated schedule event
}
Student Model (Simple — used by api/Student)
Key fields in the Student object:
Field
Type
Description
StudentID
long
Unique student identifier
StudentName
string
First name
StudentSurname
string
Last name
StudentEmail
string
Email address
StudentMobileNumber
string
Mobile phone
StudentDOB
DateTime
Date of birth
StudentGender
string
Gender
StudentSuburb
string
Suburb
StudentPostCode
string
Postcode
StudentState
string
State
StudentStreetName
string
Street name
StudentStreetNumber
string
Street number
StudentEnrolment Model (used by api/StudentEnrolments POST)
FieldTypeDescription
student_numberintStudent ID
StudentRegQualificationCodestringQualification code
groupIntakeInputstringGroup ID
EnrolmentStatusstringEnrolment status
StudentEnrolmentAPI Model (used by api/StudentEnrolments PUT)
FieldTypeDescription
StudentRegEnrolmentIDstringEnrolment ID
EnrolmentStatusstringNew enrolment status
StudentRegEnrolmentEndDatestringEnrolment end date
GradePointstringGrade point value
MaxGrade
string
Maximum grade
smsrtoid
string
Optional RTO override
StudentUnit Model (used by api/StudentUnits)
FieldTypeDescription
enrolIDstringEnrolment ID
unitIDstringUnit/subject code
compIDstringCompetency/component ID
outcomestringUnit outcome
startDatestringUnit start date
endDate
string
Unit end date
smsrtoidstringOptional RTO override




FAQs
What is the API’s capacity?
The API’s capacity is 300 requests per 5 minutes, which is equivalent to 1 request per second (1 RPS) on average.

This means the system is designed to handle up to 300 API requests within any 5-minute window while maintaining consistent performance. When distributed evenly over time, this equates to approximately one request per second.

This figure represents an average rate limit rather than a strict per-second cap. The system is designed to support varying traffic patterns while maintaining stability and responsiveness.
    • Related Articles

    • How to Integrate Stripe on the SMS

      Overview This tutorial on SMS Stripe Integration provides a guide for users on integrating Stripe payment processing within the eSkilled Student Management System (SMS). It covers steps to retrieve Stripe API keys, configure Stripe settings in the ...
    • How to Set up Worldpay in the SMS

      Overview Worldpay is a global payment processing provider that allows businesses to accept card payments online, in-store, and over the phone. It supports a wide range of payment methods and currencies, making it suitable for local and international ...
    • Using Worldpay (previously Payrix) in the SMS - Merchant FAQ

      Overview These are the Frequently Asked Questions (FAQs) in relation to processing payments in the SMS through Worldpay (previously Payrix). FAQs Who is Worldpay? Worldpay is a payment partner that provides a secure payment gateway and payment ...
    • How to Pay for Student Invoice using Company Credit (Maximise)

      Overview This tutorial will introduce the function to pay for Student Invoices using Company Credit within the Student Management System (SMS). By leveraging Company Credit Invoices, companies can ensure a seamless and efficient enrolment process, ...
    • How to Email Students using the Companies Portal

      Overview The Companies feature of the SMS provide you with an option to allow your partner Companies (Employers, Host Employers, Agents, etc.) to have their own access to the SMS to allow them to view and manage enrolments related to their Company. ...