Jodo ERP Integrations API

REST API for connecting an institute's ERP, finance or student-information system to Jodo fee collection. Covers user registration and hosted-flow access tokens, student master data and fee structures, manual/direct payment reconciliation, Flex instalment plans, Pay checkout orders and shareable payment links, institute reference data, and webhook subscription management. Basic Auth; JSON request and response bodies; documented UAT and production hosts.

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/jodo-erp-integrations-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

jodo-integrations-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Jodo ERP Integrations API
  version: v1
  summary: Fee collection, flexible instalment plans and education credit for Indian educational institutes.
  description: |
    Jodo's ERP Integrations API lets an institute's ERP, finance or student-information system
    connect to Jodo fee collection. It covers user registration and hosted-flow access tokens,
    student master data and fee structures, manual/direct payment reconciliation, Flex instalment
    plans, Pay checkout orders and shareable payment links, and webhook subscription management.

    PROVENANCE: Jodo publishes no OpenAPI document. This description was assembled from Jodo's own
    public API reference at https://docs.jodo.in/ (Astro Starlight, server-rendered HTML), one
    documented operation per reference page. Every path, method, path/query parameter, request-body
    field, response field and error code below is transcribed from the corresponding docs page named
    in the operation's `x-source` extension. No operation, parameter or field has been invented.
    Field types are the ones the docs state. Where the docs do not state a constraint, none is asserted.
  contact:
    name: Jodo
    url: https://docs.jodo.in/
  x-provenance:
    method: generated
    generated_by: API Evangelist enrichment pipeline
    generated: '2026-08-23'
    source_docs: https://docs.jodo.in/
    note: >-
      Endpoint paths, methods, parameters, request/response fields and error codes are grounded in
      docs.jodo.in as fetched 2026-08-23 (all reference pages HTTP 200). This is a third-party
      rendering of Jodo's published reference, not a Jodo-published artifact. Reconcile against the
      live API reference before relying on it.
servers:
  - url: https://ext.jodo.in
    description: Production API host. Jodo documents this as base_url on https://docs.jodo.in/getting-started/environments/. https://api.jodo.in is documented as jodo_auth_host and issues an HTTP 301 to https://ext.jodo.in.
  - url: https://ext.devtest1.jodopay.com
    description: UAT / sandbox API host, documented on https://docs.jodo.in/getting-started/environments/. jodopay.com is Jodo's own non-production domain (the company also operates @Jodopay social handles).
security:
  - basicAuth: []
tags:
  - name: Users
    description: Register ERP/institute users and mint short-lived tokens for Jodo-hosted flows.
  - name: Students
    description: Student master data, fee structures and manual payment reconciliation.
  - name: Flex
    description: Flexible instalment plans backed by an auto-debit mandate.
  - name: Pay
    description: Checkout orders and shareable hosted payment links.
  - name: Configuration
    description: Institute reference data (branches, grades, fee components, discounts) and webhook subscriptions.
