{"info":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","description":"<html><head></head><body><h1 id=\"zenslearn-public-api\">Zenslearn Public API</h1>\n<p><strong>Version:</strong> v1 | <strong>Base URL:</strong> <code>https://api.zenslearn.com/api/v1/public</code></p>\n<p>Programmatic access to your institute's LMS data for seamless integration with CRMs, ERPs, admissions systems, and custom applications.</p>\n<hr>\n<h2 id=\"quick-start\">Quick Start</h2>\n<p><strong>1.</strong> Generate an API key from your LMS admin panel: <strong>Settings → API Keys</strong></p>\n<p><strong>2.</strong> Add the key to every request header:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>X-API-Key: your_api_key_here\n\n</code></pre><p><strong>3.</strong> Make your first call:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-bash\">curl https://api.zenslearn.com/api/v1/public/students \\\n  -H \"X-API-Key: your_api_key_here\"\n\n</code></pre>\n<hr>\n<h2 id=\"authentication\">Authentication</h2>\n<p>All endpoints require an API key via the <code>X-API-Key</code> header. Each key is:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Institute-scoped</strong></td>\n<td>Keys are bound to your institute — you can only access your own data</td>\n</tr>\n<tr>\n<td><strong>Scope-controlled</strong></td>\n<td>Granular permissions: <code>read</code>, <code>write</code>, or resource-specific like <code>students:read</code></td>\n</tr>\n<tr>\n<td><strong>Expirable</strong></td>\n<td>Optional TTL for time-limited integrations</td>\n</tr>\n<tr>\n<td><strong>Revocable</strong></td>\n<td>Instant revocation from the admin panel</td>\n</tr>\n<tr>\n<td><strong>Hashed at rest</strong></td>\n<td>If lost, revoke and create a new one</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"rate-limits\">Rate Limits</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Limit</th>\n<th>Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>General</td>\n<td><strong>1,000 requests/minute</strong> per API key</td>\n</tr>\n<tr>\n<td>Student creation</td>\n<td><strong>20 requests/minute</strong> per API key</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>429 Too Many Requests</code> responses include a <code>Retry-After</code> header (seconds).</p>\n<h2 id=\"erp-→-lms-fee-writes-idempotency\">ERP → LMS Fee Writes (Idempotency)</h2>\n<p>The <strong>Fees &amp; Payments</strong> folder includes write endpoints so any ERP can push the fee lifecycle into the LMS: create plan, record payment, cancel plan, waive installment. These require the <code>fees:write</code> scope.</p>\n<p><strong>Record Payment requires an</strong> <strong><code>Idempotency-Key</code></strong> <strong>header</strong> (e.g. your ERP's payment/doc id). Retries with the same key replay the original result; reuse with a different body returns <code>409</code>. ERP-originated writes are tagged so they are not echoed back out to your ERP webhooks/sync.</p>\n<h2 id=\"response-format\">Response Format</h2>\n<p><strong>Paginated lists:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"data\": [...],\n  \"total\": 250,\n  \"page\": 1,\n  \"per_page\": 20,\n  \"total_pages\": 13\n}\n\n</code></pre>\n<p><strong>Single resource:</strong> Returns the object directly (no wrapper).</p>\n<p><strong>Errors:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"detail\": \"Human-readable error message\"\n}\n\n</code></pre>\n<h2 id=\"pagination\">Pagination</h2>\n<p>All list endpoints accept these query parameters:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>page</code></td>\n<td><code>1</code></td>\n<td>Page number (1-indexed)</td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td><code>20</code></td>\n<td>Items per page (max: 100)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"error-codes\">Error Codes</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400</code></td>\n<td>Validation error or business rule violation (e.g. missing Idempotency-Key)</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing, invalid, or expired API key</td>\n</tr>\n<tr>\n<td><code>403</code></td>\n<td>Insufficient scope or institute suspended</td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td>Resource not found (or belongs to another institute)</td>\n</tr>\n<tr>\n<td><code>409</code></td>\n<td>Conflict (already paid/cancelled, or idempotency-key reuse with a different body)</td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Unprocessable (e.g. overpayment — body includes <code>remaining_balance</code>)</td>\n</tr>\n<tr>\n<td><code>429</code></td>\n<td>Rate limit exceeded</td>\n</tr>\n<tr>\n<td><code>500</code></td>\n<td>Internal server error</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"scopes-reference\">Scopes Reference</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Scope</th>\n<th>Access</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>read</code></td>\n<td>All read endpoints</td>\n</tr>\n<tr>\n<td><code>write</code></td>\n<td>All write endpoints</td>\n</tr>\n<tr>\n<td><code>students:read</code></td>\n<td>List/get students only</td>\n</tr>\n<tr>\n<td><code>students:write</code></td>\n<td>Create/update students</td>\n</tr>\n<tr>\n<td><code>students:pii</code></td>\n<td>Include phone numbers in student responses</td>\n</tr>\n<tr>\n<td><code>batches:read</code></td>\n<td>List/get batches</td>\n</tr>\n<tr>\n<td><code>courses:read</code></td>\n<td>List/get courses</td>\n</tr>\n<tr>\n<td><code>enrollments:read</code> / <code>enrollments:write</code></td>\n<td>Enrollment operations</td>\n</tr>\n<tr>\n<td><code>certificates:read</code> / <code>certificates:write</code></td>\n<td>Certificate operations</td>\n</tr>\n<tr>\n<td><code>classes:read</code></td>\n<td>Classes and attendance</td>\n</tr>\n<tr>\n<td><code>announcements:read</code> / <code>announcements:write</code></td>\n<td>Announcement operations</td>\n</tr>\n<tr>\n<td><code>jobs:read</code></td>\n<td>Job postings</td>\n</tr>\n<tr>\n<td><code>fees:read</code></td>\n<td>Fee plans, installments, payments, per-student summary (read)</td>\n</tr>\n<tr>\n<td><code>fees:write</code></td>\n<td>Create plan, record payment, cancel plan, waive installment</td>\n</tr>\n<tr>\n<td><code>teachers:read</code></td>\n<td>Teachers</td>\n</tr>\n<tr>\n<td><code>progress:read</code></td>\n<td>Lecture progress</td>\n</tr>\n<tr>\n<td><code>recordings:read</code></td>\n<td>Class recordings</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"versioning\">Versioning</h2>\n<p>URL-prefixed (<code>/api/v1/public</code>). Breaking changes ship under <code>/api/v2/\\\\\\\\\\*</code> with a minimum <strong>6-month deprecation window</strong>.</p>\n<h2 id=\"sdk--language-support\">SDK &amp; Language Support</h2>\n<p>No official SDK required. Works with any HTTP client: Python <code>httpx</code>/<code>requests</code>, Node <code>fetch</code>/<code>axios</code>, Go <code>net/http</code>, PHP <code>Guzzle</code>, C# <code>HttpClient</code>, etc.</p>\n<hr>\n<p><strong>Need help?</strong> Contact your Zenslearn account manager or email <a href=\"https://mailto:support@zenslearn.com\"><b>support@zenslearn.com</b></a></p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[{"content":"Zenslearn Public API","slug":"zenslearn-public-api"}],"owner":"51471734","collectionId":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","publishedId":"2sBXwntCRo","public":true,"customColor":{"top-bar":"1a1a2e","right-sidebar":"16213e","highlight":"0f3460"},"publishDate":"2026-06-24T09:38:11.000Z"},"item":[{"name":"Students","item":[{"name":"List Students","id":"03cdc625-4535-4032-97e2-833fc12fde4a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/students?page=1&per_page=20","description":"<p>Returns a paginated list of all students in your institute.</p>\n<p><strong>Scope:</strong> <code>students:read</code> or <code>read</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"query-parameters\">Query Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>search</code></td>\n<td>string</td>\n<td>—</td>\n<td>Filter by name, email, or phone</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td>—</td>\n<td>Filter: <code>active</code> or <code>inactive</code></td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>integer</td>\n<td><code>1</code></td>\n<td>Page number</td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>integer</td>\n<td><code>20</code></td>\n<td>Items per page (max: 100)</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields\">Response Fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>uuid</td>\n<td>Student unique identifier</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>Student email address</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Full name</td>\n</tr>\n<tr>\n<td><code>phone</code></td>\n<td>string/null</td>\n<td>Phone number (requires <code>students:pii</code> scope)</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td><code>active</code> or <code>inactive</code></td>\n</tr>\n<tr>\n<td><code>created_at</code></td>\n<td>datetime</td>\n<td>ISO 8601 timestamp</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["students"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[{"disabled":true,"description":{"content":"<p>Search by name, email, or phone</p>\n","type":"text/plain"},"key":"search","value":""},{"disabled":true,"description":{"content":"<p>Filter by status: active, inactive</p>\n","type":"text/plain"},"key":"status","value":""},{"description":{"content":"<p>Page number (default: 1)</p>\n","type":"text/plain"},"key":"page","value":"1"},{"description":{"content":"<p>Items per page (default: 20, max: 100)</p>\n","type":"text/plain"},"key":"per_page","value":"20"}],"variable":[]}},"response":[{"id":"f2eb7f5c-60fa-46ef-a38d-350262db5121","name":"200 — Success","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.zenslearn.com/api/v1/public/students?page=1&per_page=20","host":["https://api.zenslearn.com/api/v1/public"],"path":["students"],"query":[{"key":"search","value":"","description":"Search by name, email, or phone","disabled":true},{"key":"status","value":"","description":"Filter by status: active, inactive","disabled":true},{"key":"page","value":"1","description":"Page number (default: 1)"},{"key":"per_page","value":"20","description":"Items per page (default: 20, max: 100)"}]},"description":"Returns a paginated list of all students in your institute.\n\n**Scope:** `students:read` or `read` | **Rate limit:** 1,000/min\n\n### Query Parameters\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `search` | string | — | Filter by name, email, or phone |\n| `status` | string | — | Filter: `active` or `inactive` |\n| `page` | integer | `1` | Page number |\n| `per_page` | integer | `20` | Items per page (max: 100) |\n\n### Response Fields\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | uuid | Student unique identifier |\n| `email` | string | Student email address |\n| `name` | string | Full name |\n| `phone` | string/null | Phone number (requires `students:pii` scope) |\n| `status` | string | `active` or `inactive` |\n| `created_at` | datetime | ISO 8601 timestamp |"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"id\": \"0360ad10-9512-4937-9efd-cb3303921fc8\",\n      \"email\": \"ali@example.com\",\n      \"name\": \"Ali Ahmed\",\n      \"phone\": null,\n      \"status\": \"active\",\n      \"created_at\": \"2026-03-07T12:05:49.095153Z\"\n    }\n  ],\n  \"total\": 1,\n  \"page\": 1,\n  \"per_page\": 20,\n  \"total_pages\": 1\n}"}],"_postman_id":"03cdc625-4535-4032-97e2-833fc12fde4a"},{"name":"Get Student","id":"64a9ce46-c9bb-44b1-9d26-de0b03fff94b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/students/","description":"<p>Retrieve a single student by their UUID.</p>\n<p><strong>Scope:</strong> <code>students:read</code> or <code>read</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"path-parameters\">Path Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>student_id</code></td>\n<td>uuid</td>\n<td><strong>Required.</strong> The student's unique identifier</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>404</code></td>\n<td>Student not found or belongs to another institute</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["students",""],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[{"id":"a66def24-3e7a-492b-8e4d-72fdb8dae037","name":"200 — Success","originalRequest":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/students/","description":"Retrieve a single student by their UUID.\n\n**Scope:** `students:read` or `read` | **Rate limit:** 1,000/min\n\n### Path Parameters\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `student_id` | uuid | **Required.** The student's unique identifier |\n\n### Errors\n| Code | Description |\n|------|-------------|\n| `404` | Student not found or belongs to another institute |"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"0360ad10-9512-4937-9efd-cb3303921fc8\",\n  \"email\": \"ali@example.com\",\n  \"name\": \"Ali Ahmed\",\n  \"phone\": null,\n  \"status\": \"active\",\n  \"created_at\": \"2026-03-07T12:05:49.095153Z\"\n}"},{"id":"bc4471cb-2542-49e4-b870-abc4bc8fbf80","name":"404 — Not Found","originalRequest":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/students/","description":"Retrieve a single student by their UUID.\n\n**Scope:** `students:read` or `read` | **Rate limit:** 1,000/min\n\n### Path Parameters\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `student_id` | uuid | **Required.** The student's unique identifier |\n\n### Errors\n| Code | Description |\n|------|-------------|\n| `404` | Student not found or belongs to another institute |"},"status":"Not Found","code":404,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"detail\": \"Student not found\"\n}"}],"_postman_id":"64a9ce46-c9bb-44b1-9d26-de0b03fff94b"},{"name":"Create Student","id":"06190327-39bb-49f4-b15b-495fe1f9f242","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"email\": \"newstudent@example.com\",\n  \"name\": \"New Student\",\n  \"phone\": \"0300-1234567\",\n  \"password\": \"optional-password\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.zenslearn.com/api/v1/public/students","description":"<p>Create a new student in your institute. Automatically checks against your plan's student quota.</p>\n<p><strong>Scope:</strong> <code>students:write</code> or <code>write</code> | <strong>Rate limit:</strong> 20/min</p>\n<h3 id=\"request-body\">Request Body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Valid email address (must be unique)</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Student full name</td>\n</tr>\n<tr>\n<td><code>phone</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Phone number</td>\n</tr>\n<tr>\n<td><code>password</code></td>\n<td>string</td>\n<td>No</td>\n<td>8-128 characters. Auto-generated if omitted</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400</code></td>\n<td>Email already exists, invalid format, or student quota exceeded</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"side-effects\">Side Effects</h3>\n<ul>\n<li>Fires <code>user.created</code> webhook event</li>\n<li>Counts toward institute student quota</li>\n</ul>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["students"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[{"id":"0dce7c0e-4c81-4132-847f-58f7ee43ef5f","name":"201 — Created","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"email\": \"newstudent@example.com\",\n  \"name\": \"New Student\",\n  \"phone\": \"0300-1234567\",\n  \"password\": \"optional-password\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.zenslearn.com/api/v1/public/students","description":"Create a new student in your institute. Automatically checks against your plan's student quota.\n\n**Scope:** `students:write` or `write` | **Rate limit:** 20/min\n\n### Request Body\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `email` | string | Yes | Valid email address (must be unique) |\n| `name` | string | Yes | Student full name |\n| `phone` | string | Yes | Phone number |\n| `password` | string | No | 8-128 characters. Auto-generated if omitted |\n\n### Errors\n| Code | Description |\n|------|-------------|\n| `400` | Email already exists, invalid format, or student quota exceeded |\n\n### Side Effects\n- Fires `user.created` webhook event\n- Counts toward institute student quota"},"status":"Created","code":201,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n  \"email\": \"newstudent@example.com\",\n  \"name\": \"New Student\",\n  \"phone\": \"0300-1234567\",\n  \"status\": \"active\",\n  \"created_at\": \"2026-05-30T12:00:00Z\"\n}"},{"id":"c07def3b-4346-49f8-aaad-624e92e1c9cb","name":"400 — Quota Exceeded","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"email\": \"newstudent@example.com\",\n  \"name\": \"New Student\",\n  \"phone\": \"0300-1234567\",\n  \"password\": \"optional-password\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.zenslearn.com/api/v1/public/students","description":"Create a new student in your institute. Automatically checks against your plan's student quota.\n\n**Scope:** `students:write` or `write` | **Rate limit:** 20/min\n\n### Request Body\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `email` | string | Yes | Valid email address (must be unique) |\n| `name` | string | Yes | Student full name |\n| `phone` | string | Yes | Phone number |\n| `password` | string | No | 8-128 characters. Auto-generated if omitted |\n\n### Errors\n| Code | Description |\n|------|-------------|\n| `400` | Email already exists, invalid format, or student quota exceeded |\n\n### Side Effects\n- Fires `user.created` webhook event\n- Counts toward institute student quota"},"status":"Bad Request","code":400,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"detail\": \"Student quota exceeded for your plan\"\n}"}],"_postman_id":"06190327-39bb-49f4-b15b-495fe1f9f242"},{"name":"Update Student","id":"74349dc2-c978-48ab-be27-623884d80cd6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Updated Name\",\n  \"phone\": \"0300-9999999\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.zenslearn.com/api/v1/public/students/","description":"<p>Update an existing student's profile. Only <code>name</code> and <code>phone</code> can be modified.</p>\n<p><strong>Scope:</strong> <code>students:write</code> or <code>write</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"path-parameters\">Path Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>student_id</code></td>\n<td>uuid</td>\n<td><strong>Required.</strong> The student's unique identifier</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"request-body\">Request Body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>No</td>\n<td>Updated name</td>\n</tr>\n<tr>\n<td><code>phone</code></td>\n<td>string</td>\n<td>No</td>\n<td>Updated phone number</td>\n</tr>\n</tbody>\n</table>\n</div><p>At least one field must be provided.</p>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400</code></td>\n<td>No fields provided</td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td>Student not found</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["students",""],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[{"id":"fd772fe1-ee31-4deb-99fa-552149d1d4be","name":"200 — Updated","originalRequest":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Updated Name\",\n  \"phone\": \"0300-9999999\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.zenslearn.com/api/v1/public/students/","description":"Update an existing student's profile. Only `name` and `phone` can be modified.\n\n**Scope:** `students:write` or `write` | **Rate limit:** 1,000/min\n\n### Path Parameters\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `student_id` | uuid | **Required.** The student's unique identifier |\n\n### Request Body\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `name` | string | No | Updated name |\n| `phone` | string | No | Updated phone number |\n\nAt least one field must be provided.\n\n### Errors\n| Code | Description |\n|------|-------------|\n| `400` | No fields provided |\n| `404` | Student not found |"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"0360ad10-9512-4937-9efd-cb3303921fc8\",\n  \"email\": \"ali@example.com\",\n  \"name\": \"Updated Name\",\n  \"phone\": \"0300-9999999\",\n  \"status\": \"active\",\n  \"created_at\": \"2026-03-07T12:05:49.095153Z\"\n}"}],"_postman_id":"74349dc2-c978-48ab-be27-623884d80cd6"}],"id":"341e2436-439b-4d5f-9f1d-170dcbb1f55d","description":"<p>Manage student records in your institute.</p>\n<p><strong>Available scopes:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Scope</th>\n<th>Access</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>students:read</code></td>\n<td>List and retrieve students</td>\n</tr>\n<tr>\n<td><code>students:write</code></td>\n<td>Create and update students</td>\n</tr>\n<tr>\n<td><code>students:pii</code></td>\n<td>Include phone numbers in responses</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p><strong>Note:</strong> Phone numbers are redacted (returned as <code>null</code>) unless the API key has the <code>students:pii</code> scope. This protects student privacy by default.</p>\n</blockquote>\n","_postman_id":"341e2436-439b-4d5f-9f1d-170dcbb1f55d","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}}},{"name":"Batches","item":[{"name":"List Batches","id":"527484ac-0081-4196-b7a1-c4e5cbed773c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/batches?page=1&per_page=20","description":"<p>Returns all batches for your institute with student/course counts and computed status.</p>\n<p><strong>Scope:</strong> <code>batches:read</code> or <code>read</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"response-fields\">Response Fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>uuid</td>\n<td>Batch unique identifier</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Batch display name</td>\n</tr>\n<tr>\n<td><code>start_date</code></td>\n<td>date</td>\n<td>Batch start date</td>\n</tr>\n<tr>\n<td><code>end_date</code></td>\n<td>date</td>\n<td>Batch end date</td>\n</tr>\n<tr>\n<td><code>teacher_name</code></td>\n<td>string</td>\n<td>Assigned teacher</td>\n</tr>\n<tr>\n<td><code>student_count</code></td>\n<td>integer</td>\n<td>Number of enrolled students</td>\n</tr>\n<tr>\n<td><code>course_count</code></td>\n<td>integer</td>\n<td>Number of linked courses</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td>Computed: <code>upcoming</code>, <code>active</code>, or <code>completed</code></td>\n</tr>\n<tr>\n<td><code>created_at</code></td>\n<td>datetime</td>\n<td>ISO 8601 timestamp</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["batches"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[{"description":{"content":"<p>Page number</p>\n","type":"text/plain"},"key":"page","value":"1"},{"description":{"content":"<p>Items per page (max 100)</p>\n","type":"text/plain"},"key":"per_page","value":"20"}],"variable":[]}},"response":[{"id":"5e749084-3111-4add-80f7-ce042c28b085","name":"200 — Success","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.zenslearn.com/api/v1/public/batches?page=1&per_page=20","host":["https://api.zenslearn.com/api/v1/public"],"path":["batches"],"query":[{"key":"page","value":"1","description":"Page number"},{"key":"per_page","value":"20","description":"Items per page (max 100)"}]},"description":"Returns all batches for your institute with student/course counts and computed status.\n\n**Scope:** `batches:read` or `read` | **Rate limit:** 1,000/min\n\n### Response Fields\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | uuid | Batch unique identifier |\n| `name` | string | Batch display name |\n| `start_date` | date | Batch start date |\n| `end_date` | date | Batch end date |\n| `teacher_name` | string | Assigned teacher |\n| `student_count` | integer | Number of enrolled students |\n| `course_count` | integer | Number of linked courses |\n| `status` | string | Computed: `upcoming`, `active`, or `completed` |\n| `created_at` | datetime | ISO 8601 timestamp |"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"id\": \"b1234567-...\",\n      \"name\": \"Batch 1 - January 2026\",\n      \"start_date\": \"2026-01-15\",\n      \"end_date\": \"2026-04-15\",\n      \"teacher_name\": \"Ahmed Khan\",\n      \"student_count\": 28,\n      \"course_count\": 2,\n      \"status\": \"active\",\n      \"created_at\": \"2026-01-01T00:00:00Z\"\n    }\n  ],\n  \"total\": 1,\n  \"page\": 1,\n  \"per_page\": 20,\n  \"total_pages\": 1\n}"}],"_postman_id":"527484ac-0081-4196-b7a1-c4e5cbed773c"},{"name":"Get Batch","id":"c62a26b4-a0a8-4225-8f38-8c4d60d03e77","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/batches/","description":"<p>Retrieve a single batch by ID with student count, course count, and computed status.</p>\n<p><strong>Scope:</strong> <code>batches:read</code> or <code>read</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"path-parameters\">Path Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>batch_id</code></td>\n<td>uuid</td>\n<td><strong>Required.</strong> The batch's unique identifier</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>404</code></td>\n<td>Batch not found</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["batches",""],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[],"_postman_id":"c62a26b4-a0a8-4225-8f38-8c4d60d03e77"}],"id":"f25d43a7-865a-42a5-8830-80a6aff309c7","description":"<p>View batch information including student counts, course assignments, and computed status.</p>\n<p><strong>Scope required:</strong> <code>batches:read</code> or <code>read</code></p>\n<p>Batch status is computed automatically from dates:</p>\n<ul>\n<li><code>upcoming</code> — start date is in the future</li>\n<li><code>active</code> — current date is between start and end</li>\n<li><code>completed</code> — end date has passed</li>\n</ul>\n","_postman_id":"f25d43a7-865a-42a5-8830-80a6aff309c7","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}}},{"name":"Courses","item":[{"name":"List Courses","id":"7308c551-56f7-4e78-bf1e-3be0f42b9d3a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/courses?page=1&per_page=20","description":"<p>Returns all courses in your institute.</p>\n<p><strong>Scope:</strong> <code>courses:read</code> or <code>read</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"response-fields\">Response Fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>uuid</td>\n<td>Course unique identifier</td>\n</tr>\n<tr>\n<td><code>title</code></td>\n<td>string</td>\n<td>Course title</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td>string</td>\n<td>Course description</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td><code>upcoming</code>, <code>active</code>, or <code>completed</code></td>\n</tr>\n<tr>\n<td><code>created_at</code></td>\n<td>datetime</td>\n<td>ISO 8601 timestamp</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["courses"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[{"key":"page","value":"1"},{"key":"per_page","value":"20"}],"variable":[]}},"response":[{"id":"da3813b1-da44-4aa7-b1fa-efe8702c9130","name":"200 — Success","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.zenslearn.com/api/v1/public/courses?page=1&per_page=20","host":["https://api.zenslearn.com/api/v1/public"],"path":["courses"],"query":[{"key":"page","value":"1"},{"key":"per_page","value":"20"}]},"description":"Returns all courses in your institute.\n\n**Scope:** `courses:read` or `read` | **Rate limit:** 1,000/min\n\n### Response Fields\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | uuid | Course unique identifier |\n| `title` | string | Course title |\n| `description` | string | Course description |\n| `status` | string | `upcoming`, `active`, or `completed` |\n| `created_at` | datetime | ISO 8601 timestamp |"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"id\": \"cr1234...\",\n      \"title\": \"Web Development Bootcamp\",\n      \"description\": \"Full-stack web development course\",\n      \"status\": \"active\",\n      \"created_at\": \"2026-01-01T00:00:00Z\"\n    }\n  ],\n  \"total\": 1,\n  \"page\": 1,\n  \"per_page\": 20,\n  \"total_pages\": 1\n}"}],"_postman_id":"7308c551-56f7-4e78-bf1e-3be0f42b9d3a"},{"name":"Get Course (with Modules)","id":"d2250762-5763-40b8-af7c-f11eb1bfac91","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/courses/","description":"<p>Retrieve a single course with its curriculum modules.</p>\n<p><strong>Scope:</strong> <code>courses:read</code> or <code>read</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"path-parameters\">Path Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>course_id</code></td>\n<td>uuid</td>\n<td><strong>Required.</strong> The course's unique identifier</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p>Returns the course object with an additional <code>modules</code> array containing each curriculum module's <code>id</code>, <code>title</code>, and <code>order</code>.</p>\n<h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>404</code></td>\n<td>Course not found</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["courses",""],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[{"id":"64b96f39-e723-4494-8bfa-a169bb207c51","name":"200 — Success","originalRequest":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/courses/","description":"Retrieve a single course with its curriculum modules.\n\n**Scope:** `courses:read` or `read` | **Rate limit:** 1,000/min\n\n### Path Parameters\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `course_id` | uuid | **Required.** The course's unique identifier |\n\n### Response\nReturns the course object with an additional `modules` array containing each curriculum module's `id`, `title`, and `order`.\n\n### Errors\n| Code | Description |\n|------|-------------|\n| `404` | Course not found |"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"cr1234...\",\n  \"title\": \"Web Development Bootcamp\",\n  \"description\": \"Full-stack web development course\",\n  \"status\": \"active\",\n  \"created_at\": \"2026-01-01T00:00:00Z\",\n  \"modules\": [\n    {\"id\": \"m1\", \"title\": \"HTML & CSS\", \"order\": 1},\n    {\"id\": \"m2\", \"title\": \"JavaScript\", \"order\": 2}\n  ]\n}"}],"_postman_id":"d2250762-5763-40b8-af7c-f11eb1bfac91"}],"id":"cf58abc2-393b-40a9-9ddd-f77fe2b9cc18","description":"<p>View courses and their curriculum modules.</p>\n<p><strong>Scope required:</strong> <code>courses:read</code> or <code>read</code></p>\n<p>The detail endpoint (<code>GET /courses/{id}</code>) includes the course's curriculum modules with their ordering.</p>\n","_postman_id":"cf58abc2-393b-40a9-9ddd-f77fe2b9cc18","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}}},{"name":"Enrollments","item":[{"name":"List Enrollments","id":"7906de5f-b4b5-4d21-af70-07a2a06fcfd9","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/enrollments?page=1&per_page=20","description":"<p>List all student-batch enrollments.</p>\n<p><strong>Scope:</strong> <code>enrollments:read</code> or <code>read</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"query-parameters\">Query Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>batch_id</code></td>\n<td>uuid</td>\n<td>—</td>\n<td>Filter by batch</td>\n</tr>\n<tr>\n<td><code>student_id</code></td>\n<td>uuid</td>\n<td>—</td>\n<td>Filter by student</td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>integer</td>\n<td><code>1</code></td>\n<td>Page number</td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>integer</td>\n<td><code>20</code></td>\n<td>Items per page (max: 100)</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields\">Response Fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>uuid</td>\n<td>Enrollment unique identifier</td>\n</tr>\n<tr>\n<td><code>student_id</code></td>\n<td>uuid</td>\n<td>Student ID</td>\n</tr>\n<tr>\n<td><code>student_name</code></td>\n<td>string</td>\n<td>Student full name</td>\n</tr>\n<tr>\n<td><code>student_email</code></td>\n<td>string</td>\n<td>Student email</td>\n</tr>\n<tr>\n<td><code>batch_id</code></td>\n<td>uuid</td>\n<td>Batch ID</td>\n</tr>\n<tr>\n<td><code>batch_name</code></td>\n<td>string</td>\n<td>Batch name</td>\n</tr>\n<tr>\n<td><code>enrolled_at</code></td>\n<td>datetime</td>\n<td>Enrollment timestamp</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["enrollments"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[{"disabled":true,"description":{"content":"<p>Filter by batch</p>\n","type":"text/plain"},"key":"batch_id","value":""},{"disabled":true,"description":{"content":"<p>Filter by student</p>\n","type":"text/plain"},"key":"student_id","value":""},{"key":"page","value":"1"},{"key":"per_page","value":"20"}],"variable":[]}},"response":[{"id":"a4c72844-0fb2-472e-a98d-88b5376a834d","name":"200 — Success","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.zenslearn.com/api/v1/public/enrollments?page=1&per_page=20","host":["https://api.zenslearn.com/api/v1/public"],"path":["enrollments"],"query":[{"key":"batch_id","value":"","description":"Filter by batch","disabled":true},{"key":"student_id","value":"","description":"Filter by student","disabled":true},{"key":"page","value":"1"},{"key":"per_page","value":"20"}]},"description":"List all student-batch enrollments.\n\n**Scope:** `enrollments:read` or `read` | **Rate limit:** 1,000/min\n\n### Query Parameters\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `batch_id` | uuid | — | Filter by batch |\n| `student_id` | uuid | — | Filter by student |\n| `page` | integer | `1` | Page number |\n| `per_page` | integer | `20` | Items per page (max: 100) |\n\n### Response Fields\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | uuid | Enrollment unique identifier |\n| `student_id` | uuid | Student ID |\n| `student_name` | string | Student full name |\n| `student_email` | string | Student email |\n| `batch_id` | uuid | Batch ID |\n| `batch_name` | string | Batch name |\n| `enrolled_at` | datetime | Enrollment timestamp |"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"id\": \"e1234...\",\n      \"student_id\": \"s1234...\",\n      \"student_name\": \"Ali Ahmed\",\n      \"student_email\": \"ali@example.com\",\n      \"batch_id\": \"b1234...\",\n      \"batch_name\": \"Batch 1\",\n      \"enrolled_at\": \"2026-01-15T00:00:00Z\"\n    }\n  ],\n  \"total\": 1,\n  \"page\": 1,\n  \"per_page\": 20,\n  \"total_pages\": 1\n}"}],"_postman_id":"7906de5f-b4b5-4d21-af70-07a2a06fcfd9"},{"name":"Enroll Student","id":"2fd5e570-bcf7-4b87-843c-b7368e896ddb","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"student_id\": \"\",\n  \"batch_id\": \"\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.zenslearn.com/api/v1/public/enrollments","description":"<p>Enroll a student in a batch. Both the student and batch must belong to your institute.</p>\n<p><strong>Scope:</strong> <code>enrollments:write</code> or <code>write</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"request-body\">Request Body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>student_id</code></td>\n<td>uuid</td>\n<td>Yes</td>\n<td>The student to enroll</td>\n</tr>\n<tr>\n<td><code>batch_id</code></td>\n<td>uuid</td>\n<td>Yes</td>\n<td>The target batch</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400</code></td>\n<td>Student/batch not found or student already enrolled</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"side-effects\">Side Effects</h3>\n<ul>\n<li>Fires <code>enrollment.created</code> webhook event</li>\n</ul>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["enrollments"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[],"_postman_id":"2fd5e570-bcf7-4b87-843c-b7368e896ddb"},{"name":"Remove Enrollment","id":"c7b9653d-b541-486b-9983-6326adb4589f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"student_id\": \"\",\n  \"batch_id\": \"\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.zenslearn.com/api/v1/public/enrollments","description":"<p>Remove a student from a batch.</p>\n<p><strong>Scope:</strong> <code>enrollments:write</code> or <code>write</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"request-body\">Request Body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>student_id</code></td>\n<td>uuid</td>\n<td>Yes</td>\n<td>The student to remove</td>\n</tr>\n<tr>\n<td><code>batch_id</code></td>\n<td>uuid</td>\n<td>Yes</td>\n<td>The batch to remove from</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400</code></td>\n<td>Enrollment not found</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"side-effects\">Side Effects</h3>\n<ul>\n<li>Fires <code>enrollment.removed</code> webhook event</li>\n</ul>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["enrollments"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[],"_postman_id":"c7b9653d-b541-486b-9983-6326adb4589f"}],"id":"c59d1c48-6b29-4c17-a64f-a8cb37f9e793","description":"<p>Manage student-batch enrollments. Enroll students into batches or remove them.</p>\n<p><strong>Available scopes:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Scope</th>\n<th>Access</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>enrollments:read</code></td>\n<td>List enrollments</td>\n</tr>\n<tr>\n<td><code>enrollments:write</code></td>\n<td>Enroll or remove students</td>\n</tr>\n</tbody>\n</table>\n</div>","_postman_id":"c59d1c48-6b29-4c17-a64f-a8cb37f9e793","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}}},{"name":"Certificates","item":[{"name":"List Certificates","id":"19474508-0261-4f19-a063-f7dca5cac40a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/certificates?page=1&per_page=20","description":"<p>List all issued certificates for your institute.</p>\n<p><strong>Scope:</strong> <code>certificates:read</code> or <code>read</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"query-parameters\">Query Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>batch_id</code></td>\n<td>uuid</td>\n<td>—</td>\n<td>Filter by batch</td>\n</tr>\n<tr>\n<td><code>course_id</code></td>\n<td>uuid</td>\n<td>—</td>\n<td>Filter by course</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td>—</td>\n<td>Filter by certificate status</td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>integer</td>\n<td><code>1</code></td>\n<td>Page number</td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>integer</td>\n<td><code>20</code></td>\n<td>Items per page (max: 100)</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields\">Response Fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>uuid</td>\n<td>Certificate unique identifier</td>\n</tr>\n<tr>\n<td><code>student_id</code></td>\n<td>uuid</td>\n<td>Student ID</td>\n</tr>\n<tr>\n<td><code>student_name</code></td>\n<td>string</td>\n<td>Student full name</td>\n</tr>\n<tr>\n<td><code>certificate_id</code></td>\n<td>string</td>\n<td>Human-readable certificate ID</td>\n</tr>\n<tr>\n<td><code>verification_code</code></td>\n<td>string</td>\n<td>Public verification code</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td>Certificate status</td>\n</tr>\n<tr>\n<td><code>completion_percentage</code></td>\n<td>integer</td>\n<td>Course completion %</td>\n</tr>\n<tr>\n<td><code>issued_at</code></td>\n<td>datetime</td>\n<td>Issuance timestamp</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["certificates"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[{"disabled":true,"description":{"content":"<p>Filter by batch</p>\n","type":"text/plain"},"key":"batch_id","value":""},{"disabled":true,"description":{"content":"<p>Filter by course</p>\n","type":"text/plain"},"key":"course_id","value":""},{"disabled":true,"description":{"content":"<p>Filter by status</p>\n","type":"text/plain"},"key":"status","value":""},{"key":"page","value":"1"},{"key":"per_page","value":"20"}],"variable":[]}},"response":[{"id":"84117e34-fe25-4bc0-8c68-5a084eeb0eff","name":"200 — Success","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.zenslearn.com/api/v1/public/certificates?page=1&per_page=20","host":["https://api.zenslearn.com/api/v1/public"],"path":["certificates"],"query":[{"key":"batch_id","value":"","description":"Filter by batch","disabled":true},{"key":"course_id","value":"","description":"Filter by course","disabled":true},{"key":"status","value":"","description":"Filter by status","disabled":true},{"key":"page","value":"1"},{"key":"per_page","value":"20"}]},"description":"List all issued certificates for your institute.\n\n**Scope:** `certificates:read` or `read` | **Rate limit:** 1,000/min\n\n### Query Parameters\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `batch_id` | uuid | — | Filter by batch |\n| `course_id` | uuid | — | Filter by course |\n| `status` | string | — | Filter by certificate status |\n| `page` | integer | `1` | Page number |\n| `per_page` | integer | `20` | Items per page (max: 100) |\n\n### Response Fields\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | uuid | Certificate unique identifier |\n| `student_id` | uuid | Student ID |\n| `student_name` | string | Student full name |\n| `certificate_id` | string | Human-readable certificate ID |\n| `verification_code` | string | Public verification code |\n| `status` | string | Certificate status |\n| `completion_percentage` | integer | Course completion % |\n| `issued_at` | datetime | Issuance timestamp |"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"id\": \"cert-1234...\",\n      \"student_id\": \"s1234...\",\n      \"student_name\": \"Ali Ahmed\",\n      \"certificate_id\": \"CERT-2026-001\",\n      \"verification_code\": \"ABC123XYZ\",\n      \"status\": \"approved\",\n      \"completion_percentage\": 100,\n      \"issued_at\": \"2026-04-15T00:00:00Z\"\n    }\n  ],\n  \"total\": 1,\n  \"page\": 1,\n  \"per_page\": 20,\n  \"total_pages\": 1\n}"}],"_postman_id":"19474508-0261-4f19-a063-f7dca5cac40a"},{"name":"Approve Certificate","id":"ceddb86f-8827-4020-96eb-b719b9e6c2ce","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"url":"https://api.zenslearn.com/api/v1/public/certificates//approve","description":"<p>Approve a pending certificate for issuance.</p>\n<p><strong>Scope:</strong> <code>certificates:write</code> or <code>write</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"path-parameters\">Path Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>cert_id</code></td>\n<td>uuid</td>\n<td><strong>Required.</strong> The certificate's unique identifier</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400</code></td>\n<td>Certificate cannot be approved (invalid state)</td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td>Certificate not found</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"side-effects\">Side Effects</h3>\n<ul>\n<li>Fires <code>certificate.approved</code> webhook event</li>\n</ul>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["certificates","","approve"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[],"_postman_id":"ceddb86f-8827-4020-96eb-b719b9e6c2ce"},{"name":"Revoke Certificate","id":"8a1f3bdb-5f71-4249-8f40-75b826629b2e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"url":"https://api.zenslearn.com/api/v1/public/certificates//revoke","description":"<p>Revoke a previously issued certificate.</p>\n<p><strong>Scope:</strong> <code>certificates:write</code> or <code>write</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"path-parameters\">Path Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>cert_id</code></td>\n<td>uuid</td>\n<td><strong>Required.</strong> The certificate's unique identifier</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>404</code></td>\n<td>Certificate not found</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"side-effects\">Side Effects</h3>\n<ul>\n<li>Fires <code>certificate.revoked</code> webhook event</li>\n</ul>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["certificates","","revoke"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[],"_postman_id":"8a1f3bdb-5f71-4249-8f40-75b826629b2e"}],"id":"1537114a-f5ee-4f52-8e32-f3d9240f7f2c","description":"<p>View, approve, and revoke student certificates.</p>\n<p><strong>Available scopes:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Scope</th>\n<th>Access</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>certificates:read</code></td>\n<td>List certificates</td>\n</tr>\n<tr>\n<td><code>certificates:write</code></td>\n<td>Approve or revoke certificates</td>\n</tr>\n</tbody>\n</table>\n</div><p>Each certificate includes a unique <code>verification_code</code> for public verification.</p>\n","_postman_id":"1537114a-f5ee-4f52-8e32-f3d9240f7f2c","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}}},{"name":"Classes & Attendance","item":[{"name":"List Classes","id":"75a5f111-e05f-44be-af04-0e406ffb654f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/classes?page=1&per_page=20","description":"<p>List all scheduled and completed Zoom classes.</p>\n<p><strong>Scope:</strong> <code>classes:read</code> or <code>read</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"query-parameters\">Query Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>batch_id</code></td>\n<td>uuid</td>\n<td>—</td>\n<td>Filter by batch</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td>—</td>\n<td>Filter by class status</td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>integer</td>\n<td><code>1</code></td>\n<td>Page number</td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>integer</td>\n<td><code>20</code></td>\n<td>Items per page (max: 100)</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields\">Response Fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>uuid</td>\n<td>Class unique identifier</td>\n</tr>\n<tr>\n<td><code>batch_id</code></td>\n<td>uuid</td>\n<td>Associated batch</td>\n</tr>\n<tr>\n<td><code>title</code></td>\n<td>string</td>\n<td>Class title</td>\n</tr>\n<tr>\n<td><code>scheduled_date</code></td>\n<td>date</td>\n<td>Scheduled date</td>\n</tr>\n<tr>\n<td><code>scheduled_time</code></td>\n<td>datetime</td>\n<td>ISO 8601 start time</td>\n</tr>\n<tr>\n<td><code>duration</code></td>\n<td>integer</td>\n<td>Duration in minutes</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td>Class status</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["classes"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[{"disabled":true,"description":{"content":"<p>Filter by batch</p>\n","type":"text/plain"},"key":"batch_id","value":""},{"disabled":true,"description":{"content":"<p>Filter by class status</p>\n","type":"text/plain"},"key":"status","value":""},{"key":"page","value":"1"},{"key":"per_page","value":"20"}],"variable":[]}},"response":[{"id":"7e2fb38e-1cc9-4241-9473-8e39e4b146ea","name":"200 — Success","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.zenslearn.com/api/v1/public/classes?page=1&per_page=20","host":["https://api.zenslearn.com/api/v1/public"],"path":["classes"],"query":[{"key":"batch_id","value":"","description":"Filter by batch","disabled":true},{"key":"status","value":"","description":"Filter by class status","disabled":true},{"key":"page","value":"1"},{"key":"per_page","value":"20"}]},"description":"List all scheduled and completed Zoom classes.\n\n**Scope:** `classes:read` or `read` | **Rate limit:** 1,000/min\n\n### Query Parameters\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `batch_id` | uuid | — | Filter by batch |\n| `status` | string | — | Filter by class status |\n| `page` | integer | `1` | Page number |\n| `per_page` | integer | `20` | Items per page (max: 100) |\n\n### Response Fields\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | uuid | Class unique identifier |\n| `batch_id` | uuid | Associated batch |\n| `title` | string | Class title |\n| `scheduled_date` | date | Scheduled date |\n| `scheduled_time` | datetime | ISO 8601 start time |\n| `duration` | integer | Duration in minutes |\n| `status` | string | Class status |"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"id\": \"cl-1234...\",\n      \"batch_id\": \"b1234...\",\n      \"title\": \"JavaScript Fundamentals\",\n      \"scheduled_date\": \"2026-03-20\",\n      \"scheduled_time\": \"2026-03-20T10:00:00Z\",\n      \"duration\": 60,\n      \"status\": \"completed\"\n    }\n  ],\n  \"total\": 1,\n  \"page\": 1,\n  \"per_page\": 20,\n  \"total_pages\": 1\n}"}],"_postman_id":"75a5f111-e05f-44be-af04-0e406ffb654f"},{"name":"Get Class Attendance","id":"d606d5c3-4cdc-4612-8765-9c72fc56f347","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/classes//attendance","description":"<p>Get attendance records for a specific class.</p>\n<p><strong>Scope:</strong> <code>classes:read</code> or <code>read</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"path-parameters\">Path Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>class_id</code></td>\n<td>uuid</td>\n<td><strong>Required.</strong> The class's unique identifier</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields\">Response Fields</h3>\n<p>Returns an array (not paginated) of attendance records:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>student_id</code></td>\n<td>uuid</td>\n<td>Student ID</td>\n</tr>\n<tr>\n<td><code>student_name</code></td>\n<td>string</td>\n<td>Student full name</td>\n</tr>\n<tr>\n<td><code>attended</code></td>\n<td>boolean</td>\n<td>Whether the student attended</td>\n</tr>\n<tr>\n<td><code>duration_minutes</code></td>\n<td>integer</td>\n<td>Actual time spent in class</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>404</code></td>\n<td>Class not found</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["classes","","attendance"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[{"id":"e1227df2-6f80-4a7b-8714-061ef2b54789","name":"200 — Success","originalRequest":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/classes//attendance","description":"Get attendance records for a specific class.\n\n**Scope:** `classes:read` or `read` | **Rate limit:** 1,000/min\n\n### Path Parameters\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `class_id` | uuid | **Required.** The class's unique identifier |\n\n### Response Fields\nReturns an array (not paginated) of attendance records:\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `student_id` | uuid | Student ID |\n| `student_name` | string | Student full name |\n| `attended` | boolean | Whether the student attended |\n| `duration_minutes` | integer | Actual time spent in class |\n\n### Errors\n| Code | Description |\n|------|-------------|\n| `404` | Class not found |"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"student_id\": \"s1234...\",\n    \"student_name\": \"Ali Ahmed\",\n    \"attended\": true,\n    \"duration_minutes\": 55\n  }\n]"}],"_postman_id":"d606d5c3-4cdc-4612-8765-9c72fc56f347"}],"id":"ac16f069-4a71-4cdc-a595-61de823b0911","description":"<p>View scheduled Zoom classes and their attendance records.</p>\n<p><strong>Scope required:</strong> <code>classes:read</code> or <code>read</code></p>\n<p>Attendance is tracked automatically via Zoom webhook integration. Each attendance record includes the student's actual join duration.</p>\n","_postman_id":"ac16f069-4a71-4cdc-a595-61de823b0911","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}}},{"name":"Announcements","item":[{"name":"List Announcements","id":"8df808d1-997b-460f-b54d-4e539a9ea8ce","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/announcements?page=1&per_page=20","description":"<p>List all announcements for your institute.</p>\n<p><strong>Scope:</strong> <code>announcements:read</code> or <code>read</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"response-fields\">Response Fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>uuid</td>\n<td>Announcement unique identifier</td>\n</tr>\n<tr>\n<td><code>title</code></td>\n<td>string</td>\n<td>Announcement title</td>\n</tr>\n<tr>\n<td><code>content</code></td>\n<td>string</td>\n<td>Announcement body</td>\n</tr>\n<tr>\n<td><code>scope</code></td>\n<td>string</td>\n<td><code>all</code>, <code>batch</code>, or <code>course</code></td>\n</tr>\n<tr>\n<td><code>created_at</code></td>\n<td>datetime</td>\n<td>ISO 8601 timestamp</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["announcements"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[{"key":"page","value":"1"},{"key":"per_page","value":"20"}],"variable":[]}},"response":[{"id":"11cb2e41-af77-4f96-ac5a-a741246dd62e","name":"200 — Success","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.zenslearn.com/api/v1/public/announcements?page=1&per_page=20","host":["https://api.zenslearn.com/api/v1/public"],"path":["announcements"],"query":[{"key":"page","value":"1"},{"key":"per_page","value":"20"}]},"description":"List all announcements for your institute.\n\n**Scope:** `announcements:read` or `read` | **Rate limit:** 1,000/min\n\n### Response Fields\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | uuid | Announcement unique identifier |\n| `title` | string | Announcement title |\n| `content` | string | Announcement body |\n| `scope` | string | `all`, `batch`, or `course` |\n| `created_at` | datetime | ISO 8601 timestamp |"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"id\": \"ann-1234...\",\n      \"title\": \"Exam Schedule Update\",\n      \"content\": \"Final exams have been rescheduled to next week.\",\n      \"scope\": \"all\",\n      \"created_at\": \"2026-03-15T10:00:00Z\"\n    }\n  ],\n  \"total\": 1,\n  \"page\": 1,\n  \"per_page\": 20,\n  \"total_pages\": 1\n}"}],"_postman_id":"8df808d1-997b-460f-b54d-4e539a9ea8ce"},{"name":"Create Announcement","id":"431327e3-7dc0-4355-861a-c39dc33dcd36","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"title\": \"Important Notice\",\n  \"content\": \"Classes will resume on Monday.\",\n  \"scope\": \"all\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.zenslearn.com/api/v1/public/announcements","description":"<p>Create a new announcement visible to students.</p>\n<p><strong>Scope:</strong> <code>announcements:write</code> or <code>write</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"request-body\">Request Body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>title</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Title (1-500 characters)</td>\n</tr>\n<tr>\n<td><code>content</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Body text (1-50,000 characters)</td>\n</tr>\n<tr>\n<td><code>scope</code></td>\n<td>string</td>\n<td>Yes</td>\n<td><code>all</code>, <code>batch</code>, or <code>course</code></td>\n</tr>\n<tr>\n<td><code>batch_id</code></td>\n<td>uuid</td>\n<td>Conditional</td>\n<td>Required when scope is <code>batch</code></td>\n</tr>\n<tr>\n<td><code>course_id</code></td>\n<td>uuid</td>\n<td>Conditional</td>\n<td>Required when scope is <code>course</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400</code></td>\n<td>Validation failed (missing scope target, content too long)</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["announcements"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[],"_postman_id":"431327e3-7dc0-4355-861a-c39dc33dcd36"}],"id":"5ab2c5f3-b2ad-40d2-8cc8-b2397bb90885","description":"<p>View and create announcements for students.</p>\n<p><strong>Available scopes:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Scope</th>\n<th>Access</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>announcements:read</code></td>\n<td>List announcements</td>\n</tr>\n<tr>\n<td><code>announcements:write</code></td>\n<td>Create new announcements</td>\n</tr>\n</tbody>\n</table>\n</div><p>Announcements can be scoped to <code>all</code> students, a specific <code>batch</code>, or a specific <code>course</code>.</p>\n","_postman_id":"5ab2c5f3-b2ad-40d2-8cc8-b2397bb90885","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}}},{"name":"Jobs","item":[{"name":"List Jobs","id":"1c281479-b5eb-484e-9f27-a2721df68fbb","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/jobs?page=1&per_page=20","description":"<p>List all job postings published by your institute.</p>\n<p><strong>Scope:</strong> <code>jobs:read</code> or <code>read</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"response-fields\">Response Fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>uuid</td>\n<td>Job posting unique identifier</td>\n</tr>\n<tr>\n<td><code>title</code></td>\n<td>string</td>\n<td>Job title</td>\n</tr>\n<tr>\n<td><code>company</code></td>\n<td>string</td>\n<td>Company name</td>\n</tr>\n<tr>\n<td><code>location</code></td>\n<td>string</td>\n<td>Job location</td>\n</tr>\n<tr>\n<td><code>job_type</code></td>\n<td>string</td>\n<td><code>full-time</code>, <code>part-time</code>, etc.</td>\n</tr>\n<tr>\n<td><code>salary</code></td>\n<td>string</td>\n<td>Salary range</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td>string</td>\n<td>Job description</td>\n</tr>\n<tr>\n<td><code>deadline</code></td>\n<td>date</td>\n<td>Application deadline</td>\n</tr>\n<tr>\n<td><code>created_at</code></td>\n<td>datetime</td>\n<td>ISO 8601 timestamp</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["jobs"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[{"key":"page","value":"1"},{"key":"per_page","value":"20"}],"variable":[]}},"response":[{"id":"a6dac645-31c5-4db9-87be-62a21b7ecfd5","name":"200 — Success","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.zenslearn.com/api/v1/public/jobs?page=1&per_page=20","host":["https://api.zenslearn.com/api/v1/public"],"path":["jobs"],"query":[{"key":"page","value":"1"},{"key":"per_page","value":"20"}]},"description":"List all job postings published by your institute.\n\n**Scope:** `jobs:read` or `read` | **Rate limit:** 1,000/min\n\n### Response Fields\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | uuid | Job posting unique identifier |\n| `title` | string | Job title |\n| `company` | string | Company name |\n| `location` | string | Job location |\n| `job_type` | string | `full-time`, `part-time`, etc. |\n| `salary` | string | Salary range |\n| `description` | string | Job description |\n| `deadline` | date | Application deadline |\n| `created_at` | datetime | ISO 8601 timestamp |"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"id\": \"job-1234...\",\n      \"title\": \"Junior Web Developer\",\n      \"company\": \"TechCorp\",\n      \"location\": \"Lahore\",\n      \"job_type\": \"full-time\",\n      \"salary\": \"50,000 - 80,000 PKR\",\n      \"description\": \"We are looking for...\",\n      \"deadline\": \"2026-06-30\",\n      \"created_at\": \"2026-03-01T00:00:00Z\"\n    }\n  ],\n  \"total\": 1,\n  \"page\": 1,\n  \"per_page\": 20,\n  \"total_pages\": 1\n}"}],"_postman_id":"1c281479-b5eb-484e-9f27-a2721df68fbb"}],"id":"e083c242-31c5-4069-8cd6-8a7c75af2cb1","description":"<p>View job postings published by your institute.</p>\n<p><strong>Scope required:</strong> <code>jobs:read</code> or <code>read</code></p>\n","_postman_id":"e083c242-31c5-4069-8cd6-8a7c75af2cb1","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}}},{"name":"Fees & Payments","item":[{"name":"List Fee Plans","id":"8370b551-aebb-4d2e-9b6f-7b4d6cd746f2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/fees?page=1&per_page=20","description":"<p>List all fee plans for your institute.</p>\n<p><strong>Scope:</strong> <code>fees:read</code> or <code>read</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"query-parameters\">Query Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>student_id</code></td>\n<td>uuid</td>\n<td>—</td>\n<td>Filter by student</td>\n</tr>\n<tr>\n<td><code>batch_id</code></td>\n<td>uuid</td>\n<td>—</td>\n<td>Filter by batch</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td>—</td>\n<td>Filter by fee plan status</td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>integer</td>\n<td><code>1</code></td>\n<td>Page number</td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>integer</td>\n<td><code>20</code></td>\n<td>Items per page (max: 100)</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields\">Response Fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>uuid</td>\n<td>Fee plan unique identifier</td>\n</tr>\n<tr>\n<td><code>student_id</code></td>\n<td>uuid</td>\n<td>Student ID</td>\n</tr>\n<tr>\n<td><code>student_name</code></td>\n<td>string</td>\n<td>Student full name</td>\n</tr>\n<tr>\n<td><code>batch_id</code></td>\n<td>uuid</td>\n<td>Batch ID</td>\n</tr>\n<tr>\n<td><code>batch_name</code></td>\n<td>string</td>\n<td>Batch name</td>\n</tr>\n<tr>\n<td><code>plan_type</code></td>\n<td>string</td>\n<td>Fee plan type</td>\n</tr>\n<tr>\n<td><code>total_amount</code></td>\n<td>number</td>\n<td>Total fee amount</td>\n</tr>\n<tr>\n<td><code>discount_type</code></td>\n<td>string</td>\n<td>Discount type (if any)</td>\n</tr>\n<tr>\n<td><code>discount_value</code></td>\n<td>number</td>\n<td>Discount value</td>\n</tr>\n<tr>\n<td><code>final_amount</code></td>\n<td>number</td>\n<td>Amount after discount</td>\n</tr>\n<tr>\n<td><code>currency</code></td>\n<td>string</td>\n<td>Currency code (e.g. <code>PKR</code>)</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td>Plan status</td>\n</tr>\n<tr>\n<td><code>created_at</code></td>\n<td>datetime</td>\n<td>ISO 8601 timestamp</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["fees"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[{"disabled":true,"description":{"content":"<p>Filter by student</p>\n","type":"text/plain"},"key":"student_id","value":""},{"disabled":true,"description":{"content":"<p>Filter by batch</p>\n","type":"text/plain"},"key":"batch_id","value":""},{"disabled":true,"description":{"content":"<p>Filter by status</p>\n","type":"text/plain"},"key":"status","value":""},{"key":"page","value":"1"},{"key":"per_page","value":"20"}],"variable":[]}},"response":[{"id":"97f4440d-040f-488a-8009-36ce154b7b98","name":"200 — Success","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.zenslearn.com/api/v1/public/fees?page=1&per_page=20","host":["https://api.zenslearn.com/api/v1/public"],"path":["fees"],"query":[{"key":"student_id","value":"","description":"Filter by student","disabled":true},{"key":"batch_id","value":"","description":"Filter by batch","disabled":true},{"key":"status","value":"","description":"Filter by status","disabled":true},{"key":"page","value":"1"},{"key":"per_page","value":"20"}]},"description":"List all fee plans for your institute.\n\n**Scope:** `fees:read` or `read` | **Rate limit:** 1,000/min\n\n### Query Parameters\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `student_id` | uuid | — | Filter by student |\n| `batch_id` | uuid | — | Filter by batch |\n| `status` | string | — | Filter by fee plan status |\n| `page` | integer | `1` | Page number |\n| `per_page` | integer | `20` | Items per page (max: 100) |\n\n### Response Fields\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | uuid | Fee plan unique identifier |\n| `student_id` | uuid | Student ID |\n| `student_name` | string | Student full name |\n| `batch_id` | uuid | Batch ID |\n| `batch_name` | string | Batch name |\n| `plan_type` | string | Fee plan type |\n| `total_amount` | number | Total fee amount |\n| `discount_type` | string | Discount type (if any) |\n| `discount_value` | number | Discount value |\n| `final_amount` | number | Amount after discount |\n| `currency` | string | Currency code (e.g. `PKR`) |\n| `status` | string | Plan status |\n| `created_at` | datetime | ISO 8601 timestamp |"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"id\": \"fp-1234...\",\n      \"student_id\": \"s1234...\",\n      \"student_name\": \"Ali Ahmed\",\n      \"batch_id\": \"b1234...\",\n      \"batch_name\": \"Batch 1\",\n      \"plan_type\": \"installment\",\n      \"total_amount\": 50000,\n      \"discount_type\": \"percentage\",\n      \"discount_value\": 10,\n      \"final_amount\": 45000,\n      \"currency\": \"PKR\",\n      \"status\": \"active\",\n      \"created_at\": \"2026-01-15T00:00:00Z\"\n    }\n  ],\n  \"total\": 1,\n  \"page\": 1,\n  \"per_page\": 20,\n  \"total_pages\": 1\n}"}],"_postman_id":"8370b551-aebb-4d2e-9b6f-7b4d6cd746f2"},{"name":"Get Fee Plan (with Installments)","id":"3719ab9e-5149-448d-84af-1ceca2072930","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/fees/","description":"<p>Retrieve a fee plan with its full installment breakdown.</p>\n<p><strong>Scope:</strong> <code>fees:read</code> or <code>read</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"path-parameters\">Path Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>fee_plan_id</code></td>\n<td>uuid</td>\n<td><strong>Required.</strong> The fee plan's unique identifier</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p>Returns the fee plan with an <code>installments</code> array. Each installment contains:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>uuid</td>\n<td>Installment ID</td>\n</tr>\n<tr>\n<td><code>sequence</code></td>\n<td>integer</td>\n<td>Installment number</td>\n</tr>\n<tr>\n<td><code>amount_due</code></td>\n<td>number</td>\n<td>Amount due</td>\n</tr>\n<tr>\n<td><code>amount_paid</code></td>\n<td>number</td>\n<td>Amount paid so far</td>\n</tr>\n<tr>\n<td><code>due_date</code></td>\n<td>date</td>\n<td>Due date</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td><code>pending</code>, <code>paid</code>, <code>overdue</code></td>\n</tr>\n<tr>\n<td><code>label</code></td>\n<td>string</td>\n<td>Display label</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>404</code></td>\n<td>Fee plan not found</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["fees",""],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[{"id":"467ea6bb-a6be-40a7-ace9-87c4f3af9da3","name":"200 — Success","originalRequest":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/fees/","description":"Retrieve a fee plan with its full installment breakdown.\n\n**Scope:** `fees:read` or `read` | **Rate limit:** 1,000/min\n\n### Path Parameters\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `fee_plan_id` | uuid | **Required.** The fee plan's unique identifier |\n\n### Response\nReturns the fee plan with an `installments` array. Each installment contains:\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | uuid | Installment ID |\n| `sequence` | integer | Installment number |\n| `amount_due` | number | Amount due |\n| `amount_paid` | number | Amount paid so far |\n| `due_date` | date | Due date |\n| `status` | string | `pending`, `paid`, `overdue` |\n| `label` | string | Display label |\n\n### Errors\n| Code | Description |\n|------|-------------|\n| `404` | Fee plan not found |"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"fp-1234...\",\n  \"student_id\": \"s1234...\",\n  \"student_name\": \"Ali Ahmed\",\n  \"batch_id\": \"b1234...\",\n  \"batch_name\": \"Batch 1\",\n  \"plan_type\": \"installment\",\n  \"total_amount\": 50000,\n  \"discount_type\": \"percentage\",\n  \"discount_value\": 10,\n  \"final_amount\": 45000,\n  \"currency\": \"PKR\",\n  \"status\": \"active\",\n  \"created_at\": \"2026-01-15T00:00:00Z\",\n  \"installments\": [\n    {\n      \"id\": \"inst-1...\",\n      \"fee_plan_id\": \"fp-1234...\",\n      \"sequence\": 1,\n      \"amount_due\": 15000,\n      \"amount_paid\": 15000,\n      \"due_date\": \"2026-02-01\",\n      \"status\": \"paid\",\n      \"label\": \"Installment 1\"\n    },\n    {\n      \"id\": \"inst-2...\",\n      \"fee_plan_id\": \"fp-1234...\",\n      \"sequence\": 2,\n      \"amount_due\": 15000,\n      \"amount_paid\": 0,\n      \"due_date\": \"2026-03-01\",\n      \"status\": \"pending\",\n      \"label\": \"Installment 2\"\n    }\n  ]\n}"}],"_postman_id":"3719ab9e-5149-448d-84af-1ceca2072930"},{"name":"Get Fee Plan Payments","id":"cca00afa-3a61-41e7-b88d-4e88e49159dc","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/fees//payments?page=1&per_page=20","description":"<p>List all payments recorded against a specific fee plan.</p>\n<p><strong>Scope:</strong> <code>fees:read</code> or <code>read</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"path-parameters\">Path Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>fee_plan_id</code></td>\n<td>uuid</td>\n<td><strong>Required.</strong> The fee plan's unique identifier</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields\">Response Fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>uuid</td>\n<td>Payment unique identifier</td>\n</tr>\n<tr>\n<td><code>fee_plan_id</code></td>\n<td>uuid</td>\n<td>Associated fee plan</td>\n</tr>\n<tr>\n<td><code>fee_installment_id</code></td>\n<td>uuid</td>\n<td>Associated installment</td>\n</tr>\n<tr>\n<td><code>amount</code></td>\n<td>number</td>\n<td>Payment amount</td>\n</tr>\n<tr>\n<td><code>payment_date</code></td>\n<td>date</td>\n<td>Date of payment</td>\n</tr>\n<tr>\n<td><code>payment_method</code></td>\n<td>string</td>\n<td>e.g. <code>bank_transfer</code>, <code>cash</code></td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td>Payment status</td>\n</tr>\n<tr>\n<td><code>receipt_number</code></td>\n<td>string</td>\n<td>Receipt reference</td>\n</tr>\n<tr>\n<td><code>reference_number</code></td>\n<td>string</td>\n<td>Transaction reference</td>\n</tr>\n<tr>\n<td><code>created_at</code></td>\n<td>datetime</td>\n<td>ISO 8601 timestamp</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["fees","","payments"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[{"key":"page","value":"1"},{"key":"per_page","value":"20"}],"variable":[]}},"response":[{"id":"977eb50e-702c-46c0-bf6c-da062e839c62","name":"200 — Success","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.zenslearn.com/api/v1/public/fees//payments?page=1&per_page=20","host":["https://api.zenslearn.com/api/v1/public"],"path":["fees","","payments"],"query":[{"key":"page","value":"1"},{"key":"per_page","value":"20"}]},"description":"List all payments recorded against a specific fee plan.\n\n**Scope:** `fees:read` or `read` | **Rate limit:** 1,000/min\n\n### Path Parameters\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `fee_plan_id` | uuid | **Required.** The fee plan's unique identifier |\n\n### Response Fields\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | uuid | Payment unique identifier |\n| `fee_plan_id` | uuid | Associated fee plan |\n| `fee_installment_id` | uuid | Associated installment |\n| `amount` | number | Payment amount |\n| `payment_date` | date | Date of payment |\n| `payment_method` | string | e.g. `bank_transfer`, `cash` |\n| `status` | string | Payment status |\n| `receipt_number` | string | Receipt reference |\n| `reference_number` | string | Transaction reference |\n| `created_at` | datetime | ISO 8601 timestamp |"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"id\": \"pay-1234...\",\n      \"fee_plan_id\": \"fp-1234...\",\n      \"fee_installment_id\": \"inst-1...\",\n      \"amount\": 15000,\n      \"payment_date\": \"2026-02-01\",\n      \"payment_method\": \"bank_transfer\",\n      \"status\": \"confirmed\",\n      \"receipt_number\": \"RCP-001\",\n      \"reference_number\": \"TXN-12345\",\n      \"created_at\": \"2026-02-01T10:00:00Z\"\n    }\n  ],\n  \"total\": 1,\n  \"page\": 1,\n  \"per_page\": 20,\n  \"total_pages\": 1\n}"}],"_postman_id":"cca00afa-3a61-41e7-b88d-4e88e49159dc"},{"name":"List All Payments","id":"a97dadba-7bc6-4ace-ba9e-1c87088f98b5","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/payments?page=1&per_page=20","description":"<p>List all payments across all fee plans in your institute.</p>\n<p><strong>Scope:</strong> <code>fees:read</code> or <code>read</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"query-parameters\">Query Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>fee_plan_id</code></td>\n<td>uuid</td>\n<td>—</td>\n<td>Filter by a specific fee plan</td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>integer</td>\n<td><code>1</code></td>\n<td>Page number</td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>integer</td>\n<td><code>20</code></td>\n<td>Items per page (max: 100)</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["payments"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[{"disabled":true,"description":{"content":"<p>Filter by fee plan</p>\n","type":"text/plain"},"key":"fee_plan_id","value":""},{"key":"page","value":"1"},{"key":"per_page","value":"20"}],"variable":[]}},"response":[],"_postman_id":"a97dadba-7bc6-4ace-ba9e-1c87088f98b5"},{"name":"Create Fee Plan","id":"3990984a-1776-871a-0d6d-6e2ab4146b0d","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"batch_id\": \"\",\n  \"plan_type\": \"monthly\",\n  \"total_amount\": 120000,\n  \"monthly_installments\": 12,\n  \"first_due_date\": \"2026-07-01\",\n  \"grace_period_hours\": 72\n}","options":{"raw":{"language":"json"}}},"url":"https://api.zenslearn.com/api/v1/public/students//fees","description":"<p>Create a fee plan for a student.</p>\n<p><strong>Scope:</strong> <code>fees:write</code> or <code>write</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"request-body\">Request Body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>batch_id</code></td>\n<td>uuid</td>\n<td>Yes</td>\n<td>Batch the plan belongs to</td>\n</tr>\n<tr>\n<td><code>plan_type</code></td>\n<td>string</td>\n<td>Yes</td>\n<td><code>one-time</code>, <code>monthly</code>, or <code>installment</code></td>\n</tr>\n<tr>\n<td><code>total_amount</code></td>\n<td>number</td>\n<td>Yes</td>\n<td>Gross plan amount before discount</td>\n</tr>\n<tr>\n<td><code>discount_type</code></td>\n<td>string</td>\n<td>No</td>\n<td><code>percentage</code> or <code>fixed</code></td>\n</tr>\n<tr>\n<td><code>discount_value</code></td>\n<td>number</td>\n<td>No</td>\n<td>Discount amount/percent</td>\n</tr>\n<tr>\n<td><code>currency</code></td>\n<td>string</td>\n<td>No</td>\n<td>ISO currency (default institute currency)</td>\n</tr>\n<tr>\n<td><code>billing_day_of_month</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Monthly billing day</td>\n</tr>\n<tr>\n<td><code>monthly_installments</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Number of monthly installments</td>\n</tr>\n<tr>\n<td><code>first_due_date</code></td>\n<td>date</td>\n<td>No</td>\n<td>First installment due date</td>\n</tr>\n<tr>\n<td><code>installments</code></td>\n<td>array</td>\n<td>No</td>\n<td>Explicit installment schedule</td>\n</tr>\n<tr>\n<td><code>notes</code></td>\n<td>string</td>\n<td>No</td>\n<td>Free-text note</td>\n</tr>\n<tr>\n<td><code>admissions_officer_id</code></td>\n<td>uuid</td>\n<td>No</td>\n<td>Officer attributed to the action</td>\n</tr>\n<tr>\n<td><code>grace_period_hours</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Fee-overdue grace window in HOURS from plan creation (0–8760). While inside it the student keeps full content access despite an unpaid installment and the overdue-suspension cron skips the plan. Omit to default to <strong>72</strong>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>404</code></td>\n<td>Student or batch not found</td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Invalid <code>admissions_officer_id</code> or <code>grace_period_hours</code> out of range</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["students","","fees"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[],"_postman_id":"3990984a-1776-871a-0d6d-6e2ab4146b0d"},{"name":"Record Payment","id":"ccc9463f-2494-a347-80d2-568955703bb1","request":{"method":"POST","header":[{"key":"Idempotency-Key","description":"<p>REQUIRED. Unique per logical payment (e.g. the ERP payment/doc id). Replays return the same result; reuse with a different body returns 409.</p>\n","value":""}],"body":{"mode":"raw","raw":"{\n  \"amount\": 10000,\n  \"payment_date\": \"2026-07-01T10:00:00Z\",\n  \"payment_method\": \"bank_transfer\",\n  \"reference_number\": \"TXN-1\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.zenslearn.com/api/v1/public/fees//payments","description":"<p>Record a payment against a plan/installment. <strong>Scope:</strong> <code>fees:write</code>. <strong><code>Idempotency-Key</code> header is REQUIRED</strong> (400 if missing). <code>payment_method</code>: bank_transfer | jazzcash | easypaisa | cheque | cash | online. Auto-assigns a receipt number, updates installment/plan state, clears the 402 fee-lock. Conflicts: <code>409</code> if the installment is already fully paid; <code>422</code> if amount exceeds the remaining balance (body includes <code>remaining_balance</code>).</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["fees","","payments"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[],"_postman_id":"ccc9463f-2494-a347-80d2-568955703bb1"},{"name":"Verify Payment (Finance)","id":"d8d0bf26-3e44-7300-20fd-240299e76ffe","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"decision\": \"verified\",\n  \"note\": \"Matched against bank statement\",\n  \"admissions_officer_id\": null\n}","options":{"raw":{"language":"json"}}},"url":"https://api.zenslearn.com/api/v1/public/fees/payments//verify","description":"<p>Finance verifies (or rejects) a recorded payment — step 2 of the ERP→LMS record→verify flow. <strong>Scope:</strong> <code>fees:verify</code> (NOT satisfied by the generic <code>write</code> super-scope — separation of duties). <strong>Rate limit:</strong> 60/min.</p>\n<p><code>decision</code>: <code>verified</code> | <code>rejected</code>. On <code>verified</code>, a student auto-deactivated for overdue fees is reactivated. Idempotent: re-sending the same decision is a no-op; flipping a settled decision (verified↔rejected) returns <code>409</code>.</p>\n<p><strong>Body:</strong> <code>{ decision (required), note?, admissions_officer_id? }</code></p>\n<p><strong>Returns:</strong> <code>{ id, fee_plan_id, fee_installment_id, amount, status, verification_status, verified_at, receipt_number, student_id, student_status, student_reactivated }</code></p>\n<p><strong>Errors:</strong> <code>403</code> missing <code>fees:verify</code> scope · <code>404</code> payment not found (or other institute) · <code>409</code> already settled with the opposite decision · <code>422</code> invalid <code>decision</code>/<code>admissions_officer_id</code>.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["fees","payments","","verify"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[],"_postman_id":"d8d0bf26-3e44-7300-20fd-240299e76ffe"},{"name":"Cancel Fee Plan","id":"86083f0e-cd16-7d98-2391-1db10762dcc1","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"reason\": \"api_cancelled\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.zenslearn.com/api/v1/public/fees//cancel","description":"<p>Cancel a fee plan (status → cancelled). <strong>Scope:</strong> <code>fees:write</code>. Optional <code>admissions_officer_id</code>. <code>409</code> if the plan is already cancelled.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["fees","","cancel"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[],"_postman_id":"86083f0e-cd16-7d98-2391-1db10762dcc1"},{"name":"Waive Installment","id":"fd38e18e-8696-8eee-4c83-73308277f6a8","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"notes\": \"scholarship\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.zenslearn.com/api/v1/public/fees//installments/1/waive","description":"<p>Waive a single installment by its sequence number (path: .../installments/{sequence}/waive; example uses 1). <strong>Scope:</strong> <code>fees:write</code>. Sets the installment to <code>waived</code> and completes the plan if every installment is now paid or waived. <code>409</code> if the installment is already paid or waived.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["fees","","installments","1","waive"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[],"_postman_id":"fd38e18e-8696-8eee-4c83-73308277f6a8"},{"name":"Get Student Fee Summary","id":"7b4bbf05-2e04-3ba3-c451-c24a781f022a","request":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/students//fees","description":"<p>Per-student fee summary. <strong>Scope:</strong> <code>fees:read</code>. Returns aggregate totals (total_billed, total_paid, total_remaining, overdue_amount, next_due_date, is_overdue) plus each plan with rollups + installments. One call to see all of a student's dues/remaining.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["students","","fees"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[],"_postman_id":"7b4bbf05-2e04-3ba3-c451-c24a781f022a"},{"name":"Create Fee Plan (Custom Installments)","id":"d108990e-a4ad-be82-81a6-bfc89dc6da7e","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","description":"<p>Optional. Set a unique value (e.g. your ERP doc id) so retries replay instead of double-creating.</p>\n","value":""}],"body":{"mode":"raw","raw":"{\n  \"batch_id\": \"\",\n  \"plan_type\": \"installment\",\n  \"total_amount\": 60000,\n  \"currency\": \"PKR\",\n  \"installments\": [\n    { \"sequence\": 1, \"amount_due\": 30000, \"due_date\": \"2026-07-01\", \"label\": \"Admission\" },\n    { \"sequence\": 2, \"amount_due\": 15000, \"due_date\": \"2026-08-01\", \"label\": \"Mid-term\" },\n    { \"sequence\": 3, \"amount_due\": 15000, \"due_date\": \"2026-09-01\", \"label\": \"Final\" }\n  ],\n  \"admissions_officer_id\": \"{{officer_id}}\",\n  \"grace_period_hours\": 72\n}","options":{"raw":{"language":"json"}}},"url":"https://api.zenslearn.com/api/v1/public/students//fees","description":"<p>Create a fee plan with a <strong>custom installment schedule</strong> for an existing student in a batch. <strong>Scope:</strong> <code>fees:write</code>.</p>\n<p><strong>Rules for custom installments:</strong></p>\n<ol>\n<li><code>plan_type</code> <strong>must be <code>installment</code></strong> (this triggers the custom-schedule branch; <code>one-time</code> and <code>monthly</code> ignore the <code>installments</code> array and auto-generate).</li>\n<li><code>installments</code> is <strong>required</strong> for this plan type — omitting it returns <code>422 \"Installment plan requires an installments schedule\"</code>.</li>\n<li>The <strong>sum of all <code>amount_due</code> must equal <code>final_amount</code></strong> (= <code>total_amount</code> after any discount). Mismatch → <code>422 \"Installment amounts sum to X but final amount is Y\"</code>.<ul>\n<li>No discount → sum must equal <code>total_amount</code>.</li>\n<li>With discount (<code>discount_type</code> = <code>percent</code>/<code>flat</code>, <code>discount_value</code>) → compute the discounted amount first, then make installments sum to that.</li>\n</ul>\n</li>\n<li>Each item: <code>sequence</code> (≥1), <code>amount_due</code> (≥0, <strong>integer / whole rupees</strong>), <code>due_date</code> (<code>YYYY-MM-DD</code>), <code>label</code> (optional).</li>\n</ol>\n<p>In the example: 30000 + 15000 + 15000 = 60000 = <code>total_amount</code>. ✅</p>\n<p>Optional: <code>admissions_officer_id</code> to credit a specific officer (omit to record the hidden per-institute system user); <code>access_days</code> <strong>or</strong> <code>access_end_date</code> (mutually exclusive) to set the enrollment's access window; <code>notes</code> (≤1000 chars); <code>grace_period_hours</code> (integer, 0–8760, default <strong>72</strong>) to set the fee-overdue grace window in HOURS from plan creation — while inside it the student keeps full content access despite an unpaid installment and the overdue-suspension cron skips the plan.</p>\n<p>Returns <code>201</code> + the plan with rollups (amount_paid, balance_due, next_due_date, is_overdue) and the echoed <code>installments</code>. <code>404</code> if student/batch/officer not found; <code>409</code> if the student is already enrolled in that batch.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["students","","fees"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[],"_postman_id":"d108990e-a4ad-be82-81a6-bfc89dc6da7e"}],"id":"550e1f8e-be14-4222-98c0-87797eaac39e","description":"<p>Read fee plans, installments, payments, and per-student summaries — and <strong>write</strong> the fee lifecycle from any ERP.</p>\n<p><strong>Read</strong> (<code>fees:read</code> or <code>read</code>): list fee plans, plan detail with installments, payments, and <code>GET /students/{id}/fees</code> for a per-student summary (total billed/paid/remaining/overdue + per-plan rollups).</p>\n<p><strong>Write</strong> (<code>fees:write</code> or <code>write</code>): create plan, record payment, cancel plan, waive installment. Vendor-neutral — works for Frappe/ERPNext, Zoho, Odoo, or custom systems.</p>\n<p><strong>Record Payment requires an <code>Idempotency-Key</code> header</strong> (e.g. the ERP payment/doc id). Retries replay the original result; key reuse with a different body → <code>409</code>; overpayment → <code>422</code> with <code>remaining_balance</code>; already paid/cancelled → <code>409</code>. ERP-originated writes are tagged so they are not echoed back out to your ERP webhooks/sync.</p>\n","_postman_id":"550e1f8e-be14-4222-98c0-87797eaac39e","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}}},{"name":"Teachers","item":[{"name":"List Teachers","id":"582c617b-2c6f-4ea8-8f66-9cedd69469a5","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/teachers?page=1&per_page=20","description":"<p>List all teachers in your institute.</p>\n<p><strong>Scope:</strong> <code>teachers:read</code> or <code>read</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"response-fields\">Response Fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>uuid</td>\n<td>Teacher unique identifier</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Teacher full name</td>\n</tr>\n<tr>\n<td><code>specialization</code></td>\n<td>string</td>\n<td>Area of expertise</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td><code>active</code> or <code>inactive</code></td>\n</tr>\n<tr>\n<td><code>created_at</code></td>\n<td>datetime</td>\n<td>ISO 8601 timestamp</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["teachers"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[{"key":"page","value":"1"},{"key":"per_page","value":"20"}],"variable":[]}},"response":[{"id":"faa8e834-4c2f-4e5f-9b87-95691dfd425c","name":"200 — Success","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.zenslearn.com/api/v1/public/teachers?page=1&per_page=20","host":["https://api.zenslearn.com/api/v1/public"],"path":["teachers"],"query":[{"key":"page","value":"1"},{"key":"per_page","value":"20"}]},"description":"List all teachers in your institute.\n\n**Scope:** `teachers:read` or `read` | **Rate limit:** 1,000/min\n\n### Response Fields\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | uuid | Teacher unique identifier |\n| `name` | string | Teacher full name |\n| `specialization` | string | Area of expertise |\n| `status` | string | `active` or `inactive` |\n| `created_at` | datetime | ISO 8601 timestamp |"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"id\": \"t1234...\",\n      \"name\": \"Ahmed Khan\",\n      \"specialization\": \"Web Development\",\n      \"status\": \"active\",\n      \"created_at\": \"2026-01-01T00:00:00Z\"\n    }\n  ],\n  \"total\": 1,\n  \"page\": 1,\n  \"per_page\": 20,\n  \"total_pages\": 1\n}"}],"_postman_id":"582c617b-2c6f-4ea8-8f66-9cedd69469a5"},{"name":"Get Teacher","id":"61b66d5a-1f9a-4ede-887b-91f8d362609c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/teachers/","description":"<p>Retrieve a single teacher by ID.</p>\n<p><strong>Scope:</strong> <code>teachers:read</code> or <code>read</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"path-parameters\">Path Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>teacher_id</code></td>\n<td>uuid</td>\n<td><strong>Required.</strong> The teacher's unique identifier</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>404</code></td>\n<td>Teacher not found</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["teachers",""],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[],"_postman_id":"61b66d5a-1f9a-4ede-887b-91f8d362609c"}],"id":"8ff31191-1068-445e-a2fe-c01a4c1d10e7","description":"<p>View teacher profiles and their specializations.</p>\n<p><strong>Scope required:</strong> <code>teachers:read</code> or <code>read</code></p>\n","_postman_id":"8ff31191-1068-445e-a2fe-c01a4c1d10e7","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}}},{"name":"Progress","item":[{"name":"List Progress","id":"0291a432-dbba-4c1a-88ea-2fc85ca15220","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/progress?page=1&per_page=20","description":"<p>List student lecture progress records.</p>\n<p><strong>Scope:</strong> <code>progress:read</code> or <code>read</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"query-parameters\">Query Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>student_id</code></td>\n<td>uuid</td>\n<td>—</td>\n<td>Filter by student</td>\n</tr>\n<tr>\n<td><code>lecture_id</code></td>\n<td>uuid</td>\n<td>—</td>\n<td>Filter by lecture</td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>integer</td>\n<td><code>1</code></td>\n<td>Page number</td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>integer</td>\n<td><code>20</code></td>\n<td>Items per page (max: 100)</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields\">Response Fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>student_id</code></td>\n<td>uuid</td>\n<td>Student ID</td>\n</tr>\n<tr>\n<td><code>student_name</code></td>\n<td>string</td>\n<td>Student full name</td>\n</tr>\n<tr>\n<td><code>lecture_id</code></td>\n<td>uuid</td>\n<td>Lecture ID</td>\n</tr>\n<tr>\n<td><code>watch_percentage</code></td>\n<td>integer</td>\n<td>Percentage watched (0-100)</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td><code>not_started</code>, <code>in_progress</code>, or <code>completed</code></td>\n</tr>\n<tr>\n<td><code>updated_at</code></td>\n<td>datetime</td>\n<td>Last progress update</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["progress"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[{"disabled":true,"description":{"content":"<p>Filter by student</p>\n","type":"text/plain"},"key":"student_id","value":""},{"disabled":true,"description":{"content":"<p>Filter by lecture</p>\n","type":"text/plain"},"key":"lecture_id","value":""},{"key":"page","value":"1"},{"key":"per_page","value":"20"}],"variable":[]}},"response":[{"id":"6d5dd73c-ec86-4127-8d31-07bc0f8c3eb5","name":"200 — Success","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.zenslearn.com/api/v1/public/progress?page=1&per_page=20","host":["https://api.zenslearn.com/api/v1/public"],"path":["progress"],"query":[{"key":"student_id","value":"","description":"Filter by student","disabled":true},{"key":"lecture_id","value":"","description":"Filter by lecture","disabled":true},{"key":"page","value":"1"},{"key":"per_page","value":"20"}]},"description":"List student lecture progress records.\n\n**Scope:** `progress:read` or `read` | **Rate limit:** 1,000/min\n\n### Query Parameters\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `student_id` | uuid | — | Filter by student |\n| `lecture_id` | uuid | — | Filter by lecture |\n| `page` | integer | `1` | Page number |\n| `per_page` | integer | `20` | Items per page (max: 100) |\n\n### Response Fields\n| Field | Type | Description |\n|-------|------|-------------|\n| `student_id` | uuid | Student ID |\n| `student_name` | string | Student full name |\n| `lecture_id` | uuid | Lecture ID |\n| `watch_percentage` | integer | Percentage watched (0-100) |\n| `status` | string | `not_started`, `in_progress`, or `completed` |\n| `updated_at` | datetime | Last progress update |"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"student_id\": \"s1234...\",\n      \"student_name\": \"Ali Ahmed\",\n      \"lecture_id\": \"l1234...\",\n      \"watch_percentage\": 85,\n      \"status\": \"in_progress\",\n      \"updated_at\": \"2026-03-20T14:30:00Z\"\n    }\n  ],\n  \"total\": 1,\n  \"page\": 1,\n  \"per_page\": 20,\n  \"total_pages\": 1\n}"}],"_postman_id":"0291a432-dbba-4c1a-88ea-2fc85ca15220"}],"id":"ed3b5016-fa90-4e0a-9c77-42ae3411248b","description":"<p>Track student lecture viewing progress.</p>\n<p><strong>Scope required:</strong> <code>progress:read</code> or <code>read</code></p>\n<p>Progress includes watch percentage and completion status for each student-lecture pair.</p>\n","_postman_id":"ed3b5016-fa90-4e0a-9c77-42ae3411248b","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}}},{"name":"Recordings","item":[{"name":"List Recordings","id":"11cbf739-5249-4c69-bc7b-2267c95503ae","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/recordings?page=1&per_page=20","description":"<p>List all class recordings.</p>\n<p><strong>Scope:</strong> <code>recordings:read</code> or <code>read</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"query-parameters\">Query Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>class_id</code></td>\n<td>uuid</td>\n<td>—</td>\n<td>Filter by class</td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>integer</td>\n<td><code>1</code></td>\n<td>Page number</td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>integer</td>\n<td><code>20</code></td>\n<td>Items per page (max: 100)</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-fields\">Response Fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>uuid</td>\n<td>Recording unique identifier</td>\n</tr>\n<tr>\n<td><code>class_id</code></td>\n<td>uuid</td>\n<td>Associated class</td>\n</tr>\n<tr>\n<td><code>class_title</code></td>\n<td>string</td>\n<td>Class title</td>\n</tr>\n<tr>\n<td><code>duration</code></td>\n<td>integer</td>\n<td>Duration in seconds</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td>Recording status</td>\n</tr>\n<tr>\n<td><code>created_at</code></td>\n<td>datetime</td>\n<td>ISO 8601 timestamp</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["recordings"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[{"disabled":true,"description":{"content":"<p>Filter by class</p>\n","type":"text/plain"},"key":"class_id","value":""},{"key":"page","value":"1"},{"key":"per_page","value":"20"}],"variable":[]}},"response":[{"id":"330dcf90-21a7-4689-9916-10d504a8aaaa","name":"200 — Success","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.zenslearn.com/api/v1/public/recordings?page=1&per_page=20","host":["https://api.zenslearn.com/api/v1/public"],"path":["recordings"],"query":[{"key":"class_id","value":"","description":"Filter by class","disabled":true},{"key":"page","value":"1"},{"key":"per_page","value":"20"}]},"description":"List all class recordings.\n\n**Scope:** `recordings:read` or `read` | **Rate limit:** 1,000/min\n\n### Query Parameters\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `class_id` | uuid | — | Filter by class |\n| `page` | integer | `1` | Page number |\n| `per_page` | integer | `20` | Items per page (max: 100) |\n\n### Response Fields\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | uuid | Recording unique identifier |\n| `class_id` | uuid | Associated class |\n| `class_title` | string | Class title |\n| `duration` | integer | Duration in seconds |\n| `status` | string | Recording status |\n| `created_at` | datetime | ISO 8601 timestamp |"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"id\": \"rec-1234...\",\n      \"class_id\": \"cl-1234...\",\n      \"class_title\": \"JavaScript Fundamentals\",\n      \"duration\": 3600,\n      \"status\": \"available\",\n      \"created_at\": \"2026-03-20T11:00:00Z\"\n    }\n  ],\n  \"total\": 1,\n  \"page\": 1,\n  \"per_page\": 20,\n  \"total_pages\": 1\n}"}],"_postman_id":"11cbf739-5249-4c69-bc7b-2267c95503ae"},{"name":"Get Recording","id":"6c345941-4140-4c03-8237-655d65ae60ec","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.zenslearn.com/api/v1/public/recordings/","description":"<p>Retrieve a single recording by ID.</p>\n<p><strong>Scope:</strong> <code>recordings:read</code> or <code>read</code> | <strong>Rate limit:</strong> 1,000/min</p>\n<h3 id=\"path-parameters\">Path Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>recording_id</code></td>\n<td>uuid</td>\n<td><strong>Required.</strong> The recording's unique identifier</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"errors\">Errors</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>404</code></td>\n<td>Recording not found</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["recordings",""],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[],"_postman_id":"6c345941-4140-4c03-8237-655d65ae60ec"}],"id":"12b11b1d-b070-4d2a-8fb4-c6d15b7fa2f7","description":"<p>View class recording metadata.</p>\n<p><strong>Scope required:</strong> <code>recordings:read</code> or <code>read</code></p>\n<p>Recordings are automatically captured from Zoom classes.</p>\n","_postman_id":"12b11b1d-b070-4d2a-8fb4-c6d15b7fa2f7","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}}},{"name":"Enrollment & Access","item":[{"name":"Enroll Student","id":"4fa7be0b-af2e-dd35-7775-beef4cf873fd","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"student_id\": \"\",\n  \"batch_id\": \"\",\n  \"access_days\": 365\n}","options":{"raw":{"language":"json"}}},"url":"https://api.zenslearn.com/api/v1/public/enrollments","description":"<p>Enroll a student in a batch with an optional access window. <strong>Scope:</strong> <code>enrollments:write</code>. Provide <code>access_days</code> (1–3650) <strong>or</strong> <code>access_end_date</code> (YYYY-MM-DD) — not both (422). Omit both → access inherits the batch end_date. Optional <code>admissions_officer_id</code> to attribute the action. <code>409</code> if already enrolled in this batch; <code>404</code> if student/batch not found.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["enrollments"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[],"_postman_id":"4fa7be0b-af2e-dd35-7775-beef4cf873fd"},{"name":"Bulk Enroll","id":"22c4b710-d494-4948-b3a0-bd0ac2cea82d","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"student_ids\": [\"\"],\n  \"access_days\": 365\n}","options":{"raw":{"language":"json"}}},"url":"https://api.zenslearn.com/api/v1/public/batches//enrollments/bulk","description":"<p>Enroll many students into one batch. <strong>Scope:</strong> <code>enrollments:write</code>. <code>student_ids</code> max 500. Optional <code>access_days</code>/<code>access_end_date</code> (mutually exclusive) apply to all. Returns <strong>200</strong> <code>{ enrolled: [ids], errors: [{student_id, error}], count }</code> — partial success (already-enrolled rows surface in <code>errors</code>, not as failures).</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["batches","","enrollments","bulk"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[],"_postman_id":"22c4b710-d494-4948-b3a0-bd0ac2cea82d"},{"name":"Deactivate in Batch","id":"0b1ad3df-3c5f-0aac-a2e8-26dd6a38b9eb","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}},"url":"https://api.zenslearn.com/api/v1/public/students//batches//deactivate","description":"<p>Pause a student's access to ONE batch without removing them (reversible). <strong>Scope:</strong> <code>enrollments:write</code>. Sets the enrollment <code>is_active=false</code> → student gets 403 on that batch's gated content until reactivated. <code>404</code> if no such enrollment.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["students","","batches","","deactivate"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[],"_postman_id":"0b1ad3df-3c5f-0aac-a2e8-26dd6a38b9eb"},{"name":"Activate in Batch","id":"206ec8fe-fe3c-05cb-fd67-4013db69dfa8","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}},"url":"https://api.zenslearn.com/api/v1/public/students//batches//activate","description":"<p>Resume a student's access to one batch (reverses Deactivate). <strong>Scope:</strong> <code>enrollments:write</code>. Sets <code>is_active=true</code>. <code>404</code> if no such enrollment.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["students","","batches","","activate"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[],"_postman_id":"206ec8fe-fe3c-05cb-fd67-4013db69dfa8"},{"name":"Suspend Student","id":"af951e6b-2abe-042c-b55f-a7e52ffb7802","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}},"url":"https://api.zenslearn.com/api/v1/public/students//suspend","description":"<p>Suspend the whole student account across ALL batches and revoke their sessions. <strong>Scope:</strong> <code>students:write</code>. Reversible via Reactivate. <code>404</code> if student not found in this institute.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["students","","suspend"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[],"_postman_id":"af951e6b-2abe-042c-b55f-a7e52ffb7802"},{"name":"Reactivate Student","id":"1e4f19d8-3be1-cc32-3bfe-33a04b615a29","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}},"url":"https://api.zenslearn.com/api/v1/public/students//reactivate","description":"<p>Reactivate a suspended student account (reverses Suspend). <strong>Scope:</strong> <code>students:write</code>. <code>404</code> if student not found.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}},"urlObject":{"path":["students","","reactivate"],"host":["https://api.zenslearn.com/api/v1/public"],"query":[],"variable":[]}},"response":[],"_postman_id":"1e4f19d8-3be1-cc32-3bfe-33a04b615a29"}],"id":"ed7a055e-fbd4-11fd-f66c-84fec0d5c083","_postman_id":"ed7a055e-fbd4-11fd-f66c-84fec0d5c083","description":"","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]},"isInherited":true,"source":{"_postman_id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","id":"516fb233-1c1d-4ce8-93f3-a7952d6d4de0","name":"Zenslearn Public API","type":"collection"}}}],"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"your_api_key_here"}]}},"event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":[""],"id":"67a391e2-6b49-4d1c-a5d5-4575158f3df1"}},{"listen":"test","script":{"type":"text/javascript","exec":["// Auto-extract IDs from responses for use in subsequent requests","if (pm.response.code === 200 || pm.response.code === 201) {","    try {","        var json = pm.response.json();","        var data = json.data ? json.data[0] : json;","        if (data && data.id) {","            var path = pm.request.url.path.join('/');","            if (path.includes('students')) pm.collectionVariables.set('student_id', data.id);","            if (path.includes('batches')) pm.collectionVariables.set('batch_id', data.id);","            if (path.includes('courses')) pm.collectionVariables.set('course_id', data.id);","            if (path.includes('fees') && !path.includes('payments')) pm.collectionVariables.set('fee_plan_id', data.id);","            if (path.includes('classes')) pm.collectionVariables.set('class_id', data.id);","            if (path.includes('certificates')) pm.collectionVariables.set('cert_id', data.id);","            if (path.includes('teachers')) pm.collectionVariables.set('teacher_id', data.id);","            if (path.includes('recordings')) pm.collectionVariables.set('recording_id', data.id);","        }","    } catch(e) {}","}"],"id":"66b65ab2-6678-4a05-9b59-5c34aec3a88d"}}],"variable":[{"key":"base_url","value":"https://api.zenslearn.com/api/v1/public"},{"key":"api_key","value":"your_api_key_here"},{"key":"student_id","value":""},{"key":"batch_id","value":""},{"key":"course_id","value":""},{"key":"fee_plan_id","value":""},{"key":"payment_id","value":""},{"key":"class_id","value":""},{"key":"cert_id","value":""},{"key":"teacher_id","value":""},{"key":"recording_id","value":""},{"key":"idempotency_key","value":""}]}