Skip to content
NEWCollect for MSMEs: UPI Autopay, eNACH & remindersExplore app ↗

Pull Integration

Pull Integration is used when your ERP should remain the source of truth and Jodo should fetch the latest student, fee, and schedule details only when required.

In this pattern, your ERP exposes a fetch-student API. Jodo calls this API during key moments in the payment or Flex lifecycle and uses the response to update the student context before continuing the flow.

  • Student and fee data changes frequently in your ERP.
  • Jodo should always use the latest fee balance before reminders or debit presentation.
  • Your team prefers not to push every data change to Jodo in real time.
  • Your ERP can expose a highly available API that responds quickly.

Pull Integration Flow

Jodo calls the configured ERP API in situations such as:

  • Before Flex plan setup.
  • Around 24 hours before an instalment presentation.
  • Before payment reminders are sent.

If Jodo cannot fetch the required data while scheduling a debit, the instalment presentation may be skipped until the data issue is resolved.

  • Protect the endpoint with authentication. Basic authentication is preferred unless another mechanism is agreed.
  • Keep the endpoint highly available.
  • Return a response within 15 seconds.
  • Reflect fee changes, discounts, direct payments, and fee increases immediately in the response.
  • Return clear error codes when the student cannot be used for collection.

Jodo makes a HTTP GET request on configured URL. It automatically adds following query parameters depending on the lookup option configured for the institute.

Query ParameterDescription
identifierUnique identifier for the student.
gradeGrade code.
custom_identifierCustom identifier for the student (if applicable).
collector_codeBranch code (if applicable).
academic_year_startAcademic year start (if applicable).
academic_year_endAcademic year end (if applicable).

Response from the ERP system in case the student is found successfully and is active.

200
{
"status": "success",
"data": {
"student": {
"fullname": "Student Name",
"identifier": "UNIQUE_IDENTIFIER",
"collector_code": "BRANCH_CODE",
"grade": "GRADE_CODE",
"new_admission": true,
"academic_year_start": "2022",
"academic_year_end": "2023",
"date_of_birth": "2006-04-17",
"primary_contact_name": "Primary contact name",
"primary_contact_number": "Valid mobile number",
"primary_contact_email": "Valid email address"
},
"fee_components": [
{
"component_type": "TUITION_FEE",
"fee_amount": 10000
},
{
"component_type": "TRANSPORT_FEE",
"fee_amount": 10500
}
]
}
}

Response Payload (with schedule, applicable where schedule is maintained in ERP)

Section titled “Response Payload (with schedule, applicable where schedule is maintained in ERP)”
{
"status": "success",
"data": {
"student": {
"fullname": "Student Name",
"identifier": "UNIQUE_IDENTIFIER",
"collector_code": "BRANCH_CODE",
"grade": "GRADE_CODE",
"new_admission": true,
"academic_year_start": "2022",
"academic_year_end": "2023",
"date_of_birth": "2006-04-17",
"primary_contact_name": "Primary contact name",
"primary_contact_number": "Valid mobile number",
"primary_contact_email": "Valid email address"
},
"fee_components": [
{
"component_type": "TUITION_FEE",
"fee_amount": 10000
}
],
"payment_schedule": [
{
"due_date": "2023-07-17",
"reference_id": "ref_1",
"details": [
{
"component_type": "TUITION_FEE",
"amount": 5000
}
]
},
{
"due_date": "2023-09-17",
"reference_id": "ref_2",
"details": [
{
"component_type": "TUITION_FEE",
"amount": 5000
}
]
}
]
}
}

data.student (object, required)

AttributeTypeRequiredDescription
data.student.fullnamestringYesFull name of the student
data.student.collector_codestringNoIn case institute has multiple branch, this will be required
data.student.identifierstringYesUnique identifier, this should be unique for the grade and academic year
data.student.gradestringYesGrade code
data.student.new_admissionbooleanYesTrue if new admission else false
data.student.academic_year_startstringYesAcademic year start
data.student.academic_year_endstringYesAcademic year end
data.student.date_of_birthstringNoDate of birth of the student in YYYY-MM-DD format
data.student.primary_contact_namestringYesPrimary contact name
data.student.primary_contact_emailstringYesPrimary contact email
data.student.primary_contact_numberstringYesPrimary contact phone

data.fee_components (array of objects, required)

AttributeTypeRequiredDescription
data.fee_components[].component_typestringYesComponent type
data.fee_components[].fee_amountnumberYesTotal component amount
data.payment_schedulearrayNoRequired only if custom schedule configuration is enabled
data.payment_schedule[].due_datestringYesDue date of the instalment
data.payment_schedule[].reference_idstringNoOptional reference id for the instalment
data.payment_schedule[].identifierstringNoOptional identifier for the instalment
data.payment_schedule[].is_downpaymentbooleanNoIf the instalment is downpayment
data.payment_schedule[].detailsarrayYesDetails of the instalment
data.payment_schedule[].details[].component_typestringYesComponent type
data.payment_schedule[].details[].amountnumberYesPayable amount

data.user (object, optional)

Required only if the student is being pushed using the redirect from the ERP system (using init API).

AttributeTypeRequiredDescription
data.user.namestringYesName of the applicant
data.user.phonestringYesPhone number of the applicant

Response from the ERP system in case of any validation error.

422
{
"status": "error",
"message": "<User friendly error message that can be shown to the users>",
"code": "FETCH_ERROR_CODE"
}

If ERP is unable to return student data for some reason, it can return error code. When the presentation takes place on a given due date, using this Jodo can identify the action to take. For example — if the student is discontinued or is not active.

Error CodeDescription
student_not_foundWhen student not found
student_discontinuedWhen student is inactive
student_transferredWhen student has taken transfer to another branch
data_errorIn case of any validation error or data inconsistency