{"info":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","description":"<html><head></head><body><p>This documentation describes the Claritalk API endpoints. In case you have any feedback or miss certain functionality, let us know via <a href=\"https://support.claritalk.com/\">support@claritalk.com</a>.</p>\n<h1 id=\"api-endpoint\">API endpoint</h1>\n<ul>\n<li>The base API endpoint for all requests (excluding the authentication calls) is:<ul>\n<li><strong>Production environment:</strong> <a href=\"https://app.claritalk.com/api/\">https://app.claritalk.com/api/</a></li>\n<li><strong>Staging environment:</strong> <a href=\"https://staging.claritalk.com/api/\">https://staging.claritalk.com/api/</a></li>\n</ul>\n</li>\n</ul>\n<h1 id=\"status-codes\">Status codes</h1>\n<ul>\n<li><code>200</code> OK: the request was processed successfully</li>\n<li><code>201</code> Created: the resource was created successfully</li>\n<li><code>204</code> No Content: the request was processed successfully with no response body</li>\n<li><code>400</code> Bad request: the endpoint was called using invalid data</li>\n<li><code>401</code> Unauthorized: invalid or missing access token</li>\n<li><code>403</code> Forbidden: insufficient permissions for this action (or the user's licence is blocked, see <a href=\"#licensing\">Licensing</a>)</li>\n<li><code>404</code> Resource not found: make sure the correct URL was used</li>\n<li><code>409</code> Conflict: resource state conflict (e.g., active recording already exists)</li>\n<li><code>422</code> Unprocessable entity: validation failed or integration error</li>\n<li><code>429</code> Too many requests: the rate limit is currently set at 480 calls/min. Except for the upload/recordings call. That one allows for 50 calls/min.</li>\n<li><code>500</code> Internal Server Error: an unexpected error occurred. Contact support if this problem keeps occurring.</li>\n<li><code>503</code> Service Unavailable: Claritalk Connect desktop client is not connected</li>\n</ul>\n<h1 id=\"authentication\">Authentication</h1>\n<p>The Claritalk API uses <strong>OAuth 2.0</strong> (via Laravel Passport) for authentication. There are three ways to authenticate:</p>\n<ol>\n<li><strong>OAuth with callback URL</strong> — for end user authentication (recommended for integrations)</li>\n<li><strong>Personal Access Token (PAT)</strong> — for individual user API access</li>\n<li><strong>Service Account (Client Credentials)</strong> — for server-to-server integrations</li>\n</ol>\n<p>Whichever method is used, the token always has to be added to the <code>Authorization</code> header with a <code>Bearer</code> prefix. Example: <code>Authorization: Bearer xyz</code></p>\n<h2 id=\"oauth-with-callback-url-recommended\">OAuth with callback URL (recommended)</h2>\n<p>For 3rd party integrators who want to build an API integration for multiple organisations, contact <a href=\"mailto:support@claritalk.com\">support@claritalk.com</a> to request a <code>client_id</code> and <code>client_secret</code>. Tell us about your use case and which redirect URL(s) you want to use.</p>\n<p>You will need to register a <code>redirect URL</code> that will be called after the user logs in.</p>\n<p>Example: <code>https://yourcompany.com/claritalk/callback</code></p>\n<h3 id=\"1-setup-the-authorization-url\">1. Setup the authorization URL</h3>\n<p>The authorization URL is: <code>https://app.claritalk.com/oauth/authorize</code></p>\n<p>The following query string parameters should be added (make sure to use URL encoding):</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>client_id</code></td>\n<td>The client ID received from the Claritalk team</td>\n</tr>\n<tr>\n<td><code>response_type</code></td>\n<td>Must be <code>code</code></td>\n</tr>\n<tr>\n<td><code>scope</code></td>\n<td><code>api.connect</code> (add <code>offline_access</code> for refresh tokens)</td>\n</tr>\n<tr>\n<td><code>redirect_uri</code></td>\n<td>Your registered callback URL</td>\n</tr>\n<tr>\n<td><code>state</code></td>\n<td>Optional state parameter returned in the callback</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"2-obtaining-an-access-token\">2. Obtaining an access token</h3>\n<p>After the user logs in, your callback URL receives a <code>GET</code> request with a <code>code</code> query parameter.</p>\n<p>The token endpoint is: <code>https://app.claritalk.com/oauth/token</code></p>\n<p>Make a <code>POST</code> call with <code>Content-Type: application/x-www-form-urlencoded</code>:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>code</code></td>\n<td>The authorization code from the callback</td>\n</tr>\n<tr>\n<td><code>redirect_uri</code></td>\n<td>Your registered callback URL</td>\n</tr>\n<tr>\n<td><code>grant_type</code></td>\n<td><code>authorization_code</code></td>\n</tr>\n<tr>\n<td><code>client_id</code></td>\n<td>Your client ID</td>\n</tr>\n<tr>\n<td><code>client_secret</code></td>\n<td>Your client secret</td>\n</tr>\n</tbody>\n</table>\n</div><p>Response:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"access_token\": \"eyJ0eXAi...\",\n  \"token_type\": \"Bearer\",\n  \"expires_in\": 3600,\n  \"refresh_token\": \"def50200...\"\n}\n</code></pre>\n<ul>\n<li><code>access_token</code>: valid for <strong>1 hour</strong></li>\n<li><code>refresh_token</code>: valid for <strong>7 days</strong> since last use. If not used within 7 days, the user must re-authenticate.</li>\n</ul>\n<h3 id=\"3-refreshing-an-access-token\">3. Refreshing an access token</h3>\n<p>Endpoint: <code>https://app.claritalk.com/oauth/token</code></p>\n<p>Make a <code>POST</code> call with <code>Content-Type: application/x-www-form-urlencoded</code>:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>refresh_token</code></td>\n<td>Your stored refresh token</td>\n</tr>\n<tr>\n<td><code>grant_type</code></td>\n<td><code>refresh_token</code></td>\n</tr>\n<tr>\n<td><code>client_id</code></td>\n<td>Your client ID</td>\n</tr>\n<tr>\n<td><code>client_secret</code></td>\n<td>Your client secret</td>\n</tr>\n</tbody>\n</table>\n</div><p>Returns a new access token and refresh token (same structure as above).</p>\n<h2 id=\"personal-access-token-pat\">Personal Access Token (PAT)</h2>\n<p>For individual users who need API access for their own tools or scripts. PATs are scoped to the user who created them.</p>\n<p><strong>To create a PAT:</strong></p>\n<ol>\n<li>Log in to Claritalk</li>\n<li>Go to <strong>Settings</strong> &gt; <strong>API Tokens</strong> &gt; <strong>Personal Access Tokens</strong></li>\n<li>Click <strong>Create Token</strong>, give it a name</li>\n<li>Copy the token immediately — it will not be shown again</li>\n</ol>\n<p>Use the token in the <code>Authorization</code> header: <code>Authorization: Bearer {your-pat-token}</code></p>\n<p><strong>Characteristics:</strong></p>\n<ul>\n<li>Scoped to the creating user — sees only data that user has access to</li>\n<li>Does not expire (but can be revoked at any time from the settings page)</li>\n<li>End user permissions apply: can only access own meetings, cannot manage other users</li>\n<li>Rate limited: max 10 token creations per minute</li>\n</ul>\n<h2 id=\"service-account-client-credentials\">Service Account (Client Credentials)</h2>\n<p>For server-to-server integrations that need tenant-wide access without a specific user context. Service accounts have elevated permissions.</p>\n<p><strong>To create a Service Account:</strong></p>\n<ol>\n<li>Log in to Claritalk as an <strong>Organisation Admin</strong></li>\n<li>Go to <strong>Settings</strong> &gt; <strong>API Tokens</strong> &gt; <strong>Service Accounts</strong></li>\n<li>Click <strong>Create Service Account</strong>, give it a name</li>\n<li>Copy the <code>client_id</code> and <code>client_secret</code> immediately — the secret will not be shown again</li>\n</ol>\n<p><strong>To obtain a token:</strong></p>\n<p>Endpoint: <code>https://app.claritalk.com/oauth/token</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>grant_type</code></td>\n<td><code>client_credentials</code></td>\n</tr>\n<tr>\n<td><code>client_id</code></td>\n<td>Your service account client ID</td>\n</tr>\n<tr>\n<td><code>client_secret</code></td>\n<td>Your service account client secret</td>\n</tr>\n<tr>\n<td><code>scope</code></td>\n<td><code>api.connect</code></td>\n</tr>\n</tbody>\n</table>\n</div><p>Response:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"access_token\": \"eyJ0eXAi...\",\n  \"token_type\": \"Bearer\",\n  \"expires_in\": 3600\n}\n</code></pre>\n<blockquote>\n<p><strong>Note:</strong> Client credentials grant does not return a refresh token. Request a new token when the current one expires.</p>\n</blockquote>\n<p><strong>Characteristics:</strong></p>\n<ul>\n<li>Tenant-wide access: sees all meetings, users, teams, and dossiers in the organisation</li>\n<li>Can create/delete users, invite users, create organisations</li>\n<li>Can create meetings on behalf of any user</li>\n<li>Rate limited: max 5 service account creations per minute</li>\n<li>Only Organisation Admins can create service accounts</li>\n</ul>\n<h1 id=\"authorization-scoping\">Authorization Scoping</h1>\n<p>The API enforces a <strong>two-tier access model</strong> based on the caller type:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Capability</th>\n<th>End User (PAT / OAuth)</th>\n<th>Service Account</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>List meetings</td>\n<td>Own + shared + team-linked only</td>\n<td>All in organisation</td>\n</tr>\n<tr>\n<td>Create meeting</td>\n<td>For self only</td>\n<td>For any user</td>\n</tr>\n<tr>\n<td>Update user</td>\n<td>Own profile only (no role changes)</td>\n<td>Any user in organisation</td>\n</tr>\n<tr>\n<td>Delete user</td>\n<td>Not allowed</td>\n<td>Allowed</td>\n</tr>\n<tr>\n<td>Invite user</td>\n<td>Not allowed</td>\n<td>Allowed</td>\n</tr>\n<tr>\n<td>Create organisation</td>\n<td>Not allowed</td>\n<td>Allowed</td>\n</tr>\n<tr>\n<td>List teams/dossiers</td>\n<td>Accessible only</td>\n<td>All in organisation</td>\n</tr>\n</tbody>\n</table>\n</div><h1 id=\"multi-tenancy\">Multi-Tenancy</h1>\n<p>All authenticated requests are scoped to the tenant (organisation) associated with the Bearer token. The tenant is extracted from the token automatically.</p>\n<h1 id=\"licensing\">Licensing</h1>\n<p>When an end user's trial has expired or their licence has lapsed, every API endpoint refuses the request with:</p>\n<p><strong>403 Forbidden</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Your trial has ended\",\n  \"billing_blocked\": true\n}\n</code></pre>\n<p><code>message</code> is translated to the user's language; rely on the <code>billing_blocked</code> flag, not the text.</p>\n<p>These endpoints stay available to a blocked user, so a client can explain why access is blocked:</p>\n<ul>\n<li><code>GET /user/me</code></li>\n<li><code>GET /user/me/billing</code></li>\n</ul>\n<p>Do not treat this 403 as an invalid session: logging the user out hides the reason from them.</p>\n<h1 id=\"rate-limits\">Rate Limits</h1>\n<ul>\n<li>Default: <strong>480 requests/minute</strong></li>\n<li>Upload/recording endpoints: <strong>50 requests/minute</strong></li>\n<li>Token creation: <strong>10/minute</strong> (PAT), <strong>5/minute</strong> (Service Account)</li>\n</ul>\n<h1 id=\"webhooks\">Webhooks</h1>\n<p>Webhooks provide real-time notifications when events occur. Claritalk sends a <code>POST</code> request to your registered URL.</p>\n<p><strong>Supported events:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Event</th>\n<th>Trigger</th>\n<th>Data</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>meeting.status.changed</code></td>\n<td>Meeting status transitions</td>\n<td>Meeting object</td>\n</tr>\n<tr>\n<td><code>meeting.processed</code></td>\n<td>All AI processing complete (summary, questions, topics, coaching)</td>\n<td>Full meeting data + PDF report</td>\n</tr>\n<tr>\n<td><code>users.created</code></td>\n<td>New user created</td>\n<td>User object</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"meetingprocessed-payload\"><code>meeting.processed</code> payload</h3>\n<p>Fires after all post-processing steps complete. Includes the full meeting with summary, themed questions, discussion topics, todos, metadata, and a base64-encoded PDF summary report.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"event\": \"meeting.processed\",\n  \"timestamp\": \"2025-01-15T11:00:00Z\",\n  \"data\": {\n    \"userId\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"meetingId\": \"660e8400-e29b-41d4-a716-446655440000\",\n    \"title\": \"Weekly standup\",\n    \"status\": \"Meeting processed\",\n    \"summaryQualityFlag\": false,\n    \"createdAt\": \"2025-01-15 10:00:00\",\n    \"updatedAt\": \"2025-01-15 11:00:00\",\n    \"locale\": \"en\",\n    \"themes\": [...],\n    \"summary\": {\n      \"general\": { \"type\": \"general\", \"content\": \"...\" }\n    },\n    \"todos\": [...],\n    \"metadata\": {},\n    \"discussionTopics\": [...],\n    \"files\": {\n      \"filename\": \"weekly-standup-summary-report.pdf\",\n      \"content\": \"&lt;base64-encoded PDF&gt;\"\n    }\n  },\n  \"meta\": {\n    \"source\": \"claritalk\",\n    \"version\": \"1.0\"\n  }\n}\n</code></pre>\n<h3 id=\"generic-payload\">Generic payload</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"event\": \"meeting.status.changed\",\n  \"timestamp\": \"2025-01-15T10:00:00Z\",\n  \"data\": { ... },\n  \"meta\": {\n    \"source\": \"claritalk\",\n    \"version\": \"1.0\"\n  }\n}\n</code></pre>\n<p>Register your webhook URL via the <code>POST /client/webhook</code> endpoint or by providing a <code>webhook_url</code> when creating an organisation.</p>\n<hr>\n<p><em>Contact <a href=\"mailto:support@claritalk.com\">support@claritalk.com</a> for questions or API access.</em></p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[{"content":"API endpoint","slug":"api-endpoint"},{"content":"Status codes","slug":"status-codes"},{"content":"Authentication","slug":"authentication"},{"content":"Authorization Scoping","slug":"authorization-scoping"},{"content":"Multi-Tenancy","slug":"multi-tenancy"},{"content":"Licensing","slug":"licensing"},{"content":"Rate Limits","slug":"rate-limits"},{"content":"Webhooks","slug":"webhooks"}],"owner":"37292144","collectionId":"46140d6e-d451-4957-8c84-3bbbb438e781","publishedId":"2sB2qi9xwo","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"682577"},"publishDate":"2025-06-04T12:44:42.000Z"},"item":[{"name":"Users","item":[{"name":"Get current user","id":"62caeed7-0c66-4386-a0b1-6eae2ee5f22c","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/user/me","description":"<p>Retrieve the currently authenticated user's profile, including role and permission scopes.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<p>None.</p>\n<h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"user\": {\n    \"id\": 1,\n    \"uuid\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"name\": \"Jane Doe\",\n    \"email\": \"jane@company.com\",\n    \"locale\": \"en\",\n    \"role\": \"admin\",\n    \"scopes\": [\n      \"organisation_settings_meeting_question_viewlist\",\n      \"organisation_settings_meeting_question_delete\"\n    ],\n    \"organisation\": { \"uuid\": \"...\", \"name\": \"Acme\" },\n    \"transcription_provider\": \"gladia\",\n    \"local_transcription\": { \"enabled\": false, \"model\": null },\n    \"ai_chat_enabled\": true\n  }\n}\n</code></pre>\n<h3 id=\"response-fields\">Response fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>organisation</td>\n<td>object</td>\n<td>The user's organisation (the impersonated organisation while impersonating)</td>\n</tr>\n<tr>\n<td>transcription_provider</td>\n<td>string</td>\n<td><code>gladia</code> or <code>speechmatics</code>: the organisation's speech-to-text provider. Advisory only; the token endpoint makes the final decision</td>\n</tr>\n<tr>\n<td>local_transcription</td>\n<td>object</td>\n<td><code>{enabled: bool, model: string|null}</code>: whether Claritalk Connect may transcribe on-device, and the preselected model. <code>model</code> is <code>null</code> when <code>enabled</code> is <code>false</code></td>\n</tr>\n<tr>\n<td>ai_chat_enabled</td>\n<td>boolean</td>\n<td>Whether the organisation may use Clara</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"error-responses\">Error Responses</h3>\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>401</td>\n<td>Missing or invalid token</td>\n</tr>\n<tr>\n<td>500</td>\n<td>Called with a service account token</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>Only works for end user tokens. Service accounts should use the filter endpoint instead.</li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["user","me"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[]}},"response":[{"id":"a42e866a-35c7-4ba0-aa92-912238a8e047","name":"Success","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/user/me","description":"Retrieve the currently authenticated user's profile, including role and permission scopes.\n\n### Parameters\nNone.\n\n### Response\n**200 OK**\n```json\n{\n  \"user\": {\n    \"id\": 1,\n    \"uuid\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"name\": \"Jane Doe\",\n    \"email\": \"jane@company.com\",\n    \"locale\": \"en\",\n    \"role\": \"admin\",\n    \"scopes\": [\n      \"organisation_settings_meeting_question_viewlist\",\n      \"organisation_settings_meeting_question_delete\"\n    ]\n  }\n}\n```\n\n### Error Responses\n| Status | Condition |\n|--------|----------|\n| 401 | Missing or invalid token |\n| 500 | Called with a service account token |\n\n### Notes\n- Only works for end user tokens. Service accounts should use the filter endpoint instead."},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"user\": {\n    \"id\": 1,\n    \"uuid\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"name\": \"Jane Doe\",\n    \"email\": \"jane@company.com\",\n    \"locale\": \"en\",\n    \"role\": \"admin\",\n    \"scopes\": [\"organisation_settings_meeting_question_viewlist\"]\n  }\n}"}],"_postman_id":"62caeed7-0c66-4386-a0b1-6eae2ee5f22c"},{"name":"List users","id":"5b14c363-3f05-45df-8c50-1023108cc35d","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/users/list","description":"<p>List all users in the authenticated tenant's organisation.</p>\n<h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"name\": \"Jane Doe\",\n    \"email\": \"jane@company.com\",\n    \"locale\": \"en\",\n    \"createdAt\": \"2025-01-15 10:00:00\",\n    \"updatedAt\": \"2025-01-15 10:00:00\"\n  }\n]\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\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>404</td>\n<td>Organisation not found</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["users","list"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[]}},"response":[],"_postman_id":"5b14c363-3f05-45df-8c50-1023108cc35d"},{"name":"Get user by filter","id":"cc6bbc14-5dcb-4bec-a8e0-7ea352597c91","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/users?email=jane@company.com","description":"<p>Retrieve a specific user by UUID or email address. At least one filter is required.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>uuid</td>\n<td>query</td>\n<td>string (UUID)</td>\n<td>No*</td>\n<td>User UUID</td>\n</tr>\n<tr>\n<td>email</td>\n<td>query</td>\n<td>string</td>\n<td>No*</td>\n<td>User email address</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>*At least one of <code>uuid</code> or <code>email</code> is required.</p>\n</blockquote>\n<h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"name\": \"Jane Doe\",\n  \"email\": \"jane@company.com\",\n  \"locale\": \"en\",\n  \"createdAt\": \"2025-01-15 10:00:00\",\n  \"updatedAt\": \"2025-01-15 10:00:00\"\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\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>403</td>\n<td>End user accessing another user</td>\n</tr>\n<tr>\n<td>404</td>\n<td>User not found</td>\n</tr>\n<tr>\n<td>422</td>\n<td>Neither uuid nor email provided</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>End users can only retrieve their own profile.</li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["users"],"host":["https://app.claritalk.com/api"],"query":[{"disabled":true,"description":{"content":"<p>User UUID</p>\n","type":"text/plain"},"key":"uuid","value":""},{"description":{"content":"<p>User email address</p>\n","type":"text/plain"},"key":"email","value":"jane@company.com"}],"variable":[]}},"response":[],"_postman_id":"cc6bbc14-5dcb-4bec-a8e0-7ea352597c91"},{"name":"Update user","id":"bb24f001-7a6b-44a5-837a-6059e9d01cd2","request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Jane Smith\",\n  \"email\": \"jane.smith@company.com\"\n}"},"url":"https://app.claritalk.com/api/users/:uuid","description":"<p>Update a user's profile.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>uuid</td>\n<td>path</td>\n<td>string (UUID)</td>\n<td>Yes</td>\n<td>User UUID</td>\n</tr>\n<tr>\n<td>name</td>\n<td>body</td>\n<td>string (max 255)</td>\n<td>No</td>\n<td>Full name; split on the first space into first and last name</td>\n</tr>\n<tr>\n<td>firstName</td>\n<td>body</td>\n<td>string (max 255)</td>\n<td>No</td>\n<td>First name. Takes precedence over <code>name</code></td>\n</tr>\n<tr>\n<td>lastName</td>\n<td>body</td>\n<td>string|null (max 255)</td>\n<td>No</td>\n<td>Last name. Only used together with <code>firstName</code></td>\n</tr>\n<tr>\n<td>email</td>\n<td>body</td>\n<td>string (email, max 255)</td>\n<td>No</td>\n<td>Updated email</td>\n</tr>\n<tr>\n<td>role</td>\n<td>body</td>\n<td>string</td>\n<td>No</td>\n<td><code>user</code>, <code>organisation-admin</code>, <code>billing-admin</code>, <code>technical-partner</code> or <code>solution-partner</code>. Unknown values fall back to <code>user</code>; <code>super-admin</code> is rejected (400). Service accounts only</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>204 No Content</strong></p>\n<h3 id=\"error-responses\">Error Responses</h3>\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>400</td>\n<td>Invalid UUID or super-admin role</td>\n</tr>\n<tr>\n<td>403</td>\n<td>The user does not belong to the organisation, an end user is updating another user, or an end user is changing a role</td>\n</tr>\n<tr>\n<td>404</td>\n<td>Organisation not found: <code>{\"message\": \"Organisation not found\"}</code></td>\n</tr>\n<tr>\n<td>422</td>\n<td>Validation failed: <code>{\"message\": \"...\", \"errors\": {\"field\": [\"...\"]}}</code></td>\n</tr>\n<tr>\n<td>500</td>\n<td>The email is already used by another user</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>End users can only update themselves and cannot change roles.</li>\n<li>Name handling: when <code>firstName</code> is present, <code>lastName</code> is used as given (omitting it sets it to <code>null</code>). Otherwise <code>name</code> is split on the first space.</li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["users",":uuid"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[{"description":{"content":"<p>User UUID</p>\n","type":"text/plain"},"type":"any","value":"","key":"uuid"}]}},"response":[],"_postman_id":"bb24f001-7a6b-44a5-837a-6059e9d01cd2"},{"name":"Delete user","id":"05201fb0-40ba-44b0-8046-ca38efbe6a7e","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/users/:uuid/delete","description":"<p>Remove a user from the organisation.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>uuid</td>\n<td>path</td>\n<td>string (UUID)</td>\n<td>Yes</td>\n<td>User UUID to delete</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>202 Accepted</strong> — deletion is queued and runs asynchronously.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"message\": \"User deletion started\" }\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\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>403</td>\n<td>End user attempting delete</td>\n</tr>\n<tr>\n<td>409</td>\n<td>The user is the organisation's billing admin and other members remain. Transfer billing first</td>\n</tr>\n<tr>\n<td>500</td>\n<td>Tenant (<code>X-Tenant-ID</code>) not found, or the user is not in that tenant (<code>Invalid tenant</code> / <code>Invalid user</code>; <code>An error occurred</code> in production)</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>409 body</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"code\": 409,\n  \"error\": \"This person is your billing admin. Transfer billing to someone else before deleting them.\",\n  \"reason\": \"billing_admin_must_be_transferred\"\n}\n</code></pre>\n<p>Branch on <code>reason</code>, not on <code>error</code>: the message is localised.</p>\n<h3 id=\"notes\">Notes</h3>\n<ul>\n<li>Only service accounts can delete users.</li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["users",":uuid","delete"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[{"description":{"content":"<p>User UUID</p>\n","type":"text/plain"},"type":"any","value":"","key":"uuid"}]}},"response":[],"_postman_id":"05201fb0-40ba-44b0-8046-ca38efbe6a7e"},{"name":"Invite user","id":"f8bda0ca-44c6-4325-b0cb-5240e8a1e67a","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"John Doe\",\n  \"email\": \"john@company.com\",\n  \"role\": \"user\",\n  \"bypass\": false\n}"},"url":"https://app.claritalk.com/api/users/invite","description":"<p>Invite a new user to the organisation. An invitation email is sent automatically.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>name</td>\n<td>body</td>\n<td>string</td>\n<td>Yes</td>\n<td>Full name</td>\n</tr>\n<tr>\n<td>email</td>\n<td>body</td>\n<td>string</td>\n<td>Yes</td>\n<td>Email address</td>\n</tr>\n<tr>\n<td>role</td>\n<td>body</td>\n<td>string</td>\n<td>No</td>\n<td>Role to assign</td>\n</tr>\n<tr>\n<td>bypass</td>\n<td>body</td>\n<td>boolean</td>\n<td>No</td>\n<td>Skip invitation email (default: <code>false</code>)</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Invitation sent\",\n  \"user\": {\n    \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"name\": \"John Doe\",\n    \"email\": \"john@company.com\",\n    \"locale\": \"en\",\n    \"createdAt\": \"2025-01-15 10:00:00\",\n    \"updatedAt\": \"2025-01-15 10:00:00\"\n  }\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\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>403</td>\n<td>End user attempting invite</td>\n</tr>\n<tr>\n<td>404</td>\n<td>Organisation not found</td>\n</tr>\n<tr>\n<td>422</td>\n<td>Creation failed</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>Only service accounts can invite users.</li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["users","invite"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[]}},"response":[],"_postman_id":"f8bda0ca-44c6-4325-b0cb-5240e8a1e67a"}],"id":"26e29073-ccba-42ec-b28d-b211abd3aa3f","description":"<p>Manage users within your organisation. The <code>/user/me</code> endpoint returns the authenticated user's profile including role and permissions.</p>\n","_postman_id":"26e29073-ccba-42ec-b28d-b211abd3aa3f","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}}},{"name":"Organisation / Tenant","item":[{"name":"List organisations","id":"9862189e-b0b6-4a42-b3b7-3050d50e37d8","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/organisations/list","description":"<p>List all organisations accessible to the authenticated user, including child organisations.</p>\n<h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"id\": 1,\n    \"uuid\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"name\": \"Acme Corp\",\n    \"domain\": \"acme.com\",\n    \"children\": []\n  }\n]\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\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>404</td>\n<td>Organisation not found</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["organisations","list"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[]}},"response":[],"_postman_id":"9862189e-b0b6-4a42-b3b7-3050d50e37d8"},{"name":"Create organisation","id":"03cda5bc-c4e8-44e4-9904-360be4068858","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"New Division\",\n  \"domain\": \"division.acme.com\",\n  \"parent_uuid\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"webhook_url\": \"https://hooks.example.com/claritalk\"\n}"},"url":"https://app.claritalk.com/api/organisations","description":"<p>Create a new child organisation. Optionally register a webhook URL (creates an OAuth client).</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>name</td>\n<td>body</td>\n<td>string (max 255, must be unique)</td>\n<td>Yes</td>\n<td>Organisation name</td>\n</tr>\n<tr>\n<td>domain</td>\n<td>body</td>\n<td>string</td>\n<td>Yes</td>\n<td>Company domain. Free-mail and disposable domains are rejected. Stored lowercased and trimmed</td>\n</tr>\n<tr>\n<td>parent_uuid</td>\n<td>body</td>\n<td>string (UUID)</td>\n<td>Yes</td>\n<td>Parent organisation UUID</td>\n</tr>\n<tr>\n<td>webhook_url</td>\n<td>body</td>\n<td>string (URL)</td>\n<td>No</td>\n<td>Webhook callback URL (creates OAuth client)</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>201 Created</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"message\": \"Organisation created\" }\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\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>400</td>\n<td>Missing required fields</td>\n</tr>\n<tr>\n<td>400</td>\n<td><code>domain</code> is empty or not a string (<code>Invalid domain parameter</code>), or a free-mail / disposable domain such as gmail.com (<code>Domain not allowed</code>)</td>\n</tr>\n<tr>\n<td>403</td>\n<td>End user attempting create</td>\n</tr>\n<tr>\n<td>404</td>\n<td>Tenant (<code>X-Tenant-ID</code>) not found (<code>Invalid tenant</code>)</td>\n</tr>\n<tr>\n<td>500</td>\n<td>No organisation matches <code>parent_uuid</code>; an organisation with the same name already exists; <code>name</code> empty or over 255 characters (<code>An error occurred</code> in production)</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>Only service accounts can create organisations.</li>\n<li>The response does not include the new organisation's UUID or the OAuth client created for <code>webhook_url</code>; look them up afterwards.</li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["organisations"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[]}},"response":[],"_postman_id":"03cda5bc-c4e8-44e4-9904-360be4068858"}],"id":"281a567e-dcd2-4bec-8675-08d1dc057410","description":"<p>Manage organisations and their settings.</p>\n","_postman_id":"281a567e-dcd2-4bec-8675-08d1dc057410","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}}},{"name":"Meeting Subjects / Types","item":[{"name":"List meeting types","id":"2c973a63-d4af-49a8-b368-1d0dcd2ad3d2","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/types/list","description":"<p>List all meeting types for the organisation.</p>\n<h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  { \"id\": 1, \"name\": \"Sales Call\", \"is_default\": true },\n  { \"id\": 2, \"name\": \"Interview\", \"is_default\": false }\n]\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\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>404</td>\n<td>Organisation not found</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["types","list"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[]}},"response":[],"_postman_id":"2c973a63-d4af-49a8-b368-1d0dcd2ad3d2"},{"name":"Create or update meeting type","id":"60fd2db6-747e-45eb-bc3f-1250807c1245","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 0,\n  \"name\": \"Sales Call\",\n  \"is_default\": false\n}"},"url":"https://app.claritalk.com/api/types","description":"<p>Create a new meeting type or update an existing one.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>id</td>\n<td>body</td>\n<td>integer</td>\n<td>No</td>\n<td><code>0</code> or omit for create, existing ID for update</td>\n</tr>\n<tr>\n<td>name</td>\n<td>body</td>\n<td>string</td>\n<td>Yes</td>\n<td>Meeting type name</td>\n</tr>\n<tr>\n<td>is_default</td>\n<td>body</td>\n<td>boolean</td>\n<td>No</td>\n<td>Mark as default (default: <code>false</code>)</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong> — The meeting type object.</p>\n<h3 id=\"error-responses\">Error Responses</h3>\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>400</td>\n<td>Missing name</td>\n</tr>\n<tr>\n<td>404</td>\n<td>Organisation not found</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["types"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[]}},"response":[],"_postman_id":"60fd2db6-747e-45eb-bc3f-1250807c1245"},{"name":"Delete meeting type","id":"1ce547a4-b6c3-40e7-aa8e-e83be2e85072","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/types/:id","description":"<p>Delete a meeting type.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>id</td>\n<td>path</td>\n<td>integer</td>\n<td>Yes</td>\n<td>Meeting type ID</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong> — Empty JSON response.</p>\n<h3 id=\"error-responses\">Error Responses</h3>\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>404</td>\n<td>Meeting type not found</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["types",":id"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[{"description":{"content":"<p>Meeting type ID</p>\n","type":"text/plain"},"type":"any","value":"","key":"id"}]}},"response":[],"_postman_id":"1ce547a4-b6c3-40e7-aa8e-e83be2e85072"}],"id":"22936c8e-e5ad-4744-b63d-fe0f90759513","description":"<p>Meeting types categorize meetings within your organisation (e.g., Sales Call, Interview).</p>\n","_postman_id":"22936c8e-e5ad-4744-b63d-fe0f90759513","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}}},{"name":"Meeting Themes","item":[{"name":"List meeting themes","id":"c70f4e7b-ea0c-411a-8f02-1f761ce28b6b","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/themes/list","description":"<p>List all meeting themes for the organisation.</p>\n<h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong> — Array of theme objects.</p>\n<h3 id=\"error-responses\">Error Responses</h3>\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>404</td>\n<td>Organisation not found</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["themes","list"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[]}},"response":[],"_postman_id":"c70f4e7b-ea0c-411a-8f02-1f761ce28b6b"},{"name":"Create or update meeting theme","id":"1cb61e4b-6994-4b9b-b497-7a152e4e19ba","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 0,\n  \"name\": \"Discovery Questions\",\n  \"type_id\": 1\n}"},"url":"https://app.claritalk.com/api/themes","description":"<p>Create a new theme or update an existing one.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>id</td>\n<td>body</td>\n<td>integer</td>\n<td>No</td>\n<td><code>0</code> or omit for create</td>\n</tr>\n<tr>\n<td>name</td>\n<td>body</td>\n<td>string</td>\n<td>Yes</td>\n<td>Theme name</td>\n</tr>\n<tr>\n<td>type_id</td>\n<td>body</td>\n<td>integer</td>\n<td>Yes</td>\n<td>Meeting type ID</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong> — The theme object.</p>\n<h3 id=\"error-responses\">Error Responses</h3>\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>400</td>\n<td>Missing name or type_id</td>\n</tr>\n<tr>\n<td>404</td>\n<td>Organisation or meeting type not found</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["themes"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[]}},"response":[],"_postman_id":"1cb61e4b-6994-4b9b-b497-7a152e4e19ba"},{"name":"Delete meeting theme","id":"e90e8016-516c-4492-b347-4d0e15f12444","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/themes/:id","description":"<p>Delete a meeting theme.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>id</td>\n<td>path</td>\n<td>integer</td>\n<td>Yes</td>\n<td>Theme ID</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong> — Empty JSON response.</p>\n<h3 id=\"error-responses\">Error Responses</h3>\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>404</td>\n<td>Theme not found</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["themes",":id"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[{"description":{"content":"<p>Theme ID</p>\n","type":"text/plain"},"type":"any","value":"","key":"id"}]}},"response":[],"_postman_id":"e90e8016-516c-4492-b347-4d0e15f12444"}],"id":"d0efd9b5-0258-4400-af46-591e41334f18","description":"<p>Themes group questions under a meeting type.</p>\n","_postman_id":"d0efd9b5-0258-4400-af46-591e41334f18","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}}},{"name":"Meeting Questions","item":[{"name":"List questions for theme","id":"456260f7-5c6f-4b97-8847-f861aa8c0e4c","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/themes/:themeId/questions/list","description":"<p>List all questions linked to a theme.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>themeId</td>\n<td>path</td>\n<td>integer</td>\n<td>Yes</td>\n<td>Theme ID</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong> — Array of question objects.</p>\n<h3 id=\"error-responses\">Error Responses</h3>\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>403</td>\n<td>Insufficient permissions</td>\n</tr>\n<tr>\n<td>404</td>\n<td>Theme not found</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>Requires <code>organisation_settings_meeting_question_viewlist</code> permission.</li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["themes",":themeId","questions","list"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[{"description":{"content":"<p>Theme ID</p>\n","type":"text/plain"},"type":"any","value":"","key":"themeId"}]}},"response":[],"_postman_id":"456260f7-5c6f-4b97-8847-f861aa8c0e4c"},{"name":"Create or update question","id":"c908fede-94f1-4b8c-b91b-95529cbbc50d","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 0,\n  \"question\": \"What is the client's main pain point?\",\n  \"output_type\": \"single_line\"\n}"},"url":"https://app.claritalk.com/api/themes/:themeId/questions","description":"<p>Create or update a question under a theme.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>themeId</td>\n<td>path</td>\n<td>integer</td>\n<td>Yes</td>\n<td>Theme ID</td>\n</tr>\n<tr>\n<td>id</td>\n<td>body</td>\n<td>integer</td>\n<td>No</td>\n<td><code>0</code> or omit for create</td>\n</tr>\n<tr>\n<td>question</td>\n<td>body</td>\n<td>string</td>\n<td>Yes</td>\n<td>Question text</td>\n</tr>\n<tr>\n<td>output_type</td>\n<td>body</td>\n<td>string</td>\n<td>No</td>\n<td><code>single_line</code> (default) or <code>multi_line</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong> — The question object.</p>\n<h3 id=\"error-responses\">Error Responses</h3>\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>400</td>\n<td>Missing or invalid question</td>\n</tr>\n<tr>\n<td>404</td>\n<td>Theme not found</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["themes",":themeId","questions"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[{"description":{"content":"<p>Theme ID</p>\n","type":"text/plain"},"type":"any","value":"","key":"themeId"}]}},"response":[],"_postman_id":"c908fede-94f1-4b8c-b91b-95529cbbc50d"},{"name":"Delete question","id":"93759585-5491-48cf-8353-97f5e68225b7","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/themes/:themeId/questions/:questionId","description":"<p>Delete a question from a theme.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>themeId</td>\n<td>path</td>\n<td>integer</td>\n<td>Yes</td>\n<td>Theme ID</td>\n</tr>\n<tr>\n<td>questionId</td>\n<td>path</td>\n<td>integer</td>\n<td>Yes</td>\n<td>Question ID</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong> — Empty JSON response.</p>\n<h3 id=\"error-responses\">Error Responses</h3>\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>403</td>\n<td>Insufficient permissions</td>\n</tr>\n<tr>\n<td>404</td>\n<td>Question not found</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>Requires <code>organisation_settings_meeting_question_delete</code> permission.</li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["themes",":themeId","questions",":questionId"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[{"description":{"content":"<p>Theme ID</p>\n","type":"text/plain"},"type":"any","value":"","key":"themeId"},{"description":{"content":"<p>Question ID</p>\n","type":"text/plain"},"type":"any","value":"","key":"questionId"}]}},"response":[],"_postman_id":"93759585-5491-48cf-8353-97f5e68225b7"}],"id":"e51c5c43-063b-48ff-9762-82b174bae15b","description":"<p>Questions linked to meeting themes. Questions are automatically copied to meetings when created.</p>\n","_postman_id":"e51c5c43-063b-48ff-9762-82b174bae15b","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}}},{"name":"Meeting","item":[{"name":"List meetings","id":"85e08fc8-6097-4bca-9278-31c8e68f6163","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/meetings/list?limit=10&offset=0&order=desc","description":"<p>List meetings with pagination and optional filters.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>limit</td>\n<td>query</td>\n<td>integer</td>\n<td>No</td>\n<td>Max results (default: <code>10</code>)</td>\n</tr>\n<tr>\n<td>offset</td>\n<td>query</td>\n<td>integer</td>\n<td>No</td>\n<td>Pagination offset (default: <code>0</code>)</td>\n</tr>\n<tr>\n<td>order</td>\n<td>query</td>\n<td>string</td>\n<td>No</td>\n<td><code>asc</code> or <code>desc</code> (default: <code>desc</code>)</td>\n</tr>\n<tr>\n<td>date_start</td>\n<td>query</td>\n<td>string</td>\n<td>No</td>\n<td>Filter from date (ISO format)</td>\n</tr>\n<tr>\n<td>date_end</td>\n<td>query</td>\n<td>string</td>\n<td>No</td>\n<td>Filter until date (ISO format)</td>\n</tr>\n<tr>\n<td>status</td>\n<td>query</td>\n<td>string</td>\n<td>No</td>\n<td>Filter by status (comma-separated)</td>\n</tr>\n<tr>\n<td>q</td>\n<td>query</td>\n<td>string</td>\n<td>No</td>\n<td>Search meeting names (contains match, case-insensitive). Trimmed and cut to 255 characters. Combines with the status and date filters.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"userId\": 1,\n    \"userUuid\": \"...\",\n    \"name\": \"Weekly standup\",\n    \"status\": \"finished\",\n    \"summary_quality_flag\": false,\n    \"locale\": \"en\",\n    \"createdAt\": \"2025-01-15 10:00:00\",\n    \"updatedAt\": \"2025-01-15 11:00:00\"\n  }\n]\n</code></pre>\n<h3 id=\"response-headers\">Response Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Header</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>X-Total-Meetings-Of-User</td>\n<td>Total meeting count</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>End users see only their accessible meetings. Service accounts see all.</li>\n<li><code>q</code> searches within the meetings the caller can access; it does not widen access.</li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["meetings","list"],"host":["https://app.claritalk.com/api"],"query":[{"description":{"content":"<p>Max results (default: 10)</p>\n","type":"text/plain"},"key":"limit","value":"10"},{"description":{"content":"<p>Pagination offset (default: 0)</p>\n","type":"text/plain"},"key":"offset","value":"0"},{"description":{"content":"<p>Sort order: asc or desc (default: desc)</p>\n","type":"text/plain"},"key":"order","value":"desc"},{"disabled":true,"description":{"content":"<p>Filter from date (ISO format)</p>\n","type":"text/plain"},"key":"date_start","value":""},{"disabled":true,"description":{"content":"<p>Filter to date (ISO format)</p>\n","type":"text/plain"},"key":"date_end","value":""},{"disabled":true,"description":{"content":"<p>Filter by status (comma-separated)</p>\n","type":"text/plain"},"key":"status","value":""},{"disabled":true,"description":{"content":"<p>Search meeting names (contains match, case-insensitive). Trimmed, max 255 characters.</p>\n","type":"text/plain"},"key":"q","value":"standup"}],"variable":[]}},"response":[],"_postman_id":"85e08fc8-6097-4bca-9278-31c8e68f6163"},{"name":"Retrieve meeting","id":"699c2f73-d3dd-4509-849c-b69fb4d713dd","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/meetings/:id","description":"<p>Retrieve a single meeting by UUID or numeric ID.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>id</td>\n<td>path</td>\n<td>string</td>\n<td>Yes</td>\n<td>Meeting UUID or numeric ID</td>\n</tr>\n<tr>\n<td>detail</td>\n<td>query</td>\n<td>string</td>\n<td>No</td>\n<td>Has no effect: <code>metadata</code> is always returned</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Header</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>X-CLARITALK-CONNECT</td>\n<td>Set to <code>1</code> to include <code>recording_type</code> in response</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"userId\": \"...\",\n  \"name\": \"Weekly standup\",\n  \"status\": \"finished\",\n  \"phase\": \"processed\",\n  \"upload\": null,\n  \"locale\": \"en\",\n  \"summary\": \"...\",\n  \"summary_quality_flag\": false,\n  \"summaries\": [\n    { \"type\": \"general\", \"content\": \"...\" }\n  ],\n  \"todos\": [\n    { \"id\": 1, \"task\": \"Send the proposal\", \"is_completed\": false, \"topics\": [], \"attendee\": [], \"due_date\": null }\n  ],\n  \"questions\": [],\n  \"discussionTopics\": [],\n  \"attendees\": [],\n  \"type_id\": 1,\n  \"dossier_id\": \"\",\n  \"team_ids\": [],\n  \"createdAt\": \"2025-01-15 10:00:00\",\n  \"updatedAt\": \"2025-01-15 11:00:00\",\n  \"metadata\": {},\n  \"allow_audio_recording\": true\n}\n</code></pre>\n<h3 id=\"response-fields\">Response fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>summary_quality_flag</td>\n<td>boolean</td>\n<td>Summary quality warning flag</td>\n</tr>\n<tr>\n<td>summaries</td>\n<td>object[]</td>\n<td>All generated summaries: <code>[{\"type\": \"general\", \"content\": \"...\"}]</code>. <code>summary</code> is the <code>general</code> one</td>\n</tr>\n<tr>\n<td>todos</td>\n<td>object[]</td>\n<td>Action items: <code>[{\"id\", \"task\", \"is_completed\", \"topics\", \"attendee\", \"due_date\"}]</code></td>\n</tr>\n<tr>\n<td>dossier_id</td>\n<td>string</td>\n<td>Linked dossier id, or <code>\"\"</code> when there is none</td>\n</tr>\n<tr>\n<td>team_ids</td>\n<td>object[]</td>\n<td>Linked teams as <strong>objects</strong> (<code>id</code>, <code>name</code>, <code>description</code>, <code>organisation_id</code>, <code>parent_id</code>, timestamps, <code>pivot</code>), despite the name</td>\n</tr>\n<tr>\n<td>allow_audio_recording</td>\n<td>boolean</td>\n<td>Resolved server-side: always <code>false</code> when the organisation has audio recording disabled, whatever was stored</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"new-fields\">New fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>phase</td>\n<td>string</td>\n<td>Explicit lifecycle phase of the meeting (see table below). Prefer this over <code>status</code></td>\n</tr>\n<tr>\n<td>upload</td>\n<td>object | null</td>\n<td>Progress of a chunk upload in flight (see <em>Upload audio chunk</em>). <code>null</code> when no upload is tracked</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong><code>phase</code> values</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><code>phase</code></th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>draft</code></td>\n<td>Draft that was never recorded</td>\n</tr>\n<tr>\n<td><code>scheduled</code></td>\n<td>Not recorded yet</td>\n</tr>\n<tr>\n<td><code>recording</code></td>\n<td>Audio is being captured (or paused mid-capture)</td>\n</tr>\n<tr>\n<td><code>uploading</code></td>\n<td>Capture is done; the audio chunks are still being uploaded</td>\n</tr>\n<tr>\n<td><code>processing</code></td>\n<td>All audio is on the server; transcription / AI processing is running</td>\n</tr>\n<tr>\n<td><code>processed</code></td>\n<td>Processing finished</td>\n</tr>\n<tr>\n<td><code>failed</code></td>\n<td>Processing failed for good</td>\n</tr>\n<tr>\n<td><code>archived</code></td>\n<td>Meeting is archived</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong><code>status</code> values</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><code>status</code></th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>draft</code></td>\n<td>Draft, or audio still uploading (<code>phase: uploading</code>)</td>\n</tr>\n<tr>\n<td><code>in progress</code></td>\n<td>Recording or processing</td>\n</tr>\n<tr>\n<td><code>finished</code></td>\n<td>Processed successfully</td>\n</tr>\n<tr>\n<td><code>failed</code></td>\n<td>Processing failed for good. Stop polling this meeting</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>status</code> is kept for existing clients; new integrations should use <code>phase</code>. Ignore response fields you do not recognise, as fields may be added.</p>\n<h3 id=\"error-responses\">Error Responses</h3>\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>403</td>\n<td>No access to this meeting</td>\n</tr>\n<tr>\n<td>404</td>\n<td>Meeting or organisation not found</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["meetings",":id"],"host":["https://app.claritalk.com/api"],"query":[{"disabled":true,"description":{"content":"<p>Include full metadata</p>\n","type":"text/plain"},"key":"detail","value":"true"}],"variable":[{"description":{"content":"<p>Meeting UUID or numeric ID</p>\n","type":"text/plain"},"type":"any","value":"","key":"id"}]}},"response":[],"_postman_id":"699c2f73-d3dd-4509-849c-b69fb4d713dd"},{"name":"Create or update meeting","id":"16fc60b2-0da2-4bcc-b594-196cb66cd8c2","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Weekly standup\",\n  \"user_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"type_id\": 1,\n  \"theme_ids\": [],\n  \"attendees\": [\n    { \"name\": \"Jane Doe\", \"integration_id\": \"ext-123\" }\n  ],\n  \"discussion_topics\": [\n    { \"topic\": \"Q1 revenue targets\", \"integration_id\": \"topic-1\", \"description\": \"Review progress\" }\n  ],\n  \"locale\": \"en\",\n  \"allow_audio_recording\": true\n}"},"url":"https://app.claritalk.com/api/meetings","description":"<p>Create a new meeting or update an existing one.</p>\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Header</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>X-CLARITALK-CONNECT</td>\n<td>Set to <code>1</code> to include <code>numeric_id</code> in response</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>name</td>\n<td>body</td>\n<td>string (max 500)</td>\n<td>Yes, unless <code>id</code> is sent</td>\n<td>Meeting name</td>\n</tr>\n<tr>\n<td>user_id</td>\n<td>body</td>\n<td>string (UUID)</td>\n<td>Yes</td>\n<td>Owner user UUID</td>\n</tr>\n<tr>\n<td>id</td>\n<td>body</td>\n<td>string (UUID)</td>\n<td>No</td>\n<td>Existing meeting UUID to update. An unknown UUID creates a <strong>new</strong> meeting with a server-generated id</td>\n</tr>\n<tr>\n<td>type_id</td>\n<td>body</td>\n<td>integer</td>\n<td>No</td>\n<td>Meeting type ID (defaults to org default)</td>\n</tr>\n<tr>\n<td>theme_ids</td>\n<td>body</td>\n<td>integer[]</td>\n<td>No</td>\n<td>Theme IDs (empty array = all themes for type)</td>\n</tr>\n<tr>\n<td>attendees</td>\n<td>body</td>\n<td>object[]</td>\n<td>No</td>\n<td><code>[{\"name\": \"...\", \"integration_id\": \"...\", \"id\": 1}]</code>. <code>name</code> and <code>integration_id</code> are required strings (not null)</td>\n</tr>\n<tr>\n<td>metadata</td>\n<td>body</td>\n<td>object</td>\n<td>No</td>\n<td>Custom metadata</td>\n</tr>\n<tr>\n<td>status</td>\n<td>body</td>\n<td>string</td>\n<td>No</td>\n<td>One of the internal meeting status values (e.g. <code>Meeting in draft</code>, <code>Meeting scheduled</code>). Statuses cannot move backwards once processing has started</td>\n</tr>\n<tr>\n<td>recording_type</td>\n<td>body</td>\n<td>string</td>\n<td>No</td>\n<td><code>web</code>, <code>act-web</code>, <code>act-teams</code>, <code>act-api</code>, <code>act</code>, <code>mobile</code>. Defaults to <code>act-api</code>. <code>act-teams</code> cannot be created through this endpoint (see errors)</td>\n</tr>\n<tr>\n<td>dossier_id</td>\n<td>body</td>\n<td>string</td>\n<td>No</td>\n<td>Associated dossier</td>\n</tr>\n<tr>\n<td>team_ids</td>\n<td>body</td>\n<td>string[]</td>\n<td>No</td>\n<td>Team UUIDs</td>\n</tr>\n<tr>\n<td>discussion_topics</td>\n<td>body</td>\n<td>object[]</td>\n<td>No</td>\n<td><code>[{\"topic\": \"...\", \"integration_id\": \"...\", \"description\": \"...\"}]</code>. <code>topic</code> and <code>integration_id</code> are required strings</td>\n</tr>\n<tr>\n<td>locale</td>\n<td>body</td>\n<td>string (max 10)</td>\n<td>No</td>\n<td>Language locale. Defaults to the user's locale</td>\n</tr>\n<tr>\n<td>duration_in_seconds</td>\n<td>body</td>\n<td>integer (min 1)</td>\n<td>No</td>\n<td>Expected duration</td>\n</tr>\n<tr>\n<td>stop_time</td>\n<td>body</td>\n<td>string</td>\n<td>No</td>\n<td>Stop time (ISO datetime)</td>\n</tr>\n<tr>\n<td>allow_audio_recording</td>\n<td>body</td>\n<td>boolean</td>\n<td>No</td>\n<td>Allow audio recording</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"userId\": \"...\",\n  \"name\": \"Weekly standup\",\n  \"status\": \"draft\",\n  \"phase\": \"draft\",\n  \"upload\": null,\n  \"locale\": \"en\",\n  \"questions\": [],\n  \"discussionTopics\": [],\n  \"attendees\": [],\n  \"summary_quality_flag\": false,\n  \"summary\": \"\",\n  \"summaries\": [],\n  \"todos\": [],\n  \"type_id\": 1,\n  \"dossier_id\": null,\n  \"team_ids\": null,\n  \"createdAt\": \"2025-01-15 10:00:00\",\n  \"updatedAt\": \"2025-01-15 10:00:00\",\n  \"metadata\": {},\n  \"allow_audio_recording\": true\n}\n</code></pre>\n<h3 id=\"new-fields\">New fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>phase</td>\n<td>string</td>\n<td>Explicit lifecycle phase of the meeting (see table below). Prefer this over <code>status</code></td>\n</tr>\n<tr>\n<td>upload</td>\n<td>object | null</td>\n<td>Always <code>null</code> in this response. Read upload progress from <code>GET /meetings/:id</code></td>\n</tr>\n</tbody>\n</table>\n</div><p><strong><code>phase</code> values</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><code>phase</code></th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>draft</code></td>\n<td>Draft that was never recorded</td>\n</tr>\n<tr>\n<td><code>scheduled</code></td>\n<td>Not recorded yet</td>\n</tr>\n<tr>\n<td><code>recording</code></td>\n<td>Audio is being captured (or paused mid-capture)</td>\n</tr>\n<tr>\n<td><code>uploading</code></td>\n<td>Capture is done; the audio chunks are still being uploaded</td>\n</tr>\n<tr>\n<td><code>processing</code></td>\n<td>All audio is on the server; transcription / AI processing is running</td>\n</tr>\n<tr>\n<td><code>processed</code></td>\n<td>Processing finished</td>\n</tr>\n<tr>\n<td><code>failed</code></td>\n<td>Processing failed for good</td>\n</tr>\n<tr>\n<td><code>archived</code></td>\n<td>Meeting is archived</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong><code>status</code> values</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><code>status</code></th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>draft</code></td>\n<td>Draft, or audio still uploading (<code>phase: uploading</code>)</td>\n</tr>\n<tr>\n<td><code>in progress</code></td>\n<td>Recording or processing</td>\n</tr>\n<tr>\n<td><code>finished</code></td>\n<td>Processed successfully</td>\n</tr>\n<tr>\n<td><code>failed</code></td>\n<td>Processing failed for good. Stop polling this meeting</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>status</code> is kept for existing clients; new integrations should use <code>phase</code>. Ignore response fields you do not recognise, as fields may be added.</p>\n<h3 id=\"error-responses\">Error Responses</h3>\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>422</td>\n<td>Validation failed: <code>{\"message\": \"...\", \"errors\": {\"field\": [\"...\"]}}</code></td>\n</tr>\n<tr>\n<td>403</td>\n<td>End user creating for another user</td>\n</tr>\n<tr>\n<td>403</td>\n<td>Updating a Teams bot meeting on behalf of someone other than its owner: <code>{\"code\": 403, \"error\": \"Only the owner can update a Teams bot meeting\"}</code></td>\n</tr>\n<tr>\n<td>403 / 422</td>\n<td><code>recording_type: act-teams</code> on create: 403 when the organisation has no Teams bot meetings, otherwise 422. The API cannot supply a calendar event, so this always fails</td>\n</tr>\n<tr>\n<td>404</td>\n<td>Organisation or user not found</td>\n</tr>\n<tr>\n<td>409</td>\n<td><code>{\"code\": 409, \"error\": \"User already has a recording state.\"}</code>, or <code>\"The Teams bot meeting changed, please retry\"</code></td>\n</tr>\n<tr>\n<td>422</td>\n<td>Resuming a meeting paused for more than 14 days: <code>{\"code\": 422, \"error\": \"Paused meeting expired; cannot resume after 14 days\"}</code></td>\n</tr>\n<tr>\n<td>500</td>\n<td>Unknown <code>theme_ids</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>While the audio is uploading (<code>phase: uploading</code>), a <code>status</code> that would move the meeting back (e.g. to draft or ongoing) is ignored.</li>\n<li>End users can only create meetings for themselves.</li>\n<li>Questions are automatically copied from selected themes.</li>\n<li><code>team_ids</code> is always <code>null</code> in this response; read the linked teams from <code>GET /meetings/:id</code>.</li>\n<li><code>allow_audio_recording</code> in the response is the resolved value: always <code>false</code> when the organisation has audio recording disabled.</li>\n<li>An unknown <code>type_id</code> falls back to the organisation's default type.</li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["meetings"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[]}},"response":[],"_postman_id":"16fc60b2-0da2-4bcc-b594-196cb66cd8c2"},{"name":"Delete meeting","id":"6b0baf6a-727c-4d22-b137-5481a7156062","request":{"method":"DELETE","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/meetings/:meetingId","description":"<p>Delete a meeting.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>meetingId</td>\n<td>path</td>\n<td>string (UUID)</td>\n<td>Yes</td>\n<td>Meeting UUID</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>204 No Content</strong></p>\n<h3 id=\"error-responses\">Error Responses</h3>\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>400</td>\n<td>Invalid UUID</td>\n</tr>\n<tr>\n<td>403</td>\n<td>No access to meeting</td>\n</tr>\n<tr>\n<td>404</td>\n<td>Meeting not found</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>End users can delete any meeting they can see (owner, shared, team access). Service accounts can delete any meeting in the organisation.</li>\n<li>Teams bot meetings (Claritalk Connect for Teams):<ul>\n<li>A colleague the meeting is shared with only <strong>leaves</strong> it: their access is removed, the meeting, bot and owner are untouched. Still <code>204</code>.</li>\n<li>When the owner (or a service account) deletes a bot meeting that has not started recording, it is <strong>handed over</strong> to an eligible colleague instead of deleted, if one exists. Still <code>204</code>; the meeting keeps existing under the new owner.</li>\n</ul>\n</li>\n<li><code>204</code> therefore means \"you no longer have this meeting\", not always \"the meeting was deleted\".</li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["meetings",":meetingId"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[{"description":{"content":"<p>Meeting UUID</p>\n","type":"text/plain"},"type":"any","value":"","key":"meetingId"}]}},"response":[],"_postman_id":"6b0baf6a-727c-4d22-b137-5481a7156062"},{"name":"Upload audio chunk","id":"306ac86b-004a-42dd-9411-63011f00d3f2","request":{"method":"POST","header":[{"key":"Accept","value":"application/json"}],"body":{"mode":"formdata","formdata":[{"key":"audio_chunk","type":"file","description":"<p>Audio file chunk (max 5MB)</p>\n","value":null},{"key":"chunk_number","value":"1","type":"text","description":"<p>Current chunk number (1-based)</p>\n"},{"key":"total_chunks","value":"1","type":"text","description":"<p>Total chunks (constant for the whole upload)</p>\n"},{"key":"checksum","value":"","type":"text","description":"<p>SHA256 checksum</p>\n","disabled":true},{"key":"duration_in_seconds","value":"","type":"text","description":"<p>Duration (send with every chunk)</p>\n","disabled":true},{"key":"stop_time","value":"","type":"text","description":"<p>Stop time ISO (send with every chunk)</p>\n","disabled":true}]},"url":"https://app.claritalk.com/api/meetings/:id/upload","description":"<p>Upload the audio of a recording in chunks. Processing starts automatically once <strong>every</strong> chunk from 1 to <code>total_chunks</code> has been received.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>id</td>\n<td>path</td>\n<td>string (UUID)</td>\n<td>Yes</td>\n<td>Meeting UUID</td>\n</tr>\n<tr>\n<td>audio_chunk</td>\n<td>form-data</td>\n<td>file</td>\n<td>Yes</td>\n<td>Audio chunk (max 5MB)</td>\n</tr>\n<tr>\n<td>chunk_number</td>\n<td>form-data</td>\n<td>integer</td>\n<td>Yes</td>\n<td>Current chunk, <strong>1-based</strong> (<code>1</code> … <code>total_chunks</code>)</td>\n</tr>\n<tr>\n<td>total_chunks</td>\n<td>form-data</td>\n<td>integer</td>\n<td>Yes</td>\n<td>Total number of chunks, ≥ 1. Must stay the same for every chunk of one upload</td>\n</tr>\n<tr>\n<td>checksum</td>\n<td>form-data</td>\n<td>string</td>\n<td>No</td>\n<td>SHA256 of the chunk. Recommended: it is returned in <code>upload.received_chunks</code> so you can check what the server holds</td>\n</tr>\n<tr>\n<td>duration_in_seconds</td>\n<td>form-data</td>\n<td>integer</td>\n<td>No</td>\n<td>Recording duration. Applied by the request that completes the set of chunks, so send it with every chunk</td>\n</tr>\n<tr>\n<td>stop_time</td>\n<td>form-data</td>\n<td>string</td>\n<td>No</td>\n<td>Stop time (ISO datetime). Applied like <code>duration_in_seconds</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong> — chunk stored. Returns the current <code>phase</code> and the upload progress.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"phase\": \"uploading\",\n  \"upload\": {\n    \"total_chunks\": 3,\n    \"received_count\": 2,\n    \"received_chunks\": [\n      { \"number\": 1, \"checksum\": \"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08\" },\n      { \"number\": 2, \"checksum\": \"60303ae22b998861bce3b28f33eec1be758a213c86c93c076dbe9f558c11c752\" }\n    ],\n    \"missing_chunks\": [3],\n    \"complete\": false\n  }\n}\n</code></pre>\n<p>When the request completes the set, <code>upload.complete</code> is <code>true</code> and <code>phase</code> becomes <code>processing</code>.</p>\n<p><strong><code>upload</code> object</strong></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>total_chunks</td>\n<td>integer</td>\n<td><code>total_chunks</code> of the upload in flight</td>\n</tr>\n<tr>\n<td>received_count</td>\n<td>integer</td>\n<td>Number of chunks the server has stored and verified</td>\n</tr>\n<tr>\n<td>received_chunks</td>\n<td>object[]</td>\n<td><code>[{\"number\": 1, \"checksum\": \"&lt;sha256&gt;\" | null}]</code>, ordered by number</td>\n</tr>\n<tr>\n<td>missing_chunks</td>\n<td>integer[]</td>\n<td>Chunk numbers (1-based) not received yet</td>\n</tr>\n<tr>\n<td>complete</td>\n<td>boolean</td>\n<td><code>true</code> once every chunk from 1 to <code>total_chunks</code> is in</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>upload</code> is <code>null</code> when no upload is being tracked.</p>\n<p><strong>200 OK</strong> — audio already received (the meeting is in <code>processing</code> or <code>processed</code>). The chunk is ignored; treat the upload as done and do not retry.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Meeting audio already uploaded\",\n  \"phase\": \"processing\"\n}\n</code></pre>\n<p><strong><code>phase</code> values</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><code>phase</code></th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>draft</code></td>\n<td>Draft that was never recorded</td>\n</tr>\n<tr>\n<td><code>scheduled</code></td>\n<td>Not recorded yet</td>\n</tr>\n<tr>\n<td><code>recording</code></td>\n<td>Audio is being captured (or paused mid-capture)</td>\n</tr>\n<tr>\n<td><code>uploading</code></td>\n<td>Capture is done; the audio chunks are still being uploaded</td>\n</tr>\n<tr>\n<td><code>processing</code></td>\n<td>All audio is on the server; transcription / AI processing is running</td>\n</tr>\n<tr>\n<td><code>processed</code></td>\n<td>Processing finished</td>\n</tr>\n<tr>\n<td><code>failed</code></td>\n<td>Processing failed for good</td>\n</tr>\n<tr>\n<td><code>archived</code></td>\n<td>Meeting is archived</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Condition</th>\n<th>Body</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>400</td>\n<td>Chunk too large (&gt;5MB)</td>\n<td><code>{\"message\": \"Audio chunk is too large\"}</code></td>\n</tr>\n<tr>\n<td>400</td>\n<td><code>chunk_number</code> &lt; 1, <code>chunk_number</code> &gt; <code>total_chunks</code>, or <code>total_chunks</code> &lt; 1</td>\n<td><code>{\"message\": \"Invalid chunk number\"}</code></td>\n</tr>\n<tr>\n<td>403</td>\n<td>No access to meeting</td>\n<td><code>{\"message\": \"You do not have access to this meeting\"}</code></td>\n</tr>\n<tr>\n<td>404</td>\n<td>Meeting or organisation not found</td>\n<td><code>{\"message\": \"Meeting not found\"}</code></td>\n</tr>\n<tr>\n<td>404</td>\n<td><code>audio_chunk</code>, <code>chunk_number</code> or <code>total_chunks</code> missing</td>\n<td><code>{\"message\": \"Audio chunk not found\"}</code></td>\n</tr>\n<tr>\n<td>409</td>\n<td>Meeting is <code>failed</code> or <code>archived</code> and can no longer receive audio. Create a new meeting to retry</td>\n<td><code>{\"message\": \"Meeting can no longer receive audio\", \"phase\": \"failed\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>Rate limit: 50 requests/minute.</li>\n<li>Chunks may arrive in any order. Processing starts only when <strong>all</strong> chunks are in; sending the last chunk while earlier ones are missing does not start processing. Send the chunks listed in <code>upload.missing_chunks</code> to finish.</li>\n<li>Re-sending a chunk is safe: it replaces the stored copy only after its checksum is verified.</li>\n<li>Changing <code>total_chunks</code> mid-upload discards the chunks tracked so far and starts a new upload.</li>\n<li>To resume an interrupted upload, read <code>upload</code> from <code>GET /meetings/:id</code> (or from the last upload response) and send only the missing chunks.</li>\n<li>The response may gain fields over time; ignore fields you do not recognise.</li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["meetings",":id","upload"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[{"description":{"content":"<p>Meeting UUID</p>\n","type":"text/plain"},"type":"any","value":"","key":"id"}]}},"response":[],"_postman_id":"306ac86b-004a-42dd-9411-63011f00d3f2"},{"name":"List meeting questions","id":"50307d24-0b6a-4729-a04e-b065f9d049ce","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/meeting/:meetingHashedId/questions","description":"<p>List the meeting's themes with their questions — including each question's numeric <code>id</code>, its current <code>answer</code>, <code>output_type</code> and <code>keywords</code>.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>Bearer token required (inherited collection-level OAuth2). Include <code>Authorization: Bearer {token}</code>.</p>\n<p>Requires a <strong>user-bound</strong> token (authorization code / personal token). A service-account (<code>client_credentials</code>) token passes the bearer gate but has no user, so it is refused.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>meetingHashedId</td>\n<td>path</td>\n<td>string (MD5 hex)</td>\n<td>Yes</td>\n<td>Hashed meeting id: the lowercase MD5 hex of the meeting's <strong>numeric</strong> id (e.g. <code>md5(\"4512\")</code>). Not the meeting UUID.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong> — array of meeting themes, each with a <code>questions</code> array. Empty array when the meeting has no themes.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"id\": 731,\n    \"meeting_id\": 4512,\n    \"name\": \"Discovery\",\n    \"type_id\": 12,\n    \"created_at\": \"2026-09-30T09:12:44.000000Z\",\n    \"updated_at\": \"2026-09-30T09:12:44.000000Z\",\n    \"questions\": [\n      {\n        \"id\": 88231,\n        \"meeting_id\": 4512,\n        \"meeting_theme_id\": 731,\n        \"question\": \"What budget is available for this project?\",\n        \"answer\": \"Around EUR 50,000 for phase one.\",\n        \"created_at\": \"2026-09-30T09:12:44.000000Z\",\n        \"updated_at\": \"2026-09-30T10:01:02.000000Z\",\n        \"output_type\": \"single_line\",\n        \"keywords\": [\n          \"budget\",\n          \"available\",\n          \"project\"\n        ]\n      }\n    ]\n  }\n]\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Condition</th>\n<th>Body</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>401</td>\n<td>No user resolved (e.g. service-account token)</td>\n<td><code>{\"error\": \"unauthenticated\"}</code></td>\n</tr>\n<tr>\n<td>404</td>\n<td>Meeting does not exist <strong>or</strong> caller may not see it (same response on purpose, to avoid confirming existence)</td>\n<td><code>{\"code\": 404, \"error\": \"Meeting not found\"}</code></td>\n</tr>\n<tr>\n<td>401</td>\n<td>Missing/invalid bearer token</td>\n<td><code>{\"code\": 401, \"error\": \"Unauthorized\"}</code></td>\n</tr>\n<tr>\n<td>403</td>\n<td>Caller's licence is blocked (trial expired) while billing enforcement is on</td>\n<td><code>{\"message\": \"Your trial has ended\", \"billing_blocked\": true}</code></td>\n</tr>\n<tr>\n<td>403</td>\n<td>Organisation requires 2FA and the caller has not enabled it</td>\n<td><code>{\"message\": \"...\"}</code></td>\n</tr>\n<tr>\n<td>429</td>\n<td>Rate limit exceeded</td>\n<td><code>{\"message\": \"Too Many Attempts.\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>This is the only bearer-reachable source of question ids and answers: <code>GET /meetings/:id</code> returns questions with <code>id</code> removed.</li>\n<li>To address a question in the routes below, hash its numeric <code>id</code> with MD5.</li>\n<li><code>output_type</code> is one of <code>single_line</code>, <code>multi_line</code>, <code>long_text</code>, <code>date</code>, <code>integer</code>, <code>number</code>, <code>boolean</code>, <code>email</code>.</li>\n<li>Access: superadmin, the meeting owner, or a user the meeting is shared with / visible to (<code>CanUserSeeThisMeeting</code>).</li>\n<li>Rate limit: 60 calls/min per caller.</li>\n<li><em>Auto-documented from source (routes/api.php + controller).</em></li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["meeting",":meetingHashedId","questions"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[{"description":{"content":"<p>Hashed meeting id: the lowercase MD5 hex of the meeting's <strong>numeric</strong> id (e.g. <code>md5(\"4512\")</code>). Not the meeting UUID.</p>\n","type":"text/plain"},"type":"any","value":"63c4b1baf3b4460fa9936b1a20919bec","key":"meetingHashedId"}]}},"response":[{"id":"3229edd7-b0d8-42d1-855d-d6f8e6cb5bcc","name":"200 OK","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"https://app.claritalk.com/api/meeting/:meetingHashedId/questions","host":["https://app.claritalk.com/api"],"path":["meeting",":meetingHashedId","questions"],"variable":[{"key":"meetingHashedId","value":"63c4b1baf3b4460fa9936b1a20919bec","description":"Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID."}]},"description":"List the meeting's themes with their questions — including each question's numeric `id`, its current `answer`, `output_type` and `keywords`.\n\n### Authentication\nBearer token required (inherited collection-level OAuth2). Include `Authorization: Bearer {token}`.\n\nRequires a **user-bound** token (authorization code / personal token). A service-account (`client_credentials`) token passes the bearer gate but has no user, so it is refused.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| meetingHashedId | path | string (MD5 hex) | Yes | Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID. |\n\n### Response\n**200 OK** — array of meeting themes, each with a `questions` array. Empty array when the meeting has no themes.\n```json\n[\n  {\n    \"id\": 731,\n    \"meeting_id\": 4512,\n    \"name\": \"Discovery\",\n    \"type_id\": 12,\n    \"created_at\": \"2026-09-30T09:12:44.000000Z\",\n    \"updated_at\": \"2026-09-30T09:12:44.000000Z\",\n    \"questions\": [\n      {\n        \"id\": 88231,\n        \"meeting_id\": 4512,\n        \"meeting_theme_id\": 731,\n        \"question\": \"What budget is available for this project?\",\n        \"answer\": \"Around EUR 50,000 for phase one.\",\n        \"created_at\": \"2026-09-30T09:12:44.000000Z\",\n        \"updated_at\": \"2026-09-30T10:01:02.000000Z\",\n        \"output_type\": \"single_line\",\n        \"keywords\": [\n          \"budget\",\n          \"available\",\n          \"project\"\n        ]\n      }\n    ]\n  }\n]\n```\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 401 | No user resolved (e.g. service-account token) | `{\"error\": \"unauthenticated\"}` |\n| 404 | Meeting does not exist **or** caller may not see it (same response on purpose, to avoid confirming existence) | `{\"code\": 404, \"error\": \"Meeting not found\"}` |\n| 401 | Missing/invalid bearer token | `{\"code\": 401, \"error\": \"Unauthorized\"}` |\n| 403 | Caller's licence is blocked (trial expired) while billing enforcement is on | `{\"message\": \"Your trial has ended\", \"billing_blocked\": true}` |\n| 403 | Organisation requires 2FA and the caller has not enabled it | `{\"message\": \"...\"}` |\n| 429 | Rate limit exceeded | `{\"message\": \"Too Many Attempts.\"}` |\n\n### Notes\n- This is the only bearer-reachable source of question ids and answers: `GET /meetings/:id` returns questions with `id` removed.\n- To address a question in the routes below, hash its numeric `id` with MD5.\n- `output_type` is one of `single_line`, `multi_line`, `long_text`, `date`, `integer`, `number`, `boolean`, `email`.\n- Access: superadmin, the meeting owner, or a user the meeting is shared with / visible to (`CanUserSeeThisMeeting`).\n- Rate limit: 60 calls/min per caller.\n- _Auto-documented from source (routes/api.php + controller)._"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"id\": 731,\n    \"meeting_id\": 4512,\n    \"name\": \"Discovery\",\n    \"type_id\": 12,\n    \"created_at\": \"2026-09-30T09:12:44.000000Z\",\n    \"updated_at\": \"2026-09-30T09:12:44.000000Z\",\n    \"questions\": [\n      {\n        \"id\": 88231,\n        \"meeting_id\": 4512,\n        \"meeting_theme_id\": 731,\n        \"question\": \"What budget is available for this project?\",\n        \"answer\": \"Around EUR 50,000 for phase one.\",\n        \"created_at\": \"2026-09-30T09:12:44.000000Z\",\n        \"updated_at\": \"2026-09-30T10:01:02.000000Z\",\n        \"output_type\": \"single_line\",\n        \"keywords\": [\n          \"budget\",\n          \"available\",\n          \"project\"\n        ]\n      }\n    ]\n  }\n]"},{"id":"3f57098d-b53a-41c8-8baf-7c245e85355a","name":"404 Meeting not found","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"https://app.claritalk.com/api/meeting/:meetingHashedId/questions","host":["https://app.claritalk.com/api"],"path":["meeting",":meetingHashedId","questions"],"variable":[{"key":"meetingHashedId","value":"63c4b1baf3b4460fa9936b1a20919bec","description":"Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID."}]},"description":"List the meeting's themes with their questions — including each question's numeric `id`, its current `answer`, `output_type` and `keywords`.\n\n### Authentication\nBearer token required (inherited collection-level OAuth2). Include `Authorization: Bearer {token}`.\n\nRequires a **user-bound** token (authorization code / personal token). A service-account (`client_credentials`) token passes the bearer gate but has no user, so it is refused.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| meetingHashedId | path | string (MD5 hex) | Yes | Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID. |\n\n### Response\n**200 OK** — array of meeting themes, each with a `questions` array. Empty array when the meeting has no themes.\n```json\n[\n  {\n    \"id\": 731,\n    \"meeting_id\": 4512,\n    \"name\": \"Discovery\",\n    \"type_id\": 12,\n    \"created_at\": \"2026-09-30T09:12:44.000000Z\",\n    \"updated_at\": \"2026-09-30T09:12:44.000000Z\",\n    \"questions\": [\n      {\n        \"id\": 88231,\n        \"meeting_id\": 4512,\n        \"meeting_theme_id\": 731,\n        \"question\": \"What budget is available for this project?\",\n        \"answer\": \"Around EUR 50,000 for phase one.\",\n        \"created_at\": \"2026-09-30T09:12:44.000000Z\",\n        \"updated_at\": \"2026-09-30T10:01:02.000000Z\",\n        \"output_type\": \"single_line\",\n        \"keywords\": [\n          \"budget\",\n          \"available\",\n          \"project\"\n        ]\n      }\n    ]\n  }\n]\n```\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 401 | No user resolved (e.g. service-account token) | `{\"error\": \"unauthenticated\"}` |\n| 404 | Meeting does not exist **or** caller may not see it (same response on purpose, to avoid confirming existence) | `{\"code\": 404, \"error\": \"Meeting not found\"}` |\n| 401 | Missing/invalid bearer token | `{\"code\": 401, \"error\": \"Unauthorized\"}` |\n| 403 | Caller's licence is blocked (trial expired) while billing enforcement is on | `{\"message\": \"Your trial has ended\", \"billing_blocked\": true}` |\n| 403 | Organisation requires 2FA and the caller has not enabled it | `{\"message\": \"...\"}` |\n| 429 | Rate limit exceeded | `{\"message\": \"Too Many Attempts.\"}` |\n\n### Notes\n- This is the only bearer-reachable source of question ids and answers: `GET /meetings/:id` returns questions with `id` removed.\n- To address a question in the routes below, hash its numeric `id` with MD5.\n- `output_type` is one of `single_line`, `multi_line`, `long_text`, `date`, `integer`, `number`, `boolean`, `email`.\n- Access: superadmin, the meeting owner, or a user the meeting is shared with / visible to (`CanUserSeeThisMeeting`).\n- Rate limit: 60 calls/min per caller.\n- _Auto-documented from source (routes/api.php + controller)._"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"code\": 404,\n  \"error\": \"Meeting not found\"\n}"},{"id":"b70dc8a3-982d-4772-952f-a5dcc64ac007","name":"401 No user on token","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"https://app.claritalk.com/api/meeting/:meetingHashedId/questions","host":["https://app.claritalk.com/api"],"path":["meeting",":meetingHashedId","questions"],"variable":[{"key":"meetingHashedId","value":"63c4b1baf3b4460fa9936b1a20919bec","description":"Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID."}]},"description":"List the meeting's themes with their questions — including each question's numeric `id`, its current `answer`, `output_type` and `keywords`.\n\n### Authentication\nBearer token required (inherited collection-level OAuth2). Include `Authorization: Bearer {token}`.\n\nRequires a **user-bound** token (authorization code / personal token). A service-account (`client_credentials`) token passes the bearer gate but has no user, so it is refused.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| meetingHashedId | path | string (MD5 hex) | Yes | Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID. |\n\n### Response\n**200 OK** — array of meeting themes, each with a `questions` array. Empty array when the meeting has no themes.\n```json\n[\n  {\n    \"id\": 731,\n    \"meeting_id\": 4512,\n    \"name\": \"Discovery\",\n    \"type_id\": 12,\n    \"created_at\": \"2026-09-30T09:12:44.000000Z\",\n    \"updated_at\": \"2026-09-30T09:12:44.000000Z\",\n    \"questions\": [\n      {\n        \"id\": 88231,\n        \"meeting_id\": 4512,\n        \"meeting_theme_id\": 731,\n        \"question\": \"What budget is available for this project?\",\n        \"answer\": \"Around EUR 50,000 for phase one.\",\n        \"created_at\": \"2026-09-30T09:12:44.000000Z\",\n        \"updated_at\": \"2026-09-30T10:01:02.000000Z\",\n        \"output_type\": \"single_line\",\n        \"keywords\": [\n          \"budget\",\n          \"available\",\n          \"project\"\n        ]\n      }\n    ]\n  }\n]\n```\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 401 | No user resolved (e.g. service-account token) | `{\"error\": \"unauthenticated\"}` |\n| 404 | Meeting does not exist **or** caller may not see it (same response on purpose, to avoid confirming existence) | `{\"code\": 404, \"error\": \"Meeting not found\"}` |\n| 401 | Missing/invalid bearer token | `{\"code\": 401, \"error\": \"Unauthorized\"}` |\n| 403 | Caller's licence is blocked (trial expired) while billing enforcement is on | `{\"message\": \"Your trial has ended\", \"billing_blocked\": true}` |\n| 403 | Organisation requires 2FA and the caller has not enabled it | `{\"message\": \"...\"}` |\n| 429 | Rate limit exceeded | `{\"message\": \"Too Many Attempts.\"}` |\n\n### Notes\n- This is the only bearer-reachable source of question ids and answers: `GET /meetings/:id` returns questions with `id` removed.\n- To address a question in the routes below, hash its numeric `id` with MD5.\n- `output_type` is one of `single_line`, `multi_line`, `long_text`, `date`, `integer`, `number`, `boolean`, `email`.\n- Access: superadmin, the meeting owner, or a user the meeting is shared with / visible to (`CanUserSeeThisMeeting`).\n- Rate limit: 60 calls/min per caller.\n- _Auto-documented from source (routes/api.php + controller)._"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"unauthenticated\"\n}"}],"_postman_id":"50307d24-0b6a-4729-a04e-b065f9d049ce"},{"name":"Create meeting question","id":"6fa0e0d7-b5dc-4d0f-b991-2fd439fd99bc","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"question\": \"What is the expected go-live date?\",\n  \"theme_id\": 731,\n  \"answer\": \"\",\n  \"output_type\": \"date\"\n}","options":{"raw":{"language":"json"}}},"url":"https://app.claritalk.com/api/meeting/:meetingHashedId/questions","description":"<p>Add a new question to one of the meeting's themes. Keywords for live discussion tracking are extracted immediately (runs an AI model).</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>Bearer token required (inherited collection-level OAuth2). Include <code>Authorization: Bearer {token}</code>.</p>\n<p>Requires a <strong>user-bound</strong> token (authorization code / personal token). A service-account (<code>client_credentials</code>) token passes the bearer gate but has no user, so it is refused.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>meetingHashedId</td>\n<td>path</td>\n<td>string (MD5 hex)</td>\n<td>Yes</td>\n<td>Hashed meeting id: the lowercase MD5 hex of the meeting's <strong>numeric</strong> id (e.g. <code>md5(\"4512\")</code>). Not the meeting UUID.</td>\n</tr>\n<tr>\n<td>question</td>\n<td>body</td>\n<td>string</td>\n<td>Yes</td>\n<td>Question text. Trimmed; must not be empty.</td>\n</tr>\n<tr>\n<td>theme_id</td>\n<td>body</td>\n<td>integer</td>\n<td>Yes</td>\n<td>Meeting theme id — must be one of this meeting's themes (see <code>GET /meeting/:meetingHashedId/questions</code>).</td>\n</tr>\n<tr>\n<td>answer</td>\n<td>body</td>\n<td>string</td>\n<td>No</td>\n<td>Initial answer. Default: <code>\"\"</code>.</td>\n</tr>\n<tr>\n<td>output_type</td>\n<td>body</td>\n<td>string</td>\n<td>No</td>\n<td><code>single_line</code> (default), <code>multi_line</code>, <code>long_text</code>, <code>date</code>, <code>integer</code>, <code>number</code>, <code>boolean</code>, <code>email</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"request-body-example\">Request Body Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"question\": \"What is the expected go-live date?\",\n  \"theme_id\": 731,\n  \"answer\": \"\",\n  \"output_type\": \"date\"\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<p><strong>201 Created</strong> — the created meeting question.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"meeting_id\": 4512,\n  \"meeting_theme_id\": 731,\n  \"question\": \"What is the expected go-live date?\",\n  \"output_type\": \"date\",\n  \"answer\": \"\",\n  \"updated_at\": \"2026-10-01T08:30:00.000000Z\",\n  \"created_at\": \"2026-10-01T08:30:00.000000Z\",\n  \"id\": 88240,\n  \"keywords\": [\n    \"expected\",\n    \"go-live\",\n    \"date\"\n  ]\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Condition</th>\n<th>Body</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>400</td>\n<td><code>question</code> or <code>theme_id</code> missing, or <code>question</code> empty after trimming</td>\n<td><code>{\"code\": 400, \"error\": \"Missing required fields\"}</code></td>\n</tr>\n<tr>\n<td>400</td>\n<td><code>output_type</code> is not a known value</td>\n<td><code>{\"code\": 400, \"error\": \"Unknown output type\"}</code></td>\n</tr>\n<tr>\n<td>401</td>\n<td>No user resolved (e.g. service-account token)</td>\n<td><code>{\"error\": \"unauthenticated\"}</code></td>\n</tr>\n<tr>\n<td>404</td>\n<td>Meeting does not exist <strong>or</strong> caller may not see it (same response on purpose, to avoid confirming existence)</td>\n<td><code>{\"code\": 404, \"error\": \"Meeting not found\"}</code></td>\n</tr>\n<tr>\n<td>404</td>\n<td><code>theme_id</code> is not one of this meeting's themes</td>\n<td><code>{\"code\": 404, \"error\": \"Meeting theme not found\"}</code></td>\n</tr>\n<tr>\n<td>401</td>\n<td>Missing/invalid bearer token</td>\n<td><code>{\"code\": 401, \"error\": \"Unauthorized\"}</code></td>\n</tr>\n<tr>\n<td>403</td>\n<td>Caller's licence is blocked (trial expired) while billing enforcement is on</td>\n<td><code>{\"message\": \"Your trial has ended\", \"billing_blocked\": true}</code></td>\n</tr>\n<tr>\n<td>403</td>\n<td>Organisation requires 2FA and the caller has not enabled it</td>\n<td><code>{\"message\": \"...\"}</code></td>\n</tr>\n<tr>\n<td>429</td>\n<td>Rate limit exceeded</td>\n<td><code>{\"message\": \"Too Many Attempts.\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>Body field validation runs before the meeting lookup, so a malformed body returns <code>400</code> even for an unknown meeting.</li>\n<li>If keyword extraction fails, the question is still saved and returned (without a refreshed <code>keywords</code> field); the error is reported server-side.</li>\n<li>Rate limit: <code>ai-write</code> 30 calls/min per caller, plus the group's 60/min.</li>\n<li><em>Auto-documented from source (routes/api.php + controller).</em></li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["meeting",":meetingHashedId","questions"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[{"description":{"content":"<p>Hashed meeting id: the lowercase MD5 hex of the meeting's <strong>numeric</strong> id (e.g. <code>md5(\"4512\")</code>). Not the meeting UUID.</p>\n","type":"text/plain"},"type":"any","value":"63c4b1baf3b4460fa9936b1a20919bec","key":"meetingHashedId"}]}},"response":[{"id":"96595445-4dda-4342-9df0-fa88dcd441e6","name":"201 Created","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"question\": \"What is the expected go-live date?\",\n  \"theme_id\": 731,\n  \"answer\": \"\",\n  \"output_type\": \"date\"\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://app.claritalk.com/api/meeting/:meetingHashedId/questions","host":["https://app.claritalk.com/api"],"path":["meeting",":meetingHashedId","questions"],"variable":[{"key":"meetingHashedId","value":"63c4b1baf3b4460fa9936b1a20919bec","description":"Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID."}]},"description":"Add a new question to one of the meeting's themes. Keywords for live discussion tracking are extracted immediately (runs an AI model).\n\n### Authentication\nBearer token required (inherited collection-level OAuth2). Include `Authorization: Bearer {token}`.\n\nRequires a **user-bound** token (authorization code / personal token). A service-account (`client_credentials`) token passes the bearer gate but has no user, so it is refused.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| meetingHashedId | path | string (MD5 hex) | Yes | Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID. |\n| question | body | string | Yes | Question text. Trimmed; must not be empty. |\n| theme_id | body | integer | Yes | Meeting theme id — must be one of this meeting's themes (see `GET /meeting/:meetingHashedId/questions`). |\n| answer | body | string | No | Initial answer. Default: `\"\"`. |\n| output_type | body | string | No | `single_line` (default), `multi_line`, `long_text`, `date`, `integer`, `number`, `boolean`, `email`. |\n\n### Request Body Example\n```json\n{\n  \"question\": \"What is the expected go-live date?\",\n  \"theme_id\": 731,\n  \"answer\": \"\",\n  \"output_type\": \"date\"\n}\n```\n\n### Response\n**201 Created** — the created meeting question.\n```json\n{\n  \"meeting_id\": 4512,\n  \"meeting_theme_id\": 731,\n  \"question\": \"What is the expected go-live date?\",\n  \"output_type\": \"date\",\n  \"answer\": \"\",\n  \"updated_at\": \"2026-10-01T08:30:00.000000Z\",\n  \"created_at\": \"2026-10-01T08:30:00.000000Z\",\n  \"id\": 88240,\n  \"keywords\": [\n    \"expected\",\n    \"go-live\",\n    \"date\"\n  ]\n}\n```\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 400 | `question` or `theme_id` missing, or `question` empty after trimming | `{\"code\": 400, \"error\": \"Missing required fields\"}` |\n| 400 | `output_type` is not a known value | `{\"code\": 400, \"error\": \"Unknown output type\"}` |\n| 401 | No user resolved (e.g. service-account token) | `{\"error\": \"unauthenticated\"}` |\n| 404 | Meeting does not exist **or** caller may not see it (same response on purpose, to avoid confirming existence) | `{\"code\": 404, \"error\": \"Meeting not found\"}` |\n| 404 | `theme_id` is not one of this meeting's themes | `{\"code\": 404, \"error\": \"Meeting theme not found\"}` |\n| 401 | Missing/invalid bearer token | `{\"code\": 401, \"error\": \"Unauthorized\"}` |\n| 403 | Caller's licence is blocked (trial expired) while billing enforcement is on | `{\"message\": \"Your trial has ended\", \"billing_blocked\": true}` |\n| 403 | Organisation requires 2FA and the caller has not enabled it | `{\"message\": \"...\"}` |\n| 429 | Rate limit exceeded | `{\"message\": \"Too Many Attempts.\"}` |\n\n### Notes\n- Body field validation runs before the meeting lookup, so a malformed body returns `400` even for an unknown meeting.\n- If keyword extraction fails, the question is still saved and returned (without a refreshed `keywords` field); the error is reported server-side.\n- Rate limit: `ai-write` 30 calls/min per caller, plus the group's 60/min.\n- _Auto-documented from source (routes/api.php + controller)._"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"meeting_id\": 4512,\n  \"meeting_theme_id\": 731,\n  \"question\": \"What is the expected go-live date?\",\n  \"output_type\": \"date\",\n  \"answer\": \"\",\n  \"updated_at\": \"2026-10-01T08:30:00.000000Z\",\n  \"created_at\": \"2026-10-01T08:30:00.000000Z\",\n  \"id\": 88240,\n  \"keywords\": [\n    \"expected\",\n    \"go-live\",\n    \"date\"\n  ]\n}"},{"id":"8314ceb8-8918-426e-b8f0-d9a7404892fe","name":"400 Missing fields","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"question\": \"What is the expected go-live date?\",\n  \"theme_id\": 731,\n  \"answer\": \"\",\n  \"output_type\": \"date\"\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://app.claritalk.com/api/meeting/:meetingHashedId/questions","host":["https://app.claritalk.com/api"],"path":["meeting",":meetingHashedId","questions"],"variable":[{"key":"meetingHashedId","value":"63c4b1baf3b4460fa9936b1a20919bec","description":"Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID."}]},"description":"Add a new question to one of the meeting's themes. Keywords for live discussion tracking are extracted immediately (runs an AI model).\n\n### Authentication\nBearer token required (inherited collection-level OAuth2). Include `Authorization: Bearer {token}`.\n\nRequires a **user-bound** token (authorization code / personal token). A service-account (`client_credentials`) token passes the bearer gate but has no user, so it is refused.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| meetingHashedId | path | string (MD5 hex) | Yes | Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID. |\n| question | body | string | Yes | Question text. Trimmed; must not be empty. |\n| theme_id | body | integer | Yes | Meeting theme id — must be one of this meeting's themes (see `GET /meeting/:meetingHashedId/questions`). |\n| answer | body | string | No | Initial answer. Default: `\"\"`. |\n| output_type | body | string | No | `single_line` (default), `multi_line`, `long_text`, `date`, `integer`, `number`, `boolean`, `email`. |\n\n### Request Body Example\n```json\n{\n  \"question\": \"What is the expected go-live date?\",\n  \"theme_id\": 731,\n  \"answer\": \"\",\n  \"output_type\": \"date\"\n}\n```\n\n### Response\n**201 Created** — the created meeting question.\n```json\n{\n  \"meeting_id\": 4512,\n  \"meeting_theme_id\": 731,\n  \"question\": \"What is the expected go-live date?\",\n  \"output_type\": \"date\",\n  \"answer\": \"\",\n  \"updated_at\": \"2026-10-01T08:30:00.000000Z\",\n  \"created_at\": \"2026-10-01T08:30:00.000000Z\",\n  \"id\": 88240,\n  \"keywords\": [\n    \"expected\",\n    \"go-live\",\n    \"date\"\n  ]\n}\n```\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 400 | `question` or `theme_id` missing, or `question` empty after trimming | `{\"code\": 400, \"error\": \"Missing required fields\"}` |\n| 400 | `output_type` is not a known value | `{\"code\": 400, \"error\": \"Unknown output type\"}` |\n| 401 | No user resolved (e.g. service-account token) | `{\"error\": \"unauthenticated\"}` |\n| 404 | Meeting does not exist **or** caller may not see it (same response on purpose, to avoid confirming existence) | `{\"code\": 404, \"error\": \"Meeting not found\"}` |\n| 404 | `theme_id` is not one of this meeting's themes | `{\"code\": 404, \"error\": \"Meeting theme not found\"}` |\n| 401 | Missing/invalid bearer token | `{\"code\": 401, \"error\": \"Unauthorized\"}` |\n| 403 | Caller's licence is blocked (trial expired) while billing enforcement is on | `{\"message\": \"Your trial has ended\", \"billing_blocked\": true}` |\n| 403 | Organisation requires 2FA and the caller has not enabled it | `{\"message\": \"...\"}` |\n| 429 | Rate limit exceeded | `{\"message\": \"Too Many Attempts.\"}` |\n\n### Notes\n- Body field validation runs before the meeting lookup, so a malformed body returns `400` even for an unknown meeting.\n- If keyword extraction fails, the question is still saved and returned (without a refreshed `keywords` field); the error is reported server-side.\n- Rate limit: `ai-write` 30 calls/min per caller, plus the group's 60/min.\n- _Auto-documented from source (routes/api.php + controller)._"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"code\": 400,\n  \"error\": \"Missing required fields\"\n}"},{"id":"30a1fd15-23d8-4819-ad02-3a3bc11460ff","name":"404 Theme not found","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"question\": \"What is the expected go-live date?\",\n  \"theme_id\": 731,\n  \"answer\": \"\",\n  \"output_type\": \"date\"\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://app.claritalk.com/api/meeting/:meetingHashedId/questions","host":["https://app.claritalk.com/api"],"path":["meeting",":meetingHashedId","questions"],"variable":[{"key":"meetingHashedId","value":"63c4b1baf3b4460fa9936b1a20919bec","description":"Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID."}]},"description":"Add a new question to one of the meeting's themes. Keywords for live discussion tracking are extracted immediately (runs an AI model).\n\n### Authentication\nBearer token required (inherited collection-level OAuth2). Include `Authorization: Bearer {token}`.\n\nRequires a **user-bound** token (authorization code / personal token). A service-account (`client_credentials`) token passes the bearer gate but has no user, so it is refused.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| meetingHashedId | path | string (MD5 hex) | Yes | Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID. |\n| question | body | string | Yes | Question text. Trimmed; must not be empty. |\n| theme_id | body | integer | Yes | Meeting theme id — must be one of this meeting's themes (see `GET /meeting/:meetingHashedId/questions`). |\n| answer | body | string | No | Initial answer. Default: `\"\"`. |\n| output_type | body | string | No | `single_line` (default), `multi_line`, `long_text`, `date`, `integer`, `number`, `boolean`, `email`. |\n\n### Request Body Example\n```json\n{\n  \"question\": \"What is the expected go-live date?\",\n  \"theme_id\": 731,\n  \"answer\": \"\",\n  \"output_type\": \"date\"\n}\n```\n\n### Response\n**201 Created** — the created meeting question.\n```json\n{\n  \"meeting_id\": 4512,\n  \"meeting_theme_id\": 731,\n  \"question\": \"What is the expected go-live date?\",\n  \"output_type\": \"date\",\n  \"answer\": \"\",\n  \"updated_at\": \"2026-10-01T08:30:00.000000Z\",\n  \"created_at\": \"2026-10-01T08:30:00.000000Z\",\n  \"id\": 88240,\n  \"keywords\": [\n    \"expected\",\n    \"go-live\",\n    \"date\"\n  ]\n}\n```\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 400 | `question` or `theme_id` missing, or `question` empty after trimming | `{\"code\": 400, \"error\": \"Missing required fields\"}` |\n| 400 | `output_type` is not a known value | `{\"code\": 400, \"error\": \"Unknown output type\"}` |\n| 401 | No user resolved (e.g. service-account token) | `{\"error\": \"unauthenticated\"}` |\n| 404 | Meeting does not exist **or** caller may not see it (same response on purpose, to avoid confirming existence) | `{\"code\": 404, \"error\": \"Meeting not found\"}` |\n| 404 | `theme_id` is not one of this meeting's themes | `{\"code\": 404, \"error\": \"Meeting theme not found\"}` |\n| 401 | Missing/invalid bearer token | `{\"code\": 401, \"error\": \"Unauthorized\"}` |\n| 403 | Caller's licence is blocked (trial expired) while billing enforcement is on | `{\"message\": \"Your trial has ended\", \"billing_blocked\": true}` |\n| 403 | Organisation requires 2FA and the caller has not enabled it | `{\"message\": \"...\"}` |\n| 429 | Rate limit exceeded | `{\"message\": \"Too Many Attempts.\"}` |\n\n### Notes\n- Body field validation runs before the meeting lookup, so a malformed body returns `400` even for an unknown meeting.\n- If keyword extraction fails, the question is still saved and returned (without a refreshed `keywords` field); the error is reported server-side.\n- Rate limit: `ai-write` 30 calls/min per caller, plus the group's 60/min.\n- _Auto-documented from source (routes/api.php + controller)._"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"code\": 404,\n  \"error\": \"Meeting theme not found\"\n}"}],"_postman_id":"6fa0e0d7-b5dc-4d0f-b991-2fd439fd99bc"},{"name":"List meeting question keywords","id":"4ae370d4-b407-4b8a-a124-1d2f56cbf6de","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/meeting/:meetingHashedId/questions/keywords","description":"<p>Get the keywords for every question of the meeting, keyed by question id, for client-side live discussion tracking. Questions without stored keywords get them extracted on the fly (runs an AI model).</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>Bearer token required (inherited collection-level OAuth2). Include <code>Authorization: Bearer {token}</code>.</p>\n<p>Requires a <strong>user-bound</strong> token (authorization code / personal token). A service-account (<code>client_credentials</code>) token passes the bearer gate but has no user, so it is refused.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>meetingHashedId</td>\n<td>path</td>\n<td>string (MD5 hex)</td>\n<td>Yes</td>\n<td>Hashed meeting id: the lowercase MD5 hex of the meeting's <strong>numeric</strong> id (e.g. <code>md5(\"4512\")</code>). Not the meeting UUID.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong> — object keyed by the question's numeric id (as a string).</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"88231\": {\n    \"keywords\": [\n      \"budget\",\n      \"available\",\n      \"project\"\n    ],\n    \"title\": \"What budget is available for this project?\"\n  },\n  \"88240\": {\n    \"keywords\": [\n      \"expected\",\n      \"go-live\",\n      \"date\"\n    ],\n    \"title\": \"What is the expected go-live date?\"\n  }\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Condition</th>\n<th>Body</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>401</td>\n<td>No user resolved (e.g. service-account token)</td>\n<td><code>{\"error\": \"unauthenticated\"}</code></td>\n</tr>\n<tr>\n<td>404</td>\n<td>Meeting does not exist <strong>or</strong> caller may not see it (same response on purpose, to avoid confirming existence)</td>\n<td><code>{\"code\": 404, \"error\": \"Meeting not found\"}</code></td>\n</tr>\n<tr>\n<td>401</td>\n<td>Missing/invalid bearer token</td>\n<td><code>{\"code\": 401, \"error\": \"Unauthorized\"}</code></td>\n</tr>\n<tr>\n<td>403</td>\n<td>Caller's licence is blocked (trial expired) while billing enforcement is on</td>\n<td><code>{\"message\": \"Your trial has ended\", \"billing_blocked\": true}</code></td>\n</tr>\n<tr>\n<td>403</td>\n<td>Organisation requires 2FA and the caller has not enabled it</td>\n<td><code>{\"message\": \"...\"}</code></td>\n</tr>\n<tr>\n<td>429</td>\n<td>Rate limit exceeded</td>\n<td><code>{\"message\": \"Too Many Attempts.\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>A meeting with no questions returns an empty JSON array <code>[]</code>, not <code>{}</code>.</li>\n<li>If extraction fails for a question, its <code>keywords</code> is <code>[]</code>; the request still succeeds.</li>\n<li>Rate limit: <code>meeting-keywords</code> 10 calls/min per caller <strong>per meeting</strong>, plus the group's 60/min.</li>\n<li><em>Auto-documented from source (routes/api.php + controller).</em></li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["meeting",":meetingHashedId","questions","keywords"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[{"description":{"content":"<p>Hashed meeting id: the lowercase MD5 hex of the meeting's <strong>numeric</strong> id (e.g. <code>md5(\"4512\")</code>). Not the meeting UUID.</p>\n","type":"text/plain"},"type":"any","value":"63c4b1baf3b4460fa9936b1a20919bec","key":"meetingHashedId"}]}},"response":[{"id":"81f4c1b6-f80f-452f-bae2-9eea42fdefd1","name":"200 OK","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"https://app.claritalk.com/api/meeting/:meetingHashedId/questions/keywords","host":["https://app.claritalk.com/api"],"path":["meeting",":meetingHashedId","questions","keywords"],"variable":[{"key":"meetingHashedId","value":"63c4b1baf3b4460fa9936b1a20919bec","description":"Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID."}]},"description":"Get the keywords for every question of the meeting, keyed by question id, for client-side live discussion tracking. Questions without stored keywords get them extracted on the fly (runs an AI model).\n\n### Authentication\nBearer token required (inherited collection-level OAuth2). Include `Authorization: Bearer {token}`.\n\nRequires a **user-bound** token (authorization code / personal token). A service-account (`client_credentials`) token passes the bearer gate but has no user, so it is refused.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| meetingHashedId | path | string (MD5 hex) | Yes | Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID. |\n\n### Response\n**200 OK** — object keyed by the question's numeric id (as a string).\n```json\n{\n  \"88231\": {\n    \"keywords\": [\n      \"budget\",\n      \"available\",\n      \"project\"\n    ],\n    \"title\": \"What budget is available for this project?\"\n  },\n  \"88240\": {\n    \"keywords\": [\n      \"expected\",\n      \"go-live\",\n      \"date\"\n    ],\n    \"title\": \"What is the expected go-live date?\"\n  }\n}\n```\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 401 | No user resolved (e.g. service-account token) | `{\"error\": \"unauthenticated\"}` |\n| 404 | Meeting does not exist **or** caller may not see it (same response on purpose, to avoid confirming existence) | `{\"code\": 404, \"error\": \"Meeting not found\"}` |\n| 401 | Missing/invalid bearer token | `{\"code\": 401, \"error\": \"Unauthorized\"}` |\n| 403 | Caller's licence is blocked (trial expired) while billing enforcement is on | `{\"message\": \"Your trial has ended\", \"billing_blocked\": true}` |\n| 403 | Organisation requires 2FA and the caller has not enabled it | `{\"message\": \"...\"}` |\n| 429 | Rate limit exceeded | `{\"message\": \"Too Many Attempts.\"}` |\n\n### Notes\n- A meeting with no questions returns an empty JSON array `[]`, not `{}`.\n- If extraction fails for a question, its `keywords` is `[]`; the request still succeeds.\n- Rate limit: `meeting-keywords` 10 calls/min per caller **per meeting**, plus the group's 60/min.\n- _Auto-documented from source (routes/api.php + controller)._"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"88231\": {\n    \"keywords\": [\n      \"budget\",\n      \"available\",\n      \"project\"\n    ],\n    \"title\": \"What budget is available for this project?\"\n  },\n  \"88240\": {\n    \"keywords\": [\n      \"expected\",\n      \"go-live\",\n      \"date\"\n    ],\n    \"title\": \"What is the expected go-live date?\"\n  }\n}"},{"id":"3efc2c76-5d6c-4199-a70f-b3bb51b4fd32","name":"404 Meeting not found","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"https://app.claritalk.com/api/meeting/:meetingHashedId/questions/keywords","host":["https://app.claritalk.com/api"],"path":["meeting",":meetingHashedId","questions","keywords"],"variable":[{"key":"meetingHashedId","value":"63c4b1baf3b4460fa9936b1a20919bec","description":"Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID."}]},"description":"Get the keywords for every question of the meeting, keyed by question id, for client-side live discussion tracking. Questions without stored keywords get them extracted on the fly (runs an AI model).\n\n### Authentication\nBearer token required (inherited collection-level OAuth2). Include `Authorization: Bearer {token}`.\n\nRequires a **user-bound** token (authorization code / personal token). A service-account (`client_credentials`) token passes the bearer gate but has no user, so it is refused.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| meetingHashedId | path | string (MD5 hex) | Yes | Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID. |\n\n### Response\n**200 OK** — object keyed by the question's numeric id (as a string).\n```json\n{\n  \"88231\": {\n    \"keywords\": [\n      \"budget\",\n      \"available\",\n      \"project\"\n    ],\n    \"title\": \"What budget is available for this project?\"\n  },\n  \"88240\": {\n    \"keywords\": [\n      \"expected\",\n      \"go-live\",\n      \"date\"\n    ],\n    \"title\": \"What is the expected go-live date?\"\n  }\n}\n```\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 401 | No user resolved (e.g. service-account token) | `{\"error\": \"unauthenticated\"}` |\n| 404 | Meeting does not exist **or** caller may not see it (same response on purpose, to avoid confirming existence) | `{\"code\": 404, \"error\": \"Meeting not found\"}` |\n| 401 | Missing/invalid bearer token | `{\"code\": 401, \"error\": \"Unauthorized\"}` |\n| 403 | Caller's licence is blocked (trial expired) while billing enforcement is on | `{\"message\": \"Your trial has ended\", \"billing_blocked\": true}` |\n| 403 | Organisation requires 2FA and the caller has not enabled it | `{\"message\": \"...\"}` |\n| 429 | Rate limit exceeded | `{\"message\": \"Too Many Attempts.\"}` |\n\n### Notes\n- A meeting with no questions returns an empty JSON array `[]`, not `{}`.\n- If extraction fails for a question, its `keywords` is `[]`; the request still succeeds.\n- Rate limit: `meeting-keywords` 10 calls/min per caller **per meeting**, plus the group's 60/min.\n- _Auto-documented from source (routes/api.php + controller)._"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"code\": 404,\n  \"error\": \"Meeting not found\"\n}"}],"_postman_id":"4ae370d4-b407-4b8a-a124-1d2f56cbf6de"},{"name":"Save meeting question answer","id":"7f0df262-48fd-452a-9f04-283995510a8a","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"question\": \"What budget is available for this project?\",\n  \"theme_id\": 731,\n  \"answer\": \"Around EUR 50,000 for phase one.\",\n  \"output_type\": \"single_line\"\n}","options":{"raw":{"language":"json"}}},"url":"https://app.claritalk.com/api/meeting/:meetingHashedId/questions/:questionHashedId","description":"<p>Save the answer to a meeting question. If no question of this meeting matches <code>questionHashedId</code>, a <strong>new</strong> question is created under <code>theme_id</code> instead (legacy web behaviour — use <code>POST /meeting/:meetingHashedId/questions</code> to create).</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>Bearer token required (inherited collection-level OAuth2). Include <code>Authorization: Bearer {token}</code>.</p>\n<p>Requires a <strong>user-bound</strong> token (authorization code / personal token). A service-account (<code>client_credentials</code>) token passes the bearer gate but has no user, so it is refused.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>meetingHashedId</td>\n<td>path</td>\n<td>string (MD5 hex)</td>\n<td>Yes</td>\n<td>Hashed meeting id: the lowercase MD5 hex of the meeting's <strong>numeric</strong> id (e.g. <code>md5(\"4512\")</code>). Not the meeting UUID.</td>\n</tr>\n<tr>\n<td>questionHashedId</td>\n<td>path</td>\n<td>string (MD5 hex)</td>\n<td>Yes</td>\n<td>MD5 hex of the question's numeric id. Only questions of this meeting are matched.</td>\n</tr>\n<tr>\n<td>question</td>\n<td>body</td>\n<td>string</td>\n<td>Yes</td>\n<td>Question text. Overwrites the stored text.</td>\n</tr>\n<tr>\n<td>theme_id</td>\n<td>body</td>\n<td>integer</td>\n<td>Yes</td>\n<td>Meeting theme id. Checked against the meeting's themes only when a new question is created.</td>\n</tr>\n<tr>\n<td>answer</td>\n<td>body</td>\n<td>string</td>\n<td>Yes</td>\n<td>Answer to save.</td>\n</tr>\n<tr>\n<td>output_type</td>\n<td>body</td>\n<td>string</td>\n<td>No</td>\n<td>Default: <code>single_line</code>. Not validated against the allowed values on this route.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"request-body-example\">Request Body Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"question\": \"What budget is available for this project?\",\n  \"theme_id\": 731,\n  \"answer\": \"Around EUR 50,000 for phase one.\",\n  \"output_type\": \"single_line\"\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong> — the meeting question.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": 88231,\n  \"meeting_id\": 4512,\n  \"meeting_theme_id\": 731,\n  \"question\": \"What budget is available for this project?\",\n  \"answer\": \"Around EUR 50,000 for phase one.\",\n  \"created_at\": \"2026-09-30T09:12:44.000000Z\",\n  \"updated_at\": \"2026-09-30T10:01:02.000000Z\",\n  \"output_type\": \"single_line\",\n  \"keywords\": [\n    \"budget\",\n    \"available\",\n    \"project\"\n  ]\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Condition</th>\n<th>Body</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>400</td>\n<td><code>question</code>, <code>theme_id</code> or <code>answer</code> missing</td>\n<td><code>{\"code\": 400, \"error\": \"Missing required fields\"}</code></td>\n</tr>\n<tr>\n<td>401</td>\n<td>No user resolved (e.g. service-account token)</td>\n<td><code>{\"error\": \"unauthenticated\"}</code></td>\n</tr>\n<tr>\n<td>404</td>\n<td>Meeting does not exist <strong>or</strong> caller may not see it (same response on purpose, to avoid confirming existence)</td>\n<td><code>{\"code\": 404, \"error\": \"Meeting not found\"}</code></td>\n</tr>\n<tr>\n<td>404</td>\n<td>No question matched and <code>theme_id</code> is not one of this meeting's themes</td>\n<td><code>{\"code\": 404, \"error\": \"Meeting theme not found\"}</code></td>\n</tr>\n<tr>\n<td>401</td>\n<td>Missing/invalid bearer token</td>\n<td><code>{\"code\": 401, \"error\": \"Unauthorized\"}</code></td>\n</tr>\n<tr>\n<td>403</td>\n<td>Caller's licence is blocked (trial expired) while billing enforcement is on</td>\n<td><code>{\"message\": \"Your trial has ended\", \"billing_blocked\": true}</code></td>\n</tr>\n<tr>\n<td>403</td>\n<td>Organisation requires 2FA and the caller has not enabled it</td>\n<td><code>{\"message\": \"...\"}</code></td>\n</tr>\n<tr>\n<td>429</td>\n<td>Rate limit exceeded</td>\n<td><code>{\"message\": \"Too Many Attempts.\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>Keywords are extracted (AI model) only when the question has none yet; failures are swallowed and reported server-side.</li>\n<li>Rate limit: <code>ai-write</code> 30 calls/min per caller, plus the group's 60/min.</li>\n<li><em>Auto-documented from source (routes/api.php + controller).</em></li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["meeting",":meetingHashedId","questions",":questionHashedId"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[{"description":{"content":"<p>Hashed meeting id: the lowercase MD5 hex of the meeting's <strong>numeric</strong> id (e.g. <code>md5(\"4512\")</code>). Not the meeting UUID.</p>\n","type":"text/plain"},"type":"any","value":"63c4b1baf3b4460fa9936b1a20919bec","key":"meetingHashedId"},{"description":{"content":"<p>Hashed question id: lowercase MD5 hex of the question's numeric <code>id</code> (as returned by <code>GET /meeting/:meetingHashedId/questions</code>).</p>\n","type":"text/plain"},"type":"any","value":"d845b1c796c792278ecc890bfd899594","key":"questionHashedId"}]}},"response":[{"id":"ab2f75ea-a2a7-4321-afb1-d24cbd3785aa","name":"200 OK","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"question\": \"What budget is available for this project?\",\n  \"theme_id\": 731,\n  \"answer\": \"Around EUR 50,000 for phase one.\",\n  \"output_type\": \"single_line\"\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://app.claritalk.com/api/meeting/:meetingHashedId/questions/:questionHashedId","host":["https://app.claritalk.com/api"],"path":["meeting",":meetingHashedId","questions",":questionHashedId"],"variable":[{"key":"meetingHashedId","value":"63c4b1baf3b4460fa9936b1a20919bec","description":"Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID."},{"key":"questionHashedId","value":"d845b1c796c792278ecc890bfd899594","description":"Hashed question id: lowercase MD5 hex of the question's numeric `id` (as returned by `GET /meeting/:meetingHashedId/questions`)."}]},"description":"Save the answer to a meeting question. If no question of this meeting matches `questionHashedId`, a **new** question is created under `theme_id` instead (legacy web behaviour — use `POST /meeting/:meetingHashedId/questions` to create).\n\n### Authentication\nBearer token required (inherited collection-level OAuth2). Include `Authorization: Bearer {token}`.\n\nRequires a **user-bound** token (authorization code / personal token). A service-account (`client_credentials`) token passes the bearer gate but has no user, so it is refused.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| meetingHashedId | path | string (MD5 hex) | Yes | Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID. |\n| questionHashedId | path | string (MD5 hex) | Yes | MD5 hex of the question's numeric id. Only questions of this meeting are matched. |\n| question | body | string | Yes | Question text. Overwrites the stored text. |\n| theme_id | body | integer | Yes | Meeting theme id. Checked against the meeting's themes only when a new question is created. |\n| answer | body | string | Yes | Answer to save. |\n| output_type | body | string | No | Default: `single_line`. Not validated against the allowed values on this route. |\n\n### Request Body Example\n```json\n{\n  \"question\": \"What budget is available for this project?\",\n  \"theme_id\": 731,\n  \"answer\": \"Around EUR 50,000 for phase one.\",\n  \"output_type\": \"single_line\"\n}\n```\n\n### Response\n**200 OK** — the meeting question.\n```json\n{\n  \"id\": 88231,\n  \"meeting_id\": 4512,\n  \"meeting_theme_id\": 731,\n  \"question\": \"What budget is available for this project?\",\n  \"answer\": \"Around EUR 50,000 for phase one.\",\n  \"created_at\": \"2026-09-30T09:12:44.000000Z\",\n  \"updated_at\": \"2026-09-30T10:01:02.000000Z\",\n  \"output_type\": \"single_line\",\n  \"keywords\": [\n    \"budget\",\n    \"available\",\n    \"project\"\n  ]\n}\n```\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 400 | `question`, `theme_id` or `answer` missing | `{\"code\": 400, \"error\": \"Missing required fields\"}` |\n| 401 | No user resolved (e.g. service-account token) | `{\"error\": \"unauthenticated\"}` |\n| 404 | Meeting does not exist **or** caller may not see it (same response on purpose, to avoid confirming existence) | `{\"code\": 404, \"error\": \"Meeting not found\"}` |\n| 404 | No question matched and `theme_id` is not one of this meeting's themes | `{\"code\": 404, \"error\": \"Meeting theme not found\"}` |\n| 401 | Missing/invalid bearer token | `{\"code\": 401, \"error\": \"Unauthorized\"}` |\n| 403 | Caller's licence is blocked (trial expired) while billing enforcement is on | `{\"message\": \"Your trial has ended\", \"billing_blocked\": true}` |\n| 403 | Organisation requires 2FA and the caller has not enabled it | `{\"message\": \"...\"}` |\n| 429 | Rate limit exceeded | `{\"message\": \"Too Many Attempts.\"}` |\n\n### Notes\n- Keywords are extracted (AI model) only when the question has none yet; failures are swallowed and reported server-side.\n- Rate limit: `ai-write` 30 calls/min per caller, plus the group's 60/min.\n- _Auto-documented from source (routes/api.php + controller)._"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 88231,\n  \"meeting_id\": 4512,\n  \"meeting_theme_id\": 731,\n  \"question\": \"What budget is available for this project?\",\n  \"answer\": \"Around EUR 50,000 for phase one.\",\n  \"created_at\": \"2026-09-30T09:12:44.000000Z\",\n  \"updated_at\": \"2026-09-30T10:01:02.000000Z\",\n  \"output_type\": \"single_line\",\n  \"keywords\": [\n    \"budget\",\n    \"available\",\n    \"project\"\n  ]\n}"},{"id":"c712a38a-523f-4a8a-9501-cbac4ad614e6","name":"400 Missing fields","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"question\": \"What budget is available for this project?\",\n  \"theme_id\": 731,\n  \"answer\": \"Around EUR 50,000 for phase one.\",\n  \"output_type\": \"single_line\"\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://app.claritalk.com/api/meeting/:meetingHashedId/questions/:questionHashedId","host":["https://app.claritalk.com/api"],"path":["meeting",":meetingHashedId","questions",":questionHashedId"],"variable":[{"key":"meetingHashedId","value":"63c4b1baf3b4460fa9936b1a20919bec","description":"Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID."},{"key":"questionHashedId","value":"d845b1c796c792278ecc890bfd899594","description":"Hashed question id: lowercase MD5 hex of the question's numeric `id` (as returned by `GET /meeting/:meetingHashedId/questions`)."}]},"description":"Save the answer to a meeting question. If no question of this meeting matches `questionHashedId`, a **new** question is created under `theme_id` instead (legacy web behaviour — use `POST /meeting/:meetingHashedId/questions` to create).\n\n### Authentication\nBearer token required (inherited collection-level OAuth2). Include `Authorization: Bearer {token}`.\n\nRequires a **user-bound** token (authorization code / personal token). A service-account (`client_credentials`) token passes the bearer gate but has no user, so it is refused.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| meetingHashedId | path | string (MD5 hex) | Yes | Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID. |\n| questionHashedId | path | string (MD5 hex) | Yes | MD5 hex of the question's numeric id. Only questions of this meeting are matched. |\n| question | body | string | Yes | Question text. Overwrites the stored text. |\n| theme_id | body | integer | Yes | Meeting theme id. Checked against the meeting's themes only when a new question is created. |\n| answer | body | string | Yes | Answer to save. |\n| output_type | body | string | No | Default: `single_line`. Not validated against the allowed values on this route. |\n\n### Request Body Example\n```json\n{\n  \"question\": \"What budget is available for this project?\",\n  \"theme_id\": 731,\n  \"answer\": \"Around EUR 50,000 for phase one.\",\n  \"output_type\": \"single_line\"\n}\n```\n\n### Response\n**200 OK** — the meeting question.\n```json\n{\n  \"id\": 88231,\n  \"meeting_id\": 4512,\n  \"meeting_theme_id\": 731,\n  \"question\": \"What budget is available for this project?\",\n  \"answer\": \"Around EUR 50,000 for phase one.\",\n  \"created_at\": \"2026-09-30T09:12:44.000000Z\",\n  \"updated_at\": \"2026-09-30T10:01:02.000000Z\",\n  \"output_type\": \"single_line\",\n  \"keywords\": [\n    \"budget\",\n    \"available\",\n    \"project\"\n  ]\n}\n```\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 400 | `question`, `theme_id` or `answer` missing | `{\"code\": 400, \"error\": \"Missing required fields\"}` |\n| 401 | No user resolved (e.g. service-account token) | `{\"error\": \"unauthenticated\"}` |\n| 404 | Meeting does not exist **or** caller may not see it (same response on purpose, to avoid confirming existence) | `{\"code\": 404, \"error\": \"Meeting not found\"}` |\n| 404 | No question matched and `theme_id` is not one of this meeting's themes | `{\"code\": 404, \"error\": \"Meeting theme not found\"}` |\n| 401 | Missing/invalid bearer token | `{\"code\": 401, \"error\": \"Unauthorized\"}` |\n| 403 | Caller's licence is blocked (trial expired) while billing enforcement is on | `{\"message\": \"Your trial has ended\", \"billing_blocked\": true}` |\n| 403 | Organisation requires 2FA and the caller has not enabled it | `{\"message\": \"...\"}` |\n| 429 | Rate limit exceeded | `{\"message\": \"Too Many Attempts.\"}` |\n\n### Notes\n- Keywords are extracted (AI model) only when the question has none yet; failures are swallowed and reported server-side.\n- Rate limit: `ai-write` 30 calls/min per caller, plus the group's 60/min.\n- _Auto-documented from source (routes/api.php + controller)._"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"code\": 400,\n  \"error\": \"Missing required fields\"\n}"},{"id":"dcfc1a23-bb99-46fc-9915-f6785863c6de","name":"404 Meeting not found","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"question\": \"What budget is available for this project?\",\n  \"theme_id\": 731,\n  \"answer\": \"Around EUR 50,000 for phase one.\",\n  \"output_type\": \"single_line\"\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://app.claritalk.com/api/meeting/:meetingHashedId/questions/:questionHashedId","host":["https://app.claritalk.com/api"],"path":["meeting",":meetingHashedId","questions",":questionHashedId"],"variable":[{"key":"meetingHashedId","value":"63c4b1baf3b4460fa9936b1a20919bec","description":"Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID."},{"key":"questionHashedId","value":"d845b1c796c792278ecc890bfd899594","description":"Hashed question id: lowercase MD5 hex of the question's numeric `id` (as returned by `GET /meeting/:meetingHashedId/questions`)."}]},"description":"Save the answer to a meeting question. If no question of this meeting matches `questionHashedId`, a **new** question is created under `theme_id` instead (legacy web behaviour — use `POST /meeting/:meetingHashedId/questions` to create).\n\n### Authentication\nBearer token required (inherited collection-level OAuth2). Include `Authorization: Bearer {token}`.\n\nRequires a **user-bound** token (authorization code / personal token). A service-account (`client_credentials`) token passes the bearer gate but has no user, so it is refused.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| meetingHashedId | path | string (MD5 hex) | Yes | Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID. |\n| questionHashedId | path | string (MD5 hex) | Yes | MD5 hex of the question's numeric id. Only questions of this meeting are matched. |\n| question | body | string | Yes | Question text. Overwrites the stored text. |\n| theme_id | body | integer | Yes | Meeting theme id. Checked against the meeting's themes only when a new question is created. |\n| answer | body | string | Yes | Answer to save. |\n| output_type | body | string | No | Default: `single_line`. Not validated against the allowed values on this route. |\n\n### Request Body Example\n```json\n{\n  \"question\": \"What budget is available for this project?\",\n  \"theme_id\": 731,\n  \"answer\": \"Around EUR 50,000 for phase one.\",\n  \"output_type\": \"single_line\"\n}\n```\n\n### Response\n**200 OK** — the meeting question.\n```json\n{\n  \"id\": 88231,\n  \"meeting_id\": 4512,\n  \"meeting_theme_id\": 731,\n  \"question\": \"What budget is available for this project?\",\n  \"answer\": \"Around EUR 50,000 for phase one.\",\n  \"created_at\": \"2026-09-30T09:12:44.000000Z\",\n  \"updated_at\": \"2026-09-30T10:01:02.000000Z\",\n  \"output_type\": \"single_line\",\n  \"keywords\": [\n    \"budget\",\n    \"available\",\n    \"project\"\n  ]\n}\n```\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 400 | `question`, `theme_id` or `answer` missing | `{\"code\": 400, \"error\": \"Missing required fields\"}` |\n| 401 | No user resolved (e.g. service-account token) | `{\"error\": \"unauthenticated\"}` |\n| 404 | Meeting does not exist **or** caller may not see it (same response on purpose, to avoid confirming existence) | `{\"code\": 404, \"error\": \"Meeting not found\"}` |\n| 404 | No question matched and `theme_id` is not one of this meeting's themes | `{\"code\": 404, \"error\": \"Meeting theme not found\"}` |\n| 401 | Missing/invalid bearer token | `{\"code\": 401, \"error\": \"Unauthorized\"}` |\n| 403 | Caller's licence is blocked (trial expired) while billing enforcement is on | `{\"message\": \"Your trial has ended\", \"billing_blocked\": true}` |\n| 403 | Organisation requires 2FA and the caller has not enabled it | `{\"message\": \"...\"}` |\n| 429 | Rate limit exceeded | `{\"message\": \"Too Many Attempts.\"}` |\n\n### Notes\n- Keywords are extracted (AI model) only when the question has none yet; failures are swallowed and reported server-side.\n- Rate limit: `ai-write` 30 calls/min per caller, plus the group's 60/min.\n- _Auto-documented from source (routes/api.php + controller)._"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"code\": 404,\n  \"error\": \"Meeting not found\"\n}"}],"_postman_id":"7f0df262-48fd-452a-9f04-283995510a8a"},{"name":"Generate meeting question answer","id":"dab42253-05c0-4e57-87a0-067a4818279a","request":{"method":"PUT","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/meeting/:meetingHashedId/questions/:questionHashedId","description":"<p>Generate an answer to one question from the meeting's transcript with AI, save it, and return the updated question. No request body.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>Bearer token required (inherited collection-level OAuth2). Include <code>Authorization: Bearer {token}</code>.</p>\n<p>Requires a <strong>user-bound</strong> token (authorization code / personal token). A service-account (<code>client_credentials</code>) token passes the bearer gate but has no user, so it is refused.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>meetingHashedId</td>\n<td>path</td>\n<td>string (MD5 hex)</td>\n<td>Yes</td>\n<td>Hashed meeting id: the lowercase MD5 hex of the meeting's <strong>numeric</strong> id (e.g. <code>md5(\"4512\")</code>). Not the meeting UUID.</td>\n</tr>\n<tr>\n<td>questionHashedId</td>\n<td>path</td>\n<td>string (MD5 hex)</td>\n<td>Yes</td>\n<td>MD5 hex of the question's numeric id. The question must belong to this meeting.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong> — the updated meeting question.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": 88231,\n  \"meeting_id\": 4512,\n  \"meeting_theme_id\": 731,\n  \"question\": \"What budget is available for this project?\",\n  \"answer\": \"The client has roughly EUR 50,000 available for phase one.\",\n  \"created_at\": \"2026-09-30T09:12:44.000000Z\",\n  \"updated_at\": \"2026-09-30T10:01:02.000000Z\",\n  \"output_type\": \"single_line\",\n  \"keywords\": [\n    \"budget\",\n    \"available\",\n    \"project\"\n  ]\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Condition</th>\n<th>Body</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>401</td>\n<td>No user resolved (e.g. service-account token)</td>\n<td><code>{\"error\": \"unauthenticated\"}</code></td>\n</tr>\n<tr>\n<td>404</td>\n<td>Meeting does not exist <strong>or</strong> caller may not see it (same response on purpose, to avoid confirming existence)</td>\n<td><code>{\"code\": 404, \"error\": \"Meeting not found\"}</code></td>\n</tr>\n<tr>\n<td>404</td>\n<td>Question not found, or it belongs to another meeting</td>\n<td><code>{\"code\": 404, \"error\": \"Meeting question not found\"}</code></td>\n</tr>\n<tr>\n<td>500</td>\n<td>Answer generation failed</td>\n<td><code>{\"code\": 500, \"error\": \"An error occurred\"}</code> in production (message <code>Failed to provide answer to question</code> elsewhere)</td>\n</tr>\n<tr>\n<td>401</td>\n<td>Missing/invalid bearer token</td>\n<td><code>{\"code\": 401, \"error\": \"Unauthorized\"}</code></td>\n</tr>\n<tr>\n<td>403</td>\n<td>Caller's licence is blocked (trial expired) while billing enforcement is on</td>\n<td><code>{\"message\": \"Your trial has ended\", \"billing_blocked\": true}</code></td>\n</tr>\n<tr>\n<td>403</td>\n<td>Organisation requires 2FA and the caller has not enabled it</td>\n<td><code>{\"message\": \"...\"}</code></td>\n</tr>\n<tr>\n<td>429</td>\n<td>Rate limit exceeded</td>\n<td><code>{\"message\": \"Too Many Attempts.\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>Reads the whole transcript through the organisation's configured AI provider; can be slow.</li>\n<li>Rate limit: <code>ai-turn</code> 20 calls/min per caller, plus the group's 60/min.</li>\n<li><em>Auto-documented from source (routes/api.php + controller).</em></li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["meeting",":meetingHashedId","questions",":questionHashedId"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[{"description":{"content":"<p>Hashed meeting id: the lowercase MD5 hex of the meeting's <strong>numeric</strong> id (e.g. <code>md5(\"4512\")</code>). Not the meeting UUID.</p>\n","type":"text/plain"},"type":"any","value":"63c4b1baf3b4460fa9936b1a20919bec","key":"meetingHashedId"},{"description":{"content":"<p>Hashed question id: lowercase MD5 hex of the question's numeric <code>id</code> (as returned by <code>GET /meeting/:meetingHashedId/questions</code>).</p>\n","type":"text/plain"},"type":"any","value":"d845b1c796c792278ecc890bfd899594","key":"questionHashedId"}]}},"response":[{"id":"be2d8389-80b3-4965-9bf1-4e61193f3734","name":"200 OK","originalRequest":{"method":"PUT","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"https://app.claritalk.com/api/meeting/:meetingHashedId/questions/:questionHashedId","host":["https://app.claritalk.com/api"],"path":["meeting",":meetingHashedId","questions",":questionHashedId"],"variable":[{"key":"meetingHashedId","value":"63c4b1baf3b4460fa9936b1a20919bec","description":"Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID."},{"key":"questionHashedId","value":"d845b1c796c792278ecc890bfd899594","description":"Hashed question id: lowercase MD5 hex of the question's numeric `id` (as returned by `GET /meeting/:meetingHashedId/questions`)."}]},"description":"Generate an answer to one question from the meeting's transcript with AI, save it, and return the updated question. No request body.\n\n### Authentication\nBearer token required (inherited collection-level OAuth2). Include `Authorization: Bearer {token}`.\n\nRequires a **user-bound** token (authorization code / personal token). A service-account (`client_credentials`) token passes the bearer gate but has no user, so it is refused.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| meetingHashedId | path | string (MD5 hex) | Yes | Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID. |\n| questionHashedId | path | string (MD5 hex) | Yes | MD5 hex of the question's numeric id. The question must belong to this meeting. |\n\n### Response\n**200 OK** — the updated meeting question.\n```json\n{\n  \"id\": 88231,\n  \"meeting_id\": 4512,\n  \"meeting_theme_id\": 731,\n  \"question\": \"What budget is available for this project?\",\n  \"answer\": \"The client has roughly EUR 50,000 available for phase one.\",\n  \"created_at\": \"2026-09-30T09:12:44.000000Z\",\n  \"updated_at\": \"2026-09-30T10:01:02.000000Z\",\n  \"output_type\": \"single_line\",\n  \"keywords\": [\n    \"budget\",\n    \"available\",\n    \"project\"\n  ]\n}\n```\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 401 | No user resolved (e.g. service-account token) | `{\"error\": \"unauthenticated\"}` |\n| 404 | Meeting does not exist **or** caller may not see it (same response on purpose, to avoid confirming existence) | `{\"code\": 404, \"error\": \"Meeting not found\"}` |\n| 404 | Question not found, or it belongs to another meeting | `{\"code\": 404, \"error\": \"Meeting question not found\"}` |\n| 500 | Answer generation failed | `{\"code\": 500, \"error\": \"An error occurred\"}` in production (message `Failed to provide answer to question` elsewhere) |\n| 401 | Missing/invalid bearer token | `{\"code\": 401, \"error\": \"Unauthorized\"}` |\n| 403 | Caller's licence is blocked (trial expired) while billing enforcement is on | `{\"message\": \"Your trial has ended\", \"billing_blocked\": true}` |\n| 403 | Organisation requires 2FA and the caller has not enabled it | `{\"message\": \"...\"}` |\n| 429 | Rate limit exceeded | `{\"message\": \"Too Many Attempts.\"}` |\n\n### Notes\n- Reads the whole transcript through the organisation's configured AI provider; can be slow.\n- Rate limit: `ai-turn` 20 calls/min per caller, plus the group's 60/min.\n- _Auto-documented from source (routes/api.php + controller)._"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 88231,\n  \"meeting_id\": 4512,\n  \"meeting_theme_id\": 731,\n  \"question\": \"What budget is available for this project?\",\n  \"answer\": \"The client has roughly EUR 50,000 available for phase one.\",\n  \"created_at\": \"2026-09-30T09:12:44.000000Z\",\n  \"updated_at\": \"2026-09-30T10:01:02.000000Z\",\n  \"output_type\": \"single_line\",\n  \"keywords\": [\n    \"budget\",\n    \"available\",\n    \"project\"\n  ]\n}"},{"id":"9969854e-5b91-4f6e-8ddb-49f661ab52eb","name":"404 Question not found","originalRequest":{"method":"PUT","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"https://app.claritalk.com/api/meeting/:meetingHashedId/questions/:questionHashedId","host":["https://app.claritalk.com/api"],"path":["meeting",":meetingHashedId","questions",":questionHashedId"],"variable":[{"key":"meetingHashedId","value":"63c4b1baf3b4460fa9936b1a20919bec","description":"Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID."},{"key":"questionHashedId","value":"d845b1c796c792278ecc890bfd899594","description":"Hashed question id: lowercase MD5 hex of the question's numeric `id` (as returned by `GET /meeting/:meetingHashedId/questions`)."}]},"description":"Generate an answer to one question from the meeting's transcript with AI, save it, and return the updated question. No request body.\n\n### Authentication\nBearer token required (inherited collection-level OAuth2). Include `Authorization: Bearer {token}`.\n\nRequires a **user-bound** token (authorization code / personal token). A service-account (`client_credentials`) token passes the bearer gate but has no user, so it is refused.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| meetingHashedId | path | string (MD5 hex) | Yes | Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID. |\n| questionHashedId | path | string (MD5 hex) | Yes | MD5 hex of the question's numeric id. The question must belong to this meeting. |\n\n### Response\n**200 OK** — the updated meeting question.\n```json\n{\n  \"id\": 88231,\n  \"meeting_id\": 4512,\n  \"meeting_theme_id\": 731,\n  \"question\": \"What budget is available for this project?\",\n  \"answer\": \"The client has roughly EUR 50,000 available for phase one.\",\n  \"created_at\": \"2026-09-30T09:12:44.000000Z\",\n  \"updated_at\": \"2026-09-30T10:01:02.000000Z\",\n  \"output_type\": \"single_line\",\n  \"keywords\": [\n    \"budget\",\n    \"available\",\n    \"project\"\n  ]\n}\n```\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 401 | No user resolved (e.g. service-account token) | `{\"error\": \"unauthenticated\"}` |\n| 404 | Meeting does not exist **or** caller may not see it (same response on purpose, to avoid confirming existence) | `{\"code\": 404, \"error\": \"Meeting not found\"}` |\n| 404 | Question not found, or it belongs to another meeting | `{\"code\": 404, \"error\": \"Meeting question not found\"}` |\n| 500 | Answer generation failed | `{\"code\": 500, \"error\": \"An error occurred\"}` in production (message `Failed to provide answer to question` elsewhere) |\n| 401 | Missing/invalid bearer token | `{\"code\": 401, \"error\": \"Unauthorized\"}` |\n| 403 | Caller's licence is blocked (trial expired) while billing enforcement is on | `{\"message\": \"Your trial has ended\", \"billing_blocked\": true}` |\n| 403 | Organisation requires 2FA and the caller has not enabled it | `{\"message\": \"...\"}` |\n| 429 | Rate limit exceeded | `{\"message\": \"Too Many Attempts.\"}` |\n\n### Notes\n- Reads the whole transcript through the organisation's configured AI provider; can be slow.\n- Rate limit: `ai-turn` 20 calls/min per caller, plus the group's 60/min.\n- _Auto-documented from source (routes/api.php + controller)._"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"code\": 404,\n  \"error\": \"Meeting question not found\"\n}"}],"_postman_id":"dab42253-05c0-4e57-87a0-067a4818279a"},{"name":"List meeting discussion topics","id":"d3847f9c-26f4-43eb-b9d9-1f9bc0b8d05e","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/meeting/:meetingHashedId/discussiontopics","description":"<p>List the meeting's discussion topics, ordered by <code>position</code>.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>Bearer token required (inherited collection-level OAuth2). Include <code>Authorization: Bearer {token}</code>.</p>\n<p>Requires a <strong>user-bound</strong> token (authorization code / personal token). A service-account (<code>client_credentials</code>) token passes the bearer gate but has no user, so it is refused.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>meetingHashedId</td>\n<td>path</td>\n<td>string (MD5 hex)</td>\n<td>Yes</td>\n<td>Hashed meeting id: the lowercase MD5 hex of the meeting's <strong>numeric</strong> id (e.g. <code>md5(\"4512\")</code>). Not the meeting UUID.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong> — array of discussion topics (empty array when none).</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"id\": \"5f0c2d1e-7a8b-4c9d-8e0f-1a2b3c4d5e6f\",\n    \"integration_id\": null,\n    \"title\": \"Q1 revenue targets\",\n    \"description\": \"Review progress against plan\",\n    \"meeting_id\": 4512,\n    \"created_at\": \"2026-09-30T09:12:44.000000Z\",\n    \"updated_at\": \"2026-09-30T09:12:44.000000Z\",\n    \"report\": null,\n    \"position\": 0,\n    \"metadata\": null,\n    \"keywords\": [\n      \"revenue\",\n      \"targets\",\n      \"Q1\"\n    ],\n    \"meeting_type_discussion_topic_template_id\": null\n  }\n]\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Condition</th>\n<th>Body</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>401</td>\n<td>No user resolved (e.g. service-account token)</td>\n<td><code>{\"error\": \"unauthenticated\"}</code></td>\n</tr>\n<tr>\n<td>404</td>\n<td>Meeting does not exist <strong>or</strong> caller may not see it (same response on purpose, to avoid confirming existence)</td>\n<td><code>{\"code\": 404, \"error\": \"Meeting not found\"}</code></td>\n</tr>\n<tr>\n<td>401</td>\n<td>Missing/invalid bearer token</td>\n<td><code>{\"code\": 401, \"error\": \"Unauthorized\"}</code></td>\n</tr>\n<tr>\n<td>403</td>\n<td>Caller's licence is blocked (trial expired) while billing enforcement is on</td>\n<td><code>{\"message\": \"Your trial has ended\", \"billing_blocked\": true}</code></td>\n</tr>\n<tr>\n<td>403</td>\n<td>Organisation requires 2FA and the caller has not enabled it</td>\n<td><code>{\"message\": \"...\"}</code></td>\n</tr>\n<tr>\n<td>429</td>\n<td>Rate limit exceeded</td>\n<td><code>{\"message\": \"Too Many Attempts.\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li><code>id</code> is a UUID. <code>keywords</code> is an array or <code>null</code>. <code>metadata</code> is returned as stored (not decoded).</li>\n<li>Rate limit: 60 calls/min per caller.</li>\n<li><em>Auto-documented from source (routes/api.php + controller).</em></li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["meeting",":meetingHashedId","discussiontopics"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[{"description":{"content":"<p>Hashed meeting id: the lowercase MD5 hex of the meeting's <strong>numeric</strong> id (e.g. <code>md5(\"4512\")</code>). Not the meeting UUID.</p>\n","type":"text/plain"},"type":"any","value":"63c4b1baf3b4460fa9936b1a20919bec","key":"meetingHashedId"}]}},"response":[{"id":"e9ac8d98-3a1e-41ac-b5df-0470d501ea81","name":"200 OK","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"https://app.claritalk.com/api/meeting/:meetingHashedId/discussiontopics","host":["https://app.claritalk.com/api"],"path":["meeting",":meetingHashedId","discussiontopics"],"variable":[{"key":"meetingHashedId","value":"63c4b1baf3b4460fa9936b1a20919bec","description":"Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID."}]},"description":"List the meeting's discussion topics, ordered by `position`.\n\n### Authentication\nBearer token required (inherited collection-level OAuth2). Include `Authorization: Bearer {token}`.\n\nRequires a **user-bound** token (authorization code / personal token). A service-account (`client_credentials`) token passes the bearer gate but has no user, so it is refused.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| meetingHashedId | path | string (MD5 hex) | Yes | Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID. |\n\n### Response\n**200 OK** — array of discussion topics (empty array when none).\n```json\n[\n  {\n    \"id\": \"5f0c2d1e-7a8b-4c9d-8e0f-1a2b3c4d5e6f\",\n    \"integration_id\": null,\n    \"title\": \"Q1 revenue targets\",\n    \"description\": \"Review progress against plan\",\n    \"meeting_id\": 4512,\n    \"created_at\": \"2026-09-30T09:12:44.000000Z\",\n    \"updated_at\": \"2026-09-30T09:12:44.000000Z\",\n    \"report\": null,\n    \"position\": 0,\n    \"metadata\": null,\n    \"keywords\": [\n      \"revenue\",\n      \"targets\",\n      \"Q1\"\n    ],\n    \"meeting_type_discussion_topic_template_id\": null\n  }\n]\n```\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 401 | No user resolved (e.g. service-account token) | `{\"error\": \"unauthenticated\"}` |\n| 404 | Meeting does not exist **or** caller may not see it (same response on purpose, to avoid confirming existence) | `{\"code\": 404, \"error\": \"Meeting not found\"}` |\n| 401 | Missing/invalid bearer token | `{\"code\": 401, \"error\": \"Unauthorized\"}` |\n| 403 | Caller's licence is blocked (trial expired) while billing enforcement is on | `{\"message\": \"Your trial has ended\", \"billing_blocked\": true}` |\n| 403 | Organisation requires 2FA and the caller has not enabled it | `{\"message\": \"...\"}` |\n| 429 | Rate limit exceeded | `{\"message\": \"Too Many Attempts.\"}` |\n\n### Notes\n- `id` is a UUID. `keywords` is an array or `null`. `metadata` is returned as stored (not decoded).\n- Rate limit: 60 calls/min per caller.\n- _Auto-documented from source (routes/api.php + controller)._"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"id\": \"5f0c2d1e-7a8b-4c9d-8e0f-1a2b3c4d5e6f\",\n    \"integration_id\": null,\n    \"title\": \"Q1 revenue targets\",\n    \"description\": \"Review progress against plan\",\n    \"meeting_id\": 4512,\n    \"created_at\": \"2026-09-30T09:12:44.000000Z\",\n    \"updated_at\": \"2026-09-30T09:12:44.000000Z\",\n    \"report\": null,\n    \"position\": 0,\n    \"metadata\": null,\n    \"keywords\": [\n      \"revenue\",\n      \"targets\",\n      \"Q1\"\n    ],\n    \"meeting_type_discussion_topic_template_id\": null\n  }\n]"},{"id":"a866c0f0-d84f-448b-83ed-5318575edd3f","name":"404 Meeting not found","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"https://app.claritalk.com/api/meeting/:meetingHashedId/discussiontopics","host":["https://app.claritalk.com/api"],"path":["meeting",":meetingHashedId","discussiontopics"],"variable":[{"key":"meetingHashedId","value":"63c4b1baf3b4460fa9936b1a20919bec","description":"Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID."}]},"description":"List the meeting's discussion topics, ordered by `position`.\n\n### Authentication\nBearer token required (inherited collection-level OAuth2). Include `Authorization: Bearer {token}`.\n\nRequires a **user-bound** token (authorization code / personal token). A service-account (`client_credentials`) token passes the bearer gate but has no user, so it is refused.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| meetingHashedId | path | string (MD5 hex) | Yes | Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID. |\n\n### Response\n**200 OK** — array of discussion topics (empty array when none).\n```json\n[\n  {\n    \"id\": \"5f0c2d1e-7a8b-4c9d-8e0f-1a2b3c4d5e6f\",\n    \"integration_id\": null,\n    \"title\": \"Q1 revenue targets\",\n    \"description\": \"Review progress against plan\",\n    \"meeting_id\": 4512,\n    \"created_at\": \"2026-09-30T09:12:44.000000Z\",\n    \"updated_at\": \"2026-09-30T09:12:44.000000Z\",\n    \"report\": null,\n    \"position\": 0,\n    \"metadata\": null,\n    \"keywords\": [\n      \"revenue\",\n      \"targets\",\n      \"Q1\"\n    ],\n    \"meeting_type_discussion_topic_template_id\": null\n  }\n]\n```\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 401 | No user resolved (e.g. service-account token) | `{\"error\": \"unauthenticated\"}` |\n| 404 | Meeting does not exist **or** caller may not see it (same response on purpose, to avoid confirming existence) | `{\"code\": 404, \"error\": \"Meeting not found\"}` |\n| 401 | Missing/invalid bearer token | `{\"code\": 401, \"error\": \"Unauthorized\"}` |\n| 403 | Caller's licence is blocked (trial expired) while billing enforcement is on | `{\"message\": \"Your trial has ended\", \"billing_blocked\": true}` |\n| 403 | Organisation requires 2FA and the caller has not enabled it | `{\"message\": \"...\"}` |\n| 429 | Rate limit exceeded | `{\"message\": \"Too Many Attempts.\"}` |\n\n### Notes\n- `id` is a UUID. `keywords` is an array or `null`. `metadata` is returned as stored (not decoded).\n- Rate limit: 60 calls/min per caller.\n- _Auto-documented from source (routes/api.php + controller)._"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"code\": 404,\n  \"error\": \"Meeting not found\"\n}"}],"_postman_id":"d3847f9c-26f4-43eb-b9d9-1f9bc0b8d05e"},{"name":"List meeting discussion topic keywords","id":"e52270c7-23a3-4098-a1bc-8d3eb1849b38","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/meeting/:meetingHashedId/discussiontopics/keywords","description":"<p>Get the keywords for every discussion topic of the meeting, keyed by topic UUID, for client-side live discussion tracking. Topics without stored keywords get them extracted on the fly (runs an AI model).</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>Bearer token required (inherited collection-level OAuth2). Include <code>Authorization: Bearer {token}</code>.</p>\n<p>Requires a <strong>user-bound</strong> token (authorization code / personal token). A service-account (<code>client_credentials</code>) token passes the bearer gate but has no user, so it is refused.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>meetingHashedId</td>\n<td>path</td>\n<td>string (MD5 hex)</td>\n<td>Yes</td>\n<td>Hashed meeting id: the lowercase MD5 hex of the meeting's <strong>numeric</strong> id (e.g. <code>md5(\"4512\")</code>). Not the meeting UUID.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong> — object mapping topic UUID to an array of keywords.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"5f0c2d1e-7a8b-4c9d-8e0f-1a2b3c4d5e6f\": [\n    \"revenue\",\n    \"targets\",\n    \"Q1\"\n  ]\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Condition</th>\n<th>Body</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>401</td>\n<td>No user resolved (e.g. service-account token)</td>\n<td><code>{\"error\": \"unauthenticated\"}</code></td>\n</tr>\n<tr>\n<td>404</td>\n<td>Meeting does not exist <strong>or</strong> caller may not see it (same response on purpose, to avoid confirming existence)</td>\n<td><code>{\"code\": 404, \"error\": \"Meeting not found\"}</code></td>\n</tr>\n<tr>\n<td>401</td>\n<td>Missing/invalid bearer token</td>\n<td><code>{\"code\": 401, \"error\": \"Unauthorized\"}</code></td>\n</tr>\n<tr>\n<td>403</td>\n<td>Caller's licence is blocked (trial expired) while billing enforcement is on</td>\n<td><code>{\"message\": \"Your trial has ended\", \"billing_blocked\": true}</code></td>\n</tr>\n<tr>\n<td>403</td>\n<td>Organisation requires 2FA and the caller has not enabled it</td>\n<td><code>{\"message\": \"...\"}</code></td>\n</tr>\n<tr>\n<td>429</td>\n<td>Rate limit exceeded</td>\n<td><code>{\"message\": \"Too Many Attempts.\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>A meeting with no topics returns an empty JSON array <code>[]</code>, not <code>{}</code>.</li>\n<li>If extraction fails for a topic, its value is <code>[]</code>; the request still succeeds.</li>\n<li>Rate limit: <code>meeting-keywords</code> 10 calls/min per caller <strong>per meeting</strong>, plus the group's 60/min.</li>\n<li><em>Auto-documented from source (routes/api.php + controller).</em></li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["meeting",":meetingHashedId","discussiontopics","keywords"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[{"description":{"content":"<p>Hashed meeting id: the lowercase MD5 hex of the meeting's <strong>numeric</strong> id (e.g. <code>md5(\"4512\")</code>). Not the meeting UUID.</p>\n","type":"text/plain"},"type":"any","value":"63c4b1baf3b4460fa9936b1a20919bec","key":"meetingHashedId"}]}},"response":[{"id":"fcae9ad4-af7a-459a-b145-20567e224322","name":"200 OK","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"https://app.claritalk.com/api/meeting/:meetingHashedId/discussiontopics/keywords","host":["https://app.claritalk.com/api"],"path":["meeting",":meetingHashedId","discussiontopics","keywords"],"variable":[{"key":"meetingHashedId","value":"63c4b1baf3b4460fa9936b1a20919bec","description":"Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID."}]},"description":"Get the keywords for every discussion topic of the meeting, keyed by topic UUID, for client-side live discussion tracking. Topics without stored keywords get them extracted on the fly (runs an AI model).\n\n### Authentication\nBearer token required (inherited collection-level OAuth2). Include `Authorization: Bearer {token}`.\n\nRequires a **user-bound** token (authorization code / personal token). A service-account (`client_credentials`) token passes the bearer gate but has no user, so it is refused.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| meetingHashedId | path | string (MD5 hex) | Yes | Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID. |\n\n### Response\n**200 OK** — object mapping topic UUID to an array of keywords.\n```json\n{\n  \"5f0c2d1e-7a8b-4c9d-8e0f-1a2b3c4d5e6f\": [\n    \"revenue\",\n    \"targets\",\n    \"Q1\"\n  ]\n}\n```\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 401 | No user resolved (e.g. service-account token) | `{\"error\": \"unauthenticated\"}` |\n| 404 | Meeting does not exist **or** caller may not see it (same response on purpose, to avoid confirming existence) | `{\"code\": 404, \"error\": \"Meeting not found\"}` |\n| 401 | Missing/invalid bearer token | `{\"code\": 401, \"error\": \"Unauthorized\"}` |\n| 403 | Caller's licence is blocked (trial expired) while billing enforcement is on | `{\"message\": \"Your trial has ended\", \"billing_blocked\": true}` |\n| 403 | Organisation requires 2FA and the caller has not enabled it | `{\"message\": \"...\"}` |\n| 429 | Rate limit exceeded | `{\"message\": \"Too Many Attempts.\"}` |\n\n### Notes\n- A meeting with no topics returns an empty JSON array `[]`, not `{}`.\n- If extraction fails for a topic, its value is `[]`; the request still succeeds.\n- Rate limit: `meeting-keywords` 10 calls/min per caller **per meeting**, plus the group's 60/min.\n- _Auto-documented from source (routes/api.php + controller)._"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"5f0c2d1e-7a8b-4c9d-8e0f-1a2b3c4d5e6f\": [\n    \"revenue\",\n    \"targets\",\n    \"Q1\"\n  ]\n}"},{"id":"f968a729-1bdc-40c5-ba48-384ac801a7f6","name":"404 Meeting not found","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"https://app.claritalk.com/api/meeting/:meetingHashedId/discussiontopics/keywords","host":["https://app.claritalk.com/api"],"path":["meeting",":meetingHashedId","discussiontopics","keywords"],"variable":[{"key":"meetingHashedId","value":"63c4b1baf3b4460fa9936b1a20919bec","description":"Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID."}]},"description":"Get the keywords for every discussion topic of the meeting, keyed by topic UUID, for client-side live discussion tracking. Topics without stored keywords get them extracted on the fly (runs an AI model).\n\n### Authentication\nBearer token required (inherited collection-level OAuth2). Include `Authorization: Bearer {token}`.\n\nRequires a **user-bound** token (authorization code / personal token). A service-account (`client_credentials`) token passes the bearer gate but has no user, so it is refused.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| meetingHashedId | path | string (MD5 hex) | Yes | Hashed meeting id: the lowercase MD5 hex of the meeting's **numeric** id (e.g. `md5(\"4512\")`). Not the meeting UUID. |\n\n### Response\n**200 OK** — object mapping topic UUID to an array of keywords.\n```json\n{\n  \"5f0c2d1e-7a8b-4c9d-8e0f-1a2b3c4d5e6f\": [\n    \"revenue\",\n    \"targets\",\n    \"Q1\"\n  ]\n}\n```\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 401 | No user resolved (e.g. service-account token) | `{\"error\": \"unauthenticated\"}` |\n| 404 | Meeting does not exist **or** caller may not see it (same response on purpose, to avoid confirming existence) | `{\"code\": 404, \"error\": \"Meeting not found\"}` |\n| 401 | Missing/invalid bearer token | `{\"code\": 401, \"error\": \"Unauthorized\"}` |\n| 403 | Caller's licence is blocked (trial expired) while billing enforcement is on | `{\"message\": \"Your trial has ended\", \"billing_blocked\": true}` |\n| 403 | Organisation requires 2FA and the caller has not enabled it | `{\"message\": \"...\"}` |\n| 429 | Rate limit exceeded | `{\"message\": \"Too Many Attempts.\"}` |\n\n### Notes\n- A meeting with no topics returns an empty JSON array `[]`, not `{}`.\n- If extraction fails for a topic, its value is `[]`; the request still succeeds.\n- Rate limit: `meeting-keywords` 10 calls/min per caller **per meeting**, plus the group's 60/min.\n- _Auto-documented from source (routes/api.php + controller)._"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"code\": 404,\n  \"error\": \"Meeting not found\"\n}"}],"_postman_id":"e52270c7-23a3-4098-a1bc-8d3eb1849b38"}],"id":"45f7a294-5c78-48ce-82f2-2dd04c4b10e7","description":"<p>Create, retrieve, and manage meetings — the core resource of the Claritalk platform.</p>\n","_postman_id":"45f7a294-5c78-48ce-82f2-2dd04c4b10e7","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}}},{"name":"Mobile app (deep links)","item":[{"name":"Start a prepared meeting","id":"d51c0a8f-93ab-484f-968e-13ffa516fcb0","request":{"auth":{"type":"noauth","isInherited":false},"method":"GET","header":[],"url":"claritalk://record?meeting={{meeting_uuid}}","description":"<p>Opens the app and starts recording the prepared meeting identified by <code>meeting</code>. Title, type, dossier and discussion topics come from the meeting; the uploaded audio is attached to it.</p>\n<p>Not an HTTP request: open this URL on the phone.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>meeting</td>\n<td>query</td>\n<td>string (UUID)</td>\n<td>Yes</td>\n<td>Meeting UUID (<code>id</code> from <code>POST /meetings</code>), status <code>draft</code>, owned by the signed-in app user</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"outcome-on-the-phone\">Outcome on the phone</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situation</th>\n<th>Result</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Draft owned by the user</td>\n<td>Recording starts immediately</td>\n</tr>\n<tr>\n<td>Meeting already recorded or not a draft</td>\n<td>Message, recording screen opens without starting</td>\n</tr>\n<tr>\n<td>Meeting of another user or not found</td>\n<td>Message, recording screen opens without starting</td>\n</tr>\n<tr>\n<td>A recording is already running</td>\n<td>Message, link ignored</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"protocol":"claritalk","host":["record"],"query":[{"description":{"content":"<p>UUID of a meeting in <code>draft</code> status, as returned by <code>POST /meetings</code>.</p>\n","type":"text/plain"},"key":"meeting","value":"{{meeting_uuid}}"}],"variable":[]}},"response":[],"_postman_id":"d51c0a8f-93ab-484f-968e-13ffa516fcb0"},{"name":"Start a new meeting with a title","id":"5f7168a6-f937-4a75-ab04-c0130f616f2f","request":{"auth":{"type":"noauth","isInherited":false},"method":"GET","header":[],"url":"claritalk://record?title=Weekly%20standup","description":"<p>Opens the app and starts a new recording with the given title. A new meeting is created on upload, as with a manual recording.</p>\n<p>Not an HTTP request: open this URL on the phone.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>title</td>\n<td>query</td>\n<td>string</td>\n<td>No</td>\n<td>Meeting title, URL-encoded. Omitted: the app uses its default title</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"protocol":"claritalk","host":["record"],"query":[{"description":{"content":"<p>Meeting title, URL-encoded.</p>\n","type":"text/plain"},"key":"title","value":"Weekly%20standup"}],"variable":[]}},"response":[],"_postman_id":"5f7168a6-f937-4a75-ab04-c0130f616f2f"},{"name":"Start a new meeting","id":"6f08de74-c941-4864-8855-882739b6d6bc","request":{"auth":{"type":"noauth","isInherited":false},"method":"GET","header":[],"url":"claritalk://record","description":"<p>Opens the app and starts a new recording with the default title (<code>Conversation: &lt;date&gt; - &lt;time&gt;</code>).</p>\n<p>Not an HTTP request: open this URL on the phone.</p>\n","urlObject":{"protocol":"claritalk","host":["record"],"query":[],"variable":[]}},"response":[],"_postman_id":"6f08de74-c941-4864-8855-882739b6d6bc"}],"id":"44e59ea8-6961-4e22-ad8d-cef1f8dc7a2f","description":"<p>Open the Claritalk mobile app (iOS and Android) and start a recording from a link. Available from app version 1.3.36.</p>\n<p>These are <strong>not HTTP calls</strong>: the link is opened on the phone (from a calendar note, a message, a QR code, an Apple Shortcuts automation or a script) and is handled by the installed app. They are listed here so integrations know how to hand a prepared meeting over to the app.</p>\n<h3 id=\"link-formats\">Link formats</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Link</th>\n<th>Result</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>claritalk://record?meeting={uuid}</code></td>\n<td>Starts the recording of a prepared meeting (a meeting in <code>draft</code> status).</td>\n</tr>\n<tr>\n<td><code>claritalk://record?title={title}</code></td>\n<td>Starts a new meeting with the given title (URL-encoded).</td>\n</tr>\n<tr>\n<td><code>claritalk://record</code></td>\n<td>Starts a new meeting with the default title.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"typical-flow-for-a-prepared-meeting\">Typical flow for a prepared meeting</h3>\n<ol>\n<li>Create the meeting with <code>POST /meetings</code> (name, <code>user_id</code>, <code>type_id</code>, <code>dossier_id</code>, <code>discussion_topics</code>, ...). The <code>id</code> in the response is the meeting UUID and the meeting is in <code>draft</code> status.</li>\n<li>Build the link <code>claritalk://record?meeting={id}</code> and hand it to the user: calendar invite, QR code, chat message.</li>\n<li>The user opens the link on the phone. The app fetches the meeting live (<code>GET /meetings/{id}</code>), fills in title, type, dossier and discussion topics, and starts recording immediately.</li>\n<li>When the recording is uploaded, the audio is attached to that same meeting; no new meeting is created and <code>recording_type</code> becomes <code>mobile</code>.</li>\n</ol>\n<h3 id=\"behaviour-and-limitations\">Behaviour and limitations</h3>\n<ul>\n<li>Only the meeting UUID goes in the link, never a token. The app uses its own session and the backend enforces access.</li>\n<li>The meeting must belong to the user signed in on the phone and must still be in <code>draft</code>. Otherwise the app shows a message and opens the recording screen without starting.</li>\n<li>The meeting can be created seconds before the link is opened; the app never caches meeting details.</li>\n<li>If a recording is already in progress, the link is ignored and a message is shown. An active recording is never interrupted.</li>\n<li>If the app has not been set up yet, the user first grants permissions and signs in; the recording starts right after that.</li>\n<li>Works when the app is closed, in the background or already open. If the app is not installed, the link does nothing (custom URL scheme, no web fallback).</li>\n<li>Links are tappable in Apple Notes, Calendar notes, Messages, Safari and Shortcuts on iOS, and in most Android apps. Some e-mail clients do not render custom-scheme links as tappable; a QR code is the safest hand-over from a desktop.</li>\n</ul>\n","_postman_id":"44e59ea8-6961-4e22-ad8d-cef1f8dc7a2f","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}}},{"name":"Reporting","item":[{"name":"Retrieve meeting reporting","id":"020e1325-17d4-48b5-9298-060d9d84d8ed","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/reporting/meetings?period=this_month","description":"<p>Per-user meeting reporting metrics for the authenticated tenant within a period. Intended for service-account integrations (e.g. Titeca) that pull Claritalk activity into their own reporting.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>Bearer token required (inherited from the collection's OAuth2 config).</p>\n<ul>\n<li><strong>End users</strong> (PAT / authorization code): the organisation is derived from the authenticated user; the <code>X-Tenant-ID</code> header is ignored.</li>\n<li><strong>Service accounts</strong> (client credentials): the organisation is selected via the <code>X-Tenant-ID</code> header (organisation UUID). Without a resolvable tenant the request returns <code>404</code>.</li>\n</ul>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>X-Tenant-ID</td>\n<td>header</td>\n<td>string (UUID)</td>\n<td>Service accounts only</td>\n<td>Organisation UUID to report on. Ignored for end-user tokens.</td>\n</tr>\n<tr>\n<td>period</td>\n<td>query</td>\n<td>string</td>\n<td>No</td>\n<td>Named window. One of <code>today</code>, <code>last_7_days</code>, <code>last_week</code>, <code>this_month</code>, <code>last_month</code>, <code>last_30_days</code>, <code>this_quarter</code>, <code>this_year</code>. Defaults to <code>this_month</code>. Ignored when both <code>date_start</code> and <code>date_end</code> are supplied.</td>\n</tr>\n<tr>\n<td>date_start</td>\n<td>query</td>\n<td>string (date)</td>\n<td>No</td>\n<td>Explicit range start (<code>YYYY-MM-DD</code>). Takes precedence over <code>period</code> when paired with <code>date_end</code>.</td>\n</tr>\n<tr>\n<td>date_end</td>\n<td>query</td>\n<td>string (date)</td>\n<td>No</td>\n<td>Explicit range end (<code>YYYY-MM-DD</code>).</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"organisation\": {\n    \"uuid\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"name\": \"Acme Accountants\"\n  },\n  \"period\": {\n    \"start\": \"2026-06-01 00:00:00\",\n    \"end\": \"2026-06-30 23:59:59\"\n  },\n  \"totals\": {\n    \"meetings_total\": 128,\n    \"meetings_processed\": 120,\n    \"meetings_not_final\": 8,\n    \"total_duration_seconds\": 274500,\n    \"tasks_created\": 96,\n    \"crm_pushes\": 41,\n    \"approved_reports\": 110\n  },\n  \"users\": [\n    {\n      \"user_id\": 12,\n      \"name\": \"Jane Doe\",\n      \"email\": \"jane@acme.example\",\n      \"meetings_total\": 34,\n      \"meetings_processed\": 33,\n      \"meetings_not_final\": 1,\n      \"meetings_failed\": 0,\n      \"meetings_stuck\": 1,\n      \"total_duration_seconds\": 71400,\n      \"tasks_created\": 28,\n      \"crm_pushes\": 12,\n      \"approved_reports\": 31\n    }\n  ]\n}\n</code></pre>\n<p><code>approved_reports</code> is <code>null</code> (both in <code>totals</code> and per user) when the tenant does not have the approval-flow feature enabled.</p>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Condition</th>\n<th>Body</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>401</td>\n<td>Missing/invalid token</td>\n<td><code>{\"message\": \"Unauthenticated.\"}</code></td>\n</tr>\n<tr>\n<td>404</td>\n<td>Tenant could not be resolved (service account with unknown/absent <code>X-Tenant-ID</code>, or user without an organisation)</td>\n<td><code>{\"message\": \"Organisation not found\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>Rate limit: <strong>60 requests/min</strong> — each call fans out into several org-wide aggregation queries.</li>\n<li>Explicit <code>date_start</code>/<code>date_end</code> ranges are clamped to a <strong>maximum window of 366 days</strong> (the start is pulled forward toward the end date if the range is wider).</li>\n<li>Auto-documented from <code>App\\Http\\Controllers\\Api\\Reporting\\RetrieveAction</code> (SANO-2814).</li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["reporting","meetings"],"host":["https://app.claritalk.com/api"],"query":[{"description":{"content":"<p>Named window: today, last_7_days, last_week, this_month, last_month, last_30_days, this_quarter, this_year. Default: this_month.</p>\n","type":"text/plain"},"key":"period","value":"this_month"},{"disabled":true,"description":{"content":"<p>Explicit range start (YYYY-MM-DD). Overrides period when paired with date_end.</p>\n","type":"text/plain"},"key":"date_start","value":""},{"disabled":true,"description":{"content":"<p>Explicit range end (YYYY-MM-DD).</p>\n","type":"text/plain"},"key":"date_end","value":""}],"variable":[]}},"response":[{"id":"44230fc4-a0c4-4595-a29e-5fc5e4078cfe","name":"200 OK","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"},{"key":"X-Tenant-ID","value":"","description":"Organisation UUID. Required for service-account (client_credentials) tokens; ignored for end-user tokens.","disabled":true}],"url":{"raw":"https://app.claritalk.com/api/reporting/meetings?period=this_month","host":["https://app.claritalk.com/api"],"path":["reporting","meetings"],"query":[{"key":"period","value":"this_month","description":"Named window: today, last_7_days, last_week, this_month, last_month, last_30_days, this_quarter, this_year. Default: this_month."},{"key":"date_start","value":"","description":"Explicit range start (YYYY-MM-DD). Overrides period when paired with date_end.","disabled":true},{"key":"date_end","value":"","description":"Explicit range end (YYYY-MM-DD).","disabled":true}]},"description":"Per-user meeting reporting metrics for the authenticated tenant within a period. Intended for service-account integrations (e.g. Titeca) that pull Claritalk activity into their own reporting.\n\n### Authentication\nBearer token required (inherited from the collection's OAuth2 config).\n- **End users** (PAT / authorization code): the organisation is derived from the authenticated user; the `X-Tenant-ID` header is ignored.\n- **Service accounts** (client credentials): the organisation is selected via the `X-Tenant-ID` header (organisation UUID). Without a resolvable tenant the request returns `404`.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| X-Tenant-ID | header | string (UUID) | Service accounts only | Organisation UUID to report on. Ignored for end-user tokens. |\n| period | query | string | No | Named window. One of `today`, `last_7_days`, `last_week`, `this_month`, `last_month`, `last_30_days`, `this_quarter`, `this_year`. Defaults to `this_month`. Ignored when both `date_start` and `date_end` are supplied. |\n| date_start | query | string (date) | No | Explicit range start (`YYYY-MM-DD`). Takes precedence over `period` when paired with `date_end`. |\n| date_end | query | string (date) | No | Explicit range end (`YYYY-MM-DD`). |\n\n### Response\n**200 OK**\n```json\n{\n  \"organisation\": {\n    \"uuid\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"name\": \"Acme Accountants\"\n  },\n  \"period\": {\n    \"start\": \"2026-06-01 00:00:00\",\n    \"end\": \"2026-06-30 23:59:59\"\n  },\n  \"totals\": {\n    \"meetings_total\": 128,\n    \"meetings_processed\": 120,\n    \"meetings_not_final\": 8,\n    \"total_duration_seconds\": 274500,\n    \"tasks_created\": 96,\n    \"crm_pushes\": 41,\n    \"approved_reports\": 110\n  },\n  \"users\": [\n    {\n      \"user_id\": 12,\n      \"name\": \"Jane Doe\",\n      \"email\": \"jane@acme.example\",\n      \"meetings_total\": 34,\n      \"meetings_processed\": 33,\n      \"meetings_not_final\": 1,\n      \"meetings_failed\": 0,\n      \"meetings_stuck\": 1,\n      \"total_duration_seconds\": 71400,\n      \"tasks_created\": 28,\n      \"crm_pushes\": 12,\n      \"approved_reports\": 31\n    }\n  ]\n}\n```\n\n`approved_reports` is `null` (both in `totals` and per user) when the tenant does not have the approval-flow feature enabled.\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 401 | Missing/invalid token | `{\"message\": \"Unauthenticated.\"}` |\n| 404 | Tenant could not be resolved (service account with unknown/absent `X-Tenant-ID`, or user without an organisation) | `{\"message\": \"Organisation not found\"}` |\n\n### Notes\n- Rate limit: **60 requests/min** — each call fans out into several org-wide aggregation queries.\n- Explicit `date_start`/`date_end` ranges are clamped to a **maximum window of 366 days** (the start is pulled forward toward the end date if the range is wider).\n- Auto-documented from `App\\Http\\Controllers\\Api\\Reporting\\RetrieveAction` (SANO-2814)."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"organisation\": {\n    \"uuid\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"name\": \"Acme Accountants\"\n  },\n  \"period\": {\n    \"start\": \"2026-06-01 00:00:00\",\n    \"end\": \"2026-06-30 23:59:59\"\n  },\n  \"totals\": {\n    \"meetings_total\": 128,\n    \"meetings_processed\": 120,\n    \"meetings_not_final\": 8,\n    \"total_duration_seconds\": 274500,\n    \"tasks_created\": 96,\n    \"crm_pushes\": 41,\n    \"approved_reports\": 110\n  },\n  \"users\": [\n    {\n      \"user_id\": 12,\n      \"name\": \"Jane Doe\",\n      \"email\": \"jane@acme.example\",\n      \"meetings_total\": 34,\n      \"meetings_processed\": 33,\n      \"meetings_not_final\": 1,\n      \"meetings_failed\": 0,\n      \"meetings_stuck\": 1,\n      \"total_duration_seconds\": 71400,\n      \"tasks_created\": 28,\n      \"crm_pushes\": 12,\n      \"approved_reports\": 31\n    },\n    {\n      \"user_id\": 15,\n      \"name\": \"John Smith\",\n      \"email\": \"john@acme.example\",\n      \"meetings_total\": 22,\n      \"meetings_processed\": 21,\n      \"meetings_not_final\": 1,\n      \"meetings_failed\": 1,\n      \"meetings_stuck\": 0,\n      \"total_duration_seconds\": 48120,\n      \"tasks_created\": 17,\n      \"crm_pushes\": 6,\n      \"approved_reports\": 20\n    }\n  ]\n}"},{"id":"f67a1867-1828-4db8-8ad8-ff3e6a05c969","name":"404 Organisation not found","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"},{"key":"X-Tenant-ID","value":"","description":"Organisation UUID. Required for service-account (client_credentials) tokens; ignored for end-user tokens.","disabled":true}],"url":{"raw":"https://app.claritalk.com/api/reporting/meetings?period=this_month","host":["https://app.claritalk.com/api"],"path":["reporting","meetings"],"query":[{"key":"period","value":"this_month","description":"Named window: today, last_7_days, last_week, this_month, last_month, last_30_days, this_quarter, this_year. Default: this_month."},{"key":"date_start","value":"","description":"Explicit range start (YYYY-MM-DD). Overrides period when paired with date_end.","disabled":true},{"key":"date_end","value":"","description":"Explicit range end (YYYY-MM-DD).","disabled":true}]},"description":"Per-user meeting reporting metrics for the authenticated tenant within a period. Intended for service-account integrations (e.g. Titeca) that pull Claritalk activity into their own reporting.\n\n### Authentication\nBearer token required (inherited from the collection's OAuth2 config).\n- **End users** (PAT / authorization code): the organisation is derived from the authenticated user; the `X-Tenant-ID` header is ignored.\n- **Service accounts** (client credentials): the organisation is selected via the `X-Tenant-ID` header (organisation UUID). Without a resolvable tenant the request returns `404`.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| X-Tenant-ID | header | string (UUID) | Service accounts only | Organisation UUID to report on. Ignored for end-user tokens. |\n| period | query | string | No | Named window. One of `today`, `last_7_days`, `last_week`, `this_month`, `last_month`, `last_30_days`, `this_quarter`, `this_year`. Defaults to `this_month`. Ignored when both `date_start` and `date_end` are supplied. |\n| date_start | query | string (date) | No | Explicit range start (`YYYY-MM-DD`). Takes precedence over `period` when paired with `date_end`. |\n| date_end | query | string (date) | No | Explicit range end (`YYYY-MM-DD`). |\n\n### Response\n**200 OK**\n```json\n{\n  \"organisation\": {\n    \"uuid\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"name\": \"Acme Accountants\"\n  },\n  \"period\": {\n    \"start\": \"2026-06-01 00:00:00\",\n    \"end\": \"2026-06-30 23:59:59\"\n  },\n  \"totals\": {\n    \"meetings_total\": 128,\n    \"meetings_processed\": 120,\n    \"meetings_not_final\": 8,\n    \"total_duration_seconds\": 274500,\n    \"tasks_created\": 96,\n    \"crm_pushes\": 41,\n    \"approved_reports\": 110\n  },\n  \"users\": [\n    {\n      \"user_id\": 12,\n      \"name\": \"Jane Doe\",\n      \"email\": \"jane@acme.example\",\n      \"meetings_total\": 34,\n      \"meetings_processed\": 33,\n      \"meetings_not_final\": 1,\n      \"meetings_failed\": 0,\n      \"meetings_stuck\": 1,\n      \"total_duration_seconds\": 71400,\n      \"tasks_created\": 28,\n      \"crm_pushes\": 12,\n      \"approved_reports\": 31\n    }\n  ]\n}\n```\n\n`approved_reports` is `null` (both in `totals` and per user) when the tenant does not have the approval-flow feature enabled.\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 401 | Missing/invalid token | `{\"message\": \"Unauthenticated.\"}` |\n| 404 | Tenant could not be resolved (service account with unknown/absent `X-Tenant-ID`, or user without an organisation) | `{\"message\": \"Organisation not found\"}` |\n\n### Notes\n- Rate limit: **60 requests/min** — each call fans out into several org-wide aggregation queries.\n- Explicit `date_start`/`date_end` ranges are clamped to a **maximum window of 366 days** (the start is pulled forward toward the end date if the range is wider).\n- Auto-documented from `App\\Http\\Controllers\\Api\\Reporting\\RetrieveAction` (SANO-2814)."},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"Organisation not found\"\n}"}],"_postman_id":"020e1325-17d4-48b5-9298-060d9d84d8ed"}],"id":"9ab43d34-d999-4da5-a768-5f3a67139b7a","_postman_id":"9ab43d34-d999-4da5-a768-5f3a67139b7a","description":"","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}}},{"name":"Dossier","item":[{"name":"List dossiers","id":"91cb8811-87c9-447e-96ab-02665435fafb","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/dossiers/list","description":"<p>List all dossiers accessible to the authenticated user, with optional filters and cursor pagination.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>X-Tenant-ID</td>\n<td>header</td>\n<td>string (UUID)</td>\n<td>Service accounts only</td>\n<td>Organisation UUID. Ignored for end-user tokens</td>\n</tr>\n<tr>\n<td>q</td>\n<td>query</td>\n<td>string</td>\n<td>No</td>\n<td>Matches title or description (contains)</td>\n</tr>\n<tr>\n<td>team_id</td>\n<td>query</td>\n<td>string (UUID)</td>\n<td>No</td>\n<td>Only dossiers linked to this team. Narrows access, never widens it</td>\n</tr>\n<tr>\n<td>dossier_type</td>\n<td>query</td>\n<td>string</td>\n<td>No</td>\n<td><code>local</code> (no linked relations) or <code>integration</code> (one or more)</td>\n</tr>\n<tr>\n<td>integration</td>\n<td>query</td>\n<td>string</td>\n<td>No</td>\n<td><code>adminpulse</code>, <code>silverfin</code>, <code>fid_manager</code>, <code>brokercloud</code> or <code>o365_onenote</code>. Works without <code>dossier_type</code></td>\n</tr>\n<tr>\n<td>sort</td>\n<td>query</td>\n<td>string</td>\n<td>No</td>\n<td><code>created_at</code> (default), <code>updated_at</code>, <code>title</code></td>\n</tr>\n<tr>\n<td>dir</td>\n<td>query</td>\n<td>string</td>\n<td>No</td>\n<td><code>asc</code> or <code>desc</code> (default)</td>\n</tr>\n<tr>\n<td>per_page</td>\n<td>query</td>\n<td>integer</td>\n<td>No</td>\n<td>1–100, default 15. End-user tokens only</td>\n</tr>\n<tr>\n<td>cursor</td>\n<td>query</td>\n<td>string</td>\n<td>No</td>\n<td>Next-page cursor. Use <code>links.next</code> as-is. End-user tokens only</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK, no query parameters</strong> — bare array of dossier objects (no relations).</p>\n<p><strong>200 OK, end-user token with any filter or pagination parameter</strong> — paginated envelope:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"data\": [\n    {\n      \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n      \"title\": \"Acme\",\n      \"description\": null,\n      \"logo\": null,\n      \"metadata\": {},\n      \"created_at\": \"2026-09-01T10:00:00.000000Z\",\n      \"updated_at\": \"2026-09-01T10:00:00.000000Z\",\n      \"teams\": [],\n      \"users\": [],\n      \"organisations\": []\n    }\n  ],\n  \"meta\": { \"per_page\": 15, \"has_pages\": true, \"has_more_pages\": true },\n  \"links\": {\n    \"prev\": null,\n    \"next\": \"https://app.claritalk.com/api/dossiers/list?cursor=...\",\n    \"path\": \"https://app.claritalk.com/api/dossiers/list\"\n  }\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\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>404</td>\n<td>Organisation or user not found</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>Service accounts see all dossiers. End users see only accessible ones.</li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["dossiers","list"],"host":["https://app.claritalk.com/api"],"query":[{"disabled":true,"description":{"content":"<p>Matches title or description (contains)</p>\n","type":"text/plain"},"key":"q","value":"acme"},{"disabled":true,"description":{"content":"<p>Only dossiers linked to this team UUID</p>\n","type":"text/plain"},"key":"team_id","value":""},{"disabled":true,"description":{"content":"<p><code>local</code> or <code>integration</code></p>\n","type":"text/plain"},"key":"dossier_type","value":"integration"},{"disabled":true,"description":{"content":"<p>adminpulse | silverfin | fid_manager | brokercloud | o365_onenote</p>\n","type":"text/plain"},"key":"integration","value":"silverfin"},{"disabled":true,"description":{"content":"<p>created_at (default) | updated_at | title</p>\n","type":"text/plain"},"key":"sort","value":"created_at"},{"disabled":true,"description":{"content":"<p>asc | desc (default)</p>\n","type":"text/plain"},"key":"dir","value":"desc"},{"disabled":true,"description":{"content":"<p>1-100, default 15 (end-user tokens only)</p>\n","type":"text/plain"},"key":"per_page","value":"15"},{"disabled":true,"description":{"content":"<p>Cursor from links.next (end-user tokens only)</p>\n","type":"text/plain"},"key":"cursor","value":""}],"variable":[]}},"response":[],"_postman_id":"91cb8811-87c9-447e-96ab-02665435fafb"}],"id":"c35af466-1c70-4d5b-b902-b4487e3cc6da","description":"<p>Dossiers group related meetings together.</p>\n","_postman_id":"c35af466-1c70-4d5b-b902-b4487e3cc6da","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}}},{"name":"Tasks","item":[{"name":"List tasks","id":"e39ce032-22d7-47f5-a0ae-c68c13a8ab33","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/tasks/list","description":"<p>List the caller's tasks, grouped by meeting, with cursor pagination. Only meetings the caller can access are included.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>Bearer token required (inherited collection-level OAuth2). Include <code>Authorization: Bearer {token}</code>.</p>\n<p>Requires a <strong>user-bound</strong> token (authorization code / personal token). A service-account (<code>client_credentials</code>) token passes the bearer gate but has no user, so it is refused.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>q</td>\n<td>query</td>\n<td>string</td>\n<td>No</td>\n<td>Search task text and topics</td>\n</tr>\n<tr>\n<td>from</td>\n<td>query</td>\n<td>date</td>\n<td>No</td>\n<td>Task due date from</td>\n</tr>\n<tr>\n<td>to</td>\n<td>query</td>\n<td>date</td>\n<td>No</td>\n<td>Task due date until</td>\n</tr>\n<tr>\n<td>sort</td>\n<td>query</td>\n<td>string</td>\n<td>No</td>\n<td>Meeting column: <code>created_at</code> (default), <code>updated_at</code>, <code>name</code></td>\n</tr>\n<tr>\n<td>dir</td>\n<td>query</td>\n<td>string</td>\n<td>No</td>\n<td><code>asc</code> or <code>desc</code> (default <code>desc</code>)</td>\n</tr>\n<tr>\n<td>per_page</td>\n<td>query</td>\n<td>integer</td>\n<td>No</td>\n<td>Meetings per page, 1–100 (default <code>15</code>)</td>\n</tr>\n<tr>\n<td>is_completed</td>\n<td>query</td>\n<td>boolean</td>\n<td>No</td>\n<td>Filter tasks by completion</td>\n</tr>\n<tr>\n<td>dossier</td>\n<td>query</td>\n<td>string</td>\n<td>No</td>\n<td>Narrow to one dossier (never widens access)</td>\n</tr>\n<tr>\n<td>team</td>\n<td>query</td>\n<td>string</td>\n<td>No</td>\n<td>Narrow to one team (never widens access)</td>\n</tr>\n<tr>\n<td>assigned_to_me</td>\n<td>query</td>\n<td>boolean</td>\n<td>No</td>\n<td>Only tasks whose <code>attendee</code> contains the caller</td>\n</tr>\n<tr>\n<td>cursor</td>\n<td>query</td>\n<td>string</td>\n<td>No</td>\n<td>Opaque cursor from <code>links</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"data\": [\n    {\n      \"id\": 4512,\n      \"uuid\": \"550e8400-e29b-41d4-a716-446655440000\",\n      \"user_id\": 27,\n      \"dossier_id\": \"0b7d9a52-1f3e-4c6a-9d8b-2e4f6a8c0e1d\",\n      \"name\": \"Weekly standup\",\n      \"tasks\": [\n        {\n          \"id\": 901,\n          \"meeting_id\": 4512,\n          \"task\": \"Send the revised proposal\",\n          \"is_completed\": 0,\n          \"topics\": \"Proposal\",\n          \"attendee\": [\n            27,\n            -1\n          ],\n          \"due_date\": \"2026-10-07\",\n          \"created_at\": \"2026-09-30T11:00:00.000000Z\",\n          \"updated_at\": \"2026-09-30T11:00:00.000000Z\",\n          \"assignees\": [\n            {\n              \"id\": 27,\n              \"name\": \"Jane Doe\"\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"meta\": {\n    \"per_page\": 15,\n    \"has_pages\": true,\n    \"has_more_pages\": true\n  },\n  \"links\": {\n    \"prev\": null,\n    \"next\": \"https://app.claritalk.com/api/tasks/list?per_page=15&amp;cursor=eyJjcmVhdGVkX2F0Ijo...\",\n    \"path\": \"https://app.claritalk.com/api/tasks/list\"\n  }\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Condition</th>\n<th>Body</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>403</td>\n<td>Service-account token (no user)</td>\n<td><code>{\"code\": 403, \"error\": \"This endpoint requires a user-bound access token.\"}</code></td>\n</tr>\n<tr>\n<td>404</td>\n<td>Caller has no organisation</td>\n<td><code>{\"message\": \"Organisation not found\"}</code></td>\n</tr>\n<tr>\n<td>422</td>\n<td>Invalid filter (e.g. <code>sort=due_date</code>, <code>per_page=500</code>)</td>\n<td><code>{\"message\": \"...\", \"errors\": {\"sort\": [\"The selected sort is invalid.\"]}}</code></td>\n</tr>\n<tr>\n<td>401</td>\n<td>Missing/invalid bearer token</td>\n<td><code>{\"code\": 401, \"error\": \"Unauthorized\"}</code></td>\n</tr>\n<tr>\n<td>403</td>\n<td>Caller's licence is blocked (trial expired) while billing enforcement is on</td>\n<td><code>{\"message\": \"Your trial has ended\", \"billing_blocked\": true}</code></td>\n</tr>\n<tr>\n<td>403</td>\n<td>Organisation requires 2FA and the caller has not enabled it</td>\n<td><code>{\"message\": \"...\"}</code></td>\n</tr>\n<tr>\n<td>429</td>\n<td>Rate limit exceeded</td>\n<td><code>{\"message\": \"Too Many Attempts.\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>Pagination, <code>sort</code> and <code>dir</code> apply to <strong>meetings</strong>, not tasks; each meeting carries only its tasks that match the filters.</li>\n<li><code>attendee</code> holds numeric user ids (<code>-1</code> = external person); <code>assignees</code> resolves them to <code>{id, name}</code> within the caller's organisation.</li>\n<li><code>is_completed</code> is returned as <code>0</code>/<code>1</code>.</li>\n<li>Rate limit: 60 calls/min per caller.</li>\n<li><em>Auto-documented from source (routes/api.php + controller).</em></li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["tasks","list"],"host":["https://app.claritalk.com/api"],"query":[{"disabled":true,"description":{"content":"<p>Search in task text and topics (contains match)</p>\n","type":"text/plain"},"key":"q","value":""},{"disabled":true,"description":{"content":"<p>Due date from (date)</p>\n","type":"text/plain"},"key":"from","value":""},{"disabled":true,"description":{"content":"<p>Due date until (date)</p>\n","type":"text/plain"},"key":"to","value":""},{"disabled":true,"description":{"content":"<p>Meeting column to sort by: created_at (default), updated_at, name</p>\n","type":"text/plain"},"key":"sort","value":"created_at"},{"disabled":true,"description":{"content":"<p>asc or desc (default: desc)</p>\n","type":"text/plain"},"key":"dir","value":"desc"},{"disabled":true,"description":{"content":"<p>Meetings per page, 1-100 (default: 15)</p>\n","type":"text/plain"},"key":"per_page","value":"15"},{"disabled":true,"description":{"content":"<p>Filter tasks by completion (boolean: 1/0/true/false)</p>\n","type":"text/plain"},"key":"is_completed","value":""},{"disabled":true,"description":{"content":"<p>Narrow to a dossier (id)</p>\n","type":"text/plain"},"key":"dossier","value":""},{"disabled":true,"description":{"content":"<p>Narrow to a team</p>\n","type":"text/plain"},"key":"team","value":""},{"disabled":true,"description":{"content":"<p>Only tasks assigned to the caller (boolean)</p>\n","type":"text/plain"},"key":"assigned_to_me","value":""},{"disabled":true,"description":{"content":"<p>Cursor from links.next / links.prev</p>\n","type":"text/plain"},"key":"cursor","value":""}],"variable":[]}},"response":[{"id":"c955f272-e7d6-47a2-a512-88a3127151a7","name":"200 OK","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"https://app.claritalk.com/api/tasks/list","host":["https://app.claritalk.com/api"],"path":["tasks","list"],"query":[{"key":"q","value":"","description":"Search in task text and topics (contains match)","disabled":true},{"key":"from","value":"","description":"Due date from (date)","disabled":true},{"key":"to","value":"","description":"Due date until (date)","disabled":true},{"key":"sort","value":"created_at","description":"Meeting column to sort by: created_at (default), updated_at, name","disabled":true},{"key":"dir","value":"desc","description":"asc or desc (default: desc)","disabled":true},{"key":"per_page","value":"15","description":"Meetings per page, 1-100 (default: 15)","disabled":true},{"key":"is_completed","value":"","description":"Filter tasks by completion (boolean: 1/0/true/false)","disabled":true},{"key":"dossier","value":"","description":"Narrow to a dossier (id)","disabled":true},{"key":"team","value":"","description":"Narrow to a team","disabled":true},{"key":"assigned_to_me","value":"","description":"Only tasks assigned to the caller (boolean)","disabled":true},{"key":"cursor","value":"","description":"Cursor from links.next / links.prev","disabled":true}]},"description":"List the caller's tasks, grouped by meeting, with cursor pagination. Only meetings the caller can access are included.\n\n### Authentication\nBearer token required (inherited collection-level OAuth2). Include `Authorization: Bearer {token}`.\n\nRequires a **user-bound** token (authorization code / personal token). A service-account (`client_credentials`) token passes the bearer gate but has no user, so it is refused.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| q | query | string | No | Search task text and topics |\n| from | query | date | No | Task due date from |\n| to | query | date | No | Task due date until |\n| sort | query | string | No | Meeting column: `created_at` (default), `updated_at`, `name` |\n| dir | query | string | No | `asc` or `desc` (default `desc`) |\n| per_page | query | integer | No | Meetings per page, 1–100 (default `15`) |\n| is_completed | query | boolean | No | Filter tasks by completion |\n| dossier | query | string | No | Narrow to one dossier (never widens access) |\n| team | query | string | No | Narrow to one team (never widens access) |\n| assigned_to_me | query | boolean | No | Only tasks whose `attendee` contains the caller |\n| cursor | query | string | No | Opaque cursor from `links` |\n\n### Response\n**200 OK**\n```json\n{\n  \"data\": [\n    {\n      \"id\": 4512,\n      \"uuid\": \"550e8400-e29b-41d4-a716-446655440000\",\n      \"user_id\": 27,\n      \"dossier_id\": \"0b7d9a52-1f3e-4c6a-9d8b-2e4f6a8c0e1d\",\n      \"name\": \"Weekly standup\",\n      \"tasks\": [\n        {\n          \"id\": 901,\n          \"meeting_id\": 4512,\n          \"task\": \"Send the revised proposal\",\n          \"is_completed\": 0,\n          \"topics\": \"Proposal\",\n          \"attendee\": [\n            27,\n            -1\n          ],\n          \"due_date\": \"2026-10-07\",\n          \"created_at\": \"2026-09-30T11:00:00.000000Z\",\n          \"updated_at\": \"2026-09-30T11:00:00.000000Z\",\n          \"assignees\": [\n            {\n              \"id\": 27,\n              \"name\": \"Jane Doe\"\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"meta\": {\n    \"per_page\": 15,\n    \"has_pages\": true,\n    \"has_more_pages\": true\n  },\n  \"links\": {\n    \"prev\": null,\n    \"next\": \"https://app.claritalk.com/api/tasks/list?per_page=15&cursor=eyJjcmVhdGVkX2F0Ijo...\",\n    \"path\": \"https://app.claritalk.com/api/tasks/list\"\n  }\n}\n```\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 403 | Service-account token (no user) | `{\"code\": 403, \"error\": \"This endpoint requires a user-bound access token.\"}` |\n| 404 | Caller has no organisation | `{\"message\": \"Organisation not found\"}` |\n| 422 | Invalid filter (e.g. `sort=due_date`, `per_page=500`) | `{\"message\": \"...\", \"errors\": {\"sort\": [\"The selected sort is invalid.\"]}}` |\n| 401 | Missing/invalid bearer token | `{\"code\": 401, \"error\": \"Unauthorized\"}` |\n| 403 | Caller's licence is blocked (trial expired) while billing enforcement is on | `{\"message\": \"Your trial has ended\", \"billing_blocked\": true}` |\n| 403 | Organisation requires 2FA and the caller has not enabled it | `{\"message\": \"...\"}` |\n| 429 | Rate limit exceeded | `{\"message\": \"Too Many Attempts.\"}` |\n\n### Notes\n- Pagination, `sort` and `dir` apply to **meetings**, not tasks; each meeting carries only its tasks that match the filters.\n- `attendee` holds numeric user ids (`-1` = external person); `assignees` resolves them to `{id, name}` within the caller's organisation.\n- `is_completed` is returned as `0`/`1`.\n- Rate limit: 60 calls/min per caller.\n- _Auto-documented from source (routes/api.php + controller)._"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"id\": 4512,\n      \"uuid\": \"550e8400-e29b-41d4-a716-446655440000\",\n      \"user_id\": 27,\n      \"dossier_id\": \"0b7d9a52-1f3e-4c6a-9d8b-2e4f6a8c0e1d\",\n      \"name\": \"Weekly standup\",\n      \"tasks\": [\n        {\n          \"id\": 901,\n          \"meeting_id\": 4512,\n          \"task\": \"Send the revised proposal\",\n          \"is_completed\": 0,\n          \"topics\": \"Proposal\",\n          \"attendee\": [\n            27,\n            -1\n          ],\n          \"due_date\": \"2026-10-07\",\n          \"created_at\": \"2026-09-30T11:00:00.000000Z\",\n          \"updated_at\": \"2026-09-30T11:00:00.000000Z\",\n          \"assignees\": [\n            {\n              \"id\": 27,\n              \"name\": \"Jane Doe\"\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"meta\": {\n    \"per_page\": 15,\n    \"has_pages\": true,\n    \"has_more_pages\": true\n  },\n  \"links\": {\n    \"prev\": null,\n    \"next\": \"https://app.claritalk.com/api/tasks/list?per_page=15&cursor=eyJjcmVhdGVkX2F0Ijo...\",\n    \"path\": \"https://app.claritalk.com/api/tasks/list\"\n  }\n}"},{"id":"5fc947ae-62d6-4fd3-b32a-19dd7f810141","name":"403 Service account","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"https://app.claritalk.com/api/tasks/list","host":["https://app.claritalk.com/api"],"path":["tasks","list"],"query":[{"key":"q","value":"","description":"Search in task text and topics (contains match)","disabled":true},{"key":"from","value":"","description":"Due date from (date)","disabled":true},{"key":"to","value":"","description":"Due date until (date)","disabled":true},{"key":"sort","value":"created_at","description":"Meeting column to sort by: created_at (default), updated_at, name","disabled":true},{"key":"dir","value":"desc","description":"asc or desc (default: desc)","disabled":true},{"key":"per_page","value":"15","description":"Meetings per page, 1-100 (default: 15)","disabled":true},{"key":"is_completed","value":"","description":"Filter tasks by completion (boolean: 1/0/true/false)","disabled":true},{"key":"dossier","value":"","description":"Narrow to a dossier (id)","disabled":true},{"key":"team","value":"","description":"Narrow to a team","disabled":true},{"key":"assigned_to_me","value":"","description":"Only tasks assigned to the caller (boolean)","disabled":true},{"key":"cursor","value":"","description":"Cursor from links.next / links.prev","disabled":true}]},"description":"List the caller's tasks, grouped by meeting, with cursor pagination. Only meetings the caller can access are included.\n\n### Authentication\nBearer token required (inherited collection-level OAuth2). Include `Authorization: Bearer {token}`.\n\nRequires a **user-bound** token (authorization code / personal token). A service-account (`client_credentials`) token passes the bearer gate but has no user, so it is refused.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| q | query | string | No | Search task text and topics |\n| from | query | date | No | Task due date from |\n| to | query | date | No | Task due date until |\n| sort | query | string | No | Meeting column: `created_at` (default), `updated_at`, `name` |\n| dir | query | string | No | `asc` or `desc` (default `desc`) |\n| per_page | query | integer | No | Meetings per page, 1–100 (default `15`) |\n| is_completed | query | boolean | No | Filter tasks by completion |\n| dossier | query | string | No | Narrow to one dossier (never widens access) |\n| team | query | string | No | Narrow to one team (never widens access) |\n| assigned_to_me | query | boolean | No | Only tasks whose `attendee` contains the caller |\n| cursor | query | string | No | Opaque cursor from `links` |\n\n### Response\n**200 OK**\n```json\n{\n  \"data\": [\n    {\n      \"id\": 4512,\n      \"uuid\": \"550e8400-e29b-41d4-a716-446655440000\",\n      \"user_id\": 27,\n      \"dossier_id\": \"0b7d9a52-1f3e-4c6a-9d8b-2e4f6a8c0e1d\",\n      \"name\": \"Weekly standup\",\n      \"tasks\": [\n        {\n          \"id\": 901,\n          \"meeting_id\": 4512,\n          \"task\": \"Send the revised proposal\",\n          \"is_completed\": 0,\n          \"topics\": \"Proposal\",\n          \"attendee\": [\n            27,\n            -1\n          ],\n          \"due_date\": \"2026-10-07\",\n          \"created_at\": \"2026-09-30T11:00:00.000000Z\",\n          \"updated_at\": \"2026-09-30T11:00:00.000000Z\",\n          \"assignees\": [\n            {\n              \"id\": 27,\n              \"name\": \"Jane Doe\"\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"meta\": {\n    \"per_page\": 15,\n    \"has_pages\": true,\n    \"has_more_pages\": true\n  },\n  \"links\": {\n    \"prev\": null,\n    \"next\": \"https://app.claritalk.com/api/tasks/list?per_page=15&cursor=eyJjcmVhdGVkX2F0Ijo...\",\n    \"path\": \"https://app.claritalk.com/api/tasks/list\"\n  }\n}\n```\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 403 | Service-account token (no user) | `{\"code\": 403, \"error\": \"This endpoint requires a user-bound access token.\"}` |\n| 404 | Caller has no organisation | `{\"message\": \"Organisation not found\"}` |\n| 422 | Invalid filter (e.g. `sort=due_date`, `per_page=500`) | `{\"message\": \"...\", \"errors\": {\"sort\": [\"The selected sort is invalid.\"]}}` |\n| 401 | Missing/invalid bearer token | `{\"code\": 401, \"error\": \"Unauthorized\"}` |\n| 403 | Caller's licence is blocked (trial expired) while billing enforcement is on | `{\"message\": \"Your trial has ended\", \"billing_blocked\": true}` |\n| 403 | Organisation requires 2FA and the caller has not enabled it | `{\"message\": \"...\"}` |\n| 429 | Rate limit exceeded | `{\"message\": \"Too Many Attempts.\"}` |\n\n### Notes\n- Pagination, `sort` and `dir` apply to **meetings**, not tasks; each meeting carries only its tasks that match the filters.\n- `attendee` holds numeric user ids (`-1` = external person); `assignees` resolves them to `{id, name}` within the caller's organisation.\n- `is_completed` is returned as `0`/`1`.\n- Rate limit: 60 calls/min per caller.\n- _Auto-documented from source (routes/api.php + controller)._"},"status":"Forbidden","code":403,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"code\": 403,\n  \"error\": \"This endpoint requires a user-bound access token.\"\n}"},{"id":"15854472-c798-4cc2-ab8c-964ee54c993c","name":"422 Validation error","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"https://app.claritalk.com/api/tasks/list","host":["https://app.claritalk.com/api"],"path":["tasks","list"],"query":[{"key":"q","value":"","description":"Search in task text and topics (contains match)","disabled":true},{"key":"from","value":"","description":"Due date from (date)","disabled":true},{"key":"to","value":"","description":"Due date until (date)","disabled":true},{"key":"sort","value":"created_at","description":"Meeting column to sort by: created_at (default), updated_at, name","disabled":true},{"key":"dir","value":"desc","description":"asc or desc (default: desc)","disabled":true},{"key":"per_page","value":"15","description":"Meetings per page, 1-100 (default: 15)","disabled":true},{"key":"is_completed","value":"","description":"Filter tasks by completion (boolean: 1/0/true/false)","disabled":true},{"key":"dossier","value":"","description":"Narrow to a dossier (id)","disabled":true},{"key":"team","value":"","description":"Narrow to a team","disabled":true},{"key":"assigned_to_me","value":"","description":"Only tasks assigned to the caller (boolean)","disabled":true},{"key":"cursor","value":"","description":"Cursor from links.next / links.prev","disabled":true}]},"description":"List the caller's tasks, grouped by meeting, with cursor pagination. Only meetings the caller can access are included.\n\n### Authentication\nBearer token required (inherited collection-level OAuth2). Include `Authorization: Bearer {token}`.\n\nRequires a **user-bound** token (authorization code / personal token). A service-account (`client_credentials`) token passes the bearer gate but has no user, so it is refused.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| q | query | string | No | Search task text and topics |\n| from | query | date | No | Task due date from |\n| to | query | date | No | Task due date until |\n| sort | query | string | No | Meeting column: `created_at` (default), `updated_at`, `name` |\n| dir | query | string | No | `asc` or `desc` (default `desc`) |\n| per_page | query | integer | No | Meetings per page, 1–100 (default `15`) |\n| is_completed | query | boolean | No | Filter tasks by completion |\n| dossier | query | string | No | Narrow to one dossier (never widens access) |\n| team | query | string | No | Narrow to one team (never widens access) |\n| assigned_to_me | query | boolean | No | Only tasks whose `attendee` contains the caller |\n| cursor | query | string | No | Opaque cursor from `links` |\n\n### Response\n**200 OK**\n```json\n{\n  \"data\": [\n    {\n      \"id\": 4512,\n      \"uuid\": \"550e8400-e29b-41d4-a716-446655440000\",\n      \"user_id\": 27,\n      \"dossier_id\": \"0b7d9a52-1f3e-4c6a-9d8b-2e4f6a8c0e1d\",\n      \"name\": \"Weekly standup\",\n      \"tasks\": [\n        {\n          \"id\": 901,\n          \"meeting_id\": 4512,\n          \"task\": \"Send the revised proposal\",\n          \"is_completed\": 0,\n          \"topics\": \"Proposal\",\n          \"attendee\": [\n            27,\n            -1\n          ],\n          \"due_date\": \"2026-10-07\",\n          \"created_at\": \"2026-09-30T11:00:00.000000Z\",\n          \"updated_at\": \"2026-09-30T11:00:00.000000Z\",\n          \"assignees\": [\n            {\n              \"id\": 27,\n              \"name\": \"Jane Doe\"\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"meta\": {\n    \"per_page\": 15,\n    \"has_pages\": true,\n    \"has_more_pages\": true\n  },\n  \"links\": {\n    \"prev\": null,\n    \"next\": \"https://app.claritalk.com/api/tasks/list?per_page=15&cursor=eyJjcmVhdGVkX2F0Ijo...\",\n    \"path\": \"https://app.claritalk.com/api/tasks/list\"\n  }\n}\n```\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 403 | Service-account token (no user) | `{\"code\": 403, \"error\": \"This endpoint requires a user-bound access token.\"}` |\n| 404 | Caller has no organisation | `{\"message\": \"Organisation not found\"}` |\n| 422 | Invalid filter (e.g. `sort=due_date`, `per_page=500`) | `{\"message\": \"...\", \"errors\": {\"sort\": [\"The selected sort is invalid.\"]}}` |\n| 401 | Missing/invalid bearer token | `{\"code\": 401, \"error\": \"Unauthorized\"}` |\n| 403 | Caller's licence is blocked (trial expired) while billing enforcement is on | `{\"message\": \"Your trial has ended\", \"billing_blocked\": true}` |\n| 403 | Organisation requires 2FA and the caller has not enabled it | `{\"message\": \"...\"}` |\n| 429 | Rate limit exceeded | `{\"message\": \"Too Many Attempts.\"}` |\n\n### Notes\n- Pagination, `sort` and `dir` apply to **meetings**, not tasks; each meeting carries only its tasks that match the filters.\n- `attendee` holds numeric user ids (`-1` = external person); `assignees` resolves them to `{id, name}` within the caller's organisation.\n- `is_completed` is returned as `0`/`1`.\n- Rate limit: 60 calls/min per caller.\n- _Auto-documented from source (routes/api.php + controller)._"},"status":"Unprocessable Content","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"The selected sort is invalid.\",\n  \"errors\": {\n    \"sort\": [\n      \"The selected sort is invalid.\"\n    ]\n  }\n}"}],"_postman_id":"e39ce032-22d7-47f5-a0ae-c68c13a8ab33"},{"name":"Complete tasks","id":"3ad942b4-60af-4b2c-8aec-d6c36d669a61","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"meetingTaskIds\": [\n    901\n  ],\n  \"isCompleted\": true\n}","options":{"raw":{"language":"json"}}},"url":"https://app.claritalk.com/api/tasks/complete","description":"<p>Mark one or more tasks complete or incomplete. All-or-nothing: if any id is not accessible to the caller, nothing is written.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>Bearer token required (inherited collection-level OAuth2). Include <code>Authorization: Bearer {token}</code>.</p>\n<p>Requires a <strong>user-bound</strong> token (authorization code / personal token). A service-account (<code>client_credentials</code>) token passes the bearer gate but has no user, so it is refused.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>meetingTaskIds</td>\n<td>body</td>\n<td>integer[]</td>\n<td>Yes</td>\n<td>Task ids, 1–100 items. Duplicates are ignored.</td>\n</tr>\n<tr>\n<td>isCompleted</td>\n<td>body</td>\n<td>boolean</td>\n<td>Yes</td>\n<td><code>true</code> to complete, <code>false</code> to reopen</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"request-body-example\">Request Body Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"meetingTaskIds\": [\n    901\n  ],\n  \"isCompleted\": true\n}\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong> — <code>updated</code> is the number of rows actually written.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Success\",\n  \"updated\": 1\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Condition</th>\n<th>Body</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>403</td>\n<td>Service-account token (no user)</td>\n<td><code>{\"code\": 403, \"error\": \"This endpoint requires a user-bound access token.\"}</code></td>\n</tr>\n<tr>\n<td>404</td>\n<td>Any id does not exist or belongs to a meeting the caller cannot access</td>\n<td><code>{\"code\": 404, \"error\": \"Tasks not found\"}</code></td>\n</tr>\n<tr>\n<td>404</td>\n<td>Caller has no organisation</td>\n<td><code>{\"message\": \"Organisation not found\"}</code></td>\n</tr>\n<tr>\n<td>422</td>\n<td>Validation failed</td>\n<td><code>{\"message\": \"The meeting task ids field is required. (and 1 more error)\", \"errors\": {...}}</code></td>\n</tr>\n<tr>\n<td>401</td>\n<td>Missing/invalid bearer token</td>\n<td><code>{\"code\": 401, \"error\": \"Unauthorized\"}</code></td>\n</tr>\n<tr>\n<td>403</td>\n<td>Caller's licence is blocked (trial expired) while billing enforcement is on</td>\n<td><code>{\"message\": \"Your trial has ended\", \"billing_blocked\": true}</code></td>\n</tr>\n<tr>\n<td>403</td>\n<td>Organisation requires 2FA and the caller has not enabled it</td>\n<td><code>{\"message\": \"...\"}</code></td>\n</tr>\n<tr>\n<td>429</td>\n<td>Rate limit exceeded</td>\n<td><code>{\"message\": \"Too Many Attempts.\"}</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>Rate limit: <code>tasks-write</code> 30 calls/min per caller, plus the group's 60/min.</li>\n<li><em>Auto-documented from source (routes/api.php + controller).</em></li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["tasks","complete"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[]}},"response":[{"id":"4033f662-0283-4000-804b-4bdc9beaa4a0","name":"200 OK","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"meetingTaskIds\": [\n    901\n  ],\n  \"isCompleted\": true\n}","options":{"raw":{"language":"json"}}},"url":"https://app.claritalk.com/api/tasks/complete","description":"Mark one or more tasks complete or incomplete. All-or-nothing: if any id is not accessible to the caller, nothing is written.\n\n### Authentication\nBearer token required (inherited collection-level OAuth2). Include `Authorization: Bearer {token}`.\n\nRequires a **user-bound** token (authorization code / personal token). A service-account (`client_credentials`) token passes the bearer gate but has no user, so it is refused.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| meetingTaskIds | body | integer[] | Yes | Task ids, 1–100 items. Duplicates are ignored. |\n| isCompleted | body | boolean | Yes | `true` to complete, `false` to reopen |\n\n### Request Body Example\n```json\n{\n  \"meetingTaskIds\": [\n    901\n  ],\n  \"isCompleted\": true\n}\n```\n\n### Response\n**200 OK** — `updated` is the number of rows actually written.\n```json\n{\n  \"message\": \"Success\",\n  \"updated\": 1\n}\n```\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 403 | Service-account token (no user) | `{\"code\": 403, \"error\": \"This endpoint requires a user-bound access token.\"}` |\n| 404 | Any id does not exist or belongs to a meeting the caller cannot access | `{\"code\": 404, \"error\": \"Tasks not found\"}` |\n| 404 | Caller has no organisation | `{\"message\": \"Organisation not found\"}` |\n| 422 | Validation failed | `{\"message\": \"The meeting task ids field is required. (and 1 more error)\", \"errors\": {...}}` |\n| 401 | Missing/invalid bearer token | `{\"code\": 401, \"error\": \"Unauthorized\"}` |\n| 403 | Caller's licence is blocked (trial expired) while billing enforcement is on | `{\"message\": \"Your trial has ended\", \"billing_blocked\": true}` |\n| 403 | Organisation requires 2FA and the caller has not enabled it | `{\"message\": \"...\"}` |\n| 429 | Rate limit exceeded | `{\"message\": \"Too Many Attempts.\"}` |\n\n### Notes\n- Rate limit: `tasks-write` 30 calls/min per caller, plus the group's 60/min.\n- _Auto-documented from source (routes/api.php + controller)._"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"Success\",\n  \"updated\": 1\n}"},{"id":"e39a158e-bfd7-41be-96ff-c396751fa544","name":"404 Tasks not found","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"meetingTaskIds\": [\n    901\n  ],\n  \"isCompleted\": true\n}","options":{"raw":{"language":"json"}}},"url":"https://app.claritalk.com/api/tasks/complete","description":"Mark one or more tasks complete or incomplete. All-or-nothing: if any id is not accessible to the caller, nothing is written.\n\n### Authentication\nBearer token required (inherited collection-level OAuth2). Include `Authorization: Bearer {token}`.\n\nRequires a **user-bound** token (authorization code / personal token). A service-account (`client_credentials`) token passes the bearer gate but has no user, so it is refused.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| meetingTaskIds | body | integer[] | Yes | Task ids, 1–100 items. Duplicates are ignored. |\n| isCompleted | body | boolean | Yes | `true` to complete, `false` to reopen |\n\n### Request Body Example\n```json\n{\n  \"meetingTaskIds\": [\n    901\n  ],\n  \"isCompleted\": true\n}\n```\n\n### Response\n**200 OK** — `updated` is the number of rows actually written.\n```json\n{\n  \"message\": \"Success\",\n  \"updated\": 1\n}\n```\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 403 | Service-account token (no user) | `{\"code\": 403, \"error\": \"This endpoint requires a user-bound access token.\"}` |\n| 404 | Any id does not exist or belongs to a meeting the caller cannot access | `{\"code\": 404, \"error\": \"Tasks not found\"}` |\n| 404 | Caller has no organisation | `{\"message\": \"Organisation not found\"}` |\n| 422 | Validation failed | `{\"message\": \"The meeting task ids field is required. (and 1 more error)\", \"errors\": {...}}` |\n| 401 | Missing/invalid bearer token | `{\"code\": 401, \"error\": \"Unauthorized\"}` |\n| 403 | Caller's licence is blocked (trial expired) while billing enforcement is on | `{\"message\": \"Your trial has ended\", \"billing_blocked\": true}` |\n| 403 | Organisation requires 2FA and the caller has not enabled it | `{\"message\": \"...\"}` |\n| 429 | Rate limit exceeded | `{\"message\": \"Too Many Attempts.\"}` |\n\n### Notes\n- Rate limit: `tasks-write` 30 calls/min per caller, plus the group's 60/min.\n- _Auto-documented from source (routes/api.php + controller)._"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"code\": 404,\n  \"error\": \"Tasks not found\"\n}"},{"id":"aff84c08-70e0-46f7-971b-02f54f2eba5d","name":"422 Validation error","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"meetingTaskIds\": [\n    901\n  ],\n  \"isCompleted\": true\n}","options":{"raw":{"language":"json"}}},"url":"https://app.claritalk.com/api/tasks/complete","description":"Mark one or more tasks complete or incomplete. All-or-nothing: if any id is not accessible to the caller, nothing is written.\n\n### Authentication\nBearer token required (inherited collection-level OAuth2). Include `Authorization: Bearer {token}`.\n\nRequires a **user-bound** token (authorization code / personal token). A service-account (`client_credentials`) token passes the bearer gate but has no user, so it is refused.\n\n### Parameters\n| Name | In | Type | Required | Description |\n|------|----|------|----------|-------------|\n| meetingTaskIds | body | integer[] | Yes | Task ids, 1–100 items. Duplicates are ignored. |\n| isCompleted | body | boolean | Yes | `true` to complete, `false` to reopen |\n\n### Request Body Example\n```json\n{\n  \"meetingTaskIds\": [\n    901\n  ],\n  \"isCompleted\": true\n}\n```\n\n### Response\n**200 OK** — `updated` is the number of rows actually written.\n```json\n{\n  \"message\": \"Success\",\n  \"updated\": 1\n}\n```\n\n### Error Responses\n| Status | Condition | Body |\n|--------|-----------|------|\n| 403 | Service-account token (no user) | `{\"code\": 403, \"error\": \"This endpoint requires a user-bound access token.\"}` |\n| 404 | Any id does not exist or belongs to a meeting the caller cannot access | `{\"code\": 404, \"error\": \"Tasks not found\"}` |\n| 404 | Caller has no organisation | `{\"message\": \"Organisation not found\"}` |\n| 422 | Validation failed | `{\"message\": \"The meeting task ids field is required. (and 1 more error)\", \"errors\": {...}}` |\n| 401 | Missing/invalid bearer token | `{\"code\": 401, \"error\": \"Unauthorized\"}` |\n| 403 | Caller's licence is blocked (trial expired) while billing enforcement is on | `{\"message\": \"Your trial has ended\", \"billing_blocked\": true}` |\n| 403 | Organisation requires 2FA and the caller has not enabled it | `{\"message\": \"...\"}` |\n| 429 | Rate limit exceeded | `{\"message\": \"Too Many Attempts.\"}` |\n\n### Notes\n- Rate limit: `tasks-write` 30 calls/min per caller, plus the group's 60/min.\n- _Auto-documented from source (routes/api.php + controller)._"},"status":"Unprocessable Content","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"The meeting task ids field is required. (and 1 more error)\",\n  \"errors\": {\n    \"meetingTaskIds\": [\n      \"The meeting task ids field is required.\"\n    ],\n    \"isCompleted\": [\n      \"The is completed field is required.\"\n    ]\n  }\n}"}],"_postman_id":"3ad942b4-60af-4b2c-8aec-d6c36d669a61"}],"id":"504dafe2-6902-4404-a203-3680d5d9aa8a","_postman_id":"504dafe2-6902-4404-a203-3680d5d9aa8a","description":"","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}}},{"name":"Team","item":[{"name":"List teams","id":"7ee19819-2a9b-4a4b-98ca-e197c3c525cb","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/teams/list","description":"<p>List all teams accessible to the authenticated user.</p>\n<h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong> — Array of team objects.</p>\n<h3 id=\"error-responses\">Error Responses</h3>\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>404</td>\n<td>Organisation or user not found</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>Service accounts see all teams. End users see only their assigned teams.</li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["teams","list"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[]}},"response":[],"_postman_id":"7ee19819-2a9b-4a4b-98ca-e197c3c525cb"}],"id":"3554f6b0-dea4-44fb-93c9-06785d44535d","description":"<p>Teams organize users within an organisation.</p>\n","_postman_id":"3554f6b0-dea4-44fb-93c9-06785d44535d","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}}},{"name":"Integration","item":[{"name":"List integrations","id":"2e05c87f-02c1-4124-a172-f73358e73203","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/integrations/list","description":"<p>List all available integrations.</p>\n<h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong> — Array of integration objects.</p>\n<h3 id=\"error-responses\">Error Responses</h3>\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>404</td>\n<td>Organisation or user not found</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>End user tokens only. Not available for service accounts.</li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["integrations","list"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[]}},"response":[],"_postman_id":"2e05c87f-02c1-4124-a172-f73358e73203"},{"name":"Retrieve integration","id":"2d1e8752-5f9b-481b-8418-01e3fd392029","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/integrations/:integrationId","description":"<p>Retrieve a specific integration.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>integrationId</td>\n<td>path</td>\n<td>integer</td>\n<td>Yes</td>\n<td>Integration ID</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong> — Integration object.</p>\n<h3 id=\"error-responses\">Error Responses</h3>\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>404</td>\n<td>Integration not found</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["integrations",":integrationId"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[{"description":{"content":"<p>Integration ID</p>\n","type":"text/plain"},"type":"any","value":"","key":"integrationId"}]}},"response":[],"_postman_id":"2d1e8752-5f9b-481b-8418-01e3fd392029"},{"name":"Retrieve integration data","id":"8d466571-369d-4663-a5f7-75bcdf9bf128","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/integration/data?integration_id=1","description":"<p>Retrieve data from an integration. Optionally filter by search term.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>integration_id</td>\n<td>query</td>\n<td>integer</td>\n<td>Yes</td>\n<td>Integration ID</td>\n</tr>\n<tr>\n<td>term</td>\n<td>query</td>\n<td>string</td>\n<td>No</td>\n<td>Search term (filters title, description, VAT number, type)</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"data\": [...], \"id\": 42 }\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\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>404</td>\n<td>Integration, connection, or data not found</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["integration","data"],"host":["https://app.claritalk.com/api"],"query":[{"description":{"content":"<p>Integration ID (required)</p>\n","type":"text/plain"},"key":"integration_id","value":"1"},{"disabled":true,"description":{"content":"<p>Search filter</p>\n","type":"text/plain"},"key":"term","value":""}],"variable":[]}},"response":[],"_postman_id":"8d466571-369d-4663-a5f7-75bcdf9bf128"},{"name":"Communicate with integration","id":"449cb1af-b33e-4212-a892-352e4f98922c","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"integration_id\": 1,\n  \"user_uuid\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"action\": \"relations.search\",\n  \"data\": { \"term\": \"Acme\" }\n}"},"url":"https://app.claritalk.com/api/integrations/communicate","description":"<p>Execute an action on a third-party integration.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>integration_id</td>\n<td>body</td>\n<td>integer</td>\n<td>Yes</td>\n<td>Integration ID</td>\n</tr>\n<tr>\n<td>user_uuid</td>\n<td>body</td>\n<td>string (UUID)</td>\n<td>Yes</td>\n<td>User UUID</td>\n</tr>\n<tr>\n<td>action</td>\n<td>body</td>\n<td>string</td>\n<td>Yes</td>\n<td><code>sync</code>, <code>relations.all</code>, <code>relations.between</code>, <code>relations.search</code></td>\n</tr>\n<tr>\n<td>data</td>\n<td>body</td>\n<td>object</td>\n<td>Yes</td>\n<td>Action-specific data (e.g., <code>{\"term\": \"...\"}</code>)</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"data\": [{ \"id\": \"ext-123\", \"label\": \"Acme Corp\" }] }\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\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>403</td>\n<td>End user acting as another user</td>\n</tr>\n<tr>\n<td>404</td>\n<td>Integration or connection not found</td>\n</tr>\n<tr>\n<td>422</td>\n<td>Integration call failed</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notes\">Notes</h3>\n<ul>\n<li>End users can only communicate as themselves.</li>\n<li><code>sync</code> triggers a full data sync from the provider.</li>\n</ul>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["integrations","communicate"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[]}},"response":[],"_postman_id":"449cb1af-b33e-4212-a892-352e4f98922c"}],"id":"519393be-7ee2-4f14-963e-34c9c9fd0201","description":"<p>Manage third-party integrations and their data. You can retrieve a user's connections by calling <code>/user/me</code>.</p>\n","_postman_id":"519393be-7ee2-4f14-963e-34c9c9fd0201","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}}},{"name":"Service","item":[{"name":"Send command to Claritalk Connect","id":"64a7ca7c-6ca6-47ad-888e-7f91accf5eb9","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"action\": \"startRecording\",\n  \"data\": {\n    \"user_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"meeting_id\": \"660e8400-e29b-41d4-a716-446655440000\",\n    \"online_meeting\": false\n  }\n}"},"url":"https://app.claritalk.com/api/service","description":"<p>Send a command to the Claritalk Connect desktop application via Socket.IO.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>action</td>\n<td>body</td>\n<td>string</td>\n<td>Yes</td>\n<td>Command (see below)</td>\n</tr>\n<tr>\n<td>data</td>\n<td>body</td>\n<td>object</td>\n<td>Yes</td>\n<td>Action-specific data</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"actions\">Actions</h3>\n<p><strong><code>setMicrophone</code></strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"user_id\": \"uuid\", \"microphone\": \"device-name\" }\n</code></pre>\n<p><strong><code>setSpeaker</code></strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"user_id\": \"uuid\", \"speaker\": \"device-name\" }\n</code></pre>\n<p><strong><code>getSoundSettings</code> / <code>getSoundSettings_v2</code></strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"user_id\": \"uuid\" }\n</code></pre>\n<p><strong><code>startRecording</code> / <code>stopRecording</code></strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"user_id\": \"uuid\", \"meeting_id\": \"uuid\", \"online_meeting\": false }\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"message\": \"Successful operation\" }\n</code></pre>\n<p>For <code>getSoundSettings</code>/<code>getSoundSettings_v2</code>, returns the sound settings object.</p>\n<h3 id=\"error-responses\">Error Responses</h3>\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>400</td>\n<td>Missing <code>action</code>/<code>data</code>, organisation not resolved, user not in tenant, meeting not found, or unknown action (<code>{\"error\": \"Missing required parameters\"}</code> / <code>\"Organisation not found\"</code> / <code>\"User not found\"</code> / <code>\"Meeting not found\"</code> / <code>\"Invalid action\"</code>)</td>\n</tr>\n<tr>\n<td>403</td>\n<td><code>startRecording</code> while the Claritalk Connect desktop client is not connected: <code>{\"code\": 403, \"error\": \"...\"}</code></td>\n</tr>\n<tr>\n<td>503</td>\n<td>Any other action while the Claritalk Connect desktop client is not connected: <code>{\"code\": 503, \"error\": \"...\"}</code></td>\n</tr>\n<tr>\n<td>500</td>\n<td>Connection check failed, or <code>data.user_id</code> / <code>data.meeting_id</code> missing (<code>{\"code\": 500, \"error\": \"An error occurred\"}</code>)</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["service"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[]}},"response":[],"_postman_id":"64a7ca7c-6ca6-47ad-888e-7f91accf5eb9"},{"name":"Set webhook URL","id":"cf68d089-b598-42f2-bf2e-124cfe4a8c2d","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"webhook_url\": \"https://hooks.example.com/claritalk\"\n}"},"url":"https://app.claritalk.com/api/client/webhook","description":"<p>Update the webhook URL for the authenticated tenant's OAuth client.</p>\n<h3 id=\"parameters\">Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>In</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>webhook_url</td>\n<td>body</td>\n<td>string (URL)</td>\n<td>Yes</td>\n<td>New webhook callback URL</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"success\": true, \"message\": \"Webhook url updated\" }\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\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>400</td>\n<td>Missing webhook_url</td>\n</tr>\n<tr>\n<td>404</td>\n<td>Organisation or OAuth client not found</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["client","webhook"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[]}},"response":[],"_postman_id":"cf68d089-b598-42f2-bf2e-124cfe4a8c2d"}],"id":"fa1add3a-38b9-4c45-a7e3-bd0a4edc5a34","description":"<p>Control the Claritalk Connect desktop application and manage webhook settings.</p>\n","_postman_id":"fa1add3a-38b9-4c45-a7e3-bd0a4edc5a34","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}}},{"name":"Health","item":[{"name":"Ping","id":"773054cb-f50b-41bb-bf60-3a37c8bec64d","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://app.claritalk.com/api/ping","description":"<p>Health check. Returns a pong response.</p>\n<h3 id=\"response\">Response</h3>\n<p><strong>200 OK</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"message\": \"Pong!\" }\n</code></pre>\n","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}},"urlObject":{"path":["ping"],"host":["https://app.claritalk.com/api"],"query":[],"variable":[]}},"response":[],"_postman_id":"773054cb-f50b-41bb-bf60-3a37c8bec64d"}],"id":"18f8452a-7a2d-4c1a-b9f1-9db7541799aa","description":"<p>API health check endpoint.</p>\n","_postman_id":"18f8452a-7a2d-4c1a-b9f1-9db7541799aa","auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]},"isInherited":true,"source":{"_postman_id":"46140d6e-d451-4957-8c84-3bbbb438e781","id":"46140d6e-d451-4957-8c84-3bbbb438e781","name":"Claritalk API","type":"collection"}}}],"auth":{"type":"oauth2","oauth2":{"basicConfig":[],"advancedConfig":[{"key":"accessTokenUrl","value":"<access-token-url>"},{"key":"authUrl","value":"<auth-url>"},{"key":"grant_type","value":"<grant_type>"},{"key":"clientSecret","value":""},{"key":"clientId","value":""},{"key":"tokenName","value":"<token-name>"},{"key":"scope","value":"<scope>"}]}},"event":[{"listen":"prerequest","script":{"id":"9f94d2a2-a08a-46a2-8942-85564bf5454c","type":"text/javascript","requests":{},"exec":[""]}},{"listen":"test","script":{"id":"03f918ee-0792-4d42-9f96-36774eea6abf","type":"text/javascript","requests":{},"exec":[""]}}],"variable":[{"key":"baseUrl","value":"https://app.claritalk.com/api","type":"string"},{"key":"client_id","value":"","type":"string"},{"key":"client_secret","value":"","type":"string"}]}