API Documentation

Connect your applications to CAMPUS COVER with clear instructions and ready-to-copy examples.

CAMPUS COVER · Developer guide

Your first API request

Generate a token, choose a dataset, and fetch your institution’s records. Use these JSON examples directly in Postman.

Base URL: https://erp.campuscover.com/ · All API requests use HTTPS POST.

1. Set up Postman

  1. Create a request and choose POST.
  2. Enter the endpoint URL shown below.
  3. Choose Body → raw → JSON. Put the example JSON in the body, not the Params tab.
  4. Confirm the headers: Content-Type: application/json and Accept: application/json.
  5. Replace example client ID 123 with your authorized institution’s client ID.
All records below are fictional examples. API keys and tokens shown as Postman variables must be replaced with your own values. Keep credentials private; these examples do not send any API requests.

Create Postman variables named apiKey and token. Store your issued API key in apiKey; it must be a 64-character lowercase hexadecimal value.

2. Generate an access token

POSThttps://erp.campuscover.com/generateToken/externalapi

Set Authorization → No Auth. Send this body:

{
    "apiKey": "{{apiKey}}"
}

Sample response

{
    "success": true,
    "message": "Token generated successfully",
    "data": {
        "token": "YOUR_GENERATED_TOKEN",
        "token_type": "Bearer",
        "expires_in": 3600,
        "expires_at": "2026-10-28T04:23:32Z"
    },
    "pagination": {
        "page": 1,
        "limit": 100,
        "total": 0
    }
}

Copy data.token into your Postman token variable. Tokens last one hour; call this endpoint again with the same API key after expiry. The Z in expires_at means UTC.

Use the token for data requests

For every endpoint below, select Authorization → Bearer Token and enter {{token}}. Postman sends Authorization: Bearer {{token}}. Keep the JSON headers and body format from step 1.

For requests without an Origin header, server-to-server access must be enabled for your API key. For an origin-bound key, send the exact registered HTTPS Origin when generating the token and on every data request. Website login cookies are not required.

Student list

Fetch active students for your authorized institution. Omit optional filters to include all active students.

POSThttps://erp.campuscover.com/getStudentList/externalapi

Request body · simplest example

{
    "clientID": 123,
    "page": 1,
    "limit": 500
}

Optional filters: studentID, branchID, classID, sectionID, sessionID. Use positive integer IDs; omit filters you do not need. Dates use the format described below.

Only active students are returned. This endpoint returns the selected student fields shown below, not the full student database record.

Sample response · available fields

{
    "success": true,
    "message": "Records fetched successfully",
    "data": [
        {
            "studentID": 1001,
            "clientID": 123,
            "branchID": 1,
            "classID": 3,
            "sectionID": 1,
            "sessionID": 10,
            "name": "Sample Student",
            "adm_no": "ADM-1001",
            "reg_no": "REG-1001",
            "roll": 12
        }
    ],
    "pagination": {
        "page": 1,
        "limit": 500,
        "total": 1
    }
}

Attendance

Fetch attendance records. With both dates omitted, the request returns today’s attendance only.

POSThttps://erp.campuscover.com/getAttendanceList/externalapi

Request body · simplest example

{
    "clientID": 123,
    "page": 1,
    "limit": 500
}

Optional filters: studentID, branchID, classID, sectionID, sessionID, dateFrom, dateTo. Use positive integer IDs; omit filters you do not need. Dates use the format described below.

Each omitted date defaults to today in Asia/Kolkata (IST). Explicit dates must use YYYY-MM-DD. dateFrom must not be after dateTo, and the range can span at most 93 calendar days. Empty strings are invalid; omit the fields to use defaults.

Example with a date range

{
    "clientID": 123,
    "dateFrom": "2026-10-01",
    "dateTo": "2026-10-28",
    "page": 1,
    "limit": 500
}

Attendance status and time values are returned as stored by your institution.

Sample response · available fields