paths:
  /api/v1/integrations/erp/users/register:
    post:
      operationId: registerUser
      summary: Register User
      description: Register a user uniquely identified by phone number and email. Used for seamless login and redirection into Jodo-hosted flows.
      tags: [Users]
      x-source: https://docs.jodo.in/user/api/register-user/
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/RegisterUserRequest' }
      responses:
        '200':
          description: User registered.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/RegisterUserResponse' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /api/v1/integrations/erp/users/{registration_id}/access_token:
    get:
      operationId: getAccessToken
      summary: Get Access Token
      description: Generate a short-lived access token for a registered user so your application can redirect them into Jodo-hosted flows.
      tags: [Users]
      x-source: https://docs.jodo.in/user/api/get-access-token/
      parameters:
        - $ref: '#/components/parameters/RegistrationId'
      responses:
        '200':
          description: Access token issued.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/AccessTokenResponse' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
  /api/v1/integrations/erp/users/{registration_id}/students:
    post:
      operationId: registerStudent
      summary: Register Student
      description: Register a new student for a given user, uniquely identified by registration_id. Creates student profiles associated with specific users within the Jodo system.
      tags: [Students]
      x-source: https://docs.jodo.in/student/api/register-student/
      parameters:
        - $ref: '#/components/parameters/RegistrationId'
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/RegisterStudentRequest' }
      responses:
        '200':
          description: Student registered.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/StatusOnlyResponse' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /api/v1/integrations/erp/students/{jodo_student_id}:
    get:
      operationId: getStudent
      summary: Get Student
      description: Returns student details identified by jodo_student_id.
      tags: [Students]
      x-source: https://docs.jodo.in/student/api/get-student/
      parameters:
        - $ref: '#/components/parameters/JodoStudentId'
      responses:
        '200':
          description: Student record.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/StudentResponse' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
    patch:
      operationId: updateStudent
      summary: Update Student
      description: Update the profile details of a student identified by jodo_student_id.
      tags: [Students]
      x-source: https://docs.jodo.in/student/api/update-student/
      parameters:
        - $ref: '#/components/parameters/JodoStudentId'
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/Student' }
      responses:
        '200':
          description: Student updated.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/StudentResponse' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '404': { $ref: '#/components/responses/NotFound' }
  /api/v1/integrations/erp/students/{jodo_student_id}/fee:
    patch:
      operationId: updateStudentFee
      summary: Update Fee
      description: Update the fee components and discounts configured for a student.
      tags: [Students]
      x-source: https://docs.jodo.in/student/api/update-fee/
      parameters:
        - $ref: '#/components/parameters/JodoStudentId'
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/UpdateFeeRequest' }
      responses:
        '200':
          description: Fee updated.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/StatusOnlyResponse' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '404': { $ref: '#/components/responses/NotFound' }
  /api/v1/integrations/erp/students/{jodo_student_id}/products:
    get:
      operationId: listStudentProducts
      summary: List Products
      description: Retrieve Jodo products associated with a student, optionally filtered by product type.
      tags: [Students]
      x-source: https://docs.jodo.in/student/api/list-products/
      parameters:
        - $ref: '#/components/parameters/JodoStudentId'
        - name: product_type
          in: query
          required: false
          description: 'Optional product filter. Possible values: flex, pay, cred.'
          schema:
            type: string
            enum: [flex, pay, cred]
      responses:
        '200':
          description: Products for the student.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/ProductListResponse' }
        '404': { $ref: '#/components/responses/NotFound' }
  /api/v1/integrations/erp/students/{jodo_student_id}/payments:
    get:
      operationId: listStudentPayments
      summary: List Payments
      description: Retrieve the payment list for a student identified by jodo_student_id.
      tags: [Students]
      x-source: https://docs.jodo.in/student/api/list-payments/
      parameters:
        - $ref: '#/components/parameters/JodoStudentId'
      responses:
        '200':
          description: Payments recorded for the student.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/PaymentListResponse' }
        '404': { $ref: '#/components/responses/NotFound' }
    post:
      operationId: addStudentPayment
      summary: Add Payment
      description: Record a manual (direct) payment for a student identified by jodo_student_id.
      tags: [Students]
      x-source: https://docs.jodo.in/student/api/add-payment/
      parameters:
        - $ref: '#/components/parameters/JodoStudentId'
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/AddPaymentRequest' }
      responses:
        '200':
          description: Payment recorded.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/StatusOnlyResponse' }
        '400': { $ref: '#/components/responses/BadRequestMAE' }
        '404': { $ref: '#/components/responses/StudentNotFound' }
  /api/v1/integrations/erp/students/{jodo_student_id}/payments/{transaction_id}:
    delete:
      operationId: cancelStudentPayment
      summary: Cancel Payment
      description: Cancel a payment for a student identified by jodo_student_id and transaction_id. Use only for payments recorded through the direct/manual payment API, with the same transaction_id that was sent when the payment was added.
      tags: [Students]
      x-source: https://docs.jodo.in/student/api/cancel-payment/
      parameters:
        - $ref: '#/components/parameters/JodoStudentId'
        - name: transaction_id
          in: path
          required: true
          description: Transaction ID of the payment to cancel.
          schema: { type: string }
      responses:
        '200':
          description: Payment cancelled.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/StatusOnlyResponse' }
        '404': { $ref: '#/components/responses/NotFound' }
  /api/v1/integrations/flex/students/{jodo_student_id}/plans:
    get:
      operationId: getFlexSchedule
      summary: Get Flex Schedule
      description: Fetch the Flex payment schedule configured for a student.
      tags: [Flex]
      x-source: https://docs.jodo.in/flex/api/get-flex-schedule/
      parameters:
        - $ref: '#/components/parameters/JodoStudentId'
      responses:
        '200':
          description: Flex schedule for the student.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/FlexScheduleResponse' }
        '404': { $ref: '#/components/responses/NotFound' }
    post:
      operationId: manageFlexPlan
      summary: Manage Flex Plan
      description: Configure the instalment schedule for a student identified by jodo_student_id.
      tags: [Flex]
      x-source: https://docs.jodo.in/flex/api/manage-flex-plan/
      parameters:
        - $ref: '#/components/parameters/JodoStudentId'
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/ManageFlexPlanRequest' }
      responses:
        '200':
          description: Flex plan configured.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/StatusOnlyResponse' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '404': { $ref: '#/components/responses/NotFound' }
  /api/v1/integrations/pay/orders:
    post:
      operationId: createPayOrder
      summary: Create Pay Order
      description: Create a Pay Order to collect an unstructured payment without requiring an existing student record. Returns an order_id and a hosted redirect_url.
      tags: [Pay]
      x-source: https://docs.jodo.in/pay/api/create-order/
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/CreatePayOrderRequest' }
      responses:
        '200':
          description: Pay Order created.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/OrderCreatedResponse' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /api/v1/integrations/pay/orders/{order_id}:
    get:
      operationId: getPayOrder
      summary: Get Pay Order
      description: Retrieve the current state of a Pay Order after checkout, callback, or webhook processing.
      tags: [Pay]
      x-source: https://docs.jodo.in/pay/api/get-order/
      parameters:
        - $ref: '#/components/parameters/OrderId'
      responses:
        '200':
          description: Pay Order state.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/OrderResponse' }
        '404': { $ref: '#/components/responses/NotFound' }
  /api/v1/integrations/pay/payment_links:
    post:
      operationId: createPaymentLink
      summary: Create Payment Link
      description: Create a payment link when the payer should complete payment from a shareable hosted URL instead of an immediate checkout redirect.
      tags: [Pay]
      x-source: https://docs.jodo.in/pay/api/create-payment-link/
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/CreatePaymentLinkRequest' }
      responses:
        '201':
          description: Payment link created.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/OrderCreatedResponse' }
        '400': { $ref: '#/components/responses/BadRequest' }
  /api/v1/integrations/pay/payment_links/{order_id}:
    get:
      operationId: getPaymentLink
      summary: Get Payment Link
      description: Fetch the current state of a payment link using the order_id returned when the link was created.
      tags: [Pay]
      x-source: https://docs.jodo.in/pay/api/get-payment-link/
      parameters:
        - $ref: '#/components/parameters/OrderId'
      responses:
        '200':
          description: Payment link state.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/PaymentLinkResponse' }
        '400': { $ref: '#/components/responses/BadRequest' }
    delete:
      operationId: cancelPaymentLink
      summary: Cancel Payment Link
      description: Cancel a payment link when the payer should no longer be able to complete payment using the hosted URL.
      tags: [Pay]
      x-source: https://docs.jodo.in/pay/api/cancel-payment-link/
      parameters:
        - $ref: '#/components/parameters/OrderId'
      responses:
        '200':
          description: Payment link cancelled.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/MessageResponse' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '404': { $ref: '#/components/responses/NotFound' }
  /api/v1/integrations/erp/branches:
    get:
      operationId: listBranches
      summary: List Branches
      description: Fetch branch names and collector codes configured for the institute.
      tags: [Configuration]
      x-source: https://docs.jodo.in/configuration/api/list-branches/
      responses:
        '200':
          description: Branches configured for the institute.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/GenericListResponse' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /api/v1/integrations/erp/grades:
    get:
      operationId: listGrades
      summary: List Grades
      description: Fetch grade codes used in student registration and update payloads.
      tags: [Configuration]
      x-source: https://docs.jodo.in/configuration/api/list-grades/
      parameters:
        - $ref: '#/components/parameters/CollectorCode'
      responses:
        '200':
          description: Grade codes.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/GenericListResponse' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /api/v1/integrations/erp/fee-components:
    get:
      operationId: listFeeComponents
      summary: List Fee Components
      description: Fetch fee component codes used in student fee and payment payloads.
      tags: [Configuration]
      x-source: https://docs.jodo.in/configuration/api/list-fee-components/
      parameters:
        - $ref: '#/components/parameters/CollectorCode'
      responses:
        '200':
          description: Fee component codes.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/GenericListResponse' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /api/v1/integrations/erp/discounts:
    get:
      operationId: listDiscounts
      summary: List Discounts
      description: Fetch discount codes supported for student fee configuration.
      tags: [Configuration]
      x-source: https://docs.jodo.in/configuration/api/list-discounts/
      parameters:
        - $ref: '#/components/parameters/CollectorCode'
      responses:
        '200':
          description: Discount codes.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/GenericListResponse' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /api/v1/integrations/erp/webhooks:
    get:
      operationId: listWebhooks
      summary: List Webhooks
      description: Fetch webhook subscriptions configured for the institute.
      tags: [Configuration]
      x-source: https://docs.jodo.in/configuration/api/list-webhooks/
      responses:
        '200':
          description: Webhook subscriptions.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/GenericListResponse' }
        '401': { $ref: '#/components/responses/Unauthorized' }
    post:
      operationId: addWebhook
      summary: Add Webhook
      description: |
        Add or update the webhook destination for a specific event code. A webhook event can be
        subscribed to only one URL; calling this API again for the same event_code updates the
        existing subscription. After creation only secret_key, header_key and header_value can be updated.
      tags: [Configuration]
      x-source: https://docs.jodo.in/configuration/api/add-webhook/
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/AddWebhookRequest' }
      responses:
        '201':
          description: Webhook subscription created or updated.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/WebhookResponse' }
        '400': { $ref: '#/components/responses/BadRequest' }
  /api/v1/integrations/erp/webhooks/{webhook_id}:
    get:
      operationId: getWebhook
      summary: Get Webhook
      description: Fetch details for a webhook subscription identified by webhook_id.
      tags: [Configuration]
      x-source: https://docs.jodo.in/configuration/api/get-webhook/
      parameters:
        - $ref: '#/components/parameters/WebhookId'
      responses:
        '200':
          description: Webhook subscription detail.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/WebhookResponse' }
        '404': { $ref: '#/components/responses/NotFound' }
    delete:
      operationId: disableWebhook
      summary: Disable Webhook
      description: Disable a webhook subscription identified by webhook_id.
      tags: [Configuration]
      x-source: https://docs.jodo.in/configuration/api/disable-webhook/
      parameters:
        - $ref: '#/components/parameters/WebhookId'
      responses:
        '200':
          description: Webhook subscription disabled.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/StatusOnlyResponse' }
        '400': { $ref: '#/components/responses/BadRequest' }
