{
  "info": {
    "_postman_id": "14e8f7d7-f380-4f16-af43-02b302abdacf",
    "name": "School360 API",
    "description": "The School360 REST API for a school's own systems: biometric attendance, bank and wallet payments, SMS gateways, accounting and more. Create a key in School Setup › Integrations (Enterprise package) and send it as `Authorization: Bearer <key>`. JSON only, camelCase, ISO dates, amounts in PKR as numbers. Lists are cursor-paged. 120 requests a minute per key.\n\nSet the apiKey variable to a key from School Setup › Integrations › API keys.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{apiKey}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://api.school360.cloud/v1",
      "type": "string"
    },
    {
      "key": "apiKey",
      "value": "",
      "type": "string",
      "description": "s360_live_… (or s360_test_… on the Demo School)"
    }
  ],
  "item": [
    {
      "name": "School",
      "item": [
        {
          "name": "The school",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/school",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "school"
              ]
            },
            "description": "The school this key belongs to. Any key can read this."
          }
        },
        {
          "name": "Campuses",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/campuses",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "campuses"
              ]
            },
            "description": "Any key can read this."
          }
        },
        {
          "name": "Academic sessions",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/years",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "years"
              ]
            },
            "description": "Any key can read this."
          }
        },
        {
          "name": "Classes",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/classes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "classes"
              ],
              "query": [
                {
                  "key": "campusId",
                  "value": "",
                  "disabled": true,
                  "description": "Only this campus's classes."
                }
              ]
            },
            "description": "Any key can read this."
          }
        },
        {
          "name": "Class sections",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/sections",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "sections"
              ],
              "query": [
                {
                  "key": "classId",
                  "value": "",
                  "disabled": true,
                  "description": "Only this class's sections."
                }
              ]
            },
            "description": "Any key can read this."
          }
        },
        {
          "name": "Subjects",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/subjects",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "subjects"
              ]
            },
            "description": "Any key can read this."
          }
        }
      ]
    },
    {
      "name": "Students",
      "item": [
        {
          "name": "List students",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/students",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "students"
              ],
              "query": [
                {
                  "key": "q",
                  "value": "",
                  "disabled": true,
                  "description": "Search: name or admission number (with families:read also the parents' names, and 4+ digits match B-Form, CNIC and phone numbers)."
                },
                {
                  "key": "classId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "sectionId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "status",
                  "value": "",
                  "disabled": true,
                  "description": "active, suspended, left… "
                },
                {
                  "key": "updatedSince",
                  "value": "",
                  "disabled": true,
                  "description": "ISO date-time, e.g. 2026-10-01T00:00:00Z."
                },
                {
                  "key": "limit",
                  "value": "",
                  "disabled": true,
                  "description": "How many records to return (1–200, default 50)."
                },
                {
                  "key": "cursor",
                  "value": "",
                  "disabled": true,
                  "description": "nextCursor from the previous page."
                }
              ]
            },
            "description": "Students in id order. Every status by default; filter with status. updatedSince returns students added or changed since then.\n\nNeeds the **students:read** permission."
          }
        },
        {
          "name": "One student",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/students/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "students",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "1",
                  "description": "The record's id."
                }
              ]
            },
            "description": "Needs the **students:read** permission."
          }
        },
        {
          "name": "Update a student's details",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/students/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "students",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "1",
                  "description": "The record's id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"cardNo\": \"0004417365\",\n  \"bloodGroup\": \"\",\n  \"religion\": \"\",\n  \"medical\": \"\",\n  \"previousSchool\": \"\",\n  \"bForm\": \"\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Changes a student's attendance card number and a few profile details. Only the fields sent change; send null (or \"\") to clear one. The B-Form number needs families:write too. Class, section, status, names and dates are changed in the portal only. The student.updated webhook fires.\n\nNeeds the **students:write** permission."
          }
        }
      ]
    },
    {
      "name": "Families",
      "item": [
        {
          "name": "List families",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/families",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "families"
              ],
              "query": [
                {
                  "key": "q",
                  "value": "",
                  "disabled": true,
                  "description": "Search: family code, a parent's name, or 4+ digits of a CNIC or phone number."
                },
                {
                  "key": "updatedSince",
                  "value": "",
                  "disabled": true,
                  "description": "ISO date-time."
                },
                {
                  "key": "limit",
                  "value": "",
                  "disabled": true,
                  "description": "How many records to return (1–200, default 50)."
                },
                {
                  "key": "cursor",
                  "value": "",
                  "disabled": true,
                  "description": "nextCursor from the previous page."
                }
              ]
            },
            "description": "Families with their parents' and guardian's details, in id order.\n\nNeeds the **families:read** permission."
          }
        },
        {
          "name": "One family",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/families/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "families",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "1",
                  "description": "The record's id."
                }
              ]
            },
            "description": "A family with its children (on the key's campus) and, for keys with fees:read, its balance.\n\nNeeds the **families:read** permission."
          }
        },
        {
          "name": "Update a family's contact details",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/families/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "families",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "1",
                  "description": "The record's id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"father\": {\n    \"phone\": \"0300-1234567\",\n    \"email\": \"parent@example.com\"\n  },\n  \"mother\": {\n    \"phone\": \"0300-1234567\",\n    \"email\": \"parent@example.com\"\n  },\n  \"guardian\": {\n    \"phone\": \"0300-1234567\",\n    \"email\": \"parent@example.com\"\n  },\n  \"primaryContact\": \"father\",\n  \"address\": \"\",\n  \"city\": \"\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Changes the parents' and guardian's phone numbers and emails, the primary contact and the address. Only the fields sent change; \"\" clears one. The family must keep a parent's or the guardian's phone. Names and CNICs are changed in the portal only, and parents app accounts aren't changed (the school updates those on the family form).\n\nNeeds the **families:write** permission."
          }
        }
      ]
    },
    {
      "name": "Admissions",
      "item": [
        {
          "name": "List applications",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/applications",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "applications"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "disabled": true,
                  "description": "inquiry | applied | test-scheduled | approved | enrolled | rejected"
                },
                {
                  "key": "yearId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "classId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "",
                  "disabled": true,
                  "description": "How many records to return (1–200, default 50)."
                },
                {
                  "key": "cursor",
                  "value": "",
                  "disabled": true,
                  "description": "nextCursor from the previous page."
                }
              ]
            },
            "description": "Admission applications in id order, every session unless yearId is given.\n\nNeeds the **admissions:read** permission."
          }
        },
        {
          "name": "Take an application",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each new request; send the same key again to retry it safely."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/applications",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "applications"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"classId\": 1,\n  \"firstName\": \"\",\n  \"gender\": \"male\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "An admission enquiry from the school's own website, form or app. It gets the next application number and starts at inquiry on Students › Admissions, exactly like one taken at the front desk (a family already at the school with the same father's CNIC or phone is noted as a brother or sister). The parents need a name (father or mother) and a phone. The application.received webhook fires.\n\nNeeds the **admissions:write** permission."
          }
        },
        {
          "name": "Enrol an application",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each new request; send the same key again to retry it safely."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/applications/:id/enrol",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "applications",
                ":id",
                "enrol"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "1",
                  "description": "The record's id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"sectionId\": 1,\n  \"admissionDate\": \"2026-10-08\",\n  \"dob\": \"2026-10-08\",\n  \"lastName\": \"\",\n  \"bForm\": \"\",\n  \"cardNo\": \"0004417365\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Admits the child of an open application for this session as a student, as the student form does: the next admission number, the end of the section's roll, this session's enrolment, and a family (the brother or sister's family already here, else a new one from the application). The application is marked enrolled. Applications for the next session join at the year-end promotion instead (422). The student.admitted and application.status_changed webhooks fire.\n\nNeeds the **admissions:write** permission."
          }
        }
      ]
    },
    {
      "name": "Attendance",
      "item": [
        {
          "name": "A section's register for a day",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/attendance",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "attendance"
              ],
              "query": [
                {
                  "key": "sectionId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "date",
                  "value": "",
                  "disabled": true
                }
              ]
            },
            "description": "What was marked: the register's exceptions (absent, late, leave, half-day, and present with a remark). Every other student on the roll that day was present. taken is false when no register was marked.\n\nNeeds the **attendance:read** permission."
          }
        },
        {
          "name": "Attendance counts over a range",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/attendance/summary",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "attendance",
                "summary"
              ],
              "query": [
                {
                  "key": "sectionId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "studentId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "from",
                  "value": "",
                  "disabled": true,
                  "description": "First day (YYYY-MM-DD). Default: 29 days before to."
                },
                {
                  "key": "to",
                  "value": "",
                  "disabled": true,
                  "description": "Last day. Default: today."
                }
              ]
            },
            "description": "Days present, absent, late, on leave and half-day for one student (studentId) or each student on a section's roll (sectionId), from the registers taken between from and to (at most a year). Days before a student joined don't count.\n\nNeeds the **attendance:read** permission."
          }
        },
        {
          "name": "A student's attendance, day by day",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/students/:id/attendance",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "students",
                ":id",
                "attendance"
              ],
              "query": [
                {
                  "key": "from",
                  "value": "",
                  "disabled": true,
                  "description": "First day (YYYY-MM-DD). Default: 29 days before to."
                },
                {
                  "key": "to",
                  "value": "",
                  "disabled": true,
                  "description": "Last day. Default: today."
                }
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "1",
                  "description": "The record's id."
                }
              ]
            },
            "description": "Each register taken in the student's section between from and to (default the last 30 days, at most a year) with their status that day.\n\nNeeds the **attendance:read** permission."
          }
        },
        {
          "name": "Staff attendance for a day",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/staff/attendance",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "staff",
                "attendance"
              ],
              "query": [
                {
                  "key": "date",
                  "value": "",
                  "disabled": true
                }
              ]
            },
            "description": "The staff sheet for a day: each member of staff marked (or punched) that day with their status, check-in and check-out. Staff not listed weren't marked.\n\nNeeds the **attendance:read** permission."
          }
        },
        {
          "name": "Send a day of staff attendance",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each new request; send the same key again to retry it safely."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/staff/attendance",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "staff",
                "attendance"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"date\": \"2026-10-08\",\n  \"entries\": [\n    {\n      \"staffCode\": \"STF-0007\",\n      \"status\": \"present\",\n      \"in\": \"\",\n      \"out\": \"\",\n      \"note\": \"\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Each entry replaces that staff member's day (status, check-in, check-out). Staff not listed are left as they are.\n\nNeeds the **attendance:write** permission."
          }
        },
        {
          "name": "Mark a section's register",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each new request; send the same key again to retry it safely."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/attendance/registers",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "attendance",
                "registers"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"sectionId\": 1,\n  \"date\": \"2026-10-08\",\n  \"marks\": [\n    {\n      \"studentId\": 1,\n      \"status\": \"present\",\n      \"remark\": \"\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "A section's register for a school day, as the portal saves it: send the exceptions (absent, late, leave, half-day, or present with a remark); every other student on the roll is present. Saving again replaces the day's marks. Students not on the section's roll are ignored (listed in ignored). Parents get the school's absence messages and the student.absent, student.late and attendance.register_saved webhooks fire as for a register marked in the portal.\n\nNeeds the **attendance:write** permission."
          }
        },
        {
          "name": "Send biometric punches",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each new request; send the same key again to retry it safely."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/attendance/punches",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "attendance",
                "punches"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"punches\": [\n    {\n      \"at\": \"2026-10-08T07:52:10+05:00\",\n      \"personType\": \"student\",\n      \"identifier\": {\n        \"admissionNo\": \"ADM-2026-00412\",\n        \"rollNo\": 1,\n        \"sectionId\": 1,\n        \"staffCode\": \"STF-0007\",\n        \"cardNo\": \"0004417365\"\n      },\n      \"direction\": \"in\",\n      \"deviceId\": \"gate-1\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Up to 500 punches from attendance machines. Students: the first \"in\" of the day marks them present, or late after the school's late time, in their section's register (a register is started if there isn't one; absent is never set by a punch, and a mark someone already made is kept, except absent which becomes present or late). Staff: their day's status (present / late) with the earliest check-in and latest check-out. Each punch (person, time, direction) counts once. Punches older than 7 days, in the future, or on a day the school is closed are outside_window.\n\nNeeds the **attendance:write** permission."
          }
        }
      ]
    },
    {
      "name": "Fees",
      "item": [
        {
          "name": "List fee vouchers",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/vouchers",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "vouchers"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "month",
                  "value": "",
                  "disabled": true,
                  "description": "YYYY-MM"
                },
                {
                  "key": "familyId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "studentId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "",
                  "disabled": true,
                  "description": "How many records to return (1–200, default 50)."
                },
                {
                  "key": "cursor",
                  "value": "",
                  "disabled": true,
                  "description": "nextCursor from the previous page."
                }
              ]
            },
            "description": "Vouchers (fee challans) in id order. status: open (anything unpaid), paid, overdue (unpaid after the due date).\n\nNeeds the **fees:read** permission."
          }
        },
        {
          "name": "One fee voucher",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/vouchers/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "vouchers",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "1",
                  "description": "The record's id."
                }
              ]
            },
            "description": "Needs the **fees:read** permission."
          }
        },
        {
          "name": "Fee defaulters",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/defaulters",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "defaulters"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "",
                  "disabled": true,
                  "description": "How many records to return (1–200, default 50)."
                },
                {
                  "key": "cursor",
                  "value": "",
                  "disabled": true,
                  "description": "nextCursor from the previous page."
                }
              ]
            },
            "description": "Students with fees unpaid after the due date, the longest behind first (the order of Finance › Defaulters).\n\nNeeds the **fees:read** permission."
          }
        },
        {
          "name": "List fee receipts",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/receipts",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "receipts"
              ],
              "query": [
                {
                  "key": "familyId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "from",
                  "value": "",
                  "disabled": true,
                  "description": "Received on or after (YYYY-MM-DD)."
                },
                {
                  "key": "to",
                  "value": "",
                  "disabled": true,
                  "description": "Received on or before."
                },
                {
                  "key": "method",
                  "value": "",
                  "disabled": true,
                  "description": "A payment method, e.g. cash, ibft."
                },
                {
                  "key": "limit",
                  "value": "",
                  "disabled": true,
                  "description": "How many records to return (1–200, default 50)."
                },
                {
                  "key": "cursor",
                  "value": "",
                  "disabled": true,
                  "description": "nextCursor from the previous page."
                }
              ]
            },
            "description": "Receipts (money received) in id order, newest last. Filter by family and by the day received (from, to). Cancelled receipts are included with cancelled: true.\n\nNeeds the **fees:read** permission."
          }
        },
        {
          "name": "One fee receipt",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/receipts/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "receipts",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "1",
                  "description": "The record's id."
                }
              ]
            },
            "description": "A receipt with what it paid: each voucher, its student and month, and the late fine paid on it.\n\nNeeds the **fees:read** permission."
          }
        },
        {
          "name": "A student's fees",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/students/:id/fees",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "students",
                ":id",
                "fees"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "",
                  "disabled": true,
                  "description": "How many vouchers (1–120, default 12)."
                }
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "1",
                  "description": "The record's id."
                }
              ]
            },
            "description": "What the student owes (unpaid and overdue, over all their vouchers) and their vouchers, newest month first (limit, default 12).\n\nNeeds the **fees:read** permission."
          }
        },
        {
          "name": "Record a payment",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each new request; send the same key again to retry it safely."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/payments",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "payments"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 1,\n  \"method\": \"ibft\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "A payment confirmed by a bank, 1Link, JazzCash, Easypaisa… becomes a receipt from the school's normal receipt series, exactly as if taken at the fee counter: late fines first, then the oldest vouchers. Name the family (familyId or familyCode) to pay its open vouchers, or voucherNumber to pay one voucher. An Idempotency-Key header is required, and the same method + reference can't be recorded twice. The receipt is dated today; paidAt and note are kept on it.\n\nNeeds the **fees:write** permission."
          }
        }
      ]
    },
    {
      "name": "Exams",
      "item": [
        {
          "name": "List exams",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/exams",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "exams"
              ],
              "query": [
                {
                  "key": "yearId",
                  "value": "",
                  "disabled": true,
                  "description": "The session (GET /years). Default: the current one."
                },
                {
                  "key": "status",
                  "value": "",
                  "disabled": true,
                  "description": "draft | scheduled | marking | published"
                }
              ]
            },
            "description": "A session's exams (the current session by default), oldest first, with the classes sitting them.\n\nNeeds the **exams:read** permission."
          }
        },
        {
          "name": "Exam results for a class or section",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/results",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "results"
              ],
              "query": [
                {
                  "key": "examId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "sectionId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "classId",
                  "value": "",
                  "disabled": true
                }
              ]
            },
            "description": "A published exam's results: each student's marks per paper, total, percentage, grade, pass or fail and position, worked out as the school's report cards are (its grading scheme, pass rule and positions setting). Positions are in the whole class, also when you ask for one section. Students are those on the class's roll. Before the results are published: 404 results_not_published.\n\nNeeds the **exams:read** permission."
          }
        },
        {
          "name": "A student's results",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/students/:id/results",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "students",
                ":id",
                "results"
              ],
              "query": [
                {
                  "key": "yearId",
                  "value": "",
                  "disabled": true,
                  "description": "Default: the current session."
                }
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "1",
                  "description": "The record's id."
                }
              ]
            },
            "description": "The student's results in each published exam of a session (the current one by default), in the class they were enrolled in that session.\n\nNeeds the **exams:read** permission."
          }
        },
        {
          "name": "Enter a paper's marks for a section",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each new request; send the same key again to retry it safely."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/marks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "marks"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"paperId\": 1,\n  \"sectionId\": 1,\n  \"marks\": [\n    {\n      \"studentId\": 1,\n      \"marks\": 0,\n      \"absent\": true\n    }\n  ],\n  \"submit\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Marks for the students of a section on one paper (the date sheet's papers: GET /exams, then the portal's papers), as Examinations › Marks saves them. Each student: marks (0 to the paper's maximum), absent: true, or neither (no mark yet). The sheet is saved as a draft, or locked with submit: true (every student needs a mark or absent). Students not on the sheet are ignored (listed in ignored). A submitted sheet, or an exam whose results are published, is 409 sheet_locked; reopening a sheet is done in the portal.\n\nNeeds the **exams:write** permission."
          }
        }
      ]
    },
    {
      "name": "Staff",
      "item": [
        {
          "name": "List staff",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/staff",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "staff"
              ],
              "query": [
                {
                  "key": "q",
                  "value": "",
                  "disabled": true,
                  "description": "Search: name or employee number."
                },
                {
                  "key": "status",
                  "value": "",
                  "disabled": true,
                  "description": "active (default), left or all."
                },
                {
                  "key": "departmentId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "designationId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "campusId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "updatedSince",
                  "value": "",
                  "disabled": true,
                  "description": "Staff added or changed since (ISO date-time)."
                },
                {
                  "key": "limit",
                  "value": "",
                  "disabled": true,
                  "description": "How many records to return (1–200, default 50)."
                },
                {
                  "key": "cursor",
                  "value": "",
                  "disabled": true,
                  "description": "nextCursor from the previous page."
                }
              ]
            },
            "description": "Staff in id order, current staff by default (status=left for former staff, all for both). Pay, bank details and CNICs only with salaries:read.\n\nNeeds the **staff:read** permission."
          }
        },
        {
          "name": "One member of staff",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/staff/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "staff",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "1",
                  "description": "The record's id."
                }
              ]
            },
            "description": "Needs the **staff:read** permission."
          }
        }
      ]
    },
    {
      "name": "Gate",
      "item": [
        {
          "name": "The gate log",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/pickups",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "pickups"
              ],
              "query": [
                {
                  "key": "from",
                  "value": "",
                  "disabled": true,
                  "description": "First day (YYYY-MM-DD). Default: to."
                },
                {
                  "key": "to",
                  "value": "",
                  "disabled": true,
                  "description": "Last day. Default: today."
                },
                {
                  "key": "studentId",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "result",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "direction",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "",
                  "disabled": true,
                  "description": "How many records to return (1–200, default 50)."
                },
                {
                  "key": "cursor",
                  "value": "",
                  "disabled": true,
                  "description": "nextCursor from the previous page."
                }
              ]
            },
            "description": "Children handed over or refused at the gate between from and to (school days in the school's time zone; default today; at most 92 days), in id order.\n\nNeeds the **gate:read** permission."
          }
        }
      ]
    },
    {
      "name": "Notices",
      "item": [
        {
          "name": "List notices",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/notices",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "notices"
              ],
              "query": [
                {
                  "key": "audience",
                  "value": "",
                  "disabled": true
                },
                {
                  "key": "status",
                  "value": "",
                  "disabled": true,
                  "description": "Default: every notice."
                },
                {
                  "key": "limit",
                  "value": "",
                  "disabled": true,
                  "description": "How many records to return (1–200, default 50)."
                },
                {
                  "key": "cursor",
                  "value": "",
                  "disabled": true,
                  "description": "nextCursor from the previous page."
                }
              ]
            },
            "description": "Notices in id order. status: live (up now), scheduled, expired, draft, or published (every published one).\n\nNeeds the **notices:read** permission."
          }
        },
        {
          "name": "Post a notice",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new key for each new request; send the same key again to retry it safely."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/notices",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "notices"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"title\": \"\",\n  \"text\": \"\",\n  \"category\": \"\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Puts a notice on the board, as School Life › Notice Board does. publish: false keeps it a draft. With publishFrom in the future it goes up then. Staff it reaches get it in the bell, and the notice.published webhook fires when it goes live. A campus-limited key posts to its campus.\n\nNeeds the **notices:write** permission."
          }
        }
      ]
    },
    {
      "name": "Changes",
      "item": [
        {
          "name": "What changed since",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/changes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "changes"
              ],
              "query": [
                {
                  "key": "since",
                  "value": "",
                  "disabled": true,
                  "description": "nextCursor from the previous call. Leave out to start from now."
                },
                {
                  "key": "limit",
                  "value": "",
                  "disabled": true,
                  "description": "How many records to return (1–200, default 50)."
                }
              ]
            },
            "description": "A polling feed for tools without webhooks (Zapier, Google Sheets, a nightly sync): the records added, changed or deleted since your cursor, oldest first, only those the key may read (and on its campus). Start without since to get a cursor for now; then call with since=nextCursor every few minutes, and again straight away while hasMore is true. nextCursor is always given: keep the last one. A page may be empty while hasMore is true (changes the key can't see). Changes are kept 30 days: an older cursor is 409 cursor_expired (read the lists again, then poll from a new cursor). Staff, exams, notices and the gate log aren't in the feed: use their lists (staff and students take updatedSince) or webhooks. Any key can read this."
          }
        }
      ]
    }
  ]
}