{
    "success": true,
    "message": "Records fetched successfully",
    "data": [
        {
            "attendanceID": 501,
            "clientID": 123,
            "branchID": 1,
            "sessionID": 10,
            "studentID": 1001,
            "classID": 3,
            "sectionID": 1,
            "attendance_date": "2026-10-28",
            "subjectID": 0,
            "status": "P",
            "intime": "08:15:00",
            "outtime": "14:00:00"
        }
    ],
    "pagination": {
        "page": 1,
        "limit": 500,
        "total": 1
    }
}

Fee overdue

Calculate pending balances using the admin fee-overdue report for the requested scope.

POSThttps://erp.campuscover.com/getFeeOverdue/externalapi

Request body · simplest example

{
    "clientID": 123,
    "page": 1,
    "limit": 500
}

Optional filters: studentID, branchID, classID, sectionID, sessionID, cutoff_month. Use positive integer IDs; omit filters you do not need. Dates use the format described below.

Omitted sessionID uses this client’s configured current session. Omitted cutoff_month uses the current month in IST (1–12). branchID defaults to 0, which includes all branches. No saved snapshot is required. Explicit session and month values override defaults.

Example with an explicit session, month and branch

{
    "clientID": 123,
    "sessionID": 10,
    "cutoff_month": 10,
    "branchID": 1,
    "page": 1,
    "limit": 500
}

Only active student records with pending_total > 0 are returned. Amounts use the same calculation as the admin fee-overdue report, including payments at request time. No Update Report action is required. Check meta.as_of_date for the calculation date.

Sample response · available fields

{
    "success": true,
    "message": "Records fetched successfully",
    "data": [
        {
            "studentID": 1001,
            "clientID": 123,
            "branchID": 1,
            "classID": 3,
            "sectionID": 1,
            "fee_dues": "2500.00",
            "transport_dues": "500.00",
            "hostel_dues": "0.00",
            "opening_dues": "200.00",
            "pending_total": "3200.00",
            "due_month_count": 2
        }
    ],
    "pagination": {
        "page": 1,
        "limit": 500,
        "total": 1
    },
    "meta": {
        "source": "live_feeoverdue",
        "as_of_date": "2026-10-28",
        "sessionID": 10,
        "cutoff_month": 10
    }
}

Fetch every page

There is no single endpoint for all datasets. Fetch students, attendance and fee overdue separately, and paginate each dataset.

  1. Start with page: 1 and limit: 500. The default limit is 100; the maximum is 500.
  2. Read pagination.total from the response. Calculate the last page as ceil(total / limit).
  3. Send the same filters with page: 2, then page: 3, until every page is fetched.

Example: 1,200 records at 500 per page require three requests. An empty dataset returns data: [] and total: 0. The maximum page number is 10,000. For longer attendance history, repeat pagination for separate date windows of at most 93 days.

The configured rate limit is 300 requests per minute per API key, including token generation. A 429 response includes a Retry-After header.

Troubleshooting

HTTP statusWhat to check
400 · Invalid JSONUse a JSON object with double quotes and no trailing commas.
401 · Invalid credentials or tokenCheck the API key, or generate a new token if the previous one expired.
403 · Access deniedCheck the authorized client ID, registered Origin and server-to-server setting.
422 · Invalid fee scopeUse a session belonging to the client and a cutoff month within the configured fee session.
405 · Wrong methodUse POST over HTTPS.
415 · Use JSON or form-dataChoose Body → raw → JSON and send Content-Type: application/json. Form-data and x-www-form-urlencoded are also accepted; let Postman set their content type.
422 · Invalid inputCheck numeric IDs, dates and pagination. If the client has no current session configured, supply sessionID explicitly for fee overdue.
429 · Rate limitWait for the number of seconds in Retry-After before trying again.
503 · Temporarily unavailableRetry later or contact your ERP administrator.

Sample error response

{
    "success": false,
    "message": "Use JSON or form-data",
    "data": [],
    "pagination": {
        "page": 1,
        "limit": 100,
        "total": 0
    }
}