components:
  securitySchemes:
    basicAuth:
      type: http
      scheme: basic
      description: >-
        All Jodo APIs are authenticated using HTTP Basic Auth. Jodo shares separate API keys and
        secrets for the UAT and production environments. Documented at
        https://docs.jodo.in/getting-started/authentication/ — keys and secrets must never be
        exposed in browsers, mobile apps or client-side code.
  parameters:
    RegistrationId:
      name: registration_id
      in: path
      required: true
      description: Unique registration ID for the user, returned by Register User.
      schema: { type: string }
    JodoStudentId:
      name: jodo_student_id
      in: path
      required: true
      description: Jodo student ID.
      schema: { type: string }
    OrderId:
      name: order_id
      in: path
      required: true
      description: Jodo Pay Order identifier returned by Create Pay Order or Create Payment Link.
      schema: { type: string }
    WebhookId:
      name: webhook_id
      in: path
      required: true
      description: Webhook subscription ID.
      schema: { type: string }
    CollectorCode:
      name: collector_code
      in: query
      required: false
      description: Branch code. Required when the institute is part of a group or has branch-specific configuration.
      schema: { type: string }
  responses:
    BadRequest:
      description: 'HUE00000 — Bad request. The request contains invalid or missing data.'
      content:
        application/json:
          schema: { $ref: '#/components/schemas/Error' }
    BadRequestMAE:
      description: 'MAE00000 — Bad request error.'
      content:
        application/json:
          schema: { $ref: '#/components/schemas/Error' }
    Unauthorized:
      description: Unauthorized. Authentication failed or credentials are invalid.
      content:
        application/json:
          schema: { $ref: '#/components/schemas/Error' }
    NotFound:
      description: 'HUE00001 — Resource not found.'
      content:
        application/json:
          schema: { $ref: '#/components/schemas/Error' }
    StudentNotFound:
      description: 'MAE00001 — Student not found.'
      content:
        application/json:
          schema: { $ref: '#/components/schemas/Error' }
  schemas:
    Error:
      type: object
      description: Jodo returns an HTTP status code with a user-facing message and a machine-readable error code.
      properties:
        status: { type: string, examples: [error] }
        code:
          type: string
          description: Machine-readable Jodo error code, e.g. HUE00000, HUE00001, MAE00000, MAE00001.
        message: { type: string, description: User-friendly explanation of the error. }
    StatusOnlyResponse:
      type: object
      description: Some write APIs return only a status envelope.
      properties:
        status: { type: string, examples: [success] }
    MessageResponse:
      type: object
      properties:
        status: { type: string, examples: [success] }
        message: { type: string, examples: ['Payment link cancelled successfully!'] }
    GenericListResponse:
      type: object
      description: Configuration list envelope. The docs do not enumerate the item shape for every configuration list.
      properties:
        status: { type: string, examples: [success] }
        data: { type: array, items: { type: object } }
    RegisterUserRequest:
      type: object
      required: [name, phone, email]
      properties:
        name: { type: string, description: Full name of the user. }
        phone: { type: string, description: 10-digit phone number. }
        email: { type: string, format: email, description: Email address. }
    RegisterUserResponse:
      type: object
      properties:
        status: { type: string, examples: [success] }
        data:
          type: object
          properties:
            registration_id: { type: string, description: Unique registration ID generated for the user. }
    AccessTokenResponse:
      type: object
      description: >-
        The access_token is used in the Jodo login redirect
        https://[base_url]/consumer/login-redirect?access_token=<access_token>, optionally with
        jodo_student_id, product_type (flex|pay|cred), callback_url and create_application.
      properties:
        status: { type: string, examples: [success] }
        data:
          type: object
          properties:
            access_token: { type: string, description: Access token used for the Jodo redirect. }
            expires_at: { type: string, format: date-time, description: Expiry time for the token. }
    Student:
      type: object
      required: [fullname, identifier, grade, new_admission, academic_year_start, academic_year_end, date_of_birth, primary_contact_name, primary_contact_number, primary_contact_email]
      properties:
        fullname: { type: string, description: The full name of the student. }
        identifier: { type: string, description: An identifier for the student assigned by the school (enrolment number). }
        custom_identifier: { type: string, description: Student custom identifier. }
        grade: { type: string, description: Unique grade identifier as shared between Jodo and the ERP provider. }
        new_admission: { type: boolean, description: Indicates if it is a new admission. }
        academic_year_start: { type: [string, integer], description: The start year of the academic year. }
        academic_year_end: { type: [string, integer], description: The end year of the academic year. }
        date_of_birth: { type: string, description: Date of birth in YYYY-MM-DD format. }
        primary_contact_name: { type: string, description: The name of the primary contact for the student. }
        primary_contact_number: { type: string, description: The primary contact number. }
        primary_contact_email: { type: string, format: email, description: The primary contact email. }
    FeeComponent:
      type: object
      required: [component_type, fee_amount]
      properties:
        component_type: { type: string, description: 'The type of fee component, e.g. TUITION_FEE, TRANSPORT_FEE.' }
        fee_amount: { type: number, description: The fee amount for the component. }
        discounts:
          type: array
          description: Discounts applied to this component.
          items: { $ref: '#/components/schemas/Discount' }
    Discount:
      type: object
      required: [discount_type, value]
      properties:
        discount_type: { type: string, description: One of the discount types as shared between Jodo and the ERP. }
        value: { type: integer, description: Discount amount in INR. }
    RegisterStudentRequest:
      type: object
      required: [student]
      properties:
        student: { $ref: '#/components/schemas/Student' }
        fee_components:
          type: array
          items: { $ref: '#/components/schemas/FeeComponent' }
        payments:
          type: array
          items: { $ref: '#/components/schemas/HistoricPayment' }
    HistoricPayment:
      type: object
      required: [amount, paid_at, mode, transaction_id, fee_components]
      properties:
        amount: { type: number, description: The payment amount. }
        paid_at: { type: string, format: date-time, description: The date and time of the payment in ISO 8601 format. }
        mode: { type: string, description: 'The payment mode, e.g. cash, credit card.' }
        transaction_id: { type: string, description: The unique transaction ID for the student. }
        settlement_utr: { type: string, description: The settlement UTR (Unique Transaction Reference), if applicable. }
        notes: { type: string, description: Additional notes or comments regarding the payment. }
        fee_components:
          type: array
          description: Fee components included in this payment.
          items: { $ref: '#/components/schemas/PaymentAllocation' }
    PaymentAllocation:
      type: object
      required: [component_type, amount]
      properties:
        component_type: { type: string, description: Fee component for which payment is made. }
        amount: { type: number, description: Amount paid for this fee component. }
    StudentResponse:
      type: object
      properties:
        status: { type: string, examples: [success] }
        data:
          type: object
          properties:
            fullname: { type: string }
            identifier: { type: string, description: Student identifier assigned by the school (enrolment number). }
            custom_identifier: { type: string }
            grade: { type: string, description: Unique grade identifier as shared between Jodo and the ERP provider. }
            new_admission: { type: boolean }
            academic_year_start: { type: integer }
            academic_year_end: { type: integer }
            date_of_birth: { type: string, description: Date of birth in YYYY-MM-DD format. }
            collector_code: { type: string, description: Institute code. }
            joining_year: { type: integer, description: Joining year; present if the student is a new admission. }
            primary_contact_name: { type: string }
            primary_contact_number: { type: string }
            primary_contact_email: { type: string, format: email }
            fee_summary:
              type: object
              properties:
                total_fee: { type: number, description: Total fee for the student. }
                total_discount: { type: number, description: Total discount for the student. }
    UpdateFeeRequest:
      type: object
      required: [fee_components]
      properties:
        fee_components:
          type: array
          items: { $ref: '#/components/schemas/FeeComponent' }
    ProductListResponse:
      type: object
      properties:
        status: { type: string, examples: [success] }
        data:
          type: array
          items:
            type: object
            properties:
              id: { type: integer }
              product_type: { type: string, enum: [flex, pay, cred] }
              status: { type: string, examples: [pending] }
    AddPaymentRequest:
      type: object
      required: [amount, paid_at, fee_components]
      properties:
        amount: { type: number, description: Total amount paid. }
        paid_at: { type: string, format: date-time, description: Paid date and time in ISO 8601 format. }
        mode: { type: string, description: Mode of payment. Defaults to others if not provided. }
        transaction_id: { type: string, description: Unique transaction ID from your system. Reused as the path key when cancelling the payment. }
        settlement_utr: { type: string, description: Settlement UTR, if already available. }
        notes: { type: string, description: Payment notes. }
        fee_components:
          type: array
          description: Fee component level payment allocation.
          items: { $ref: '#/components/schemas/PaymentAllocation' }
    PaymentListResponse:
      type: object
      properties:
        status: { type: string, examples: [success] }
        data: { type: array, items: { type: object } }
    ManageFlexPlanRequest:
      type: object
      required: [payment_schedule]
      properties:
        payment_schedule:
          type: array
          description: Instalments to configure for the student.
          items:
            type: object
            required: [d

# --- truncated at 32 KB (38 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/jodo/refs/heads/main/openapi/jodo-integrations-openapi.yml