{"info":{"_postman_id":"c56b816f-ef8a-4f2c-95da-7980ec6816bd","name":"HowNow APIs","description":"<html><head></head><body><p>HowNow External API collection covering authentication, User management, Content, Learning records, Skills, and Job tracking.</p>\n<h2 id=\"authentication--security\"><strong>Authentication &amp; Security</strong></h2>\n<h3 id=\"how-to-obtain-credentials\"><strong>How to Obtain Credentials</strong></h3>\n<p>Before you can make authorized requests, you must secure your API keys:</p>\n<ol>\n<li><p><strong>Contact Support:</strong> Reach out to our Customer Support team to initiate the credential request.</p>\n</li>\n<li><p><strong>Select a Plan:</strong> You must provide details on your chosen subscription plan ( Essential, or Enterprise) to define your rate limits.</p>\n</li>\n<li><p><strong>Receive Keys:</strong> Once approved, you will receive a <code>client_id</code> and a <code>client_secret</code>.</p>\n</li>\n</ol>\n<blockquote>\n<p><strong>Credential Safety</strong><br>Your `client_id` and `client_secret` carry the same privileges as an administrator account. Store them securely on your backend server. Never expose them in browsers, mobile applications, or public code repositories. </p>\n</blockquote>\n<h3 id=\"authentication-flow\">Authentication Flow</h3>\n<ol>\n<li><p>Call <code>POST <Base URL>/token</code> with OAuth2 client credentials (grant_type, client_id, client_secret, scope) to obtain a Bearer token</p>\n</li>\n<li><p>Use the <code>access_token</code> from the response as <code>Bearer</code> in the <code>Authorization</code> header of all subsequent requests</p>\n</li>\n<li><p>Token expires after 3600 seconds (1 hour)</p>\n</li>\n<li><p>All API endpoints execute requests using the workspace owner as the default acting user. If you need to perform actions on behalf of a different user, you may include their specific ID via the optional <code>X-User-Id</code> header, which is supported across all endpoints excluding the token endpoint</p>\n</li>\n</ol>\n<h3 id=\"token-validity\"><strong>Token Validity</strong></h3>\n<p>Each issued Bearer token is strictly valid for 1 hour (3600 seconds). Keep this short lifespan in mind and design your backend to seamlessly request a fresh token when your current session expires.</p>\n<h2 id=\"rate-limits\"><strong>Rate Limits</strong></h2>\n<p>Rate limits are applied per API key based on your subscription tier. Exceeding your tier limit will return a <code>429 Too Many Requests</code> response.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Tier</th>\n<th>Rate Limit</th>\n<th>Requests/Hour</th>\n<th>Target Use Case</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Essential</td>\n<td>50 req/min</td>\n<td>3,000</td>\n<td>Small-to-mid production workloads</td>\n</tr>\n<tr>\n<td>Pro</td>\n<td>100 req/min</td>\n<td>6,000</td>\n<td>High-scale production / growth-stage</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"base-urls-httpsapihownowapp\">Base URLs: <a href=\"https://api.hownow.app\">https://api.hownow.app</a></h2>\n<p>Depending on your organization's setup, your API requests should be directed to the appropriate regional endpoint. Please ensure you are using the correct base URL for your instance.</p>\n<blockquote>\n<p><strong>Note:</strong> If you are unsure which region your data is hosted in, please <strong>get in touch with our Support team</strong> for clarification before configuring your integration. </p>\n</blockquote>\n<h2 id=\"async-operations\">Async Operations</h2>\n<p>Some endpoints (user upsert, learning records, skills) return a <code>job_id</code>. Use <a href=\"https://developer.hownow.app/#ab61107b-e796-46b0-ae11-c9b55866e1b0\">this API</a> to track progress.</p>\n<p>Job statuses: <code>in_progress</code>, <code>completed</code>, <code>completed_with_warnings</code>, <code>failed</code></p>\n<h2 id=\"pagination\">Pagination</h2>\n<p>Paginated endpoints accept <code>page</code> (default: 1) and <code>per_page</code> (default: 20, max: 100) query parameters.</p>\n<h2 id=\"common-error-responses\">Common Error Responses</h2>\n<ul>\n<li><p><code>400 Bad Request</code> - Invalid parameters</p>\n</li>\n<li><p><code>401 Unauthorized</code> - Invalid or missing authentication</p>\n</li>\n<li><p><code>403 Forbidden</code> - User does not have permission</p>\n</li>\n<li><p><code>404 Not Found</code> - Resource not found</p>\n</li>\n<li><p><code>422 Unprocessable Entity</code> - Validation error</p>\n</li>\n<li><p><code>500 Internal Server Error</code> - Something went wrong</p>\n</li>\n<li><p><code>429 Too Many Requests</code> - Reached maximum rate limit</p>\n</li>\n</ul>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"owner":"52562409","collectionId":"c56b816f-ef8a-4f2c-95da-7980ec6816bd","publishedId":"2sBXiesDw8","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"ff4f56"},"publishDate":"2026-03-11T13:27:12.000Z"},"item":[{"name":"Authentication","item":[{"name":"Get Access Token","id":"a87b1b82-947c-43c9-b67b-a56e684728b4","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/x-www-form-urlencoded","description":"<p>Content type for form-encoded body</p>\n"}],"body":{"mode":"urlencoded","urlencoded":[{"key":"grant_type","value":"client_credentials","description":"<p>[MANDATORY] [string] OAuth2 grant type. Must be exactly 'client_credentials'.</p>\n","type":"text"},{"key":"client_id","value":"","description":"<p>[MANDATORY] [string] OAuth2 client ID provided by HowNow.</p>\n","type":"text"},{"key":"client_secret","value":"","description":"<p>[MANDATORY] [string] OAuth2 client secret provided by HowNow.</p>\n","type":"text"}]},"url":"<Base URL>/token","description":"<p>Obtain an OAuth2 access token using client credentials grant.</p>\n<p>All parameters are <strong>mandatory</strong> and must be sent as <code>application/x-www-form-urlencoded</code> body.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>grant_type</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>Must be <code>client_credentials</code></td>\n</tr>\n<tr>\n<td><code>client_id</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>Your OAuth2 client ID</td>\n</tr>\n<tr>\n<td><code>client_secret</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>Your OAuth2 client secret</td>\n</tr>\n</tbody>\n</table>\n</div><p>The returned <code>access_token</code> (JWT) should be used as <code>Bearer</code> in the <code>Authorization</code> header of all subsequent API requests. Token expires after 3600 seconds (1 hour).</p>\n","urlObject":{"path":["token"],"host":["<Base URL>"],"query":[],"variable":[]}},"response":[{"id":"e5b7720b-0e62-46e3-9ddc-f267a77da146","name":"200 OK - Token Issued","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/x-www-form-urlencoded"}],"body":{"mode":"urlencoded","urlencoded":[{"key":"grant_type","value":"client_credentials","type":"text"},{"key":"client_id","value":"your-client-id","type":"text"},{"key":"client_secret","value":"your-client-secret","type":"text"}]},"url":"<Base URL>/token"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"access_token\": \"eyJraWQiOiJJZTlTRTZcL1lWSDZaa0...<JWT token>\",\n  \"expires_in\": 3600,\n  \"token_type\": \"Bearer\"\n}"},{"id":"89eba4e2-e657-4ea2-a0da-499b18b7b80b","name":"400 Bad Request - Missing Parameters","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/x-www-form-urlencoded"}],"body":{"mode":"urlencoded","urlencoded":[{"key":"grant_type","value":"client_credentials","type":"text"}]},"url":"<Base URL>/token"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"invalid_request\"\n}"},{"id":"e031723f-f330-474b-a2c2-1b632f9ad968","name":"401 Unauthorized - Invalid Credentials","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/x-www-form-urlencoded"}],"body":{"mode":"urlencoded","urlencoded":[{"key":"grant_type","value":"client_credentials","type":"text"},{"key":"client_id","value":"invalid-id","type":"text"},{"key":"client_secret","value":"invalid-secret","type":"text"}]},"url":"<Base URL>/token"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"invalid_client\"\n}"}],"_postman_id":"a87b1b82-947c-43c9-b67b-a56e684728b4"}],"id":"c40fe62c-60fa-4a8d-8ebc-dd8413d4a8f6","description":"<p>Handles secure access to the HowNow API. This folder contains the OAuth2 client credentials grant flow. Developers use this endpoint to exchange their <code>client_id</code> and <code>client_secret</code> for a short-lived JSON Web Token (JWT). This Bearer token acts as the digital key required in the <code>Authorization</code> header for all subsequent data requests.</p>\n","_postman_id":"c40fe62c-60fa-4a8d-8ebc-dd8413d4a8f6"},{"name":"User","item":[{"name":"Get All Users","id":"4fd780b7-2c8f-4dd8-9873-9bb66e4730f6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Must be application/json</p>\n"}],"url":"<Base URL>/external/v1/users","description":"<p>Retrieves a comprehensive, paginated list of all active users in the system.</p>\n<h2 id=\"query-parameters\">Query Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</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>No</td>\n<td>integer</td>\n<td>1</td>\n<td>Page number</td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>No</td>\n<td>integer</td>\n<td>20</td>\n<td>Items per page (max: 100)</td>\n</tr>\n<tr>\n<td><code>q</code></td>\n<td>No</td>\n<td>string</td>\n<td>-</td>\n<td>Search users by name or email</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Access Control:</strong></p>\n<p>This will be controlled via optional <code>X-User-Id</code> from header</p>\n<ul>\n<li><p>Admin: Full access to all users</p>\n</li>\n<li><p>Manager: Only users in their reporting hierarchy</p>\n</li>\n<li><p>Contributor/ReadOnly: Self + reporting hierarchy</p>\n</li>\n</ul>\n","urlObject":{"path":["external","v1","users"],"host":["<Base URL>"],"query":[{"disabled":true,"description":{"content":"<p>[OPTIONAL] Page number (default: 1)</p>\n","type":"text/plain"},"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>[OPTIONAL] Items per page (default: 20, max: 100)</p>\n","type":"text/plain"},"key":"per_page","value":"20"},{"disabled":true,"description":{"content":"<p>[OPTIONAL] Search users by name or email</p>\n","type":"text/plain"},"key":"q","value":""}],"variable":[]}},"response":[{"id":"101cb82a-c69a-426c-8ee3-a2df0a0d70d2","name":"200 OK - Users List","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":{"raw":"<Base URL>/external/v1/users?page=1&per_page=2","host":["<Base URL>"],"path":["external","v1","users"],"query":[{"key":"page","value":"1"},{"key":"per_page","value":"2"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"id\": 304814,\n            \"name\": \"Abhishek Pandey Manager\",\n            \"external_user_id\": \"accounts_123232\",\n            \"email\": \"user1@example.com\",\n            \"status\": \"Active\",\n            \"state\": \"enabled\",\n            \"user_type\": \"Manager\",\n            \"created_at\": \"2025-10-31T06:11:53Z\",\n            \"joined_organisation_on\": null,\n            \"last_signed_at\": \"2025-12-02T09:45:58Z\",\n            \"last_active_at\": \"2025-12-22T09:27:55Z\",\n            \"job_role\": null,\n            \"manager\": null,\n            \"group_count\": 2,\n            \"image_details\": {\n                \"url\": \"https://s3.eu-west-1.amazonaws.com/ghn-file-store-experimental-il/master_avatars/avatars/000/000/005/original/5.png\",\n                \"uploaded\": false,\n                \"backdrop_color_code\": \"#ffce00\"\n            }\n        },\n        {\n            \"id\": 290778,\n            \"name\": \"j Admin\",\n            \"external_user_id\": \"accounts-2334\",\n            \"email\": \"user2@example.com\",\n            \"status\": \"Active\",\n            \"state\": \"enabled\",\n            \"user_type\": \"Admin\",\n            \"created_at\": \"2025-08-20T12:52:02Z\",\n            \"joined_organisation_on\": null,\n            \"last_signed_at\": \"2025-11-07T17:08:54Z\",\n            \"last_active_at\": \"2025-12-04T07:46:51Z\",\n            \"job_role\": \"Acting CFO\",\n            \"manager\": {\n                \"id\": 219640,\n                \"name\": \"John_Admin\",\n                \"image_details\": {\n                    \"url\": \"https://s3.eu-west-1.amazonaws.com/ghn-file-store-experimental-il/users/avatars/000/219/640/thumbnail/avatar.png\",\n                    \"uploaded\": false,\n                    \"backdrop_color_code\": \"\"\n                }\n            },\n            \"group_count\": 15,\n            \"image_details\": {\n                \"url\": \"https://s3.eu-west-1.amazonaws.com/ghn-file-store-experimental-il/master_avatars/avatars/000/000/008/original/8.png\",\n                \"uploaded\": false,\n                \"backdrop_color_code\": \"#b14021\"\n            }\n        }\n    ],\n    \"meta\": {\n        \"page\": 1,\n        \"per_page\": 2,\n        \"total_pages\": 1131,\n        \"total_count\": 2261,\n        \"filters\": {}\n    }\n}"},{"id":"faf500a8-ddd8-4ee6-a5f1-ef96fb2192ba","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/users"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not authorized\"\n}"}],"_postman_id":"4fd780b7-2c8f-4dd8-9873-9bb66e4730f6"},{"name":"Get User Details","id":"ebad9216-eea5-4b6e-a44c-f2e0ba96d90c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Must be application/json</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"url":"<Base URL>/external/v1/users/:{user_identifier}","description":"<p>Retrieves the detailed profile information for a specific user identified by their unique ID.</p>\n<h2 id=\"path-parameters\">Path Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>{user_identifier}</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>User identifier. Format: <code>ID-{id}</code> or <code>EXT-{external_id}</code></td>\n</tr>\n</tbody>\n</table>\n</div><p>The response includes user attributes such as name, email, roles, manager, job role, and account status.</p>\n","urlObject":{"path":["external","v1","users",":{user_identifier}"],"host":["<Base URL>"],"query":[],"variable":[{"type":"any","value":"EXT-user_123123","key":"{user_identifier}"}]}},"response":[{"id":"c2737bcf-a882-47b6-ab48-9c444c59b36d","name":"200 OK - User Details","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/users/ID-65728"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 65728,\n        \"name\": \"Hozefa Admin\",\n        \"external_user_id\": \"lnd_1234\",\n        \"email\": \"user3@example.com\",\n        \"status\": \"Active\",\n        \"state\": \"enabled\",\n        \"user_type\": \"Admin\",\n        \"created_at\": \"2022-08-17T08:07:36Z\",\n        \"joined_organisation_on\": \"2022-08-08\",\n        \"last_signed_at\": \"2026-02-17T11:05:45Z\",\n        \"last_active_at\": \"2026-02-18T08:57:26Z\",\n        \"job_role\": \"Academic Advisor\",\n        \"manager\": {\n            \"id\": 55834,\n            \"name\": \"Akhil Manager\",\n            \"image_details\": {\n                \"url\": \"https://images.unsplash.com/photo-manager-avatar\",\n                \"uploaded\": false,\n                \"backdrop_color_code\": \"\"\n            }\n        },\n        \"group_count\": 28,\n        \"image_details\": {\n            \"url\": \"https://s3.eu-west-1.amazonaws.com/ghn-file-store-experimental-il/users/avatars/000/065/728/thumbnail/avatar.png\",\n            \"uploaded\": true,\n            \"backdrop_color_code\": \"\"\n        },\n        \"custom_fields\": [\n            {\n                \"name\": \"FAIS_Accreditation\",\n                \"values\": \"No\"\n            },\n            {\n                \"name\": \"Employee_Identity_Number\",\n                \"values\": \"\"\n            },\n            {\n                \"name\": \"department\",\n                \"values\": \"Engineering\"\n            }\n        ]\n    }\n}"},{"id":"e48dd686-f10a-4fef-a3bd-5d44a07692fc","name":"404 Not Found","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/users/ID-99999"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not found\"\n}"},{"id":"df68b0ac-69ad-45f3-b780-9b7d87462415","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/users/ID-65728"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not authorized\"\n}"}],"_postman_id":"ebad9216-eea5-4b6e-a44c-f2e0ba96d90c"},{"name":"Get User Assigned Contents","id":"d057f6b0-bf52-4292-a00a-be65a138b59e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Must be application/json</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"url":"<Base URL>/external/v1/users/:{user_identifier}/assigned_contents?page=1&per_page=20","description":"<p>Retrieves a paginated list of all content items that have been assigned to the specified user. This represents the user's current learning queue or required training.</p>\n<h2 id=\"path-parameters\">Path Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>{user_identifier}</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>User identifier. Format: <code>ID-{id}</code> or <code>EXT-{external_id}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"query-parameters\">Query Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</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>No</td>\n<td>integer</td>\n<td>1</td>\n<td>Page number</td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>No</td>\n<td>integer</td>\n<td>20</td>\n<td>Items per page (max: 100)</td>\n</tr>\n<tr>\n<td><code>q</code></td>\n<td>No</td>\n<td>string</td>\n<td>-</td>\n<td>Search query, content name</td>\n</tr>\n</tbody>\n</table>\n</div><p>Response includes assignment status (Not Started, In Progress, Completed), progress percentage, deadlines, and renewal dates.</p>\n","urlObject":{"path":["external","v1","users",":{user_identifier}","assigned_contents"],"host":["<Base URL>"],"query":[{"description":{"content":"<p>[OPTIONAL] Page number (default: 1)</p>\n","type":"text/plain"},"key":"page","value":"1"},{"description":{"content":"<p>[OPTIONAL] Items per page (default: 20, max: 100)</p>\n","type":"text/plain"},"key":"per_page","value":"20"}],"variable":[{"type":"any","value":"","key":"{user_identifier}"}]}},"response":[{"id":"54f5e072-7e3d-4e2f-90cb-7300fb5e552f","name":"200 OK - Assigned Contents","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":{"raw":"<Base URL>/external/v1/users/ID-65728/assigned_contents?page=1&per_page=2","host":["<Base URL>"],"path":["external","v1","users","ID-65728","assigned_contents"],"query":[{"key":"page","value":"1"},{"key":"per_page","value":"2"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"id\": 184341,\n            \"hownow_id\": \"course_184341\",\n            \"title\": \"Nugget Created From the MS TEAMS Mandatory Toggle\",\n            \"content_type\": \"Nugget\",\n            \"author\": {\n                \"id\": 55780,\n                \"name\": \"Nelson Onboarding HowNow cloud\",\n                \"email\": \"user4@example.com\",\n                \"role\": \"Admin\"\n            },\n            \"assigned_at\": \"2026-02-20T11:06:09Z\",\n            \"status\": \"Not Started\",\n            \"progress\": 0,\n            \"renewal_due_date\": null,\n            \"deadline_date\": null,\n            \"completed_at\": null,\n            \"is_overdue\": false,\n            \"metadata\": {\n                \"assigned_via\": \"nugget\",\n                \"source\": \"course\",\n                \"language\": \"en\",\n                \"visibility_level\": \"everywhere\"\n            }\n        },\n        {\n            \"id\": 184340,\n            \"hownow_id\": \"course_184340\",\n            \"title\": \"Nugget Test 19\",\n            \"content_type\": \"Nugget\",\n            \"author\": {\n                \"id\": 55780,\n                \"name\": \"Nelson Onboarding HowNow cloud\",\n                \"email\": \"user4@example.com\",\n                \"role\": \"Admin\"\n            },\n            \"assigned_at\": \"2026-02-20T10:46:17Z\",\n            \"status\": \"Not Started\",\n            \"progress\": 0,\n            \"renewal_due_date\": null,\n            \"deadline_date\": null,\n            \"completed_at\": null,\n            \"is_overdue\": false,\n            \"metadata\": {\n                \"assigned_via\": \"nugget\",\n                \"source\": \"course\",\n                \"language\": \"en\",\n                \"visibility_level\": \"everywhere\"\n            }\n        }\n    ],\n    \"meta\": {\n        \"page\": 1,\n        \"per_page\": 2,\n        \"total_pages\": 1726,\n        \"total_count\": 3451,\n        \"filters\": {}\n    }\n}"},{"id":"d197e92a-9fdb-41e5-8e9b-e504324e5146","name":"404 Not Found","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/users/ID-99999/assigned_contents"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not found\"\n}"},{"id":"12565a50-e5d1-48ce-bd02-066eb20b6b9d","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/users/ID-65728/assigned_contents"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not authorized\"\n}"}],"_postman_id":"d057f6b0-bf52-4292-a00a-be65a138b59e"},{"name":"Get User Authored Contents","id":"a0ba43ec-ebc1-41f8-84af-e36b2d3309a0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Must be application/json</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"url":"<Base URL>/external/v1/users/:{user_identifier}/authored_contents?page=1&per_page=20","description":"<p>Retrieves a paginated list of all content items created or published by the specified user. Returns all content authored by the user, including published, draft, scheduled, and unpublished items.</p>\n<h2 id=\"path-parameters\">Path Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>{user_identifier}</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>User identifier. Format: <code>ID-{id}</code> or <code>EXT-{external_id}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"query-parameters\">Query Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</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>No</td>\n<td>integer</td>\n<td>1</td>\n<td>Page number</td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>No</td>\n<td>integer</td>\n<td>20</td>\n<td>Items per page (max: 100)</td>\n</tr>\n<tr>\n<td><code>q</code></td>\n<td>No</td>\n<td>string</td>\n<td>-</td>\n<td>Search query, content name</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["external","v1","users",":{user_identifier}","authored_contents"],"host":["<Base URL>"],"query":[{"description":{"content":"<p>[OPTIONAL] Page number (default: 1)</p>\n","type":"text/plain"},"key":"page","value":"1"},{"description":{"content":"<p>[OPTIONAL] Items per page (default: 20, max: 100)</p>\n","type":"text/plain"},"key":"per_page","value":"20"}],"variable":[{"type":"any","value":"","key":"{user_identifier}"}]}},"response":[{"id":"f5521972-12a5-48b4-b201-ab49829df1bc","name":"200 OK - Authored Contents","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":{"raw":"<Base URL>/external/v1/users/ID-65728/authored_contents?page=1&per_page=2","host":["<Base URL>"],"path":["external","v1","users","ID-65728","authored_contents"],"query":[{"key":"page","value":"1"},{"key":"per_page","value":"2"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"id\": 181530,\n            \"hownow_id\": \"course_181530\",\n            \"title\": \"Course UBC\",\n            \"content_type\": \"Course\",\n            \"status\": \"Published\",\n            \"published_date\": \"2026-01-15T14:50:46.000Z\",\n            \"last_published\": \"2026-01-15T14:50:46.000Z\",\n            \"engagement_count\": 0,\n            \"version\": \"2026-02-22T09:32:30Z\",\n            \"author\": {\n                \"id\": 65728,\n                \"name\": \"Hozefa Admin\",\n                \"email\": \"user3@example.com\",\n                \"role\": \"Admin\"\n            },\n            \"metadata\": null\n        },\n        {\n            \"id\": 181529,\n            \"hownow_id\": \"course_181529\",\n            \"title\": \"Nugget UBC Present\",\n            \"content_type\": \"Nugget\",\n            \"status\": \"Published\",\n            \"published_date\": \"2026-01-15T14:50:02.000Z\",\n            \"last_published\": \"2026-01-15T14:50:02.000Z\",\n            \"engagement_count\": 0,\n            \"version\": \"2026-02-22T09:32:30Z\",\n            \"author\": {\n                \"id\": 65728,\n                \"name\": \"Hozefa Admin\",\n                \"email\": \"user3@example.com\",\n                \"role\": \"Admin\"\n            },\n            \"metadata\": null\n        }\n    ],\n    \"meta\": {\n        \"page\": 1,\n        \"per_page\": 2,\n        \"total_pages\": 2084,\n        \"total_count\": 4167,\n        \"filters\": {}\n    }\n}"},{"id":"6b622f3c-d9f0-4fa4-82c5-f444789aa158","name":"404 Not Found","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/users/ID-99999/authored_contents"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not found\"\n}"},{"id":"c7819685-4473-49ed-9377-888dacb4a42e","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/users/ID-65728/authored_contents"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not authorized\"\n}"}],"_postman_id":"a0ba43ec-ebc1-41f8-84af-e36b2d3309a0"},{"name":"Upsert User","id":"ab3edf06-e758-4d72-af72-7de674b566f4","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Must be application/json</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"external_user_id\": \"user_123\",\n  \"name\": \"John Doe\",\n  \"email\": \"john@example.com\",\n  \"user_type\": \"ReadOnly\",\n  \"manager_id\": \"EXT-manager_456\",\n  \"start_date\": \"2025-06-12\",\n  \"avatar_url\": \"https://example.com/avatars/john.jpg\",\n  \"dob\": \"1990-05-15\",\n  \"phone\": \"+44 123 456 7890\",\n  \"address\": \"123 Main Street, London\",\n  \"country\": \"UK\",\n  \"job_role\": {\n    \"id\": \"EXT-role_1234\",\n    \"name\": \"Application Developer\"\n  },\n  \"custom_fields\": [\n    {\n      \"field_name\": \"location\",\n      \"value\": \"NYC\"\n    },\n    {\n      \"field_name\": \"department\",\n      \"value\": \"Engineering\"\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"<Base URL>/external/v1/users/upsert","description":"<p>Creates or updates a user based on unique <code>external_user_id</code> and <code>email</code>. Returns a <code>job_id</code> to track the asynchronous upsert operation.</p>\n<h2 id=\"body-parameters\">Body Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>external_user_id</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>Only alphanumeric, underscores, hyphens. Regex: <code>/\\A[a-zA-Z0-9_-]+\\z/</code></td>\n<td>Unique external identifier for the user</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>Max 75 characters</td>\n<td>Full name of the user</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>Must match Devise email format</td>\n<td>User's email address</td>\n</tr>\n<tr>\n<td><code>user_type</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>One of: <code>Admin</code>, <code>Manager</code>, <code>ReadOnly</code>, <code>Contributor</code> (case-insensitive)</td>\n<td>Role/permission level of the user</td>\n</tr>\n<tr>\n<td><code>manager_id</code></td>\n<td>No</td>\n<td>string</td>\n<td>Format: <code>ID-{id}</code>, <code>EXT-{id}</code>. Manager must exist and be active.</td>\n<td>External ID of the user's line manager</td>\n</tr>\n<tr>\n<td><code>start_date</code></td>\n<td>No</td>\n<td>string</td>\n<td>Format: <code>YYYY-MM-DD</code>. Cannot be a future date.</td>\n<td>User's start/joined date (defaults to first sign-in date)</td>\n</tr>\n<tr>\n<td><code>avatar_url</code></td>\n<td>No</td>\n<td>string</td>\n<td>Must be a valid HTTP or HTTPS URL</td>\n<td>URL to the user's avatar image</td>\n</tr>\n<tr>\n<td><code>job_role</code></td>\n<td>No</td>\n<td>object</td>\n<td>See sub-fields below</td>\n<td>User's job role</td>\n</tr>\n<tr>\n<td><code>job_role.id</code></td>\n<td>No</td>\n<td>string</td>\n<td>Format: <code>ID-{id}</code>, <code>EXT-{id}.</code> Must exist.</td>\n<td>Job role identifier</td>\n</tr>\n<tr>\n<td><code>job_role.name</code></td>\n<td>No</td>\n<td>string</td>\n<td>Free text</td>\n<td>Job role name</td>\n</tr>\n<tr>\n<td><code>custom_fields</code></td>\n<td>No</td>\n<td>array</td>\n<td>Array of objects. Fields must be pre-defined in HowNow.</td>\n<td>Custom field values</td>\n</tr>\n<tr>\n<td><code>custom_fields[].field_name</code></td>\n<td>Yes (within object)</td>\n<td>string</td>\n<td>Must match an existing custom field name</td>\n<td>Name of the custom field</td>\n</tr>\n<tr>\n<td><code>custom_fields[].value</code></td>\n<td>Yes (within object)</td>\n<td>string</td>\n<td>Free text</td>\n<td>Value for the custom field</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Important Notes:</strong></p>\n<ul>\n<li><p>Custom fields completely replace existing data (non-delta updates). Send the full list of custom fields every time.</p>\n</li>\n<li><p>Cannot upsert deactivated users - reactivate first.</p>\n</li>\n<li><p>School seat limits are enforced on new user creation.</p>\n</li>\n<li><p>If user with given <code>external_user_id</code> exists, it will be updated; otherwise, a new user is created.</p>\n</li>\n</ul>\n","urlObject":{"path":["external","v1","users","upsert"],"host":["<Base URL>"],"query":[],"variable":[]}},"response":[{"id":"87fa7188-afb4-4ec5-a2ae-597583fc38fb","name":"201 Created - Job Accepted","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"external_user_id\": \"user_123\",\n  \"name\": \"John Doe\",\n  \"email\": \"john@example.com\",\n  \"user_type\": \"ReadOnly\"\n}"},"url":"<Base URL>/external/v1/users/upsert"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"job_id\": \"job_abc_123\",\n  \"message\": \"Request is accepted\"\n}"},{"id":"662fbf7b-c333-4803-a756-a6adb76be477","name":"400 Bad Request - Invalid Parameters","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"John Doe\"\n}"},"url":"<Base URL>/external/v1/users/upsert"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Invalid Parameters\"\n}"},{"id":"90533153-4715-4545-a557-28d206dbff70","name":"401 Unauthorized","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{}"},"url":"<Base URL>/external/v1/users/upsert"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not authorized\"\n}"}],"_postman_id":"ab3edf06-e758-4d72-af72-7de674b566f4"},{"name":"Deactivate User","id":"43fe617c-1af2-4ec3-9825-5e2445edd1ae","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Must be application/json</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"assigned_user_id\": \"user_123\"\n}","options":{"raw":{"language":"json"}}},"url":"<Base URL>/external/v1/users/:{user_identifier}/deactivate","description":"<p>Deactivates a user and transfers ownership of Contents, Groups, and Channels to the assigned user.</p>\n<h2 id=\"path-parameters\">Path Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>{user_identifier}</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>Format: <code>ID-{id}</code>, or <code>EXT-{id}</code>. ID must be valid 4-byte integer (0-2,147,483,647) if using <code>ID-</code> format.</td>\n<td>The user to deactivate</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"body-parameters\">Body Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>assigned_user_id</code></td>\n<td>Conditional</td>\n<td>string</td>\n<td>Same format as path param. Cannot be same user. Cannot be a Read Only user. Must be active (not deactivated).</td>\n<td>Required if user has active responsibilities (authored content, groups, channels). User to transfer ownership to.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Notes:</strong></p>\n<ul>\n<li><p>User must exist and be currently active.</p>\n</li>\n<li><p>If the user has no active responsibilities, <code>assigned_external_user_id</code> is optional.</p>\n</li>\n<li><p>Sets <code>deleted_at</code> timestamp and clears manager assignment.</p>\n</li>\n</ul>\n","urlObject":{"path":["external","v1","users",":{user_identifier}","deactivate"],"host":["<Base URL>"],"query":[],"variable":[{"type":"any","value":"","key":"{user_identifier}"}]}},"response":[{"id":"d4f66fe7-98fd-462c-bb43-fc47c712d0a0","name":"200 OK - User Deactivated","originalRequest":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"assigned_external_user_id\": \"EXT-user_123\"\n}"},"url":"<Base URL>/external/v1/users/ID-456/deactivate"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"User deactivated successfully\"\n}"},{"id":"96f02f3c-6a2c-46d8-aeb4-f784905ccaee","name":"401 Unauthorized","originalRequest":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"assigned_external_user_id\": \"EXT-user_123\"\n}"},"url":"<Base URL>/external/v1/users/ID-456/deactivate"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not authorized\"\n}"},{"id":"4d1ef028-9093-45b2-b8e2-42e87e321c50","name":"404 Not Found","originalRequest":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"assigned_external_user_id\": \"user_123\"\n}"},"url":"<Base URL>/external/v1/users/nonexistent/deactivate"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not found\"\n}"},{"id":"410bfa7a-820d-45fb-acc3-193b099a341e","name":"422 Unprocessable Entity - Read Only User","originalRequest":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"assigned_external_user_id\": \"readonly_user_789\"\n}"},"url":"<Base URL>/external/v1/users/ID-456/deactivate"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"errors\": \"Assigned User cannot be a 'Read Only' user\"\n}"}],"_postman_id":"43fe617c-1af2-4ec3-9825-5e2445edd1ae"},{"name":"Reactivate User","id":"63b218b2-2b0b-4b61-bab0-2081d292db92","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Must be application/json</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"url":"<Base URL>/external/v1/users/:{user_identifier}/reactivate","description":"<p>Reactivates a previously deactivated user in the system.</p>\n<h2 id=\"path-parameters\">Path Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>{user_identifier}</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>Format: <code>ID-{id}</code>, or <code>EXT-{id}</code>. ID must be valid 4-byte integer (0-2,147,483,647) if using <code>ID-</code> format.</td>\n<td>The user to reactivate</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>No request body is required.</strong></p>\n<p><strong>Notes:</strong></p>\n<ul>\n<li><p>User must exist and be currently deactivated.</p>\n</li>\n<li><p>Cannot reactivate a user who is already active or in invited state.</p>\n</li>\n<li><p>School seat limits are enforced - reactivation will fail if seat limit is reached.</p>\n</li>\n<li><p>Clears <code>deleted_at</code> and sets status to active (or invited if user never signed in).</p>\n</li>\n</ul>\n","urlObject":{"path":["external","v1","users",":{user_identifier}","reactivate"],"host":["<Base URL>"],"query":[],"variable":[{"id":"bf71ae33-33d2-483c-9a88-ccb28fe47b52","type":"any","value":"","key":"{user_identifier}"}]}},"response":[{"id":"e4363578-4eb4-4879-bdec-c7c232793bf7","name":"200 OK - User Reactivated","originalRequest":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"url":"<Base URL>/external/v1/users/ID-456/reactivate"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"User reactivated successfully\"\n}"},{"id":"cd3f924d-f922-44d0-8e37-1cb828740c54","name":"401 Unauthorized","originalRequest":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"}],"url":"<Base URL>/external/v1/users/ID-456/reactivate"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not authorized\"\n}"},{"id":"2e6af0f4-1d05-40c0-9ef0-d1e3b9997282","name":"404 Not Found","originalRequest":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"url":"<Base URL>/external/v1/users/nonexistent/reactivate"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not found\"\n}"}],"_postman_id":"63b218b2-2b0b-4b61-bab0-2081d292db92"},{"name":"Delete User","id":"e5893b22-0ebd-4967-82c5-b79da77e1b6b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Must be application/json</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"assigned_external_user_id\": \"user_123\"\n}","options":{"raw":{"language":"json"}}},"url":"<Base URL>/external/v1/users/:{user_identifier}/delete","description":"<p>Permanently deletes a user and transfers authorship of Contents, Groups, and Channels to the assigned user.</p>\n<h2 id=\"path-parameters\">Path Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>{user_identifier}</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>Format: <code>ID-{id}</code>, or <code>EXT-{id}</code>. ID must be valid 4-byte integer (0-2,147,483,647) if using <code>ID-</code> format.</td>\n<td>The user to delete</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"body-parameters\">Body Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>assigned_user_id</code></td>\n<td>Conditional</td>\n<td>string</td>\n<td>Same format as path param. Cannot be same user. Cannot be a Read Only user. Must be active.</td>\n<td>Required if user has active responsibilities. User to transfer ownership to.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Warning:</strong> This action is <strong>irreversible</strong>. The user record is hard-deleted.</p>\n<p><strong>Notes:</strong></p>\n<ul>\n<li><p>User must exist.</p>\n</li>\n<li><p>If user has authored content, groups, or channels, the <code>assigned_external_user_id</code> is required for ownership transfer.</p>\n</li>\n<li><p>Assignee cannot be the same user being deleted.</p>\n</li>\n<li><p>Assignee cannot be a Read Only user.</p>\n</li>\n</ul>\n","urlObject":{"path":["external","v1","users",":{user_identifier}","delete"],"host":["<Base URL>"],"query":[],"variable":[{"type":"any","value":"","key":"{user_identifier}"}]}},"response":[{"id":"442a446c-ba51-4f89-b505-3a326cddfed1","name":"200 OK - User Deleted","originalRequest":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"assigned_external_user_id\": \"EXT-user_123\"\n}"},"url":"<Base URL>/external/v1/users/ID-456/delete"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"User deleted successfully\"\n}"},{"id":"09023d0e-b986-4392-b0be-9608ce32df27","name":"401 Unauthorized","originalRequest":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"assigned_external_user_id\": \"ID-123\"\n}"},"url":"<Base URL>/external/v1/users/ID-456/delete"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not authorized\"\n}"},{"id":"e52507f9-c3a8-42d0-95b2-f8519de0365c","name":"404 Not Found","originalRequest":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"assigned_external_user_id\": \"EXT-user_123\"\n}"},"url":"<Base URL>/external/v1/users/nonexistent/delete"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not found\"\n}"},{"id":"3fdc15a0-a0a3-4973-ac55-227b7e2fa945","name":"422 Unprocessable Entity - Read Only User","originalRequest":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"assigned_external_user_id\": \"EXT-readonly_user_789\"\n}"},"url":"<Base URL>/external/v1/users/ID-456/delete"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"errors\": \"Assigned User cannot be a 'Read Only' user\"\n}"}],"_postman_id":"e5893b22-0ebd-4967-82c5-b79da77e1b6b"},{"name":"Add User Skill Reviews","id":"0dfa3ac8-2276-4b63-a315-b4c611c004df","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Must be application/json</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"skills\": [\n    {\n      \"external_skill_id\": \"skill_guid_1\",\n      \"reviewer_id\": \"EXT-reviewer_user_1\",\n      \"proficiency_level\": 3\n    },\n    {\n      \"external_skill_id\": \"skill_guid_2\",\n      \"proficiency_level\": 5\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"<Base URL>/external/v1/users/:{user_identifier}/skills","description":"<p>Adds or updates skill reviews for a user with proficiency levels. Returns a <code>job_id</code> to track the asynchronous operation.</p>\n<h2 id=\"path-parameters\">Path Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>{user_identifier}</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>Format: plain ID, <code>ID-{id}</code>, or <code>EXT-{id}</code></td>\n<td>The user to add skill reviews for</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"body-parameters\">Body Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>skills</code></td>\n<td>Yes</td>\n<td>array</td>\n<td>Non-empty array of skill objects</td>\n<td>Array of skill review objects</td>\n</tr>\n<tr>\n<td><code>skills[].skill_id</code></td>\n<td>Conditional</td>\n<td>string</td>\n<td>GUID/external identifier. At least one of <code>skill_id</code> or <code>external_skill_id</code> is required.  <br />Supports <code>ID-{id}</code> or <code>EXT-{id}</code> format</td>\n<td>Skill GUID</td>\n</tr>\n<tr>\n<td><code>skills[].proficiency_level</code></td>\n<td>Yes</td>\n<td>integer</td>\n<td>Must be 1-5</td>\n<td>Proficiency/rating level for the skill</td>\n</tr>\n<tr>\n<td><code>skills[].reviewer_id</code></td>\n<td>No</td>\n<td>string</td>\n<td>Format: <code>ID-{id}</code>, <code>EXT-{id}</code>. Reviewer must be admin, author, or manager.</td>\n<td>ID of the reviewer. Omit for self-review.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Notes:</strong></p>\n<ul>\n<li><p>If <code>reviewer_id</code> is blank or same as the user, it is treated as a self-review.</p>\n</li>\n<li><p>If <code>reviewer_id</code> is a different user, it is treated as an endorsed review.</p>\n</li>\n<li><p>Reviewer must have appropriate permissions (admin, content author, or manager).</p>\n</li>\n<li><p>School's learner expertise must not be locked.</p>\n</li>\n</ul>\n","urlObject":{"path":["external","v1","users",":{user_identifier}","skills"],"host":["<Base URL>"],"query":[],"variable":[{"id":"70a0133f-c399-4907-8911-59f97861e5c6","type":"any","value":"","key":"{user_identifier}"}]}},"response":[{"id":"f9ffe38d-6926-453e-8cdd-2b53306e0cfd","name":"201 Created - Job Accepted","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"skills\": [\n    {\n      \"skill_id\": \"EXT-skill_1\",\n      \"proficiency_level\": 3\n    }\n  ]\n}"},"url":"<Base URL>/external/v1/users/ID-345/skills"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"job_id\": \"job_abc_123\",\n  \"message\": \"Request is accepted\"\n}"},{"id":"3a564212-5ed1-4171-9b44-6d40594c1a50","name":"400 Bad Request","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"skills\": []\n}"},"url":"<Base URL>/external/v1/users/ID-123/skills"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Invalid Parameters\"\n}"},{"id":"d9e6772a-9714-43df-bbe5-7bba701367d4","name":"401 Unauthorized","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{}"},"url":"<Base URL>/external/v1/users/ID-123/skills"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not authorized\"\n}"}],"_postman_id":"0dfa3ac8-2276-4b63-a315-b4c611c004df"},{"name":"Delete User Skills","id":"cc7af5ee-72a8-4e6d-9e1b-c33019678697","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Must be application/json</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"skills\": [\n    {\n      \"skill_id\": \"EXT-skill_guid_1\",\n      \"reviewer_id\": \"EXT-reviewer_user_1\"\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"<Base URL>/external/v1/users/:{user_identifier}/skills","description":"<p>Deletes skill reviews for a user from the HowNow platform. Returns a <code>job_id</code> to track the asynchronous operation.</p>\n<h2 id=\"path-parameters\">Path Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>{user_identifier}</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>Format: plain ID, <code>ID-{id}</code>, or <code>EXT-{id}</code></td>\n<td>The user to remove skill reviews from</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"body-parameters\">Body Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>skills</code></td>\n<td>Yes</td>\n<td>array</td>\n<td>Non-empty array of skill objects</td>\n<td>Array of skill objects to remove</td>\n</tr>\n<tr>\n<td><code>skills[].external_skill_id</code></td>\n<td>Conditional</td>\n<td>string</td>\n<td>GUID/external identifier. At least one of <code>skill_id</code> or <code>external_skill_id</code> required.  <br />Supports <code>ID-{id}</code> or <code>EXT-{id}</code> format</td>\n<td>External skill GUID</td>\n</tr>\n<tr>\n<td><code>skills[].reviewer_id</code></td>\n<td>No</td>\n<td>string</td>\n<td>Format: <code>ID-{id}</code>, <code>EXT-{id}</code>, or plain external_user_id</td>\n<td>Reviewer whose review to remove. Omit to remove self-review.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Notes:</strong></p>\n<ul>\n<li><p>Job-role assigned skills cannot be removed via this endpoint.</p>\n</li>\n<li><p>Endorsed skills can only be removed by the original endorser.</p>\n</li>\n<li><p>Self-added skills can only be removed by the user themselves.</p>\n</li>\n<li><p>School's learner expertise must not be locked.</p>\n</li>\n</ul>\n","urlObject":{"path":["external","v1","users",":{user_identifier}","skills"],"host":["<Base URL>"],"query":[],"variable":[{"id":"c2fe064a-5b3f-4959-955a-a79b3c3fa97f","type":"any","value":"","key":"{user_identifier}"}]}},"response":[{"id":"4d92b6a3-bef2-4edf-a309-31ccd7599d3b","name":"201 Created - Job Accepted","originalRequest":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"skills\": [\n    {\n      \"skill_id\": \"EXT-skill_1\"\n    }\n  ]\n}"},"url":"<Base URL>/external/v1/users/ID-123/skills"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"job_id\": \"job_abc_123\",\n  \"message\": \"Request is accepted\"\n}"},{"id":"247c1b1d-024e-4dfd-a94b-dcc7e697352f","name":"401 Unauthorized","originalRequest":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{}"},"url":"<Base URL>/external/v1/users/ID-123/skills"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not authorized\"\n}"},{"id":"22d57204-9dfa-4501-8817-17835b53b750","name":"404 Not Found","originalRequest":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"skills\": [\n    {\n      \"skill_id\": \"skill_1\"\n    }\n  ]\n}"},"url":"<Base URL>/external/v1/users/nonexistent/skills"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not found\"\n}"}],"_postman_id":"cc7af5ee-72a8-4e6d-9e1b-c33019678697"}],"id":"ac589fdc-c6e1-4454-9066-ffce98a8d209","description":"<p>Manages the complete lifecycle of learners and employees within the HowNow platform. This suite of endpoints handles account provisioning (creating users with specific roles, manager assignments, and custom fields), profile updates, and secure offboarding. It includes operations for deactivating or permanently deleting users, complete with safeguards to reassign any content or groups they authored to another active user.</p>\n","_postman_id":"ac589fdc-c6e1-4454-9066-ffce98a8d209"},{"name":"External Content Engagement","item":[{"name":"Upsert Learning Record","id":"922287bf-9a55-4fe1-9c09-c2f02275abd1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Must be application/json</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"external_user_id\": \"user_1\",\n  \"external_content_id\": \"course_1\",\n  \"provider\": \"Civil Service Learning\",\n  \"completion_percentage\": 20,\n  \"enrollment_date\": \"2025-06-15\",\n  \"completion_date\": null,\n  \"time_spent\": 100\n}","options":{"raw":{"language":"json"}}},"url":"<Base URL>/external/v1/contents/engagement/upsert","description":"<p>Creates or updates a learner engagement record for content. Returns a <code>job_id</code> to track the asynchronous operation.</p>\n<h2 id=\"body-parameters\">Body Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>external_user_id</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>Must match an existing user's external ID</td>\n<td>External identifier of the learner</td>\n</tr>\n<tr>\n<td><code>external_content_id</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>Must match an existing content's external ID</td>\n<td>External identifier of the content</td>\n</tr>\n<tr>\n<td><code>provider</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>Free text</td>\n<td>Name of the content provider (e.g. 'Civil Service Learning')</td>\n</tr>\n<tr>\n<td><code>completion_percentage</code></td>\n<td>Yes</td>\n<td>integer</td>\n<td>0-100</td>\n<td>Percentage of content completed</td>\n</tr>\n<tr>\n<td><code>enrollment_date</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>Format: <code>YYYY-MM-DD</code></td>\n<td>Date the user enrolled in the content</td>\n</tr>\n<tr>\n<td><code>completion_date</code></td>\n<td>No</td>\n<td>string/null</td>\n<td>Format: <code>YYYY-MM-DD</code> or <code>null</code></td>\n<td>Date the user completed the content. Use <code>null</code> if not yet completed.</td>\n</tr>\n<tr>\n<td><code>time_spent</code></td>\n<td>No</td>\n<td>integer</td>\n<td>Non-negative integer, in seconds</td>\n<td>Total time spent on the content in seconds</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Important:</strong> Full payload is required for every update, even when modifying a single field. This is a non-delta update - all fields are overwritten.</p>\n","urlObject":{"path":["external","v1","contents","engagement","upsert"],"host":["<Base URL>"],"query":[],"variable":[]}},"response":[{"id":"677960cb-a174-41f2-a440-80da1ef60c0c","name":"201 Created - Job Accepted","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"external_user_id\": \"user_1\",\n  \"external_content_id\": \"course_1\",\n  \"provider\": \"Civil Service Learning\",\n  \"completion_percentage\": 20,\n  \"enrollment_date\": \"2025-06-15\"\n}"},"url":"<Base URL>/external/v1/contents/engagement/upsert"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"job_id\": \"job_abc_123\",\n  \"message\": \"Request is accepted\"\n}"},{"id":"9542a832-8733-445b-8a85-8a5a3ccf1daf","name":"400 Bad Request","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"external_user_id\": \"user_1\"\n}"},"url":"<Base URL>/external/v1/contents/engagement/upsert"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Invalid Parameters\"\n}"},{"id":"cf70488c-fac2-4b50-a212-f31abe5ab480","name":"401 Unauthorized","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{}"},"url":"<Base URL>/external/v1/contents/engagement/upsert"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not authorized\"\n}"}],"_postman_id":"922287bf-9a55-4fe1-9c09-c2f02275abd1"}],"id":"009f449d-11c1-4016-9a51-8869052d1cb5","description":"<p>Tracks learning progress, history, and engagement from outside the HowNow ecosystem. Developers use these endpoints to sync historical completion data, time spent, and enrollment dates from third-party Learning Management Systems (LMS), external content providers or internal HR platforms directly into a user's HowNow learning record.</p>\n","_postman_id":"009f449d-11c1-4016-9a51-8869052d1cb5"},{"name":"Content","item":[{"name":"Search Content","id":"d50fd28d-757a-485b-aeb8-454df520c177","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Content type</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"url":"<Base URL>/external/v1/contents/search","description":"<p>Search and list content across all available sources in the school.</p>\n<h2 id=\"query-parameters\">Query Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Default</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>q</code></td>\n<td>No</td>\n<td>string</td>\n<td><code>\\\\\\*</code> (all)</td>\n<td>Free text. Alias: <code>search</code></td>\n<td>Search query. Empty or <code>\\\\\\*</code> lists all content for the source.</td>\n</tr>\n<tr>\n<td><code>source</code></td>\n<td>No</td>\n<td>string</td>\n<td><code>course</code></td>\n<td>One source per request. See aliases below.</td>\n<td>Content source filter.  <br />Use value from content/sources API.  <br />Course is a default source.</td>\n</tr>\n<tr>\n<td><code>type</code></td>\n<td>No</td>\n<td>string/CSV</td>\n<td>(none)</td>\n<td>Valid: <code>course</code>, <code>nugget</code>, <code>pathway</code>, <code>live_class</code>, <code>webinar</code>, <code>event</code>, <code>scorm</code></td>\n<td>Content type filter. Only applies to internal sources. Use value from content/types API</td>\n</tr>\n<tr>\n<td><code>language</code></td>\n<td>No</td>\n<td>string/CSV</td>\n<td>(none)</td>\n<td>Language codes (e.g. <code>en</code>, <code>fr</code>)</td>\n<td>Language filter.  <br />Use value from content/languages API to get language code.</td>\n</tr>\n<tr>\n<td><code>is_premium</code></td>\n<td>No</td>\n<td>boolean</td>\n<td>(none)</td>\n<td>Must be exactly <code>true</code> or <code>false</code></td>\n<td>Premium content filter.</td>\n</tr>\n<tr>\n<td><code>sort_by</code></td>\n<td>No</td>\n<td>string</td>\n<td><code>relevance</code></td>\n<td>Valid: <code>relevance</code>, <code>last_published</code>, <code>created_at</code></td>\n<td>Sort field.</td>\n</tr>\n<tr>\n<td><code>sort_order</code></td>\n<td>No</td>\n<td>string</td>\n<td><code>desc</code></td>\n<td>Valid: <code>asc</code>, <code>desc</code></td>\n<td>Sort direction.</td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>No</td>\n<td>integer</td>\n<td><code>1</code></td>\n<td>Positive integer. <code>page \\\\\\\\\\\\\\\\* per_page</code> max 10,000.</td>\n<td>Page number.</td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>No</td>\n<td>integer</td>\n<td><code>20</code></td>\n<td>Positive integer, max <code>100</code>.</td>\n<td>Results per page.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Source Aliases:</strong> <code>hownow</code>/<code>how_now</code> -&gt; <code>course</code>, <code>hownow+</code>/<code>hnp</code> -&gt; <code>hownow_plus</code>, <code>rss</code>/<code>feed_article</code> -&gt; <code>feed_articles.</code> This values will same as contents/sources API</p>\n<p><strong>Notes:</strong></p>\n<ul>\n<li><p>Non-admin users only see assigned, authored, or collaborated content.</p>\n</li>\n<li><p>Course will be default source if source filter is not passed.</p>\n</li>\n<li><p>Response includes <code>other_sources_summary</code> in meta showing counts in other sources.</p>\n</li>\n<li><p>Use sources from <code>other_sources_summary</code> to get data/contents from different sources.</p>\n</li>\n<li><p><strong>Max result window: 10,000 (page * per_page cannot exceed this) if search query is passed in params.</strong></p>\n</li>\n</ul>\n","urlObject":{"path":["external","v1","contents","search"],"host":["<Base URL>"],"query":[],"variable":[]}},"response":[{"id":"fef6a2fb-42af-48f0-8ece-ae54282b87ee","name":"200 OK - Search Results","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":{"raw":"<Base URL>/external/v1/contents/search?q=board&page=1&per_page=20","host":["<Base URL>"],"path":["external","v1","contents","search"],"query":[{"key":"q","value":"board"},{"key":"page","value":"1"},{"key":"per_page","value":"20"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"id\": 474,\n            \"source\": \"course\",\n            \"hownow_id\": \"course_474\",\n            \"content_type\": \"course\",\n            \"name\": \"On-boarding \",\n            \"thumbnail\": \"https://images.unsplash.com/photo-1499781749692-e8274262c718?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=600&h=600&fit=crop&ixid=eyJhcHBfaWQiOjI4MzMzfQ\",\n            \"is_hownow_plus\": false,\n            \"is_pathway\": false,\n            \"duration\": null,\n            \"languages\": [\"en\"],\n            \"is_premium\": false,\n            \"is_scorm\": false,\n            \"visibility_level\": \"search_channels_library\",\n            \"published_date\": \"2019-04-03T18:30:00.000Z\",\n            \"last_published\": \"2019-04-03T18:30:00.000Z\",\n            \"created_at\": \"2019-02-14T13:39:47.000Z\",\n            \"url\": \"/members/course_play/474/lessons/630?preview=true\",\n            \"author\": {\n                \"id\": 23,\n                \"name\": \"Lulu\",\n                \"email\": \"user5@example.com\",\n                \"role\": \"Admin\"\n            },\n            \"metadata\": null,\n            \"is_mandatory\": false\n        },\n        {\n            \"id\": 485,\n            \"source\": \"course\",\n            \"hownow_id\": \"course_485\",\n            \"content_type\": \"course\",\n            \"name\": \"Debrief LT 2019\",\n            \"thumbnail\": \"https://s3.eu-west-1.amazonaws.com/ghn-file-store-experimental-il/courses/thumbnails/000/000/485/thumbnail/c5f3c12d13daa5ff218646b153b606111540b6e6?1592842381\",\n            \"is_hownow_plus\": false,\n            \"is_pathway\": false,\n            \"duration\": null,\n            \"languages\": [\"en\"],\n            \"is_premium\": false,\n            \"is_scorm\": false,\n            \"visibility_level\": \"search_channels_library\",\n            \"published_date\": \"2019-02-15T00:00:00.000Z\",\n            \"last_published\": \"2019-02-15T00:00:00.000Z\",\n            \"created_at\": \"2019-02-15T08:34:45.000Z\",\n            \"url\": \"/members/course_play/485/lessons/652?preview=true\",\n            \"author\": {\n                \"id\": 14,\n                \"name\": \"Nelson Sivalingam\",\n                \"email\": \"user6@example.com\",\n                \"role\": \"Admin\"\n            },\n            \"metadata\": null,\n            \"is_mandatory\": false\n        }\n    ],\n    \"meta\": {\n        \"page\": 1,\n        \"per_page\": 2,\n        \"total_pages\": 2359,\n        \"total_count\": 4717,\n        \"filters\": {\n            \"type\": \"course\"\n        },\n        \"other_sources_summary\": {\n            \"circus_street_course\": 3,\n            \"positive_purchasing_course\": 77,\n            \"go_fluent_course\": 170,\n            \"easygenerator\": 11,\n            \"oreilly_course\": 1200,\n            \"learning_library_course_34\": 93\n        }\n    }\n}\n"},{"id":"032a09f1-9a03-4eee-8d16-480ba4ab1b61","name":"400 Bad Request - Invalid Type","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":{"raw":"<Base URL>/external/v1/contents/search?type=invalid_type","host":["<Base URL>"],"path":["external","v1","contents","search"],"query":[{"key":"type","value":"invalid_type"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Invalid type(s): invalid_type. Valid types are: course, event, live_class, nugget, pathway, scorm, webinar\"\n}"},{"id":"aa0593d8-a8c0-4394-9529-9b3e25a9c002","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/contents/search"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Unauthorized\"\n}"}],"_postman_id":"d50fd28d-757a-485b-aeb8-454df520c177"},{"name":"Get Content Sources","id":"d054665c-64a2-4583-94bf-bd6c1cf59613","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Content type</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"url":"<Base URL>/external/v1/contents/sources","description":"<p>Retrieve the list of all available content sources for the school.</p>\n<p><strong>No query or body parameters.</strong> Only authentication headers required.</p>\n<h2 id=\"headers\">Headers</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Header</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Authorization</code></td>\n<td>Yes</td>\n<td>string</td>\n<td><code>Bearer {token}</code></td>\n</tr>\n<tr>\n<td><code>Content-Type</code></td>\n<td>Yes</td>\n<td>string</td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><code>X-User-Id</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>HowNow user identifier</td>\n</tr>\n</tbody>\n</table>\n</div><p>Returns sources that can be used as the <code>source</code> query parameter in the Search Content endpoint.</p>\n<p>Response format: <code>{ data: [{ id: string, label: string }] }</code></p>\n","urlObject":{"path":["external","v1","contents","sources"],"host":["<Base URL>"],"query":[],"variable":[]}},"response":[{"id":"ea67035f-a2d3-4054-9616-8ed7fa162702","name":"200 OK - Sources List","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/contents/sources"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"id\": \"course\",\n      \"label\": \"HowNow\"\n    },\n    {\n      \"id\": \"hownow_plus\",\n      \"label\": \"HowNow+\"\n    },\n    {\n      \"id\": \"udemy_course\",\n      \"label\": \"Udemy\"\n    },\n    {\n      \"id\": \"linkedin_course\",\n      \"label\": \"LinkedIn Learning\"\n    },\n    {\n      \"id\": \"feed_articles\",\n      \"label\": \"RSS Feeds\"\n    }\n  ]\n}"},{"id":"0599f317-4a27-4bce-acc6-1c572daa8777","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/contents/sources"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Unauthorized\"\n}"}],"_postman_id":"d054665c-64a2-4583-94bf-bd6c1cf59613"},{"name":"Get Content Types","id":"128792fd-6170-4895-9d72-36ec2a91b1c0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Content type</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"url":"<Base URL>/external/v1/contents/types","description":"<p>Retrieve the list of all available content types for the school.</p>\n<p><strong>No query or body parameters.</strong> Only authentication headers required.</p>\n<h2 id=\"headers\">Headers</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Header</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Authorization</code></td>\n<td>Yes</td>\n<td>string</td>\n<td><code>Bearer {token}</code></td>\n</tr>\n<tr>\n<td><code>Content-Type</code></td>\n<td>Yes</td>\n<td>string</td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><code>X-User-Id</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>HowNow user identifier</td>\n</tr>\n</tbody>\n</table>\n</div><p>Returns types that can be used as the <code>type</code> query parameter in the Search Content endpoint.</p>\n<p>Valid types: <code>course</code>, <code>nugget</code>, <code>pathway</code>, <code>live_class</code>, <code>webinar</code>, <code>event</code>, <code>scorm</code></p>\n<p>Response format: <code>{ data: [{ id: string, label: string }] }</code></p>\n","urlObject":{"path":["external","v1","contents","types"],"host":["<Base URL>"],"query":[],"variable":[]}},"response":[{"id":"17cd05fb-eb4b-436f-a819-7d0e7bde5d34","name":"200 OK - Types List","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/contents/types"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"id\": \"course\",\n      \"label\": \"Course\"\n    },\n    {\n      \"id\": \"nugget\",\n      \"label\": \"Nugget\"\n    },\n    {\n      \"id\": \"pathway\",\n      \"label\": \"Pathway\"\n    },\n    {\n      \"id\": \"live_class\",\n      \"label\": \"Live Class\"\n    },\n    {\n      \"id\": \"webinar\",\n      \"label\": \"Webinar\"\n    },\n    {\n      \"id\": \"event\",\n      \"label\": \"Event\"\n    },\n    {\n      \"id\": \"scorm\",\n      \"label\": \"SCORM\"\n    }\n  ]\n}"},{"id":"7f66d888-e45b-44fa-883f-54b0fbae310d","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/contents/types"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Unauthorized\"\n}"}],"_postman_id":"128792fd-6170-4895-9d72-36ec2a91b1c0"},{"name":"Get Content by HowNow ID","id":"daed7fcf-520b-42d2-a661-df294bac4a15","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Content type</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"url":"<Base URL>/external/v1/contents/:hownow_id","description":"<p>Retrieve metadata for a specific content item by its HowNow ID.</p>\n<h2 id=\"path-parameters\">Path Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>hownow_id</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>Format: <code>{source}_{numeric_id}</code> (e.g. <code>course_123</code>). Source must be a valid source slug. Parsed via regex.</td>\n<td>The unique HowNow content identifier</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>No query parameters.</strong></p>\n<p>Returns a non-detailed (summary) view of the content.</p>\n<p><strong>Access Control:</strong></p>\n<ul>\n<li>Admins: Full access to all content</li>\n<li>Published content: Assigned users, authors, and collaborators</li>\n<li>Unpublished content: Only authors and collaborators</li>\n<li>Third-party content: All users</li>\n</ul>\n","urlObject":{"path":["external","v1","contents",":hownow_id"],"host":["<Base URL>"],"query":[],"variable":[{"id":"49b621d2-6478-4fdc-872f-3dd5d01fa409","description":{"content":"<p>[MANDATORY] [string] The unique HowNow content identifier. Format: '{source}_{id}' (e.g. 'course_123', 'hownow_plus_456', 'feed_articles_789'). Source slug must be valid.</p>\n","type":"text/plain"},"type":"any","value":"","key":"hownow_id"}]}},"response":[{"id":"224d32b9-92c1-4769-b65c-d08213a18b6b","name":"200 OK - Content Found","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/contents/course_37180"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 37180,\n        \"source\": \"course\",\n        \"hownow_id\": \"course_37180\",\n        \"content_type\": \"webinar\",\n        \"name\": \"Webinar For Copy Link 123\",\n        \"thumbnail\": \"https://ghn-file-store-experimental-il.s3.eu-west-1.amazonaws.com/assets/course-default.png\",\n        \"is_hownow_plus\": false,\n        \"is_pathway\": false,\n        \"duration\": \"30m\",\n        \"language\": \"en\",\n        \"is_premium\": false,\n        \"is_scorm\": false,\n        \"visibility_level\": \"existing_content\",\n        \"published_date\": \"2024-04-01T06:36:26.000Z\",\n        \"last_published\": \"2024-04-01T06:36:26.000Z\",\n        \"created_at\": \"2024-04-01T06:25:35.000Z\",\n        \"url\": \"/courses/37180?preview=true\",\n        \"author\": {\n            \"id\": 64078,\n            \"name\": \"Sourabh_Kankekar_Sourabh_Kankekar_Sourabh_Kankekar_Sourabh_Kankekar_Sour123\",\n            \"email\": \"user7@example.com\",\n            \"role\": \"Admin\"\n        },\n        \"metadata\": null\n    }\n}\n"},{"id":"b069e529-6041-4095-a686-380966960f05","name":"404 Not Found","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/contents/course_99999"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not Found\"\n}"},{"id":"577f985b-9838-4b42-ae3e-9b028d013370","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/contents/course_123"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Unauthorized\"\n}"}],"_postman_id":"daed7fcf-520b-42d2-a661-df294bac4a15"},{"name":"Get Content Details","id":"893780b4-4806-47cf-bb33-ebbc7a320076","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Content type</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"url":"<Base URL>/external/v1/contents/:hownow_id/details","description":"<p>Retrieve the full detailed metadata for a specific content item by its HowNow ID, including its internal structure (sections, lessons, schedules).</p>\n<p>This endpoint extends the base content metadata (returned by <code>GET /contents/:hownow_id</code>) with structural details that vary depending on the content type.</p>\n<h2 id=\"path-parameters\">Path Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>hownow_id</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>Format: <code>{source}_{numeric_id}</code> (e.g. <code>course_37180</code>)</td>\n<td>The unique HowNow content identifier</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>No query or body parameters.</strong></p>\n<h2 id=\"response-structure-by-content-type\">Response Structure by Content Type</h2>\n<p>The base response fields are the same across all types (<code>id</code>, <code>source</code>, <code>hownow_id</code>, <code>content_type</code>, <code>name</code>, <code>thumbnail</code>, <code>is_hownow_plus</code>, <code>is_pathway</code>, <code>duration</code>, <code>language</code>, <code>is_premium</code>, <code>is_scorm</code>, <code>visibility_level</code>, <code>published_date</code>, <code>last_published</code>, <code>created_at</code>, <code>url</code>, <code>author</code>, <code>metadata</code>, <code>status</code>). The following <strong>additional fields</strong> are included depending on content type:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Content Type</th>\n<th>Additional Fields</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Course</strong></td>\n<td><code>sections</code></td>\n<td>Array of section objects, each containing <code>id</code>, <code>name</code>, <code>order</code>, and a <code>lessons</code> array (each lesson has <code>id</code> and <code>name</code>)</td>\n</tr>\n<tr>\n<td><strong>Pathway</strong></td>\n<td><code>sections</code>, <code>type: \"Pathway\"</code></td>\n<td>Array of pathway section objects with steps. Each step includes <code>hownow_id</code>, <code>name</code>, <code>content_type</code>, <code>source</code>, and <code>order</code></td>\n</tr>\n<tr>\n<td><strong>Live Class / Webinar</strong></td>\n<td><code>schedules</code></td>\n<td>Array of bookable time slots with scheduling details (start/end times, capacity, etc.)</td>\n</tr>\n<tr>\n<td><strong>Event (Offline)</strong></td>\n<td><code>schedules</code>, <code>address</code>, <code>additional_directions</code></td>\n<td>Same as Live Class plus physical location details</td>\n</tr>\n<tr>\n<td><strong>Nugget / Feed Article / Logged Learning</strong></td>\n<td><em>(none)</em></td>\n<td>Returns only the base metadata fields</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"example-course-sections-structure\">Example: Course sections structure</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">\"sections\": [\n  {\n    \"id\": 12345,\n    \"name\": \"Introduction\",\n    \"order\": 0,\n    \"lessons\": [\n      { \"id\": 67890, \"name\": \"Welcome &amp; Overview\" },\n      { \"id\": 67891, \"name\": \"Getting Started\" }\n    ]\n  }\n]\n</code></pre>\n<h2 id=\"access-control\">Access Control</h2>\n<ul>\n<li><strong>Admin</strong>: Can view details for all content in the school</li>\n<li><strong>Manager / Contributor / Read-Only</strong>: Can view details for content they are assigned to, authored, or collaborate on</li>\n<li>Returns <code>401 Unauthorized</code> if the user does not have access</li>\n<li>Returns <code>404 Not Found</code> if the <code>hownow_id</code> is invalid or content does not exist</li>\n</ul>\n<h2 id=\"error-responses\">Error Responses</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Condition</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td>Invalid <code>hownow_id</code> format</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>User does not have access to this content</td>\n</tr>\n<tr>\n<td><code>404 Not Found</code></td>\n<td>Content not found</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["external","v1","contents",":hownow_id","details"],"host":["<Base URL>"],"query":[],"variable":[{"id":"3ad71880-a134-4e49-bb43-48f3159a8fe0","description":{"content":"<p>[MANDATORY] [string] The unique HowNow content identifier. Format: '{source}_{id}' (e.g. 'course_123'). Source slug must be valid.</p>\n","type":"text/plain"},"type":"any","value":"","key":"hownow_id"}]}},"response":[{"id":"d6e7ad15-17a4-4e3b-be9e-372363d2ad9d","name":"200 OK - Course Details","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/contents/course_474/details"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 474,\n        \"source\": \"course\",\n        \"hownow_id\": \"course_474\",\n        \"content_type\": \"course\",\n        \"name\": \"On-boarding \",\n        \"thumbnail\": \"https://images.unsplash.com/photo-1499781749692-e8274262c718?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=600&h=600&fit=crop&ixid=eyJhcHBfaWQiOjI4MzMzfQ\",\n        \"is_hownow_plus\": false,\n        \"is_pathway\": false,\n        \"duration\": null,\n        \"languages\": [\"en\"],\n        \"is_premium\": false,\n        \"is_scorm\": false,\n        \"visibility_level\": \"search_channels_library\",\n        \"published_date\": \"2019-04-03T18:30:00.000Z\",\n        \"last_published\": \"2019-04-03T18:30:00.000Z\",\n        \"created_at\": \"2019-02-14T13:39:47.000Z\",\n        \"url\": \"/members/course_play/474/lessons/630?preview=true\",\n        \"author\": {\n            \"id\": 23,\n            \"name\": \"Lulu\",\n            \"email\": \"user5@example.com\",\n            \"role\": \"Admin\"\n        },\n        \"metadata\": null,\n        \"is_mandatory\": false,\n        \"type\": \"course\",\n        \"sections\": [\n            {\n                \"id\": 418,\n                \"name\": \"Section 1\",\n                \"order\": 1,\n                \"lessons\": [\n                    {\n                        \"id\": 630,\n                        \"name\": \"HowNow Core Values \"\n                    },\n                    {\n                        \"id\": 631,\n                        \"name\": \"Meet the Team \"\n                    },\n                    {\n                        \"id\": 632,\n                        \"name\": \"You can add a lot more ...\"\n                    }\n                ]\n            },\n            {\n                \"id\": 483,\n                \"name\": \"Section 3\",\n                \"order\": 2,\n                \"lessons\": [\n                    {\n                        \"id\": 723,\n                        \"name\": \"HowNow Core Values \"\n                    }\n                ]\n            }\n        ]\n    }\n}\n"},{"id":"e640d246-ad79-466d-a66b-59c95dee8829","name":"200 OK - Pathway Details","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/contents/course_21132/details"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 21132,\n        \"source\": \"course\",\n        \"hownow_id\": \"course_21132\",\n        \"content_type\": \"pathway\",\n        \"name\": \"Pathway testing\",\n        \"thumbnail\": \"https://s3.eu-west-1.amazonaws.com/ghn-file-store-experimental-il/courses/thumbnails/000/021/132/thumbnail/84e927c694bcc341524e201dbc7784035a405de1?1688727106\",\n        \"is_hownow_plus\": false,\n        \"is_pathway\": true,\n        \"duration\": \"5h\",\n        \"languages\": [\"en\"],\n        \"is_premium\": false,\n        \"is_scorm\": false,\n        \"visibility_level\": \"search_channels_library\",\n        \"published_date\": \"2024-06-04T08:22:46.000Z\",\n        \"last_published\": \"2024-06-04T08:22:46.000Z\",\n        \"created_at\": \"2023-07-07T05:16:44.000Z\",\n        \"url\": \"/rfe/pathways/21132/preview\",\n        \"author\": {\n            \"id\": 59443,\n            \"name\": \"sai-admin\",\n            \"email\": \"user8@example.com\",\n            \"role\": \"Admin\"\n        },\n        \"metadata\": null,\n        \"is_mandatory\": false,\n        \"type\": \"Pathway\",\n        \"sections\": [\n            {\n                \"id\": 23,\n                \"name\": \"Section Title\",\n                \"description\": \"Section description\",\n                \"steps\": {\n                    \"id\": 86,\n                    \"order\": 2,\n                    \"item_type\": \"PathwaySection\",\n                    \"item_id\": 23,\n                    \"name\": \"Section Title\",\n                    \"description\": \"Section description\",\n                    \"author\": {\n                        \"id\": 59443,\n                        \"name\": \"sai-admin\",\n                        \"email\": \"user8@example.com\",\n                        \"role\": \"Admin\"\n                    },\n                    \"published_at\": null,\n                    \"duration\": null,\n                    \"type\": \"Content\"\n                }\n            },\n            {\n                \"id\": 18824,\n                \"name\": \"Nugget Name\",\n                \"description\": null,\n                \"steps\": {\n                    \"id\": 87,\n                    \"order\": 3,\n                    \"item_type\": \"Course\",\n                    \"item_id\": 18824,\n                    \"name\": \"Nugget Name\",\n                    \"description\": \"\",\n                    \"author\": {\n                        \"id\": 59443,\n                        \"name\": \"sai-admin\",\n                        \"email\": \"user8@example.com\",\n                        \"role\": \"Admin\"\n                    },\n                    \"published_at\": \"almost 3 years ago\",\n                    \"duration\": null,\n                    \"type\": \"Content\"\n                }\n            },\n            {\n                \"id\": 19120,\n                \"name\": \"Scroll issue\",\n                \"description\": \"\",\n                \"steps\": {\n                    \"id\": 9,\n                    \"order\": 5,\n                    \"item_type\": \"Course\",\n                    \"item_id\": 19120,\n                    \"name\": \"Scroll issue\",\n                    \"description\": \"\",\n                    \"author\": {\n                        \"id\": 59443,\n                        \"name\": \"sai-admin\",\n                        \"email\": \"user8@example.com\",\n                        \"role\": \"Admin\"\n                    },\n                    \"published_at\": \"almost 3 years ago\",\n                    \"duration\": null,\n                    \"type\": \"Content\"\n                }\n            },\n            {\n                \"id\": 74,\n                \"name\": \"Advanced Cost Management\",\n                \"description\": \"Time:180m Subtitles: Français Gaining an advanced awareness of Cost Management you will: Use and understanding of multitiered supply chain costing models. Is able to apply them through the contract lifetime. Is able to provide team direction, inclusive of should-cost and target cost methods. Fully applies cost model to internal flow of money and explains implications to EBITDA. Looks for opportunities to treat suppliers appropriately given their relative portfolio volumes and the market complexity. Provides leadership in reviewing and guiding team on financial analysis methods, such as cost volume profit and cost/price models. Develops price forecasts for key commodities. Has complete understanding of total cost of ownership and takes into account indirect implications, such as corporate social responsibility, contracts, environmental, supplier relationship management, services levels, industry shifts and quality.\",\n                \"steps\": {\n                    \"id\": 3408,\n                    \"order\": 8,\n                    \"item_type\": \"PositivePurchasingCourse\",\n                    \"item_id\": 74,\n                    \"name\": \"Advanced Cost Management\",\n                    \"description\": \"Time:180m Subtitles: Français Gaining an advanced awareness of Cost Management you will: Use and understanding of multitiered supply chain costing models. Is able to apply them through the contract lifetime. Is able to provide team direction, inclusive of should-cost and target cost methods. Fully applies cost model to internal flow of money and explains implications to EBITDA. Looks for opportunities to treat suppliers appropriately given their relative portfolio volumes and the market complexity. Provides leadership in reviewing and guiding team on financial analysis methods, such as cost volume profit and cost/price models. Develops price forecasts for key commodities. Has complete understanding of total cost of ownership and takes into account indirect implications, such as corporate social responsibility, contracts, environmental, supplier relationship management, services levels, industry shifts and quality.\",\n                    \"author\": null,\n                    \"published_at\": \"3 years ago\",\n                    \"duration\": \"3h\",\n                    \"type\": \"Content\"\n                }\n            },\n            {\n                \"id\": 15,\n                \"name\": \"Assessing power and building a concession strategy\",\n                \"description\": \"Time:60m Subtitles: Français Assessing power and building a concession strategy is all about staying in control during the negotiation event. To stay in control we need to understand both our power position and what we are willing to concede during the event itself. It covers: Understanding where the power lies Our Negotiables and Concession strategy All courses are delivered using video, presentation slide shows and a knowledge check.\",\n                \"steps\": {\n                    \"id\": 3409,\n                    \"order\": 14,\n                    \"item_type\": \"PositivePurchasingCourse\",\n                    \"item_id\": 15,\n                    \"name\": \"Assessing power and building a concession strategy\",\n                    \"description\": \"Time:60m Subtitles: Français Assessing power and building a concession strategy is all about staying in control during the negotiation event. To stay in control we need to understand both our power position and what we are willing to concede during the event itself. It covers: Understanding where the power lies Our Negotiables and Concession strategy All courses are delivered using video, presentation slide shows and a knowledge check.\",\n                    \"author\": null,\n                    \"published_at\": \"3 years ago\",\n                    \"duration\": \"1h\",\n                    \"type\": \"Content\"\n                }\n            },\n            {\n                \"id\": 721,\n                \"name\": \"Section Title\",\n                \"description\": \"Section Description\",\n                \"steps\": {\n                    \"id\": 3677,\n                    \"order\": 15,\n                    \"item_type\": \"PathwaySection\",\n                    \"item_id\": 721,\n                    \"name\": \"Section Title\",\n                    \"description\": \"Section Description\",\n                    \"author\": {\n                        \"id\": 59443,\n                        \"name\": \"sai-admin\",\n                        \"email\": \"user8@example.com\",\n                        \"role\": \"Admin\"\n                    },\n                    \"published_at\": null,\n                    \"duration\": null,\n                    \"type\": \"Content\"\n                }\n            },\n            {\n                \"id\": 32,\n                \"name\": \"Building great Business Requirements\",\n                \"description\": \"Building great business requirements requires us to understand what we want and need and how to leverage the greatest benefit for our needs. It covers: Value Levers is a simple tool and approach to consider all the different actions or interventions we could use in order to realize benefit. Business Requirements are requirements stipulated by the business and clarified by the Category Management team. They form the backbone for the rest of our progression and are of core importance to determine and evaluate strategic sourcing options as well as for negotiation, RFP, supplier selection and contracting All courses are delivered using video, presentation slide shows and a knowledge check.\",\n                \"steps\": {\n                    \"id\": 3410,\n                    \"order\": 16,\n                    \"item_type\": \"PositivePurchasingCourse\",\n                    \"item_id\": 32,\n                    \"name\": \"Building great Business Requirements\",\n                    \"description\": \"Building great business requirements requires us to understand what we want and need and how to leverage the greatest benefit for our needs. It covers: Value Levers is a simple tool and approach to consider all the different actions or interventions we could use in order to realize benefit. Business Requirements are requirements stipulated by the business and clarified by the Category Management team. They form the backbone for the rest of our progression and are of core importance to determine and evaluate strategic sourcing options as well as for negotiation, RFP, supplier selection and contracting All courses are delivered using video, presentation slide shows and a knowledge check.\",\n                    \"author\": null,\n                    \"published_at\": \"3 years ago\",\n                    \"duration\": \"1h\",\n                    \"type\": \"Content\"\n                }\n            },\n            {\n                \"id\": 19481,\n                \"name\": \"Width testing\",\n                \"description\": null,\n                \"steps\": {\n                    \"id\": 8,\n                    \"order\": 17,\n                    \"item_type\": \"Course\",\n                    \"item_id\": 19481,\n                    \"name\": \"Width testing\",\n                    \"description\": \"\",\n                    \"author\": {\n                        \"id\": 59443,\n                        \"name\": \"sai-admin\",\n                        \"email\": \"user8@example.com\",\n                        \"role\": \"Admin\"\n                    },\n                    \"published_at\": \"over 2 years ago\",\n                    \"duration\": null,\n                    \"type\": \"Content\"\n                }\n            }\n        ]\n    }\n}\n"},{"id":"8a7170bd-9ff2-49ab-8fca-fbf424b0f3b8","name":"200 OK - SCORM Details","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/contents/course_3641/details"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 3641,\n        \"source\": \"course\",\n        \"hownow_id\": \"course_3641\",\n        \"content_type\": \"scorm\",\n        \"name\": \"GDPR\",\n        \"thumbnail\": \"https://ghn-file-store-experimental-il.s3.eu-west-1.amazonaws.com/assets/course-default.png\",\n        \"is_hownow_plus\": false,\n        \"is_pathway\": false,\n        \"duration\": null,\n        \"languages\": [\"en\"],\n        \"is_premium\": false,\n        \"is_scorm\": true,\n        \"visibility_level\": \"search_channels_library\",\n        \"published_date\": \"2020-03-02T09:36:48.000Z\",\n        \"last_published\": \"2020-03-02T09:36:48.000Z\",\n        \"created_at\": \"2019-11-12T14:18:19.000Z\",\n        \"url\": \"/courses/3641?preview=true\",\n        \"author\": {\n            \"id\": 22,\n            \"name\": \"alex Sivalingam\",\n            \"email\": \"user9@example.com\",\n            \"role\": \"Manager\"\n        },\n        \"metadata\": null,\n        \"is_mandatory\": false,\n        \"type\": \"scorm\",\n        \"sections\": [\n            {\n                \"id\": 6069,\n                \"name\": \"Section 1\",\n                \"order\": 1,\n                \"lessons\": [\n                    {\n                        \"id\": 6266,\n                        \"name\": \"Lesson 1\"\n                    }\n                ]\n            }\n        ]\n    }\n}\n"},{"id":"23e42959-3c85-4c47-8682-c7f6fa1aeb8d","name":"200 OK - Webinar Details","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/contents/course_181555/details"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 181555,\n        \"source\": \"course\",\n        \"hownow_id\": \"course_181555\",\n        \"content_type\": \"webinar\",\n        \"name\": \"Webinar For Unassigned Tag and Filter\",\n        \"thumbnail\": \"https://ghn-file-store-experimental-il.s3.eu-west-1.amazonaws.com/assets/course-default.png\",\n        \"is_hownow_plus\": false,\n        \"is_pathway\": false,\n        \"duration\": \"30m\",\n        \"languages\": [\"en\"],\n        \"is_premium\": false,\n        \"is_scorm\": false,\n        \"visibility_level\": \"everywhere\",\n        \"published_date\": \"2026-01-17T12:47:31.000Z\",\n        \"last_published\": \"2026-01-17T12:48:35.000Z\",\n        \"created_at\": \"2026-01-17T12:43:33.000Z\",\n        \"url\": \"/courses/181555?preview=true\",\n        \"author\": {\n            \"id\": 64078,\n            \"name\": \"Sourabh_Kankekar_Sourabh_Kankekar_Sourabh_Kankekar_Sourabh_Kankekar_Sour123\",\n            \"email\": \"user7@example.com\",\n            \"role\": \"Admin\"\n        },\n        \"metadata\": null,\n        \"is_mandatory\": false,\n        \"type\": \"webinar\",\n        \"sections\": [\n            {\n                \"id\": 177876,\n                \"name\": \"Section 1\",\n                \"order\": 1,\n                \"lessons\": [\n                    {\n                        \"id\": 184981,\n                        \"name\": \"Lesson 1\"\n                    }\n                ]\n            }\n        ],\n        \"schedules\": [\n            {\n                \"id\": 4412,\n                \"start_time\": \"2026-01-27T14:50:00.000Z\",\n                \"end_time\": \"2026-01-27T15:20:00.000Z\",\n                \"bookable\": true,\n                \"has_expired\": false,\n                \"reason\": null\n            }\n        ],\n        \"is_recurring\": false,\n        \"is_daily\": true\n    }\n}\n"},{"id":"ff2f2471-7f42-4d29-8958-7eb663898420","name":"200 OK - Nugget Details","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/contents/course_328/details"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 328,\n        \"source\": \"course\",\n        \"hownow_id\": \"course_328\",\n        \"content_type\": \"nugget\",\n        \"name\": \"Nugget 1\",\n        \"thumbnail\": \"https://images.unsplash.com/photo-1518534543674-5933a2307dca?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=600&h=600&fit=crop&ixid=eyJhcHBfaWQiOjI4MzMzfQ\",\n        \"is_hownow_plus\": false,\n        \"is_pathway\": false,\n        \"duration\": null,\n        \"languages\": [\"en\"],\n        \"is_premium\": false,\n        \"is_scorm\": false,\n        \"visibility_level\": \"search_channels_library\",\n        \"published_date\": \"2019-02-07T00:00:00.000Z\",\n        \"last_published\": \"2019-02-07T00:00:00.000Z\",\n        \"created_at\": \"2019-01-25T10:46:29.000Z\",\n        \"url\": \"/members/course_play/328/lessons/491?preview=true\",\n        \"author\": {\n            \"id\": 14,\n            \"name\": \"Nelson Sivalingam\",\n            \"email\": \"user6@example.com\",\n            \"role\": \"Admin\"\n        },\n        \"metadata\": null,\n        \"is_mandatory\": false,\n        \"type\": \"nugget\",\n        \"sections\": [\n            {\n                \"id\": 293,\n                \"name\": \"Section 1\",\n                \"order\": 1,\n                \"lessons\": [\n                    {\n                        \"id\": 491,\n                        \"name\": \"Nugget 1\"\n                    }\n                ]\n            }\n        ]\n    }\n}\n"},{"id":"80ca6f44-e85a-471e-b665-3fa795ccc797","name":"200 OK - Third Party Details","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/contents/udemy_course_140136/details"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 140136,\n        \"source\": \"udemy_course\",\n        \"hownow_id\": \"udemy_course_140136\",\n        \"content_type\": \"course\",\n        \"name\": \"AWS - Les 12 services fondamentaux du cloud N°1 test\",\n        \"is_hownow_plus\": false,\n        \"is_pathway\": false,\n        \"is_scorm\": false,\n        \"is_premium\": false,\n        \"visibility_level\": false,\n        \"language_code\": \"fr-FR\",\n        \"duration\": \"13m 36s\",\n        \"published_at\": \"2025-05-27T13:59:36.000Z\",\n        \"created_at\": \"2025-05-27T13:59:36.000Z\",\n        \"last_published\": \"2025-06-04T10:01:49.000Z\",\n        \"thumbnail\": \"https://img-b.udemycdn.com/course/750x422/2434206_6b96_10.jpg\",\n        \"url\": \"https://hownowdemo.udemy.com/course/les-12-services-fondamentaux-du-cloud-aws-version-longue/\",\n        \"author\": {\n            \"name\": \"Udemy for Business\",\n            \"image_details\": {\n                \"url\": \"https://ghn-file-store-experimental-il.s3.eu-west-1.amazonaws.com/assets/publisher_logos/udemy.png\",\n                \"uploaded\": false,\n                \"backdrop_color_code\": null\n            }\n        },\n        \"metadata\": {\n            \"provider_name\": \"Udemy for Business\"\n        }\n    }\n}\n"},{"id":"3d85e407-aa62-433d-bb43-9d1f0dca30f9","name":"200 OK - Feed Article Details","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/contents/feed_articles_63267/details"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 63267,\n        \"source\": \"feed_articles\",\n        \"hownow_id\": \"feed_articles_63267\",\n        \"content_type\": \"feed_article\",\n        \"name\": \"The Power of a Business Language Course\",\n        \"subtitle\": \"Clear communication isn’t just a nice-to-have in today’s workplace, it’s a must.  For global organizations, where employees work across languages, time zones, and cultures, even minor miscommunicat...\",\n        \"description\": \"Clear communication isn’t just a nice-to-have in today’s workplace, it’s a must.  For global organizations, where employees work across languages, time zones, and cultures, even minor miscommunications can snowball into delays, friction, or lost opportunities. While many professionals speak English proficiently, the demands of high-stakes business communication require more than conversational fluency.That’s where a business language course comes in. Designed to support cross-functional collabor\",\n        \"language_code\": \"en\",\n        \"visibility_level\": null,\n        \"is_premium\": false,\n        \"is_scorm\": false,\n        \"is_hownow_plus\": false,\n        \"is_pathway\": false,\n        \"duration\": null,\n        \"published_date\": \"2025-08-29T00:10:06.000Z\",\n        \"last_published\": \"2025-08-29T00:10:06.000Z\",\n        \"created_at\": \"2025-10-16T13:10:21.000Z\",\n        \"thumbnail\": \"https://static.wixstatic.com/media/5f9693_73489b74550e473f9ed0fe6148abbcab~mv2.jpg/v1/fill/w_1000,h_665,al_c,q_85/5f9693_73489b74550e473f9ed0fe6148abbcab~mv2.jpg\",\n        \"url\": \"https://team.hownowindia.com/open-link?token=4349F09B2D8166C8EA3FADD326756A6780C6E2E077D6E504ADE5FB53E0B32F484C1269C4F561497550E30BB6832DD1051B30E07BB27FB44283AE32D393DCF6B015091AFCBE215CEA511BC963C66339F5297DF2BDF849F8F57F387EB956B304E7B3EEF8C17AFF120E58303AF2AE89A34031DFE930E7360E51B3AF494DCCA79107FD5CE4A10C4C4A820E64D6010E075841604B8A7B05FEE457C2121EEF3E4C67E89D6B2E668BDA53E71A03DE0BE7B5BC54D4F5075D39788D8B0BCC29E888BD595C52819B382B77D7C1\",\n        \"author\": {\n            \"name\": \"Talaera\",\n            \"image_details\": {\n                \"url\": \"https://hownowindia.com/assets/publisher_logos/talaera.png\",\n                \"uploaded\": false,\n                \"backdrop_color_code\": null\n            }\n        },\n        \"metadata\": {\n            \"publisher\": \"Talaera\"\n        }\n    }\n}\n"},{"id":"913fa969-5b0f-4767-b5f3-b035edb99149","name":"200 OK - HowNow Plus Details","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/contents/hownow_plus_181768/details"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 181768,\n        \"source\": \"hownow_plus\",\n        \"hownow_id\": \"hownow_plus_181768\",\n        \"content_type\": \"scorm\",\n        \"name\": \"Mastering Word 365 - Basics (2025)\",\n        \"thumbnail\": \"https://s3.eu-west-1.amazonaws.com/ghn-file-store-experimental-il/courses/thumbnails/000/181/768/thumbnail/818293edaae3535ae84f346367f32360891a576b?1769508990\",\n        \"is_hownow_plus\": true,\n        \"is_pathway\": false,\n        \"duration\": \"1h 20m\",\n        \"languages\": [\"en\"],\n        \"is_premium\": false,\n        \"is_scorm\": true,\n        \"visibility_level\": \"everywhere\",\n        \"published_date\": \"2026-01-27T10:16:54.000Z\",\n        \"last_published\": \"2026-01-27T10:16:54.000Z\",\n        \"created_at\": \"2026-01-27T10:16:32.000Z\",\n        \"url\": \"/courses/181768?preview=true\",\n        \"author\": {\n            \"id\": 303335,\n            \"name\": \"Zeel x\",\n            \"email\": \"user10@example.com\",\n            \"role\": \"Admin\"\n        },\n        \"metadata\": null,\n        \"is_mandatory\": false\n        \"type\": \"scorm\",\n        \"sections\": [\n            {\n                \"id\": 178044,\n                \"name\": \"Mastering Word 365 - Basics (2025)\",\n                \"order\": 1,\n                \"lessons\": [\n                    {\n                        \"id\": 185163,\n                        \"name\": \"Mastering Word 365 - Basics (2025)\"\n                    }\n                ]\n            }\n        ]\n    }\n}\n"},{"id":"1cd96ccb-6696-48a7-9f13-a6a8e42d1574","name":"404 Not Found","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/contents/course_99999/details"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not Found\"\n}"},{"id":"98f7f886-c7c0-41c6-b283-d9ce6f291127","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/contents/course_123/details"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Unauthorized\"\n}"}],"_postman_id":"893780b4-4806-47cf-bb33-ebbc7a320076"},{"name":"Get Lesson Details","id":"b8e31aa2-59b7-4ec7-ae29-7a24907c87e0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Content type</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"url":"<Base URL>/external/v1/lesson/:lesson_id/details","description":"<p>Retrieve detailed metadata for a specific lesson within a course, including all of its content items (videos, text blocks, assessments, files, links, embeds, etc.).</p>\n<p>While the Content Details endpoint (<code>GET /contents/:hownow_id/details</code>) returns the high-level course structure (sections and lesson names), this endpoint drills into a <strong>single lesson</strong> and returns the full breakdown of every content block inside it.</p>\n<h2 id=\"path-parameters\">Path Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>lesson_id</code></td>\n<td>Yes</td>\n<td>integer</td>\n<td>Must be a valid numeric <code>CourseLesson</code> ID</td>\n<td>The lesson's unique database ID</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>No query or body parameters.</strong></p>\n<h2 id=\"response-fields\">Response Fields</h2>\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>integer</td>\n<td>Lesson ID</td>\n</tr>\n<tr>\n<td><code>source</code></td>\n<td>string</td>\n<td>Always <code>\"lesson\"</code></td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Lesson name</td>\n</tr>\n<tr>\n<td><code>lesson_type</code></td>\n<td>string</td>\n<td>Type of lesson</td>\n</tr>\n<tr>\n<td><code>contents</code></td>\n<td>array</td>\n<td>Ordered list of content items within the lesson</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"content-items-contents-array\">Content Items (<code>contents</code> array)</h2>\n<p>Each item in the <code>contents</code> array has a base structure plus type-specific fields:</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>integer</td>\n<td>Content item ID</td>\n</tr>\n<tr>\n<td><code>type</code></td>\n<td>string</td>\n<td>Content block type (see table below)</td>\n</tr>\n<tr>\n<td><code>order</code></td>\n<td>integer</td>\n<td>Display order within the lesson</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"type-specific-fields\">Type-Specific Fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Content Type</th>\n<th>Extra Fields</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>assessment</code></td>\n<td><code>assessment_questions</code>, <code>assessment_settings</code></td>\n<td>Full assessment with questions, choices, pass marks, timer settings, retake rules</td>\n</tr>\n<tr>\n<td><code>video</code> / <code>upload_video</code></td>\n<td><code>preview_url</code></td>\n<td>Pre-signed S3 URL to the video (expires after <strong>90 seconds</strong>)</td>\n</tr>\n<tr>\n<td><code>upload_audio</code></td>\n<td><code>name</code>, <code>duration</code>, <code>preview_url</code>, <code>thumbnail</code></td>\n<td>Audio file details with pre-signed URL</td>\n</tr>\n<tr>\n<td><code>scorm</code></td>\n<td><code>preview_url</code></td>\n<td>SCORM package preview URL</td>\n</tr>\n<tr>\n<td><code>scorm</code></td>\n<td><code>transcript_url</code></td>\n<td>Link to transscript file of SCORM.</td>\n</tr>\n<tr>\n<td><code>link</code></td>\n<td><code>preview_url</code>, <code>title</code>, <code>thumbnail</code></td>\n<td>External link with metadata</td>\n</tr>\n<tr>\n<td><code>embed</code></td>\n<td><code>preview_url</code>, <code>height</code></td>\n<td>Embedded content (iframe HTML or URL) with height</td>\n</tr>\n<tr>\n<td><code>text</code></td>\n<td><code>preview_url</code> (HTML content)</td>\n<td>Rich text / HTML block</td>\n</tr>\n<tr>\n<td><code>file</code></td>\n<td><code>file_name</code>, <code>preview_url</code>, <code>file_url</code></td>\n<td>Uploaded file (PDF, document, image, etc.)</td>\n</tr>\n<tr>\n<td><code>live_class</code> / <code>broadcast</code> / <code>offline</code></td>\n<td><code>schedules</code></td>\n<td>Bookable time slots for live sessions</td>\n</tr>\n<tr>\n<td><code>internal_link</code></td>\n<td><code>resource_type</code>, <code>hownow_id</code></td>\n<td>Link to another HowNow content item</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"assessment-settings-fields\">Assessment Settings Fields</h3>\n<p>When <code>type</code> is <code>assessment</code>, the <code>assessment_settings</code> object includes:</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>retake_assessment</code></td>\n<td>boolean</td>\n<td>Whether retakes are allowed</td>\n</tr>\n<tr>\n<td><code>limit_retake_assessment</code></td>\n<td>integer/null</td>\n<td>Max retake attempts (null = unlimited)</td>\n</tr>\n<tr>\n<td><code>deadline_date</code></td>\n<td>string/null</td>\n<td>Assessment deadline (ISO 8601)</td>\n</tr>\n<tr>\n<td><code>passing_grade</code></td>\n<td>integer</td>\n<td>Required passing score (0-100)</td>\n</tr>\n<tr>\n<td><code>is_passmark_set</code></td>\n<td>boolean</td>\n<td>Whether a pass mark is configured</td>\n</tr>\n<tr>\n<td><code>pass_to_complete_enabled</code></td>\n<td>boolean</td>\n<td>Must pass to mark lesson complete</td>\n</tr>\n<tr>\n<td><code>is_timer_set</code></td>\n<td>boolean</td>\n<td>Whether a time limit is set</td>\n</tr>\n<tr>\n<td><code>timer_in_minutes</code></td>\n<td>integer/null</td>\n<td>Time limit in minutes</td>\n</tr>\n<tr>\n<td><code>is_markers_enabled</code></td>\n<td>boolean</td>\n<td>Whether preferred markers enabled</td>\n</tr>\n<tr>\n<td><code>is_preferred_marker</code></td>\n<td>boolean</td>\n<td>Whether assessment have preferred marker</td>\n</tr>\n<tr>\n<td><code>is_mcq_auto_marked</code></td>\n<td>boolean</td>\n<td>Whether mcq assessment auto marked</td>\n</tr>\n<tr>\n<td><code>success_message</code></td>\n<td>string</td>\n<td>Success message when user completes the assessmnet</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"important-video-url-expiry\">Important: Video URL Expiry</h2>\n<p>Video URLs returned by this API are <strong>pre-signed S3 URLs</strong> that expire after <strong>90 seconds</strong>. If a URL shows as expired, make a fresh request to generate a new valid URL.</p>\n<h2 id=\"validation--access-control\">Validation &amp; Access Control</h2>\n<ul>\n<li><p>Lesson must exist in the database</p>\n</li>\n<li><p>Lesson's parent course must belong to the authenticated school</p>\n</li>\n<li><p>User must have access to the parent course (assigned, authored, collaborated, or admin)</p>\n</li>\n</ul>\n<h2 id=\"error-responses\">Error Responses</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Condition</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>User does not have access to this content</td>\n</tr>\n<tr>\n<td><code>404 Not Found</code></td>\n<td>Lesson not found or does not belong to this school</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["external","v1","lesson",":lesson_id","details"],"host":["<Base URL>"],"query":[],"variable":[{"description":{"content":"<p>[MANDATORY] [integer] The numeric CourseLesson ID. Must be a valid integer.</p>\n","type":"text/plain"},"type":"any","value":"","key":"lesson_id"}]}},"response":[{"id":"240a6971-9015-4dfb-a01c-6e057191e515","name":"200 OK - Assessment Lesson Details","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/lesson/10494/details"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 10494,\n        \"source\": \"lesson\",\n        \"name\": \"Multimedia Assessment - Satellite image [5MB]\",\n        \"lesson_type\": \"Assessment\",\n        \"contents\": [\n            {\n                \"id\": 11411,\n                \"type\": \"assessment\",\n                \"order\": 1,\n                \"assessment_questions\": [\n                    {\n                        \"id\": 471,\n                        \"question\": \" \\r\\n \\r\\n \\r\\n \\r\\n \\r\\nCan you please Upload an image better than this. \",\n                        \"question_type\": \"Multimedia Question\",\n                        \"is_multiple_answer\": false,\n                        \"description\": \"<div style=\\\"display: none;\\\"> </div>\\r\\n<div style=\\\"display: none;\\\"> </div>\\r\\n<div style=\\\"display: none;\\\"> </div>\\r\\n<div style=\\\"display: none;\\\"> </div>\\r\\n<div style=\\\"display: none;\\\"> </div>\\r\\n<div style=\\\"display: none;\\\"> </div>\\r\\n<p>Please upload an image that can better than the above image.<br><br><br></p>\",\n                        \"order\": 1,\n                        \"max_marks\": 1,\n                        \"character_limit\": null,\n                        \"choice_options\": [],\n                        \"type_of_file\": \"Image\"\n                    }\n                ],\n                \"assessment_settings\": {\n                    \"retake_assessment\": false,\n                    \"limit_retake_assessment\": null,\n                    \"deadline_date\": null,\n                    \"passing_grade\": 0,\n                    \"is_passmark_set\": false,\n                    \"pass_to_complete_enabled\": false,\n                    \"is_timer_set\": false,\n                    \"timer_in_minutes\": null,\n                    \"is_markers_enabled\": false,\n                    \"is_preferred_marker\": false,\n                    \"is_mcq_auto_marked\": true,\n                    \"success_message\": null\n                }\n            }\n        ]\n    }\n}"},{"id":"de8f3d65-867b-4cae-bc98-7292246611c7","name":"200 OK - SCORM Lesson Details","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/lesson/185163/details"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 185163,\n        \"source\": \"lesson\",\n        \"name\": \"Mastering Word 365 - Basics (2025)\",\n        \"lesson_type\": \"Lesson\",\n        \"duration\": 4800,\n        \"contents\": [\n            {\n                \"id\": 177800,\n                \"type\": \"scorm\",\n                \"order\": 2,\n                \"preview_url\": \"https://cloud.scorm.com/api/cloud/course/preview/1dd1c155-1433-4321-80f9-365cab9bd0d4\"\n                \"transcript_url\": \"https://s3.eu-west-1.amazonaws.com/ghn-file-store-experimental-il/hnp_courses/transcript_f[%E2%80%A6]3/317/original/a3bd8f1fd2f579b316f6b700a145ff48057a557d\"\n            }\n        ]\n    }\n}\n"},{"id":"8778edd6-6467-46b9-af82-1a61f4d4a4eb","name":"200 OK - Live Class Details","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/lesson/185036/details"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 185036,\n        \"source\": \"lesson\",\n        \"name\": \"Lesson 1\",\n        \"lesson_type\": \"Lesson\",\n        \"duration\": 1800,\n        \"contents\": [\n            {\n                \"id\": 177643,\n                \"type\": \"live_class\",\n                \"order\": null,\n                \"schedules\": [\n                    {\n                        \"id\": 5341,\n                        \"start_time\": \"2026-01-30T13:20:00.000Z\",\n                        \"end_time\": \"2026-01-30T13:50:00.000Z\",\n                        \"time_zone\": \"Asia/Kolkata\",\n                        \"bookable\": true,\n                        \"has_expired\": false,\n                        \"booking_left\": 10\n                    }\n                ],\n                \"recurring\": \"week\",\n                \"is_daily\": true\n            }\n        ]\n    }\n}\n"},{"id":"6a562360-c0c9-4636-b21f-512e070efaed","name":"200 OK - Video Lesson Details","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/lesson/184759/details"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 184759,\n        \"source\": \"lesson\",\n        \"name\": \"Nugget Name\",\n        \"lesson_type\": \"Lesson\",\n        \"duration\": 0,\n        \"contents\": [\n            {\n                \"id\": 177318,\n                \"type\": \"video\",\n                \"order\": 1,\n                \"preview_url\": \"https://www.youtube.com/watch?v=EzTxYQmU8OE\"\n            }\n        ]\n    }\n}\n"},{"id":"a11dcb34-ae76-491f-a059-5da0208b4345","name":"200 OK - Uploaded Video Lesson Details","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/lesson/185031/details"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 185031,\n        \"source\": \"lesson\",\n        \"name\": \"Nugget Name\",\n        \"lesson_type\": \"Lesson\",\n        \"duration\": 0,\n        \"contents\": [\n            {\n                \"id\": 177636,\n                \"type\": \"file\",\n                \"order\": 1,\n                \"preview_url\": \"/file_urls/original/missing.png\",\n                \"file_url\": \"https://ghn-file-store-experimental-il.s3.eu-west-1.amazonaws.com/course_lesson_content_images/images/000/001/901/original/Example_20_MB_File.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAVBQEGT5BVORNZS7K%2F20260127%2Feu-west-1%2Fs3%2Faws4_request&X-Amz-Date=20260127T195407Z&X-Amz-Expires=90&X-Amz-SignedHeaders=host&X-Amz-Signature=4e8769348b46e217ea1d461ab07308297384fd3547a0c41a28985aadd052abbe\"\n            },\n            {\n                \"id\": 177637,\n                \"type\": \"file\",\n                \"order\": 2,\n                \"preview_url\": \"/file_urls/original/missing.png\",\n                \"file_url\": \"https://ghn-file-store-experimental-il.s3.eu-west-1.amazonaws.com/course_lesson_content_images/images/000/001/902/original/125_MB_Sample_PDF.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAVBQEGT5BVORNZS7K%2F20260127%2Feu-west-1%2Fs3%2Faws4_request&X-Amz-Date=20260127T195407Z&X-Amz-Expires=90&X-Amz-SignedHeaders=host&X-Amz-Signature=22941753cfb28ffaa44c71397c2657942a9cbcecef255ba03b4ed2a517e48db6\"\n            },\n            {\n                \"id\": 177638,\n                \"type\": \"upload_video\",\n                \"order\": 3,\n                \"preview_url\": \"https://embed-ssl.wistia.com/deliveries/5eb2a6111f96ef394ba62a1058525681.bin\"\n            }\n        ]\n    }\n}\n"},{"id":"4d0ff709-4cca-46e9-922b-57724801b858","name":"200 OK - File Lesson Details","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/lesson/185115/details"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 185115,\n        \"source\": \"lesson\",\n        \"name\": \"Nugget Name\",\n        \"lesson_type\": \"Lesson\",\n        \"duration\": 0,\n        \"contents\": [\n            {\n                \"id\": 177750,\n                \"type\": \"file\",\n                \"order\": 1,\n                \"preview_url\": \"/file_urls/original/missing.png\",\n                \"file_url\": \"https://ghn-file-store-experimental-il.s3.eu-west-1.amazonaws.com/course_lesson_content_images/images/000/001/947/original/Example_100_MB_File.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAVBQEGT5BVORNZS7K%2F20260127%2Feu-west-1%2Fs3%2Faws4_request&X-Amz-Date=20260127T194445Z&X-Amz-Expires=90&X-Amz-SignedHeaders=host&X-Amz-Signature=aa3a4b9127244d7473e97f4bd9c900c11f7d0297f3f700bee6a7d56106aa3c21\"\n            }\n        ]\n    }\n}\n"},{"id":"2a9b29c8-da50-492c-9df1-c90b034751b4","name":"200 OK - Lesson Details","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/lesson/185181/details"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 185181,\n        \"source\": \"lesson\",\n        \"name\": \"Nugget Name\",\n        \"lesson_type\": \"Lesson\",\n        \"duration\": 0,\n        \"contents\": [\n            {\n                \"id\": 177820,\n                \"type\": \"text\",\n                \"order\": 2\n            },\n            {\n                \"id\": 177821,\n                \"type\": \"text\",\n                \"order\": 3\n            },\n            {\n                \"id\": 177822,\n                \"type\": \"text\",\n                \"order\": 4\n            },\n            {\n                \"id\": 177823,\n                \"type\": \"text\",\n                \"order\": 5\n            }\n        ]\n    }\n}\n"},{"id":"1a6efb72-fb2e-4bce-860f-ebd18b57721d","name":"404 Not Found","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/lesson/99999/details"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not Found\"\n}"},{"id":"0a96a115-f511-48ab-890b-2853cca186b0","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/lesson/101/details"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Unauthorized\"\n}"}],"_postman_id":"b8e31aa2-59b7-4ec7-ae29-7a24907c87e0"}],"id":"0f1d8c2a-5f7a-4b08-80be-5cb218b6dfc2","description":"<p>The core discovery and retrieval engine for the platform's learning materials. These endpoints allow developers to build custom learning portals or sync catalogs by querying the entire HowNow library. It includes a robust search endpoint with filtering (by language, type, or premium status), as well as endpoints to fetch high-level metadata or deep-dive structural details (like sections and lessons) for specific content items.</p>\n","_postman_id":"0f1d8c2a-5f7a-4b08-80be-5cb218b6dfc2"},{"name":"Metadata","item":[{"name":"Get Languages","id":"6abe5bb1-af15-4143-8e96-a38f1cc58c96","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Content type</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"url":"<Base URL>/external/v1/languages","description":"<p>Retrieve the list of all available languages.</p>\n<p><strong>No query or body parameters.</strong> Only authentication headers required.</p>\n<h2 id=\"headers\">Headers</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Header</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Authorization</code></td>\n<td>Yes</td>\n<td>string</td>\n<td><code>Bearer {token}</code></td>\n</tr>\n<tr>\n<td><code>Content-Type</code></td>\n<td>Yes</td>\n<td>string</td>\n<td><code>application/json</code></td>\n</tr>\n<tr>\n<td><code>X-User-Id</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>HowNow user identifier</td>\n</tr>\n</tbody>\n</table>\n</div><p>Returns language codes and names, ordered alphabetically by name.</p>\n<p>Can be used as the <code>language</code> query parameter in the Search Content endpoint.</p>\n<p>Response format: <code>{ data: [{ id: string (language code), label: string (language name) }] }</code></p>\n","urlObject":{"path":["external","v1","languages"],"host":["<Base URL>"],"query":[],"variable":[]}},"response":[{"id":"09ab5626-9056-4fc7-a4f1-de4063c763b4","name":"200 OK - Languages List","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/languages"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"id\": \"en\",\n      \"label\": \"English\"\n    },\n    {\n      \"id\": \"fr\",\n      \"label\": \"French\"\n    },\n    {\n      \"id\": \"de\",\n      \"label\": \"German\"\n    },\n    {\n      \"id\": \"es\",\n      \"label\": \"Spanish\"\n    },\n    {\n      \"id\": \"pt\",\n      \"label\": \"Portuguese\"\n    }\n  ]\n}"},{"id":"f19fea19-0ebe-4209-a7bd-e79c278b7820","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/languages"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Unauthorized\"\n}"}],"_postman_id":"6abe5bb1-af15-4143-8e96-a38f1cc58c96"}],"id":"1f850b38-f890-45a3-a3ce-28ec6871ec16","description":"<p>Endpoints for retrieving available content sources, types, and languages. These are lookup endpoints with no query/body parameters - only authentication headers are required.</p>\n","_postman_id":"1f850b38-f890-45a3-a3ce-28ec6871ec16"},{"name":"Job Roles","item":[{"name":"List/Search Job Roles","id":"8fdce906-adc2-4533-b752-ae4d684ec9f2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Must be application/json</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"url":"<Base URL>/external/v1/job_roles?page=1&per_page=20","description":"<p>Retrieve a paginated list of job roles with user counts, skill counts, and group counts.</p>\n<h2 id=\"query-parameters\">Query Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</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>No</td>\n<td>integer</td>\n<td>1</td>\n<td>Page number</td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>No</td>\n<td>integer</td>\n<td>20</td>\n<td>Items per page (max: 100)</td>\n</tr>\n<tr>\n<td><code>q</code></td>\n<td>No</td>\n<td>string</td>\n<td>-</td>\n<td>Search job roles by name (case-insensitive partial match)</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["external","v1","job_roles"],"host":["<Base URL>"],"query":[{"description":{"content":"<p>[OPTIONAL] Page number (default: 1)</p>\n","type":"text/plain"},"key":"page","value":"1"},{"description":{"content":"<p>[OPTIONAL] Items per page (default: 20, max: 100)</p>\n","type":"text/plain"},"key":"per_page","value":"20"},{"disabled":true,"description":{"content":"<p>[OPTIONAL] Search job roles by name (case-insensitive partial match)</p>\n","type":"text/plain"},"key":"q","value":""}],"variable":[]}},"response":[{"id":"f5f156ed-414a-47c3-b723-1e9def0b8eb5","name":"200 OK - Job Roles List","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":{"raw":"<Base URL>/external/v1/job_roles?page=1&per_page=3","host":["<Base URL>"],"path":["external","v1","job_roles"],"query":[{"key":"page","value":"1"},{"key":"per_page","value":"3"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"id\": 9243,\n            \"external_id\": \"JR-001\",\n            \"name\": \"A - Test Job Role\",\n            \"description\": null,\n            \"users_count\": 2,\n            \"skills_count\": 12,\n            \"groups_count\": 10,\n            \"created_at\": \"2023-04-11T09:29:41Z\",\n            \"updated_at\": \"2026-02-05T08:08:26Z\"\n        },\n        {\n            \"id\": 10665,\n            \"external_id\": null,\n            \"name\": \"aaa\",\n            \"description\": null,\n            \"users_count\": 0,\n            \"skills_count\": 0,\n            \"groups_count\": 0,\n            \"created_at\": \"2024-03-19T14:39:47Z\",\n            \"updated_at\": \"2024-03-19T14:39:47Z\"\n        },\n        {\n            \"id\": 360,\n            \"external_id\": null,\n            \"name\": \"Abstractor\",\n            \"description\": null,\n            \"users_count\": 3,\n            \"skills_count\": 0,\n            \"groups_count\": 7,\n            \"created_at\": \"2019-09-20T07:08:19Z\",\n            \"updated_at\": \"2019-09-20T07:08:19Z\"\n        }\n    ],\n    \"meta\": {\n        \"page\": 1,\n        \"per_page\": 3,\n        \"total_pages\": 1323,\n        \"total_count\": 3969,\n        \"filters\": {}\n    }\n}"},{"id":"ee38ad5a-4620-422b-93c3-cf304eea9bde","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/job_roles"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not authorized\"\n}"}],"_postman_id":"8fdce906-adc2-4533-b752-ae4d684ec9f2"},{"name":"Get Job Role Details","id":"380c392e-b651-45e6-a564-1239da17bf9b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Must be application/json</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"url":"<Base URL>/external/v1/job_roles/:id","description":"<p>Retrieve detailed information about a specific job role, including mapped skills with target proficiency levels.</p>\n<h2 id=\"path-parameters\">Path Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</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>Yes</td>\n<td>string</td>\n<td>Job role identifier. Format: <code>ID-{id}</code> or <code>EXT-{external_id}</code></td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["external","v1","job_roles",":id"],"host":["<Base URL>"],"query":[],"variable":[{"id":"f2da173f-f090-49de-b2eb-bb6a285a2d74","description":{"content":"<p>[MANDATORY] [string] Job role identifier. Format: ID-{hownow_id} or EXT-{external_id}</p>\n","type":"text/plain"},"type":"any","value":"","key":"id"}]}},"response":[{"id":"c56aa536-0472-4312-a56f-0c2509d48eb8","name":"200 OK - Job Role Details","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/job_roles/ID-9243"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 9243,\n        \"external_id\": \"JR-001\",\n        \"name\": \"A - Test Job Role\",\n        \"description\": null,\n        \"users_count\": 2,\n        \"skills_count\": 12,\n        \"groups_count\": 10,\n        \"created_at\": \"2023-04-11T09:29:41Z\",\n        \"updated_at\": \"2026-02-05T08:08:26Z\",\n        \"skills\": [\n            {\n                \"id\": 5548,\n                \"external_id\": null,\n                \"name\": \".NET CLR\",\n                \"target_rating\": 4,\n                \"ai_generated\": false,\n                \"assigned_at\": \"2024-05-20T06:38:38Z\"\n            },\n            {\n                \"id\": 15069,\n                \"external_id\": null,\n                \"name\": \"20/20 Design\",\n                \"target_rating\": 3,\n                \"ai_generated\": false,\n                \"assigned_at\": \"2024-05-30T04:58:19Z\"\n            },\n            {\n                \"id\": 42,\n                \"external_id\": null,\n                \"name\": \"Communication\",\n                \"target_rating\": 1,\n                \"ai_generated\": false,\n                \"assigned_at\": \"2024-10-15T12:52:01Z\"\n            }\n        ]\n    }\n}"},{"id":"7be13f3d-b302-4dad-8a3a-d77103c48ea8","name":"404 Not Found","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/job_roles/ID-99999"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Job role not found\"\n}"},{"id":"d6f7854a-05e4-4c28-b46e-54eab8a4e034","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/job_roles/ID-9243"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not authorized\"\n}"}],"_postman_id":"380c392e-b651-45e6-a564-1239da17bf9b"},{"name":"Create Job Role","id":"5b783c0a-c058-4244-9276-2327083c795f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Must be application/json</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Senior Developer\",\n  \"description\": \"Senior software development role\",\n  \"external_id\": \"ext_sr_dev_001\",\n  \"skills\": [\n    {\n      \"skill_id\": \"ID-5549\",\n      \"target_rating\": 5\n    },\n    {\n      \"skill_id\": \"EXT-skill-001\",\n      \"target_rating\": 3\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"<Base URL>/external/v1/job_roles","description":"<p>Create a new job role with optional skills and target proficiency ratings.</p>\n<h2 id=\"body-parameters\">Body Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>name</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>Max 100 characters, unique within school</td>\n<td>Job role name</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td>No</td>\n<td>string</td>\n<td>Max 250 characters</td>\n<td>Job role description</td>\n</tr>\n<tr>\n<td><code>external_id</code></td>\n<td>No</td>\n<td>string</td>\n<td>Must be unique</td>\n<td>External identifier</td>\n</tr>\n<tr>\n<td><code>skills</code></td>\n<td>No</td>\n<td>array</td>\n<td>Max 30 skills</td>\n<td>Skills to map to this job role</td>\n</tr>\n<tr>\n<td><code>skills[].skill_id</code></td>\n<td>Yes*</td>\n<td>string</td>\n<td>Format: <code>ID-{id}</code> or <code>EXT-{external_id}</code></td>\n<td>Skill identifier</td>\n</tr>\n<tr>\n<td><code>skills[].target_rating</code></td>\n<td>Yes*</td>\n<td>integer</td>\n<td>1-5</td>\n<td>Target proficiency level</td>\n</tr>\n</tbody>\n</table>\n</div><p>*Required if skills array is provided</p>\n<p><strong>Authorization:</strong> Only School Admin can create job roles.</p>\n","urlObject":{"path":["external","v1","job_roles"],"host":["<Base URL>"],"query":[],"variable":[]}},"response":[{"id":"592f6f40-d08d-4f47-bed1-15ab4a311505","name":"201 Created - Job Role Created","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Senior Developer\",\n  \"description\": \"Senior software development role\",\n  \"external_id\": \"ext_sr_dev_001\",\n  \"skills\": [\n    {\"skill_id\": \"ID-5549\", \"target_rating\": 5}\n  ]\n}"},"url":"<Base URL>/external/v1/job_roles"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 10826,\n        \"external_id\": \"ext_sr_dev_001\",\n        \"name\": \"Senior Developer\",\n        \"description\": \"Senior software development role\",\n        \"users_count\": 0,\n        \"skills_count\": 2,\n        \"groups_count\": 0,\n        \"created_at\": \"2026-02-15T14:25:06Z\",\n        \"updated_at\": \"2026-02-15T14:25:06Z\",\n        \"skills\": [\n            {\n                \"id\": 5549,\n                \"external_id\": null,\n                \"name\": \".COM\",\n                \"target_rating\": 5,\n                \"ai_generated\": false,\n                \"assigned_at\": \"2026-02-15T14:25:06Z\"\n            },\n            {\n                \"id\": 15882,\n                \"external_id\": \"skill-001\",\n                \"name\": \"User Experience\",\n                \"target_rating\": 3,\n                \"ai_generated\": false,\n                \"assigned_at\": \"2026-02-15T14:25:06Z\"\n            }\n        ]\n    }\n}"},{"id":"e77ab3d5-82d3-4711-a260-fa7350eaafd5","name":"400 Bad Request - Missing Name","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{}"},"url":"<Base URL>/external/v1/job_roles"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Name is required\"\n}"},{"id":"a0467213-80c3-4f9a-a496-9af04374cea6","name":"403 Forbidden - Not Admin","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Test Role\"\n}"},"url":"<Base URL>/external/v1/job_roles"},"status":"Forbidden","code":403,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"You are not authorized to perform this action\"\n}"},{"id":"7b35d9b8-a489-4ab8-976c-14e319ed21d5","name":"401 Unauthorized","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/job_roles"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not authorized\"\n}"}],"_postman_id":"5b783c0a-c058-4244-9276-2327083c795f"},{"name":"Update Job Role","id":"ba8cd1af-66d7-4e5f-99db-1c3e384c5c3c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Must be application/json</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"description\": \"Updated description\",\n  \"add_skills\": [\n    {\n      \"skill_id\": \"ID-5556\",\n      \"target_rating\": 4\n    }\n  ],\n  \"remove_skills\": [\n    \"ID-4862\",\n    \"ID-15416\"\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"<Base URL>/external/v1/job_roles/:id","description":"<p>Update an existing job role's details and/or skill mappings.</p>\n<h2 id=\"path-parameters\">Path Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</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>Yes</td>\n<td>string</td>\n<td>Job role identifier. Format: <code>ID-{id}</code> or <code>EXT-{external_id}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"body-parameters\">Body Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>description</code></td>\n<td>No</td>\n<td>string</td>\n<td>Max 250 characters</td>\n<td>Updated description</td>\n</tr>\n<tr>\n<td><code>add_skills</code></td>\n<td>No</td>\n<td>array</td>\n<td>Max 30 skills total</td>\n<td>Skills to add to this job role</td>\n</tr>\n<tr>\n<td><code>add_skills[].skill_id</code></td>\n<td>Yes*</td>\n<td>string</td>\n<td>Format: <code>ID-{id}</code> or <code>EXT-{id}</code></td>\n<td>Skill identifier</td>\n</tr>\n<tr>\n<td><code>add_skills[].target_rating</code></td>\n<td>Yes*</td>\n<td>integer</td>\n<td>1-5</td>\n<td>Target proficiency level</td>\n</tr>\n<tr>\n<td><code>remove_skills</code></td>\n<td>No</td>\n<td>array</td>\n<td>Comma-separated IDs</td>\n<td>Skills to remove (Format: <code>ID-{id}</code> or <code>EXT-{id}</code>)</td>\n</tr>\n</tbody>\n</table>\n</div><p>*Required if add_skills array is provided</p>\n<p><strong>Authorization:</strong> Only School Admin can update job roles.</p>\n","urlObject":{"path":["external","v1","job_roles",":id"],"host":["<Base URL>"],"query":[],"variable":[{"id":"bd774462-6a2c-4565-896f-7ddf67ddd6e2","description":{"content":"<p>[MANDATORY] [string] Job role identifier. Format: ID-{hownow_id} or EXT-{external_id}</p>\n","type":"text/plain"},"type":"any","value":"","key":"id"}]}},"response":[{"id":"231d51e9-eda5-468c-a39b-c907b4d72567","name":"200 OK - Job Role Updated","originalRequest":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"description\": \"Updated description\",\n  \"add_skills\": [{\"skill_id\": \"ID-5556\", \"target_rating\": 4}]\n}"},"url":"<Base URL>/external/v1/job_roles/ID-3991"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 3991,\n        \"external_id\": null,\n        \"name\": \"Test Engineer\",\n        \"description\": \"Updated description\",\n        \"users_count\": 0,\n        \"skills_count\": 19,\n        \"groups_count\": 0,\n        \"created_at\": \"2020-08-26T11:13:41Z\",\n        \"updated_at\": \"2020-08-26T11:13:41Z\",\n        \"skills\": [\n            {\n                \"id\": 236,\n                \"external_id\": null,\n                \"name\": \"Quality Control\",\n                \"target_rating\": 3,\n                \"ai_generated\": true,\n                \"assigned_at\": \"2024-04-01T07:37:33Z\"\n            },\n            {\n                \"id\": 5556,\n                \"external_id\": null,\n                \"name\": \"3D Visualization\",\n                \"target_rating\": 4,\n                \"ai_generated\": false,\n                \"assigned_at\": \"2026-02-23T10:25:07Z\"\n            }\n        ]\n    }\n}"},{"id":"793ee4af-e9cf-440d-ac61-370bdb71cdf1","name":"404 Not Found","originalRequest":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/job_roles/ID-99999"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Job role not found\"\n}"},{"id":"55a1c31b-9942-49ff-afd7-8b1b2680749e","name":"403 Forbidden - Not Admin","originalRequest":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{}"},"url":"<Base URL>/external/v1/job_roles/ID-3991"},"status":"Forbidden","code":403,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"You are not authorized to perform this action\"\n}"},{"id":"f4fe741a-b5f2-43b0-8ca2-814555f3385a","name":"401 Unauthorized","originalRequest":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/job_roles/ID-3991"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not authorized\"\n}"}],"_postman_id":"ba8cd1af-66d7-4e5f-99db-1c3e384c5c3c"},{"name":"Delete Job Role","id":"96de67f9-667a-4123-b5d7-3b9c380ce260","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Must be application/json</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"url":"<Base URL>/external/v1/job_roles/:id","description":"<p>Delete an existing job role from the system.</p>\n<h2 id=\"path-parameters\">Path Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</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>Yes</td>\n<td>string</td>\n<td>Job role identifier. Format: <code>ID-{id}</code> or <code>EXT-{external_id}</code></td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Authorization:</strong> Only School Admin can delete job roles.</p>\n<p><strong>Warning:</strong> This action is irreversible.</p>\n","urlObject":{"path":["external","v1","job_roles",":id"],"host":["<Base URL>"],"query":[],"variable":[{"id":"7275a1cf-ae0e-432e-a21c-73dd6facff95","description":{"content":"<p>[MANDATORY] [string] Job role identifier. Format: ID-{hownow_id} or EXT-{external_id}</p>\n","type":"text/plain"},"type":"any","value":"","key":"id"}]}},"response":[{"id":"6d31ca08-8d72-4416-b4a7-758d252f0f06","name":"200 OK - Job Role Deleted","originalRequest":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/job_roles/ID-10826"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"Job role deleted successfully\"\n}"},{"id":"0618aab9-1737-455d-8554-d816abf48472","name":"404 Not Found","originalRequest":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/job_roles/ID-99999"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Job role not found\"\n}"},{"id":"a014ab56-d781-4146-8cee-5e777314e45f","name":"403 Forbidden - Not Admin","originalRequest":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/job_roles/ID-10826"},"status":"Forbidden","code":403,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"You are not authorized to perform this action\"\n}"},{"id":"bb0cbd3b-0c82-488f-8403-32ef8694a687","name":"401 Unauthorized","originalRequest":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/job_roles/ID-10826"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not authorized\"\n}"}],"_postman_id":"96de67f9-667a-4123-b5d7-3b9c380ce260"}],"id":"2d236c47-3bb9-4f1a-bffe-3382b6eb7c34","description":"<p>Manage job roles within your organisation. Job roles define the positions and responsibilities assigned to users, enabling role-based learning paths, skill gap analysis, and targeted content recommendations.</p>\n<p><strong>Permissions:</strong></p>\n<ul>\n<li>All authenticated users can list and view job roles</li>\n<li>Only School Admin can create, update, and delete job roles</li>\n</ul>\n","_postman_id":"2d236c47-3bb9-4f1a-bffe-3382b6eb7c34"},{"name":"Groups","item":[{"name":"Get All Groups","id":"7f61d02d-435c-4c29-9bea-5032ae3c36dd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Must be application/json</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"url":"<Base URL>/external/v1/groups?page=1&per_page=20","description":"<p>Retrieves a paginated list of all active groups in the system. The response includes core details for each group, such as the group ID, name, user count, and owner.</p>\n<h2 id=\"query-parameters\">Query Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</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>No</td>\n<td>integer</td>\n<td>1</td>\n<td>Page number</td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>No</td>\n<td>integer</td>\n<td>20</td>\n<td>Items per page (max: 100)</td>\n</tr>\n<tr>\n<td><code>search</code></td>\n<td>No</td>\n<td>string</td>\n<td>-</td>\n<td>Filter groups by name</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Access Control:</strong></p>\n<ul>\n<li>Admin: All groups</li>\n<li>Manager/Contributor/ReadOnly: Groups where user has group-level Admin, Manager, or Contributor role</li>\n</ul>\n","urlObject":{"path":["external","v1","groups"],"host":["<Base URL>"],"query":[{"description":{"content":"<p>[OPTIONAL] Page number (default: 1)</p>\n","type":"text/plain"},"key":"page","value":"1"},{"description":{"content":"<p>[OPTIONAL] Items per page (default: 20, max: 100)</p>\n","type":"text/plain"},"key":"per_page","value":"20"},{"disabled":true,"description":{"content":"<p>[OPTIONAL] Filter groups by name containing this term</p>\n","type":"text/plain"},"key":"search","value":""}],"variable":[]}},"response":[{"id":"8ab6f891-d79f-4d86-98d4-525028693bdc","name":"200 OK - Groups List","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":{"raw":"<Base URL>/external/v1/groups?page=1&per_page=3","host":["<Base URL>"],"path":["external","v1","groups"],"query":[{"key":"page","value":"1"},{"key":"per_page","value":"3"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"id\": 30749,\n            \"team_name\": \"Engineering Team\",\n            \"created_at\": \"2024-01-19T12:54:44.000Z\",\n            \"updated_at\": \"2024-07-17T07:15:09.000Z\",\n            \"user_count\": 144,\n            \"owner\": {},\n            \"channels_count\": 1\n        },\n        {\n            \"id\": 11008,\n            \"team_name\": \"07 March Test Group updated\",\n            \"created_at\": \"2023-03-07T13:51:28.000Z\",\n            \"updated_at\": \"2026-02-13T10:20:46.000Z\",\n            \"user_count\": 69,\n            \"owner\": {\n                \"id\": 64078,\n                \"name\": \"Sourabh Kankekar\",\n                \"email\": \"user7@example.com\",\n                \"role\": \"Admin\"\n            },\n            \"channels_count\": 2\n        },\n        {\n            \"id\": 7165,\n            \"team_name\": \"123\",\n            \"created_at\": \"2023-01-03T06:18:43.000Z\",\n            \"updated_at\": \"2023-01-03T06:18:43.000Z\",\n            \"user_count\": 35,\n            \"owner\": {},\n            \"channels_count\": 0\n        }\n    ],\n    \"meta\": {\n        \"page\": 1,\n        \"per_page\": 3,\n        \"total_pages\": 188,\n        \"total_count\": 563,\n        \"filters\": {}\n    }\n}"},{"id":"8b314c82-885e-42f3-8b2c-7ff1a1ed8eaa","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/groups"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not authorized\"\n}"}],"_postman_id":"7f61d02d-435c-4c29-9bea-5032ae3c36dd"},{"name":"Get Group Details","id":"3d7085c9-dc18-4bea-94ee-ca1c40878bfe","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Must be application/json</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"url":"<Base URL>/external/v1/groups/:id","description":"<p>Retrieves comprehensive details for a single group, identified by its unique ID. This includes metadata such as creation date, owner, channels, and user count.</p>\n<h2 id=\"path-parameters\">Path Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</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>Yes</td>\n<td>integer</td>\n<td>The unique identifier of the group</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["external","v1","groups",":id"],"host":["<Base URL>"],"query":[],"variable":[{"id":"c68ed3c5-9c1b-42dc-a8b2-9d226a8e5293","description":{"content":"<p>[MANDATORY] [integer] The unique identifier of the group</p>\n","type":"text/plain"},"type":"any","value":"","key":"id"}]}},"response":[{"id":"8752c732-89de-4e20-8031-d62b41efa4f6","name":"200 OK - Group Details","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/groups/11008"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 11008,\n        \"team_name\": \"07 March Test Group updated\",\n        \"created_at\": \"2023-03-07T13:51:28.000Z\",\n        \"updated_at\": \"2026-02-13T10:20:46.000Z\",\n        \"user_count\": 49,\n        \"owner\": {\n            \"id\": 64078,\n            \"name\": \"Sourabh Kankekar\",\n            \"email\": \"user7@example.com\",\n            \"role\": \"Admin\"\n        },\n        \"channels\": [\n            {\n                \"channel_id\": 11132,\n                \"name\": \"Marketing\",\n                \"description\": null\n            },\n            {\n                \"channel_id\": 35096,\n                \"name\": \"Sapu channel to add groups\",\n                \"description\": \"\"\n            }\n        ]\n    }\n}"},{"id":"4264907d-9134-40ec-9972-b9c6e3a62a8d","name":"404 Not Found","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/groups/99999"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not found\"\n}"},{"id":"2edd90c2-5774-42e4-83bd-be0b37fc14ee","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/groups/11008"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not authorized\"\n}"}],"_postman_id":"3d7085c9-dc18-4bea-94ee-ca1c40878bfe"},{"name":"Get Users in Group","id":"0c2e9c7f-acc5-4844-92ab-b38a435319b9","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Must be application/json</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"url":"<Base URL>/external/v1/groups/:id/users?page=1&per_page=20","description":"<p>Retrieves a paginated list of all users who are currently members of the specified group.</p>\n<h2 id=\"path-parameters\">Path Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</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>Yes</td>\n<td>integer</td>\n<td>The unique identifier of the group</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"query-parameters\">Query Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</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>No</td>\n<td>integer</td>\n<td>1</td>\n<td>Page number</td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>No</td>\n<td>integer</td>\n<td>20</td>\n<td>Items per page (max: 100)</td>\n</tr>\n<tr>\n<td><code>role</code></td>\n<td>No</td>\n<td>string</td>\n<td>-</td>\n<td>Filter by group-level role: <code>admin</code>, <code>manager</code>, <code>contributor</code>, <code>readonly</code></td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["external","v1","groups",":id","users"],"host":["<Base URL>"],"query":[{"description":{"content":"<p>[OPTIONAL] Page number (default: 1)</p>\n","type":"text/plain"},"key":"page","value":"1"},{"description":{"content":"<p>[OPTIONAL] Items per page (default: 20, max: 100)</p>\n","type":"text/plain"},"key":"per_page","value":"20"},{"disabled":true,"description":{"content":"<p>[OPTIONAL] Filter users by group-level role: admin, manager, contributor, readonly</p>\n","type":"text/plain"},"key":"role","value":""}],"variable":[{"id":"b4b3b2c0-6086-4aa8-811a-5a337bc4e2e6","description":{"content":"<p>[MANDATORY] [integer] The unique identifier of the group</p>\n","type":"text/plain"},"type":"any","value":"","key":"id"}]}},"response":[{"id":"dc7143ef-d2f0-45c9-93e3-d9f513dbaa9d","name":"200 OK - Users in Group","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":{"raw":"<Base URL>/external/v1/groups/11008/users?page=1&per_page=3","host":["<Base URL>"],"path":["external","v1","groups","11008","users"],"query":[{"key":"page","value":"1"},{"key":"per_page","value":"3"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"id\": 56196,\n            \"name\": \"Raza Test User\",\n            \"email\": \"raza@example.com\",\n            \"role\": \"Admin\",\n            \"group_joining_date\": \"2022-03-23T14:59:35Z\"\n        },\n        {\n            \"id\": 60542,\n            \"name\": \"Roshni SSO\",\n            \"email\": \"roshnigosavi@example.com\",\n            \"role\": \"Manager\",\n            \"group_joining_date\": \"2022-11-10T10:46:43Z\"\n        },\n        {\n            \"id\": 95938,\n            \"name\": \"Roshni newuser2\",\n            \"email\": \"user11@example.com\",\n            \"role\": \"Manager\",\n            \"group_joining_date\": \"2023-04-27T06:13:07Z\"\n        }\n    ],\n    \"meta\": {\n        \"page\": 1,\n        \"per_page\": 3,\n        \"total_pages\": 21,\n        \"total_count\": 63,\n        \"filters\": {}\n    }\n}"},{"id":"3ca268fd-20b3-4305-bcd5-e604fc12437c","name":"404 Not Found","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/groups/99999/users"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not found\"\n}"},{"id":"3b3e95bd-d911-4b07-9ddf-316e43da773b","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/groups/11008/users"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not authorized\"\n}"}],"_postman_id":"0c2e9c7f-acc5-4844-92ab-b38a435319b9"}],"id":"97abc1dd-317a-47f8-8d93-c69e963ee075","description":"<p>Manage groups (teams) within your HowNow organisation. Groups organise users into logical units such as departments, teams, or project groups, enabling targeted content distribution, reporting, and access control.</p>\n<p><strong>Access Control:</strong></p>\n<ul>\n<li>Admin: All groups in the instance</li>\n<li>Manager/Contributor/ReadOnly: Groups where user has group-level Admin, Manager, or Contributor role</li>\n</ul>\n","_postman_id":"97abc1dd-317a-47f8-8d93-c69e963ee075"},{"name":"Skills","item":[{"name":"List/Search Skills","id":"3cb3552a-b7c3-4c33-b001-f0eed312adce","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Must be application/json</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"url":"<Base URL>/external/v1/skills?page=1&per_page=20","description":"<p>Returns a paginated list of all skills (expertises) available to the school, including metadata such as average rating, number of assigned job roles, and number of assigned users.</p>\n<h2 id=\"query-parameters\">Query Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</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>No</td>\n<td>integer</td>\n<td>1</td>\n<td>Page number</td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>No</td>\n<td>integer</td>\n<td>20</td>\n<td>Items per page (max: 100)</td>\n</tr>\n<tr>\n<td><code>q</code></td>\n<td>No</td>\n<td>string</td>\n<td>-</td>\n<td>Search skills by name (partial match)</td>\n</tr>\n<tr>\n<td><code>sort_by</code></td>\n<td>No</td>\n<td>string</td>\n<td>name</td>\n<td>Sort field: <code>name</code>, <code>created_at</code></td>\n</tr>\n<tr>\n<td><code>sort_order</code></td>\n<td>No</td>\n<td>string</td>\n<td>asc</td>\n<td>Sort direction: <code>asc</code> or <code>desc</code></td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["external","v1","skills"],"host":["<Base URL>"],"query":[{"description":{"content":"<p>[OPTIONAL] Page number (default: 1)</p>\n","type":"text/plain"},"key":"page","value":"1"},{"description":{"content":"<p>[OPTIONAL] Items per page (max: 100)</p>\n","type":"text/plain"},"key":"per_page","value":"20"},{"disabled":true,"description":{"content":"<p>[OPTIONAL] Search skills by name (partial match)</p>\n","type":"text/plain"},"key":"q","value":""},{"disabled":true,"description":{"content":"<p>[OPTIONAL] Sort field: name, created_at (default: name)</p>\n","type":"text/plain"},"key":"sort_by","value":"name"},{"disabled":true,"description":{"content":"<p>[OPTIONAL] Sort direction: asc or desc (default: asc)</p>\n","type":"text/plain"},"key":"sort_order","value":"asc"}],"variable":[]}},"response":[{"id":"bcd69f12-5c53-47c9-83f3-b3cf639687e9","name":"200 OK - Skills List","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":{"raw":"<Base URL>/external/v1/skills?page=1&per_page=3","host":["<Base URL>"],"path":["external","v1","skills"],"query":[{"key":"page","value":"1"},{"key":"per_page","value":"3"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"id\": 90608,\n            \"name\": \"Python\",\n            \"external_id\": null,\n            \"average_rating\": 1,\n            \"users_count\": 40,\n            \"job_roles_count\": 4,\n            \"created_at\": \"2025-08-11T06:20:41Z\",\n            \"updated_at\": \"2025-08-11T06:20:41Z\"\n        },\n        {\n            \"id\": 58786,\n            \"name\": \".Com\",\n            \"external_id\": null,\n            \"average_rating\": 2,\n            \"users_count\": 478,\n            \"job_roles_count\": 194,\n            \"created_at\": \"2024-04-05T14:33:58Z\",\n            \"updated_at\": \"2024-04-05T14:33:58Z\"\n        },\n        {\n            \"id\": 360,\n            \"name\": \".HTACCESS\",\n            \"external_id\": null,\n            \"average_rating\": 2,\n            \"users_count\": 651,\n            \"job_roles_count\": 323,\n            \"created_at\": \"2019-09-20T07:09:56Z\",\n            \"updated_at\": \"2019-09-20T07:09:56Z\"\n        }\n    ],\n    \"meta\": {\n        \"page\": 1,\n        \"per_page\": 3,\n        \"total_pages\": 13723,\n        \"total_count\": 41169,\n        \"filters\": {}\n    }\n}"},{"id":"d7e8750c-9c47-4bb6-a0b5-ef6ae1a38da0","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/skills"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not authorized\"\n}"}],"_postman_id":"3cb3552a-b7c3-4c33-b001-f0eed312adce"},{"name":"Get Skill Details","id":"32d63475-eaa9-4969-86eb-19a7b9992ecd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Must be application/json</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"url":"<Base URL>/external/v1/skills/:id","description":"<p>Returns detailed information about a specific skill, including metadata such as average rating, number of users, and number of job roles.</p>\n<h2 id=\"path-parameters\">Path Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</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>Yes</td>\n<td>string</td>\n<td>Skill identifier. Format: <code>ID-{id}</code> or <code>EXT-{external_id}</code></td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["external","v1","skills",":id"],"host":["<Base URL>"],"query":[],"variable":[{"id":"3288ce91-b87c-4072-a85e-03b04e43cd25","description":{"content":"<p>[MANDATORY] [string] Skill identifier. Format: ID-{hownow_id} or EXT-{external_id}</p>\n","type":"text/plain"},"type":"any","value":"","key":"id"}]}},"response":[{"id":"854b373f-517b-44c7-b383-94dd997b210d","name":"200 OK - Skill Details","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/skills/ID-360"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 360,\n        \"name\": \".HTACCESS\",\n        \"external_id\": null,\n        \"average_rating\": 2,\n        \"users_count\": 651,\n        \"job_roles_count\": 323,\n        \"created_at\": \"2019-09-20T07:09:56Z\",\n        \"updated_at\": \"2019-09-20T07:09:56Z\"\n    }\n}"},{"id":"30ce7915-fcf4-4315-9dbd-5b2bf77f71a5","name":"404 Not Found","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/skills/ID-99999"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Skill not found\"\n}"},{"id":"6ed97687-8307-486d-9d38-3d17551fddb5","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/skills/ID-360"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not authorized\"\n}"}],"_postman_id":"32d63475-eaa9-4969-86eb-19a7b9992ecd"},{"name":"Create Skill","id":"6b5c51a9-d77c-47e8-9ef3-c5454c6c3a62","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Must be application/json</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Machine Learning\",\n  \"external_id\": \"SKL-ML-001\"\n}","options":{"raw":{"language":"json"}}},"url":"<Base URL>/external/v1/skills","description":"<p>Creates a new skill (expertise) for the school.</p>\n<h2 id=\"body-parameters\">Body Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>name</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>Max 191 characters, must be unique per school</td>\n<td>Skill name</td>\n</tr>\n<tr>\n<td><code>external_id</code></td>\n<td>No</td>\n<td>string</td>\n<td>Must be unique per school</td>\n<td>External identifier for integration with third-party systems</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Authorization:</strong> Only Admin users can create skills.</p>\n<p><strong>Notes:</strong></p>\n<ul>\n<li>Skill creation may be restricted if school expertise is set to immutable.</li>\n</ul>\n","urlObject":{"path":["external","v1","skills"],"host":["<Base URL>"],"query":[],"variable":[]}},"response":[{"id":"30b63117-828d-4fbc-9e3a-c6901d8bd663","name":"201 Created - Skill Created","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Machine Learning\",\n  \"external_id\": \"SKL-ML-001\"\n}"},"url":"<Base URL>/external/v1/skills"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 125,\n        \"name\": \"Machine Learning\",\n        \"external_id\": \"SKL-ML-001\",\n        \"average_rating\": null,\n        \"users_count\": 0,\n        \"job_roles_count\": 0,\n        \"created_at\": \"2024-07-15T08:30:00Z\",\n        \"updated_at\": \"2024-07-15T08:30:00Z\"\n    }\n}"},{"id":"ebd3d574-045f-4419-b177-add912ee55ac","name":"400 Bad Request - Missing Name","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{}"},"url":"<Base URL>/external/v1/skills"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Missing required parameter: name\"\n}"},{"id":"d5edeaa7-e9b1-44ac-a549-38abc7be90a2","name":"403 Forbidden - Not Admin","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Machine Learning\"\n}"},"url":"<Base URL>/external/v1/skills"},"status":"Forbidden","code":403,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"You are not authorized to perform this action. Only admin users can create skills.\"\n}"},{"id":"6a6f8d0c-b647-4274-9214-8fc34a556d4a","name":"422 Unprocessable Entity - Duplicate Name","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Machine Learning\"\n}"},"url":"<Base URL>/external/v1/skills"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"errors\": [\n    \"Name has already been taken\"\n  ]\n}"},{"id":"85aed28a-f74c-482c-ad18-8129f67c4f82","name":"401 Unauthorized","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"},{"key":"X-User-Id","value":"your-user-id-here"}],"url":"<Base URL>/external/v1/skills"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not authorized\"\n}"}],"_postman_id":"6b5c51a9-d77c-47e8-9ef3-c5454c6c3a62"}],"id":"0d2dfa97-0e47-43e7-b545-80cfd7b0ac1c","description":"<p>Manage the skills taxonomy for your HowNow organisation. Skills represent competencies and capabilities that can be tracked, assessed, and developed across your workforce. Use these endpoints to list, view, and create skills.</p>\n<p><strong>Permissions:</strong></p>\n<ul>\n<li><p>All roles can view skills (GET endpoints)</p>\n</li>\n<li><p>Only Admin users can create skills (POST)</p>\n</li>\n</ul>\n","_postman_id":"0d2dfa97-0e47-43e7-b545-80cfd7b0ac1c"},{"name":"Job Status","item":[{"name":"Check Job Status","id":"7bd633c8-16ac-4800-888f-b5992aa15706","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here","description":"<p>[MANDATORY] Bearer token for authentication</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>[MANDATORY] Must be application/json</p>\n"},{"key":"X-User-Id","value":"your-user-id-here","description":"<p>[OPTIONAL] Acting user ID. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user.</p>\n"}],"url":"<Base URL>/external/v1/jobs/:job_id/status","description":"<p>Tracks the status and outcome of asynchronous background jobs.</p>\n<h2 id=\"path-parameters\">Path Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Mandatory</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>job_id</code></td>\n<td>Yes</td>\n<td>string</td>\n<td>Must be a valid job ID returned from an async operation</td>\n<td>Unique identifier of the background job</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>No query or body parameters.</strong></p>\n<p><strong>Job Statuses:</strong></p>\n<ul>\n<li><code>in_progress</code> - Job is still running</li>\n<li><code>completed</code> - Job finished successfully</li>\n<li><code>completed_with_warnings</code> - Job finished but with some warnings/partial failures</li>\n<li><code>failed</code> - Job failed entirely</li>\n</ul>\n<p>Use the <code>job_id</code> returned from user upsert, learning record upsert, or skill review endpoints.</p>\n","urlObject":{"path":["external","v1","jobs",":job_id","status"],"host":["<Base URL>"],"query":[],"variable":[{"id":"2908b12a-98a0-44ed-812b-5abc0b7726b1","description":{"content":"<p>[MANDATORY] [string] Unique job identifier returned from async endpoints (user upsert, learning record upsert, skill review operations).</p>\n","type":"text/plain"},"type":"any","value":"","key":"job_id"}]}},"response":[{"id":"66e53cb6-731a-4758-9687-a0bc6ff312bf","name":"200 OK - Job Completed","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"url":"<Base URL>/external/v1/jobs/job_abc_123/status"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"completed\",\n  \"errors\": null\n}"},{"id":"868e7c3b-1069-4833-80cd-59fc1f091cfd","name":"200 OK - Job In Progress","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"url":"<Base URL>/external/v1/jobs/job_abc_123/status"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"in_progress\",\n  \"errors\": null\n}"},{"id":"f2d0e67b-133f-4d9e-a4f7-18818da4f966","name":"200 OK - Job Failed","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your-bearer-token-here"},{"key":"Content-Type","value":"application/json"}],"url":"<Base URL>/external/v1/jobs/job_abc_123/status"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"failed\",\n  \"errors\": \"User not found with external_user_id: user_999\"\n}"},{"id":"8b54a60a-41f7-4ab7-a9d0-056aa6cae7c8","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer invalid-token"},{"key":"Content-Type","value":"application/json"}],"url":"<Base URL>/external/v1/jobs/job_abc_123/status"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error_message\": \"Not authorized\"\n}"}],"_postman_id":"7bd633c8-16ac-4800-888f-b5992aa15706"}],"id":"ab61107b-e796-46b0-ae11-c9b55866e1b0","description":"<p>The monitoring hub for asynchronous background tasks. Because heavy operations—like bulk user upserts, syncing learning records, and updating skill reviews—are processed in the background to ensure high performance, they return a <code>job_id</code>. This folder contains the polling endpoint used to check if those background jobs are <code>in_progress</code>, <code>completed</code>, or <code>failed</code> (including granular error messages).</p>\n","_postman_id":"ab61107b-e796-46b0-ae11-c9b55866e1b0"}],"variable":[{"key":"base_url","value":"<Base URL>","description":"Base URL for the API. UAT: https://api-london.hownow.tech | EU: https://api.hownow.app | UK: https://api-london.hownow.app"},{"key":"auth_token","value":"your-bearer-token-here","description":"Bearer token obtained from POST /token endpoint"},{"key":"x_user_id","value":"your-user-id-here","description":"HowNow User ID for the X-User-Id header. Accepted on all endpoints except token. Formats: EMAIL-{email}, EXT-{external_id}, or ID-{id}. If omitted, school admin is used as the acting user."}]}