{"info":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","description":"<html><head></head><body><p>The OOONA Tools API is used to control all possible operations in OOONA's Tools including projects, presets and automation.</p>\n<p>This API allows you to login to any user by supplying an email address so make sure to secure the secret key and the access to the integration as much as possible.</p>\n<p>This collection is a ready-to-run documentation with a pre-request script that runs the <a href=\"#59984662-0dbf-48be-859a-0d5229061368\">/token</a> request and stores the <code>access_token</code> from the result as a collection variable to be used by the request.</p>\n<h1 id=\"how-to-use-our-api\">🧑‍💻️How to use our API?</h1>\n<p>The API tries to keep things as simple as possible for the integrating system. Each entity you create on the Tools side has a unique ID value (usually a GUID).</p>\n<p>The ID is generated by your system and is sent as part of the URL.</p>\n<p>Ooona Tools will check if the ID you sent exists, and if it does, it will open the project or configuration (depending on the endpoint) for editing. If it doesn’t exist, it will create the project or configuration and open it.</p>\n<h2 id=\"🔗-single-use-session-urls\">🔗 Single-Use Session URLs</h2>\n<p>Most endpoints return a <strong>single-use session URL</strong> (e.g. <code>/V2/external?token=...</code>) that:</p>\n<ul>\n<li><p>Automatically authenticates the user based on email</p>\n</li>\n<li><p>Opens a specific project or interface inside the OOONA Toolkit</p>\n</li>\n<li><p>Is valid only for a short period and from a single device/session</p>\n</li>\n<li><p>You should redirect the user immediately to the single-use URL (don't send it via email) or open it in a new tab</p>\n</li>\n<li><p><strong>If the user (by email) doesn’t exist, they are created automatically</strong></p>\n</li>\n<li><p><strong>One session per email is supported at any given time</strong></p>\n</li>\n<li><p>The token should not be cached or reused</p>\n</li>\n</ul>\n<p><strong>Important</strong>: This API provides <strong>full access to your OOONA environment</strong>, including user creation, project management, configuration templates, file handling, and export operations. Your <strong>API key is highly sensitive</strong> and must be stored in a secure environment. Never expose it in frontend code or logs.</p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[{"content":"🧑‍💻️How to use our API?","slug":"how-to-use-our-api"}],"owner":"3921292","collectionId":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","publishedId":"2sAXxS7r31","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2024-10-11T20:41:58.000Z"},"item":[{"name":"🔑 Authentication","item":[{"name":"Token","id":"6e4ca480-9592-47d1-ba07-b1e1c421961f","request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/x-www-form-urlencoded"}],"body":{"mode":"urlencoded","urlencoded":[{"key":"client_id","value":"OoonaOnlineToolkit"},{"key":"client_secret","value":"256336f74c624410915f2bb278b80d63cce896d5d2d24ef9bce314ab2e11ed3a"},{"key":"grant_type","value":"api"},{"key":"name","value":"{{api_name}}"},{"key":"key","value":"{{api_key}}"}]},"url":"{{base_url}}/token","description":"<p>Exchanges your API credentials for a bearer access token. Every other request needs it in the <code>Authorization: Bearer &lt;access_token&gt;</code> header; the collection-level pre-request script calls this request and stores the token for you.</p>\n<h2 id=\"input\">Input</h2>\n<p>Sent as <code>application/x-www-form-urlencoded</code> (not JSON). No bearer token is needed for this call.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>grant_type</code></td>\n<td>yes</td>\n<td>Use <code>api</code>.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>yes</td>\n<td>The API key name you were given (<code>username</code> is accepted as an alias).</td>\n</tr>\n<tr>\n<td><code>key</code></td>\n<td>yes</td>\n<td>The API key secret (<code>password</code> is accepted as an alias).</td>\n</tr>\n<tr>\n<td><code>client_id</code></td>\n<td>yes</td>\n<td>The application client id (<code>OoonaOnlineToolkit</code> in this collection).</td>\n</tr>\n<tr>\n<td><code>client_secret</code></td>\n<td>yes</td>\n<td>The application client secret.</td>\n</tr>\n</tbody>\n</table>\n</div><p>If the API key is restricted to an IP address, the call must come from that IP.</p>\n<h2 id=\"output\">Output</h2>\n<p><code>200 OK</code> with JSON:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>access_token</code></td>\n<td>The bearer token to send with every request.</td>\n</tr>\n<tr>\n<td><code>token_type</code></td>\n<td>Always <code>bearer</code>.</td>\n</tr>\n<tr>\n<td><code>expires_in</code></td>\n<td>Lifetime of the token in seconds. Request a new token (or use the refresh token) before it expires.</td>\n</tr>\n<tr>\n<td><code>refresh_token</code></td>\n<td>A token that can be used with <code>grant_type=refresh_token</code> to get a new access token.</td>\n</tr>\n<tr>\n<td><code>id</code>, <code>name</code>, <code>ip</code></td>\n<td>The API key id, name and the IP restriction of the key (empty when none).</td>\n</tr>\n<tr>\n<td><code>.issued</code>, <code>.expires</code></td>\n<td>When the token was issued and when it expires (HTTP date format).</td>\n</tr>\n<tr>\n<td><code>.refresh</code></td>\n<td>Whether the token can be refreshed.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"errors\">Errors</h2>\n<p><code>400 Bad Request</code> with <code>{ \"error\": \"invalid_grant\", \"error_description\": ... }</code> when the name or key are incorrect (<code>The name or key are incorrect.</code>) or the key is bound to a different IP (<code>Illegal IP.</code>). Failed attempts are logged. Missing or wrong <code>client_id</code>/<code>client_secret</code> returns <code>400</code> with <code>invalid_client</code>.</p>\n","urlObject":{"path":["token"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"e656f24b-ca84-4757-be4d-651064fe4240","name":"Token","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/x-www-form-urlencoded"}],"body":{"mode":"urlencoded","urlencoded":[{"key":"client_id","value":"OoonaOnlineToolkit"},{"key":"client_secret","value":"256336f74c624410915f2bb278b80d63cce896d5d2d24ef9bce314ab2e11ed3a"},{"key":"grant_type","value":"api"},{"key":"name","value":"{{api_name}}"},{"key":"key","value":"{{api_key}}"}]},"url":"{{base_url}}/token"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json;charset=UTF-8"},{"key":"Content-Length","value":"1359"}],"cookie":[],"responseTime":null,"body":"{\n    \"access_token\": \"UNgz9Hbox6IRGzHxlbArzhLTJ064WUgAQpYL9wOftqZ_pBRYZne5xjds5bbUljws8MZS9d4Y9GoFhfPP80AtIRcBhf7UPK2mOeyVBiqJ_2jbK6h0xU_hdqzLCrWKhsugwJ-2JyNPp8p421UPrKs7m4nMWW18x8N5zLV0wt2zAFu12WV0yaSkgzrUp2QPF54_L8dTRuJ5FqMNbiF8w1BqDTXSX8wEeFktHtBtq9N8bOVj3xDxjKcj6RDhGO1U-9T3PvtTn6D1wglXrnaYKgXvNrcYPFRfVYP1YimDsR1pfn8a8SAojNlSynNMIZwNe039vMZnRuCRDJmrKI-43tXuBQ85ZZyzmJp3nW8j8DGNPhqcaJU77ZtfYwBZzJ4D0qAKSgLXgyeiCJJMra9XLJmTczex05oHmPwld7IuF2KMQL51tUHrpCzAAaiUxEE9zhTZ1Wb8zXcCk5d3D6AGFyLoWNC1yZ1vJi0ZeOAcrk7H-L2rZTHa-OpIar_Ko0EQRYdMyb4XzW-6u-gArkuLDVjitV9h7ZOsdWfI_ajYZ9EPDnY\",\n    \"token_type\": \"bearer\",\n    \"expires_in\": 3599,\n    \"refresh_token\": \"SYp8RC_GcoHBo-xSZ-Iv9-ueSW7UlLXIXvt3Hg9B8JPwvYLVmHjbPMUkAsYLn-Lpddu_BA3pd45ancphjC-MeI8tYaYECLhXCTcDYcI6RparmFMPLKuCkX24yvjJehrdUWGfDrdN2LX5i2wZBW7u951Py2Fcn0hVvpfAPK6c63XRjK8skMwlNM0IvjkNr3TMnpZNbhE44GWlTJjH68oTALJDDwwJFc02lrCyV5froWpRLww5pWWjYA6GBb9KXna8opDZcjkCd_WB97HTgeyjbHN8SbNcu24UkdlphmHBxng4XASQgRm8qewjfqKUvxE2erpgOleQ8Nt9Mnj3sshtiwXGjR3zGlYy0gXBZLwuBxRClSIx_R7m2F5aHAhjOfISXL5oKXPZj4ds_i4htY5a0bEPivpFIPyKLUTFMbScNDnq5sbwtA_gYN1Zgg0aLSS7exrYsg2Ihd39qJipmtCjKwq8b0VfaOHYFSSc7gGFLg-ewGALCFmPShiKnByIoXAdFGQ3CfbXxlU5zYjrPYNQ_fGrntH0rzBxq8GCNJ3Dh54\",\n    \"id\": \"84e048c0-969a-4d54-95b0-2371746cd48e\",\n    \"name\": \"Adam\",\n    \"ip\": \"\",\n    \".refresh\": \"True\",\n    \".issued\": \"Sun, 15 Oct 2023 20:48:14 GMT\",\n    \".expires\": \"Tue, 17 Oct 2023 20:48:14 GMT\"\n}"},{"id":"3e13be4e-8905-4639-ab55-931327092fa7","name":"400 Wrong key","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/x-www-form-urlencoded"}],"body":{"mode":"urlencoded","urlencoded":[{"key":"client_id","value":"OoonaOnlineToolkit"},{"key":"client_secret","value":"256336f74c624410915f2bb278b80d63cce896d5d2d24ef9bce314ab2e11ed3a"},{"key":"grant_type","value":"api"},{"key":"name","value":"{{api_name}}"},{"key":"key","value":"{{api_key}}"}]},"url":"{{base_url}}/token"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"error\": \"invalid_grant\",\n    \"error_description\": \"The name or key are incorrect.\"\n}"}],"_postman_id":"6e4ca480-9592-47d1-ba07-b1e1c421961f"}],"id":"d1d56f5d-c6e5-49a6-bdcc-fca17677be1b","description":"<p>All API requests must contain an <code>Authorization</code> header with a bearer token constructed with a <code>\"Bearer \"</code> prefix together with the <code>access_token</code> generated using the <a href=\"#59984662-0dbf-48be-859a-0d5229061368\">/token</a> endpoint. To get a token, make a request to <a href=\"#59984662-0dbf-48be-859a-0d5229061368\">/token</a> with the <code>name</code>, <code>key</code>, <code>client_id</code> and <code>client_secret</code> you will be provided with.</p>\n<p>It’s up to you to decide if you want to generate a different token for every request or cache the token until the <code>“.expires”</code> value and generate a new token as soon as it expires (or soon before).</p>\n","_postman_id":"d1d56f5d-c6e5-49a6-bdcc-fca17677be1b","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"⚙️ Configuration","item":[{"name":"Convert templates","item":[{"name":"List templates","id":"62b98d5e-84cb-47be-ad9c-f89362f50cb9","request":{"method":"GET","header":[],"url":"{{base_url}}/external/templates","description":"<p><strong>Role:</strong> <code>API</code> or <code>UserAPI</code>.</p>\n<p>Lists the import and export templates available to the calling user: the user's own templates plus the instance's global templates. Only templates of type <code>ImportTemplate</code> or <code>ExportTemplate</code> are listed.</p>\n<p>No parameters.</p>\n<p><strong>Output:</strong> <code>200 OK</code>, JSON array; each item:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>Template id (use with the other template endpoints and as an import/export template id in Convert calls).</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>Template name.</td>\n</tr>\n<tr>\n<td><code>type</code></td>\n<td><code>ImportTemplate</code> or <code>ExportTemplate</code>.</td>\n</tr>\n<tr>\n<td><code>creationTime</code></td>\n<td>When the template was created.</td>\n</tr>\n<tr>\n<td><code>global</code></td>\n<td><code>true</code> for an instance-wide template (read-only here), <code>false</code> for the user's own.</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>401 Unauthorized</code> when the token's user can not be resolved.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","templates"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"5b6fff29-ff7c-43cb-adb7-f1f7230caa41","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/templates"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"id\": \"5d1f0c8e-3a47-4b7e-9f2a-6c0b1e4d7a90\",\n    \"name\": \"SRT export 25fps\",\n    \"type\": \"ExportTemplate\",\n    \"creationTime\": \"2026-09-30T08:14:22.5\",\n    \"global\": false\n  },\n  {\n    \"id\": \"a9333575-2a56-4d15-b048-ece4dc49e810\",\n    \"name\": \"VTT\",\n    \"type\": \"ImportTemplate\",\n    \"creationTime\": \"2023-08-09T19:29:10.747\",\n    \"global\": true\n  }\n]"}],"_postman_id":"62b98d5e-84cb-47be-ad9c-f89362f50cb9"},{"name":"Get template","id":"ad55e5e4-e1b1-4132-aaf5-83c7bce167d0","request":{"method":"GET","header":[],"url":"{{base_url}}/external/template/5d1f0c8e-3a47-4b7e-9f2a-6c0b1e4d7a90","description":"<p><strong>Role:</strong> <code>API</code> or <code>UserAPI</code>.</p>\n<p>Returns the stored JSON of one template: the user's own template with that id, or else a global template with that id. Unlike the list endpoint it is not limited to import/export types when the id belongs to the user.</p>\n<p><strong>Route</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>Template id, as returned by <code>List templates</code> or <code>Create template</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output:</strong> <code>200 OK</code> with the template JSON (<code>SubtitlesConfiguration</code>) as <code>application/json</code>. <code>404 Not Found</code> when neither the user nor the global set has that id. <code>401 Unauthorized</code> when the token's user can not be resolved.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","template","5d1f0c8e-3a47-4b7e-9f2a-6c0b1e4d7a90"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"80dcdef8-a978-448b-ad38-3e8bd8e49655","name":"404 Not Found","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/template/does-not-exist"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""}],"_postman_id":"ad55e5e4-e1b1-4132-aaf5-83c7bce167d0"},{"name":"Get default template","id":"8b7c0757-a05f-40a3-bdc1-450abf63655f","request":{"method":"POST","header":[],"url":"{{base_url}}/external/template/default","description":"<p><strong>Role:</strong> <code>API</code> or <code>UserAPI</code>.</p>\n<p>Returns an empty template with every property at its default value (<code>SubtitlesConfiguration</code>). Use it as a starting point: change the properties you need and send the result to <code>Create template</code> or <code>Update template</code>. Despite being a POST it has no body and changes nothing.</p>\n<p>No parameters, no body. <strong>Output:</strong> <code>200 OK</code> with the JSON object.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","template","default"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"28667d49-73ae-4cdb-bc5b-78e03ee203f5","name":"200 OK","originalRequest":{"method":"POST","header":[],"url":"{{base_url}}/external/template/default"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"format\": \"Ooona\",\n  \"language1\": \"English\",\n  \"language2\": \"English\",\n  \"timecodeFormat\": \"24 fps\",\n  \"videoFormat\": \"HD 1920x1080\",\n  \"aspectRatio\": \"16:9\",\n  \"absolutePositioning\": true,\n  \"alignAllLines\": true,\n  \"allowSplitParagraphs\": false\n}"}],"_postman_id":"8b7c0757-a05f-40a3-bdc1-450abf63655f"},{"name":"Update template","id":"69aaccb2-7d6f-496c-b28f-9cf05b48b6af","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"format\": \"SRT\",\n  \"language1\": \"English\",\n  \"timecodeFormat\": \"25 fps\",\n  \"videoFormat\": \"HD 1920x1080\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/template/5d1f0c8e-3a47-4b7e-9f2a-6c0b1e4d7a90","description":"<p><strong>Role:</strong> <code>API</code> or <code>UserAPI</code>.</p>\n<p>Replaces the content of one of the <strong>calling user's own</strong> templates with the JSON you send. The template's name and type do not change. Global templates and other users' templates are not editable here (they answer <code>404</code>).</p>\n<p><strong>Route</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>Id of the user's own template.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Body (JSON):</strong> a configuration object (<code>SubtitlesConfiguration</code>), required and at least 10 characters. Only known properties are kept; properties you omit are stored with their defaults (see <code>Get default template</code>). Typical properties for an export template: <code>format</code>, <code>language1</code>, <code>language2</code>, <code>timecodeFormat</code>, <code>videoFormat</code>, plus the format-specific options.</p>\n<p><strong>Output:</strong> <code>200 OK</code> with an empty body. <code>404 Not Found</code> when the user has no template with that id. An invalid or too short body is rejected with an error response and nothing is changed. <code>401 Unauthorized</code> when the token's user can not be resolved.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","template","5d1f0c8e-3a47-4b7e-9f2a-6c0b1e4d7a90"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"06ad89c0-d192-40d2-8f8e-1af9110479d3","name":"200 OK","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"format\": \"SRT\",\n  \"language1\": \"English\",\n  \"timecodeFormat\": \"25 fps\",\n  \"videoFormat\": \"HD 1920x1080\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/template/5d1f0c8e-3a47-4b7e-9f2a-6c0b1e4d7a90"},"status":"OK","code":200,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""},{"id":"a19efda5-7aba-4e29-928e-ec1a42b662ef","name":"404 Not Found","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"format\": \"SRT\",\n  \"language1\": \"English\",\n  \"timecodeFormat\": \"25 fps\",\n  \"videoFormat\": \"HD 1920x1080\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/template/does-not-exist"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""}],"_postman_id":"69aaccb2-7d6f-496c-b28f-9cf05b48b6af"},{"name":"Create template","id":"9f2069cc-0941-411d-b5ff-d3768dc667a5","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"format\": \"SRT\",\n  \"language1\": \"English\",\n  \"timecodeFormat\": \"25 fps\",\n  \"videoFormat\": \"HD 1920x1080\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/template/create/ExportTemplate/SRT%20export%2025fps","description":"<p><strong>Role:</strong> <code>API</code> or <code>UserAPI</code>.</p>\n<p>Creates a new template owned by the calling user. A new id is generated and returned; the template is a fresh entry (this call never overwrites an existing one).</p>\n<p><strong>Route</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>type</code></td>\n<td><code>ImportTemplate</code> or <code>ExportTemplate</code> (exact, case-sensitive). Any other value fails with an error message listing the allowed values.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>Display name of the template. URL-encode spaces and special characters. Names are not required to be unique.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Body (JSON):</strong> a configuration object (<code>SubtitlesConfiguration</code>), required and at least 10 characters. Only known properties are kept; properties you omit are stored with their defaults (see <code>Get default template</code>). Typical properties for an export template: <code>format</code>, <code>language1</code>, <code>language2</code>, <code>timecodeFormat</code>, <code>videoFormat</code>, plus the format-specific options.</p>\n<p><strong>Output:</strong> <code>200 OK</code> with the id of the new template as a JSON string, e.g. <code>\"5d1f0c8e-...\"</code>. Use it with <code>Get template</code>, <code>Update template</code>, <code>Duplicate template</code>, <code>Delete template</code>. An invalid <code>type</code> or an invalid/too short body is rejected with an error response and nothing is created. <code>401 Unauthorized</code> when the token's user can not be resolved.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","template","create","ExportTemplate","SRT%20export%2025fps"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"673f2296-67c4-4a0d-8ade-ea9d67dd6529","name":"200 OK","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"format\": \"SRT\",\n  \"language1\": \"English\",\n  \"timecodeFormat\": \"25 fps\",\n  \"videoFormat\": \"HD 1920x1080\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/template/create/ExportTemplate/SRT%20export%2025fps"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"5d1f0c8e-3a47-4b7e-9f2a-6c0b1e4d7a90\""}],"_postman_id":"9f2069cc-0941-411d-b5ff-d3768dc667a5"},{"name":"Delete template","id":"24072a13-a9f0-4756-8cdc-bef32ce1f304","request":{"method":"DELETE","header":[],"url":"{{base_url}}/external/template/5d1f0c8e-3a47-4b7e-9f2a-6c0b1e4d7a90","description":"<p><strong>Role:</strong> <code>API</code> or <code>UserAPI</code>.</p>\n<p>Deletes one of the <strong>calling user's own</strong> templates. Global templates and other users' templates can not be deleted here.</p>\n<p><strong>Route</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>Id of the user's own template.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output:</strong> <code>200 OK</code> with an empty body when deleted; <code>404 Not Found</code> when the user has no template with that id. <code>401 Unauthorized</code> when the token's user can not be resolved.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","template","5d1f0c8e-3a47-4b7e-9f2a-6c0b1e4d7a90"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"445876a2-f6ad-4ceb-bc3b-6095dd866a09","name":"200 OK","originalRequest":{"method":"DELETE","header":[],"url":"{{base_url}}/external/template/5d1f0c8e-3a47-4b7e-9f2a-6c0b1e4d7a90"},"status":"OK","code":200,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""},{"id":"3cebf088-15d1-47eb-9aaf-800b03887f8c","name":"404 Not Found","originalRequest":{"method":"DELETE","header":[],"url":"{{base_url}}/external/template/does-not-exist"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""}],"_postman_id":"24072a13-a9f0-4756-8cdc-bef32ce1f304"},{"name":"Duplicate template","id":"50ecf0e6-6aa9-42dc-8c65-58d0cc84252a","request":{"method":"POST","header":[],"url":"{{base_url}}/external/template/duplicate/5d1f0c8e-3a47-4b7e-9f2a-6c0b1e4d7a90/SRT%20export%20copy","description":"<p><strong>Role:</strong> <code>API</code> or <code>UserAPI</code>.</p>\n<p>Makes a copy of one of the <strong>calling user's own</strong> templates (same type and content, stored as a new file) and returns the new id. Global templates and other users' templates can not be duplicated here.</p>\n<p><strong>Route</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>Id of the user's own template to copy.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>Optional. Name of the copy; when the segment is left out or empty the copy keeps the source's name.</td>\n</tr>\n</tbody>\n</table>\n</div><p>No body.</p>\n<p><strong>Output:</strong> <code>200 OK</code> with the new template id as a JSON string. <code>404 Not Found</code> when the user has no template with that id. <code>401 Unauthorized</code> when the token's user can not be resolved.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","template","duplicate","5d1f0c8e-3a47-4b7e-9f2a-6c0b1e4d7a90","SRT%20export%20copy"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"a0345a86-a489-4d75-b608-61672c5085de","name":"200 OK","originalRequest":{"method":"POST","header":[],"url":"{{base_url}}/external/template/duplicate/5d1f0c8e-3a47-4b7e-9f2a-6c0b1e4d7a90/SRT%20export%20copy"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"c27e9a14-58d0-4f3b-b6a1-0e7d92f4a3c5\""},{"id":"4c4ab60e-e108-4c59-ac67-5cc1d366765c","name":"404 Not Found","originalRequest":{"method":"POST","header":[],"url":"{{base_url}}/external/template/duplicate/does-not-exist"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""}],"_postman_id":"50ecf0e6-6aa9-42dc-8c65-58d0cc84252a"}],"id":"9b75f65c-5b3d-43af-8633-0f73e9b5fb82","description":"<p>Per-user <strong>import / export templates</strong> used with the Convert API (role <code>API</code> or <code>UserAPI</code>).</p>\n<p>These are different from the API configuration templates in the parent folder:</p>\n<ul>\n<li>They belong to the user the API token was issued for (the <code>Templates</code> of that user). Only the owner can update, duplicate or delete them.</li>\n<li>Only the types <code>ImportTemplate</code> and <code>ExportTemplate</code> can be created.</li>\n<li>The list also includes the <strong>global</strong> templates shared by the instance (<code>global: true</code>); those can be read but not changed through these endpoints.</li>\n<li>Template ids are generated by the server (you do not choose them).</li>\n</ul>\n<p>The template body is a configuration object (<code>SubtitlesConfiguration</code>). You may send a partial object: unknown properties are dropped and missing ones take their default values (see <code>GET /external/configuration/default</code> or <code>POST /external/template/default</code> for the complete shape). The body must be at least 10 characters of valid JSON.</p>\n","_postman_id":"9b75f65c-5b3d-43af-8633-0f73e9b5fb82","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"Project settings","id":"8321b31e-6051-46ab-89c1-7b432f947ded","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"519b4d66-155b-4550-afb6-34629f10a4ad\",\n  \"email\": \"user@example.com\",\n  \"roles\": \"Admin,ManageGlobalTemplates\",\n  \"ip\": \"::1\",\n  \"name\": \"My ProjectSettings\",\n  \"configurationType\": \"ProjectSettings\",\n  \"configurationJson\": \"\",\n  \"previousConfigurationGuid\": \"\",\n  \"callbackUrl\": \"https://example.com/hooks/configuration-saved\",\n  \"returnUrl\": \"https://ooona.net/\",\n  \"readOnly\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/configuration/0eb5db6d-6b53-4870-83d2-08ea83da57df","description":"<p>Creates or edits a <strong>ProjectSettings</strong> configuration template through the hosted form.</p>\n<p>The form edits a complete project configuration (language, timecode/FPS, formatting, QC, etc.). Use it as the base configuration; language-specific and video-specific parts can be overridden by <code>LanguageSettings</code> / <code>VideoSettings</code> templates.</p>\n<p><strong>Role:</strong> <code>API</code>.</p>\n<p>Starts a configuration-editing session for the <code>{guid}</code> in the URL. Nothing is saved as a template by this call: it stores a one-off \"external request\" and returns a <strong>URL</strong>. Redirect your user to that URL; they get a configuration form for the chosen <code>configurationType</code>. When they press save, the template is stored under <code>{guid}</code> (created, or updated if it already exists) and your <code>callbackUrl</code> (if any) is invoked. Afterwards the template can be read with <code>GET /external/configuration/{guid}</code> and used by id when opening projects, importing, exporting or running batch exports.</p>\n<p>Each call issues a new single-use token. Posting the same <code>{guid}</code> again replaces that id's existing configuration request with the new body (same row, new single-use token) instead of adding another row, so send the full body each time: a field you omit is cleared, except the <code>previous*Guid</code> seed fields, which keep their stored value when omitted. The configuration id comes from the route and <code>name</code> from the request. A project id is never matched. When a template with this <code>{guid}</code> already exists the form shows the stored template, not <code>configurationJson</code>.</p>\n<p><strong>Route</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>guid</code></td>\n<td>Identifier of the template to create or edit. You generate and keep it.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Body (JSON)</strong> - same fields for every <code>configurationType</code>; the type decides which form is shown and what is sent to the callback.</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>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>configurationType</code></td>\n<td>string</td>\n<td>yes</td>\n<td><code>ProjectSettings</code> (the default when omitted), <code>LanguageSettings</code>, <code>ImportSettings</code>, <code>ExportSettings</code>, <code>VideoSettings</code> or <code>BatchExport</code>.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>recommended</td>\n<td>The user the session runs as. If non-empty and no such user exists, an external user is created. When omitted or unknown the form opens in an anonymous session.</td>\n</tr>\n<tr>\n<td><code>roles</code></td>\n<td>string</td>\n<td>no</td>\n<td>Comma separated extra roles granted to the form session on top of <code>External</code>, e.g. <code>Admin,ManageGlobalTemplates</code>.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>no</td>\n<td>Name stored on the request (the template's display name).</td>\n</tr>\n<tr>\n<td><code>configurationJson</code></td>\n<td>string</td>\n<td>no</td>\n<td>JSON to pre-fill the form with. Ignored when a template with this <code>{guid}</code> already exists.</td>\n</tr>\n<tr>\n<td><code>previousConfigurationGuid</code></td>\n<td>string</td>\n<td>no</td>\n<td>Id of an existing template to pre-fill the form from; used only when <code>configurationJson</code> is empty and <code>{guid}</code> does not exist yet.</td>\n</tr>\n<tr>\n<td><code>callbackUrl</code></td>\n<td>string</td>\n<td>no</td>\n<td>Called (POST, plain-text body) after the user saves. See the callback section below.</td>\n</tr>\n<tr>\n<td><code>returnUrl</code></td>\n<td>string</td>\n<td>no</td>\n<td>Where the user is sent back to after saving/closing.</td>\n</tr>\n<tr>\n<td><code>readOnly</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Open the form read-only (default <code>false</code>).</td>\n</tr>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>no</td>\n<td>Your own correlation id, stored with the request.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>no</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>configurationGuid</code>, <code>type</code></td>\n<td>-</td>\n<td>ignored</td>\n<td>Overwritten by the server (<code>{guid}</code> and <code>Configuration</code>).</td>\n</tr>\n<tr>\n<td><code>baseUrl</code>, <code>bucketPath</code>, <code>download</code>, <code>keepInBucket</code></td>\n<td>-</td>\n<td>no</td>\n<td>Accepted by the model; not used by configuration forms.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output:</strong> <code>200 OK</code> with a JSON string: the URL to send the user to, <code>\"https://&lt;host&gt;/V2/external?token=&lt;token&gt;\"</code>. A missing or invalid API token yields 401/403; malformed JSON yields an error response.</p>\n<p><strong>Callback for <code>ProjectSettings</code>:</strong> after save, <code>callbackUrl</code> is called with query parameters <code>language1</code>, <code>language2</code>, <code>fps</code> (the template's timecode format) and the text body <code>\"{language1} {fps}\"</code>. The call is best-effort; failures are only logged and do not affect the user's save.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","configuration","3741f1f4-fd01-4388-bd68-37ed4fccbd6a"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"a2b425cf-ddae-44d4-bfe2-c175e8585597","name":"Project settings","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"acf8f7c5-7b40-4497-9b97-b34a83e96676\",\n  \"email\": \"user@example.com\",\n  \"roles\": \"Admin,ManageGlobalTemplates\",\n  \"ip\": \"::1\",\n  \"name\": \"My ProjectSettings\",\n  \"configurationType\": \"ProjectSettings\",\n  \"configurationJson\": \"\",\n  \"previousConfigurationGuid\": \"\",\n  \"callbackUrl\": \"https://example.com/hooks/configuration-saved\",\n  \"returnUrl\": \"https://ooona.net/\",\n  \"readOnly\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/configuration/d58c0b79-9923-4d83-8941-97f5dfe84b89"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=7mQp2Zc9XwLr0TsVhB4nKd8aYfEjGuI1oNxRyC3eWM\""}],"_postman_id":"8321b31e-6051-46ab-89c1-7b432f947ded"},{"name":"Language settings","id":"b7d5d652-71ed-4b48-a99c-d5d674312688","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"1e929802-1273-47d5-999d-87e55446f471\",\n  \"email\": \"user@example.com\",\n  \"roles\": \"Admin,ManageGlobalTemplates\",\n  \"ip\": \"::1\",\n  \"configurationType\": \"LanguageSettings\",\n  \"configurationJson\": \"\",\n  \"previousConfigurationGuid\": \"\",\n  \"callbackUrl\": \"https://example.com/hooks/configuration-saved\",\n  \"returnUrl\": \"https://ooona.net/\",\n  \"readOnly\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/configuration/3c3a9b0f-cf92-42d2-8d5b-21b24fc4c9a9","description":"<p>Creates or edits a <strong>LanguageSettings</strong> configuration template through the hosted form.</p>\n<p>The form edits only the language-specific part of a configuration; it overrides the language settings of a <code>ProjectSettings</code> base when both are applied to a project.</p>\n<p><strong>Role:</strong> <code>API</code>.</p>\n<p>Starts a configuration-editing session for the <code>{guid}</code> in the URL. Nothing is saved as a template by this call: it stores a one-off \"external request\" and returns a <strong>URL</strong>. Redirect your user to that URL; they get a configuration form for the chosen <code>configurationType</code>. When they press save, the template is stored under <code>{guid}</code> (created, or updated if it already exists) and your <code>callbackUrl</code> (if any) is invoked. Afterwards the template can be read with <code>GET /external/configuration/{guid}</code> and used by id when opening projects, importing, exporting or running batch exports.</p>\n<p>Each call issues a new single-use token. Posting the same <code>{guid}</code> again replaces that id's existing configuration request with the new body (same row, new single-use token) instead of adding another row, so send the full body each time: a field you omit is cleared, except the <code>previous*Guid</code> seed fields, which keep their stored value when omitted. The configuration id comes from the route and <code>name</code> from the request. A project id is never matched. When a template with this <code>{guid}</code> already exists the form shows the stored template, not <code>configurationJson</code>.</p>\n<p><strong>Route</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>guid</code></td>\n<td>Identifier of the template to create or edit. You generate and keep it.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Body (JSON)</strong> - same fields for every <code>configurationType</code>; the type decides which form is shown and what is sent to the callback.</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>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>configurationType</code></td>\n<td>string</td>\n<td>yes</td>\n<td><code>ProjectSettings</code> (the default when omitted), <code>LanguageSettings</code>, <code>ImportSettings</code>, <code>ExportSettings</code>, <code>VideoSettings</code> or <code>BatchExport</code>.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>recommended</td>\n<td>The user the session runs as. If non-empty and no such user exists, an external user is created. When omitted or unknown the form opens in an anonymous session.</td>\n</tr>\n<tr>\n<td><code>roles</code></td>\n<td>string</td>\n<td>no</td>\n<td>Comma separated extra roles granted to the form session on top of <code>External</code>, e.g. <code>Admin,ManageGlobalTemplates</code>.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>no</td>\n<td>Name stored on the request (the template's display name).</td>\n</tr>\n<tr>\n<td><code>configurationJson</code></td>\n<td>string</td>\n<td>no</td>\n<td>JSON to pre-fill the form with. Ignored when a template with this <code>{guid}</code> already exists.</td>\n</tr>\n<tr>\n<td><code>previousConfigurationGuid</code></td>\n<td>string</td>\n<td>no</td>\n<td>Id of an existing template to pre-fill the form from; used only when <code>configurationJson</code> is empty and <code>{guid}</code> does not exist yet.</td>\n</tr>\n<tr>\n<td><code>callbackUrl</code></td>\n<td>string</td>\n<td>no</td>\n<td>Called (POST, plain-text body) after the user saves. See the callback section below.</td>\n</tr>\n<tr>\n<td><code>returnUrl</code></td>\n<td>string</td>\n<td>no</td>\n<td>Where the user is sent back to after saving/closing.</td>\n</tr>\n<tr>\n<td><code>readOnly</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Open the form read-only (default <code>false</code>).</td>\n</tr>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>no</td>\n<td>Your own correlation id, stored with the request.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>no</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>configurationGuid</code>, <code>type</code></td>\n<td>-</td>\n<td>ignored</td>\n<td>Overwritten by the server (<code>{guid}</code> and <code>Configuration</code>).</td>\n</tr>\n<tr>\n<td><code>baseUrl</code>, <code>bucketPath</code>, <code>download</code>, <code>keepInBucket</code></td>\n<td>-</td>\n<td>no</td>\n<td>Accepted by the model; not used by configuration forms.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output:</strong> <code>200 OK</code> with a JSON string: the URL to send the user to, <code>\"https://&lt;host&gt;/V2/external?token=&lt;token&gt;\"</code>. A missing or invalid API token yields 401/403; malformed JSON yields an error response.</p>\n<p><strong>Callback for <code>LanguageSettings</code>:</strong> after save, <code>callbackUrl</code> is called with query parameters <code>language1</code>, <code>language2</code> and the text body <code>\"{language1}\"</code>. The call is best-effort; failures are only logged and do not affect the user's save.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","configuration","9f2cfbfd-4193-45f8-8217-8ed2a83d057c"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"f23553a5-0a39-43ff-8985-bfebb1b867ef","name":"Language settings","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"e1cbde35-3050-4508-a20c-7b70c6c7c903\",\n  \"email\": \"user@example.com\",\n  \"roles\": \"Admin,ManageGlobalTemplates\",\n  \"ip\": \"::1\",\n  \"configurationType\": \"LanguageSettings\",\n  \"configurationJson\": \"\",\n  \"previousConfigurationGuid\": \"\",\n  \"callbackUrl\": \"https://example.com/hooks/configuration-saved\",\n  \"returnUrl\": \"https://ooona.net/\",\n  \"readOnly\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/configuration/25dc40db-fea2-40d8-98c7-59e3f43ce658"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=7mQp2Zc9XwLr0TsVhB4nKd8aYfEjGuI1oNxRyC3eWM\""}],"_postman_id":"b7d5d652-71ed-4b48-a99c-d5d674312688"},{"name":"Video settings","id":"32cc9591-4de5-4945-8f81-e988ab12d0b0","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"f0dbbbbf-9cb9-46f5-8a63-c46744c6bf3e\",\n  \"email\": \"user@example.com\",\n  \"roles\": \"Admin,ManageGlobalTemplates\",\n  \"ip\": \"::1\",\n  \"configurationType\": \"VideoSettings\",\n  \"configurationJson\": \"\",\n  \"previousConfigurationGuid\": \"\",\n  \"callbackUrl\": \"https://example.com/hooks/configuration-saved\",\n  \"returnUrl\": \"https://ooona.net/\",\n  \"readOnly\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/configuration/65541242-4a72-4f02-960d-ccf3dc99e6b1","description":"<p>Creates or edits a <strong>VideoSettings</strong> configuration template through the hosted form.</p>\n<p>The form edits only the video-specific part of a configuration (timecode format, video format); it overrides the video settings of a <code>ProjectSettings</code> base.</p>\n<p><strong>Role:</strong> <code>API</code>.</p>\n<p>Starts a configuration-editing session for the <code>{guid}</code> in the URL. Nothing is saved as a template by this call: it stores a one-off \"external request\" and returns a <strong>URL</strong>. Redirect your user to that URL; they get a configuration form for the chosen <code>configurationType</code>. When they press save, the template is stored under <code>{guid}</code> (created, or updated if it already exists) and your <code>callbackUrl</code> (if any) is invoked. Afterwards the template can be read with <code>GET /external/configuration/{guid}</code> and used by id when opening projects, importing, exporting or running batch exports.</p>\n<p>Each call issues a new single-use token. Posting the same <code>{guid}</code> again replaces that id's existing configuration request with the new body (same row, new single-use token) instead of adding another row, so send the full body each time: a field you omit is cleared, except the <code>previous*Guid</code> seed fields, which keep their stored value when omitted. The configuration id comes from the route and <code>name</code> from the request. A project id is never matched. When a template with this <code>{guid}</code> already exists the form shows the stored template, not <code>configurationJson</code>.</p>\n<p><strong>Route</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>guid</code></td>\n<td>Identifier of the template to create or edit. You generate and keep it.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Body (JSON)</strong> - same fields for every <code>configurationType</code>; the type decides which form is shown and what is sent to the callback.</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>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>configurationType</code></td>\n<td>string</td>\n<td>yes</td>\n<td><code>ProjectSettings</code> (the default when omitted), <code>LanguageSettings</code>, <code>ImportSettings</code>, <code>ExportSettings</code>, <code>VideoSettings</code> or <code>BatchExport</code>.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>recommended</td>\n<td>The user the session runs as. If non-empty and no such user exists, an external user is created. When omitted or unknown the form opens in an anonymous session.</td>\n</tr>\n<tr>\n<td><code>roles</code></td>\n<td>string</td>\n<td>no</td>\n<td>Comma separated extra roles granted to the form session on top of <code>External</code>, e.g. <code>Admin,ManageGlobalTemplates</code>.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>no</td>\n<td>Name stored on the request (the template's display name).</td>\n</tr>\n<tr>\n<td><code>configurationJson</code></td>\n<td>string</td>\n<td>no</td>\n<td>JSON to pre-fill the form with. Ignored when a template with this <code>{guid}</code> already exists.</td>\n</tr>\n<tr>\n<td><code>previousConfigurationGuid</code></td>\n<td>string</td>\n<td>no</td>\n<td>Id of an existing template to pre-fill the form from; used only when <code>configurationJson</code> is empty and <code>{guid}</code> does not exist yet.</td>\n</tr>\n<tr>\n<td><code>callbackUrl</code></td>\n<td>string</td>\n<td>no</td>\n<td>Called (POST, plain-text body) after the user saves. See the callback section below.</td>\n</tr>\n<tr>\n<td><code>returnUrl</code></td>\n<td>string</td>\n<td>no</td>\n<td>Where the user is sent back to after saving/closing.</td>\n</tr>\n<tr>\n<td><code>readOnly</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Open the form read-only (default <code>false</code>).</td>\n</tr>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>no</td>\n<td>Your own correlation id, stored with the request.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>no</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>configurationGuid</code>, <code>type</code></td>\n<td>-</td>\n<td>ignored</td>\n<td>Overwritten by the server (<code>{guid}</code> and <code>Configuration</code>).</td>\n</tr>\n<tr>\n<td><code>baseUrl</code>, <code>bucketPath</code>, <code>download</code>, <code>keepInBucket</code></td>\n<td>-</td>\n<td>no</td>\n<td>Accepted by the model; not used by configuration forms.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output:</strong> <code>200 OK</code> with a JSON string: the URL to send the user to, <code>\"https://&lt;host&gt;/V2/external?token=&lt;token&gt;\"</code>. A missing or invalid API token yields 401/403; malformed JSON yields an error response.</p>\n<p><strong>Callback for <code>VideoSettings</code>:</strong> after save, <code>callbackUrl</code> is called with query parameters <code>fps</code> (the template's timecodeFormat) and <code>videoFormat</code>, and the text body <code>\"{fps} {videoFormat}\"</code>. The call is best-effort; failures are only logged and do not affect the user's save.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","configuration","4aa5b46d-5975-4ed1-a4f6-ad7533bb36df"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"44645851-f5ae-4972-80f0-db44c45cc360","name":"Video settings","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"9a6dcdea-db52-4563-b597-1d8ad55d75be\",\n  \"email\": \"user@example.com\",\n  \"roles\": \"Admin,ManageGlobalTemplates\",\n  \"ip\": \"::1\",\n  \"configurationType\": \"VideoSettings\",\n  \"configurationJson\": \"\",\n  \"previousConfigurationGuid\": \"\",\n  \"callbackUrl\": \"https://example.com/hooks/configuration-saved\",\n  \"returnUrl\": \"https://ooona.net/\",\n  \"readOnly\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/configuration/e0b417a0-a09e-4dcc-a594-214c827d99a4"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=7mQp2Zc9XwLr0TsVhB4nKd8aYfEjGuI1oNxRyC3eWM\""}],"_postman_id":"32cc9591-4de5-4945-8f81-e988ab12d0b0"},{"name":"Import settings","id":"7e293d5f-c56f-4458-ba12-dc36f5a64e93","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"f327c224-8d7e-43fa-889f-a1d253145882\",\n  \"email\": \"user@example.com\",\n  \"roles\": \"Admin,ManageGlobalTemplates\",\n  \"ip\": \"::1\",\n  \"configurationType\": \"ImportSettings\",\n  \"configurationJson\": \"\",\n  \"previousConfigurationGuid\": \"\",\n  \"callbackUrl\": \"https://example.com/hooks/configuration-saved\",\n  \"returnUrl\": \"https://ooona.net/\",\n  \"readOnly\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/configuration/333b6282-9575-4cca-9c03-82d767fe8fc6","description":"<p>Creates or edits a <strong>ImportSettings</strong> configuration template through the hosted form.</p>\n<p>The form edits file import settings (format and parsing options). They only apply when the imported file has the same format as the template.</p>\n<p><strong>Role:</strong> <code>API</code>.</p>\n<p>Starts a configuration-editing session for the <code>{guid}</code> in the URL. Nothing is saved as a template by this call: it stores a one-off \"external request\" and returns a <strong>URL</strong>. Redirect your user to that URL; they get a configuration form for the chosen <code>configurationType</code>. When they press save, the template is stored under <code>{guid}</code> (created, or updated if it already exists) and your <code>callbackUrl</code> (if any) is invoked. Afterwards the template can be read with <code>GET /external/configuration/{guid}</code> and used by id when opening projects, importing, exporting or running batch exports.</p>\n<p>Each call issues a new single-use token. Posting the same <code>{guid}</code> again replaces that id's existing configuration request with the new body (same row, new single-use token) instead of adding another row, so send the full body each time: a field you omit is cleared, except the <code>previous*Guid</code> seed fields, which keep their stored value when omitted. The configuration id comes from the route and <code>name</code> from the request. A project id is never matched. When a template with this <code>{guid}</code> already exists the form shows the stored template, not <code>configurationJson</code>.</p>\n<p><strong>Route</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>guid</code></td>\n<td>Identifier of the template to create or edit. You generate and keep it.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Body (JSON)</strong> - same fields for every <code>configurationType</code>; the type decides which form is shown and what is sent to the callback.</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>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>configurationType</code></td>\n<td>string</td>\n<td>yes</td>\n<td><code>ProjectSettings</code> (the default when omitted), <code>LanguageSettings</code>, <code>ImportSettings</code>, <code>ExportSettings</code>, <code>VideoSettings</code> or <code>BatchExport</code>.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>recommended</td>\n<td>The user the session runs as. If non-empty and no such user exists, an external user is created. When omitted or unknown the form opens in an anonymous session.</td>\n</tr>\n<tr>\n<td><code>roles</code></td>\n<td>string</td>\n<td>no</td>\n<td>Comma separated extra roles granted to the form session on top of <code>External</code>, e.g. <code>Admin,ManageGlobalTemplates</code>.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>no</td>\n<td>Name stored on the request (the template's display name).</td>\n</tr>\n<tr>\n<td><code>configurationJson</code></td>\n<td>string</td>\n<td>no</td>\n<td>JSON to pre-fill the form with. Ignored when a template with this <code>{guid}</code> already exists.</td>\n</tr>\n<tr>\n<td><code>previousConfigurationGuid</code></td>\n<td>string</td>\n<td>no</td>\n<td>Id of an existing template to pre-fill the form from; used only when <code>configurationJson</code> is empty and <code>{guid}</code> does not exist yet.</td>\n</tr>\n<tr>\n<td><code>callbackUrl</code></td>\n<td>string</td>\n<td>no</td>\n<td>Called (POST, plain-text body) after the user saves. See the callback section below.</td>\n</tr>\n<tr>\n<td><code>returnUrl</code></td>\n<td>string</td>\n<td>no</td>\n<td>Where the user is sent back to after saving/closing.</td>\n</tr>\n<tr>\n<td><code>readOnly</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Open the form read-only (default <code>false</code>).</td>\n</tr>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>no</td>\n<td>Your own correlation id, stored with the request.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>no</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>configurationGuid</code>, <code>type</code></td>\n<td>-</td>\n<td>ignored</td>\n<td>Overwritten by the server (<code>{guid}</code> and <code>Configuration</code>).</td>\n</tr>\n<tr>\n<td><code>baseUrl</code>, <code>bucketPath</code>, <code>download</code>, <code>keepInBucket</code></td>\n<td>-</td>\n<td>no</td>\n<td>Accepted by the model; not used by configuration forms.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output:</strong> <code>200 OK</code> with a JSON string: the URL to send the user to, <code>\"https://&lt;host&gt;/V2/external?token=&lt;token&gt;\"</code>. A missing or invalid API token yields 401/403; malformed JSON yields an error response.</p>\n<p><strong>Callback for <code>ImportSettings</code>:</strong> after save, <code>callbackUrl</code> is called with query parameters <code>language1</code>, <code>language2</code>, <code>format</code>, <code>fps</code> and the text body <code>\"{format} {language1} {fps}\"</code>. The call is best-effort; failures are only logged and do not affect the user's save.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","configuration","75e1ed70-9fb9-4a61-b689-a472a5ce2cec"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"d27d4072-4211-4ec0-8035-23409dda3630","name":"Import settings","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"569ef7e9-f863-4e3a-84f9-8f49f619dc04\",\n  \"email\": \"user@example.com\",\n  \"roles\": \"Admin,ManageGlobalTemplates\",\n  \"ip\": \"::1\",\n  \"configurationType\": \"ImportSettings\",\n  \"configurationJson\": \"\",\n  \"previousConfigurationGuid\": \"\",\n  \"callbackUrl\": \"https://example.com/hooks/configuration-saved\",\n  \"returnUrl\": \"https://ooona.net/\",\n  \"readOnly\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/configuration/b876d46d-d0e5-4932-9754-511c4e735128"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=7mQp2Zc9XwLr0TsVhB4nKd8aYfEjGuI1oNxRyC3eWM\""}],"_postman_id":"7e293d5f-c56f-4458-ba12-dc36f5a64e93"},{"name":"Export settings","id":"25980b53-f992-47ee-8700-89346bbbfbb1","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"391ce480-c1d3-4b3b-9e1a-c185d510dc2b\",\n  \"email\": \"user@example.com\",\n  \"roles\": \"Admin,ManageGlobalTemplates\",\n  \"ip\": \"::1\",\n  \"configurationType\": \"ExportSettings\",\n  \"configurationJson\": \"\",\n  \"previousConfigurationGuid\": \"\",\n  \"callbackUrl\": \"https://example.com/hooks/configuration-saved\",\n  \"returnUrl\": \"https://ooona.net/\",\n  \"readOnly\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/configuration/101f777d-a47a-4c38-b1f9-2d6e5258d11a","description":"<p>Creates or edits a <strong>ExportSettings</strong> configuration template through the hosted form.</p>\n<p>The form edits file export settings (format and delivery specification). They are used when the user finishes a project and a file is exported in the background and POSTed to the project's <code>callbackUrl</code>.</p>\n<p><strong>Role:</strong> <code>API</code>.</p>\n<p>Starts a configuration-editing session for the <code>{guid}</code> in the URL. Nothing is saved as a template by this call: it stores a one-off \"external request\" and returns a <strong>URL</strong>. Redirect your user to that URL; they get a configuration form for the chosen <code>configurationType</code>. When they press save, the template is stored under <code>{guid}</code> (created, or updated if it already exists) and your <code>callbackUrl</code> (if any) is invoked. Afterwards the template can be read with <code>GET /external/configuration/{guid}</code> and used by id when opening projects, importing, exporting or running batch exports.</p>\n<p>Each call issues a new single-use token. Posting the same <code>{guid}</code> again replaces that id's existing configuration request with the new body (same row, new single-use token) instead of adding another row, so send the full body each time: a field you omit is cleared, except the <code>previous*Guid</code> seed fields, which keep their stored value when omitted. The configuration id comes from the route and <code>name</code> from the request. A project id is never matched. When a template with this <code>{guid}</code> already exists the form shows the stored template, not <code>configurationJson</code>.</p>\n<p><strong>Route</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>guid</code></td>\n<td>Identifier of the template to create or edit. You generate and keep it.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Body (JSON)</strong> - same fields for every <code>configurationType</code>; the type decides which form is shown and what is sent to the callback.</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>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>configurationType</code></td>\n<td>string</td>\n<td>yes</td>\n<td><code>ProjectSettings</code> (the default when omitted), <code>LanguageSettings</code>, <code>ImportSettings</code>, <code>ExportSettings</code>, <code>VideoSettings</code> or <code>BatchExport</code>.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>recommended</td>\n<td>The user the session runs as. If non-empty and no such user exists, an external user is created. When omitted or unknown the form opens in an anonymous session.</td>\n</tr>\n<tr>\n<td><code>roles</code></td>\n<td>string</td>\n<td>no</td>\n<td>Comma separated extra roles granted to the form session on top of <code>External</code>, e.g. <code>Admin,ManageGlobalTemplates</code>.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>no</td>\n<td>Name stored on the request (the template's display name).</td>\n</tr>\n<tr>\n<td><code>configurationJson</code></td>\n<td>string</td>\n<td>no</td>\n<td>JSON to pre-fill the form with. Ignored when a template with this <code>{guid}</code> already exists.</td>\n</tr>\n<tr>\n<td><code>previousConfigurationGuid</code></td>\n<td>string</td>\n<td>no</td>\n<td>Id of an existing template to pre-fill the form from; used only when <code>configurationJson</code> is empty and <code>{guid}</code> does not exist yet.</td>\n</tr>\n<tr>\n<td><code>callbackUrl</code></td>\n<td>string</td>\n<td>no</td>\n<td>Called (POST, plain-text body) after the user saves. See the callback section below.</td>\n</tr>\n<tr>\n<td><code>returnUrl</code></td>\n<td>string</td>\n<td>no</td>\n<td>Where the user is sent back to after saving/closing.</td>\n</tr>\n<tr>\n<td><code>readOnly</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Open the form read-only (default <code>false</code>).</td>\n</tr>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>no</td>\n<td>Your own correlation id, stored with the request.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>no</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>configurationGuid</code>, <code>type</code></td>\n<td>-</td>\n<td>ignored</td>\n<td>Overwritten by the server (<code>{guid}</code> and <code>Configuration</code>).</td>\n</tr>\n<tr>\n<td><code>baseUrl</code>, <code>bucketPath</code>, <code>download</code>, <code>keepInBucket</code></td>\n<td>-</td>\n<td>no</td>\n<td>Accepted by the model; not used by configuration forms.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output:</strong> <code>200 OK</code> with a JSON string: the URL to send the user to, <code>\"https://&lt;host&gt;/V2/external?token=&lt;token&gt;\"</code>. A missing or invalid API token yields 401/403; malformed JSON yields an error response.</p>\n<p><strong>Callback for <code>ExportSettings</code>:</strong> after save, <code>callbackUrl</code> is called with query parameters <code>language1</code>, <code>language2</code>, <code>format</code>, <code>fps</code> and the text body <code>\"{format} {language1} {fps}\"</code>. The call is best-effort; failures are only logged and do not affect the user's save.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","configuration","aad072d1-4974-420f-89c6-32adb2ccea5c"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"7a5d3f36-dbd7-4a4e-bf90-46314453aee7","name":"Export settings","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"e17c0086-c8bb-4d64-9a26-6c814d4c9150\",\n  \"email\": \"user@example.com\",\n  \"roles\": \"Admin,ManageGlobalTemplates\",\n  \"ip\": \"::1\",\n  \"configurationType\": \"ExportSettings\",\n  \"configurationJson\": \"\",\n  \"previousConfigurationGuid\": \"\",\n  \"callbackUrl\": \"https://example.com/hooks/configuration-saved\",\n  \"returnUrl\": \"https://ooona.net/\",\n  \"readOnly\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/configuration/9b5c46e4-d871-4638-a024-5bbcfa926f4e"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=7mQp2Zc9XwLr0TsVhB4nKd8aYfEjGuI1oNxRyC3eWM\""}],"_postman_id":"25980b53-f992-47ee-8700-89346bbbfbb1"},{"name":"Batch export settings","id":"8aae7112-2b54-4227-9b5c-04a7168d4938","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"b9018ed5-e92f-4fb4-9cc8-9d817f651857\",\n  \"email\": \"user@example.com\",\n  \"roles\": \"Admin,ManageGlobalTemplates\",\n  \"ip\": \"::1\",\n  \"configurationType\": \"BatchExport\",\n  \"configurationJson\": \"\",\n  \"previousConfigurationGuid\": \"\",\n  \"callbackUrl\": \"https://example.com/hooks/configuration-saved\",\n  \"returnUrl\": \"https://ooona.net/\",\n  \"readOnly\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/configuration/305d67a4-f23b-4388-9af4-e91fc3246abb","description":"<p>Creates or edits a <strong>BatchExport</strong> configuration template through the hosted form.</p>\n<p>The form edits a <strong>batch export configuration</strong>: a list of named exports (each a set of export settings plus file naming). The saved JSON is an array. Reference it from <code>POST /external/batchExport</code> through <code>items[].configurationGuid</code>.</p>\n<p><strong>Role:</strong> <code>API</code>.</p>\n<p>Starts a configuration-editing session for the <code>{guid}</code> in the URL. Nothing is saved as a template by this call: it stores a one-off \"external request\" and returns a <strong>URL</strong>. Redirect your user to that URL; they get a configuration form for the chosen <code>configurationType</code>. When they press save, the template is stored under <code>{guid}</code> (created, or updated if it already exists) and your <code>callbackUrl</code> (if any) is invoked. Afterwards the template can be read with <code>GET /external/configuration/{guid}</code> and used by id when opening projects, importing, exporting or running batch exports.</p>\n<p>Each call issues a new single-use token. Posting the same <code>{guid}</code> again replaces that id's existing configuration request with the new body (same row, new single-use token) instead of adding another row, so send the full body each time: a field you omit is cleared, except the <code>previous*Guid</code> seed fields, which keep their stored value when omitted. The configuration id comes from the route and <code>name</code> from the request. A project id is never matched. When a template with this <code>{guid}</code> already exists the form shows the stored template, not <code>configurationJson</code>.</p>\n<p><strong>Route</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>guid</code></td>\n<td>Identifier of the template to create or edit. You generate and keep it.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Body (JSON)</strong> - same fields for every <code>configurationType</code>; the type decides which form is shown and what is sent to the callback.</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>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>configurationType</code></td>\n<td>string</td>\n<td>yes</td>\n<td><code>ProjectSettings</code> (the default when omitted), <code>LanguageSettings</code>, <code>ImportSettings</code>, <code>ExportSettings</code>, <code>VideoSettings</code> or <code>BatchExport</code>.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>recommended</td>\n<td>The user the session runs as. If non-empty and no such user exists, an external user is created. When omitted or unknown the form opens in an anonymous session.</td>\n</tr>\n<tr>\n<td><code>roles</code></td>\n<td>string</td>\n<td>no</td>\n<td>Comma separated extra roles granted to the form session on top of <code>External</code>, e.g. <code>Admin,ManageGlobalTemplates</code>.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>no</td>\n<td>Name stored on the request (the template's display name).</td>\n</tr>\n<tr>\n<td><code>configurationJson</code></td>\n<td>string</td>\n<td>no</td>\n<td>JSON to pre-fill the form with. Ignored when a template with this <code>{guid}</code> already exists.</td>\n</tr>\n<tr>\n<td><code>previousConfigurationGuid</code></td>\n<td>string</td>\n<td>no</td>\n<td>Id of an existing template to pre-fill the form from; used only when <code>configurationJson</code> is empty and <code>{guid}</code> does not exist yet.</td>\n</tr>\n<tr>\n<td><code>callbackUrl</code></td>\n<td>string</td>\n<td>no</td>\n<td>Called (POST, plain-text body) after the user saves. See the callback section below.</td>\n</tr>\n<tr>\n<td><code>returnUrl</code></td>\n<td>string</td>\n<td>no</td>\n<td>Where the user is sent back to after saving/closing.</td>\n</tr>\n<tr>\n<td><code>readOnly</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Open the form read-only (default <code>false</code>).</td>\n</tr>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>no</td>\n<td>Your own correlation id, stored with the request.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>no</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>configurationGuid</code>, <code>type</code></td>\n<td>-</td>\n<td>ignored</td>\n<td>Overwritten by the server (<code>{guid}</code> and <code>Configuration</code>).</td>\n</tr>\n<tr>\n<td><code>baseUrl</code>, <code>bucketPath</code>, <code>download</code>, <code>keepInBucket</code></td>\n<td>-</td>\n<td>no</td>\n<td>Accepted by the model; not used by configuration forms.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output:</strong> <code>200 OK</code> with a JSON string: the URL to send the user to, <code>\"https://&lt;host&gt;/V2/external?token=&lt;token&gt;\"</code>. A missing or invalid API token yields 401/403; malformed JSON yields an error response.</p>\n<p><strong>Callback for <code>BatchExport</code>:</strong> after save, <code>callbackUrl</code> is called with no query parameters, and the text body <code>\"&lt;N&gt; exports (&lt;name1&gt;, &lt;name2&gt;, ...)\"</code>. The call is best-effort; failures are only logged and do not affect the user's save.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","configuration","38abaffc-064c-40ab-930e-f859f07b2180"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"0b4f1ac1-09b7-4e51-a864-d8858dba5461","name":"Batch export settings","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"20fdf045-6111-495a-9b02-dfcd22956208\",\n  \"email\": \"user@example.com\",\n  \"roles\": \"Admin,ManageGlobalTemplates\",\n  \"ip\": \"::1\",\n  \"configurationType\": \"BatchExport\",\n  \"configurationJson\": \"\",\n  \"previousConfigurationGuid\": \"\",\n  \"callbackUrl\": \"https://example.com/hooks/configuration-saved\",\n  \"returnUrl\": \"https://ooona.net/\",\n  \"readOnly\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/configuration/7fdc12d7-b050-4451-a2d4-c5abce77e8a7"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=7mQp2Zc9XwLr0TsVhB4nKd8aYfEjGuI1oNxRyC3eWM\""}],"_postman_id":"8aae7112-2b54-4227-9b5c-04a7168d4938"},{"name":"Copy configuration","id":"bf8285b0-b50d-4090-8d57-ad907c0ec047","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"[\r\n    { \r\n        \"sourceConfigurationId\": \"683d1c2f-2028-4545-9eda-31cbb7f2bac3\",\r\n        \"targetConfigurationId\": \"06589713-e28e-4952-bc14-2a43f796d597\"\r\n    },\r\n    { \r\n        \"sourceConfigurationId\": \"cd05fe59-2d92-48a7-86b8-d3ebb471ddc1\",\r\n        \"targetConfigurationId\": \"0fcca697-3302-4da6-9c6a-3443c473457c\"\r\n    }\r\n]","options":{"raw":{"language":"text"}}},"url":"{{base_url}}/external/configuration/copyConfigurations","description":"<p><strong>Role:</strong> <code>API</code>.</p>\n<p>Copies one or more existing templates to new ids. The content is duplicated into a new stored file; the copy keeps the source's type and is flagged as an API template, so it shows up in <code>GET /external/configurations</code>. The copy's name is its new id.</p>\n<p>The last URL segment is the literal <code>copyConfigurations</code> (not a guid).</p>\n<p><strong>Body (JSON)</strong>: a single object, or an array of objects to make several copies in one call.</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>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>sourceConfigurationId</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Id of the template to copy.</td>\n</tr>\n<tr>\n<td><code>targetConfigurationId</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Id the copy will get.</td>\n</tr>\n</tbody>\n</table>\n</div><p>A pair is silently skipped when the source does not exist or when a template with the target id already exists (an existing template is never overwritten and no error is reported for it).</p>\n<p><strong>Output:</strong> <code>200 OK</code> with the JSON string <code>\"Copied successfully\"</code> once the request was processed, even if every pair was skipped. <code>404 Not Found</code> only when the body is an empty array. Use <code>GET /external/configuration/{targetConfigurationId}</code> to confirm a copy was made.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","configuration","copyConfigurations"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"74cfe71a-a5be-4152-b252-9bb8c2bcda16","name":"Copy configuration","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"[\r\n    { \r\n        \"sourceConfigurationId\": \"d0f991cd-60ee-4e75-ba97-2bebde8ccd5f\",\r\n        \"targetConfigurationId\": \"95c61592-e6eb-4c22-b48d-59130dfc9ac6\"\r\n    },\r\n    { \r\n        \"sourceConfigurationId\": \"ab77e0f3-4652-4a1b-ab5d-49bbc53fae78\",\r\n        \"targetConfigurationId\": \"31d91132-0b63-46d0-a75b-f080b65e96de\"\r\n    }\r\n]","options":{"raw":{"language":"text"}}},"url":"{{base_url}}/external/configuration/copyConfigurations"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"21"}],"cookie":[],"responseTime":null,"body":"\"Copied successfully\""}],"_postman_id":"bf8285b0-b50d-4090-8d57-ad907c0ec047"},{"name":"Get all configurations","id":"b938447a-c39d-46c9-9199-389731423954","request":{"method":"GET","header":[],"url":"{{base_url}}/external/configurations","description":"<p><strong>Role:</strong> <code>API</code>.</p>\n<p>Lists the configuration templates that were created through the API (via <code>POST</code> / <code>PUT /external/configuration/{guid}</code> or <code>copyConfigurations</code>). Templates created by users in the UI are not included.</p>\n<p>No parameters.</p>\n<p><strong>Output:</strong> <code>200 OK</code> with a JSON array; each item:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>Template id (use with <code>GET</code> / <code>PUT</code> / <code>DELETE /external/configuration/{id}</code>).</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>Template name.</td>\n</tr>\n<tr>\n<td><code>type</code></td>\n<td><code>ProjectSettings</code>, <code>ImportSettings</code>, <code>ExportSettings</code> or <code>BatchExport</code>. Language and video templates, and any other template type, are reported as <code>ProjectSettings</code>.</td>\n</tr>\n<tr>\n<td><code>creationTime</code>, <code>lastModified</code></td>\n<td>Timestamps.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The list does not include template contents; fetch them with <code>GET /external/configuration/{id}</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","configurations"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"ba0cdd15-c316-43c9-bba5-e3eaf7b993e1","name":"Get all configurations","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/configurations"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"1863"}],"cookie":[],"responseTime":null,"body":"[\n    {\n        \"creationTime\": \"2023-09-01T19:23:35.137\",\n        \"id\": \"2fe95dce-1b41-4bf4-97d4-e5b204eadb5c\",\n        \"lastModified\": \"2023-09-01T19:23:35.137\",\n        \"name\": \"4c523555-06c4-4a12-87be-1e8e78f2631d\",\n        \"type\": \"ImportSettings\"\n    },\n    {\n        \"creationTime\": \"2023-08-31T21:53:30.673\",\n        \"id\": \"6ce1c5ca-cd1f-494f-8773-218ece911318\",\n        \"lastModified\": \"2023-08-31T21:53:30.673\",\n        \"name\": \"5a090aad-202a-4e6a-ba8c-ae3cdc460537\",\n        \"type\": \"ExportSettings\"\n    },\n    {\n        \"creationTime\": \"2023-09-13T19:23:53.17\",\n        \"id\": \"894757b1-25b7-40b5-b542-928408d9ef9f\",\n        \"lastModified\": \"2023-09-13T19:23:53.17\",\n        \"name\": \"f07b5c24-8e1a-4b28-9478-b6e6a8d7de77\",\n        \"type\": \"ImportSettings\"\n    },\n    {\n        \"creationTime\": \"2023-08-31T21:53:35.943\",\n        \"id\": \"998b4364-b7a5-4c92-8cde-2eb4f6f1186d\",\n        \"lastModified\": \"2023-08-31T21:53:35.943\",\n        \"name\": \"9fd4229e-cf15-41dd-aca2-e554da5510e5\",\n        \"type\": \"ExportSettings\"\n    },\n    {\n        \"creationTime\": \"2023-09-01T19:23:48.117\",\n        \"id\": \"9cb4d052-cc39-4616-a476-ed9f5b1a44a8\",\n        \"lastModified\": \"2023-09-01T19:23:48.117\",\n        \"name\": \"17e5906a-0516-43d8-bbf5-c728cb6f7b29\",\n        \"type\": \"ExportSettings\"\n    },\n    {\n        \"creationTime\": \"2023-08-09T19:29:10.747\",\n        \"id\": \"a9333575-2a56-4d15-b048-ece4dc49e810\",\n        \"lastModified\": \"2023-08-09T19:29:10.747\",\n        \"name\": \"VTT\",\n        \"type\": \"ImportSettings\"\n    },\n    {\n        \"creationTime\": \"2023-08-31T21:53:11.473\",\n        \"id\": \"de313a8b-af97-475f-bd8d-b0cb59e2e98e\",\n        \"lastModified\": \"2023-08-31T21:53:11.473\",\n        \"name\": \"dfb9e85f-e942-463a-ba07-562a437be1af\",\n        \"type\": \"ImportSettings\"\n    },\n    {\n        \"creationTime\": \"2023-08-03T12:27:45.623\",\n        \"id\": \"e78f53dd-54b1-454a-b4c4-4059e31873bb\",\n        \"lastModified\": \"2023-08-03T12:27:45.623\",\n        \"name\": \"SRT\",\n        \"type\": \"ExportSettings\"\n    }\n]"}],"_postman_id":"b938447a-c39d-46c9-9199-389731423954"},{"name":"Get default configuration","id":"053d17ea-0b27-4667-94d1-d6715fb84cce","request":{"method":"GET","header":[],"url":"{{base_url}}/external/configuration/default","description":"<p><strong>Role:</strong> <code>API</code>.</p>\n<p>Returns the default configuration object (<code>SubtitlesConfiguration</code>) with every property and its default value. Use it as the reference for the <code>value</code> of <code>PUT /external/configuration/{guid}</code> and for the bodies of the Convert templates endpoints.</p>\n<p>No parameters. <strong>Output:</strong> <code>200 OK</code> with the JSON object as <code>application/json</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","configuration","default"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"9c9c8c99-26e1-4a88-b823-cbf0d2f9af23","name":"Get default configuration","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/configuration/default"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Length","value":"14830"},{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n    \"absolutePositioning\": true,\n    \"adjustMixedAlignmentsWithSpaces\": false,\n    \"ageRating\": null,\n    \"alignAllLines\": true,\n    \"allowSplitParagraphs\": false,\n    \"appendStartIndex\": null,\n    \"aspectRatio\": \"16:9\",\n    \"assDontIncludeNewLineAtTheEnd\": false,\n    \"assForBurning\": false,\n    \"assOmitBottomCenterPositioning\": false,\n    \"assSeprateLineFormatting\": false,\n    \"audioScrubbingEnabled\": true,\n    \"autoBreakLine\": true,\n    \"autoComplyTiming\": true,\n    \"autoComplyTimingGap\": false,\n    \"autoDetectFps\": false,\n    \"autoDetectLanguage\": false,\n    \"autoOutCue\": false,\n    \"autoPopulateFpsFromDatFile\": null,\n    \"autoPopulateStartTCFromDatFile\": null,\n    \"autoRecognizeTimeFormat\": true,\n    \"autoSaveInterval\": 2,\n    \"autoSnapToShotChange\": false,\n    \"autoTC\": true,\n    \"autoTCDuration\": 30,\n    \"batchExport\": false,\n    \"Cavena\": {\n        \"comments\": null,\n        \"originalTitle\": null,\n        \"producer\": null,\n        \"startOfMessage\": null,\n        \"tapeNumber\": null,\n        \"translatedEpisodeTitle\": null,\n        \"translatedTitle\": null,\n        \"translator\": null,\n        \"useEmptyLinesInsteadOfVPos\": true\n    },\n    \"ccSettings\": {\n        \"alignAllLines\": true,\n        \"defaultAlign\": \"Center\",\n        \"defaultBox\": \"FixedBox\",\n        \"defaultJustification\": \"Left\",\n        \"defaultOutline\": \"Outline\",\n        \"doubleHeight\": false,\n        \"EBU\": {\n            \"standard\": \"OpenSubtitles\"\n        },\n        \"graphicalLineLength\": false,\n        \"graphicalLineLengthFont1\": null,\n        \"graphicalLineLengthFont2\": null,\n        \"graphicalLineLengthFormat\": null,\n        \"inCuesSnapThreshold\": 0,\n        \"lineLength\": 32,\n        \"maxParagraphLines\": 2,\n        \"maxSubDuration\": 7,\n        \"maxTimingGap\": null,\n        \"minSubDuration\": 0.8333,\n        \"preventTimingOverlap\": true,\n        \"screenLines\": 15,\n        \"snapInCues\": false,\n        \"timingFramesGap\": 2\n    },\n    \"characterHalfWidth\": false,\n    \"closedCaptions\": {\n        \"blanksBetweenPopOn\": 2,\n        \"box\": \"None\",\n        \"chainSubtitles\": false,\n        \"closedCaptionMode\": 7,\n        \"doubleControlCodes\": true,\n        \"exportChannel\": 1,\n        \"exportUpperCase\": false,\n        \"extendedCharset\": true,\n        \"fixTimecodeOverrun\": false,\n        \"isBold\": false,\n        \"isTunnel608\": false,\n        \"languageCode\": \"\",\n        \"sccQuickTimeCompatible\": 0,\n        \"sccRemoveSpaceAfterControlCodes\": false,\n        \"sccUseSemiColon\": false,\n        \"scriptVersion\": 0,\n        \"style\": \"PopOn\"\n    },\n    \"columns\": [],\n    \"convertBlackBoxesToTopAligned\": false,\n    \"convertFramerate\": \"none\",\n    \"convertLeftToCenterLeft\": false,\n    \"convertNullCuesToZero\": false,\n    \"countryKey\": \"USA\",\n    \"customTxt\": {\n        \"alignLeft\": false,\n        \"encodingValue\": \"65001\",\n        \"exportRaisedValue\": false,\n        \"exportReferenceCodesValue\": true,\n        \"exportZeroValue\": true,\n        \"fileFooterValue\": \"\",\n        \"fileHeaderValue\": \"\",\n        \"italicStartValue\": \"<I>\",\n        \"italicStopValue\": \"</I>\",\n        \"rowDelimiterValue\": \"<new_line>\",\n        \"rtfExportValue\": false,\n        \"rtfFontBoldValue\": false,\n        \"rtfFontNameValue\": \"Arial\",\n        \"rtfFontSizeValue\": \"12\",\n        \"rtfOptionsValue\": \"120\",\n        \"skipBOMValue\": false,\n        \"subtitleDelimiterValue\": \"<new_line><new_line>\",\n        \"subtitleFooterValue\": \"\",\n        \"subtitleHeaderValue\": \"<num> <in_cue> <out_cue><new_line>\"\n    },\n    \"defaultAlign\": \"Center\",\n    \"defaultBackground\": null,\n    \"defaultBotenHorizontal\": \"●\",\n    \"defaultBotenVertical\": \"﹅\",\n    \"defaultBox\": \"None\",\n    \"defaultColor\": null,\n    \"defaultJustification\": \"None\",\n    \"defaultOutline\": \"Outline\",\n    \"detectEncoding\": true,\n    \"dictionary\": \"English en-US\",\n    \"display\": {\n        \"antiAliasingColor\": \"#808080\",\n        \"antiAliasingType\": \"OuterNormal\",\n        \"boxBottomMargin\": 0,\n        \"boxColor\": \"#000000\",\n        \"boxLeftMargin\": 18,\n        \"boxOpacity\": 35,\n        \"boxRightMargin\": 18,\n        \"boxTopMargin\": 0,\n        \"boxType\": \"None\",\n        \"isBold\": false,\n        \"letterBox\": \"None\",\n        \"outlineColor\": \"#000000\",\n        \"outlineType\": \"Outline\",\n        \"outlineWidth\": 2,\n        \"shadow1\": {\n            \"blur\": 0,\n            \"color\": \"#000000\",\n            \"offsetX\": 0,\n            \"offsetY\": 0,\n            \"opacity\": 100,\n            \"size\": 0,\n            \"visible\": true\n        },\n        \"shadow2\": {\n            \"blur\": 0,\n            \"color\": \"#000000\",\n            \"offsetX\": 0,\n            \"offsetY\": 0,\n            \"opacity\": 100,\n            \"size\": 0,\n            \"visible\": false\n        },\n        \"shadowColor\": \"#000000\",\n        \"shadowOffsetX\": 0,\n        \"shadowOffsetY\": 0,\n        \"textColorOverride\": \"\"\n    },\n    \"DLP\": {\n        \"applyVideoFrameRateConversion\": false,\n        \"compressTrueTypeFont\": false,\n        \"exportFontFile\": false,\n        \"exportImages\": false,\n        \"fadeDown\": 20,\n        \"fadeDownUp\": false,\n        \"fadeUp\": 20,\n        \"fontURI\": \"\",\n        \"importDetectCenterLeftAligned\": true,\n        \"importOverrideSafeArea\": false,\n        \"overrideEffectsColor\": \"#000000\",\n        \"overrideEffectsType\": \"none\",\n        \"overrideTextColor\": false,\n        \"overrideTextColorValue\": \"#FFFFFF\",\n        \"overrideTextEffects\": false,\n        \"presentationList\": false,\n        \"reelNumber\": 1,\n        \"title\": \"\",\n        \"toFrameRate\": \"24 fps\",\n        \"useStandardFont\": true,\n        \"version\": \"DCSubtitle 1.0\"\n    },\n    \"dontCountCompositionCharacters\": false,\n    \"doubleHeight\": false,\n    \"DVD\": {\n        \"backgroundColor\": \"\",\n        \"edlClipNameInSeparateLine\": false,\n        \"exportCropImage\": false,\n        \"fcpScriptVersion\": 0,\n        \"imageFormat\": \"PNG_8\",\n        \"imageLocation\": \"@\",\n        \"imagePrefix\": \"@\",\n        \"languageCode\": \"ENG\",\n        \"scriptFileName\": \"@\",\n        \"ultech1080ScanType\": 1\n    },\n    \"EBU\": {\n        \"alignWithSpaces\": true,\n        \"allowNonStandardFpsInHeader\": false,\n        \"characterCodeTable\": 0,\n        \"country\": \"\",\n        \"dontTreatMidRowItalicsAsSpace\": false,\n        \"editorsName\": \"\",\n        \"episodeOriginalTitle\": \"\",\n        \"episodeTranslatedTitle\": \"\",\n        \"exportItalicsAsLessAndMore\": false,\n        \"forceDoubleHeight\": true,\n        \"forceDoubleHeightAtTheBeginningOfLine\": false,\n        \"forceNormalHeightAtTheBeginningOfLine\": false,\n        \"forceOpenSubtitles\": false,\n        \"forceStartBoxControlCodeAtTheBeginningOfLine\": false,\n        \"forceTeletextSubtitles\": false,\n        \"headerCodePage\": \"\",\n        \"includeBoxOnOffControlCodes\": true,\n        \"includeColorCodes\": true,\n        \"languageCode\": \"00\",\n        \"programOriginalTitle\": \"\",\n        \"programTranslatedTitle\": \"\",\n        \"publisher\": \"\",\n        \"referenceCode\": \"\",\n        \"revisionNumber\": 0,\n        \"standard\": \"OpenSubtitles\",\n        \"startOfProgramme\": null,\n        \"treatLessAndMoreThanAsItalics\": true,\n        \"useOpenModeBoxingControlCodes\": false\n    },\n    \"encoding\": \"utf-8\",\n    \"engine\": \"OoonaConvert\",\n    \"exportAnnotations\": false,\n    \"exportComments\": false,\n    \"exportEmptySubtitles\": \"ask\",\n    \"exportFontSize\": 48,\n    \"exportOnlySelected\": false,\n    \"exportTimecodeOffset\": 0,\n    \"exportTimeOffset\": null,\n    \"exportUntimedSubtitles\": \"ask\",\n    \"exportZero\": false,\n    \"extension\": \"\",\n    \"filename\": \"\",\n    \"flavor\": \"Ooona\",\n    \"font1\": \"Arial\",\n    \"font2\": \"Arial\",\n    \"format\": \"Ooona\",\n    \"fps\": 23.976,\n    \"graphicalLineLength\": false,\n    \"graphicalLineLengthFont1\": null,\n    \"graphicalLineLengthFont2\": null,\n    \"graphicalLineLengthFormat\": null,\n    \"hideOutCue\": false,\n    \"hideSecondTimeline\": null,\n    \"ignoreLanguageConfiguration\": false,\n    \"importClearTargetColumn\": false,\n    \"importTimecodeOffset\": null,\n    \"importTimecodeStart\": null,\n    \"importWordWrap\": true,\n    \"includeVTTDirectionCodes\": false,\n    \"inCuesSnapThreshold\": 0,\n    \"isRtl\": false,\n    \"isRtl2\": false,\n    \"japaneseAgeRatingFixHiraganize\": false,\n    \"language1\": \"English\",\n    \"language2\": \"English\",\n    \"lineGap\": 1,\n    \"lineLength\": 37,\n    \"lockTimecodes\": false,\n    \"maxParagraphLines\": 2,\n    \"maxSubDuration\": 7,\n    \"maxTimingGap\": null,\n    \"mediaStartTimecode\": 0,\n    \"mergeAndSort\": false,\n    \"minSubDuration\": 0.8333,\n    \"mode\": \"Open\",\n    \"openSettings\": {\n        \"alignAllLines\": true,\n        \"defaultAlign\": \"Center\",\n        \"defaultBox\": \"None\",\n        \"defaultJustification\": \"None\",\n        \"defaultOutline\": \"Outline\",\n        \"doubleHeight\": false,\n        \"EBU\": {\n            \"standard\": \"OpenSubtitles\"\n        },\n        \"graphicalLineLength\": false,\n        \"graphicalLineLengthFont1\": null,\n        \"graphicalLineLengthFont2\": null,\n        \"graphicalLineLengthFormat\": null,\n        \"inCuesSnapThreshold\": 0,\n        \"lineLength\": 42,\n        \"maxParagraphLines\": 2,\n        \"maxSubDuration\": 7,\n        \"maxTimingGap\": null,\n        \"minSubDuration\": 0.8333,\n        \"preventTimingOverlap\": true,\n        \"screenLines\": 11,\n        \"snapInCues\": false,\n        \"timingFramesGap\": 2\n    },\n    \"overrideFileName\": \"\",\n    \"overrideReadingSpeed\": false,\n    \"overrides\": null,\n    \"pacCharacterSet1\": \"Latin\",\n    \"pacCharacterSet2\": \"Latin\",\n    \"preserveSafeArea\": false,\n    \"preventTimingOverlap\": true,\n    \"previewFont\": \"\",\n    \"previewFontSize\": 48,\n    \"previewFontSizeFromVideoFormat\": true,\n    \"previewScriptSubtitles\": null,\n    \"rawScript\": {\n        \"importRawScript\": false,\n        \"lineDoesntEndOn\": \"\",\n        \"lineEndPunctuation\": \":;\",\n        \"maxLineLength\": 42,\n        \"maxLinesPerSubtitle\": 2,\n        \"subtitleEndPunctuation\": \".?!\"\n    },\n    \"readingSpeedCountPunctuations\": false,\n    \"readingSpeedCountSpaces\": true,\n    \"readingSpeedCps\": 17,\n    \"readingSpeedType\": \"cps\",\n    \"readingSpeedWpm\": 200,\n    \"recalculate890ScreenSettings\": \"Default\",\n    \"recutAuto\": false,\n    \"removeAllStyling\": false,\n    \"replaceAsianQuotes\": {\n        \"align\": true,\n        \"lowerQuotes\": false,\n        \"replace\": 0\n    },\n    \"replaceEllipsis\": 0,\n    \"replaceLongEmDash\": false,\n    \"RTF\": {\n        \"includeAlignment\": false,\n        \"includeColorsFormatting\": false,\n        \"includeInOutCues\": false,\n        \"includeItalicsUnderline\": false,\n        \"includeReadingSpeedInformation\": false,\n        \"includeSubtitleNumber\": false,\n        \"isBold\": false\n    },\n    \"safeArea\": {\n        \"bottom\": 10,\n        \"left\": 10,\n        \"right\": 10,\n        \"top\": 10,\n        \"videoHeight\": 720,\n        \"videoWidth\": 1080\n    },\n    \"sami\": {\n        \"closePSyncTags\": false,\n        \"createASXFile\": true,\n        \"createHTMLFile\": true,\n        \"exportSourceId\": false,\n        \"htmlCWHeight\": 80,\n        \"htmlVideoBorder\": 1,\n        \"htmlVideoHeight\": 280,\n        \"htmlVideoWigth\": 320,\n        \"language\": \"English - United Kingdom\",\n        \"mediaFile\": \"test@.wmv\",\n        \"normalBackColor\": \"000000\",\n        \"normalFontColor\": \"FFFFFF\",\n        \"normalFontName\": \"Arial\",\n        \"normalFontNumber\": 0,\n        \"normalFontSize\": 12,\n        \"normalFontStyles\": \"1\",\n        \"sourceId\": 0,\n        \"sourceIdBackColor\": \"FF0000\",\n        \"sourceIdFont\": 1,\n        \"sourceIdFontColor\": \"00FFFF\",\n        \"sourceIdFontName\": \"Arial\",\n        \"sourceIdFontSize\": 12,\n        \"sourceIdFontStyles\": \"1\",\n        \"useHTMLRefs\": true\n    },\n    \"screenLines\": 11,\n    \"scriptSettings\": {\n        \"alignAllLines\": false,\n        \"defaultAlign\": \"Left\",\n        \"defaultBox\": \"None\",\n        \"defaultJustification\": \"None\",\n        \"defaultOutline\": \"Outline\",\n        \"doubleHeight\": false,\n        \"EBU\": {\n            \"standard\": \"OpenSubtitles\"\n        },\n        \"graphicalLineLength\": false,\n        \"graphicalLineLengthFont1\": null,\n        \"graphicalLineLengthFont2\": null,\n        \"graphicalLineLengthFormat\": null,\n        \"inCuesSnapThreshold\": 0,\n        \"lineLength\": 80,\n        \"maxParagraphLines\": 999,\n        \"maxSubDuration\": 7,\n        \"maxTimingGap\": null,\n        \"minSubDuration\": 0.8333,\n        \"preventTimingOverlap\": true,\n        \"screenLines\": 999,\n        \"snapInCues\": false,\n        \"timingFramesGap\": 2\n    },\n    \"selectNextSubAfterSettingTC\": true,\n    \"shotChangeSnapEndFrames\": 2,\n    \"shotChangeSnapStartFrames\": 0,\n    \"shotChangesSnapAreaFrames\": 8,\n    \"showZeroParagraphInTable\": false,\n    \"skipUntimed\": false,\n    \"SMPTE_428\": {\n        \"displayType\": \"\",\n        \"effectSize\": \"0.01\",\n        \"encoding\": \"UTF-8\",\n        \"exportFont\": false,\n        \"fadeDownTime\": 0,\n        \"fadeDownUp\": false,\n        \"fadeUpTime\": 0,\n        \"feather\": \"no\",\n        \"font2URI\": \"\",\n        \"fontEffect\": \"none\",\n        \"fontEffectColor\": \"\",\n        \"fontURI\": \"\",\n        \"language\": \"English\",\n        \"reel\": 1,\n        \"spacing\": \"0\",\n        \"startTime\": 0,\n        \"version\": \"ST428-7-2007\",\n        \"writeStartTime\": false\n    },\n    \"snapInCues\": false,\n    \"specialFont1\": \"\",\n    \"specialFont2\": \"\",\n    \"spellcheckEnableGrammarErrors\": null,\n    \"spellcheckIgnoreWordsInUppercase\": null,\n    \"spellcheckIncludeAISuggestions\": null,\n    \"spellcheckRussianEnforceStrictYo\": null,\n    \"SRT\": {\n        \"exportAlignment\": false,\n        \"exportColors\": false,\n        \"exportInBold\": false,\n        \"exportItalics\": true,\n        \"exportRaised\": false,\n        \"exportUnderline\": false,\n        \"RTLReorder\": false,\n        \"rtlReorderWithMarks\": false,\n        \"smpte\": false\n    },\n    \"STL\": {\n        \"includeItalic\": true,\n        \"isBold\": false,\n        \"isItalic\": false,\n        \"isUnderline\": false,\n        \"userDefinedFont\": false,\n        \"useTabChars\": false\n    },\n    \"sub\": {\n        \"useFullStopDelimiter\": false\n    },\n    \"tableFont\": \"\",\n    \"tagsExportFilter\": null,\n    \"targetTrack\": 0,\n    \"teletextSettings\": {\n        \"alignAllLines\": true,\n        \"defaultAlign\": \"Center\",\n        \"defaultBox\": \"FixedBox\",\n        \"defaultJustification\": \"Center\",\n        \"defaultOutline\": \"Outline\",\n        \"doubleHeight\": true,\n        \"EBU\": {\n            \"standard\": \"TeletextLevel1\"\n        },\n        \"graphicalLineLength\": false,\n        \"graphicalLineLengthFont1\": null,\n        \"graphicalLineLengthFont2\": null,\n        \"graphicalLineLengthFormat\": null,\n        \"inCuesSnapThreshold\": 0,\n        \"lineLength\": 37,\n        \"maxParagraphLines\": 2,\n        \"maxSubDuration\": 7,\n        \"maxTimingGap\": null,\n        \"minSubDuration\": 0.8333,\n        \"preventTimingOverlap\": true,\n        \"screenLines\": 23,\n        \"snapInCues\": false,\n        \"timingFramesGap\": 2\n    },\n    \"templateId\": \"48184225-0d63-4750-be79-8640fa185db9\",\n    \"timecodeFormat\": \"24 fps\",\n    \"timeFormat\": \"SMPTE\",\n    \"timelineOffset\": 0,\n    \"timingFramesGap\": 2,\n    \"track2\": null,\n    \"track3\": null,\n    \"track4\": null,\n    \"tracksExportFilter\": null,\n    \"TTML\": {\n        \"backColor\": \"\",\n        \"burnedInTimeCode\": -1,\n        \"copyright\": \"\",\n        \"customOutline\": false,\n        \"EBUTT\": {\n            \"country\": null,\n            \"documentId\": \"\",\n            \"editorsName\": \"\",\n            \"episodeOriginalTitle\": \"\",\n            \"episodeTranslatedTitle\": \"\",\n            \"exportBox\": \"None\",\n            \"headerCodePage\": \"\",\n            \"programOriginalTitle\": \"\",\n            \"programTranslatedTitle\": \"\",\n            \"publisher\": \"\",\n            \"referenceCode\": \"\",\n            \"revisionNumber\": 0,\n            \"standard\": \"OpenSubtitles\",\n            \"startOfProgramme\": null\n        },\n        \"exportvPosAsTTAF1\": false,\n        \"fontColor\": \"\",\n        \"fontSize\": 100,\n        \"fontSizeUnit\": \"%\",\n        \"ignoreFontProperties\": false,\n        \"ignoreInlineColors\": false,\n        \"imsc\": {\n            \"captionService\": \"F1C1CC\",\n            \"channel\": \"CC1\",\n            \"exportBoxed\": false,\n            \"includeSmpteInformation\": false,\n            \"programName\": \"\"\n        },\n        \"includeStartTCAtTopDiv\": false,\n        \"isBold\": false,\n        \"languageCode\": \"\",\n        \"lineHeight\": 100,\n        \"luminanceGain\": null,\n        \"outlineColor\": \"black\",\n        \"outlineWidth\": 2,\n        \"outlineWidthUnit\": \"px\",\n        \"role\": null,\n        \"rtlReorder\": false,\n        \"rubyReserveOutside\": true,\n        \"simplifiedPositioning\": false,\n        \"useEditable\": false\n    },\n    \"validation\": {},\n    \"verticalLineLength\": 13,\n    \"verticalSubtitlesGroupNumbers\": 2,\n    \"videoFormat\": \"HD 1920x1080\",\n    \"voice\": {\n        \"country\": null,\n        \"language\": null,\n        \"languageCode\": null,\n        \"pitch\": \"0%\",\n        \"provider\": null,\n        \"speed\": \"0%\",\n        \"voiceId\": null,\n        \"voiceName\": null,\n        \"volume\": \"0%\"\n    },\n    \"VTT\": {\n        \"addBoxAlignment\": false,\n        \"includeStyleSection\": false,\n        \"skipBottomAligned\": true,\n        \"skipCenterAligned\": true,\n        \"topAlignmentIndex\": 1,\n        \"writeDirectionCodes\": false,\n        \"writeHorizontalPosition\": true,\n        \"writeRegionSize\": false,\n        \"writeSubtitleNumbers\": false,\n        \"writeVerticalPosition\": true,\n        \"writeVerticalPositionInPercentage\": false\n    },\n    \"zeroParagraphTemplateId\": \"\"\n}"}],"_postman_id":"053d17ea-0b27-4667-94d1-d6715fb84cce"},{"name":"Get configuration by GUID","id":"92633c9e-7a83-45fc-9df8-010f99f609c9","request":{"method":"GET","header":[],"url":"{{base_url}}/external/configuration/d3a536dc-aff6-4803-9589-362cc52e5423","description":"<p><strong>Role:</strong> <code>API</code>.</p>\n<p>Returns the stored JSON of a configuration template by its id.</p>\n<p><strong>Route</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>guid</code></td>\n<td>Id of the template (the id you used with <code>POST</code> / <code>PUT /external/configuration/{guid}</code>, or one returned by <code>GET /external/configurations</code>).</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output:</strong> <code>200 OK</code> with the template's JSON as <code>application/json</code> (a <code>SubtitlesConfiguration</code> object for project/import/export templates, an array of exports for batch export templates). <code>404 Not Found</code> when no template has that id. The lookup is by id across all templates, not only API-created ones.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","configuration","7583b9bf-edee-4614-8353-7a1904f915fe"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"3ffc73dd-d883-47c0-94d4-4463f66d1d22","name":"Get configuration by GUID","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/configuration/a2bef6cb-3f8d-45c2-ad38-fbdf4606b65c"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Length","value":"14609"},{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n    \"isRtl\": false,\n    \"showZeroParagraphInTable\": false,\n    \"Cavena\": {\n        \"translatedTitle\": null,\n        \"originalTitle\": null,\n        \"tapeNumber\": null,\n        \"startOfMessage\": null,\n        \"producer\": null,\n        \"translatedEpisodeTitle\": null,\n        \"comments\": null,\n        \"translator\": null,\n        \"useEmptyLinesInsteadOfVPos\": false\n    },\n    \"sub\": {\n        \"useFullStopDelimiter\": false\n    },\n    \"exportTimecodeOffset\": 0,\n    \"readingSpeedCountSpaces\": true,\n    \"defaultOutline\": \"Outline\",\n    \"autoComplyTimingGap\": false,\n    \"absolutePositioning\": true,\n    \"display\": {\n        \"boxLeftMargin\": 18,\n        \"boxOpacity\": 35,\n        \"outlineColor\": \"#000000\",\n        \"textColorOverride\": \"\",\n        \"shadowColor\": \"#000000\",\n        \"boxBottomMargin\": 0,\n        \"outlineWidth\": 2,\n        \"shadowOffsetX\": 0,\n        \"boxType\": \"None\",\n        \"letterBox\": \"None\",\n        \"shadowOffsetY\": 0,\n        \"antiAliasingType\": \"OuterNormal\",\n        \"antiAliasingColor\": \"#808080\",\n        \"isBold\": false,\n        \"shadow1\": {\n            \"size\": 0,\n            \"color\": \"#000000\",\n            \"offsetX\": 0,\n            \"offsetY\": 0,\n            \"blur\": 0,\n            \"opacity\": 100,\n            \"visible\": true\n        },\n        \"shadow2\": {\n            \"size\": 0,\n            \"color\": \"#000000\",\n            \"offsetX\": 0,\n            \"offsetY\": 0,\n            \"blur\": 0,\n            \"opacity\": 100,\n            \"visible\": false\n        },\n        \"boxColor\": \"#000000\",\n        \"boxTopMargin\": 0,\n        \"outlineType\": \"Outline\",\n        \"boxRightMargin\": 18\n    },\n    \"exportEmptySubtitles\": \"ask\",\n    \"defaultColor\": null,\n    \"font1\": \"Arial\",\n    \"minSubDuration\": 0.8333,\n    \"lineGap\": 1,\n    \"engine\": \"OoonaConvert\",\n    \"SMPTE_428\": {\n        \"fontEffect\": \"none\",\n        \"spacing\": \"0\",\n        \"fontEffectColor\": \"\",\n        \"feather\": \"no\",\n        \"exportFont\": false,\n        \"fadeUpTime\": 0,\n        \"font2URI\": \"\",\n        \"fadeDownTime\": 0,\n        \"startTime\": 0,\n        \"writeStartTime\": false,\n        \"effectSize\": \"0.01\",\n        \"encoding\": \"UTF-8\",\n        \"version\": \"ST428-7-2007\",\n        \"language\": \"English\",\n        \"fadeDownUp\": false,\n        \"reel\": 1,\n        \"displayType\": \"\",\n        \"fontURI\": \"\"\n    },\n    \"alignAllLines\": true,\n    \"ccSettings\": {\n        \"defaultOutline\": \"Outline\",\n        \"minSubDuration\": 0.8333,\n        \"alignAllLines\": true,\n        \"defaultAlign\": \"Center\",\n        \"graphicalLineLengthFormat\": null,\n        \"preventTimingOverlap\": true,\n        \"timingFramesGap\": 2,\n        \"maxTimingGap\": null,\n        \"defaultBox\": \"FixedBox\",\n        \"graphicalLineLength\": false,\n        \"maxSubDuration\": 7,\n        \"defaultJustification\": \"Left\",\n        \"screenLines\": 15,\n        \"graphicalLineLengthFont1\": null,\n        \"maxParagraphLines\": 2,\n        \"graphicalLineLengthFont2\": null,\n        \"doubleHeight\": false,\n        \"EBU\": {\n            \"standard\": \"OpenSubtitles\"\n        },\n        \"lineLength\": 32\n    },\n    \"mode\": \"ClosedCaptions\",\n    \"font2\": \"Arial\",\n    \"autoRecognizeTimeFormat\": true,\n    \"importTimecodeStart\": null,\n    \"autoBreakLine\": true,\n    \"exportFontSize\": 48,\n    \"timeFormat\": \"SMPTE\",\n    \"defaultAlign\": \"Center\",\n    \"RTF\": {\n        \"includeInOutCues\": false,\n        \"includeSubtitleNumber\": false,\n        \"includeReadingSpeedInformation\": false,\n        \"isBold\": false,\n        \"includeItalicsUnderline\": false,\n        \"includeAlignment\": false,\n        \"includeColorsFormatting\": false\n    },\n    \"graphicalLineLengthFormat\": null,\n    \"preventTimingOverlap\": true,\n    \"tagsExportFilter\": null,\n    \"defaultBotenVertical\": \"﹅\",\n    \"replaceEllipsis\": 0,\n    \"preserveSafeArea\": false,\n    \"shotChangesSnapAreaFrames\": 8,\n    \"timingFramesGap\": 2,\n    \"pacCharacterSet1\": \"Latin\",\n    \"replaceAsianQuotes\": {\n        \"align\": true,\n        \"lowerQuotes\": false,\n        \"replace\": 0\n    },\n    \"track2\": null,\n    \"filename\": \"\",\n    \"overrides\": null,\n    \"overrideReadingSpeed\": false,\n    \"pacCharacterSet2\": \"Latin\",\n    \"hideOutCue\": false,\n    \"track3\": null,\n    \"DLP\": {\n        \"importDetectCenterLeftAligned\": true,\n        \"reelNumber\": 1,\n        \"overrideTextColorValue\": \"#FFFFFF\",\n        \"overrideTextEffects\": false,\n        \"overrideTextColor\": false,\n        \"importOverrideSafeArea\": false,\n        \"exportImages\": false,\n        \"overrideEffectsColor\": \"#000000\",\n        \"overrideEffectsType\": \"none\",\n        \"toFrameRate\": \"24 fps\",\n        \"useStandardFont\": true,\n        \"applyVideoFrameRateConversion\": false,\n        \"fadeUp\": 20,\n        \"version\": \"DCSubtitle 1.0\",\n        \"title\": \"\",\n        \"presentationList\": false,\n        \"fadeDownUp\": false,\n        \"compressTrueTypeFont\": false,\n        \"fontURI\": \"\",\n        \"fadeDown\": 20,\n        \"exportFontFile\": false\n    },\n    \"maxTimingGap\": null,\n    \"audioScrubbingEnabled\": true,\n    \"exportComments\": false,\n    \"previewScriptSubtitles\": null,\n    \"track4\": null,\n    \"specialFont1\": \"AR StdKaiti Medium U30\",\n    \"fps\": 29.97,\n    \"countryKey\": \"USA\",\n    \"characterHalfWidth\": false,\n    \"appendStartIndex\": null,\n    \"sami\": {\n        \"mediaFile\": \"test@.wmv\",\n        \"normalFontName\": \"Arial\",\n        \"createHTMLFile\": true,\n        \"sourceIdFont\": 1,\n        \"createASXFile\": true,\n        \"sourceIdBackColor\": \"FF0000\",\n        \"sourceIdFontSize\": 12,\n        \"htmlCWHeight\": 80,\n        \"sourceIdFontStyles\": \"1\",\n        \"exportSourceId\": false,\n        \"closePSyncTags\": false,\n        \"normalFontColor\": \"FFFFFF\",\n        \"sourceIdFontName\": \"Arial\",\n        \"useHTMLRefs\": true,\n        \"normalBackColor\": \"000000\",\n        \"sourceId\": 0,\n        \"htmlVideoHeight\": 280,\n        \"normalFontSize\": 12,\n        \"normalFontStyles\": \"1\",\n        \"language\": \"English - United Kingdom\",\n        \"htmlVideoWigth\": 320,\n        \"htmlVideoBorder\": 1,\n        \"sourceIdFontColor\": \"00FFFF\",\n        \"normalFontNumber\": 0\n    },\n    \"specialFont2\": \"AR StdKaiti Medium U30\",\n    \"autoDetectLanguage\": false,\n    \"defaultBox\": \"None\",\n    \"replaceLongEmDash\": false,\n    \"assForBurning\": false,\n    \"recalculate890ScreenSettings\": \"Default\",\n    \"STL\": {\n        \"includeItalic\": true,\n        \"isBold\": false,\n        \"isItalic\": false,\n        \"isUnderline\": false,\n        \"userDefinedFont\": false,\n        \"useTabChars\": false\n    },\n    \"readingSpeedCps\": 17,\n    \"openSettings\": {\n        \"defaultOutline\": \"Outline\",\n        \"minSubDuration\": 0.8333,\n        \"alignAllLines\": true,\n        \"defaultAlign\": \"Center\",\n        \"graphicalLineLengthFormat\": null,\n        \"preventTimingOverlap\": true,\n        \"timingFramesGap\": 2,\n        \"maxTimingGap\": null,\n        \"defaultBox\": \"None\",\n        \"graphicalLineLength\": false,\n        \"maxSubDuration\": 7,\n        \"defaultJustification\": \"None\",\n        \"screenLines\": 15,\n        \"graphicalLineLengthFont1\": null,\n        \"maxParagraphLines\": 2,\n        \"graphicalLineLengthFont2\": null,\n        \"doubleHeight\": false,\n        \"EBU\": {\n            \"standard\": \"OpenSubtitles\"\n        },\n        \"lineLength\": 32\n    },\n    \"graphicalLineLength\": false,\n    \"shotChangeSnapEndFrames\": 2,\n    \"lockTimecodes\": false,\n    \"scriptSettings\": {\n        \"defaultOutline\": \"Outline\",\n        \"minSubDuration\": 0.8333,\n        \"alignAllLines\": false,\n        \"defaultAlign\": \"Left\",\n        \"graphicalLineLengthFormat\": null,\n        \"preventTimingOverlap\": true,\n        \"timingFramesGap\": 2,\n        \"maxTimingGap\": null,\n        \"defaultBox\": \"None\",\n        \"graphicalLineLength\": false,\n        \"maxSubDuration\": 7,\n        \"defaultJustification\": \"None\",\n        \"screenLines\": 999,\n        \"graphicalLineLengthFont1\": null,\n        \"maxParagraphLines\": 999,\n        \"graphicalLineLengthFont2\": null,\n        \"doubleHeight\": false,\n        \"EBU\": {\n            \"standard\": \"OpenSubtitles\"\n        },\n        \"lineLength\": 80\n    },\n    \"spellcheckRussianEnforceStrictYo\": null,\n    \"batchExport\": false,\n    \"spellcheckEnableGrammarErrors\": null,\n    \"importClearTargetColumn\": false,\n    \"defaultBackground\": null,\n    \"assOmitBottomCenterPositioning\": false,\n    \"adjustMixedAlignmentsWithSpaces\": false,\n    \"verticalLineLength\": 13,\n    \"previewFontSizeFromVideoFormat\": true,\n    \"exportAnnotations\": false,\n    \"maxSubDuration\": 7,\n    \"verticalSubtitlesGroupNumbers\": 2,\n    \"convertLeftToCenterLeft\": false,\n    \"exportUntimedSubtitles\": \"ask\",\n    \"autoSaveInterval\": 2,\n    \"removeAllStyling\": false,\n    \"defaultJustification\": \"None\",\n    \"timecodeFormat\": \"30 fps drop-frame\",\n    \"autoPopulateStartTCFromDatFile\": null,\n    \"autoTCDuration\": 30,\n    \"videoFormat\": \"HD 1920x1080\",\n    \"voice\": {},\n    \"DVD\": {\n        \"edlClipNameInSeparateLine\": false,\n        \"languageCode\": \"ENG\",\n        \"imagePrefix\": \"@\",\n        \"imageLocation\": \"@\",\n        \"scriptFileName\": \"@\",\n        \"imageFormat\": \"PNG_8\",\n        \"backgroundColor\": \"\",\n        \"exportCropImage\": false,\n        \"fcpScriptVersion\": 0,\n        \"ultech1080ScanType\": 1\n    },\n    \"importTimecodeOffset\": null,\n    \"isRtl2\": false,\n    \"defaultBotenHorizontal\": \"●\",\n    \"encoding\": \"utf-8\",\n    \"screenLines\": 15,\n    \"overrideFileName\": \"\",\n    \"aspectRatio\": \"16:9\",\n    \"rawScript\": {\n        \"importRawScript\": false,\n        \"lineDoesntEndOn\": \"\",\n        \"lineEndPunctuation\": \":;\",\n        \"maxLineLength\": 42,\n        \"maxLinesPerSubtitle\": 2,\n        \"subtitleEndPunctuation\": \".?!\"\n    },\n    \"timelineOffset\": 0,\n    \"exportTimeOffset\": null,\n    \"shotChangeSnapStartFrames\": 0,\n    \"tracksExportFilter\": null,\n    \"selectNextSubAfterSettingTC\": true,\n    \"autoOutCue\": false,\n    \"graphicalLineLengthFont1\": null,\n    \"maxParagraphLines\": 2,\n    \"SRT\": {\n        \"exportColors\": false,\n        \"smpte\": false,\n        \"exportRaised\": false,\n        \"exportAlignment\": false,\n        \"exportItalics\": true,\n        \"rtlReorderWithMarks\": false,\n        \"RTLReorder\": false,\n        \"exportUnderline\": false,\n        \"exportInBold\": false\n    },\n    \"readingSpeedType\": \"cps\",\n    \"includeVTTDirectionCodes\": false,\n    \"templateId\": \"6ce1c5ca-cd1f-494f-8773-218ece911318\",\n    \"autoComplyTiming\": true,\n    \"graphicalLineLengthFont2\": null,\n    \"assSeprateLineFormatting\": false,\n    \"dictionary\": \"English en-US\",\n    \"allowSplitParagraphs\": false,\n    \"detectEncoding\": true,\n    \"VTT\": {\n        \"topAlignmentIndex\": 1,\n        \"writeDirectionCodes\": false,\n        \"writeHorizontalPosition\": true,\n        \"skipCenterAligned\": true,\n        \"writeSubtitleNumbers\": false,\n        \"writeRegionSize\": false,\n        \"addBoxAlignment\": false,\n        \"skipBottomAligned\": true,\n        \"writeVerticalPositionInPercentage\": false,\n        \"writeVerticalPosition\": true\n    },\n    \"dontCountCompositionCharacters\": false,\n    \"spellcheckIgnoreWordsInUppercase\": null,\n    \"previewFont\": \"\",\n    \"convertBlackBoxesToTopAligned\": false,\n    \"autoDetectFps\": false,\n    \"hideSecondTimeline\": null,\n    \"format\": \"SCC\",\n    \"doubleHeight\": false,\n    \"previewFontSize\": 48,\n    \"mediaStartTimecode\": 0,\n    \"EBU\": {\n        \"forceStartBoxControlCodeAtTheBeginningOfLine\": false,\n        \"startOfProgramme\": null,\n        \"programOriginalTitle\": \"\",\n        \"forceDoubleHeight\": true,\n        \"forceNormalHeightAtTheBeginningOfLine\": false,\n        \"revisionNumber\": 0,\n        \"languageCode\": \"00\",\n        \"forceOpenSubtitles\": false,\n        \"episodeTranslatedTitle\": \"\",\n        \"headerCodePage\": \"\",\n        \"includeColorCodes\": true,\n        \"episodeOriginalTitle\": \"\",\n        \"dontTreatMidRowItalicsAsSpace\": false,\n        \"forceDoubleHeightAtTheBeginningOfLine\": false,\n        \"editorsName\": \"\",\n        \"exportItalicsAsLessAndMore\": false,\n        \"useOpenModeBoxingControlCodes\": false,\n        \"includeBoxOnOffControlCodes\": true,\n        \"country\": \"\",\n        \"treatLessAndMoreThanAsItalics\": false,\n        \"characterCodeTable\": 0,\n        \"alignWithSpaces\": false,\n        \"referenceCode\": \"\",\n        \"forceTeletextSubtitles\": false,\n        \"allowNonStandardFpsInHeader\": false,\n        \"publisher\": \"\",\n        \"standard\": \"OpenSubtitles\",\n        \"programTranslatedTitle\": \"\"\n    },\n    \"validation\": {},\n    \"closedCaptions\": {\n        \"languageCode\": \"\",\n        \"blanksBetweenPopOn\": 2,\n        \"fixTimecodeOverrun\": false,\n        \"box\": \"None\",\n        \"isTunnel608\": false,\n        \"scriptVersion\": 1,\n        \"exportChannel\": 1,\n        \"isBold\": false,\n        \"style\": \"PopOn\",\n        \"extendedCharset\": true,\n        \"sccRemoveSpaceAfterControlCodes\": false,\n        \"chainSubtitles\": false,\n        \"doubleControlCodes\": false,\n        \"sccQuickTimeCompatible\": 0,\n        \"sccUseSemiColon\": true,\n        \"closedCaptionMode\": 7,\n        \"exportUpperCase\": false\n    },\n    \"importWordWrap\": true,\n    \"readingSpeedWpm\": 200,\n    \"autoPopulateFpsFromDatFile\": null,\n    \"language1\": \"English\",\n    \"teletextSettings\": {\n        \"defaultOutline\": \"Outline\",\n        \"minSubDuration\": 0.8333,\n        \"alignAllLines\": true,\n        \"defaultAlign\": \"Center\",\n        \"graphicalLineLengthFormat\": null,\n        \"preventTimingOverlap\": true,\n        \"timingFramesGap\": 2,\n        \"maxTimingGap\": null,\n        \"defaultBox\": \"FixedBox\",\n        \"graphicalLineLength\": false,\n        \"maxSubDuration\": 7,\n        \"defaultJustification\": \"Center\",\n        \"screenLines\": 23,\n        \"graphicalLineLengthFont1\": null,\n        \"maxParagraphLines\": 2,\n        \"graphicalLineLengthFont2\": null,\n        \"doubleHeight\": true,\n        \"EBU\": {\n            \"standard\": \"TeletextLevel1\"\n        },\n        \"lineLength\": 37\n    },\n    \"safeArea\": {\n        \"bottom\": 10,\n        \"left\": 10,\n        \"right\": 10,\n        \"top\": 10,\n        \"videoHeight\": 1080,\n        \"videoWidth\": 1920\n    },\n    \"japaneseAgeRatingFixHiraganize\": false,\n    \"targetTrack\": -1,\n    \"convertFramerate\": \"auto\",\n    \"language2\": \"English\",\n    \"lineLength\": 32,\n    \"exportOnlySelected\": false,\n    \"assDontIncludeNewLineAtTheEnd\": false,\n    \"zeroParagraphTemplateId\": \"\",\n    \"exportZero\": false,\n    \"ageRating\": null,\n    \"mergeAndSort\": false,\n    \"tableFont\": \"\",\n    \"convertNullCuesToZero\": false,\n    \"columns\": [],\n    \"autoTC\": true,\n    \"autoSnapToShotChange\": false,\n    \"recutAuto\": null,\n    \"flavor\": \"SCC\",\n    \"TTML\": {\n        \"outlineColor\": \"black\",\n        \"simplifiedPositioning\": false,\n        \"rubyReserveOutside\": true,\n        \"outlineWidth\": 2,\n        \"languageCode\": \"\",\n        \"copyright\": \"\",\n        \"useEditable\": false,\n        \"burnedInTimeCode\": -1,\n        \"isBold\": false,\n        \"fontSize\": 100,\n        \"rtlReorder\": false,\n        \"customOutline\": false,\n        \"fontColor\": \"\",\n        \"ignoreFontProperties\": true,\n        \"imsc\": {\n            \"captionService\": \"F1C1CC\",\n            \"channel\": \"CC1\",\n            \"exportBoxed\": false,\n            \"includeSmpteInformation\": false,\n            \"programName\": \"\"\n        },\n        \"fontSizeUnit\": \"%\",\n        \"luminanceGain\": null,\n        \"EBUTT\": {\n            \"startOfProgramme\": null,\n            \"programOriginalTitle\": \"\",\n            \"revisionNumber\": 0,\n            \"episodeTranslatedTitle\": \"\",\n            \"headerCodePage\": \"\",\n            \"episodeOriginalTitle\": \"\",\n            \"editorsName\": \"\",\n            \"country\": \"\",\n            \"documentId\": \"\",\n            \"exportBox\": \"None\",\n            \"referenceCode\": \"\",\n            \"publisher\": \"\",\n            \"standard\": \"OpenSubtitles\",\n            \"programTranslatedTitle\": \"\"\n        },\n        \"ignoreInlineColors\": false,\n        \"lineHeight\": 100,\n        \"backColor\": \"\"\n    },\n    \"extension\": \"scc\",\n    \"customTxt\": {\n        \"subtitleDelimiterValue\": \"<new_line><new_line>\",\n        \"exportReferenceCodesValue\": true,\n        \"rowDelimiterValue\": \"<new_line>\",\n        \"exportRaisedValue\": false,\n        \"fileHeaderValue\": \"\",\n        \"alignLeft\": false,\n        \"subtitleHeaderValue\": \"<num> <in_cue> <out_cue><new_line>\",\n        \"skipBOMValue\": false,\n        \"rtfFontNameValue\": \"Arial\",\n        \"exportZeroValue\": true,\n        \"rtfOptionsValue\": \"120\",\n        \"rtfExportValue\": false,\n        \"rtfFontBoldValue\": false,\n        \"fileFooterValue\": \"\",\n        \"rtfFontSizeValue\": \"12\",\n        \"subtitleFooterValue\": \"\",\n        \"encodingValue\": \"65001\",\n        \"italicStartValue\": \"<I>\",\n        \"italicStopValue\": \"</I>\"\n    },\n    \"skipUntimed\": false,\n    \"spellcheckIncludeAISuggestions\": null\n}"},{"id":"c4260037-2974-4d6e-ab06-a580cb341b28","name":"404 Not Found","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/configuration/does-not-exist"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""}],"_postman_id":"92633c9e-7a83-45fc-9df8-010f99f609c9"},{"name":"Create configuration by GUID","id":"734870c8-4e57-4150-b9ce-1b0d35f5ab84","request":{"method":"PUT","header":[],"body":{"mode":"raw","raw":"{\r\n  \"name\": \"Test template\",\r\n  \"type\": \"ProjectSettings\",\r\n  \"value\": {\r\n    \"absolutePositioning\": true,\r\n    \"adjustMixedAlignmentsWithSpaces\": false,\r\n    \"ageRating\": null,\r\n    \"alignAllLines\": true,\r\n    \"allowSplitParagraphs\": false,\r\n    \"appendStartIndex\": null,\r\n    \"aspectRatio\": \"16:9\",\r\n    \"assDontIncludeNewLineAtTheEnd\": false,\r\n    \"assForBurning\": false,\r\n    \"assOmitBottomCenterPositioning\": false,\r\n    \"assSeprateLineFormatting\": false,\r\n    \"audioScrubbingEnabled\": true,\r\n    \"autoBreakLine\": true,\r\n    \"autoComplyTiming\": true,\r\n    \"autoComplyTimingGap\": false,\r\n    \"autoDetectFps\": false,\r\n    \"autoDetectLanguage\": false,\r\n    \"autoOutCue\": false,\r\n    \"autoPopulateFpsFromDatFile\": null,\r\n    \"autoPopulateStartTCFromDatFile\": null,\r\n    \"autoRecognizeTimeFormat\": true,\r\n    \"autoSaveInterval\": 2,\r\n    \"autoSnapToShotChange\": false,\r\n    \"autoTC\": true,\r\n    \"autoTCDuration\": 30,\r\n    \"batchExport\": false,\r\n    \"Cavena\": {\r\n        \"comments\": null,\r\n        \"originalTitle\": null,\r\n        \"producer\": null,\r\n        \"startOfMessage\": null,\r\n        \"tapeNumber\": null,\r\n        \"translatedEpisodeTitle\": null,\r\n        \"translatedTitle\": null,\r\n        \"translator\": null,\r\n        \"useEmptyLinesInsteadOfVPos\": true\r\n    },\r\n    \"ccSettings\": {\r\n        \"alignAllLines\": true,\r\n        \"defaultAlign\": \"Center\",\r\n        \"defaultBox\": \"FixedBox\",\r\n        \"defaultJustification\": \"Left\",\r\n        \"defaultOutline\": \"Outline\",\r\n        \"doubleHeight\": false,\r\n        \"EBU\": {\r\n            \"standard\": \"OpenSubtitles\"\r\n        },\r\n        \"graphicalLineLength\": false,\r\n        \"graphicalLineLengthFont1\": null,\r\n        \"graphicalLineLengthFont2\": null,\r\n        \"graphicalLineLengthFormat\": null,\r\n        \"inCuesSnapThreshold\": 0,\r\n        \"lineLength\": 32,\r\n        \"maxParagraphLines\": 2,\r\n        \"maxSubDuration\": 7,\r\n        \"maxTimingGap\": null,\r\n        \"minSubDuration\": 0.8333,\r\n        \"preventTimingOverlap\": true,\r\n        \"screenLines\": 15,\r\n        \"snapInCues\": false,\r\n        \"timingFramesGap\": 2\r\n    },\r\n    \"characterHalfWidth\": false,\r\n    \"closedCaptions\": {\r\n        \"blanksBetweenPopOn\": 2,\r\n        \"box\": \"None\",\r\n        \"chainSubtitles\": false,\r\n        \"closedCaptionMode\": 7,\r\n        \"doubleControlCodes\": true,\r\n        \"exportChannel\": 1,\r\n        \"exportUpperCase\": false,\r\n        \"extendedCharset\": true,\r\n        \"fixTimecodeOverrun\": false,\r\n        \"isBold\": false,\r\n        \"isTunnel608\": false,\r\n        \"languageCode\": \"\",\r\n        \"sccQuickTimeCompatible\": 0,\r\n        \"sccRemoveSpaceAfterControlCodes\": false,\r\n        \"sccUseSemiColon\": false,\r\n        \"scriptVersion\": 0,\r\n        \"style\": \"PopOn\"\r\n    },\r\n    \"columns\": [],\r\n    \"convertBlackBoxesToTopAligned\": false,\r\n    \"convertFramerate\": \"none\",\r\n    \"convertLeftToCenterLeft\": false,\r\n    \"convertNullCuesToZero\": false,\r\n    \"countryKey\": \"USA\",\r\n    \"customTxt\": {\r\n        \"alignLeft\": false,\r\n        \"encodingValue\": \"65001\",\r\n        \"exportRaisedValue\": false,\r\n        \"exportReferenceCodesValue\": true,\r\n        \"exportZeroValue\": true,\r\n        \"fileFooterValue\": \"\",\r\n        \"fileHeaderValue\": \"\",\r\n        \"italicStartValue\": \"<I>\",\r\n        \"italicStopValue\": \"</I>\",\r\n        \"rowDelimiterValue\": \"<new_line>\",\r\n        \"rtfExportValue\": false,\r\n        \"rtfFontBoldValue\": false,\r\n        \"rtfFontNameValue\": \"Arial\",\r\n        \"rtfFontSizeValue\": \"12\",\r\n        \"rtfOptionsValue\": \"120\",\r\n        \"skipBOMValue\": false,\r\n        \"subtitleDelimiterValue\": \"<new_line><new_line>\",\r\n        \"subtitleFooterValue\": \"\",\r\n        \"subtitleHeaderValue\": \"<num> <in_cue> <out_cue><new_line>\"\r\n    },\r\n    \"defaultAlign\": \"Center\",\r\n    \"defaultBackground\": null,\r\n    \"defaultBotenHorizontal\": \"●\",\r\n    \"defaultBotenVertical\": \"﹅\",\r\n    \"defaultBox\": \"None\",\r\n    \"defaultColor\": null,\r\n    \"defaultJustification\": \"None\",\r\n    \"defaultOutline\": \"Outline\",\r\n    \"detectEncoding\": true,\r\n    \"dictionary\": \"English en-US\",\r\n    \"display\": {\r\n        \"antiAliasingColor\": \"#808080\",\r\n        \"antiAliasingType\": \"OuterNormal\",\r\n        \"boxBottomMargin\": 0,\r\n        \"boxColor\": \"#000000\",\r\n        \"boxLeftMargin\": 18,\r\n        \"boxOpacity\": 35,\r\n        \"boxRightMargin\": 18,\r\n        \"boxTopMargin\": 0,\r\n        \"boxType\": \"None\",\r\n        \"isBold\": false,\r\n        \"letterBox\": \"None\",\r\n        \"outlineColor\": \"#000000\",\r\n        \"outlineType\": \"Outline\",\r\n        \"outlineWidth\": 2,\r\n        \"shadow1\": {\r\n            \"blur\": 0,\r\n            \"color\": \"#000000\",\r\n            \"offsetX\": 0,\r\n            \"offsetY\": 0,\r\n            \"opacity\": 100,\r\n            \"size\": 0,\r\n            \"visible\": true\r\n        },\r\n        \"shadow2\": {\r\n            \"blur\": 0,\r\n            \"color\": \"#000000\",\r\n            \"offsetX\": 0,\r\n            \"offsetY\": 0,\r\n            \"opacity\": 100,\r\n            \"size\": 0,\r\n            \"visible\": false\r\n        },\r\n        \"shadowColor\": \"#000000\",\r\n        \"shadowOffsetX\": 0,\r\n        \"shadowOffsetY\": 0,\r\n        \"textColorOverride\": \"\"\r\n    },\r\n    \"DLP\": {\r\n        \"applyVideoFrameRateConversion\": false,\r\n        \"compressTrueTypeFont\": false,\r\n        \"exportFontFile\": false,\r\n        \"exportImages\": false,\r\n        \"fadeDown\": 20,\r\n        \"fadeDownUp\": false,\r\n        \"fadeUp\": 20,\r\n        \"fontURI\": \"\",\r\n        \"importDetectCenterLeftAligned\": true,\r\n        \"importOverrideSafeArea\": false,\r\n        \"overrideEffectsColor\": \"#000000\",\r\n        \"overrideEffectsType\": \"none\",\r\n        \"overrideTextColor\": false,\r\n        \"overrideTextColorValue\": \"#FFFFFF\",\r\n        \"overrideTextEffects\": false,\r\n        \"presentationList\": false,\r\n        \"reelNumber\": 1,\r\n        \"title\": \"\",\r\n        \"toFrameRate\": \"24 fps\",\r\n        \"useStandardFont\": true,\r\n        \"version\": \"DCSubtitle 1.0\"\r\n    },\r\n    \"dontCountCompositionCharacters\": false,\r\n    \"doubleHeight\": false,\r\n    \"DVD\": {\r\n        \"backgroundColor\": \"\",\r\n        \"edlClipNameInSeparateLine\": false,\r\n        \"exportCropImage\": false,\r\n        \"fcpScriptVersion\": 0,\r\n        \"imageFormat\": \"PNG_8\",\r\n        \"imageLocation\": \"@\",\r\n        \"imagePrefix\": \"@\",\r\n        \"languageCode\": \"ENG\",\r\n        \"scriptFileName\": \"@\",\r\n        \"ultech1080ScanType\": 1\r\n    },\r\n    \"EBU\": {\r\n        \"alignWithSpaces\": true,\r\n        \"allowNonStandardFpsInHeader\": false,\r\n        \"characterCodeTable\": 0,\r\n        \"country\": \"\",\r\n        \"dontTreatMidRowItalicsAsSpace\": false,\r\n        \"editorsName\": \"\",\r\n        \"episodeOriginalTitle\": \"\",\r\n        \"episodeTranslatedTitle\": \"\",\r\n        \"exportItalicsAsLessAndMore\": false,\r\n        \"forceDoubleHeight\": true,\r\n        \"forceDoubleHeightAtTheBeginningOfLine\": false,\r\n        \"forceNormalHeightAtTheBeginningOfLine\": false,\r\n        \"forceOpenSubtitles\": false,\r\n        \"forceStartBoxControlCodeAtTheBeginningOfLine\": false,\r\n        \"forceTeletextSubtitles\": false,\r\n        \"headerCodePage\": \"\",\r\n        \"includeBoxOnOffControlCodes\": true,\r\n        \"includeColorCodes\": true,\r\n        \"languageCode\": \"00\",\r\n        \"programOriginalTitle\": \"\",\r\n        \"programTranslatedTitle\": \"\",\r\n        \"publisher\": \"\",\r\n        \"referenceCode\": \"\",\r\n        \"revisionNumber\": 0,\r\n        \"standard\": \"OpenSubtitles\",\r\n        \"startOfProgramme\": null,\r\n        \"treatLessAndMoreThanAsItalics\": true,\r\n        \"useOpenModeBoxingControlCodes\": false\r\n    },\r\n    \"encoding\": \"utf-8\",\r\n    \"engine\": \"OoonaConvert\",\r\n    \"exportAnnotations\": false,\r\n    \"exportComments\": false,\r\n    \"exportEmptySubtitles\": \"ask\",\r\n    \"exportFontSize\": 48,\r\n    \"exportOnlySelected\": false,\r\n    \"exportTimecodeOffset\": 0,\r\n    \"exportTimeOffset\": null,\r\n    \"exportUntimedSubtitles\": \"ask\",\r\n    \"exportZero\": false,\r\n    \"extension\": \"\",\r\n    \"filename\": \"\",\r\n    \"flavor\": \"Ooona\",\r\n    \"font1\": \"Arial\",\r\n    \"font2\": \"Arial\",\r\n    \"format\": \"Ooona\",\r\n    \"fps\": 23.976,\r\n    \"graphicalLineLength\": false,\r\n    \"graphicalLineLengthFont1\": null,\r\n    \"graphicalLineLengthFont2\": null,\r\n    \"graphicalLineLengthFormat\": null,\r\n    \"hideOutCue\": false,\r\n    \"hideSecondTimeline\": null,\r\n    \"ignoreLanguageConfiguration\": false,\r\n    \"importClearTargetColumn\": false,\r\n    \"importTimecodeOffset\": null,\r\n    \"importTimecodeStart\": null,\r\n    \"importWordWrap\": true,\r\n    \"includeVTTDirectionCodes\": false,\r\n    \"inCuesSnapThreshold\": 0,\r\n    \"isRtl\": false,\r\n    \"isRtl2\": false,\r\n    \"japaneseAgeRatingFixHiraganize\": false,\r\n    \"language1\": \"English\",\r\n    \"language2\": \"English\",\r\n    \"lineGap\": 1,\r\n    \"lineLength\": 37,\r\n    \"lockTimecodes\": false,\r\n    \"maxParagraphLines\": 2,\r\n    \"maxSubDuration\": 7,\r\n    \"maxTimingGap\": null,\r\n    \"mediaStartTimecode\": 0,\r\n    \"mergeAndSort\": false,\r\n    \"minSubDuration\": 0.8333,\r\n    \"mode\": \"Open\",\r\n    \"openSettings\": {\r\n        \"alignAllLines\": true,\r\n        \"defaultAlign\": \"Center\",\r\n        \"defaultBox\": \"None\",\r\n        \"defaultJustification\": \"None\",\r\n        \"defaultOutline\": \"Outline\",\r\n        \"doubleHeight\": false,\r\n        \"EBU\": {\r\n            \"standard\": \"OpenSubtitles\"\r\n        },\r\n        \"graphicalLineLength\": false,\r\n        \"graphicalLineLengthFont1\": null,\r\n        \"graphicalLineLengthFont2\": null,\r\n        \"graphicalLineLengthFormat\": null,\r\n        \"inCuesSnapThreshold\": 0,\r\n        \"lineLength\": 42,\r\n        \"maxParagraphLines\": 2,\r\n        \"maxSubDuration\": 7,\r\n        \"maxTimingGap\": null,\r\n        \"minSubDuration\": 0.8333,\r\n        \"preventTimingOverlap\": true,\r\n        \"screenLines\": 11,\r\n        \"snapInCues\": false,\r\n        \"timingFramesGap\": 2\r\n    },\r\n    \"overrideFileName\": \"\",\r\n    \"overrideReadingSpeed\": false,\r\n    \"overrides\": null,\r\n    \"pacCharacterSet1\": \"Latin\",\r\n    \"pacCharacterSet2\": \"Latin\",\r\n    \"preserveSafeArea\": false,\r\n    \"preventTimingOverlap\": true,\r\n    \"previewFont\": \"\",\r\n    \"previewFontSize\": 48,\r\n    \"previewFontSizeFromVideoFormat\": true,\r\n    \"previewScriptSubtitles\": null,\r\n    \"rawScript\": {\r\n        \"importRawScript\": false,\r\n        \"lineDoesntEndOn\": \"\",\r\n        \"lineEndPunctuation\": \":;\",\r\n        \"maxLineLength\": 42,\r\n        \"maxLinesPerSubtitle\": 2,\r\n        \"subtitleEndPunctuation\": \".?!\"\r\n    },\r\n    \"readingSpeedCountPunctuations\": false,\r\n    \"readingSpeedCountSpaces\": true,\r\n    \"readingSpeedCps\": 17,\r\n    \"readingSpeedType\": \"cps\",\r\n    \"readingSpeedWpm\": 200,\r\n    \"recalculate890ScreenSettings\": \"Default\",\r\n    \"recutAuto\": false,\r\n    \"removeAllStyling\": false,\r\n    \"replaceAsianQuotes\": {\r\n        \"align\": true,\r\n        \"lowerQuotes\": false,\r\n        \"replace\": 0\r\n    },\r\n    \"replaceEllipsis\": 0,\r\n    \"replaceLongEmDash\": false,\r\n    \"RTF\": {\r\n        \"includeAlignment\": false,\r\n        \"includeColorsFormatting\": false,\r\n        \"includeInOutCues\": false,\r\n        \"includeItalicsUnderline\": false,\r\n        \"includeReadingSpeedInformation\": false,\r\n        \"includeSubtitleNumber\": false,\r\n        \"isBold\": false\r\n    },\r\n    \"safeArea\": {\r\n        \"bottom\": 10,\r\n        \"left\": 10,\r\n        \"right\": 10,\r\n        \"top\": 10,\r\n        \"videoHeight\": 720,\r\n        \"videoWidth\": 1080\r\n    },\r\n    \"sami\": {\r\n        \"closePSyncTags\": false,\r\n        \"createASXFile\": true,\r\n        \"createHTMLFile\": true,\r\n        \"exportSourceId\": false,\r\n        \"htmlCWHeight\": 80,\r\n        \"htmlVideoBorder\": 1,\r\n        \"htmlVideoHeight\": 280,\r\n        \"htmlVideoWigth\": 320,\r\n        \"language\": \"English - United Kingdom\",\r\n        \"mediaFile\": \"test@.wmv\",\r\n        \"normalBackColor\": \"000000\",\r\n        \"normalFontColor\": \"FFFFFF\",\r\n        \"normalFontName\": \"Arial\",\r\n        \"normalFontNumber\": 0,\r\n        \"normalFontSize\": 12,\r\n        \"normalFontStyles\": \"1\",\r\n        \"sourceId\": 0,\r\n        \"sourceIdBackColor\": \"FF0000\",\r\n        \"sourceIdFont\": 1,\r\n        \"sourceIdFontColor\": \"00FFFF\",\r\n        \"sourceIdFontName\": \"Arial\",\r\n        \"sourceIdFontSize\": 12,\r\n        \"sourceIdFontStyles\": \"1\",\r\n        \"useHTMLRefs\": true\r\n    },\r\n    \"screenLines\": 11,\r\n    \"scriptSettings\": {\r\n        \"alignAllLines\": false,\r\n        \"defaultAlign\": \"Left\",\r\n        \"defaultBox\": \"None\",\r\n        \"defaultJustification\": \"None\",\r\n        \"defaultOutline\": \"Outline\",\r\n        \"doubleHeight\": false,\r\n        \"EBU\": {\r\n            \"standard\": \"OpenSubtitles\"\r\n        },\r\n        \"graphicalLineLength\": false,\r\n        \"graphicalLineLengthFont1\": null,\r\n        \"graphicalLineLengthFont2\": null,\r\n        \"graphicalLineLengthFormat\": null,\r\n        \"inCuesSnapThreshold\": 0,\r\n        \"lineLength\": 80,\r\n        \"maxParagraphLines\": 999,\r\n        \"maxSubDuration\": 7,\r\n        \"maxTimingGap\": null,\r\n        \"minSubDuration\": 0.8333,\r\n        \"preventTimingOverlap\": true,\r\n        \"screenLines\": 999,\r\n        \"snapInCues\": false,\r\n        \"timingFramesGap\": 2\r\n    },\r\n    \"selectNextSubAfterSettingTC\": true,\r\n    \"shotChangeSnapEndFrames\": 2,\r\n    \"shotChangeSnapStartFrames\": 0,\r\n    \"shotChangesSnapAreaFrames\": 8,\r\n    \"showZeroParagraphInTable\": false,\r\n    \"skipUntimed\": false,\r\n    \"SMPTE_428\": {\r\n        \"displayType\": \"\",\r\n        \"effectSize\": \"0.01\",\r\n        \"encoding\": \"UTF-8\",\r\n        \"exportFont\": false,\r\n        \"fadeDownTime\": 0,\r\n        \"fadeDownUp\": false,\r\n        \"fadeUpTime\": 0,\r\n        \"feather\": \"no\",\r\n        \"font2URI\": \"\",\r\n        \"fontEffect\": \"none\",\r\n        \"fontEffectColor\": \"\",\r\n        \"fontURI\": \"\",\r\n        \"language\": \"English\",\r\n        \"reel\": 1,\r\n        \"spacing\": \"0\",\r\n        \"startTime\": 0,\r\n        \"version\": \"ST428-7-2007\",\r\n        \"writeStartTime\": false\r\n    },\r\n    \"snapInCues\": false,\r\n    \"specialFont1\": \"\",\r\n    \"specialFont2\": \"\",\r\n    \"spellcheckEnableGrammarErrors\": null,\r\n    \"spellcheckIgnoreWordsInUppercase\": null,\r\n    \"spellcheckIncludeAISuggestions\": null,\r\n    \"spellcheckRussianEnforceStrictYo\": null,\r\n    \"SRT\": {\r\n        \"exportAlignment\": false,\r\n        \"exportColors\": false,\r\n        \"exportInBold\": false,\r\n        \"exportItalics\": true,\r\n        \"exportRaised\": false,\r\n        \"exportUnderline\": false,\r\n        \"RTLReorder\": false,\r\n        \"rtlReorderWithMarks\": false,\r\n        \"smpte\": false\r\n    },\r\n    \"STL\": {\r\n        \"includeItalic\": true,\r\n        \"isBold\": false,\r\n        \"isItalic\": false,\r\n        \"isUnderline\": false,\r\n        \"userDefinedFont\": false,\r\n        \"useTabChars\": false\r\n    },\r\n    \"sub\": {\r\n        \"useFullStopDelimiter\": false\r\n    },\r\n    \"tableFont\": \"\",\r\n    \"tagsExportFilter\": null,\r\n    \"targetTrack\": 0,\r\n    \"teletextSettings\": {\r\n        \"alignAllLines\": true,\r\n        \"defaultAlign\": \"Center\",\r\n        \"defaultBox\": \"FixedBox\",\r\n        \"defaultJustification\": \"Center\",\r\n        \"defaultOutline\": \"Outline\",\r\n        \"doubleHeight\": true,\r\n        \"EBU\": {\r\n            \"standard\": \"TeletextLevel1\"\r\n        },\r\n        \"graphicalLineLength\": false,\r\n        \"graphicalLineLengthFont1\": null,\r\n        \"graphicalLineLengthFont2\": null,\r\n        \"graphicalLineLengthFormat\": null,\r\n        \"inCuesSnapThreshold\": 0,\r\n        \"lineLength\": 37,\r\n        \"maxParagraphLines\": 2,\r\n        \"maxSubDuration\": 7,\r\n        \"maxTimingGap\": null,\r\n        \"minSubDuration\": 0.8333,\r\n        \"preventTimingOverlap\": true,\r\n        \"screenLines\": 23,\r\n        \"snapInCues\": false,\r\n        \"timingFramesGap\": 2\r\n    },\r\n    \"templateId\": \"48184225-0d63-4750-be79-8640fa185db9\",\r\n    \"timecodeFormat\": \"24 fps\",\r\n    \"timeFormat\": \"SMPTE\",\r\n    \"timelineOffset\": 0,\r\n    \"timingFramesGap\": 2,\r\n    \"track2\": null,\r\n    \"track3\": null,\r\n    \"track4\": null,\r\n    \"tracksExportFilter\": null,\r\n    \"TTML\": {\r\n        \"backColor\": \"\",\r\n        \"burnedInTimeCode\": -1,\r\n        \"copyright\": \"\",\r\n        \"customOutline\": false,\r\n        \"EBUTT\": {\r\n            \"country\": null,\r\n            \"documentId\": \"\",\r\n            \"editorsName\": \"\",\r\n            \"episodeOriginalTitle\": \"\",\r\n            \"episodeTranslatedTitle\": \"\",\r\n            \"exportBox\": \"None\",\r\n            \"headerCodePage\": \"\",\r\n            \"programOriginalTitle\": \"\",\r\n            \"programTranslatedTitle\": \"\",\r\n            \"publisher\": \"\",\r\n            \"referenceCode\": \"\",\r\n            \"revisionNumber\": 0,\r\n            \"standard\": \"OpenSubtitles\",\r\n            \"startOfProgramme\": null\r\n        },\r\n        \"exportvPosAsTTAF1\": false,\r\n        \"fontColor\": \"\",\r\n        \"fontSize\": 100,\r\n        \"fontSizeUnit\": \"%\",\r\n        \"ignoreFontProperties\": false,\r\n        \"ignoreInlineColors\": false,\r\n        \"imsc\": {\r\n            \"captionService\": \"F1C1CC\",\r\n            \"channel\": \"CC1\",\r\n            \"exportBoxed\": false,\r\n            \"includeSmpteInformation\": false,\r\n            \"programName\": \"\"\r\n        },\r\n        \"includeStartTCAtTopDiv\": false,\r\n        \"isBold\": false,\r\n        \"languageCode\": \"\",\r\n        \"lineHeight\": 100,\r\n        \"luminanceGain\": null,\r\n        \"outlineColor\": \"black\",\r\n        \"outlineWidth\": 2,\r\n        \"outlineWidthUnit\": \"px\",\r\n        \"role\": null,\r\n        \"rtlReorder\": false,\r\n        \"rubyReserveOutside\": true,\r\n        \"simplifiedPositioning\": false,\r\n        \"useEditable\": false\r\n    },\r\n    \"validation\": {},\r\n    \"verticalLineLength\": 13,\r\n    \"verticalSubtitlesGroupNumbers\": 2,\r\n    \"videoFormat\": \"HD 1920x1080\",\r\n    \"voice\": {\r\n        \"country\": null,\r\n        \"language\": null,\r\n        \"languageCode\": null,\r\n        \"pitch\": \"0%\",\r\n        \"provider\": null,\r\n        \"speed\": \"0%\",\r\n        \"voiceId\": null,\r\n        \"voiceName\": null,\r\n        \"volume\": \"0%\"\r\n    },\r\n    \"VTT\": {\r\n        \"addBoxAlignment\": false,\r\n        \"includeStyleSection\": false,\r\n        \"skipBottomAligned\": true,\r\n        \"skipCenterAligned\": true,\r\n        \"topAlignmentIndex\": 1,\r\n        \"writeDirectionCodes\": false,\r\n        \"writeHorizontalPosition\": true,\r\n        \"writeRegionSize\": false,\r\n        \"writeSubtitleNumbers\": false,\r\n        \"writeVerticalPosition\": true,\r\n        \"writeVerticalPositionInPercentage\": false\r\n    },\r\n    \"zeroParagraphTemplateId\": \"\"\r\n  }\r\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/configuration/ccc2ea02-511e-41a8-9f80-8b09acf9926e","description":"<p><strong>Role:</strong> <code>API</code>.</p>\n<p>Creates or updates a configuration template <strong>directly</strong>, with no user interaction. This is the headless alternative to <code>POST /external/configuration/{guid}</code>: POST returns a URL for a person to fill in a form and the template is only stored once they save; PUT stores the template immediately from the JSON you send.</p>\n<p><strong>Route</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>guid</code></td>\n<td>Id of the template. If a template with this id exists it is updated, otherwise it is created with this id.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Body (JSON)</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>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Template name.</td>\n</tr>\n<tr>\n<td><code>type</code></td>\n<td>string</td>\n<td>yes</td>\n<td><code>ProjectSettings</code>, <code>ImportSettings</code>, <code>ExportSettings</code> or <code>BatchExport</code>. <code>LanguageSettings</code> and <code>VideoSettings</code> are accepted but stored as a <code>ProjectSettings</code> template, and so is any unrecognised value.</td>\n</tr>\n<tr>\n<td><code>value</code></td>\n<td>object</td>\n<td>yes</td>\n<td>The configuration, a full <code>SubtitlesConfiguration</code> object (see <code>GET /external/configuration/default</code> for every property and its default). Properties you omit are stored with their defaults.</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>id</code>, <code>creationTime</code> and <code>lastModified</code> are not read from the body.</p>\n<p><strong>Output</strong></p>\n<ul>\n<li><code>201 Created</code> when the template did not exist; the <code>Location</code> is <code>/external/configuration/{guid}</code>.</li>\n<li><code>200 OK</code> with the text <code>Updated successfully</code> when it existed (name, type and content are replaced).</li>\n<li>Templates created this way are flagged as API templates and appear in <code>GET /external/configurations</code>.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","configuration","9475047e-e72d-4a85-abfa-29b3ee3b24db"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"8db97c10-ec0c-457b-8334-b5eef4575546","name":"Create configuration by GUID","originalRequest":{"method":"PUT","header":[],"body":{"mode":"raw","raw":"{\r\n    \"absolutePositioning\": true,\r\n    \"adjustMixedAlignmentsWithSpaces\": false,\r\n    \"ageRating\": null,\r\n    \"alignAllLines\": true,\r\n    \"allowSplitParagraphs\": false,\r\n    \"appendStartIndex\": null,\r\n    \"aspectRatio\": \"16:9\",\r\n    \"assDontIncludeNewLineAtTheEnd\": false,\r\n    \"assForBurning\": false,\r\n    \"assOmitBottomCenterPositioning\": false,\r\n    \"assSeprateLineFormatting\": false,\r\n    \"audioScrubbingEnabled\": true,\r\n    \"autoBreakLine\": true,\r\n    \"autoComplyTiming\": true,\r\n    \"autoComplyTimingGap\": false,\r\n    \"autoDetectFps\": false,\r\n    \"autoDetectLanguage\": false,\r\n    \"autoOutCue\": false,\r\n    \"autoPopulateFpsFromDatFile\": null,\r\n    \"autoPopulateStartTCFromDatFile\": null,\r\n    \"autoRecognizeTimeFormat\": true,\r\n    \"autoSaveInterval\": 2,\r\n    \"autoSnapToShotChange\": false,\r\n    \"autoTC\": true,\r\n    \"autoTCDuration\": 30,\r\n    \"batchExport\": false,\r\n    \"Cavena\": {\r\n        \"comments\": null,\r\n        \"originalTitle\": null,\r\n        \"producer\": null,\r\n        \"startOfMessage\": null,\r\n        \"tapeNumber\": null,\r\n        \"translatedEpisodeTitle\": null,\r\n        \"translatedTitle\": null,\r\n        \"translator\": null,\r\n        \"useEmptyLinesInsteadOfVPos\": true\r\n    },\r\n    \"ccSettings\": {\r\n        \"alignAllLines\": true,\r\n        \"defaultAlign\": \"Center\",\r\n        \"defaultBox\": \"FixedBox\",\r\n        \"defaultJustification\": \"Left\",\r\n        \"defaultOutline\": \"Outline\",\r\n        \"doubleHeight\": false,\r\n        \"EBU\": {\r\n            \"standard\": \"OpenSubtitles\"\r\n        },\r\n        \"graphicalLineLength\": false,\r\n        \"graphicalLineLengthFont1\": null,\r\n        \"graphicalLineLengthFont2\": null,\r\n        \"graphicalLineLengthFormat\": null,\r\n        \"inCuesSnapThreshold\": 0,\r\n        \"lineLength\": 32,\r\n        \"maxParagraphLines\": 2,\r\n        \"maxSubDuration\": 7,\r\n        \"maxTimingGap\": null,\r\n        \"minSubDuration\": 0.8333,\r\n        \"preventTimingOverlap\": true,\r\n        \"screenLines\": 15,\r\n        \"snapInCues\": false,\r\n        \"timingFramesGap\": 2\r\n    },\r\n    \"characterHalfWidth\": false,\r\n    \"closedCaptions\": {\r\n        \"blanksBetweenPopOn\": 2,\r\n        \"box\": \"None\",\r\n        \"chainSubtitles\": false,\r\n        \"closedCaptionMode\": 7,\r\n        \"doubleControlCodes\": true,\r\n        \"exportChannel\": 1,\r\n        \"exportUpperCase\": false,\r\n        \"extendedCharset\": true,\r\n        \"fixTimecodeOverrun\": false,\r\n        \"isBold\": false,\r\n        \"isTunnel608\": false,\r\n        \"languageCode\": \"\",\r\n        \"sccQuickTimeCompatible\": 0,\r\n        \"sccRemoveSpaceAfterControlCodes\": false,\r\n        \"sccUseSemiColon\": false,\r\n        \"scriptVersion\": 0,\r\n        \"style\": \"PopOn\"\r\n    },\r\n    \"columns\": [],\r\n    \"convertBlackBoxesToTopAligned\": false,\r\n    \"convertFramerate\": \"none\",\r\n    \"convertLeftToCenterLeft\": false,\r\n    \"convertNullCuesToZero\": false,\r\n    \"countryKey\": \"USA\",\r\n    \"customTxt\": {\r\n        \"alignLeft\": false,\r\n        \"encodingValue\": \"65001\",\r\n        \"exportRaisedValue\": false,\r\n        \"exportReferenceCodesValue\": true,\r\n        \"exportZeroValue\": true,\r\n        \"fileFooterValue\": \"\",\r\n        \"fileHeaderValue\": \"\",\r\n        \"italicStartValue\": \"<I>\",\r\n        \"italicStopValue\": \"</I>\",\r\n        \"rowDelimiterValue\": \"<new_line>\",\r\n        \"rtfExportValue\": false,\r\n        \"rtfFontBoldValue\": false,\r\n        \"rtfFontNameValue\": \"Arial\",\r\n        \"rtfFontSizeValue\": \"12\",\r\n        \"rtfOptionsValue\": \"120\",\r\n        \"skipBOMValue\": false,\r\n        \"subtitleDelimiterValue\": \"<new_line><new_line>\",\r\n        \"subtitleFooterValue\": \"\",\r\n        \"subtitleHeaderValue\": \"<num> <in_cue> <out_cue><new_line>\"\r\n    },\r\n    \"defaultAlign\": \"Center\",\r\n    \"defaultBackground\": null,\r\n    \"defaultBotenHorizontal\": \"●\",\r\n    \"defaultBotenVertical\": \"﹅\",\r\n    \"defaultBox\": \"None\",\r\n    \"defaultColor\": null,\r\n    \"defaultJustification\": \"None\",\r\n    \"defaultOutline\": \"Outline\",\r\n    \"detectEncoding\": true,\r\n    \"dictionary\": \"English en-US\",\r\n    \"display\": {\r\n        \"antiAliasingColor\": \"#808080\",\r\n        \"antiAliasingType\": \"OuterNormal\",\r\n        \"boxBottomMargin\": 0,\r\n        \"boxColor\": \"#000000\",\r\n        \"boxLeftMargin\": 18,\r\n        \"boxOpacity\": 35,\r\n        \"boxRightMargin\": 18,\r\n        \"boxTopMargin\": 0,\r\n        \"boxType\": \"None\",\r\n        \"isBold\": false,\r\n        \"letterBox\": \"None\",\r\n        \"outlineColor\": \"#000000\",\r\n        \"outlineType\": \"Outline\",\r\n        \"outlineWidth\": 2,\r\n        \"shadow1\": {\r\n            \"blur\": 0,\r\n            \"color\": \"#000000\",\r\n            \"offsetX\": 0,\r\n            \"offsetY\": 0,\r\n            \"opacity\": 100,\r\n            \"size\": 0,\r\n            \"visible\": true\r\n        },\r\n        \"shadow2\": {\r\n            \"blur\": 0,\r\n            \"color\": \"#000000\",\r\n            \"offsetX\": 0,\r\n            \"offsetY\": 0,\r\n            \"opacity\": 100,\r\n            \"size\": 0,\r\n            \"visible\": false\r\n        },\r\n        \"shadowColor\": \"#000000\",\r\n        \"shadowOffsetX\": 0,\r\n        \"shadowOffsetY\": 0,\r\n        \"textColorOverride\": \"\"\r\n    },\r\n    \"DLP\": {\r\n        \"applyVideoFrameRateConversion\": false,\r\n        \"compressTrueTypeFont\": false,\r\n        \"exportFontFile\": false,\r\n        \"exportImages\": false,\r\n        \"fadeDown\": 20,\r\n        \"fadeDownUp\": false,\r\n        \"fadeUp\": 20,\r\n        \"fontURI\": \"\",\r\n        \"importDetectCenterLeftAligned\": true,\r\n        \"importOverrideSafeArea\": false,\r\n        \"overrideEffectsColor\": \"#000000\",\r\n        \"overrideEffectsType\": \"none\",\r\n        \"overrideTextColor\": false,\r\n        \"overrideTextColorValue\": \"#FFFFFF\",\r\n        \"overrideTextEffects\": false,\r\n        \"presentationList\": false,\r\n        \"reelNumber\": 1,\r\n        \"title\": \"\",\r\n        \"toFrameRate\": \"24 fps\",\r\n        \"useStandardFont\": true,\r\n        \"version\": \"DCSubtitle 1.0\"\r\n    },\r\n    \"dontCountCompositionCharacters\": false,\r\n    \"doubleHeight\": false,\r\n    \"DVD\": {\r\n        \"backgroundColor\": \"\",\r\n        \"edlClipNameInSeparateLine\": false,\r\n        \"exportCropImage\": false,\r\n        \"fcpScriptVersion\": 0,\r\n        \"imageFormat\": \"PNG_8\",\r\n        \"imageLocation\": \"@\",\r\n        \"imagePrefix\": \"@\",\r\n        \"languageCode\": \"ENG\",\r\n        \"scriptFileName\": \"@\",\r\n        \"ultech1080ScanType\": 1\r\n    },\r\n    \"EBU\": {\r\n        \"alignWithSpaces\": true,\r\n        \"allowNonStandardFpsInHeader\": false,\r\n        \"characterCodeTable\": 0,\r\n        \"country\": \"\",\r\n        \"dontTreatMidRowItalicsAsSpace\": false,\r\n        \"editorsName\": \"\",\r\n        \"episodeOriginalTitle\": \"\",\r\n        \"episodeTranslatedTitle\": \"\",\r\n        \"exportItalicsAsLessAndMore\": false,\r\n        \"forceDoubleHeight\": true,\r\n        \"forceDoubleHeightAtTheBeginningOfLine\": false,\r\n        \"forceNormalHeightAtTheBeginningOfLine\": false,\r\n        \"forceOpenSubtitles\": false,\r\n        \"forceStartBoxControlCodeAtTheBeginningOfLine\": false,\r\n        \"forceTeletextSubtitles\": false,\r\n        \"headerCodePage\": \"\",\r\n        \"includeBoxOnOffControlCodes\": true,\r\n        \"includeColorCodes\": true,\r\n        \"languageCode\": \"00\",\r\n        \"programOriginalTitle\": \"\",\r\n        \"programTranslatedTitle\": \"\",\r\n        \"publisher\": \"\",\r\n        \"referenceCode\": \"\",\r\n        \"revisionNumber\": 0,\r\n        \"standard\": \"OpenSubtitles\",\r\n        \"startOfProgramme\": null,\r\n        \"treatLessAndMoreThanAsItalics\": true,\r\n        \"useOpenModeBoxingControlCodes\": false\r\n    },\r\n    \"encoding\": \"utf-8\",\r\n    \"engine\": \"OoonaConvert\",\r\n    \"exportAnnotations\": false,\r\n    \"exportComments\": false,\r\n    \"exportEmptySubtitles\": \"ask\",\r\n    \"exportFontSize\": 48,\r\n    \"exportOnlySelected\": false,\r\n    \"exportTimecodeOffset\": 0,\r\n    \"exportTimeOffset\": null,\r\n    \"exportUntimedSubtitles\": \"ask\",\r\n    \"exportZero\": false,\r\n    \"extension\": \"\",\r\n    \"filename\": \"\",\r\n    \"flavor\": \"Ooona\",\r\n    \"font1\": \"Arial\",\r\n    \"font2\": \"Arial\",\r\n    \"format\": \"Ooona\",\r\n    \"fps\": 23.976,\r\n    \"graphicalLineLength\": false,\r\n    \"graphicalLineLengthFont1\": null,\r\n    \"graphicalLineLengthFont2\": null,\r\n    \"graphicalLineLengthFormat\": null,\r\n    \"hideOutCue\": false,\r\n    \"hideSecondTimeline\": null,\r\n    \"ignoreLanguageConfiguration\": false,\r\n    \"importClearTargetColumn\": false,\r\n    \"importTimecodeOffset\": null,\r\n    \"importTimecodeStart\": null,\r\n    \"importWordWrap\": true,\r\n    \"includeVTTDirectionCodes\": false,\r\n    \"inCuesSnapThreshold\": 0,\r\n    \"isRtl\": false,\r\n    \"isRtl2\": false,\r\n    \"japaneseAgeRatingFixHiraganize\": false,\r\n    \"language1\": \"English\",\r\n    \"language2\": \"English\",\r\n    \"lineGap\": 1,\r\n    \"lineLength\": 37,\r\n    \"lockTimecodes\": false,\r\n    \"maxParagraphLines\": 2,\r\n    \"maxSubDuration\": 7,\r\n    \"maxTimingGap\": null,\r\n    \"mediaStartTimecode\": 0,\r\n    \"mergeAndSort\": false,\r\n    \"minSubDuration\": 0.8333,\r\n    \"mode\": \"Open\",\r\n    \"openSettings\": {\r\n        \"alignAllLines\": true,\r\n        \"defaultAlign\": \"Center\",\r\n        \"defaultBox\": \"None\",\r\n        \"defaultJustification\": \"None\",\r\n        \"defaultOutline\": \"Outline\",\r\n        \"doubleHeight\": false,\r\n        \"EBU\": {\r\n            \"standard\": \"OpenSubtitles\"\r\n        },\r\n        \"graphicalLineLength\": false,\r\n        \"graphicalLineLengthFont1\": null,\r\n        \"graphicalLineLengthFont2\": null,\r\n        \"graphicalLineLengthFormat\": null,\r\n        \"inCuesSnapThreshold\": 0,\r\n        \"lineLength\": 42,\r\n        \"maxParagraphLines\": 2,\r\n        \"maxSubDuration\": 7,\r\n        \"maxTimingGap\": null,\r\n        \"minSubDuration\": 0.8333,\r\n        \"preventTimingOverlap\": true,\r\n        \"screenLines\": 11,\r\n        \"snapInCues\": false,\r\n        \"timingFramesGap\": 2\r\n    },\r\n    \"overrideFileName\": \"\",\r\n    \"overrideReadingSpeed\": false,\r\n    \"overrides\": null,\r\n    \"pacCharacterSet1\": \"Latin\",\r\n    \"pacCharacterSet2\": \"Latin\",\r\n    \"preserveSafeArea\": false,\r\n    \"preventTimingOverlap\": true,\r\n    \"previewFont\": \"\",\r\n    \"previewFontSize\": 48,\r\n    \"previewFontSizeFromVideoFormat\": true,\r\n    \"previewScriptSubtitles\": null,\r\n    \"rawScript\": {\r\n        \"importRawScript\": false,\r\n        \"lineDoesntEndOn\": \"\",\r\n        \"lineEndPunctuation\": \":;\",\r\n        \"maxLineLength\": 42,\r\n        \"maxLinesPerSubtitle\": 2,\r\n        \"subtitleEndPunctuation\": \".?!\"\r\n    },\r\n    \"readingSpeedCountPunctuations\": false,\r\n    \"readingSpeedCountSpaces\": true,\r\n    \"readingSpeedCps\": 17,\r\n    \"readingSpeedType\": \"cps\",\r\n    \"readingSpeedWpm\": 200,\r\n    \"recalculate890ScreenSettings\": \"Default\",\r\n    \"recutAuto\": false,\r\n    \"removeAllStyling\": false,\r\n    \"replaceAsianQuotes\": {\r\n        \"align\": true,\r\n        \"lowerQuotes\": false,\r\n        \"replace\": 0\r\n    },\r\n    \"replaceEllipsis\": 0,\r\n    \"replaceLongEmDash\": false,\r\n    \"RTF\": {\r\n        \"includeAlignment\": false,\r\n        \"includeColorsFormatting\": false,\r\n        \"includeInOutCues\": false,\r\n        \"includeItalicsUnderline\": false,\r\n        \"includeReadingSpeedInformation\": false,\r\n        \"includeSubtitleNumber\": false,\r\n        \"isBold\": false\r\n    },\r\n    \"safeArea\": {\r\n        \"bottom\": 10,\r\n        \"left\": 10,\r\n        \"right\": 10,\r\n        \"top\": 10,\r\n        \"videoHeight\": 720,\r\n        \"videoWidth\": 1080\r\n    },\r\n    \"sami\": {\r\n        \"closePSyncTags\": false,\r\n        \"createASXFile\": true,\r\n        \"createHTMLFile\": true,\r\n        \"exportSourceId\": false,\r\n        \"htmlCWHeight\": 80,\r\n        \"htmlVideoBorder\": 1,\r\n        \"htmlVideoHeight\": 280,\r\n        \"htmlVideoWigth\": 320,\r\n        \"language\": \"English - United Kingdom\",\r\n        \"mediaFile\": \"test@.wmv\",\r\n        \"normalBackColor\": \"000000\",\r\n        \"normalFontColor\": \"FFFFFF\",\r\n        \"normalFontName\": \"Arial\",\r\n        \"normalFontNumber\": 0,\r\n        \"normalFontSize\": 12,\r\n        \"normalFontStyles\": \"1\",\r\n        \"sourceId\": 0,\r\n        \"sourceIdBackColor\": \"FF0000\",\r\n        \"sourceIdFont\": 1,\r\n        \"sourceIdFontColor\": \"00FFFF\",\r\n        \"sourceIdFontName\": \"Arial\",\r\n        \"sourceIdFontSize\": 12,\r\n        \"sourceIdFontStyles\": \"1\",\r\n        \"useHTMLRefs\": true\r\n    },\r\n    \"screenLines\": 11,\r\n    \"scriptSettings\": {\r\n        \"alignAllLines\": false,\r\n        \"defaultAlign\": \"Left\",\r\n        \"defaultBox\": \"None\",\r\n        \"defaultJustification\": \"None\",\r\n        \"defaultOutline\": \"Outline\",\r\n        \"doubleHeight\": false,\r\n        \"EBU\": {\r\n            \"standard\": \"OpenSubtitles\"\r\n        },\r\n        \"graphicalLineLength\": false,\r\n        \"graphicalLineLengthFont1\": null,\r\n        \"graphicalLineLengthFont2\": null,\r\n        \"graphicalLineLengthFormat\": null,\r\n        \"inCuesSnapThreshold\": 0,\r\n        \"lineLength\": 80,\r\n        \"maxParagraphLines\": 999,\r\n        \"maxSubDuration\": 7,\r\n        \"maxTimingGap\": null,\r\n        \"minSubDuration\": 0.8333,\r\n        \"preventTimingOverlap\": true,\r\n        \"screenLines\": 999,\r\n        \"snapInCues\": false,\r\n        \"timingFramesGap\": 2\r\n    },\r\n    \"selectNextSubAfterSettingTC\": true,\r\n    \"shotChangeSnapEndFrames\": 2,\r\n    \"shotChangeSnapStartFrames\": 0,\r\n    \"shotChangesSnapAreaFrames\": 8,\r\n    \"showZeroParagraphInTable\": false,\r\n    \"skipUntimed\": false,\r\n    \"SMPTE_428\": {\r\n        \"displayType\": \"\",\r\n        \"effectSize\": \"0.01\",\r\n        \"encoding\": \"UTF-8\",\r\n        \"exportFont\": false,\r\n        \"fadeDownTime\": 0,\r\n        \"fadeDownUp\": false,\r\n        \"fadeUpTime\": 0,\r\n        \"feather\": \"no\",\r\n        \"font2URI\": \"\",\r\n        \"fontEffect\": \"none\",\r\n        \"fontEffectColor\": \"\",\r\n        \"fontURI\": \"\",\r\n        \"language\": \"English\",\r\n        \"reel\": 1,\r\n        \"spacing\": \"0\",\r\n        \"startTime\": 0,\r\n        \"version\": \"ST428-7-2007\",\r\n        \"writeStartTime\": false\r\n    },\r\n    \"snapInCues\": false,\r\n    \"specialFont1\": \"\",\r\n    \"specialFont2\": \"\",\r\n    \"spellcheckEnableGrammarErrors\": null,\r\n    \"spellcheckIgnoreWordsInUppercase\": null,\r\n    \"spellcheckIncludeAISuggestions\": null,\r\n    \"spellcheckRussianEnforceStrictYo\": null,\r\n    \"SRT\": {\r\n        \"exportAlignment\": false,\r\n        \"exportColors\": false,\r\n        \"exportInBold\": false,\r\n        \"exportItalics\": true,\r\n        \"exportRaised\": false,\r\n        \"exportUnderline\": false,\r\n        \"RTLReorder\": false,\r\n        \"rtlReorderWithMarks\": false,\r\n        \"smpte\": false\r\n    },\r\n    \"STL\": {\r\n        \"includeItalic\": true,\r\n        \"isBold\": false,\r\n        \"isItalic\": false,\r\n        \"isUnderline\": false,\r\n        \"userDefinedFont\": false,\r\n        \"useTabChars\": false\r\n    },\r\n    \"sub\": {\r\n        \"useFullStopDelimiter\": false\r\n    },\r\n    \"tableFont\": \"\",\r\n    \"tagsExportFilter\": null,\r\n    \"targetTrack\": 0,\r\n    \"teletextSettings\": {\r\n        \"alignAllLines\": true,\r\n        \"defaultAlign\": \"Center\",\r\n        \"defaultBox\": \"FixedBox\",\r\n        \"defaultJustification\": \"Center\",\r\n        \"defaultOutline\": \"Outline\",\r\n        \"doubleHeight\": true,\r\n        \"EBU\": {\r\n            \"standard\": \"TeletextLevel1\"\r\n        },\r\n        \"graphicalLineLength\": false,\r\n        \"graphicalLineLengthFont1\": null,\r\n        \"graphicalLineLengthFont2\": null,\r\n        \"graphicalLineLengthFormat\": null,\r\n        \"inCuesSnapThreshold\": 0,\r\n        \"lineLength\": 37,\r\n        \"maxParagraphLines\": 2,\r\n        \"maxSubDuration\": 7,\r\n        \"maxTimingGap\": null,\r\n        \"minSubDuration\": 0.8333,\r\n        \"preventTimingOverlap\": true,\r\n        \"screenLines\": 23,\r\n        \"snapInCues\": false,\r\n        \"timingFramesGap\": 2\r\n    },\r\n    \"templateId\": \"48184225-0d63-4750-be79-8640fa185db9\",\r\n    \"timecodeFormat\": \"24 fps\",\r\n    \"timeFormat\": \"SMPTE\",\r\n    \"timelineOffset\": 0,\r\n    \"timingFramesGap\": 2,\r\n    \"track2\": null,\r\n    \"track3\": null,\r\n    \"track4\": null,\r\n    \"tracksExportFilter\": null,\r\n    \"TTML\": {\r\n        \"backColor\": \"\",\r\n        \"burnedInTimeCode\": -1,\r\n        \"copyright\": \"\",\r\n        \"customOutline\": false,\r\n        \"EBUTT\": {\r\n            \"country\": null,\r\n            \"documentId\": \"\",\r\n            \"editorsName\": \"\",\r\n            \"episodeOriginalTitle\": \"\",\r\n            \"episodeTranslatedTitle\": \"\",\r\n            \"exportBox\": \"None\",\r\n            \"headerCodePage\": \"\",\r\n            \"programOriginalTitle\": \"\",\r\n            \"programTranslatedTitle\": \"\",\r\n            \"publisher\": \"\",\r\n            \"referenceCode\": \"\",\r\n            \"revisionNumber\": 0,\r\n            \"standard\": \"OpenSubtitles\",\r\n            \"startOfProgramme\": null\r\n        },\r\n        \"exportvPosAsTTAF1\": false,\r\n        \"fontColor\": \"\",\r\n        \"fontSize\": 100,\r\n        \"fontSizeUnit\": \"%\",\r\n        \"ignoreFontProperties\": false,\r\n        \"ignoreInlineColors\": false,\r\n        \"imsc\": {\r\n            \"captionService\": \"F1C1CC\",\r\n            \"channel\": \"CC1\",\r\n            \"exportBoxed\": false,\r\n            \"includeSmpteInformation\": false,\r\n            \"programName\": \"\"\r\n        },\r\n        \"includeStartTCAtTopDiv\": false,\r\n        \"isBold\": false,\r\n        \"languageCode\": \"\",\r\n        \"lineHeight\": 100,\r\n        \"luminanceGain\": null,\r\n        \"outlineColor\": \"black\",\r\n        \"outlineWidth\": 2,\r\n        \"outlineWidthUnit\": \"px\",\r\n        \"role\": null,\r\n        \"rtlReorder\": false,\r\n        \"rubyReserveOutside\": true,\r\n        \"simplifiedPositioning\": false,\r\n        \"useEditable\": false\r\n    },\r\n    \"validation\": {},\r\n    \"verticalLineLength\": 13,\r\n    \"verticalSubtitlesGroupNumbers\": 2,\r\n    \"videoFormat\": \"HD 1920x1080\",\r\n    \"voice\": {\r\n        \"country\": null,\r\n        \"language\": null,\r\n        \"languageCode\": null,\r\n        \"pitch\": \"0%\",\r\n        \"provider\": null,\r\n        \"speed\": \"0%\",\r\n        \"voiceId\": null,\r\n        \"voiceName\": null,\r\n        \"volume\": \"0%\"\r\n    },\r\n    \"VTT\": {\r\n        \"addBoxAlignment\": false,\r\n        \"includeStyleSection\": false,\r\n        \"skipBottomAligned\": true,\r\n        \"skipCenterAligned\": true,\r\n        \"topAlignmentIndex\": 1,\r\n        \"writeDirectionCodes\": false,\r\n        \"writeHorizontalPosition\": true,\r\n        \"writeRegionSize\": false,\r\n        \"writeSubtitleNumbers\": false,\r\n        \"writeVerticalPosition\": true,\r\n        \"writeVerticalPositionInPercentage\": false\r\n    },\r\n    \"zeroParagraphTemplateId\": \"\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/configuration/8447c752-7f1f-4732-831c-cd46e2cb6db8"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"4"}],"cookie":[],"responseTime":null,"body":"null"}],"_postman_id":"734870c8-4e57-4150-b9ce-1b0d35f5ab84"},{"name":"Delete configuration template","id":"4f8ddc71-60b2-47e8-a5da-c22a3a18fb93","request":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"}],"url":"{{base_url}}/external/configuration/abfbc11b-5421-4253-8c27-50f0803f44d2","description":"<p><strong>Role:</strong> <code>API</code>.</p>\n<p>Permanently deletes a configuration template: its stored JSON file and its template record. The deletion is written to the action log. It cannot be undone.</p>\n<p><strong>Route</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>guid</code></td>\n<td>Id of the template to delete.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output:</strong> <code>200 OK</code> with an empty body when deleted; <code>404 Not Found</code> when no template has that id.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","configuration","2b299b43-874d-44c1-a1cb-eddd430fca6b"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"93190939-cefe-44f1-b159-16f35f69d628","name":"Delete configuration template","originalRequest":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"}],"url":"{{base_url}}/external/configuration/6ce1c5ca-cd1f-494f-8773-218ece911318"},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[{"key":"Content-Length","value":"0"}],"cookie":[],"responseTime":null,"body":""},{"id":"a2c4de52-d23d-4e86-9c6a-55df19fb5056","name":"404 Not Found","originalRequest":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"}],"url":"{{base_url}}/external/configuration/does-not-exist"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""}],"_postman_id":"4f8ddc71-60b2-47e8-a5da-c22a3a18fb93"},{"name":"Get instance config diagnostics","id":"35c63dca-9310-425d-bd9d-aa03964ed89b","request":{"method":"GET","header":[],"url":"{{base_url}}/external/config/diagnostics","description":"<p><strong>Role:</strong> <code>API</code>.</p>\n<p>Read-only report of how this Toolkit instance is actually configured. It answers questions such as \"does this instance have a key for engine X?\" without server access. Nothing is changed.</p>\n<p>Application settings can come from several layers. For every known setting key the report shows the effective value and which layer supplied it. Layers, highest precedence first: <code>UserSetting</code>, <code>ClientSetting</code>, <code>Database</code>, <code>SecretsSite</code>, <code>SecretsGlobal</code>, <code>WebConfig</code> (in a DEBUG build <code>WebConfig</code> wins over the secret layers).</p>\n<p><strong>Secrets are never returned in clear text.</strong> Sensitive values are masked (first 2 characters, a fixed run of asterisks, last character) and carry a short <code>fingerprint</code> (first 8 hex characters of the SHA-256 of the value), so two instances can be compared for \"same credential\" without exposing it.</p>\n<p>No parameters.</p>\n<p><strong>Output:</strong> <code>200 OK</code>, JSON object:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>instance</code></td>\n<td><code>clientName</code>, <code>appName</code>, <code>basePath</code>, <code>machineName</code>, <code>siteName</code> (the key of this instance's <code>TK/appSettings/{site}</code> secret) and <code>version</code> (null if it could not be read).</td>\n</tr>\n<tr>\n<td><code>settings[]</code></td>\n<td>One entry per setting key: <code>key</code>, <code>sensitive</code>, <code>isSet</code> (effective value non-empty), <code>effectiveLayer</code> (layer name or null), <code>value</code> (masked when sensitive), <code>fingerprint</code>, and <code>layers[]</code> listing every layer that holds the key (<code>layer</code>, <code>present</code>, <code>isEmpty</code>, <code>value</code>, <code>fingerprint</code>, <code>shadowed</code>). An empty value in a higher layer still shadows a good value below it.</td>\n</tr>\n<tr>\n<td><code>engines[]</code></td>\n<td>One entry per engine, enabled or not: <code>key</code>, <code>name</code>, <code>type</code> (MT, ASR, TTS, Unified, Transcode, QC, SmartConform, Syncheck), <code>jobType</code>, <code>fromManifest</code>, <code>pricingRowExists</code>, <code>enabled</code> (offered to users), <code>settingKeys[]</code> (<code>key</code>, <code>description</code>, <code>required</code>, <code>isSet</code>, <code>layer</code>, <code>fingerprint</code>), <code>requiredSettingKeys[]</code>, <code>missingSettingKeys[]</code>, <code>ready</code> (enabled and fully credentialed) and <code>error</code> (set when the engine could not be inspected).</td>\n</tr>\n</tbody>\n</table>\n</div><p>Errors: 401/403 without the <code>API</code> role.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","config","diagnostics"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"782ce270-d975-40fd-b308-cda8d7933d65","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/config/diagnostics"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"instance\": {\n    \"clientName\": \"Sandbox\",\n    \"appName\": \"Toolkit\",\n    \"basePath\": \"C:\\\\inetpub\\\\Toolkit\",\n    \"machineName\": \"WEB-01\",\n    \"siteName\": \"sandbox\",\n    \"version\": \"2026.10.1\"\n  },\n  \"settings\": [\n    {\n      \"key\": \"OpenAI.ApiKey\",\n      \"sensitive\": true,\n      \"isSet\": true,\n      \"effectiveLayer\": \"SecretsSite\",\n      \"value\": \"sk*****************y\",\n      \"fingerprint\": \"9f2c41ab\",\n      \"layers\": [\n        {\n          \"layer\": \"SecretsSite\",\n          \"present\": true,\n          \"isEmpty\": false,\n          \"value\": \"sk*****************y\",\n          \"fingerprint\": \"9f2c41ab\",\n          \"shadowed\": false\n        },\n        {\n          \"layer\": \"SecretsGlobal\",\n          \"present\": true,\n          \"isEmpty\": false,\n          \"value\": \"sk*****************z\",\n          \"fingerprint\": \"03bb77de\",\n          \"shadowed\": true\n        }\n      ]\n    }\n  ],\n  \"engines\": [\n    {\n      \"key\": \"OPENAI\",\n      \"name\": \"OpenAI\",\n      \"type\": \"MT\",\n      \"jobType\": \"Translation\",\n      \"fromManifest\": false,\n      \"pricingRowExists\": true,\n      \"enabled\": true,\n      \"settingKeys\": [\n        {\n          \"key\": \"OpenAI.ApiKey\",\n          \"description\": \"API key\",\n          \"required\": true,\n          \"isSet\": true,\n          \"layer\": \"SecretsSite\",\n          \"fingerprint\": \"9f2c41ab\"\n        }\n      ],\n      \"requiredSettingKeys\": [\n        \"OpenAI.ApiKey\"\n      ],\n      \"missingSettingKeys\": [],\n      \"ready\": true,\n      \"error\": null\n    }\n  ]\n}"}],"_postman_id":"35c63dca-9310-425d-bd9d-aa03964ed89b"}],"id":"50bfd131-f4cd-4b87-af44-58fe0c3678e2","description":"<p>Configuration endpoints are used to manage settings presets for projects, imports, exports, etc...</p>\n<p>The base endpoint to create or edit a preset is <code>/external/configuration/{guid}</code><br />The <code>{guid}</code> is a unique identified you should generate on your end and save to be able to address this template in the future (open a project with it or delete it).</p>\n<p>This will return a URL you should redirect your user to. The user will be given a page with a configuration form.<br />If the <code>{guid}</code> already exists they will be able to edit it and save, otherwise, they will create a new entry for this <code>{guid}</code>.</p>\n<p>Using the <code>{guid}</code> you provide in this request’s URL you can open new projects with the settings attached to it.</p>\n<p>You can use the <code>“ProjectSettings”</code> template as base configuration and override language specific settings and video specific settings using <code>“LanguageSettings”</code> and <code>“VideoSettings”</code> templates. You can ignore <code>“VideoSettings”</code> and <code>“LanguageSettings”</code> and only work with complete configuration templates to simplify the process.<br /><code>“ImportSettings”</code> is only relevant for projects that a file should be imported into either by the user or automatically using the <code>“subtitlesUrl”</code> option in the project API (the import settings will be ignored if the file being imported has a different format than the format in the template provided). <code>“ExportSettings”</code> is relevant when the user working on the project should export a file for delivery and you want to control the file specifications. These settings will be used when the user clicks on <code>“Finish project”</code> and a file will be exported in the background and POSTed to the <code>“callbackUrl”</code> provided when the project is opened.</p>\n<h2 id=\"endpoints-in-this-folder-role-api\">Endpoints in this folder (role <code>API</code>)</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Endpoint</th>\n<th>Purpose</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>POST /external/configuration/{guid}</code></td>\n<td>Start the hosted form for a template. One request per <code>configurationType</code>: Project, Language, Video, Import, Export, Batch export. Returns the URL to send the user to. Posting the same <code>{guid}</code> again replaces that id's existing configuration request with the new body (same row, new single-use token); send the full body each time.</td>\n</tr>\n<tr>\n<td><code>PUT /external/configuration/{guid}</code></td>\n<td>Create or update a template directly from JSON, no form.</td>\n</tr>\n<tr>\n<td><code>GET /external/configuration/{guid}</code></td>\n<td>Read a template's JSON.</td>\n</tr>\n<tr>\n<td><code>DELETE /external/configuration/{guid}</code></td>\n<td>Delete a template.</td>\n</tr>\n<tr>\n<td><code>POST /external/configuration/copyConfigurations</code></td>\n<td>Duplicate templates to new ids.</td>\n</tr>\n<tr>\n<td><code>GET /external/configurations</code></td>\n<td>List the templates created through the API.</td>\n</tr>\n<tr>\n<td><code>GET /external/configuration/default</code></td>\n<td>The default configuration object (all properties).</td>\n</tr>\n<tr>\n<td><code>GET /external/config/diagnostics</code></td>\n<td>Instance diagnostics: effective application settings and engine readiness.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The <code>Convert templates</code> sub-folder covers the separate per-user import/export templates used by the Convert API.</p>\n","_postman_id":"50bfd131-f4cd-4b87-af44-58fe0c3678e2","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"📁 Metadata","item":[{"name":"Get formats","id":"3d8ad170-6193-452b-946a-fe5b29ebcee7","request":{"method":"GET","header":[],"url":"{{base_url}}/external/formats","description":"<p>Lists the subtitle and caption file formats this instance can handle, with what each can do. Use <code>key</code> as a format key in the route of Convert / QC / Conform / Stitch, or as the <code>format</code> value in <code>importOverrides</code> / <code>exportOverrides</code>. Role: <code>API</code> or <code>UserAPI</code>. No input.</p>\n<p><strong>Access</strong>: bearer token with role <code>API</code> or <code>UserAPI</code>. The response is cached for 24 hours (server and client), independent of the query string.</p>\n<p>Formats that require a role are filtered by the role of the caller, but the response is cached instance-wide for up to 24 hours without a per-user key, so the list may reflect another caller's roles.</p>\n<p><strong>Output</strong> (<code>200 OK</code>, JSON array). Each item:</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>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>key</code></td>\n<td>string</td>\n<td>Format key to use in requests.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Display name.</td>\n</tr>\n<tr>\n<td><code>extensions</code></td>\n<td>string[]</td>\n<td>File extensions of the format.</td>\n</tr>\n<tr>\n<td><code>category</code></td>\n<td>string</td>\n<td>Category key, see <em>Get categories</em> (<code>OpenSubtitles</code>, <code>TimedText</code>, <code>ClosedCaptions</code>, <code>DVDImages</code>).</td>\n</tr>\n<tr>\n<td><code>canImport</code></td>\n<td>boolean</td>\n<td>The format can be read.</td>\n</tr>\n<tr>\n<td><code>canExport</code></td>\n<td>boolean</td>\n<td>The format can be written.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","formats"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"7d2980db-5dce-4cef-a65c-0a1f90af0a8a","name":"Get formats","originalRequest":{"method":"GET","header":[{"key":"Content-Type","value":"application/json"}],"url":"{{base_url}}/external/formats"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"14345"}],"cookie":[],"responseTime":null,"body":"[\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"890\"\n        ],\n        \"key\": \"890\",\n        \"name\": \"890\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"stl\"\n        ],\n        \"key\": \"AppleSTL\",\n        \"name\": \"Apple® DVD Studio Pro®\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"ass\"\n        ],\n        \"key\": \"ASS\",\n        \"name\": \"SubStation Alpha\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"txt\"\n        ],\n        \"key\": \"AvidDS\",\n        \"name\": \"Avid® DS Nitris™ Subtitles\"\n    },\n    {\n        \"category\": \"ClosedCaptions\",\n        \"extensions\": [\n            \"cap\"\n        ],\n        \"key\": \"CAP\",\n        \"name\": \"Cheetah CAP\"\n    },\n    {\n        \"category\": \"TimedText\",\n        \"extensions\": [\n            \"dfxp\"\n        ],\n        \"key\": \"DFXP\",\n        \"name\": \"DFXP\"\n    },\n    {\n        \"category\": \"TimedText\",\n        \"extensions\": [\n            \"ttml\",\n            \"xml\"\n        ],\n        \"key\": \"DisneyIMSC\",\n        \"name\": \"DSS Timed Text IMSC1\"\n    },\n    {\n        \"category\": \"TimedText\",\n        \"extensions\": [\n            \"ttml\",\n            \"xml\"\n        ],\n        \"key\": \"DisneyIMSC11\",\n        \"name\": \"DSS Timed Text IMSC1.1\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"xml\"\n        ],\n        \"key\": \"DLP_XML\",\n        \"name\": \"DLP Cinema XML\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"doc\"\n        ],\n        \"key\": \"Doc\",\n        \"name\": \"Word 97-2003 Document\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"docx\"\n        ],\n        \"key\": \"Docx\",\n        \"name\": \"Word Document\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"docx\"\n        ],\n        \"key\": \"DOCX_SCRIPT\",\n        \"name\": \"Word Document Script\"\n    },\n    {\n        \"category\": \"DVDImages\",\n        \"extensions\": [\n            \"zip\"\n        ],\n        \"key\": \"DoSTImages\",\n        \"name\": \"DoStudio Authoring Images\"\n    },\n    {\n        \"category\": \"TimedText\",\n        \"extensions\": [\n            \"xml\"\n        ],\n        \"key\": \"EBU-TT\",\n        \"name\": \"EBU-TT\"\n    },\n    {\n        \"category\": \"DVDImages\",\n        \"extensions\": [\n            \"zip\"\n        ],\n        \"key\": \"EDLImages\",\n        \"name\": \"EDL Images\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"eztxml\",\n            \"ezt\"\n        ],\n        \"key\": \"EztXml\",\n        \"name\": \"EztXml\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"fcpxml\"\n        ],\n        \"key\": \"FinalCut\",\n        \"name\": \"FinalCut\"\n    },\n    {\n        \"category\": \"DVDImages\",\n        \"extensions\": [\n            \"zip\"\n        ],\n        \"key\": \"FinalCutBDN\",\n        \"name\": \"Final Cut Pro Images\"\n    },\n    {\n        \"category\": \"TimedText\",\n        \"extensions\": [\n            \"xml\"\n        ],\n        \"key\": \"FoxIMSC\",\n        \"name\": \"IMSC1 Fox\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"xml\",\n            \"dfxp\",\n            \"ttml\"\n        ],\n        \"key\": \"GenericXml\",\n        \"name\": \"Generic xml file (auto recognize)\"\n    },\n    {\n        \"category\": \"DVDImages\",\n        \"extensions\": [\n            \"zip\"\n        ],\n        \"key\": \"GraphicsSTL\",\n        \"name\": \"Graphics STL\"\n    },\n    {\n        \"category\": \"DVDImages\",\n        \"extensions\": [\n            \"zip\"\n        ],\n        \"key\": \"HarmonicRhozetXMLImages\",\n        \"name\": \"Harmonic Rhozet XML Images\"\n    },\n    {\n        \"category\": \"TimedText\",\n        \"extensions\": [\n            \"xml\",\n            \"ttml\"\n        ],\n        \"key\": \"IMSC\",\n        \"name\": \"Timed Text IMSC1\"\n    },\n    {\n        \"category\": \"TimedText\",\n        \"extensions\": [\n            \"ttml\",\n            \"xml\"\n        ],\n        \"key\": \"IMSC11\",\n        \"name\": \"Timed Text IMSC1.1\"\n    },\n    {\n        \"category\": \"TimedText\",\n        \"extensions\": [\n            \"imscr\"\n        ],\n        \"key\": \"IMSCRosetta\",\n        \"name\": \"IMSC Rosetta\"\n    },\n    {\n        \"category\": \"TimedText\",\n        \"extensions\": [\n            \"itt\"\n        ],\n        \"key\": \"ITT\",\n        \"name\": \"Apple iTunes Timed Text (iTT)\"\n    },\n    {\n        \"category\": \"TimedText\",\n        \"extensions\": [\n            \"ttml\"\n        ],\n        \"key\": \"NBCUIMSC11\",\n        \"name\": \"NBC-Universal IMSC1.1\"\n    },\n    {\n        \"category\": \"TimedText\",\n        \"extensions\": [\n            \"xml\",\n            \"dfxp\",\n            \"ttml\"\n        ],\n        \"key\": \"NFLX\",\n        \"name\": \"Netflix Timed Text (NFLX-TT)\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"ooona\"\n        ],\n        \"key\": \"Ooona\",\n        \"name\": \"Ooona\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"json\"\n        ],\n        \"key\": \"OoonaProject\",\n        \"name\": \"Ooona Project\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"pac\"\n        ],\n        \"key\": \"PAC\",\n        \"name\": \"PAC\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"fpc\",\n            \"pac\"\n        ],\n        \"key\": \"PACUNI\",\n        \"name\": \"PAC Unicode\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"pdf\"\n        ],\n        \"key\": \"PDF_SCRIPT\",\n        \"name\": \"PDF Script\"\n    },\n    {\n        \"category\": \"TimedText\",\n        \"extensions\": [\n            \"xml\"\n        ],\n        \"key\": \"PRMT-TTML\",\n        \"name\": \"Paramount Timed Text (TT)\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"vtt\"\n        ],\n        \"key\": \"QuibiVTT\",\n        \"name\": \"Quibi Web VTT\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"RTF\"\n        ],\n        \"key\": \"RTF\",\n        \"name\": \"RTF\"\n    },\n    {\n        \"category\": \"ClosedCaptions\",\n        \"extensions\": [\n            \"smi\"\n        ],\n        \"key\": \"SAMI\",\n        \"name\": \"Webcast - Media Player SAMI\"\n    },\n    {\n        \"category\": \"ClosedCaptions\",\n        \"extensions\": [\n            \"scc\"\n        ],\n        \"key\": \"SCC\",\n        \"name\": \"Scenarist Closed Caption\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"sif\"\n        ],\n        \"key\": \"SIF\",\n        \"name\": \"Swift Interchange\"\n    },\n    {\n        \"category\": \"TimedText\",\n        \"extensions\": [\n            \"xml\"\n        ],\n        \"key\": \"SMPTE-TT-NBCU\",\n        \"name\": \"NBC-Universal SMPTE TT\"\n    },\n    {\n        \"category\": \"TimedText\",\n        \"extensions\": [\n            \"xml\"\n        ],\n        \"key\": \"SMPTE-TT\",\n        \"name\": \"SMPTE-TT\"\n    },\n    {\n        \"category\": \"ClosedCaptions\",\n        \"extensions\": [\n            \"xml\"\n        ],\n        \"key\": \"SMPTE-TTClosedCaptions\",\n        \"name\": \"SMPTE-TT CEA-608 Captions\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"xml\"\n        ],\n        \"key\": \"SMPTE_428\",\n        \"name\": \"SMPTE 428-7\"\n    },\n    {\n        \"category\": \"DVDImages\",\n        \"extensions\": [\n            \"zip\"\n        ],\n        \"key\": \"SonyBDN\",\n        \"name\": \"Sony BDN Images\"\n    },\n    {\n        \"category\": \"DVDImages\",\n        \"extensions\": [\n            \"zip\"\n        ],\n        \"key\": \"SPIImages\",\n        \"name\": \"Panasonic Images\"\n    },\n    {\n        \"category\": \"DVDImages\",\n        \"extensions\": [\n            \"zip\"\n        ],\n        \"key\": \"SpruceBDN\",\n        \"name\": \"Spruce DVD Maestro Image\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"srt\"\n        ],\n        \"key\": \"Srt\",\n        \"name\": \"Srt\"\n    },\n    {\n        \"category\": \"TimedText\",\n        \"extensions\": [\n            \"ttml\",\n            \"xml\"\n        ],\n        \"key\": \"ST2052\",\n        \"name\": \"SMPTE-TT ST-2052\"\n    },\n    {\n        \"category\": \"TimedText\",\n        \"extensions\": [\n            \"xml\",\n            \"ttml\"\n        ],\n        \"key\": \"ST2052DisneyComponent\",\n        \"name\": \"TTML ST-2052 Disney Component\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"xml\"\n        ],\n        \"key\": \"Starfish\",\n        \"name\": \"Starfish XML\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"std\"\n        ],\n        \"key\": \"STD\",\n        \"name\": \"Standard Timing Document\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"stl\"\n        ],\n        \"key\": \"STL\",\n        \"name\": \"EBU STL\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"sub\"\n        ],\n        \"key\": \"Sub\",\n        \"name\": \"SoftNi Sub\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"vtt\"\n        ],\n        \"key\": \"TelecineVTT\",\n        \"name\": \"Telecine Brazil WebVTT\"\n    },\n    {\n        \"category\": \"TimedText\",\n        \"extensions\": [\n            \"xml\",\n            \"dfxp\",\n            \"ttml\"\n        ],\n        \"key\": \"TT\",\n        \"name\": \"Timed Text (TTML)\"\n    },\n    {\n        \"category\": \"TimedText\",\n        \"extensions\": [\n            \"ttml\",\n            \"xml\",\n            \"zip\"\n        ],\n        \"key\": \"TTAudioDescription\",\n        \"name\": \"TTML 2 Audio Description\"\n    },\n    {\n        \"category\": \"ClosedCaptions\",\n        \"extensions\": [\n            \"ttml\",\n            \"xml\"\n        ],\n        \"key\": \"TTClosedCaptions\",\n        \"name\": \"TTML IMSC1 Captions\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"txt\"\n        ],\n        \"key\": \"TXT\",\n        \"name\": \"TXT\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"txt\",\n            \"rtf\",\n            \"doc\"\n        ],\n        \"key\": \"TXT_CUSTOM\",\n        \"name\": \"Custom Text File\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"txt\"\n        ],\n        \"key\": \"TXT_SCRIPT\",\n        \"name\": \"2x2 script\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"txt\"\n        ],\n        \"key\": \"TXT_SOF\",\n        \"name\": \"Softitler TXT file\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"txt\"\n        ],\n        \"key\": \"TXT_TimedScript\",\n        \"name\": \"Timed script\"\n    },\n    {\n        \"category\": \"ClosedCaptions\",\n        \"extensions\": [\n            \"ult\"\n        ],\n        \"key\": \"UltechDV\",\n        \"name\": \"Ultech DV2000/3000\"\n    },\n    {\n        \"category\": \"DVDImages\",\n        \"extensions\": [\n            \"zip\"\n        ],\n        \"key\": \"UltechDVBDN\",\n        \"name\": \"Ultech DV2000/3000 Images\"\n    },\n    {\n        \"category\": \"TimedText\",\n        \"extensions\": [\n            \"xml\"\n        ],\n        \"key\": \"VDHB\",\n        \"name\": \"VDHB\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"json\"\n        ],\n        \"key\": \"VoiceQProject\",\n        \"name\": \"VoiceQ Project\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"cap\"\n        ],\n        \"key\": \"VTRON\",\n        \"name\": \"Videotron Lambda\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"vtt\"\n        ],\n        \"key\": \"VTT\",\n        \"name\": \"Web VTT\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"vtt\"\n        ],\n        \"key\": \"VTT18\",\n        \"name\": \"Web VTT (2018 spec)\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"xif\"\n        ],\n        \"key\": \"XIF\",\n        \"name\": \"XIF\"\n    },\n    {\n        \"category\": \"OpenSubtitles\",\n        \"extensions\": [\n            \"xlsx\"\n        ],\n        \"key\": \"XLSX_SCRIPT\",\n        \"name\": \"Excel Sheet Script\"\n    }\n]"}],"_postman_id":"3d8ad170-6193-452b-946a-fe5b29ebcee7"},{"name":"Get languages","id":"d59385c0-88cc-4747-a721-d319bc3d0634","request":{"method":"GET","header":[],"url":"{{base_url}}/external/languages","description":"<p>Lists the languages known to the Toolkit. Use <code>key</code> / <code>name</code> as the language value in custom JSON configuration (e.g. <code>language1</code> in <code>importOverrides</code> / <code>exportOverrides</code> and in templates). Role: <code>API</code> or <code>UserAPI</code>. No input.</p>\n<p><strong>Access</strong>: bearer token with role <code>API</code> or <code>UserAPI</code>. The response is cached for 24 hours (server and client), independent of the query string.</p>\n<p><strong>Output</strong> (<code>200 OK</code>, JSON array). Each item:</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>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>key</code></td>\n<td>string</td>\n<td>Language key.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Display name.</td>\n</tr>\n<tr>\n<td><code>alpha3</code>, <code>alpha3B</code></td>\n<td>string</td>\n<td>ISO 639-2 three-letter codes (terminology / bibliographic).</td>\n</tr>\n<tr>\n<td><code>languageId</code></td>\n<td>string</td>\n<td>Toolkit language id.</td>\n</tr>\n<tr>\n<td><code>codes</code></td>\n<td>string[]</td>\n<td>Language codes accepted for this language.</td>\n</tr>\n<tr>\n<td><code>dir</code></td>\n<td>string</td>\n<td>Text direction (e.g. <code>rtl</code>), when defined.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","languages"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"93eaebaf-d1bc-475c-8db2-5954766d75a5","name":"Get languages","originalRequest":{"method":"GET","header":[{"key":"Content-Type","value":"application/json"}],"url":"{{base_url}}/external/languages"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"72323"}],"cookie":[],"responseTime":null,"body":"[\n    {\n        \"alpha3\": \"ach\",\n        \"alpha3B\": \"ach\",\n        \"codes\": [\n            \"ach\"\n        ],\n        \"key\": \"ach\",\n        \"languageId\": \"ach\",\n        \"name\": \"Acoli\"\n    },\n    {\n        \"alpha3\": \"aar\",\n        \"alpha3B\": \"aar\",\n        \"codes\": [\n            \"aa\",\n            \"aa-DJ\",\n            \"aa-ER\",\n            \"aa-ET\",\n            \"aar\"\n        ],\n        \"key\": \"aa\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Afar\"\n    },\n    {\n        \"alpha3\": \"afr\",\n        \"alpha3B\": \"afr\",\n        \"codes\": [\n            \"af\",\n            \"af-NA\",\n            \"af-ZA\",\n            \"afr\"\n        ],\n        \"key\": \"af\",\n        \"languageId\": \"af\",\n        \"name\": \"Afrikaans\"\n    },\n    {\n        \"alpha3\": \"agq\",\n        \"alpha3B\": \"agq\",\n        \"codes\": [\n            \"agq\",\n            \"agq-CM\"\n        ],\n        \"key\": \"agq\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Aghem\"\n    },\n    {\n        \"alpha3\": \"aka\",\n        \"alpha3B\": \"aka\",\n        \"codes\": [\n            \"ak\",\n            \"ak-GH\",\n            \"aka\"\n        ],\n        \"key\": \"ak\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Akan\"\n    },\n    {\n        \"alpha3\": \"sqi\",\n        \"alpha3B\": \"alb\",\n        \"codes\": [\n            \"sq\",\n            \"sq-AL\",\n            \"sq-MK\",\n            \"sq-XK\",\n            \"sqi\",\n            \"alb\"\n        ],\n        \"key\": \"sq\",\n        \"languageId\": \"sq-AL\",\n        \"name\": \"Albanian\"\n    },\n    {\n        \"alpha3\": \"amh\",\n        \"alpha3B\": \"amh\",\n        \"codes\": [\n            \"am\",\n            \"am-ET\",\n            \"amh\"\n        ],\n        \"key\": \"am\",\n        \"languageId\": \"am-ET\",\n        \"name\": \"Amharic\"\n    },\n    {\n        \"alpha3\": \"ara\",\n        \"alpha3B\": \"ara\",\n        \"codes\": [\n            \"ar\",\n            \"ar-001\",\n            \"ar-AE\",\n            \"ar-BH\",\n            \"ar-DJ\",\n            \"ar-DZ\",\n            \"ar-EG\",\n            \"ar-ER\",\n            \"ar-IL\",\n            \"ar-IQ\",\n            \"ar-JO\",\n            \"ar-KM\",\n            \"ar-KW\",\n            \"ar-LB\",\n            \"ar-LY\",\n            \"ar-MA\",\n            \"ar-MR\",\n            \"ar-OM\",\n            \"ar-PS\",\n            \"ar-QA\",\n            \"ar-SA\",\n            \"ar-SD\",\n            \"ar-SO\",\n            \"ar-SS\",\n            \"ar-SY\",\n            \"ar-TD\",\n            \"ar-TN\",\n            \"ar-YE\",\n            \"ara\"\n        ],\n        \"key\": \"ar\",\n        \"languageId\": \"ar\",\n        \"name\": \"Arabic\"\n    },\n    {\n        \"alpha3\": \"ara-EG\",\n        \"alpha3B\": \"ara-EG\",\n        \"codes\": [\n            \"ar-EG\",\n            \"ara-EG\",\n            \"aeg\"\n        ],\n        \"key\": \"ar-EG\",\n        \"languageId\": \"ar-EG\",\n        \"name\": \"Arabic (Egyptian)\"\n    },\n    {\n        \"alpha3\": \"ara-LB\",\n        \"alpha3B\": \"ara-LB\",\n        \"codes\": [\n            \"ar-LB\",\n            \"ara-LB\",\n            \"aua\"\n        ],\n        \"key\": \"ar-LB\",\n        \"languageId\": \"ar-LB\",\n        \"name\": \"Arabic (Lebanese)\"\n    },\n    {\n        \"alpha3\": \"ara-PS\",\n        \"alpha3B\": \"ara-PS\",\n        \"codes\": [\n            \"ar-PS\",\n            \"ara-PS\"\n        ],\n        \"key\": \"ar-PS\",\n        \"languageId\": \"ar-PS\",\n        \"name\": \"Arabic (Palestinian)\"\n    },\n    {\n        \"alpha3\": \"ara-SA\",\n        \"alpha3B\": \"ara-SA\",\n        \"codes\": [\n            \"ar-SA\",\n            \"ara-SA\",\n            \"ar-SAU\",\n            \"ara-SAU\"\n        ],\n        \"key\": \"ar-SA\",\n        \"languageId\": \"ar-SA\",\n        \"name\": \"Arabic (Saudi Arabia)\"\n    },\n    {\n        \"alpha3\": \"ara-Sy\",\n        \"alpha3B\": \"ara-Sy\",\n        \"codes\": [\n            \"ar-SY\",\n            \"ara-SY\",\n            \"ar-SY\",\n            \"ara-SY\"\n        ],\n        \"key\": \"ar-Sy\",\n        \"languageId\": \"ar-Sy\",\n        \"name\": \"Arabic (Syrian)\"\n    },\n    {\n        \"alpha3\": \"ara-AE\",\n        \"alpha3B\": \"ARU\",\n        \"codes\": [\n            \"ar-AE\",\n            \"ara-AE\",\n            \"aru\"\n        ],\n        \"key\": \"ar-AE\",\n        \"languageId\": \"ar-AE\",\n        \"name\": \"Arabic (UAE)\"\n    },\n    {\n        \"alpha3\": \"ara-FR\",\n        \"alpha3B\": \"ara-FR\",\n        \"codes\": [\n            \"ar-FR\",\n            \"ara-FR\"\n        ],\n        \"key\": \"ar-FR\",\n        \"languageId\": \"ar-FR\",\n        \"name\": \"Arabic French\"\n    },\n    {\n        \"alpha3\": \"arc\",\n        \"alpha3B\": \"arc\",\n        \"codes\": [\n            \"arc\",\n            \"he\",\n            \"heb\"\n        ],\n        \"key\": \"arc\",\n        \"languageId\": \"arc\",\n        \"name\": \"Aramaic\"\n    },\n    {\n        \"alpha3\": \"hye\",\n        \"alpha3B\": \"arm\",\n        \"codes\": [\n            \"hy\",\n            \"hy-AM\",\n            \"hye\",\n            \"arm\"\n        ],\n        \"key\": \"hy\",\n        \"languageId\": \"hy-AM\",\n        \"name\": \"Armenian\"\n    },\n    {\n        \"alpha3\": \"asm\",\n        \"alpha3B\": \"asm\",\n        \"codes\": [\n            \"as\",\n            \"as-IN\",\n            \"asm\",\n            \"asm\"\n        ],\n        \"key\": \"as\",\n        \"languageId\": \"ASM\",\n        \"name\": \"Assamese\"\n    },\n    {\n        \"alpha3\": \"ast\",\n        \"alpha3B\": \"ast\",\n        \"codes\": [\n            \"ast\",\n            \"ast-ES\"\n        ],\n        \"key\": \"ast\",\n        \"languageId\": \"ast\",\n        \"name\": \"Asturian\"\n    },\n    {\n        \"alpha3\": \"asa\",\n        \"alpha3B\": \"asa\",\n        \"codes\": [\n            \"asa\",\n            \"asa-TZ\"\n        ],\n        \"key\": \"asa\",\n        \"languageId\": \"asa\",\n        \"name\": \"Asu\"\n    },\n    {\n        \"alpha3\": \"bar\",\n        \"alpha3B\": \"bar\",\n        \"codes\": [\n            \"bar\"\n        ],\n        \"key\": \"bar\",\n        \"languageId\": \"bar\",\n        \"name\": \"Austro-Bavarian\"\n    },\n    {\n        \"alpha3\": \"aze\",\n        \"alpha3B\": \"aze\",\n        \"codes\": [\n            \"az\",\n            \"az-Cyrl\",\n            \"az-Latn\",\n            \"aze\",\n            \"az-AZ\"\n        ],\n        \"key\": \"az\",\n        \"languageId\": \"az-AZ\",\n        \"name\": \"Azerbaijani\"\n    },\n    {\n        \"alpha3\": \"aze\",\n        \"alpha3B\": \"aze\",\n        \"codes\": [\n            \"az-Cyrl-AZ\",\n            \"az\",\n            \"aze\",\n            \"azc\",\n            \"azc\"\n        ],\n        \"key\": \"az\",\n        \"languageId\": \"AZC\",\n        \"name\": \"Azerbaijani (Cyrillic)\"\n    },\n    {\n        \"alpha3\": \"aze\",\n        \"alpha3B\": \"aze\",\n        \"codes\": [\n            \"az-Latn-AZ\",\n            \"az\",\n            \"aze\",\n            \"aze\"\n        ],\n        \"key\": \"az\",\n        \"languageId\": \"AZE\",\n        \"name\": \"Azerbaijani (Latin)\"\n    },\n    {\n        \"alpha3\": \"ksf\",\n        \"alpha3B\": \"ksf\",\n        \"codes\": [\n            \"ksf\",\n            \"ksf-CM\"\n        ],\n        \"key\": \"ksf\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Bafia\"\n    },\n    {\n        \"alpha3\": \"bam\",\n        \"alpha3B\": \"bam\",\n        \"codes\": [\n            \"bm\",\n            \"bm-Latn\",\n            \"bam\"\n        ],\n        \"key\": \"bm\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Bamanankan\"\n    },\n    {\n        \"alpha3\": \"bam\",\n        \"alpha3B\": \"bam\",\n        \"codes\": [\n            \"bm-Latn-ML\",\n            \"bm\",\n            \"bam\"\n        ],\n        \"key\": \"bm\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Bamanankan (Latin)\"\n    },\n    {\n        \"alpha3\": \"bam\",\n        \"alpha3B\": \"bam\",\n        \"codes\": [\n            \"bm\",\n            \"bam\"\n        ],\n        \"key\": \"bm\",\n        \"languageId\": \"bm\",\n        \"name\": \"Bambara\"\n    },\n    {\n        \"alpha3\": \"ben\",\n        \"alpha3B\": \"ben\",\n        \"codes\": [\n            \"bn\",\n            \"bn-BD\",\n            \"bn-IN\",\n            \"ben\",\n            \"bnb\",\n            \"bnb\"\n        ],\n        \"key\": \"bn\",\n        \"languageId\": \"BNB\",\n        \"name\": \"Bangla\"\n    },\n    {\n        \"alpha3\": \"bas\",\n        \"alpha3B\": \"bas\",\n        \"codes\": [\n            \"bas\",\n            \"bas-CM\"\n        ],\n        \"key\": \"bas\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Basaa\"\n    },\n    {\n        \"alpha3\": \"bak\",\n        \"alpha3B\": \"bak\",\n        \"codes\": [\n            \"ba\",\n            \"ba-RU\",\n            \"bak\"\n        ],\n        \"key\": \"ba\",\n        \"languageId\": \"ba-RU\",\n        \"name\": \"Bashkir\"\n    },\n    {\n        \"alpha3\": \"eus\",\n        \"alpha3B\": \"baq\",\n        \"codes\": [\n            \"eu\",\n            \"eu-ES\",\n            \"eus\",\n            \"baq\"\n        ],\n        \"key\": \"eu\",\n        \"languageId\": \"eu-ES\",\n        \"name\": \"Basque\"\n    },\n    {\n        \"alpha3\": \"bel\",\n        \"alpha3B\": \"bel\",\n        \"codes\": [\n            \"be\",\n            \"be-BY\",\n            \"bel\"\n        ],\n        \"key\": \"be\",\n        \"languageId\": \"be-BY\",\n        \"name\": \"Belarusian\"\n    },\n    {\n        \"alpha3\": \"bem\",\n        \"alpha3B\": \"bem\",\n        \"codes\": [\n            \"bem\",\n            \"bem-ZM\"\n        ],\n        \"key\": \"bem\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Bemba\"\n    },\n    {\n        \"alpha3\": \"bez\",\n        \"alpha3B\": \"bez\",\n        \"codes\": [\n            \"bez\",\n            \"bez-TZ\"\n        ],\n        \"key\": \"bez\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Bena\"\n    },\n    {\n        \"alpha3\": \"ben\",\n        \"alpha3B\": \"ben\",\n        \"codes\": [\n            \"bn\",\n            \"ben\"\n        ],\n        \"key\": \"bn\",\n        \"languageId\": \"bn\",\n        \"name\": \"Bengali\"\n    },\n    {\n        \"alpha3\": \"byn\",\n        \"alpha3B\": \"byn\",\n        \"codes\": [\n            \"byn\",\n            \"byn-ER\"\n        ],\n        \"key\": \"byn\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Blin\"\n    },\n    {\n        \"alpha3\": \"brx\",\n        \"alpha3B\": \"brx\",\n        \"codes\": [\n            \"brx\",\n            \"brx-IN\"\n        ],\n        \"key\": \"brx\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Bodo\"\n    },\n    {\n        \"alpha3\": \"bos\",\n        \"alpha3B\": \"bos\",\n        \"codes\": [\n            \"bs\",\n            \"bs-Cyrl\",\n            \"bs-Latn\",\n            \"bos\"\n        ],\n        \"key\": \"bs\",\n        \"languageId\": \"bs\",\n        \"name\": \"Bosnian\"\n    },\n    {\n        \"alpha3\": \"bos\",\n        \"alpha3B\": \"bos\",\n        \"codes\": [\n            \"bs-Cyrl-BA\",\n            \"bs\",\n            \"bos\",\n            \"bsc\",\n            \"bsc\"\n        ],\n        \"key\": \"bs\",\n        \"languageId\": \"BSC\",\n        \"name\": \"Bosnian (Cyrillic)\"\n    },\n    {\n        \"alpha3\": \"bos\",\n        \"alpha3B\": \"bos\",\n        \"codes\": [\n            \"bs-Latn-BA\",\n            \"bs\",\n            \"bos\",\n            \"bsb\",\n            \"bsb\"\n        ],\n        \"key\": \"bs\",\n        \"languageId\": \"BSB\",\n        \"name\": \"Bosnian (Latin)\"\n    },\n    {\n        \"alpha3\": \"bre\",\n        \"alpha3B\": \"bre\",\n        \"codes\": [\n            \"br\",\n            \"br-FR\",\n            \"bre\"\n        ],\n        \"key\": \"br\",\n        \"languageId\": \"br-FR\",\n        \"name\": \"Breton\"\n    },\n    {\n        \"alpha3\": \"bul\",\n        \"alpha3B\": \"bul\",\n        \"codes\": [\n            \"bg\",\n            \"bg-BG\",\n            \"bul\"\n        ],\n        \"key\": \"bg\",\n        \"languageId\": \"bg-BG\",\n        \"name\": \"Bulgarian\"\n    },\n    {\n        \"alpha3\": \"mya\",\n        \"alpha3B\": \"bur\",\n        \"codes\": [\n            \"my\",\n            \"my-MM\",\n            \"mya\",\n            \"bur\"\n        ],\n        \"key\": \"my\",\n        \"languageId\": \"my-MM\",\n        \"name\": \"Burmese\"\n    },\n    {\n        \"alpha3\": \"cat\",\n        \"alpha3B\": \"cat\",\n        \"codes\": [\n            \"ca\",\n            \"ca-AD\",\n            \"ca-ES\",\n            \"ca-FR\",\n            \"ca-IT\",\n            \"cat\"\n        ],\n        \"key\": \"ca\",\n        \"languageId\": \"ca\",\n        \"name\": \"Catalan\"\n    },\n    {\n        \"alpha3\": \"cat\",\n        \"alpha3B\": \"cat\",\n        \"codes\": [\n            \"ca-ES-valencia\",\n            \"ca\",\n            \"cat\",\n            \"val\",\n            \"val\"\n        ],\n        \"key\": \"ca\",\n        \"languageId\": \"VAL\",\n        \"name\": \"Catalan (Catalan)\"\n    },\n    {\n        \"alpha3\": \"tzm\",\n        \"alpha3B\": \"tzm\",\n        \"codes\": [\n            \"tzm\",\n            \"tzm-Arab\",\n            \"tzm-Latn\",\n            \"tzm-Tfng\",\n            \"tza\",\n            \"tza\"\n        ],\n        \"key\": \"tzm\",\n        \"languageId\": \"TZA\",\n        \"name\": \"Central Atlas Tamazight\"\n    },\n    {\n        \"alpha3\": \"tzm\",\n        \"alpha3B\": \"tzm\",\n        \"codes\": [\n            \"tzm-Arab-MA\",\n            \"tzm\"\n        ],\n        \"key\": \"tzm\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Central Atlas Tamazight (Arabic)\"\n    },\n    {\n        \"alpha3\": \"tzm\",\n        \"alpha3B\": \"tzm\",\n        \"codes\": [\n            \"tzm-Latn-DZ\",\n            \"tzm-Latn-MA\",\n            \"tzm\",\n            \"tza\",\n            \"tza\"\n        ],\n        \"key\": \"tzm\",\n        \"languageId\": \"TZA\",\n        \"name\": \"Central Atlas Tamazight (Latin)\"\n    },\n    {\n        \"alpha3\": \"tzm\",\n        \"alpha3B\": \"tzm\",\n        \"codes\": [\n            \"tzm-Tfng-MA\",\n            \"tzm\",\n            \"tzm\"\n        ],\n        \"key\": \"tzm\",\n        \"languageId\": \"TZM\",\n        \"name\": \"Central Atlas Tamazight (Tifinagh)\"\n    },\n    {\n        \"alpha3\": \"kur\",\n        \"alpha3B\": \"kur\",\n        \"codes\": [\n            \"ku\",\n            \"ku-Arab\",\n            \"ku-Arab-IQ\",\n            \"ku-Arab-IR\",\n            \"kur\",\n            \"kur\"\n        ],\n        \"key\": \"ku\",\n        \"languageId\": \"KUR\",\n        \"name\": \"Central Kurdish\"\n    },\n    {\n        \"alpha3\": \"che\",\n        \"alpha3B\": \"che\",\n        \"codes\": [\n            \"ce\",\n            \"ce-RU\",\n            \"che\"\n        ],\n        \"key\": \"ce\",\n        \"languageId\": \"ce\",\n        \"name\": \"Chechen\"\n    },\n    {\n        \"alpha3\": \"chr\",\n        \"alpha3B\": \"chr\",\n        \"codes\": [\n            \"chr\",\n            \"chr-Cher\",\n            \"chr-Cher-US\",\n            \"cre\",\n            \"cre\"\n        ],\n        \"key\": \"chr\",\n        \"languageId\": \"CRE\",\n        \"name\": \"Cherokee\"\n    },\n    {\n        \"alpha3\": \"chy\",\n        \"alpha3B\": \"chy\",\n        \"codes\": [\n            \"chy\"\n        ],\n        \"key\": \"chy\",\n        \"languageId\": \"chy\",\n        \"name\": \"Cheyenne\"\n    },\n    {\n        \"alpha3\": \"cgg\",\n        \"alpha3B\": \"cgg\",\n        \"codes\": [\n            \"cgg\",\n            \"cgg-UG\"\n        ],\n        \"key\": \"cgg\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Chiga\"\n    },\n    {\n        \"alpha3\": \"chi\",\n        \"alpha3B\": \"chi\",\n        \"codes\": [\n            \"zh\",\n            \"zh-Hans\",\n            \"zh-Hant\",\n            \"cn1\",\n            \"can\",\n            \"mss\",\n            \"chi\"\n        ],\n        \"key\": \"zh\",\n        \"languageId\": \"zh\",\n        \"name\": \"Chinese\"\n    },\n    {\n        \"alpha3\": \"yue\",\n        \"alpha3B\": \"yue\",\n        \"codes\": [\n            \"yue-Hant\",\n            \"yue\"\n        ],\n        \"key\": \"yue-Hant\",\n        \"languageId\": \"yue-Hant\",\n        \"name\": \"Chinese (Cantonese)\"\n    },\n    {\n        \"alpha3\": \"cmn\",\n        \"alpha3B\": \"cmn\",\n        \"codes\": [\n            \"cmn-Hant\",\n            \"cmn\"\n        ],\n        \"key\": \"cmn-Hant\",\n        \"languageId\": \"cmn-Hant\",\n        \"name\": \"Chinese (Mandarin)\"\n    },\n    {\n        \"alpha3\": \"zho\",\n        \"alpha3B\": \"zho\",\n        \"codes\": [\n            \"zh-Hans\",\n            \"zh\",\n            \"cmn-Hans\",\n            \"cmn\",\n            \"msc\",\n            \"chi\",\n            \"zho\",\n            \"cm1\"\n        ],\n        \"key\": \"zh-Hans\",\n        \"languageId\": \"zh-Hans\",\n        \"name\": \"Chinese (Simplified)\"\n    },\n    {\n        \"alpha3\": \"zho\",\n        \"alpha3B\": \"zho\",\n        \"codes\": [\n            \"zh-CN\",\n            \"zh-Hans-HK\",\n            \"zh-Hans-MO\",\n            \"zh-SG\",\n            \"zh\",\n            \"zho\",\n            \"chi\",\n            \"chs\",\n            \"chs\"\n        ],\n        \"key\": \"zh\",\n        \"languageId\": \"CHS\",\n        \"name\": \"Chinese (Simplified) Legacy\"\n    },\n    {\n        \"alpha3\": \"zho\",\n        \"alpha3B\": \"zho\",\n        \"codes\": [\n            \"zh-Hant\",\n            \"zh\",\n            \"cmn-Hant\",\n            \"mtt\",\n            \"chi\",\n            \"zho\",\n            \"cm1\"\n        ],\n        \"key\": \"zh-Hant\",\n        \"languageId\": \"zh-Hant\",\n        \"name\": \"Chinese (Traditional)\"\n    },\n    {\n        \"alpha3\": \"zho\",\n        \"alpha3B\": \"zho\",\n        \"codes\": [\n            \"zh-HK\",\n            \"zh-MO\",\n            \"zh-TW\",\n            \"zh\",\n            \"zho\",\n            \"chi\",\n            \"zhh\",\n            \"zhh\"\n        ],\n        \"key\": \"zh\",\n        \"languageId\": \"ZHH\",\n        \"name\": \"Chinese (Traditional) Legacy\"\n    },\n    {\n        \"alpha3\": \"zm1\",\n        \"alpha3B\": \"zm1\",\n        \"codes\": [\n            \"zh-MY\",\n            \"zm1\",\n            \"zh\",\n            \"zho\",\n            \"chi\",\n            \"zhh\",\n            \"zm1\"\n        ],\n        \"key\": \"zh-MY\",\n        \"languageId\": \"ZM1\",\n        \"name\": \"Chinese Simplified (Malaysia)\"\n    },\n    {\n        \"alpha3\": \"ZS1\",\n        \"alpha3B\": \"ZS1\",\n        \"codes\": [\n            \"zh-SG\",\n            \"zh\",\n            \"zho\",\n            \"chi\",\n            \"chs\",\n            \"zs1\",\n            \"zs1\"\n        ],\n        \"key\": \"zh-SG\",\n        \"languageId\": \"zh-SG\",\n        \"name\": \"Chinese Simplified (Singapore)\"\n    },\n    {\n        \"alpha3\": \"YU1\",\n        \"alpha3B\": \"YU1\",\n        \"codes\": [\n            \"zh-HK\",\n            \"zh\",\n            \"zho\",\n            \"chi\",\n            \"zhh\",\n            \"yu1\",\n            \"yu1\"\n        ],\n        \"key\": \"zh-HK\",\n        \"languageId\": \"zh-HK\",\n        \"name\": \"Chinese Traditional (Hong Kong)\"\n    },\n    {\n        \"alpha3\": \"ZT1\",\n        \"alpha3B\": \"ZT1\",\n        \"codes\": [\n            \"zh-TW\",\n            \"zh\",\n            \"zho\",\n            \"chi\",\n            \"zhh\",\n            \"zt1\",\n            \"zt1\"\n        ],\n        \"key\": \"zh-TW\",\n        \"languageId\": \"zh-TW\",\n        \"name\": \"Chinese Traditional (Taiwan)\"\n    },\n    {\n        \"alpha3\": \"chu\",\n        \"alpha3B\": \"chu\",\n        \"codes\": [\n            \"cu\",\n            \"chu\",\n            \"cu-RU\"\n        ],\n        \"key\": \"cu\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Church Slavic\"\n    },\n    {\n        \"alpha3\": \"nya\",\n        \"alpha3B\": \"nya\",\n        \"codes\": [\n            \"ny\",\n            \"nya\"\n        ],\n        \"key\": \"ny\",\n        \"languageId\": \"nya\",\n        \"name\": \"Chewa\"\n    },\n    {\n        \"alpha3\": \"ksh\",\n        \"alpha3B\": \"ksh\",\n        \"codes\": [\n            \"ksh\",\n            \"ksh-DE\"\n        ],\n        \"key\": \"ksh\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Colognian\"\n    },\n    {\n        \"alpha3\": \"cor\",\n        \"alpha3B\": \"cor\",\n        \"codes\": [\n            \"kw\",\n            \"kw-GB\",\n            \"cor\"\n        ],\n        \"key\": \"kw\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Cornish\"\n    },\n    {\n        \"alpha3\": \"cos\",\n        \"alpha3B\": \"cos\",\n        \"codes\": [\n            \"co\",\n            \"co-FR\",\n            \"cos\",\n            \"cos\"\n        ],\n        \"key\": \"co\",\n        \"languageId\": \"COS\",\n        \"name\": \"Corsican\"\n    },\n    {\n        \"alpha3\": \"hrv\",\n        \"alpha3B\": \"hrv\",\n        \"codes\": [\n            \"hr\",\n            \"hr-BA\",\n            \"hr-HR\",\n            \"hrv\",\n            \"cro\"\n        ],\n        \"key\": \"hr\",\n        \"languageId\": \"hr\",\n        \"name\": \"Croatian\"\n    },\n    {\n        \"alpha3\": \"ces\",\n        \"alpha3B\": \"cze\",\n        \"codes\": [\n            \"cs\",\n            \"cs-CZ\",\n            \"ces\",\n            \"cze\"\n        ],\n        \"key\": \"cs\",\n        \"languageId\": \"cs-CZ\",\n        \"name\": \"Czech\"\n    },\n    {\n        \"alpha3\": \"dan\",\n        \"alpha3B\": \"dan\",\n        \"codes\": [\n            \"da\",\n            \"da-DK\",\n            \"da-GL\",\n            \"dan\"\n        ],\n        \"key\": \"da\",\n        \"languageId\": \"da\",\n        \"name\": \"Danish\"\n    },\n    {\n        \"alpha3\": \"fa-AF\",\n        \"alpha3B\": \"fa-AF\",\n        \"codes\": [\n            \"prs\",\n            \"prs-AF\",\n            \"fa-AF\"\n        ],\n        \"key\": \"fa-AF\",\n        \"languageId\": \"fa-AF\",\n        \"name\": \"Dari\"\n    },\n    {\n        \"alpha3\": \"din\",\n        \"alpha3B\": \"din\",\n        \"codes\": [\n            \"din\"\n        ],\n        \"key\": \"din\",\n        \"languageId\": \"din\",\n        \"name\": \"Dinka\"\n    },\n    {\n        \"alpha3\": \"div\",\n        \"alpha3B\": \"div\",\n        \"codes\": [\n            \"dv\",\n            \"dv-MV\",\n            \"div\",\n            \"div\"\n        ],\n        \"key\": \"dv\",\n        \"languageId\": \"DIV\",\n        \"name\": \"Divehi\"\n    },\n    {\n        \"alpha3\": \"dua\",\n        \"alpha3B\": \"dua\",\n        \"codes\": [\n            \"dua\",\n            \"dua-CM\"\n        ],\n        \"key\": \"dua\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Duala\"\n    },\n    {\n        \"alpha3\": \"nld\",\n        \"alpha3B\": \"dut\",\n        \"codes\": [\n            \"nl\",\n            \"nl-AW\",\n            \"nl-BE\",\n            \"nl-BQ\",\n            \"nl-CW\",\n            \"nl-NL\",\n            \"nl-SR\",\n            \"nl-SX\",\n            \"nld\",\n            \"dut\"\n        ],\n        \"key\": \"nl\",\n        \"languageId\": \"nl\",\n        \"name\": \"Dutch\"\n    },\n    {\n        \"alpha3\": \"dzo\",\n        \"alpha3B\": \"dzo\",\n        \"codes\": [\n            \"dz\",\n            \"dz-BT\",\n            \"dzo\"\n        ],\n        \"key\": \"dz\",\n        \"languageId\": \"dz\",\n        \"name\": \"Dzongkha\"\n    },\n    {\n        \"alpha3\": \"bin\",\n        \"alpha3B\": \"bin\",\n        \"codes\": [\n            \"bin\",\n            \"bin-NG\"\n        ],\n        \"key\": \"bin\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Edo\"\n    },\n    {\n        \"alpha3\": \"efi\",\n        \"alpha3B\": \"efi\",\n        \"codes\": [\n            \"efi\"\n        ],\n        \"key\": \"efi\",\n        \"languageId\": \"efi\",\n        \"name\": \"Efik\"\n    },\n    {\n        \"alpha3\": \"elx\",\n        \"alpha3B\": \"elx\",\n        \"codes\": [\n            \"elx\"\n        ],\n        \"key\": \"elx\",\n        \"languageId\": \"elx\",\n        \"name\": \"Elamite\"\n    },\n    {\n        \"alpha3\": \"ebu\",\n        \"alpha3B\": \"ebu\",\n        \"codes\": [\n            \"ebu\",\n            \"ebu-KE\"\n        ],\n        \"key\": \"ebu\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Embu\"\n    },\n    {\n        \"alpha3\": \"eng\",\n        \"alpha3B\": \"eng\",\n        \"codes\": [\n            \"en\",\n            \"en-001\",\n            \"en-029\",\n            \"en-150\",\n            \"en-AG\",\n            \"en-AI\",\n            \"en-AS\",\n            \"en-AT\",\n            \"en-AU\",\n            \"en-BB\",\n            \"en-BE\",\n            \"en-BI\",\n            \"en-BM\",\n            \"en-BS\",\n            \"en-BW\",\n            \"en-BZ\",\n            \"en-CA\",\n            \"en-CC\",\n            \"en-CH\",\n            \"en-CK\",\n            \"en-CM\",\n            \"en-CX\",\n            \"en-CY\",\n            \"en-DE\",\n            \"en-DK\",\n            \"en-DM\",\n            \"en-ER\",\n            \"en-FI\",\n            \"en-FJ\",\n            \"en-FK\",\n            \"en-FM\",\n            \"en-GB\",\n            \"en-GD\",\n            \"en-GG\",\n            \"en-GH\",\n            \"en-GI\",\n            \"en-GM\",\n            \"en-GU\",\n            \"en-GY\",\n            \"en-HK\",\n            \"en-ID\",\n            \"en-IE\",\n            \"en-IL\",\n            \"en-IM\",\n            \"en-IN\",\n            \"en-IO\",\n            \"en-JE\",\n            \"en-JM\",\n            \"en-KE\",\n            \"en-KI\",\n            \"en-KN\",\n            \"en-KY\",\n            \"en-LC\",\n            \"en-LR\",\n            \"en-LS\",\n            \"en-MG\",\n            \"en-MH\",\n            \"en-MO\",\n            \"en-MP\",\n            \"en-MS\",\n            \"en-MT\",\n            \"en-MU\",\n            \"en-MW\",\n            \"en-MY\",\n            \"en-NA\",\n            \"en-NF\",\n            \"en-NG\",\n            \"en-NL\",\n            \"en-NR\",\n            \"en-NU\",\n            \"en-NZ\",\n            \"en-PG\",\n            \"en-PH\",\n            \"en-PK\",\n            \"en-PN\",\n            \"en-PR\",\n            \"en-PW\",\n            \"en-RW\",\n            \"en-SB\",\n            \"en-SC\",\n            \"en-SD\",\n            \"en-SE\",\n            \"en-SG\",\n            \"en-SH\",\n            \"en-SI\",\n            \"en-SL\",\n            \"en-SS\",\n            \"en-SX\",\n            \"en-SZ\",\n            \"en-TC\",\n            \"en-TK\",\n            \"en-TO\",\n            \"en-TT\",\n            \"en-TV\",\n            \"en-TZ\",\n            \"en-UG\",\n            \"en-UM\",\n            \"en-US\",\n            \"en-VC\",\n            \"en-VG\",\n            \"en-VI\",\n            \"en-VU\",\n            \"en-WS\",\n            \"en-ZA\",\n            \"en-ZM\",\n            \"en-ZW\",\n            \"eng\"\n        ],\n        \"key\": \"en\",\n        \"languageId\": \"en-US\",\n        \"name\": \"English\"\n    },\n    {\n        \"alpha3\": \"en-AU\",\n        \"alpha3B\": \"en-AU\",\n        \"codes\": [\n            \"en-AU\",\n            \"eng-AU\",\n            \"en\",\n            \"eng\",\n            \"eoz\"\n        ],\n        \"key\": \"en-AU\",\n        \"languageId\": \"en-AU\",\n        \"name\": \"English (Australian)\"\n    },\n    {\n        \"alpha3\": \"eng-CA\",\n        \"alpha3B\": \"eng-CA\",\n        \"codes\": [\n            \"en-CA\",\n            \"eng-CA\",\n            \"en\",\n            \"eng\",\n            \"euk\"\n        ],\n        \"key\": \"en-CA\",\n        \"languageId\": \"en-CA\",\n        \"name\": \"English (Canada)\"\n    },\n    {\n        \"alpha3\": \"eng-GB\",\n        \"alpha3B\": \"eng-GB\",\n        \"codes\": [\n            \"en-GB\",\n            \"eng-GB\",\n            \"en\",\n            \"eng\",\n            \"euk\"\n        ],\n        \"key\": \"en-GB\",\n        \"languageId\": \"en-GB\",\n        \"name\": \"English (UK)\"\n    },\n    {\n        \"alpha3\": \"epo\",\n        \"alpha3B\": \"epo\",\n        \"codes\": [\n            \"eo\",\n            \"eo-001\",\n            \"epo\"\n        ],\n        \"key\": \"eo\",\n        \"languageId\": \"eo\",\n        \"name\": \"Esperanto\"\n    },\n    {\n        \"alpha3\": \"est\",\n        \"alpha3B\": \"est\",\n        \"codes\": [\n            \"et\",\n            \"et-EE\",\n            \"est\"\n        ],\n        \"key\": \"et\",\n        \"languageId\": \"et-EE\",\n        \"name\": \"Estonian\"\n    },\n    {\n        \"alpha3\": \"ewe\",\n        \"alpha3B\": \"ewe\",\n        \"codes\": [\n            \"ee\",\n            \"ee-GH\",\n            \"ee-TG\",\n            \"ewe\"\n        ],\n        \"key\": \"ee\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Ewe\"\n    },\n    {\n        \"alpha3\": \"ewo\",\n        \"alpha3B\": \"ewo\",\n        \"codes\": [\n            \"ewo\",\n            \"ewo-CM\"\n        ],\n        \"key\": \"ewo\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Ewondo\"\n    },\n    {\n        \"alpha3\": \"fao\",\n        \"alpha3B\": \"fao\",\n        \"codes\": [\n            \"fo\",\n            \"fo-DK\",\n            \"fo-FO\",\n            \"fao\"\n        ],\n        \"key\": \"fo\",\n        \"languageId\": \"fo-FO\",\n        \"name\": \"Faroese\"\n    },\n    {\n        \"alpha3\": \"fil\",\n        \"alpha3B\": \"fil\",\n        \"codes\": [\n            \"fil\",\n            \"fil-PH\"\n        ],\n        \"key\": \"fil\",\n        \"languageId\": \"fil\",\n        \"name\": \"Filipino\"\n    },\n    {\n        \"alpha3\": \"fin\",\n        \"alpha3B\": \"fin\",\n        \"codes\": [\n            \"fi\",\n            \"fi-FI\",\n            \"fin\"\n        ],\n        \"key\": \"fi\",\n        \"languageId\": \"fi-FI\",\n        \"name\": \"Finnish\"\n    },\n    {\n        \"alpha3\": \"vls\",\n        \"alpha3B\": \"vls\",\n        \"codes\": [\n            \"nl-BE\",\n            \"vls\",\n            \"flm\",\n            \"nl\"\n        ],\n        \"key\": \"nl-BE\",\n        \"languageId\": \"nl-BE\",\n        \"name\": \"Flemish\"\n    },\n    {\n        \"alpha3\": \"fra\",\n        \"alpha3B\": \"fre\",\n        \"codes\": [\n            \"fr\",\n            \"fr-029\",\n            \"fr-BE\",\n            \"fr-BF\",\n            \"fr-BI\",\n            \"fr-BJ\",\n            \"fr-BL\",\n            \"fr-CA\",\n            \"fr-CD\",\n            \"fr-CF\",\n            \"fr-CG\",\n            \"fr-CH\",\n            \"fr-CI\",\n            \"fr-CM\",\n            \"fr-DJ\",\n            \"fr-DZ\",\n            \"fr-FR\",\n            \"fr-GA\",\n            \"fr-GF\",\n            \"fr-GN\",\n            \"fr-GP\",\n            \"fr-GQ\",\n            \"fr-HT\",\n            \"fr-KM\",\n            \"fr-LU\",\n            \"fr-MA\",\n            \"fr-MC\",\n            \"fr-MF\",\n            \"fr-MG\",\n            \"fr-ML\",\n            \"fr-MQ\",\n            \"fr-MR\",\n            \"fr-MU\",\n            \"fr-NC\",\n            \"fr-NE\",\n            \"fr-PF\",\n            \"fr-PM\",\n            \"fr-RE\",\n            \"fr-RW\",\n            \"fr-SC\",\n            \"fr-SN\",\n            \"fr-SY\",\n            \"fr-TD\",\n            \"fr-TG\",\n            \"fr-TN\",\n            \"fr-VU\",\n            \"fr-WF\",\n            \"fr-YT\",\n            \"fra\",\n            \"fre\",\n            \"frp\"\n        ],\n        \"key\": \"fr\",\n        \"languageId\": \"fr\",\n        \"name\": \"French\"\n    },\n    {\n        \"alpha3\": \"fre-BE\",\n        \"alpha3B\": \"fre-BE\",\n        \"codes\": [\n            \"fr-BE\",\n            \"fre-BE\",\n            \"fr\",\n            \"fre\"\n        ],\n        \"key\": \"fr-BE\",\n        \"languageId\": \"fr-BE\",\n        \"name\": \"French (Belgium)\"\n    },\n    {\n        \"alpha3\": \"fre-CA\",\n        \"alpha3B\": \"fre-CA\",\n        \"codes\": [\n            \"fr-CA\",\n            \"cfr\",\n            \"fre-CA\",\n            \"frc\"\n        ],\n        \"key\": \"fr-CA\",\n        \"languageId\": \"fr-CA\",\n        \"name\": \"French (Canada)\"\n    },\n    {\n        \"alpha3\": \"fre-LU\",\n        \"alpha3B\": \"fre-LU\",\n        \"codes\": [\n            \"fr-LU\",\n            \"fre-LU\",\n            \"fr\",\n            \"fre\"\n        ],\n        \"key\": \"fr-LU\",\n        \"languageId\": \"fr-LU\",\n        \"name\": \"French (Luxembourg)\"\n    },\n    {\n        \"alpha3\": \"fre-CH\",\n        \"alpha3B\": \"fre-CH\",\n        \"codes\": [\n            \"fr-CH\",\n            \"fre-CH\",\n            \"fr\",\n            \"fre\"\n        ],\n        \"key\": \"fr-CH\",\n        \"languageId\": \"fr-CH\",\n        \"name\": \"French (Switzerland)\"\n    },\n    {\n        \"alpha3\": \"fur\",\n        \"alpha3B\": \"fur\",\n        \"codes\": [\n            \"fur\",\n            \"fur-IT\"\n        ],\n        \"key\": \"fur\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Friulian\"\n    },\n    {\n        \"alpha3\": \"ful\",\n        \"alpha3B\": \"ful\",\n        \"codes\": [\n            \"ff\",\n            \"ff-CM\",\n            \"ff-GN\",\n            \"ff-Latn\",\n            \"ff-Latn-SN\",\n            \"ff-MR\",\n            \"ff-NG\",\n            \"ful\",\n            \"ful\"\n        ],\n        \"key\": \"ff\",\n        \"languageId\": \"FUL\",\n        \"name\": \"Fulah\"\n    },\n    {\n        \"alpha3\": \"glg\",\n        \"alpha3B\": \"glg\",\n        \"codes\": [\n            \"gl\",\n            \"gl-ES\",\n            \"glg\"\n        ],\n        \"key\": \"gl\",\n        \"languageId\": \"gl-ES\",\n        \"name\": \"Galician\"\n    },\n    {\n        \"alpha3\": \"lug\",\n        \"alpha3B\": \"lug\",\n        \"codes\": [\n            \"lg\",\n            \"lg-UG\",\n            \"lug\"\n        ],\n        \"key\": \"lg\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Ganda\"\n    },\n    {\n        \"alpha3\": \"kat\",\n        \"alpha3B\": \"geo\",\n        \"codes\": [\n            \"ka\",\n            \"ka-GE\",\n            \"kat\",\n            \"geo\"\n        ],\n        \"key\": \"ka\",\n        \"languageId\": \"ka-GE\",\n        \"name\": \"Georgian\"\n    },\n    {\n        \"alpha3\": \"deu\",\n        \"alpha3B\": \"ger\",\n        \"codes\": [\n            \"de\",\n            \"de-AT\",\n            \"de-BE\",\n            \"de-CH\",\n            \"de-DE\",\n            \"de-IT\",\n            \"de-LI\",\n            \"de-LU\",\n            \"deu\",\n            \"ger\"\n        ],\n        \"key\": \"de\",\n        \"languageId\": \"de\",\n        \"name\": \"German\"\n    },\n    {\n        \"alpha3\": \"DAT\",\n        \"alpha3B\": \"DAT\",\n        \"codes\": [\n            \"de\",\n            \"de-AT\",\n            \"deu\",\n            \"ger\",\n            \"dat\",\n            \"dat\"\n        ],\n        \"key\": \"de-AT\",\n        \"languageId\": \"de-AT\",\n        \"name\": \"German (Austria)\"\n    },\n    {\n        \"alpha3\": \"GSW\",\n        \"alpha3B\": \"GSW\",\n        \"codes\": [\n            \"de\",\n            \"de-CH\",\n            \"deu\",\n            \"ger\",\n            \"gsw\",\n            \"gsw\"\n        ],\n        \"key\": \"de-CH\",\n        \"languageId\": \"de-CH\",\n        \"name\": \"German (Switzerland)\"\n    },\n    {\n        \"alpha3\": \"ell\",\n        \"alpha3B\": \"gre\",\n        \"codes\": [\n            \"el\",\n            \"el-CY\",\n            \"el-GR\",\n            \"ell\",\n            \"gre\"\n        ],\n        \"key\": \"el\",\n        \"languageId\": \"el-GR\",\n        \"name\": \"Greek\"\n    },\n    {\n        \"alpha3\": \"ell-CY\",\n        \"alpha3B\": \"gre-CY\",\n        \"codes\": [\n            \"el-CY\",\n            \"el\",\n            \"ell\",\n            \"gre\",\n            \"ell-CY\",\n            \"gre-CY\"\n        ],\n        \"key\": \"el-CY\",\n        \"languageId\": \"el-CY\",\n        \"name\": \"Greek (Cyprus)\"\n    },\n    {\n        \"alpha3\": \"kal\",\n        \"alpha3B\": \"kal\",\n        \"codes\": [\n            \"kl\",\n            \"kl-GL\",\n            \"kal\",\n            \"kal\"\n        ],\n        \"key\": \"kl\",\n        \"languageId\": \"KAL\",\n        \"name\": \"Greenlandic\"\n    },\n    {\n        \"alpha3\": \"grn\",\n        \"alpha3B\": \"grn\",\n        \"codes\": [\n            \"gn\",\n            \"gn-PY\",\n            \"grn\",\n            \"grn\"\n        ],\n        \"key\": \"gn\",\n        \"languageId\": \"GRN\",\n        \"name\": \"Guarani\"\n    },\n    {\n        \"alpha3\": \"guj\",\n        \"alpha3B\": \"guj\",\n        \"codes\": [\n            \"gu\",\n            \"gu-IN\",\n            \"guj\"\n        ],\n        \"key\": \"gu\",\n        \"languageId\": \"gu-IN\",\n        \"name\": \"Gujarati\"\n    },\n    {\n        \"alpha3\": \"guz\",\n        \"alpha3B\": \"guz\",\n        \"codes\": [\n            \"guz\",\n            \"guz-KE\"\n        ],\n        \"key\": \"guz\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Gusii\"\n    },\n    {\n        \"alpha3\": \"hat\",\n        \"alpha3B\": \"hat\",\n        \"codes\": [\n            \"ht\",\n            \"hat\"\n        ],\n        \"key\": \"ht\",\n        \"languageId\": \"hat\",\n        \"name\": \"Haitian Creole\"\n    },\n    {\n        \"alpha3\": \"hau\",\n        \"alpha3B\": \"hau\",\n        \"codes\": [\n            \"ha\",\n            \"ha-Latn\",\n            \"hau\",\n            \"hau\"\n        ],\n        \"key\": \"ha\",\n        \"languageId\": \"HAU\",\n        \"name\": \"Hausa\"\n    },\n    {\n        \"alpha3\": \"hau\",\n        \"alpha3B\": \"hau\",\n        \"codes\": [\n            \"ha-Latn-GH\",\n            \"ha-Latn-NE\",\n            \"ha-Latn-NG\",\n            \"ha\",\n            \"hau\"\n        ],\n        \"key\": \"ha\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Hausa (Latin)\"\n    },\n    {\n        \"alpha3\": \"haw\",\n        \"alpha3B\": \"haw\",\n        \"codes\": [\n            \"haw\",\n            \"haw-US\"\n        ],\n        \"key\": \"haw\",\n        \"languageId\": \"haw\",\n        \"name\": \"Hawaiian\"\n    },\n    {\n        \"alpha3\": \"heb\",\n        \"alpha3B\": \"heb\",\n        \"codes\": [\n            \"he\",\n            \"he-IL\",\n            \"iw\",\n            \"heb\",\n            \"he-HE\"\n        ],\n        \"key\": \"he\",\n        \"languageId\": \"he-IL\",\n        \"name\": \"Hebrew\"\n    },\n    {\n        \"alpha3\": \"hin\",\n        \"alpha3B\": \"hin\",\n        \"codes\": [\n            \"hi\",\n            \"hi-IN\",\n            \"hin\"\n        ],\n        \"key\": \"hi\",\n        \"languageId\": \"hi-IN\",\n        \"name\": \"Hindi\"\n    },\n    {\n        \"alpha3\": \"nan\",\n        \"alpha3B\": \"nan\",\n        \"codes\": [\n            \"nan\"\n        ],\n        \"key\": \"nan\",\n        \"languageId\": \"nan\",\n        \"name\": \"Hokkien\"\n    },\n    {\n        \"alpha3\": \"hun\",\n        \"alpha3B\": \"hun\",\n        \"codes\": [\n            \"hu\",\n            \"hu-HU\",\n            \"hun\"\n        ],\n        \"key\": \"hu\",\n        \"languageId\": \"hu-HU\",\n        \"name\": \"Hungarian\"\n    },\n    {\n        \"alpha3\": \"ibb\",\n        \"alpha3B\": \"ibb\",\n        \"codes\": [\n            \"ibb\",\n            \"ibb-NG\"\n        ],\n        \"key\": \"ibb\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Ibibio\"\n    },\n    {\n        \"alpha3\": \"ice\",\n        \"alpha3B\": \"isl\",\n        \"codes\": [\n            \"is\",\n            \"is-IS\",\n            \"ice\",\n            \"isl\"\n        ],\n        \"key\": \"is\",\n        \"languageId\": \"is-IS\",\n        \"name\": \"Icelandic\"\n    },\n    {\n        \"alpha3\": \"ibo\",\n        \"alpha3B\": \"ibo\",\n        \"codes\": [\n            \"ig\",\n            \"ig-NG\",\n            \"ibo\",\n            \"ibo\"\n        ],\n        \"key\": \"ig\",\n        \"languageId\": \"IBO\",\n        \"name\": \"Igbo\"\n    },\n    {\n        \"alpha3\": \"ind\",\n        \"alpha3B\": \"ind\",\n        \"codes\": [\n            \"id\",\n            \"id-ID\",\n            \"in\",\n            \"ind\"\n        ],\n        \"key\": \"id\",\n        \"languageId\": \"id-ID\",\n        \"name\": \"Indonesian\"\n    },\n    {\n        \"alpha3\": \"ina\",\n        \"alpha3B\": \"ina\",\n        \"codes\": [\n            \"ia\",\n            \"ia-001\",\n            \"ia-FR\",\n            \"ina\"\n        ],\n        \"key\": \"ia\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Interlingua\"\n    },\n    {\n        \"alpha3\": \"iku\",\n        \"alpha3B\": \"iku\",\n        \"codes\": [\n            \"iu\",\n            \"iu-Cans\",\n            \"iu-Latn\",\n            \"iku\"\n        ],\n        \"key\": \"iu\",\n        \"languageId\": \"iu\",\n        \"name\": \"Inuktitut\"\n    },\n    {\n        \"alpha3\": \"iku\",\n        \"alpha3B\": \"iku\",\n        \"codes\": [\n            \"iu-Latn-CA\",\n            \"iu\",\n            \"iku\",\n            \"iuk\",\n            \"iuk\"\n        ],\n        \"key\": \"iu\",\n        \"languageId\": \"IUK\",\n        \"name\": \"Inuktitut (Latin)\"\n    },\n    {\n        \"alpha3\": \"iku\",\n        \"alpha3B\": \"iku\",\n        \"codes\": [\n            \"iu-Cans-CA\",\n            \"iu\",\n            \"iku\",\n            \"ius\",\n            \"ius\"\n        ],\n        \"key\": \"iu\",\n        \"languageId\": \"IUS\",\n        \"name\": \"Inuktitut (Syllabics)\"\n    },\n    {\n        \"alpha3\": \"gle\",\n        \"alpha3B\": \"gle\",\n        \"codes\": [\n            \"ga\",\n            \"ga-IE\",\n            \"gle\"\n        ],\n        \"key\": \"ga\",\n        \"languageId\": \"ga-IE\",\n        \"name\": \"Irish\"\n    },\n    {\n        \"alpha3\": \"xho\",\n        \"alpha3B\": \"xho\",\n        \"codes\": [\n            \"xh\",\n            \"xh-ZA\",\n            \"xho\",\n            \"xho\"\n        ],\n        \"key\": \"xh\",\n        \"languageId\": \"XHO\",\n        \"name\": \"isiXhosa\"\n    },\n    {\n        \"alpha3\": \"zul\",\n        \"alpha3B\": \"zul\",\n        \"codes\": [\n            \"zu\",\n            \"zu-ZA\",\n            \"zul\",\n            \"zul\"\n        ],\n        \"key\": \"zu\",\n        \"languageId\": \"ZUL\",\n        \"name\": \"isiZulu\"\n    },\n    {\n        \"alpha3\": \"ita\",\n        \"alpha3B\": \"ita\",\n        \"codes\": [\n            \"it\",\n            \"it-CH\",\n            \"it-IT\",\n            \"it-SM\",\n            \"it-VA\",\n            \"ita\"\n        ],\n        \"key\": \"it\",\n        \"languageId\": \"it-IT\",\n        \"name\": \"Italian\"\n    },\n    {\n        \"alpha3\": \"jam\",\n        \"alpha3B\": \"jam\",\n        \"codes\": [\n            \"jam\"\n        ],\n        \"key\": \"jam\",\n        \"languageId\": \"jam\",\n        \"name\": \"Jamaican Patois\"\n    },\n    {\n        \"alpha3\": \"jpn\",\n        \"alpha3B\": \"jpn\",\n        \"codes\": [\n            \"ja\",\n            \"ja-JP\",\n            \"jpn\"\n        ],\n        \"key\": \"ja\",\n        \"languageId\": \"ja\",\n        \"name\": \"Japanese\"\n    },\n    {\n        \"alpha3\": \"MISSING\",\n        \"alpha3B\": \"MISSING\",\n        \"codes\": [\n            \"jv\",\n            \"jv-Java\",\n            \"jv-Latn\",\n            \"jv-Latn-ID\"\n        ],\n        \"key\": \"jv\",\n        \"languageId\": \"jv\",\n        \"name\": \"Javanese\"\n    },\n    {\n        \"alpha3\": \"jav\",\n        \"alpha3B\": \"jav\",\n        \"codes\": [\n            \"jv-Java-ID\",\n            \"jv\",\n            \"jav\"\n        ],\n        \"key\": \"jv\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Javanese (Javanese)\"\n    },\n    {\n        \"alpha3\": \"dyo\",\n        \"alpha3B\": \"dyo\",\n        \"codes\": [\n            \"dyo\",\n            \"dyo-SN\"\n        ],\n        \"key\": \"dyo\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Jola-Fonyi\"\n    },\n    {\n        \"alpha3\": \"kea\",\n        \"alpha3B\": \"kea\",\n        \"codes\": [\n            \"kea\",\n            \"kea-CV\"\n        ],\n        \"key\": \"kea\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Kabuverdianu\"\n    },\n    {\n        \"alpha3\": \"kab\",\n        \"alpha3B\": \"kab\",\n        \"codes\": [\n            \"kab\",\n            \"kab-DZ\"\n        ],\n        \"key\": \"kab\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Kabyle\"\n    },\n    {\n        \"alpha3\": \"kkj\",\n        \"alpha3B\": \"kkj\",\n        \"codes\": [\n            \"kkj\",\n            \"kkj-CM\"\n        ],\n        \"key\": \"kkj\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Kako\"\n    },\n    {\n        \"alpha3\": \"kln\",\n        \"alpha3B\": \"kln\",\n        \"codes\": [\n            \"kln\",\n            \"kln-KE\"\n        ],\n        \"key\": \"kln\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Kalenjin\"\n    },\n    {\n        \"alpha3\": \"kam\",\n        \"alpha3B\": \"kam\",\n        \"codes\": [\n            \"kam\",\n            \"kam-KE\"\n        ],\n        \"key\": \"kam\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Kamba\"\n    },\n    {\n        \"alpha3\": \"kan\",\n        \"alpha3B\": \"kan\",\n        \"codes\": [\n            \"kn\",\n            \"kn-IN\",\n            \"kan\"\n        ],\n        \"key\": \"kn\",\n        \"languageId\": \"kn-IN\",\n        \"name\": \"Kannada\"\n    },\n    {\n        \"alpha3\": \"kau\",\n        \"alpha3B\": \"kau\",\n        \"codes\": [\n            \"kr\",\n            \"kr-NG\",\n            \"kau\"\n        ],\n        \"key\": \"kr\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Kanuri\"\n    },\n    {\n        \"alpha3\": \"kas\",\n        \"alpha3B\": \"kas\",\n        \"codes\": [\n            \"ks\",\n            \"ks-Arab\",\n            \"ks-Deva\",\n            \"kas\"\n        ],\n        \"key\": \"ks\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Kashmiri\"\n    },\n    {\n        \"alpha3\": \"kas\",\n        \"alpha3B\": \"kas\",\n        \"codes\": [\n            \"ks-Deva-IN\",\n            \"ks\",\n            \"kas\"\n        ],\n        \"key\": \"ks\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Kashmiri (Devanagari)\"\n    },\n    {\n        \"alpha3\": \"kas\",\n        \"alpha3B\": \"kas\",\n        \"codes\": [\n            \"ks-Arab-IN\",\n            \"ks\",\n            \"kas\"\n        ],\n        \"key\": \"ks\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Kashmiri (Perso-Arabic)\"\n    },\n    {\n        \"alpha3\": \"kaz\",\n        \"alpha3B\": \"kaz\",\n        \"codes\": [\n            \"kk\",\n            \"kk-KZ\",\n            \"kaz\"\n        ],\n        \"key\": \"kk\",\n        \"languageId\": \"kk-KZ\",\n        \"name\": \"Kazakh\"\n    },\n    {\n        \"alpha3\": \"khm\",\n        \"alpha3B\": \"khm\",\n        \"codes\": [\n            \"km\",\n            \"km-KH\",\n            \"khm\"\n        ],\n        \"key\": \"km\",\n        \"languageId\": \"km-KH\",\n        \"name\": \"Khmer\"\n    },\n    {\n        \"alpha3\": \"quc\",\n        \"alpha3B\": \"quc\",\n        \"codes\": [\n            \"quc\",\n            \"quc-Latn\",\n            \"quc-Latn-GT\",\n            \"qut\",\n            \"qut\"\n        ],\n        \"key\": \"quc\",\n        \"languageId\": \"QUT\",\n        \"name\": \"K'iche'\"\n    },\n    {\n        \"alpha3\": \"kik\",\n        \"alpha3B\": \"kik\",\n        \"codes\": [\n            \"ki\",\n            \"ki-KE\",\n            \"kik\"\n        ],\n        \"key\": \"ki\",\n        \"languageId\": \"ki\",\n        \"name\": \"Kikuyu\"\n    },\n    {\n        \"alpha3\": \"kin\",\n        \"alpha3B\": \"kin\",\n        \"codes\": [\n            \"rw\",\n            \"rw-RW\",\n            \"kin\"\n        ],\n        \"key\": \"rw\",\n        \"languageId\": \"rw-RW\",\n        \"name\": \"Kinyarwanda\"\n    },\n    {\n        \"alpha3\": \"kir\",\n        \"alpha3B\": \"kir\",\n        \"codes\": [\n            \"ky\",\n            \"kir\"\n        ],\n        \"key\": \"ky\",\n        \"languageId\": \"ky\",\n        \"name\": \"Kirghiz\"\n    },\n    {\n        \"alpha3\": \"swa\",\n        \"alpha3B\": \"swa\",\n        \"codes\": [\n            \"sw\",\n            \"sw-CD\",\n            \"sw-KE\",\n            \"sw-TZ\",\n            \"sw-UG\",\n            \"swa\",\n            \"swk\",\n            \"swk\"\n        ],\n        \"key\": \"sw\",\n        \"languageId\": \"SWK\",\n        \"name\": \"Kiswahili\"\n    },\n    {\n        \"alpha3\": \"kok\",\n        \"alpha3B\": \"kok\",\n        \"codes\": [\n            \"kok\",\n            \"kok-IN\",\n            \"knk\",\n            \"knk\"\n        ],\n        \"key\": \"kok\",\n        \"languageId\": \"KNK\",\n        \"name\": \"Konkani\"\n    },\n    {\n        \"alpha3\": \"kor\",\n        \"alpha3B\": \"kor\",\n        \"codes\": [\n            \"ko\",\n            \"ko-KP\",\n            \"ko-KR\",\n            \"kor\"\n        ],\n        \"key\": \"ko\",\n        \"languageId\": \"ko-KR\",\n        \"name\": \"Korean\"\n    },\n    {\n        \"alpha3\": \"khq\",\n        \"alpha3B\": \"khq\",\n        \"codes\": [\n            \"khq\",\n            \"khq-ML\"\n        ],\n        \"key\": \"khq\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Koyra Chiini\"\n    },\n    {\n        \"alpha3\": \"ses\",\n        \"alpha3B\": \"ses\",\n        \"codes\": [\n            \"ses\",\n            \"ses-ML\"\n        ],\n        \"key\": \"ses\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Koyraboro Senni\"\n    },\n    {\n        \"alpha3\": \"kur\",\n        \"alpha3B\": \"kur\",\n        \"codes\": [\n            \"ku\",\n            \"kur\"\n        ],\n        \"key\": \"ku\",\n        \"languageId\": \"ku\",\n        \"name\": \"Kurdish\"\n    },\n    {\n        \"alpha3\": \"nmg\",\n        \"alpha3B\": \"nmg\",\n        \"codes\": [\n            \"nmg\",\n            \"nmg-CM\"\n        ],\n        \"key\": \"nmg\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Kwasio\"\n    },\n    {\n        \"alpha3\": \"kir\",\n        \"alpha3B\": \"kir\",\n        \"codes\": [\n            \"ky\",\n            \"ky-KG\",\n            \"kir\",\n            \"kyr\",\n            \"kyr\"\n        ],\n        \"key\": \"ky\",\n        \"languageId\": \"KYR\",\n        \"name\": \"Kyrgyz\"\n    },\n    {\n        \"alpha3\": \"lkt\",\n        \"alpha3B\": \"lkt\",\n        \"codes\": [\n            \"lkt\",\n            \"lkt-US\"\n        ],\n        \"key\": \"lkt\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Lakota\"\n    },\n    {\n        \"alpha3\": \"lag\",\n        \"alpha3B\": \"lag\",\n        \"codes\": [\n            \"lag\",\n            \"lag-TZ\"\n        ],\n        \"key\": \"lag\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Langi\"\n    },\n    {\n        \"alpha3\": \"laj\",\n        \"alpha3B\": \"laj\",\n        \"codes\": [\n            \"laj\"\n        ],\n        \"key\": \"laj\",\n        \"languageId\": \"laj\",\n        \"name\": \"Lango\"\n    },\n    {\n        \"alpha3\": \"lao\",\n        \"alpha3B\": \"lao\",\n        \"codes\": [\n            \"lo\",\n            \"lo-LA\",\n            \"lao\",\n            \"lo-LA\"\n        ],\n        \"key\": \"lo\",\n        \"languageId\": \"lo-la\",\n        \"name\": \"Lao\"\n    },\n    {\n        \"alpha3\": \"lat\",\n        \"alpha3B\": \"lat\",\n        \"codes\": [\n            \"la\",\n            \"la-001\",\n            \"lat\"\n        ],\n        \"key\": \"la\",\n        \"languageId\": \"la\",\n        \"name\": \"Latin\"\n    },\n    {\n        \"alpha3\": \"lav\",\n        \"alpha3B\": \"lav\",\n        \"codes\": [\n            \"lv\",\n            \"lv-LV\",\n            \"lav\"\n        ],\n        \"key\": \"lv\",\n        \"languageId\": \"lv-LV\",\n        \"name\": \"Latvian\"\n    },\n    {\n        \"alpha3\": \"lin\",\n        \"alpha3B\": \"lin\",\n        \"codes\": [\n            \"ln\",\n            \"ln-AO\",\n            \"ln-CD\",\n            \"ln-CF\",\n            \"ln-CG\",\n            \"lin\"\n        ],\n        \"key\": \"ln\",\n        \"languageId\": \"ln\",\n        \"name\": \"Lingala\"\n    },\n    {\n        \"alpha3\": \"lit\",\n        \"alpha3B\": \"lit\",\n        \"codes\": [\n            \"lt\",\n            \"lt-LT\",\n            \"lit\"\n        ],\n        \"key\": \"lt\",\n        \"languageId\": \"lt-LT\",\n        \"name\": \"Lithuanian\"\n    },\n    {\n        \"alpha3\": \"nds\",\n        \"alpha3B\": \"nds\",\n        \"codes\": [\n            \"nds\",\n            \"nds-DE\",\n            \"nds-NL\"\n        ],\n        \"key\": \"nds\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Low German\"\n    },\n    {\n        \"alpha3\": \"dsb\",\n        \"alpha3B\": \"dsb\",\n        \"codes\": [\n            \"dsb-DE\",\n            \"dsb\",\n            \"dsb\"\n        ],\n        \"key\": \"dsb\",\n        \"languageId\": \"DSB\",\n        \"name\": \"Lower Sorbian\"\n    },\n    {\n        \"alpha3\": \"lub\",\n        \"alpha3B\": \"lub\",\n        \"codes\": [\n            \"lu\",\n            \"lu-CD\",\n            \"lub\"\n        ],\n        \"key\": \"lu\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Luba-Katanga\"\n    },\n    {\n        \"alpha3\": \"luo\",\n        \"alpha3B\": \"luo\",\n        \"codes\": [\n            \"luo\",\n            \"luo-KE\"\n        ],\n        \"key\": \"luo\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Luo\"\n    },\n    {\n        \"alpha3\": \"ltz\",\n        \"alpha3B\": \"ltz\",\n        \"codes\": [\n            \"lb\",\n            \"lb-LU\",\n            \"ltz\",\n            \"lbx\",\n            \"lbx\"\n        ],\n        \"key\": \"lb\",\n        \"languageId\": \"LBX\",\n        \"name\": \"Luxembourgish\"\n    },\n    {\n        \"alpha3\": \"luy\",\n        \"alpha3B\": \"luy\",\n        \"codes\": [\n            \"luy\",\n            \"luy-KE\"\n        ],\n        \"key\": \"luy\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Luyia\"\n    },\n    {\n        \"alpha3\": \"mas\",\n        \"alpha3B\": \"mas\",\n        \"codes\": [\n            \"mas\"\n        ],\n        \"key\": \"mas\",\n        \"languageId\": \"mas\",\n        \"name\": \"Maasai\"\n    },\n    {\n        \"alpha3\": \"mkd\",\n        \"alpha3B\": \"mac\",\n        \"codes\": [\n            \"mk\",\n            \"mk-MK\",\n            \"mkd\",\n            \"mac\",\n            \"mas\"\n        ],\n        \"key\": \"mk\",\n        \"languageId\": \"mk-MK\",\n        \"name\": \"Macedonian\"\n    },\n    {\n        \"alpha3\": \"jmc\",\n        \"alpha3B\": \"jmc\",\n        \"codes\": [\n            \"jmc\",\n            \"jmc-TZ\"\n        ],\n        \"key\": \"jmc\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Machame\"\n    },\n    {\n        \"alpha3\": \"mgh\",\n        \"alpha3B\": \"mgh\",\n        \"codes\": [\n            \"mgh\",\n            \"mgh-MZ\"\n        ],\n        \"key\": \"mgh\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Makhuwa-Meetto\"\n    },\n    {\n        \"alpha3\": \"kde\",\n        \"alpha3B\": \"kde\",\n        \"codes\": [\n            \"kde\",\n            \"kde-TZ\"\n        ],\n        \"key\": \"kde\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Makonde\"\n    },\n    {\n        \"alpha3\": \"mlg\",\n        \"alpha3B\": \"mlg\",\n        \"codes\": [\n            \"mg\",\n            \"mg-MG\",\n            \"mlg\"\n        ],\n        \"key\": \"mg\",\n        \"languageId\": \"mg-MG\",\n        \"name\": \"Malagasy\"\n    },\n    {\n        \"alpha3\": \"msa\",\n        \"alpha3B\": \"may\",\n        \"codes\": [\n            \"ms\",\n            \"ms-BN\",\n            \"ms-MY\",\n            \"ms-SG\",\n            \"msa\",\n            \"may\"\n        ],\n        \"key\": \"ms\",\n        \"languageId\": \"ms\",\n        \"name\": \"Malay\"\n    },\n    {\n        \"alpha3\": \"mal\",\n        \"alpha3B\": \"mal\",\n        \"codes\": [\n            \"ml\",\n            \"ml-IN\",\n            \"mal\"\n        ],\n        \"key\": \"ml\",\n        \"languageId\": \"ml-IN\",\n        \"name\": \"Malayalam\"\n    },\n    {\n        \"alpha3\": \"poz\",\n        \"alpha3B\": \"poz\",\n        \"codes\": [\n            \"poz\"\n        ],\n        \"key\": \"poz\",\n        \"languageId\": \"poz\",\n        \"name\": \"Malayo-Polynesian\"\n    },\n    {\n        \"alpha3\": \"mlt\",\n        \"alpha3B\": \"mlt\",\n        \"codes\": [\n            \"mt\",\n            \"mt-MT\",\n            \"mlt\"\n        ],\n        \"key\": \"mt\",\n        \"languageId\": \"mt-MT\",\n        \"name\": \"Maltese\"\n    },\n    {\n        \"alpha3\": \"mni\",\n        \"alpha3B\": \"mni\",\n        \"codes\": [\n            \"mni\",\n            \"mni-IN\"\n        ],\n        \"key\": \"mni\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Manipuri\"\n    },\n    {\n        \"alpha3\": \"glv\",\n        \"alpha3B\": \"glv\",\n        \"codes\": [\n            \"gv\",\n            \"gv-IM\",\n            \"glv\"\n        ],\n        \"key\": \"gv\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Manx\"\n    },\n    {\n        \"alpha3\": \"mri\",\n        \"alpha3B\": \"mao\",\n        \"codes\": [\n            \"mi\",\n            \"mi-NZ\",\n            \"mri\",\n            \"mao\",\n            \"mri\"\n        ],\n        \"key\": \"mi\",\n        \"languageId\": \"MRI\",\n        \"name\": \"Maori\"\n    },\n    {\n        \"alpha3\": \"arn\",\n        \"alpha3B\": \"arn\",\n        \"codes\": [\n            \"arn\",\n            \"arn-CL\",\n            \"mpd\",\n            \"mpd\"\n        ],\n        \"key\": \"arn\",\n        \"languageId\": \"MPD\",\n        \"name\": \"Mapudungun\"\n    },\n    {\n        \"alpha3\": \"mar\",\n        \"alpha3B\": \"mar\",\n        \"codes\": [\n            \"mr\",\n            \"mr-IN\",\n            \"mar\"\n        ],\n        \"key\": \"mr\",\n        \"languageId\": \"mr\",\n        \"name\": \"Marathi\"\n    },\n    {\n        \"alpha3\": \"mas\",\n        \"alpha3B\": \"mas\",\n        \"codes\": [\n            \"mas\",\n            \"mas-KE\",\n            \"mas-TZ\"\n        ],\n        \"key\": \"mas\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Masai\"\n    },\n    {\n        \"alpha3\": \"myn\",\n        \"alpha3B\": \"myn\",\n        \"codes\": [\n            \"myn\"\n        ],\n        \"key\": \"myn\",\n        \"languageId\": \"myn\",\n        \"name\": \"Maya\"\n    },\n    {\n        \"alpha3\": \"mzn\",\n        \"alpha3B\": \"mzn\",\n        \"codes\": [\n            \"mzn\",\n            \"mzn-IR\"\n        ],\n        \"key\": \"mzn\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Mazanderani\"\n    },\n    {\n        \"alpha3\": \"men\",\n        \"alpha3B\": \"men\",\n        \"codes\": [\n            \"men\"\n        ],\n        \"key\": \"men\",\n        \"languageId\": \"men\",\n        \"name\": \"Mende\"\n    },\n    {\n        \"alpha3\": \"mer\",\n        \"alpha3B\": \"mer\",\n        \"codes\": [\n            \"mer\",\n            \"mer-KE\"\n        ],\n        \"key\": \"mer\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Meru\"\n    },\n    {\n        \"alpha3\": \"mgo\",\n        \"alpha3B\": \"mgo\",\n        \"codes\": [\n            \"mgo\",\n            \"mgo-CM\"\n        ],\n        \"key\": \"mgo\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Metaʼ\"\n    },\n    {\n        \"alpha3\": \"moh\",\n        \"alpha3B\": \"moh\",\n        \"codes\": [\n            \"moh\",\n            \"moh-CA\",\n            \"mwk\",\n            \"mwk\"\n        ],\n        \"key\": \"moh\",\n        \"languageId\": \"MWK\",\n        \"name\": \"Mohawk\"\n    },\n    {\n        \"alpha3\": \"mon\",\n        \"alpha3B\": \"mon\",\n        \"codes\": [\n            \"mn\",\n            \"mn-Cyrl\",\n            \"mn-MN\",\n            \"mn-Mong\",\n            \"mon\"\n        ],\n        \"key\": \"mn\",\n        \"languageId\": \"mn\",\n        \"name\": \"Mongolian\"\n    },\n    {\n        \"alpha3\": \"mon\",\n        \"alpha3B\": \"mon\",\n        \"codes\": [\n            \"mn-Mong-CN\",\n            \"mn-Mong-MN\",\n            \"mn\",\n            \"mon\",\n            \"mng\",\n            \"mng\"\n        ],\n        \"key\": \"mn\",\n        \"languageId\": \"MNG\",\n        \"name\": \"Mongolian (Traditional Mongolian)\"\n    },\n    {\n        \"alpha3\": \"MNE\",\n        \"alpha3B\": \"MNE\",\n        \"codes\": [\n            \"me\",\n            \"mne\",\n            \"mne\"\n        ],\n        \"key\": \"me\",\n        \"languageId\": \"me\",\n        \"name\": \"Montenegrin\"\n    },\n    {\n        \"alpha3\": \"mfe\",\n        \"alpha3B\": \"mfe\",\n        \"codes\": [\n            \"mfe\",\n            \"mfe-MU\"\n        ],\n        \"key\": \"mfe\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Morisyen\"\n    },\n    {\n        \"alpha3\": \"mua\",\n        \"alpha3B\": \"mua\",\n        \"codes\": [\n            \"mua\",\n            \"mua-CM\"\n        ],\n        \"key\": \"mua\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Mundang\"\n    },\n    {\n        \"alpha3\": \"naq\",\n        \"alpha3B\": \"naq\",\n        \"codes\": [\n            \"naq\",\n            \"naq-NA\"\n        ],\n        \"key\": \"naq\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Nama\"\n    },\n    {\n        \"alpha3\": \"nep\",\n        \"alpha3B\": \"nep\",\n        \"codes\": [\n            \"ne\",\n            \"ne-IN\",\n            \"ne-NP\",\n            \"nep\"\n        ],\n        \"key\": \"ne\",\n        \"languageId\": \"ne\",\n        \"name\": \"Nepali\"\n    },\n    {\n        \"alpha3\": \"new\",\n        \"alpha3B\": \"new\",\n        \"codes\": [\n            \"new\"\n        ],\n        \"key\": \"new\",\n        \"languageId\": \"new\",\n        \"name\": \"Newari\"\n    },\n    {\n        \"alpha3\": \"nnh\",\n        \"alpha3B\": \"nnh\",\n        \"codes\": [\n            \"nnh\",\n            \"nnh-CM\"\n        ],\n        \"key\": \"nnh\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Ngiemboon\"\n    },\n    {\n        \"alpha3\": \"jgo\",\n        \"alpha3B\": \"jgo\",\n        \"codes\": [\n            \"jgo\",\n            \"jgo-CM\"\n        ],\n        \"key\": \"jgo\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Ngomba\"\n    },\n    {\n        \"alpha3\": \"nqo\",\n        \"alpha3B\": \"nqo\",\n        \"codes\": [\n            \"nqo\",\n            \"nqo-GN\",\n            \"nqo\"\n        ],\n        \"key\": \"nqo\",\n        \"languageId\": \"NQO\",\n        \"name\": \"N'ko\"\n    },\n    {\n        \"alpha3\": \"zxx\",\n        \"alpha3B\": \"zxx\",\n        \"codes\": [\n            \"zxx\"\n        ],\n        \"key\": \"zxx\",\n        \"languageId\": \"zxx\",\n        \"name\": \"None\"\n    },\n    {\n        \"alpha3\": \"nde\",\n        \"alpha3B\": \"nde\",\n        \"codes\": [\n            \"nd\",\n            \"nd-ZW\",\n            \"nde\"\n        ],\n        \"key\": \"nd\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"North Ndebele\"\n    },\n    {\n        \"alpha3\": \"lrc\",\n        \"alpha3B\": \"lrc\",\n        \"codes\": [\n            \"lrc\",\n            \"lrc-IQ\",\n            \"lrc-IR\"\n        ],\n        \"key\": \"lrc\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Northern Luri\"\n    },\n    {\n        \"alpha3\": \"sme\",\n        \"alpha3B\": \"sme\",\n        \"codes\": [\n            \"se\",\n            \"se-FI\",\n            \"se-NO\",\n            \"se-SE\",\n            \"sma\",\n            \"smj\",\n            \"smn\",\n            \"sms\",\n            \"sme\",\n            \"sme\"\n        ],\n        \"key\": \"se\",\n        \"languageId\": \"SME\",\n        \"name\": \"Northern Sami\"\n    },\n    {\n        \"alpha3\": \"nob\",\n        \"alpha3B\": \"nob\",\n        \"codes\": [\n            \"nb\",\n            \"nn\",\n            \"no\",\n            \"nno\",\n            \"nob\",\n            \"nor\",\n            \"nor\",\n            \"no-NO\"\n        ],\n        \"key\": \"nb\",\n        \"languageId\": \"NOR\",\n        \"name\": \"Norwegian\"\n    },\n    {\n        \"alpha3\": \"nob\",\n        \"alpha3B\": \"nob\",\n        \"codes\": [\n            \"nb\",\n            \"nob\"\n        ],\n        \"key\": \"nb\",\n        \"languageId\": \"nb\",\n        \"name\": \"Norwegian (Bokmal)\"\n    },\n    {\n        \"alpha3\": \"nno\",\n        \"alpha3B\": \"nno\",\n        \"codes\": [\n            \"nn\",\n            \"nno\",\n            \"nn-NO\",\n            \"nor\",\n            \"no\"\n        ],\n        \"key\": \"nn\",\n        \"languageId\": \"nn-NO\",\n        \"name\": \"Norwegian (Nynorsk)\"\n    },\n    {\n        \"alpha3\": \"nob\",\n        \"alpha3B\": \"nob\",\n        \"codes\": [\n            \"nb-NO\",\n            \"nb-SJ\",\n            \"nb\",\n            \"nob\",\n            \"nor\",\n            \"nor\"\n        ],\n        \"key\": \"nb\",\n        \"languageId\": \"NOR\",\n        \"name\": \"Norwegian Bokmål\"\n    },\n    {\n        \"alpha3\": \"nno\",\n        \"alpha3B\": \"nno\",\n        \"codes\": [\n            \"nn-NO\",\n            \"nn\",\n            \"nno\",\n            \"non\",\n            \"non\"\n        ],\n        \"key\": \"nn\",\n        \"languageId\": \"NON\",\n        \"name\": \"Norwegian Nynorsk\"\n    },\n    {\n        \"alpha3\": \"nus\",\n        \"alpha3B\": \"nus\",\n        \"codes\": [\n            \"nus\",\n            \"nus-SS\"\n        ],\n        \"key\": \"nus\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Nuer\"\n    },\n    {\n        \"alpha3\": \"nyn\",\n        \"alpha3B\": \"nyn\",\n        \"codes\": [\n            \"nyn\",\n            \"nyn-UG\"\n        ],\n        \"key\": \"nyn\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Nyankole\"\n    },\n    {\n        \"alpha3\": \"oci\",\n        \"alpha3B\": \"oci\",\n        \"codes\": [\n            \"oc\",\n            \"oc-FR\",\n            \"oci\",\n            \"oci\"\n        ],\n        \"key\": \"oc\",\n        \"languageId\": \"OCI\",\n        \"name\": \"Occitan\"\n    },\n    {\n        \"alpha3\": \"ori\",\n        \"alpha3B\": \"ori\",\n        \"codes\": [\n            \"or\",\n            \"or-IN\",\n            \"ori\",\n            \"ori\"\n        ],\n        \"key\": \"or\",\n        \"languageId\": \"ORI\",\n        \"name\": \"Odia\"\n    },\n    {\n        \"alpha3\": \"orm\",\n        \"alpha3B\": \"orm\",\n        \"codes\": [\n            \"om\",\n            \"om-ET\",\n            \"om-KE\",\n            \"orm\",\n            \"orm\"\n        ],\n        \"key\": \"om\",\n        \"languageId\": \"ORM\",\n        \"name\": \"Oromo\"\n    },\n    {\n        \"alpha3\": \"oss\",\n        \"alpha3B\": \"oss\",\n        \"codes\": [\n            \"os\",\n            \"os-GE\",\n            \"os-RU\",\n            \"oss\"\n        ],\n        \"key\": \"os\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Ossetic\"\n    },\n    {\n        \"alpha3\": \"pap\",\n        \"alpha3B\": \"pap\",\n        \"codes\": [\n            \"pap\",\n            \"pap-029\"\n        ],\n        \"key\": \"pap\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Papiamento\"\n    },\n    {\n        \"alpha3\": \"pus\",\n        \"alpha3B\": \"pus\",\n        \"codes\": [\n            \"ps\",\n            \"ps-AF\",\n            \"pus\"\n        ],\n        \"key\": \"ps\",\n        \"languageId\": \"ps\",\n        \"name\": \"Pashto\"\n    },\n    {\n        \"alpha3\": \"fas\",\n        \"alpha3B\": \"per\",\n        \"codes\": [\n            \"fa\",\n            \"fa-IR\",\n            \"fas\",\n            \"per\"\n        ],\n        \"key\": \"fa\",\n        \"languageId\": \"fa-IR\",\n        \"name\": \"Persian\"\n    },\n    {\n        \"alpha3\": \"pol\",\n        \"alpha3B\": \"pol\",\n        \"codes\": [\n            \"pl\",\n            \"pl-PL\",\n            \"pol\"\n        ],\n        \"key\": \"pl\",\n        \"languageId\": \"pl-PL\",\n        \"name\": \"Polish\"\n    },\n    {\n        \"alpha3\": \"por\",\n        \"alpha3B\": \"por\",\n        \"codes\": [\n            \"pt\",\n            \"pt-AO\",\n            \"pt-BR\",\n            \"pt-CH\",\n            \"pt-CV\",\n            \"pt-GQ\",\n            \"pt-GW\",\n            \"pt-LU\",\n            \"pt-MO\",\n            \"pt-MZ\",\n            \"pt-PT\",\n            \"pt-ST\",\n            \"pt-TL\",\n            \"por\",\n            \"bpo\",\n            \"pte\"\n        ],\n        \"key\": \"pt\",\n        \"languageId\": \"pt\",\n        \"name\": \"Portuguese\"\n    },\n    {\n        \"alpha3\": \"por\",\n        \"alpha3B\": \"por\",\n        \"codes\": [\n            \"pb\",\n            \"pt-BR\",\n            \"bpt\",\n            \"por\",\n            \"bpo\"\n        ],\n        \"key\": \"pt-BR\",\n        \"languageId\": \"pt-BR\",\n        \"name\": \"Portuguese (BR)\"\n    },\n    {\n        \"alpha3\": \"prg\",\n        \"alpha3B\": \"prg\",\n        \"codes\": [\n            \"prg\",\n            \"prg-001\"\n        ],\n        \"key\": \"prg\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Prussian\"\n    },\n    {\n        \"alpha3\": \"pan\",\n        \"alpha3B\": \"pan\",\n        \"codes\": [\n            \"pa\",\n            \"pa-Arab\",\n            \"pa-Arab-PK\",\n            \"pa-Guru\",\n            \"pa-IN\",\n            \"pan\"\n        ],\n        \"key\": \"pa\",\n        \"languageId\": \"pa\",\n        \"name\": \"Punjabi\"\n    },\n    {\n        \"alpha3\": \"qub\",\n        \"alpha3B\": \"qub\",\n        \"codes\": [\n            \"quz\",\n            \"quz-BO\",\n            \"quz-EC\",\n            \"quz-PE\",\n            \"qub\",\n            \"qub\"\n        ],\n        \"key\": \"quz\",\n        \"languageId\": \"QUB\",\n        \"name\": \"Quechua\"\n    },\n    {\n        \"alpha3\": \"ron\",\n        \"alpha3B\": \"rum\",\n        \"codes\": [\n            \"ro\",\n            \"ro-MD\",\n            \"ro-RO\",\n            \"ron\",\n            \"rum\"\n        ],\n        \"key\": \"ro\",\n        \"languageId\": \"ro\",\n        \"name\": \"Romanian\"\n    },\n    {\n        \"alpha3\": \"roh\",\n        \"alpha3B\": \"roh\",\n        \"codes\": [\n            \"rm\",\n            \"rm-CH\",\n            \"roh\"\n        ],\n        \"key\": \"rm\",\n        \"languageId\": \"rm-CH\",\n        \"name\": \"Romansh\"\n    },\n    {\n        \"alpha3\": \"rom\",\n        \"alpha3B\": \"rom\",\n        \"codes\": [\n            \"rom\"\n        ],\n        \"key\": \"rom\",\n        \"languageId\": \"rom\",\n        \"name\": \"Romany\"\n    },\n    {\n        \"alpha3\": \"rof\",\n        \"alpha3B\": \"rof\",\n        \"codes\": [\n            \"rof\",\n            \"rof-TZ\"\n        ],\n        \"key\": \"rof\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Rombo\"\n    },\n    {\n        \"alpha3\": \"run\",\n        \"alpha3B\": \"run\",\n        \"codes\": [\n            \"rn\",\n            \"rn-BI\",\n            \"run\"\n        ],\n        \"key\": \"rn\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Rundi\"\n    },\n    {\n        \"alpha3\": \"rus\",\n        \"alpha3B\": \"rus\",\n        \"codes\": [\n            \"ru\",\n            \"ru-BY\",\n            \"ru-KG\",\n            \"ru-KZ\",\n            \"ru-MD\",\n            \"ru-RU\",\n            \"ru-UA\",\n            \"rus\"\n        ],\n        \"key\": \"ru\",\n        \"languageId\": \"ru\",\n        \"name\": \"Russian\"\n    },\n    {\n        \"alpha3\": \"rwk\",\n        \"alpha3B\": \"rwk\",\n        \"codes\": [\n            \"rwk\",\n            \"rwk-TZ\"\n        ],\n        \"key\": \"rwk\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Rwa\"\n    },\n    {\n        \"alpha3\": \"ssy\",\n        \"alpha3B\": \"ssy\",\n        \"codes\": [\n            \"ssy\",\n            \"ssy-ER\"\n        ],\n        \"key\": \"ssy\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Saho\"\n    },\n    {\n        \"alpha3\": \"sah\",\n        \"alpha3B\": \"sah\",\n        \"codes\": [\n            \"sah\",\n            \"sah-RU\",\n            \"sah\"\n        ],\n        \"key\": \"sah\",\n        \"languageId\": \"SAH\",\n        \"name\": \"Sakha\"\n    },\n    {\n        \"alpha3\": \"saq\",\n        \"alpha3B\": \"saq\",\n        \"codes\": [\n            \"saq\",\n            \"saq-KE\"\n        ],\n        \"key\": \"saq\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Samburu\"\n    },\n    {\n        \"alpha3\": \"smi\",\n        \"alpha3B\": \"smi\",\n        \"codes\": [\n            \"smi\"\n        ],\n        \"key\": \"smi\",\n        \"languageId\": \"smi\",\n        \"name\": \"Sami\"\n    },\n    {\n        \"alpha3\": \"smn\",\n        \"alpha3B\": \"smn\",\n        \"codes\": [\n            \"smn-FI\",\n            \"smn\",\n            \"smn\"\n        ],\n        \"key\": \"smn\",\n        \"languageId\": \"SMN\",\n        \"name\": \"Sami (Inari)\"\n    },\n    {\n        \"alpha3\": \"smj\",\n        \"alpha3B\": \"smj\",\n        \"codes\": [\n            \"smj-NO\",\n            \"smj-SE\",\n            \"smj\",\n            \"smj\"\n        ],\n        \"key\": \"smj\",\n        \"languageId\": \"SMJ\",\n        \"name\": \"Sami (Lule)\"\n    },\n    {\n        \"alpha3\": \"sms\",\n        \"alpha3B\": \"sms\",\n        \"codes\": [\n            \"sms-FI\",\n            \"sms\",\n            \"sms\"\n        ],\n        \"key\": \"sms\",\n        \"languageId\": \"SMS\",\n        \"name\": \"Sami (Skolt)\"\n    },\n    {\n        \"alpha3\": \"sma\",\n        \"alpha3B\": \"sma\",\n        \"codes\": [\n            \"sma-NO\",\n            \"sma-SE\",\n            \"sma\",\n            \"sma\"\n        ],\n        \"key\": \"sma\",\n        \"languageId\": \"SMA\",\n        \"name\": \"Sami (Southern)\"\n    },\n    {\n        \"alpha3\": \"sag\",\n        \"alpha3B\": \"sag\",\n        \"codes\": [\n            \"sg\",\n            \"sg-CF\",\n            \"sag\"\n        ],\n        \"key\": \"sg\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Sango\"\n    },\n    {\n        \"alpha3\": \"sbp\",\n        \"alpha3B\": \"sbp\",\n        \"codes\": [\n            \"sbp\",\n            \"sbp-TZ\"\n        ],\n        \"key\": \"sbp\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Sangu\"\n    },\n    {\n        \"alpha3\": \"san\",\n        \"alpha3B\": \"san\",\n        \"codes\": [\n            \"sa\",\n            \"sa-IN\",\n            \"san\"\n        ],\n        \"key\": \"sa\",\n        \"languageId\": \"sa\",\n        \"name\": \"Sanskrit\"\n    },\n    {\n        \"alpha3\": \"gla\",\n        \"alpha3B\": \"gla\",\n        \"codes\": [\n            \"gd\",\n            \"gd-GB\",\n            \"gla\"\n        ],\n        \"key\": \"gd\",\n        \"languageId\": \"gd\",\n        \"name\": \"Scottish Gaelic\"\n    },\n    {\n        \"alpha3\": \"seh\",\n        \"alpha3B\": \"seh\",\n        \"codes\": [\n            \"seh\",\n            \"seh-MZ\"\n        ],\n        \"key\": \"seh\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Sena\"\n    },\n    {\n        \"alpha3\": \"srp\",\n        \"alpha3B\": \"srp\",\n        \"codes\": [\n            \"sr\",\n            \"sr-Cyrl\",\n            \"sr-Latn\",\n            \"srp\",\n            \"ser\"\n        ],\n        \"key\": \"sr\",\n        \"languageId\": \"sr\",\n        \"name\": \"Serbian\"\n    },\n    {\n        \"alpha3\": \"srp\",\n        \"alpha3B\": \"srp\",\n        \"codes\": [\n            \"sr-Cyrl-BA\",\n            \"sr-Cyrl-ME\",\n            \"sr-Cyrl-RS\",\n            \"sr-Cyrl-XK\",\n            \"sr-Cyrl\",\n            \"srp\"\n        ],\n        \"key\": \"sr-Cyrl\",\n        \"languageId\": \"sr-Cyrl\",\n        \"name\": \"Serbian (Cyrillic)\"\n    },\n    {\n        \"alpha3\": \"sr-Latn\",\n        \"alpha3B\": \"sr-Latn\",\n        \"codes\": [\n            \"sr-Latn-BA\",\n            \"sr-Latn-ME\",\n            \"sr-Latn-RS\",\n            \"sr-Latn-XK\",\n            \"sr-Latn\"\n        ],\n        \"key\": \"sr-Latn\",\n        \"languageId\": \"sr-Latn\",\n        \"name\": \"Serbian (Latin)\"\n    },\n    {\n        \"alpha3\": \"sot\",\n        \"alpha3B\": \"sot\",\n        \"codes\": [\n            \"st\",\n            \"st-LS\",\n            \"st-ZA\",\n            \"sot\",\n            \"sot\"\n        ],\n        \"key\": \"st\",\n        \"languageId\": \"SOT\",\n        \"name\": \"Sesotho\"\n    },\n    {\n        \"alpha3\": \"nso\",\n        \"alpha3B\": \"nso\",\n        \"codes\": [\n            \"nso\",\n            \"nso-ZA\",\n            \"nso\"\n        ],\n        \"key\": \"nso\",\n        \"languageId\": \"NSO\",\n        \"name\": \"Sesotho sa Leboa\"\n    },\n    {\n        \"alpha3\": \"tsn\",\n        \"alpha3B\": \"tsn\",\n        \"codes\": [\n            \"tn\",\n            \"tn-BW\",\n            \"tn-ZA\",\n            \"tsn\",\n            \"tsn\"\n        ],\n        \"key\": \"tn\",\n        \"languageId\": \"TSN\",\n        \"name\": \"Setswana\"\n    },\n    {\n        \"alpha3\": \"ksb\",\n        \"alpha3B\": \"ksb\",\n        \"codes\": [\n            \"ksb\",\n            \"ksb-TZ\"\n        ],\n        \"key\": \"ksb\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Shambala\"\n    },\n    {\n        \"alpha3\": \"sna\",\n        \"alpha3B\": \"sna\",\n        \"codes\": [\n            \"sn\",\n            \"sn-Latn\",\n            \"sna\",\n            \"sna\"\n        ],\n        \"key\": \"sn\",\n        \"languageId\": \"SNA\",\n        \"name\": \"Shona\"\n    },\n    {\n        \"alpha3\": \"sna\",\n        \"alpha3B\": \"sna\",\n        \"codes\": [\n            \"sn-Latn-ZW\",\n            \"sn\",\n            \"sna\",\n            \"sna\"\n        ],\n        \"key\": \"sn\",\n        \"languageId\": \"SNA\",\n        \"name\": \"Shona (Latin)\"\n    },\n    {\n        \"alpha3\": \"snd\",\n        \"alpha3B\": \"snd\",\n        \"codes\": [\n            \"sd\",\n            \"sd-Arab\",\n            \"sd-Arab-PK\",\n            \"sd-Deva\",\n            \"snd\",\n            \"sip\",\n            \"sip\"\n        ],\n        \"key\": \"sd\",\n        \"languageId\": \"SIP\",\n        \"name\": \"Sindhi\"\n    },\n    {\n        \"alpha3\": \"snd\",\n        \"alpha3B\": \"snd\",\n        \"codes\": [\n            \"sd-Deva-IN\",\n            \"sd\",\n            \"snd\"\n        ],\n        \"key\": \"sd\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Sindhi (Devanagari)\"\n    },\n    {\n        \"alpha3\": \"sin\",\n        \"alpha3B\": \"sin\",\n        \"codes\": [\n            \"si\",\n            \"si-LK\",\n            \"sin\"\n        ],\n        \"key\": \"si\",\n        \"languageId\": \"si\",\n        \"name\": \"Sinhala\"\n    },\n    {\n        \"alpha3\": \"ssw\",\n        \"alpha3B\": \"ssw\",\n        \"codes\": [\n            \"ss\",\n            \"ss-SZ\",\n            \"ss-ZA\",\n            \"ssw\"\n        ],\n        \"key\": \"ss\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"siSwati\"\n    },\n    {\n        \"alpha3\": \"chu\",\n        \"alpha3B\": \"chu\",\n        \"codes\": [\n            \"cu\",\n            \"cu-RU\",\n            \"chu\",\n            \"sla\"\n        ],\n        \"key\": \"cu\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Slavic\"\n    },\n    {\n        \"alpha3\": \"slk\",\n        \"alpha3B\": \"slo\",\n        \"codes\": [\n            \"sk\",\n            \"sk-SK\",\n            \"slk\",\n            \"slo\"\n        ],\n        \"key\": \"sk\",\n        \"languageId\": \"sk-SK\",\n        \"name\": \"Slovak\"\n    },\n    {\n        \"alpha3\": \"slv\",\n        \"alpha3B\": \"slv\",\n        \"codes\": [\n            \"sl\",\n            \"sl-SI\",\n            \"slv\",\n            \"sln\"\n        ],\n        \"key\": \"sl\",\n        \"languageId\": \"sl\",\n        \"name\": \"Slovenian\"\n    },\n    {\n        \"alpha3\": \"xog\",\n        \"alpha3B\": \"xog\",\n        \"codes\": [\n            \"xog\",\n            \"xog-UG\"\n        ],\n        \"key\": \"xog\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Soga\"\n    },\n    {\n        \"alpha3\": \"som\",\n        \"alpha3B\": \"som\",\n        \"codes\": [\n            \"so\",\n            \"so-DJ\",\n            \"so-ET\",\n            \"so-KE\",\n            \"so-SO\",\n            \"som\"\n        ],\n        \"key\": \"so\",\n        \"languageId\": \"so\",\n        \"name\": \"Somali\"\n    },\n    {\n        \"alpha3\": \"son\",\n        \"alpha3B\": \"son\",\n        \"codes\": [\n            \"son\"\n        ],\n        \"key\": \"son\",\n        \"languageId\": \"son\",\n        \"name\": \"Songhai\"\n    },\n    {\n        \"alpha3\": \"nbl\",\n        \"alpha3B\": \"nbl\",\n        \"codes\": [\n            \"nr\",\n            \"nr-ZA\",\n            \"nbl\"\n        ],\n        \"key\": \"nr\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"South Ndebele\"\n    },\n    {\n        \"alpha3\": \"spa\",\n        \"alpha3B\": \"spa\",\n        \"codes\": [\n            \"es\",\n            \"es-419\",\n            \"es-AR\",\n            \"es-BO\",\n            \"es-BR\",\n            \"es-BZ\",\n            \"es-CL\",\n            \"es-CO\",\n            \"es-CR\",\n            \"es-CU\",\n            \"es-DO\",\n            \"es-EC\",\n            \"es-ES\",\n            \"es-GQ\",\n            \"es-GT\",\n            \"es-HN\",\n            \"es-MX\",\n            \"es-NI\",\n            \"es-PA\",\n            \"es-PE\",\n            \"es-PH\",\n            \"es-PR\",\n            \"es-PY\",\n            \"es-SV\",\n            \"es-US\",\n            \"es-UY\",\n            \"es-VE\",\n            \"spa\",\n            \"las\"\n        ],\n        \"key\": \"es\",\n        \"languageId\": \"es\",\n        \"name\": \"Spanish\"\n    },\n    {\n        \"alpha3\": \"EAG\",\n        \"alpha3B\": \"EAG\",\n        \"codes\": [\n            \"es\",\n            \"es-AR\",\n            \"eag\",\n            \"spa\",\n            \"eag\"\n        ],\n        \"key\": \"es-AR\",\n        \"languageId\": \"es-AR\",\n        \"name\": \"Spanish (Argentinian)\"\n    },\n    {\n        \"alpha3\": \"spa\",\n        \"alpha3B\": \"spa\",\n        \"codes\": [\n            \"es\",\n            \"es-ES\",\n            \"spa\",\n            \"csp\"\n        ],\n        \"key\": \"es-ES\",\n        \"languageId\": \"es-ES\",\n        \"name\": \"Spanish (Castilian)\"\n    },\n    {\n        \"alpha3\": \"ECH\",\n        \"alpha3B\": \"ECH\",\n        \"codes\": [\n            \"es\",\n            \"es-CL\",\n            \"eag\",\n            \"spa\",\n            \"ech\",\n            \"ech\"\n        ],\n        \"key\": \"es-CL\",\n        \"languageId\": \"es-CL\",\n        \"name\": \"Spanish (Chilean)\"\n    },\n    {\n        \"alpha3\": \"LAS\",\n        \"alpha3B\": \"LAS\",\n        \"codes\": [\n            \"es\",\n            \"es-419\",\n            \"eag\",\n            \"spa\",\n            \"las\",\n            \"las\"\n        ],\n        \"key\": \"es-419\",\n        \"languageId\": \"es-419\",\n        \"name\": \"Spanish (Latin American)\"\n    },\n    {\n        \"alpha3\": \"spa\",\n        \"alpha3B\": \"spa\",\n        \"codes\": [\n            \"es-MX\",\n            \"spa\",\n            \"emx\"\n        ],\n        \"key\": \"es-MX\",\n        \"languageId\": \"es-MX\",\n        \"name\": \"Spanish (Mexico)\"\n    },\n    {\n        \"alpha3\": \"spa\",\n        \"alpha3B\": \"spa\",\n        \"codes\": [\n            \"es-EM\",\n            \"spa\",\n            \"es\"\n        ],\n        \"key\": \"es-EM\",\n        \"languageId\": \"es\",\n        \"name\": \"Spanish (Neutral)\"\n    },\n    {\n        \"alpha3\": \"zgh\",\n        \"alpha3B\": \"zgh\",\n        \"codes\": [\n            \"zgh\",\n            \"zgh-Tfng\",\n            \"zhg\",\n            \"zhg\"\n        ],\n        \"key\": \"zgh\",\n        \"languageId\": \"ZHG\",\n        \"name\": \"Standard Moroccan Tamazight\"\n    },\n    {\n        \"alpha3\": \"zgh\",\n        \"alpha3B\": \"zgh\",\n        \"codes\": [\n            \"zgh-Tfng-MA\",\n            \"zgh\",\n            \"zhg\",\n            \"zhg\"\n        ],\n        \"key\": \"zgh\",\n        \"languageId\": \"ZHG\",\n        \"name\": \"Standard Moroccan Tamazight (Tifinagh)\"\n    },\n    {\n        \"alpha3\": \"apd\",\n        \"alpha3B\": \"apd\",\n        \"codes\": [\n            \"apd\"\n        ],\n        \"key\": \"apd\",\n        \"languageId\": \"apd\",\n        \"name\": \"Sudanese Arabic\"\n    },\n    {\n        \"alpha3\": \"swe\",\n        \"alpha3B\": \"swe\",\n        \"codes\": [\n            \"sv\",\n            \"sv-AX\",\n            \"sv-FI\",\n            \"sv-SE\",\n            \"swe\"\n        ],\n        \"key\": \"sv\",\n        \"languageId\": \"sv\",\n        \"name\": \"Swedish\"\n    },\n    {\n        \"alpha3\": \"gsw\",\n        \"alpha3B\": \"gsw\",\n        \"codes\": [\n            \"gsw\",\n            \"gsw-CH\",\n            \"gsw-FR\",\n            \"gsw-LI\"\n        ],\n        \"key\": \"gsw\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Swiss German\"\n    },\n    {\n        \"alpha3\": \"gsw\",\n        \"alpha3B\": \"gsw\",\n        \"codes\": [\n            \"gsw\"\n        ],\n        \"key\": \"gsw\",\n        \"languageId\": \"gsw\",\n        \"name\": \"Swiss-German\"\n    },\n    {\n        \"alpha3\": \"syr\",\n        \"alpha3B\": \"syr\",\n        \"codes\": [\n            \"syr\",\n            \"syr-SY\",\n            \"syr\"\n        ],\n        \"key\": \"syr\",\n        \"languageId\": \"SYR\",\n        \"name\": \"Syriac\"\n    },\n    {\n        \"alpha3\": \"shi\",\n        \"alpha3B\": \"shi\",\n        \"codes\": [\n            \"shi\",\n            \"shi-Latn\",\n            \"shi-Tfng\"\n        ],\n        \"key\": \"shi\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Tachelhit\"\n    },\n    {\n        \"alpha3\": \"shi\",\n        \"alpha3B\": \"shi\",\n        \"codes\": [\n            \"shi-Latn-MA\",\n            \"shi\"\n        ],\n        \"key\": \"shi\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Tachelhit (Latin)\"\n    },\n    {\n        \"alpha3\": \"shi\",\n        \"alpha3B\": \"shi\",\n        \"codes\": [\n            \"shi-Tfng-MA\",\n            \"shi\"\n        ],\n        \"key\": \"shi\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Tachelhit (Tifinagh)\"\n    },\n    {\n        \"alpha3\": \"tgl\",\n        \"alpha3B\": \"tgl\",\n        \"codes\": [\n            \"tl\",\n            \"tgl\"\n        ],\n        \"key\": \"tl\",\n        \"languageId\": \"tl\",\n        \"name\": \"Tagalog\"\n    },\n    {\n        \"alpha3\": \"dav\",\n        \"alpha3B\": \"dav\",\n        \"codes\": [\n            \"dav\",\n            \"dav-KE\"\n        ],\n        \"key\": \"dav\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Taita\"\n    },\n    {\n        \"alpha3\": \"tgk\",\n        \"alpha3B\": \"tgk\",\n        \"codes\": [\n            \"tg\",\n            \"tg-Cyrl\",\n            \"tgk\",\n            \"taj\",\n            \"taj\"\n        ],\n        \"key\": \"tg\",\n        \"languageId\": \"TAJ\",\n        \"name\": \"Tajik\"\n    },\n    {\n        \"alpha3\": \"tgk\",\n        \"alpha3B\": \"tgk\",\n        \"codes\": [\n            \"tg-Cyrl-TJ\",\n            \"tg\",\n            \"tgk\",\n            \"taj\",\n            \"taj\"\n        ],\n        \"key\": \"tg\",\n        \"languageId\": \"TAJ\",\n        \"name\": \"Tajik (Cyrillic)\"\n    },\n    {\n        \"alpha3\": \"tmh\",\n        \"alpha3B\": \"tmh\",\n        \"codes\": [\n            \"tmh\"\n        ],\n        \"key\": \"tmh\",\n        \"languageId\": \"tmh\",\n        \"name\": \"Tamashek\"\n    },\n    {\n        \"alpha3\": \"tam\",\n        \"alpha3B\": \"tam\",\n        \"codes\": [\n            \"ta\",\n            \"ta-IN\",\n            \"ta-LK\",\n            \"ta-MY\",\n            \"ta-SG\",\n            \"tam\"\n        ],\n        \"key\": \"ta\",\n        \"languageId\": \"ta\",\n        \"name\": \"Tamil\"\n    },\n    {\n        \"alpha3\": \"twq\",\n        \"alpha3B\": \"twq\",\n        \"codes\": [\n            \"twq\",\n            \"twq-NE\"\n        ],\n        \"key\": \"twq\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Tasawaq\"\n    },\n    {\n        \"alpha3\": \"tat\",\n        \"alpha3B\": \"tat\",\n        \"codes\": [\n            \"tt\",\n            \"tt-RU\",\n            \"tat\",\n            \"ttt\",\n            \"ttt\"\n        ],\n        \"key\": \"tt\",\n        \"languageId\": \"TTT\",\n        \"name\": \"Tatar\"\n    },\n    {\n        \"alpha3\": \"tel\",\n        \"alpha3B\": \"tel\",\n        \"codes\": [\n            \"te\",\n            \"te-IN\",\n            \"tel\"\n        ],\n        \"key\": \"te\",\n        \"languageId\": \"te-IN\",\n        \"name\": \"Telugu\"\n    },\n    {\n        \"alpha3\": \"teo\",\n        \"alpha3B\": \"teo\",\n        \"codes\": [\n            \"teo\",\n            \"teo-KE\",\n            \"teo-UG\"\n        ],\n        \"key\": \"teo\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Teso\"\n    },\n    {\n        \"alpha3\": \"tha\",\n        \"alpha3B\": \"tha\",\n        \"codes\": [\n            \"th\",\n            \"th-TH\",\n            \"tha\"\n        ],\n        \"key\": \"th\",\n        \"languageId\": \"th-TH\",\n        \"name\": \"Thai\"\n    },\n    {\n        \"alpha3\": \"bod\",\n        \"alpha3B\": \"tib\",\n        \"codes\": [\n            \"bo\",\n            \"bo-CN\",\n            \"bo-IN\",\n            \"bod\",\n            \"tib\"\n        ],\n        \"key\": \"bo\",\n        \"languageId\": \"bo\",\n        \"name\": \"Tibetan\"\n    },\n    {\n        \"alpha3\": \"tig\",\n        \"alpha3B\": \"tig\",\n        \"codes\": [\n            \"tig\",\n            \"tig-ER\"\n        ],\n        \"key\": \"tig\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Tigre\"\n    },\n    {\n        \"alpha3\": \"tir\",\n        \"alpha3B\": \"tir\",\n        \"codes\": [\n            \"ti\",\n            \"ti-ER\",\n            \"ti-ET\",\n            \"tir\",\n            \"tir\"\n        ],\n        \"key\": \"ti\",\n        \"languageId\": \"TIR\",\n        \"name\": \"Tigrinya\"\n    },\n    {\n        \"alpha3\": \"ton\",\n        \"alpha3B\": \"ton\",\n        \"codes\": [\n            \"to\",\n            \"to-TO\",\n            \"ton\"\n        ],\n        \"key\": \"to\",\n        \"languageId\": \"to\",\n        \"name\": \"Tongan\"\n    },\n    {\n        \"alpha3\": \"tso\",\n        \"alpha3B\": \"tso\",\n        \"codes\": [\n            \"ts\",\n            \"ts-ZA\",\n            \"tso\",\n            \"tso\"\n        ],\n        \"key\": \"ts\",\n        \"languageId\": \"TSO\",\n        \"name\": \"Tsonga\"\n    },\n    {\n        \"alpha3\": \"tur\",\n        \"alpha3B\": \"tur\",\n        \"codes\": [\n            \"tr\",\n            \"tr-CY\",\n            \"tr-TR\",\n            \"tur\"\n        ],\n        \"key\": \"tr\",\n        \"languageId\": \"tr\",\n        \"name\": \"Turkish\"\n    },\n    {\n        \"alpha3\": \"tuk\",\n        \"alpha3B\": \"tuk\",\n        \"codes\": [\n            \"tk\",\n            \"tk-TM\",\n            \"tuk\",\n            \"tuk\"\n        ],\n        \"key\": \"tk\",\n        \"languageId\": \"TUK\",\n        \"name\": \"Turkmen\"\n    },\n    {\n        \"alpha3\": \"tyv\",\n        \"alpha3B\": \"tyv\",\n        \"codes\": [\n            \"tyv\"\n        ],\n        \"key\": \"tyv\",\n        \"languageId\": \"tyv\",\n        \"name\": \"Tuvan\"\n    },\n    {\n        \"alpha3\": \"uga\",\n        \"alpha3B\": \"uga\",\n        \"codes\": [\n            \"uga\"\n        ],\n        \"key\": \"uga\",\n        \"languageId\": \"uga\",\n        \"name\": \"Ugaritic\"\n    },\n    {\n        \"alpha3\": \"ukr\",\n        \"alpha3B\": \"ukr\",\n        \"codes\": [\n            \"uk\",\n            \"uk-UA\",\n            \"ukr\"\n        ],\n        \"key\": \"uk\",\n        \"languageId\": \"uk-UA\",\n        \"name\": \"Ukrainian\"\n    },\n    {\n        \"alpha3\": \"dsb\",\n        \"alpha3B\": \"dsb\",\n        \"codes\": [\n            \"dsb\",\n            \"hsb\",\n            \"hsb-DE\",\n            \"dsb\"\n        ],\n        \"key\": \"dsb\",\n        \"languageId\": \"DSB\",\n        \"name\": \"Upper Sorbian\"\n    },\n    {\n        \"alpha3\": \"urd\",\n        \"alpha3B\": \"urd\",\n        \"codes\": [\n            \"ur\",\n            \"ur-IN\",\n            \"ur-PK\",\n            \"urd\"\n        ],\n        \"key\": \"ur\",\n        \"languageId\": \"ur\",\n        \"name\": \"Urdu\"\n    },\n    {\n        \"alpha3\": \"uig\",\n        \"alpha3B\": \"uig\",\n        \"codes\": [\n            \"ug\",\n            \"ug-CN\",\n            \"uig\",\n            \"uig\"\n        ],\n        \"key\": \"ug\",\n        \"languageId\": \"UIG\",\n        \"name\": \"Uyghur\"\n    },\n    {\n        \"alpha3\": \"uzb\",\n        \"alpha3B\": \"uzb\",\n        \"codes\": [\n            \"uz\",\n            \"uz-Arab\",\n            \"uz-Cyrl\",\n            \"uz-Latn\",\n            \"uzb\",\n            \"uzb\"\n        ],\n        \"key\": \"uz\",\n        \"languageId\": \"UZB\",\n        \"name\": \"Uzbek\"\n    },\n    {\n        \"alpha3\": \"uzb\",\n        \"alpha3B\": \"uzb\",\n        \"codes\": [\n            \"uz-Cyrl-UZ\",\n            \"uz\",\n            \"uzb\",\n            \"uzc\",\n            \"uzc\"\n        ],\n        \"key\": \"uz\",\n        \"languageId\": \"UZC\",\n        \"name\": \"Uzbek (Cyrillic)\"\n    },\n    {\n        \"alpha3\": \"uzb\",\n        \"alpha3B\": \"uzb\",\n        \"codes\": [\n            \"uz-Latn-UZ\",\n            \"uz\",\n            \"uzb\",\n            \"uzb\"\n        ],\n        \"key\": \"uz\",\n        \"languageId\": \"UZB\",\n        \"name\": \"Uzbek (Latin)\"\n    },\n    {\n        \"alpha3\": \"uzb\",\n        \"alpha3B\": \"uzb\",\n        \"codes\": [\n            \"uz-Arab-AF\",\n            \"uz\",\n            \"uzb\"\n        ],\n        \"key\": \"uz\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Uzbek (Perso-Arabic)\"\n    },\n    {\n        \"alpha3\": \"vai\",\n        \"alpha3B\": \"vai\",\n        \"codes\": [\n            \"vai\",\n            \"vai-Latn\",\n            \"vai-Vaii\"\n        ],\n        \"key\": \"vai\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Vai\"\n    },\n    {\n        \"alpha3\": \"vai\",\n        \"alpha3B\": \"vai\",\n        \"codes\": [\n            \"vai-Latn-LR\",\n            \"vai\"\n        ],\n        \"key\": \"vai\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Vai (Latin)\"\n    },\n    {\n        \"alpha3\": \"vai\",\n        \"alpha3B\": \"vai\",\n        \"codes\": [\n            \"vai-Vaii-LR\",\n            \"vai\"\n        ],\n        \"key\": \"vai\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Vai (Vai)\"\n    },\n    {\n        \"alpha3\": \"ven\",\n        \"alpha3B\": \"ven\",\n        \"codes\": [\n            \"ve\",\n            \"ve-ZA\",\n            \"ven\"\n        ],\n        \"key\": \"ve\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Venda\"\n    },\n    {\n        \"alpha3\": \"vie\",\n        \"alpha3B\": \"vie\",\n        \"codes\": [\n            \"vi\",\n            \"vi-VN\",\n            \"vie\"\n        ],\n        \"key\": \"vi\",\n        \"languageId\": \"vi-VN\",\n        \"name\": \"Vietnamese\"\n    },\n    {\n        \"alpha3\": \"vol\",\n        \"alpha3B\": \"vol\",\n        \"codes\": [\n            \"vo\",\n            \"vo-001\",\n            \"vol\"\n        ],\n        \"key\": \"vo\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Volapük\"\n    },\n    {\n        \"alpha3\": \"vun\",\n        \"alpha3B\": \"vun\",\n        \"codes\": [\n            \"vun\",\n            \"vun-TZ\"\n        ],\n        \"key\": \"vun\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Vunjo\"\n    },\n    {\n        \"alpha3\": \"wae\",\n        \"alpha3B\": \"wae\",\n        \"codes\": [\n            \"wae\",\n            \"wae-CH\"\n        ],\n        \"key\": \"wae\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Walser\"\n    },\n    {\n        \"alpha3\": \"cym\",\n        \"alpha3B\": \"wel\",\n        \"codes\": [\n            \"cy\",\n            \"cy-GB\",\n            \"cym\",\n            \"wel\"\n        ],\n        \"key\": \"cy\",\n        \"languageId\": \"cy-GB\",\n        \"name\": \"Welsh\"\n    },\n    {\n        \"alpha3\": \"fry\",\n        \"alpha3B\": \"fry\",\n        \"codes\": [\n            \"fy\",\n            \"fy-NL\",\n            \"fry\",\n            \"fyn\",\n            \"fyn\"\n        ],\n        \"key\": \"fy\",\n        \"languageId\": \"FYN\",\n        \"name\": \"Western Frisian\"\n    },\n    {\n        \"alpha3\": \"wal\",\n        \"alpha3B\": \"wal\",\n        \"codes\": [\n            \"wal\",\n            \"wal-ET\"\n        ],\n        \"key\": \"wal\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Wolaytta\"\n    },\n    {\n        \"alpha3\": \"wol\",\n        \"alpha3B\": \"wol\",\n        \"codes\": [\n            \"wo\",\n            \"wo-SN\",\n            \"wol\"\n        ],\n        \"key\": \"wo\",\n        \"languageId\": \"wo-SN\",\n        \"name\": \"Wolof\"\n    },\n    {\n        \"alpha3\": \"xho\",\n        \"alpha3B\": \"xho\",\n        \"codes\": [\n            \"xh\",\n            \"xho\"\n        ],\n        \"key\": \"xh\",\n        \"languageId\": \"xh\",\n        \"name\": \"Xhosa\"\n    },\n    {\n        \"alpha3\": \"yav\",\n        \"alpha3B\": \"yav\",\n        \"codes\": [\n            \"yav\",\n            \"yav-CM\"\n        ],\n        \"key\": \"yav\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Yangben\"\n    },\n    {\n        \"alpha3\": \"iii\",\n        \"alpha3B\": \"iii\",\n        \"codes\": [\n            \"ii\",\n            \"ii-CN\",\n            \"iii\",\n            \"iii\"\n        ],\n        \"key\": \"ii\",\n        \"languageId\": \"III\",\n        \"name\": \"Yi\"\n    },\n    {\n        \"alpha3\": \"yid\",\n        \"alpha3B\": \"yid\",\n        \"codes\": [\n            \"yi\",\n            \"yi-001\",\n            \"ji\",\n            \"yid\"\n        ],\n        \"key\": \"yi\",\n        \"languageId\": \"yi\",\n        \"name\": \"Yiddish\"\n    },\n    {\n        \"alpha3\": \"yor\",\n        \"alpha3B\": \"yor\",\n        \"codes\": [\n            \"yo\",\n            \"yo-BJ\",\n            \"yo-NG\",\n            \"yor\",\n            \"yor\"\n        ],\n        \"key\": \"yo\",\n        \"languageId\": \"YOR\",\n        \"name\": \"Yoruba\"\n    },\n    {\n        \"alpha3\": \"zap\",\n        \"alpha3B\": \"zap\",\n        \"codes\": [\n            \"zap\"\n        ],\n        \"key\": \"zap\",\n        \"languageId\": \"zap\",\n        \"name\": \"Zapotec\"\n    },\n    {\n        \"alpha3\": \"dje\",\n        \"alpha3B\": \"dje\",\n        \"codes\": [\n            \"dje\",\n            \"dje-NE\"\n        ],\n        \"key\": \"dje\",\n        \"languageId\": \"ZZZ\",\n        \"name\": \"Zarma\"\n    },\n    {\n        \"alpha3\": \"zul\",\n        \"alpha3B\": \"zul\",\n        \"codes\": [\n            \"zu\",\n            \"zul\"\n        ],\n        \"key\": \"zu\",\n        \"languageId\": \"zu\",\n        \"name\": \"Zulu\"\n    }\n]"}],"_postman_id":"d59385c0-88cc-4747-a721-d319bc3d0634"},{"name":"Get categories","id":"b7c729b2-2669-4e8a-8cf3-b05c47ca9271","request":{"method":"GET","header":[],"url":"{{base_url}}/external/categories","description":"<p>Lists the format categories used by the <code>category</code> field of <em>Get formats</em>. Role: <code>API</code> or <code>UserAPI</code>. No input.</p>\n<p><strong>Access</strong>: bearer token with role <code>API</code> or <code>UserAPI</code>. The response is cached for 24 hours (server and client), independent of the query string.</p>\n<p><strong>Output</strong> (<code>200 OK</code>, JSON array of <code>{ \"key\", \"name\" }</code>): <code>OpenSubtitles</code>, <code>TimedText</code>, <code>ClosedCaptions</code>, <code>DVDImages</code> (image-based formats; converting to these runs as an asynchronous job, see the <em>Convert</em> folder).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","categories"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"a7d0718a-4f9b-42d4-a917-00e8861b8011","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/categories"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"key\": \"OpenSubtitles\",\n    \"name\": \"Open Subtitles\"\n  },\n  {\n    \"key\": \"TimedText\",\n    \"name\": \"Timed Text\"\n  },\n  {\n    \"key\": \"ClosedCaptions\",\n    \"name\": \"Closed Captions\"\n  },\n  {\n    \"key\": \"DVDImages\",\n    \"name\": \"Image scripts for DVD/BD authoring and NLE systems\"\n  }\n]"}],"_postman_id":"b7c729b2-2669-4e8a-8cf3-b05c47ca9271"},{"name":"Get encodings","id":"f44f49c6-ac08-4895-9542-370c65b4b104","request":{"method":"GET","header":[],"url":"{{base_url}}/external/encodings","description":"<p>Lists the text encodings the Toolkit can read and write. Use <code>value</code> as the encoding in custom JSON configuration (e.g. <code>encoding</code> in <code>importOverrides</code> / <code>exportOverrides</code>). Role: <code>API</code> or <code>UserAPI</code>. No input.</p>\n<p><strong>Access</strong>: bearer token with role <code>API</code> or <code>UserAPI</code>. The response is cached for 24 hours (server and client), independent of the query string.</p>\n<p><strong>Output</strong> (<code>200 OK</code>, JSON array). Each item: <code>code</code> (integer, code page number), <code>name</code> (display name) and <code>value</code> (encoding name to use in configuration).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","encodings"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"f3691cbc-ea20-4c79-adb1-428094ee9824","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/encodings"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"name\": \"Arabic (ASMO 708)\",\n    \"value\": \"ASMO-708\",\n    \"code\": 708\n  },\n  {\n    \"name\": \"Arabic (DOS)\",\n    \"value\": \"DOS-720\",\n    \"code\": 720\n  },\n  {\n    \"name\": \"Arabic (ISO)\",\n    \"value\": \"iso-8859-6\",\n    \"code\": 28596\n  }\n]"}],"_postman_id":"f44f49c6-ac08-4895-9542-370c65b4b104"}],"id":"71b0cdc0-9a55-4691-8c36-f2ca0f1cdf6c","description":"<p>Metadata endpoints should help you map language names, file formats and encodings to use in custom JSON values in Convert and QC API.</p>\n<p>All four endpoints are read-only <code>GET</code> calls with no input, role <code>API</code> or <code>UserAPI</code>, return JSON and are cached for 24 hours.</p>\n","_postman_id":"71b0cdc0-9a55-4691-8c36-f2ca0f1cdf6c","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"📝 Project","item":[{"name":"Create Pro Project","id":"132c30a9-cf43-420a-a702-c52ef89f363b","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"ac167d87-2512-455f-aa55-35deef629a1e\",\n  \"email\": \"Arvel.Davis0@example.net\",\n  \"ip\": \"::1\",\n  \"app\": \"CreatePro\",\n  \"projectName\": \"Shore Buckinghamshire\",\n  \"adminEmail\": \"Lempi.Bashirian@example.com\",\n  \"roles\": \"\",\n  \"video\": \"{\\\"src\\\":\\\"http://estella.biz\\\",\\\"dat\\\":\\\"https://tad.com\\\", \\\"type\\\":\\\"application/dash+xml\\\"}\",\n  \"resignVideoUrl\": \"\",\n  \"subtitlesUrl\": \"https://nona.biz\",\n  \"subtitlesFileName\": \"COM Renminbi Accounts Baby\",\n  \"subtitlesList\": \"\",\n  \"document\": \"http://erik.org\",\n  \"startTC\": \"00:00:00:00\",\n  \"previousProjectGuid\": \"48925553-acbf-4608-9851-e08df38a6f4b\",\n  \"configurationGuid\": \"f012a69f-116a-43cf-b310-6009bce92009\",\n  \"importConfigurationGuid\": \"7f080ce3-ee9e-444c-9367-c665a40ff719\",\n  \"exportConfigurationGuid\": \"0c2f922a-29ef-46a8-acbf-ecd123adb46f\",\n  \"languageConfigurationGuid\": \"0ff0aa97-970c-4d18-81e7-09efb50c1417\",\n  \"sourceLanguageConfigurationGuid\": \"a7f7a555-45d6-4455-84df-3021d9bdbaef\",\n  \"sourceImportConfigurationGuid\": \"d96cbf07-d16a-48b7-b30f-ed4244364424\",\n  \"videoConfigurationGuid\": \"05ba78f8-37be-456c-a165-0f30e7cb9e84\",\n  \"previousImportConfigurationGuid\": \"a3315539-7694-4226-839b-494da1a0fc9c\",\n  \"previousExportConfigurationGuid\": \"a99ba6a3-6825-4e33-8c37-5fd977949849\",\n  \"previousLanguageConfigurationGuid\": \"8e5ce8e9-bc82-4c31-8b11-02a6c55ecd72\",\n  \"previousSourceLanguageConfigurationGuid\": \"5261dc89-2f84-4839-a0a8-96df8249cd64\",\n  \"previousSourceImportConfigurationGuid\": \"4ef187c5-d2ad-479c-a406-348de19f7ad1\",\n  \"previousVideoConfigurationGuid\": \"e4f216b0-2d2c-4c6b-ba14-c28c20ef54bb\",\n  \"fileNamingId\": \"\",\n  \"fileNamingValues\": \"\",\n  \"editConfiguration\": true,\n  \"allowDownload\": true,\n  \"allowUpload\": true,\n  \"allowMediaOpen\": true,\n  \"allowUnlock\": true,\n  \"allowShare\": false,\n  \"hideTabs\": false,\n  \"hideTemplatesOnFinish\": false,\n  \"showExportDialogOnFinish\": false,\n  \"exportSettingsWhitelist\": \"[]\",\n  \"exportSettingsValues\": \"{}\",\n  \"exportSettingsTabIndex\": 0,\n  \"disabledMenuItems\": [],\n  \"enabledMenuItems\": [],\n  \"baseUrl\": \"\",\n  \"userUrl\": \"https://jennings.info\",\n  \"callbackUrl\": \"http://elyse.name\",\n  \"taskCompleteUrl\": \"http://miller.biz\",\n  \"taskCompleteShowModal\": true,\n  \"splitLimitation\": { \"mergedProjectGuid\": \"\", \"fromTime\": \"\", \"toTime\": \"\", \"fromIndex\": 0, \"toIndex\": 0 },\n  \"validationData\": \"\",\n  \"unlock\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/8600b0ea-3ada-4dbf-9b1a-c97afd6a683c","description":"<p>Opens the <strong>Create Pro</strong> app for a project, creating the project on first use, and returns the one-time link to redirect your user to. This is the same <code>POST external/project/{id}</code> endpoint used for every app; only <code>app</code> and the inputs differ (see also <em>Translate Pro Project</em>, <em>Review Project</em> and <em>MultilingualQC Project</em>).</p>\n<p><strong>Route.</strong> <code>id</code> (required): the project GUID. You generate and keep it. First call creates, repeat calls with the same GUID re-open.</p>\n<p><strong>Behaviour.</strong> Role: <code>API</code>. The GUID in the route is the project id and <strong>you generate it and keep it</strong>.</p>\n<ul>\n<li>First call with a GUID creates the open-request (the project itself is created when the user opens the link). A later call with the same GUID updates the stored request with the fields you send and re-opens the existing project for editing; omitted <code>previous...</code> GUIDs keep their earlier values.</li>\n<li>Each call issues a new one-time token and returns the link containing it.</li>\n<li>If the project currently belongs to a <em>different</em> e-mail and was modified within the last 180 seconds, the link opens it in view-only (read-only) mode without transferring ownership. Add <code>?force=true</code> to ignore that and hand the project to <code>email</code> (risk: two users overwriting each other). Outside that window ownership simply moves to <code>email</code>.</li>\n<li>An empty body is rejected.</li>\n</ul>\n<p><strong>Query string.</strong> <code>force</code> (optional, <code>true</code>/<code>false</code>, default <code>false</code>): as described above.</p>\n<p><strong>Success response</strong> (<code>200 OK</code>, JSON string): the absolute URL to redirect the user to, <code>https://&lt;host&gt;/V2/external?token=&lt;token&gt;</code>.</p>\n<p><strong>Errors.</strong> There is no validation response: the endpoint raises an error (an error response, not a field-level 4xx) for an empty body (\"Request body is empty.\"), malformed JSON, or when the user account for <code>email</code> cannot be created.</p>\n<p><strong>Body fields</strong> (JSON, camelCase; unknown fields are ignored). Everything is optional as far as the endpoint itself is concerned, but an app needs enough to open: in practice <code>email</code>, <code>app</code> and the inputs that app uses.</p>\n<p><em>Identity and session</em></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>Your own correlation id for this request. Stored with the request.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>The user the returned link signs in as. Matched by e-mail address (case-insensitive); the account is created on the fly if it doesn't exist. Required in practice: the call fails without it.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>adminEmail</code></td>\n<td>string</td>\n<td>Optional. E-mail of an administrator associated with the request.</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>The application to open, e.g. <code>CreatePro</code>, <code>TranslatePro</code>, <code>ReviewPro</code>, <code>EditPro</code>, <code>MultilingualQC</code>.</td>\n</tr>\n<tr>\n<td><code>projectName</code></td>\n<td>string</td>\n<td>Display name of the project.</td>\n</tr>\n<tr>\n<td><code>roles</code></td>\n<td>string</td>\n<td>Optional, comma-separated list of role names granted to the session.</td>\n</tr>\n<tr>\n<td><code>id</code></td>\n<td>string</td>\n<td>Not used; the project GUID is the <code>{id}</code> in the route.</td>\n</tr>\n<tr>\n<td><code>projectGuid</code></td>\n<td>string</td>\n<td>Not used for a single-project body (the route <code>{id}</code> wins). In a MultilingualQC array body it is the GUID of each sub-project; one is generated if omitted.</td>\n</tr>\n<tr>\n<td><code>previousProjectGuid</code></td>\n<td>string</td>\n<td>Optional. GUID of a previous project the new one continues from (for example the previous workflow step). Kept if a later request omits it.</td>\n</tr>\n<tr>\n<td><code>unlock</code></td>\n<td>bool</td>\n<td>Default <code>false</code>. <code>true</code> clears the lock that Finish put on the project (and its sub-projects) so it can be edited again; used when a completed task is un-completed. Not stored.</td>\n</tr>\n</tbody>\n</table>\n</div><p><em>Media and subtitle inputs</em></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>video</code></td>\n<td>string</td>\n<td>The media: either a plain URL, or a JSON string such as <code>{\"src\":\"https://.../video.mp4\",\"dat\":\"https://.../video.dat\",\"type\":\"application/dash+xml\"}</code> (<code>dat</code> = waveform/data file, <code>type</code> = media type; both optional). Surrounding whitespace is trimmed.</td>\n</tr>\n<tr>\n<td><code>resignVideoUrl</code></td>\n<td>string</td>\n<td>Optional. A URL the editor calls to obtain a fresh (re-signed) media URL when the original has expired.</td>\n</tr>\n<tr>\n<td><code>videoHeadUrl</code></td>\n<td>string</td>\n<td>Declared on the model for the Glix integration (copying the video between storages). No documented effect on this endpoint.</td>\n</tr>\n<tr>\n<td><code>subtitlesUrl</code></td>\n<td>string</td>\n<td>URL of a subtitle file to load into the new project (single-file flow).</td>\n</tr>\n<tr>\n<td><code>subtitlesFileName</code></td>\n<td>string</td>\n<td>File name for the file at <code>subtitlesUrl</code>.</td>\n</tr>\n<tr>\n<td><code>subtitlesList</code></td>\n<td>string</td>\n<td>JSON-encoded array of files for the multi-file flow, e.g. <code>[{\"url\":\"https://...\",\"language\":\"Arabic\",\"fileType\":\"Subtitles\",\"description\":\"...\"}]</code>. Use instead of <code>subtitlesUrl</code>.</td>\n</tr>\n<tr>\n<td><code>document</code></td>\n<td>string</td>\n<td>Optional URL of a reference document shown alongside the project.</td>\n</tr>\n<tr>\n<td><code>startTC</code></td>\n<td>string</td>\n<td>Start timecode of the media, e.g. <code>01:00:00:00</code>.</td>\n</tr>\n<tr>\n<td><code>splitLimitation</code></td>\n<td>object</td>\n<td>Restricts the project to a part of a larger one (see below).</td>\n</tr>\n<tr>\n<td><code>validationData</code></td>\n<td>string</td>\n<td>Optional JSON string with app-specific validation data (for example <code>allowedSegments</code>). Stored as-is.</td>\n</tr>\n<tr>\n<td><code>mediaId</code></td>\n<td>string</td>\n<td>Optional id of a media item stored in the Toolkit.</td>\n</tr>\n</tbody>\n</table>\n</div><p><em>Configuration.</em> Each can be given as a saved-configuration GUID (<code>...Guid</code>); the first three also accept the settings inline as a JSON string (<code>...Json</code>).</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>configurationGuid</code> / <code>configurationJson</code></td>\n<td>string</td>\n<td>Project (subtitles) configuration.</td>\n</tr>\n<tr>\n<td><code>importConfigurationGuid</code></td>\n<td>string</td>\n<td>Import settings used for <code>subtitlesUrl</code> / <code>subtitlesList</code>.</td>\n</tr>\n<tr>\n<td><code>exportConfigurationGuid</code></td>\n<td>string</td>\n<td>Export settings used when the user exports or finishes.</td>\n</tr>\n<tr>\n<td><code>languageConfigurationGuid</code></td>\n<td>string</td>\n<td>Language configuration.</td>\n</tr>\n<tr>\n<td><code>sourceLanguageConfigurationGuid</code></td>\n<td>string</td>\n<td>Language configuration of the source column (Translate / Review).</td>\n</tr>\n<tr>\n<td><code>sourceImportConfigurationGuid</code></td>\n<td>string</td>\n<td>Import settings for the source file.</td>\n</tr>\n<tr>\n<td><code>videoConfigurationGuid</code></td>\n<td>string</td>\n<td>Video configuration.</td>\n</tr>\n<tr>\n<td><code>fileNamingId</code></td>\n<td>string</td>\n<td>Id of a file-naming convention to apply on export.</td>\n</tr>\n<tr>\n<td><code>fileNamingValues</code></td>\n<td>string</td>\n<td>JSON dictionary with the drop-down values available to the file-naming convention.</td>\n</tr>\n<tr>\n<td><code>previousConfigurationGuid</code>, <code>previousImportConfigurationGuid</code>, <code>previousExportConfigurationGuid</code>, <code>previousLanguageConfigurationGuid</code>, <code>previousSourceLanguageConfigurationGuid</code>, <code>previousSourceImportConfigurationGuid</code>, <code>previousVideoConfigurationGuid</code></td>\n<td>string</td>\n<td>GUIDs of the configurations used by the previous step, for comparison. Kept from an earlier request when omitted.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The model also declares <code>importConfigurationJson</code>, <code>exportConfigurationJson</code>, <code>sourceLanguageConfigurationJson</code>, <code>sourceImportConfigurationJson</code>, <code>languageConfigurationJson</code>, <code>fileNamingJson</code>, <code>videoConfigurationJson</code> and the <code>previous...Json</code> variants. Only <code>configurationJson</code>, <code>importConfigurationJson</code> and <code>exportConfigurationJson</code> have a stored counterpart on the request record; prefer the <code>...Guid</code> fields for everything else.</p>\n<p><em>Editor permissions and UI</em></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>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>editConfiguration</code></td>\n<td>bool</td>\n<td><code>false</code></td>\n<td>Let the user edit the project configuration.</td>\n</tr>\n<tr>\n<td><code>allowDownload</code></td>\n<td>bool</td>\n<td><code>false</code></td>\n<td>Show download/export actions.</td>\n</tr>\n<tr>\n<td><code>allowUpload</code></td>\n<td>bool</td>\n<td><code>false</code></td>\n<td>Allow uploading subtitle files.</td>\n</tr>\n<tr>\n<td><code>allowMediaOpen</code></td>\n<td>bool</td>\n<td><code>false</code></td>\n<td>Allow the user to open another media file.</td>\n</tr>\n<tr>\n<td><code>allowUnlock</code></td>\n<td>bool or null</td>\n<td><code>null</code></td>\n<td>Allow the user to unlock a finished project.</td>\n</tr>\n<tr>\n<td><code>allowShare</code></td>\n<td>bool or null</td>\n<td><code>null</code></td>\n<td>Allow sharing the project.</td>\n</tr>\n<tr>\n<td><code>hideTabs</code></td>\n<td>bool</td>\n<td><code>false</code></td>\n<td>Hide the tab-selection header.</td>\n</tr>\n<tr>\n<td><code>hideTemplatesOnFinish</code></td>\n<td>bool</td>\n<td><code>false</code></td>\n<td>Hide the import/export template pickers in the finish dialog.</td>\n</tr>\n<tr>\n<td><code>showExportDialogOnFinish</code></td>\n<td>bool</td>\n<td><code>false</code></td>\n<td>Show the export dialog when the user finishes.</td>\n</tr>\n<tr>\n<td><code>exportSettingsWhitelist</code></td>\n<td>string</td>\n<td></td>\n<td>JSON array of the export settings the user may change.</td>\n</tr>\n<tr>\n<td><code>exportSettingsValues</code></td>\n<td>string</td>\n<td></td>\n<td>JSON object of key/value export settings to pre-set.</td>\n</tr>\n<tr>\n<td><code>exportSettingsTabIndex</code></td>\n<td>int</td>\n<td><code>0</code></td>\n<td>Zero-based export dialog tab to open first.</td>\n</tr>\n<tr>\n<td><code>disabledMenuItems</code></td>\n<td>string[]</td>\n<td><code>[]</code></td>\n<td>Menu items to hide.</td>\n</tr>\n<tr>\n<td><code>enabledMenuItems</code></td>\n<td>string[]</td>\n<td><code>[]</code></td>\n<td>If set, only these menu items are shown.</td>\n</tr>\n<tr>\n<td><code>baseUrl</code></td>\n<td>string</td>\n<td></td>\n<td>Base URL the editor uses for return links / assets.</td>\n</tr>\n<tr>\n<td><code>userUrl</code></td>\n<td>string</td>\n<td></td>\n<td>URL associated with the user (profile / return link).</td>\n</tr>\n</tbody>\n</table>\n</div><p><em>Callbacks</em></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>callbackUrl</code></td>\n<td>string</td>\n<td>Called with the project data when the user finishes the project.</td>\n</tr>\n<tr>\n<td><code>taskCompleteUrl</code></td>\n<td>string</td>\n<td>Also triggered once Finish has been called.</td>\n</tr>\n<tr>\n<td><code>taskCompleteShowModal</code></td>\n<td>bool</td>\n<td>Default <code>false</code>. Ask the user to confirm before <code>taskCompleteUrl</code> is called.</td>\n</tr>\n</tbody>\n</table>\n</div><p><em><code>splitLimitation</code> object</em> - open only a slice of a project; the <em>Merge Projects</em> request puts slices back together.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>mergedProjectGuid</code></td>\n<td>string</td>\n<td>GUID of the project the slice belongs to / will be merged into.</td>\n</tr>\n<tr>\n<td><code>fromTime</code> / <code>toTime</code></td>\n<td>string</td>\n<td>Time range, as SMPTE timecode (<code>01:02:03:04</code>) or seconds. Empty = unbounded.</td>\n</tr>\n<tr>\n<td><code>fromIndex</code> / <code>toIndex</code></td>\n<td>int</td>\n<td>Subtitle index range (1-based, inclusive). <code>0</code> = unbounded.</td>\n</tr>\n</tbody>\n</table>\n</div><p><em><code>syncheck</code> object</em>: declared on the model for the Syncheck integration; not used by this endpoint.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","project","6f3677eb-3eac-4765-9f88-f0cb34bed4cb"],"host":["{{base_url}}"],"query":[{"disabled":true,"description":{"content":"<p>Optional. true = open for this e-mail even if another user saved the project in the last 180 seconds.</p>\n","type":"text/plain"},"key":"force","value":"false"}],"variable":[]}},"response":[{"id":"10fb45ac-fab2-48c2-b449-ec13da2c9456","name":"Create Pro Project with all parameters","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"requestId\": \"8f2fc2e7-5e8f-45a6-95ec-6b9d0df05490\",\r\n  \"email\": \"Stanley77@example.org\",\r\n  \"ip\": \"::1\",\r\n  \"app\": \"CreatePro\",\r\n  \"projectName\": \"Architect Oregon compelling drive Corporate\",\r\n  \"adminEmail\": \"Fernando20@example.org\",\r\n  \"video\": \"{\\\"src\\\":\\\"https://ines.info\\\",\\\"dat\\\":\\\"https://issac.biz\\\", \\\"type\\\":\\\"application/dash+xml\\\"}\",\r\n  \"configurationGuid\": \"f012a69f-116a-43cf-b310-6009bce92009\",\r\n  \"callbackUrl\": \"https://chanel.com\",\r\n  \"subtitlesUrl\": \"https://marianna.info\",\r\n  \"subtitlesFileName\": \"Wyoming JBOD Malagasy firewall circuit\",\r\n  \"previousProjectGuid\": \"520b70d3-539a-4795-ade4-17fa2c9c3574\",\r\n  \"editConfiguration\": true,\r\n  \"allowDownload\": true,\r\n  \"allowUpload\": true,\r\n  \"allowMediaOpen\": true,\r\n  \"sourceLanguageConfigurationGuid\": \"118a529a-2b4e-4c58-ada2-a268d76e7faf\",\r\n  \"sourceImportConfigurationGuid\": \"d0c9f58b-3974-4044-919c-2089f2464714\",\r\n  \"languageConfigurationGuid\": \"3931705c-2da4-4091-9784-d151651dfb17\",\r\n  \"importConfigurationGuid\": \"dc33fb6d-cb74-4aeb-919d-731cfd0ce192\",\r\n  \"exportConfigurationGuid\": \"aaee1d48-ccba-48f1-8c6c-0a4ad07ac646\",\r\n  \"videoConfigurationGuid\": \"0c2cd41c-b5be-483e-998b-553a5fa18ffa\",\r\n  \"startTC\": \"00:00:00:00\",\r\n  \"previousImportConfigurationGuid\": \"b68589a2-9075-488a-ac77-aa9e6e43fd68\",\r\n  \"previousExportConfigurationGuid\": \"ffa8c13a-b855-44d3-9fbd-989388c02215\",\r\n  \"previousLanguageConfigurationGuid\": \"86e337d1-5a63-444f-a2ac-08ceec4132f8\",\r\n  \"previousSourceLanguageConfigurationGuid\": \"7f347127-b0d3-453f-b3a6-5fc9d0cc5da4\",\r\n  \"previousSourceImportConfigurationGuid\": \"576483d8-2ab9-49bf-8233-28b083f4df0e\",\r\n  \"previousVideoConfigurationGuid\": \"46ecb157-8f77-4083-9257-867360435d13\",\r\n  \"userUrl\": \"https://jordy.net\",\r\n  \"taskCompleteUrl\": \"https://ryley.net\",\r\n  \"taskCompleteShowModal\": true,\r\n  \"document\": \"https://toy.name\",\r\n  \"resignDocumentUrl\": \"https://vilma.com\"\r\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/project/c7dbf396-52c1-45f0-a97b-ce6d0e5c65a5","host":["{{base_url}}"],"path":["external","project","39d8626f-05c8-4b0d-90d8-95a5c0fa8dd0"],"query":[{"key":"force","value":"false","description":"Optional. true = open for this e-mail even if another user saved the project in the last 180 seconds.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"98"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=MvevAOPXmXQAbnToflgQoMiStI6gtPD2MCu0ZZSJug\""},{"id":"efc32b0d-30b5-4d32-873c-abcfa1abfbaf","name":"Create Pro Project with video URL","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"requestId\": \"f0e03a2d-1b69-44f4-9d56-176fc55f369a\",\r\n  \"email\": \"Quinton72@example.org\",\r\n  \"ip\": \"::1\",\r\n  \"app\": \"CreatePro\",\r\n  \"projectName\": \"Rubber redefine\",\r\n  \"adminEmail\": \"Bethel.Hintz24@example.org\",\r\n  \"video\": \"https://stefan.name\",\r\n  \"configurationGuid\": \"f012a69f-116a-43cf-b310-6009bce92009\",\r\n  \"callbackUrl\": \"http://sarah.org\",\r\n  \"subtitlesUrl\": \"https://lorenza.com\",\r\n  \"subtitlesFileName\": \"zero web Chicken\",\r\n  \"previousProjectGuid\": \"53226c7f-d345-4cb4-9b06-eaca17345c32\",\r\n  \"editConfiguration\": true,\r\n  \"allowDownload\": true,\r\n  \"allowUpload\": true,\r\n  \"allowMediaOpen\": true,\r\n  \"sourceLanguageConfigurationGuid\": \"c5353357-e6ca-4fe9-b6c7-cf1a7d0e7bbb\",\r\n  \"sourceImportConfigurationGuid\": \"654d6503-6c49-473d-bfc3-561bc1170e0c\",\r\n  \"languageConfigurationGuid\": \"c7addc3f-5ad6-4a5c-adb7-e617db9decdf\",\r\n  \"importConfigurationGuid\": \"67fdab3e-d976-40e1-bf0f-66975dbb4ca3\",\r\n  \"exportConfigurationGuid\": \"80c0e50a-7902-4ad3-a887-9a0d5f677266\",\r\n  \"videoConfigurationGuid\": \"7fa69238-a6ac-4789-b8c7-b24d95ca60e5\",\r\n  \"startTC\": \"00:00:00:00\",\r\n  \"previousImportConfigurationGuid\": \"4ac7a477-7f5d-433a-8971-bd55e40687ea\",\r\n  \"previousExportConfigurationGuid\": \"58cbe3c1-09b4-4015-b1f5-23d0100e3bde\",\r\n  \"previousLanguageConfigurationGuid\": \"4da5bdbd-2c88-4bd5-8f33-5ec7258c1d80\",\r\n  \"previousSourceLanguageConfigurationGuid\": \"8a2182cc-30c7-4503-b3e8-5a90fdc2a775\",\r\n  \"previousSourceImportConfigurationGuid\": \"e392ceff-5359-445d-8eb1-79b17e043d18\",\r\n  \"previousVideoConfigurationGuid\": \"5df48c32-6a2a-4f69-bc49-44e3375f1d25\",\r\n  \"userUrl\": \"https://ken.info\",\r\n  \"taskCompleteUrl\": \"https://jedediah.info\",\r\n  \"taskCompleteShowModal\": true,\r\n  \"document\": \"http://izaiah.biz\",\r\n  \"resignDocumentUrl\": \"https://donnie.net\"\r\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/project/0f2ff877-50e7-44dd-8eb6-dc8b4648f047","host":["{{base_url}}"],"path":["external","project","5cd49ece-2e15-4072-a77a-bfcca07885de"],"query":[{"key":"force","value":"false","description":"Optional. true = open for this e-mail even if another user saved the project in the last 180 seconds.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"98"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=MvevAOPXmXQAbnToflgQoMiStI6gtPD2MCu0ZZSJug\""},{"id":"29767b22-53d8-4d60-b01d-8e31b10723ec","name":"Create Pro Project with mp4 video and dat URL","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"requestId\": \"a29935d0-894e-4664-86dd-457991032f62\",\r\n  \"email\": \"Dorthy.Rohan@example.com\",\r\n  \"ip\": \"::1\",\r\n  \"app\": \"CreatePro\",\r\n  \"projectName\": \"Key copy\",\r\n  \"adminEmail\": \"Beth_Hills@example.net\",\r\n  \"video\": \"{\\\"src\\\":\\\"https://kirstin.biz\\\",\\\"dat\\\":\\\"http://michale.net\\\"}\",\r\n  \"configurationGuid\": \"f012a69f-116a-43cf-b310-6009bce92009\",\r\n  \"callbackUrl\": \"https://janelle.com\",\r\n  \"subtitlesUrl\": \"https://celestino.org\",\r\n  \"subtitlesFileName\": \"withdrawal Licensed cross-platform face\",\r\n  \"previousProjectGuid\": \"a812b68f-73cc-41c3-8752-ed66f6285d5e\",\r\n  \"editConfiguration\": true,\r\n  \"allowDownload\": true,\r\n  \"allowUpload\": true,\r\n  \"allowMediaOpen\": true,\r\n  \"sourceLanguageConfigurationGuid\": \"1bef598d-93cf-4c30-a386-4336aedda4f1\",\r\n  \"sourceImportConfigurationGuid\": \"9c91d424-fced-45aa-80bb-abf3c2fe28eb\",\r\n  \"languageConfigurationGuid\": \"e2156635-9cbb-4853-8d1a-8f94ad5e336a\",\r\n  \"importConfigurationGuid\": \"4dc5f544-f6c0-4e87-87aa-0ca4fb3f9d5e\",\r\n  \"exportConfigurationGuid\": \"afb07bc2-7389-4811-9531-718b25f56ed6\",\r\n  \"videoConfigurationGuid\": \"d2ac89de-7421-4df2-8506-92e1d12bbb18\",\r\n  \"startTC\": \"00:00:00:00\",\r\n  \"previousImportConfigurationGuid\": \"6ec183f1-0bfe-4bfc-a1cc-49059f490e51\",\r\n  \"previousExportConfigurationGuid\": \"9a9a24ae-9f4e-4e40-9994-03c6e55df26f\",\r\n  \"previousLanguageConfigurationGuid\": \"90199dfd-18e6-45e2-865f-29ec29879b4a\",\r\n  \"previousSourceLanguageConfigurationGuid\": \"09cc9399-71bf-451f-9898-be0998421137\",\r\n  \"previousSourceImportConfigurationGuid\": \"9873459c-14c5-4935-83d8-7e2a78fd8497\",\r\n  \"previousVideoConfigurationGuid\": \"de1f4a4c-e20c-484e-a501-d66d7e996ecb\",\r\n  \"userUrl\": \"https://hilbert.net\",\r\n  \"taskCompleteUrl\": \"http://janiya.net\",\r\n  \"taskCompleteShowModal\": true,\r\n  \"document\": \"http://orland.com\",\r\n  \"resignDocumentUrl\": \"https://amir.com\"\r\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/project/023d09b8-4ce6-4809-94c8-ff784199eda1","host":["{{base_url}}"],"path":["external","project","5f400637-fdc7-4267-a7db-a41830c2c433"],"query":[{"key":"force","value":"false","description":"Optional. true = open for this e-mail even if another user saved the project in the last 180 seconds.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"98"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=MvevAOPXmXQAbnToflgQoMiStI6gtPD2MCu0ZZSJug\""},{"id":"8c2a1afe-66d3-42f6-8c20-2c79b9735f2a","name":"Create Pro Project with split by time","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"requestId\": \"c28e6127-1c65-44b3-8d08-73caa42a9cf2\",\r\n  \"email\": \"Christine60@example.net\",\r\n  \"ip\": \"::1\",\r\n  \"app\": \"CreatePro\",\r\n  \"projectName\": \"parsing Kentucky\",\r\n  \"adminEmail\": \"Wayne_Lubowitz@example.net\",\r\n  \"video\": \"{\\\"src\\\":\\\"http://sallie.info\\\",\\\"dat\\\":\\\"http://burnice.org\\\", \\\"type\\\":\\\"application/dash+xml\\\"}\",\r\n  \"configurationGuid\": \"f012a69f-116a-43cf-b310-6009bce92009\",\r\n  \"callbackUrl\": \"https://aurelio.com\",\r\n  \"subtitlesUrl\": \"http://darrell.info\",\r\n  \"subtitlesFileName\": \"Frozen Handcrafted calculating\",\r\n  \"previousProjectGuid\": \"d6cbc2b6-e3b5-4a24-8341-14eb404d9c5a\",\r\n  \"editConfiguration\": true,\r\n  \"allowDownload\": true,\r\n  \"allowUpload\": true,\r\n  \"allowMediaOpen\": true,\r\n  \"sourceLanguageConfigurationGuid\": \"40d90e39-f118-41ae-8dca-a50c047bb37f\",\r\n  \"sourceImportConfigurationGuid\": \"870b80fb-c3ee-45bc-a58a-1fa8d848a57d\",\r\n  \"languageConfigurationGuid\": \"29376408-02a3-4b12-a0da-f7d7f95d83c0\",\r\n  \"importConfigurationGuid\": \"49435044-06f2-4525-98b2-fea4e92af31e\",\r\n  \"exportConfigurationGuid\": \"2cd6f2d2-95aa-4bb5-b251-be963046300b\",\r\n  \"videoConfigurationGuid\": \"0d6c58b7-95a0-4583-8ce4-b6bdbc12642f\",\r\n  \"startTC\": \"00:00:00:00\",\r\n  \"previousImportConfigurationGuid\": \"d8148299-fae0-4154-b518-11ceaf387e65\",\r\n  \"previousExportConfigurationGuid\": \"332107a8-19dc-4429-a514-58a1f571aced\",\r\n  \"previousLanguageConfigurationGuid\": \"4c683cf3-9535-4be7-b2f7-4649a7e9a3b4\",\r\n  \"previousSourceLanguageConfigurationGuid\": \"3043151a-c990-4a78-9c67-1eb7a6738a57\",\r\n  \"previousSourceImportConfigurationGuid\": \"48f65b81-462a-41e2-862e-35f5063fe9b6\",\r\n  \"previousVideoConfigurationGuid\": \"9764d3a0-c4b0-4895-b641-1cde7807c568\",\r\n  \"userUrl\": \"https://bruce.name\",\r\n  \"taskCompleteUrl\": \"https://erwin.name\",\r\n  \"taskCompleteShowModal\": true,\r\n  \"document\": \"https://tess.com\",\r\n  \"resignDocumentUrl\": \"http://magali.org\",\r\n  \"splitLimitation\": { \"fromDuration\": 870, \"toDuration\": 1340 }\r\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/project/d0ac5fa6-c6ef-4a9c-bc20-75b45b817d4b","host":["{{base_url}}"],"path":["external","project","85c4b139-a55c-46f5-a5c5-eee1b8d49136"],"query":[{"key":"force","value":"false","description":"Optional. true = open for this e-mail even if another user saved the project in the last 180 seconds.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""},{"id":"6df21604-7b66-4191-bc9c-05a1473b1893","name":"Create Pro Project with multiple files","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"requestId\": \"86e22184-215d-46f6-9601-777cf9776b64\",\r\n  \"email\": \"Novella_Waters@example.com\",\r\n  \"ip\": \"::1\",\r\n  \"app\": \"CreatePro\",\r\n  \"projectName\": \"invoice Analyst alarm Home\",\r\n  \"editConfiguration\": true,\r\n  \"allowDownload\": true,\r\n  \"allowUpload\": true,\r\n  \"allowMediaOpen\": true,\r\n  \"video\": \"{ \\\"src\\\": \\\"https://public.ooona.net/video/MERIDIAN/231220-135012.mpd\\\", \\\"dat\\\": \\\"https://public.ooona.net/video/MERIDIAN/MERIDIAN_downconvert.dat\\\" }\",\r\n  \"subtitlesUrl\": null,\r\n  \"subtitlesList\": \"[{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.ar.xml\\\",\\\"language\\\":\\\"Arabic\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.ar.xml\\\"},{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.de.xml\\\",\\\"language\\\":\\\"German\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.de.xml\\\"},{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.el.xml\\\",\\\"language\\\":\\\"Greek\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.el.xml\\\"},{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.en.xml\\\",\\\"language\\\":\\\"English\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.en.xml\\\"},{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.es.xml\\\",\\\"language\\\":\\\"Spanish\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.es.xml\\\"},{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.fr.xml\\\",\\\"language\\\":\\\"French\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.fr.xml\\\"},{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.he.xml\\\",\\\"language\\\":\\\"Hebrew\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.he.xml\\\"},{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.ja.xml\\\",\\\"language\\\":\\\"Japanese\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.ja.xml\\\"},{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.ko.xml\\\",\\\"language\\\":\\\"Korean\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.ko.xml\\\"},{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.pt.xml\\\",\\\"language\\\":\\\"Portuguese\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.pt.xml\\\"},{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.ru.xml\\\",\\\"language\\\":\\\"Russian\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.ru.xml\\\"},{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.th.xml\\\",\\\"language\\\":\\\"Thai\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.th.xml\\\"}]\"\r\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/project/2eb207f5-e48e-43e1-90c9-c3e911e56cd1","host":["{{base_url}}"],"path":["external","project","bf87e96f-1b3e-407c-8c2f-86a02fda3fa3"],"query":[{"key":"force","value":"false","description":"Optional. true = open for this e-mail even if another user saved the project in the last 180 seconds.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""}],"_postman_id":"132c30a9-cf43-420a-a702-c52ef89f363b"},{"name":"Translate Pro Project","id":"523286ed-a023-4aac-9030-9c798a7e8ae3","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"61d1e406-caa9-43a0-a143-fdb0e2bf0950\",\n  \"email\": \"Rodger78@example.net\",\n  \"ip\": \"::1\",\n  \"projectName\": \"copying Checking\",\n  \"adminEmail\": \"Jarrod_Von@example.com\",\n  \"app\": \"TranslatePro\",\n  \"editConfiguration\": true,\n  \"allowDownload\": true,\n  \"allowUpload\": true,\n  \"allowMediaOpen\": true,\n  \"video\": \"https://addison.net\",\n  \"subtitlesUrl\": \"\",\n  \"configurationGuid\": \"928d6ca2-b348-4dd9-8e11-1afdf6dc594d\",\n  \"importConfigurationGuid\": \"459e6f11-d469-406a-8ce4-665eed36eb7e\",\n  \"exportConfigurationGuid\": \"5bea0d3c-016d-4bfa-b2ab-0f74f53a779d\",\n  \"languageConfigurationGuid\": \"1e39f676-b5c1-403c-9cda-0fbca0abc500\",\n  \"sourceLanguageConfigurationGuid\": \"94942999-a66a-43e5-9543-646899747e84\",\n  \"sourceImportConfigurationGuid\": \"182cfe48-d568-4b5c-be69-635e763be248\",\n  \"callbackUrl\": \"https://karine.name\",\n  \"taskCompleteUrl\": \"\",\n  \"taskCompleteShowModal\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/179a4af4-0fdd-4eff-bce7-433763aaf181","description":"<p>Opens the <strong>Translate Pro</strong> app. A Translate Pro project has a source column and a target column: supply the source subtitles through <code>subtitlesUrl</code> / <code>subtitlesList</code> (with <code>sourceImportConfigurationGuid</code> if the source needs different import settings), the target language through <code>languageConfigurationGuid</code> and the source language through <code>sourceLanguageConfigurationGuid</code>.</p>\n<p>Same endpoint, route, query string, behaviour and response as <em>Create Pro Project</em>; the full field reference is in that request's description and applies unchanged. The sample body below shows the fields typically used for Translate Pro; add any other field from the reference as needed.</p>\n<p><strong>Behaviour.</strong> Role: <code>API</code>. The GUID in the route is the project id and <strong>you generate it and keep it</strong>.</p>\n<ul>\n<li>First call with a GUID creates the open-request (the project itself is created when the user opens the link). A later call with the same GUID updates the stored request with the fields you send and re-opens the existing project for editing; omitted <code>previous...</code> GUIDs keep their earlier values.</li>\n<li>Each call issues a new one-time token and returns the link containing it.</li>\n<li>If the project currently belongs to a <em>different</em> e-mail and was modified within the last 180 seconds, the link opens it in view-only (read-only) mode without transferring ownership. Add <code>?force=true</code> to ignore that and hand the project to <code>email</code> (risk: two users overwriting each other). Outside that window ownership simply moves to <code>email</code>.</li>\n<li>An empty body is rejected.</li>\n</ul>\n<p><strong>Query string.</strong> <code>force</code> (optional, <code>true</code>/<code>false</code>, default <code>false</code>): as described above.</p>\n<p><strong>Success response</strong> (<code>200 OK</code>, JSON string): the absolute URL to redirect the user to, <code>https://&lt;host&gt;/V2/external?token=&lt;token&gt;</code>.</p>\n<p><strong>Errors.</strong> There is no validation response: the endpoint raises an error (an error response, not a field-level 4xx) for an empty body (\"Request body is empty.\"), malformed JSON, or when the user account for <code>email</code> cannot be created.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","project","38e1e5d1-b5eb-4438-a268-ea37714e6218"],"host":["{{base_url}}"],"query":[{"disabled":true,"description":{"content":"<p>Optional. true = open for this e-mail even if another user saved the project in the last 180 seconds.</p>\n","type":"text/plain"},"key":"force","value":"false"}],"variable":[]}},"response":[{"id":"62655072-ecce-4108-9c90-8eafba96f6fa","name":"Translate Pro Project","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"requestId\": \"5f9a2b75-91f8-453e-b40b-b6a3216bd21b\",\r\n    \"email\": \"Marilie.Jerde32@example.net\",\r\n    \"ip\": \"::1\",\r\n    \"projectName\": \"EXE Prairie Assistant\",\r\n    \"adminEmail\": \"Reid.Wolff@example.com\",\r\n    \"app\": \"TranslatePro\",\r\n    \"editConfiguration\": true,\r\n    \"allowDownload\": true,\r\n    \"allowUpload\": true,\r\n    \"allowMediaOpen\": true,\r\n    \"video\": \"http://carson.org\",\r\n    \"subtitlesUrl\": \"\",\r\n    \"configurationGuid\": \"f40e1f38-3863-4f6b-8d19-c3831cdf8fb1\",\r\n    \"importConfigurationGuid\": \"bed739fd-41ab-4b66-9dfd-e6727167cf30\",\r\n    \"exportConfigurationGuid\": \"84e7d52a-9e8d-4474-9a05-fe91d5133f1a\",\r\n    \"languageConfigurationGuid\": \"0a2ab71e-9047-4197-b1d8-5c23406d0aa4\",\r\n    \"callbackUrl\": \"https://veronica.biz\",\r\n    \"taskCompleteUrl\": \"\",\r\n    \"taskCompleteShowModal\": false\r\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/project/a053cf7c-1552-4af7-ab07-50319af8ab6f","host":["{{base_url}}"],"path":["external","project","c99f4224-dd88-4c6f-a0c8-60937ea6df55"],"query":[{"key":"force","value":"false","description":"Optional. true = open for this e-mail even if another user saved the project in the last 180 seconds.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"99"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=aN8hzjoQfLKPOaHZXvAoMPhvzqdYouewVH1jLvajWO4\""},{"id":"f7784317-f2b7-470a-89ef-2382d4ab7673","name":"Translate Pro Project with split by index","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"requestId\": \"f316274b-1eca-4eac-92f8-832ebad26b0d\",\r\n    \"email\": \"Landen.Shields93@example.org\",\r\n    \"ip\": \"::1\",\r\n    \"projectName\": \"backing Dynamic back\",\r\n    \"adminEmail\": \"Toy15@example.com\",\r\n    \"app\": \"TranslatePro\",\r\n    \"editConfiguration\": true,\r\n    \"allowDownload\": true,\r\n    \"allowUpload\": true,\r\n    \"allowMediaOpen\": true,\r\n    \"video\": \"https://marcus.biz\",\r\n    \"subtitlesUrl\": \"\",\r\n    \"configurationGuid\": \"fbf6f0b3-d93d-4df6-8f29-98a0ce3cc523\",\r\n    \"importConfigurationGuid\": \"0aa3e8ab-d2e7-4a76-9fb7-5e57ba5f1a33\",\r\n    \"exportConfigurationGuid\": \"f8d602cc-993e-458a-9540-e33b9c7cfedc\",\r\n    \"languageConfigurationGuid\": \"c3b6e32e-a896-4f5a-9289-d4d51cdac649\",\r\n    \"callbackUrl\": \"http://boris.org\",\r\n    \"taskCompleteUrl\": \"\",\r\n    \"taskCompleteShowModal\": false,\r\n    \"splitLimitation\": { \"fromSubtitle\": 500, \"toSubtitle\": 950 }\r\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/project/27f119b9-5d6f-4e01-b300-5ed0c6ada7a8","host":["{{base_url}}"],"path":["external","project","bba650b3-8d90-463a-85a8-82b2b1d7a630"],"query":[{"key":"force","value":"false","description":"Optional. true = open for this e-mail even if another user saved the project in the last 180 seconds.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""}],"_postman_id":"523286ed-a023-4aac-9030-9c798a7e8ae3"},{"name":"Review Project","id":"08e0d2ae-6455-4bee-88cf-1e53c275b6ee","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"c3412530-11c5-4845-a653-6ade3f50f5e6\",\n  \"email\": \"Jamal_Gorczany@example.com\",\n  \"ip\": \"::1\",\n  \"projectName\": \"Mayotte Rustic AGP Administrator\",\n  \"adminEmail\": \"Murray_Frami@example.com\",\n  \"app\": \"ReviewPro\",\n  \"previousProjectGuid\": \"0a2e5125-25ba-47b9-a75d-b4d24f4007fc\",\n  \"editConfiguration\": true,\n  \"allowDownload\": true,\n  \"allowUpload\": true,\n  \"allowMediaOpen\": true,\n  \"video\": \"\",\n  \"subtitlesUrl\": \"\",\n  \"configurationGuid\": \"1eb0090d-efdb-445e-9a6d-af4ba73e01e4\",\n  \"importConfigurationGuid\": \"722b6374-07d2-4c2a-b490-f5a05df40615\",\n  \"exportConfigurationGuid\": \"76876d48-ddd7-4a26-8dbb-6a8530eb2b3f\",\n  \"languageConfigurationGuid\": \"e2254a95-0de4-4de5-bb20-1f446ef0639c\",\n  \"callbackUrl\": \"http://herminia.name\",\n  \"taskCompleteUrl\": \"\",\n  \"taskCompleteShowModal\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/e0a7b1b3-072a-45bb-8746-bcc4d8acf3f1","description":"<p>Opens the <strong>Review Pro</strong> app. Review compares the work against an earlier version: pass the GUID of the previous project in <code>previousProjectGuid</code> (its subtitles become the original the reviewer's edits are measured against; see <em>Project Changes</em>). <code>video</code> and <code>subtitlesUrl</code> may be left empty when the previous project already holds them.</p>\n<p>Same endpoint, route, query string, behaviour and response as <em>Create Pro Project</em>; the full field reference is in that request's description and applies unchanged. The sample body below shows the fields typically used for Review Pro.</p>\n<p><strong>Behaviour.</strong> Role: <code>API</code>. The GUID in the route is the project id and <strong>you generate it and keep it</strong>.</p>\n<ul>\n<li>First call with a GUID creates the open-request (the project itself is created when the user opens the link). A later call with the same GUID updates the stored request with the fields you send and re-opens the existing project for editing; omitted <code>previous...</code> GUIDs keep their earlier values.</li>\n<li>Each call issues a new one-time token and returns the link containing it.</li>\n<li>If the project currently belongs to a <em>different</em> e-mail and was modified within the last 180 seconds, the link opens it in view-only (read-only) mode without transferring ownership. Add <code>?force=true</code> to ignore that and hand the project to <code>email</code> (risk: two users overwriting each other). Outside that window ownership simply moves to <code>email</code>.</li>\n<li>An empty body is rejected.</li>\n</ul>\n<p><strong>Query string.</strong> <code>force</code> (optional, <code>true</code>/<code>false</code>, default <code>false</code>): as described above.</p>\n<p><strong>Success response</strong> (<code>200 OK</code>, JSON string): the absolute URL to redirect the user to, <code>https://&lt;host&gt;/V2/external?token=&lt;token&gt;</code>.</p>\n<p><strong>Errors.</strong> There is no validation response: the endpoint raises an error (an error response, not a field-level 4xx) for an empty body (\"Request body is empty.\"), malformed JSON, or when the user account for <code>email</code> cannot be created.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","project","8d79f8c3-5a98-4f05-b073-e63112f07668"],"host":["{{base_url}}"],"query":[{"disabled":true,"description":{"content":"<p>Optional. true = open for this e-mail even if another user saved the project in the last 180 seconds.</p>\n","type":"text/plain"},"key":"force","value":"false"}],"variable":[]}},"response":[{"id":"f56c749a-ef46-4354-965a-383319fad9a7","name":"Review Project","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"requestId\": \"c3dafb1f-5c7a-407b-8875-00635f6a55fe\",\r\n    \"email\": \"Velma_Champlin5@example.org\",\r\n    \"ip\": \"::1\",\r\n    \"projectName\": \"Avon Designer\",\r\n    \"adminEmail\": \"Myrtle18@example.com\",\r\n    \"app\": \"ReviewPro\",\r\n    \"previousProjectGuid\": \"a4da7fc6-bf50-44f9-8b50-a95e1c7adeff\",\r\n    \"editConfiguration\": true,\r\n    \"allowDownload\": true,\r\n    \"allowUpload\": true,\r\n    \"allowMediaOpen\": true,\r\n    \"video\": \"\",\r\n    \"subtitlesUrl\": \"\",\r\n    \"configurationGuid\": \"c7b93a57-fd98-41b6-b694-1fd4485b2979\",\r\n    \"importConfigurationGuid\": \"ecf252ce-7fa9-4e84-bcc9-f4ee4ffcf10e\",\r\n    \"exportConfigurationGuid\": \"d5b4c9c6-e787-43c1-aff9-318fec261297\",\r\n    \"languageConfigurationGuid\": \"4f241fe6-0f86-40d2-b888-56d9628e2e95\",\r\n    \"callbackUrl\": \"https://velma.com\",\r\n    \"taskCompleteUrl\": \"\",\r\n    \"taskCompleteShowModal\": false\r\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/project/cfef2997-313b-4d34-82b3-09dde8eced6a","host":["{{base_url}}"],"path":["external","project","dd722363-f8ef-4232-83f7-db33574701fe"],"query":[{"key":"force","value":"false","description":"Optional. true = open for this e-mail even if another user saved the project in the last 180 seconds.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"97"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=eOnZ4rDZoEy8EpDeicJ6cc6d9SeAi8jwKdlbINb40\""},{"id":"30fab5ca-322e-4f86-a2b7-2c9d6d57699f","name":"Review Project with multiple files","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"requestId\": \"53dfb254-4fa1-4276-96d7-1311ed59c462\",\r\n  \"email\": \"Ralph40@example.com\",\r\n  \"ip\": \"::1\",\r\n  \"app\": \"CreatePro\",\r\n  \"projectName\": \"Berkshire red Regional Walks feed\",\r\n  \"editConfiguration\": true,\r\n  \"allowDownload\": true,\r\n  \"allowUpload\": true,\r\n  \"allowMediaOpen\": true,\r\n  \"video\": \"{ \\\"src\\\": \\\"https://public.ooona.net/video/MERIDIAN/231220-135012.mpd\\\", \\\"dat\\\": \\\"https://public.ooona.net/video/MERIDIAN/MERIDIAN_downconvert.dat\\\" }\",\r\n  \"subtitlesUrl\": null,\r\n  \"subtitlesList\": \"[{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.ar.xml\\\",\\\"language\\\":\\\"Arabic\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.ar.xml\\\"},{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.de.xml\\\",\\\"language\\\":\\\"German\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.de.xml\\\"},{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.el.xml\\\",\\\"language\\\":\\\"Greek\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.el.xml\\\"},{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.en.xml\\\",\\\"language\\\":\\\"English\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.en.xml\\\"},{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.es.xml\\\",\\\"language\\\":\\\"Spanish\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.es.xml\\\"},{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.fr.xml\\\",\\\"language\\\":\\\"French\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.fr.xml\\\"},{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.he.xml\\\",\\\"language\\\":\\\"Hebrew\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.he.xml\\\"},{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.ja.xml\\\",\\\"language\\\":\\\"Japanese\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.ja.xml\\\"},{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.ko.xml\\\",\\\"language\\\":\\\"Korean\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.ko.xml\\\"},{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.pt.xml\\\",\\\"language\\\":\\\"Portuguese\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.pt.xml\\\"},{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.ru.xml\\\",\\\"language\\\":\\\"Russian\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.ru.xml\\\"},{\\\"url\\\":\\\"https://public.ooona.net/video/MERIDIAN/ttml/Meridian.th.xml\\\",\\\"language\\\":\\\"Thai\\\",\\\"fileType\\\":\\\"Subtitles\\\",\\\"description\\\":\\\"This is a dummy description for file Meridian.th.xml\\\"}]\"\r\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/project/c0ce1d64-44ef-4b63-b4f0-7faecabcd082","host":["{{base_url}}"],"path":["external","project","7751d686-2305-4f1f-a882-488b0829ee96"],"query":[{"key":"force","value":"false","description":"Optional. true = open for this e-mail even if another user saved the project in the last 180 seconds.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"97"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=eOnZ4rDZoEy8EpDeicJ6cc6d9SeAi8jwKdlbINb40\""}],"_postman_id":"08e0d2ae-6455-4bee-88cf-1e53c275b6ee"},{"name":"MultilingualQC Project","id":"ee81e605-26ab-4718-9afb-5d3baf9f6366","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"[\n  {\n    \"projectGuid\": \"6c84a7a0-3458-4ba1-b640-dd548d58c0dd\",\n    \"projectName\": \"Show S01E01 - French\",\n    \"email\": \"Eva.Heller@example.net\",\n    \"adminEmail\": \"Herman_Hoppe85@example.com\",\n    \"ip\": \"::1\",\n    \"video\": \"https://kaia.com\",\n    \"subtitlesUrl\": \"http://rosemary.info\",\n    \"subtitlesFileName\": \"Show.S01E01.fr.xml\",\n    \"configurationGuid\": \"073b6980-ff8c-429a-a615-396b3f4031f7\",\n    \"importConfigurationGuid\": \"9ca4c565-df3e-4be8-b400-d32156ad74f0\",\n    \"exportConfigurationGuid\": \"c37c3791-c662-4198-91f9-50260cd1a9d5\",\n    \"languageConfigurationGuid\": \"d0be6906-6c80-43b8-986c-cb6e8a4f147e\",\n    \"startTC\": \"01:00:00:00\",\n    \"editConfiguration\": true,\n    \"allowDownload\": true,\n    \"allowUpload\": true,\n    \"allowMediaOpen\": true,\n    \"callbackUrl\": \"http://judah.org\",\n    \"unlock\": false\n  },\n  {\n    \"projectGuid\": \"d5b5a60e-0c21-4ed5-95f6-db2dc4d87b48\",\n    \"projectName\": \"Show S01E01 - German\",\n    \"email\": \"Wilhelm33@example.com\",\n    \"video\": \"http://evan.com\",\n    \"subtitlesUrl\": \"http://emmanuelle.com\",\n    \"subtitlesFileName\": \"Show.S01E01.de.xml\",\n    \"languageConfigurationGuid\": \"4257a985-084f-41ac-bf3a-50bb804648e9\",\n    \"startTC\": \"01:00:00:00\",\n    \"unlock\": false\n  }\n]","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/MultilingualQC/3f044ac3-0397-4093-a8bb-4f056f13521c","description":"<p>Opens the <strong>MultilingualQC</strong> app: one editor session that holds several language projects (\"sub-projects\") of the same title side by side. Role: <code>API</code>. Two ways to call it:</p>\n<ul>\n<li><code>POST external/MultilingualQC/{id}</code> - <code>{id}</code> is the GUID of the root (container) project. The <code>{id}</code> segment is <strong>optional</strong>: <code>POST external/MultilingualQC</code> generates a new GUID for you.</li>\n<li><code>POST external/project/{id}</code> with an array body does exactly the same; <code>external/MultilingualQC</code> simply forwards to it.</li>\n</ul>\n<p><strong>Body.</strong> A JSON <strong>array</strong> with one entry per language project. Each entry is a normal project request: every field in the <em>Create Pro Project</em> reference applies (see that description for the complete table), plus:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>projectGuid</code></td>\n<td>GUID of this sub-project. Generated when omitted.</td>\n</tr>\n<tr>\n<td><code>unlock</code></td>\n<td><code>true</code> on any entry clears the lock on the root and on every entry that has a <code>projectGuid</code> (used when a completed task is un-completed).</td>\n</tr>\n</tbody>\n</table>\n</div><p>The root takes <code>app</code> = <code>MultilingualQC</code> and its session, permission and configuration fields from the <strong>first</strong> entry (<code>email</code>, <code>adminEmail</code>, <code>ip</code>, <code>allow*</code>, <code>editConfiguration</code>, <code>baseUrl</code>, <code>configurationGuid</code> / <code>configurationJson</code>, <code>disabledMenuItems</code>, <code>enabledMenuItems</code>, <code>hideTabs</code>, <code>document</code>, <code>startTC</code>, <code>video</code>, <code>resignVideoUrl</code>, <code>userUrl</code>, <code>videoConfigurationGuid</code> / <code>videoConfigurationJson</code>, <code>previousVideoConfigurationGuid</code> / <code>previousVideoConfigurationJson</code>, <code>validationData</code>). Its name is \"Multilingual \" plus the common prefix of all <code>projectName</code> values (or the first word of the first name when there is no common prefix). An empty array or body is rejected.</p>\n<p><strong>Behaviour.</strong> Same create/re-open, ownership and view-only (<code>?force=true</code>) rules as <em>Create Pro Project</em>; if any existing sub-project is owned by another recently active user the session also opens read-only. On creation one request record is stored per sub-project.</p>\n<p><strong>Success response</strong> (<code>200 OK</code>, JSON string): <code>https://&lt;host&gt;/V2/external?token=&lt;token&gt;</code> - redirect the user there.</p>\n<p><strong>Errors.</strong> As for <em>Create Pro Project</em> (an error is raised for an empty array/body or malformed JSON).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","MultilingualQC","9c33d758-81df-46cf-b14b-6f108334f615"],"host":["{{base_url}}"],"query":[{"disabled":true,"description":{"content":"<p>Optional. true = open for this e-mail even if another user saved the project in the last 180 seconds.</p>\n","type":"text/plain"},"key":"force","value":"false"}],"variable":[]}},"response":[{"id":"d8efc8ee-1f93-4909-83e2-e4208ae2c434","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"[\n  {\n    \"projectGuid\": \"ac23862a-f910-4b80-b787-50d44e38440a\",\n    \"projectName\": \"Show S01E01 - French\",\n    \"email\": \"Cordell.Hagenes96@example.com\",\n    \"adminEmail\": \"Annamae.Metz33@example.org\",\n    \"ip\": \"::1\",\n    \"video\": \"https://elissa.info\",\n    \"subtitlesUrl\": \"http://lenna.net\",\n    \"subtitlesFileName\": \"Show.S01E01.fr.xml\",\n    \"configurationGuid\": \"3651b466-1fed-40c1-9dca-5d6ddb0a208c\",\n    \"importConfigurationGuid\": \"0e7c9c9f-5fa2-4e4e-9847-e94e722470ad\",\n    \"exportConfigurationGuid\": \"8bfe5eeb-b504-4eae-8068-88712198b1fd\",\n    \"languageConfigurationGuid\": \"e3cdb706-4c0e-4488-ad9c-2743ca9075bd\",\n    \"startTC\": \"01:00:00:00\",\n    \"editConfiguration\": true,\n    \"allowDownload\": true,\n    \"allowUpload\": true,\n    \"allowMediaOpen\": true,\n    \"callbackUrl\": \"https://terrill.biz\",\n    \"unlock\": false\n  },\n  {\n    \"projectGuid\": \"d388cbcc-585e-4822-8464-5c9834a178f2\",\n    \"projectName\": \"Show S01E01 - German\",\n    \"email\": \"Melisa.Johns88@example.net\",\n    \"video\": \"http://esperanza.org\",\n    \"subtitlesUrl\": \"http://kavon.org\",\n    \"subtitlesFileName\": \"Show.S01E01.de.xml\",\n    \"languageConfigurationGuid\": \"f7a96ca4-7025-4b8e-8b09-b069f9609184\",\n    \"startTC\": \"01:00:00:00\",\n    \"unlock\": false\n  }\n]","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/MultilingualQC/fc36b816-a09a-4ea9-9d18-244c33f693fb","host":["{{base_url}}"],"path":["external","MultilingualQC","c205adb7-5834-4786-8101-3b96326f2620"],"query":[{"key":"force","value":"false","description":"Optional. true = open for this e-mail even if another user saved the project in the last 180 seconds.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=MvevAOPXmXQAbnToflgQoMiStI6gtPD2MCu0ZZSJug\""}],"_postman_id":"ee81e605-26ab-4718-9afb-5d3baf9f6366"},{"name":"Open Compare","id":"e069e06a-e270-4680-95d1-6023c7e4e02f","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"ac1a5a81-795f-4db9-9b81-79c981351b0f\",\n  \"email\": \"Archibald32@example.net\",\n  \"ip\": \"::1\",\n  \"app\": \"Compare\",\n  \"editConfiguration\": true,\n  \"allowDownload\": false,\n  \"allowUpload\": true,\n  \"allowMediaOpen\": true\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/app","description":"<p>Opens a standalone app (here <strong>Compare</strong>) that is not tied to a project and returns the one-time link to redirect the user to. Role: <code>API</code>.</p>\n<p><strong>Behaviour.</strong> Every call creates a new open-request (there is no project GUID, so nothing is re-opened) and a new one-time token. The user account for <code>email</code> is created on the fly if it doesn't exist.</p>\n<p><strong>Body</strong> (JSON). Takes the same fields as the project request (see <em>Create Pro Project</em> for the full table); the ones that matter for a standalone app:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>The app to open, e.g. <code>Compare</code>.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>User the link signs in as (required).</td>\n</tr>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>Your correlation id.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>editConfiguration</code>, <code>allowDownload</code>, <code>allowUpload</code>, <code>allowMediaOpen</code></td>\n<td>bool</td>\n<td>Default <code>false</code>. Permission/UI flags of the session.</td>\n</tr>\n<tr>\n<td><code>allowUnlock</code>, <code>allowShare</code></td>\n<td>bool or null</td>\n<td>Optional permissions.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Success response</strong> (<code>200 OK</code>, JSON string): <code>https://&lt;host&gt;/V2/external?token=&lt;token&gt;</code>.</p>\n<p><strong>Errors.</strong> Malformed JSON or a failure to create the user raises an error response.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","app"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"c1f8f1fa-46f1-4736-9943-e503d602919d","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"95d2a368-57db-47c8-9ee2-9b9738755970\",\n  \"email\": \"Linwood_Morissette58@example.com\",\n  \"ip\": \"::1\",\n  \"app\": \"Compare\",\n  \"editConfiguration\": true,\n  \"allowDownload\": false,\n  \"allowUpload\": true,\n  \"allowMediaOpen\": true\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/app"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=MvevAOPXmXQAbnToflgQoMiStI6gtPD2MCu0ZZSJug\""}],"_postman_id":"e069e06a-e270-4680-95d1-6023c7e4e02f"},{"name":"Project Status","id":"55d2491f-0f71-47cd-be9c-d38e63878938","request":{"method":"GET","header":[],"url":"{{base_url}}/external/status/ff561538-fa84-4e36-8f94-de9d7c397d04","description":"<p>Returns the current state of a project. Role: <code>API</code>. Read-only.</p>\n<p><strong>Route.</strong> <code>id</code> (required): project GUID.</p>\n<p><strong>Success response</strong> (<code>200 OK</code>, JSON):</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>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>string</td>\n<td>Project GUID.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Project name.</td>\n</tr>\n<tr>\n<td><code>dateCreated</code>, <code>dateModified</code></td>\n<td>datetime</td>\n<td>UTC.</td>\n</tr>\n<tr>\n<td><code>closed</code></td>\n<td>bool</td>\n<td>Set by <em>Close Project</em>.</td>\n</tr>\n<tr>\n<td><code>locked</code></td>\n<td>bool</td>\n<td>Set when the project was finished or closed.</td>\n</tr>\n<tr>\n<td><code>progress</code></td>\n<td>number</td>\n<td>Progress percentage stored for the project.</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td>Human-readable information line (e.g. <code>3 subtitles (3 changed)</code>).</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Errors.</strong> <code>404 Not Found</code> (empty body) when the project doesn't exist.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","status","31f11332-7dae-46b9-a3ae-59be72fdd76e"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"6c3ba683-a683-4fd7-8f4a-7bbafdc13c9a","name":"Project Status","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/status/da7b4462-eaa9-4e1c-ae25-413f0df6cb76"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"286"}],"cookie":[],"responseTime":null,"body":"{\n    \"closed\": false,\n    \"dateCreated\": \"2023-09-27T09:04:33.78\",\n    \"dateModified\": \"2023-09-27T09:04:49.677\",\n    \"id\": \"da7b4462-eaa9-4e1c-ae25-413f0df6cb76\",\n    \"locked\": false,\n    \"name\": \"cross-platform payment system\",\n    \"progress\": 0,\n    \"status\": \"3 subtitles (3 changed)\"\n}"},{"id":"90211d8c-787e-4c1e-8635-ff9b304e699d","name":"404 Project not found","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/status/00000000-0000-0000-0000-000000000000"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""}],"_postman_id":"55d2491f-0f71-47cd-be9c-d38e63878938"},{"name":"Project Activity","id":"4776370f-cad0-4538-8274-6cbde8aa1e9e","request":{"method":"GET","header":[],"url":"{{base_url}}/external/project-activity/3304a62d-a20d-4c13-b3a7-4107041d8904","description":"<p>Returns per-user work and idle time for a project, aggregated by e-mail address. Role: <code>API</code>. Read-only. See <em>Project Activity Raw Data</em> for the individual records.</p>\n<p><strong>Route.</strong> <code>id</code> (required): project GUID.</p>\n<p><strong>Success response</strong> (<code>200 OK</code>, JSON): an object keyed by user e-mail; each value has:</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>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>workTime</code></td>\n<td>time span <code>hh:mm:ss</code></td>\n<td>Total active time of that user.</td>\n</tr>\n<tr>\n<td><code>idleTime</code></td>\n<td>time span</td>\n<td>Total idle time of that user.</td>\n</tr>\n<tr>\n<td><code>startTime</code></td>\n<td>datetime</td>\n<td>Start of the user's first activity.</td>\n</tr>\n<tr>\n<td><code>endTime</code></td>\n<td>datetime</td>\n<td>End of the user's last activity.</td>\n</tr>\n</tbody>\n</table>\n</div><p>An empty object means no activity was recorded.</p>\n<p><strong>Errors.</strong> <code>404 Not Found</code> (empty body) when the project doesn't exist.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","project-activity","baecdc01-a521-4141-b85d-454c7550997f"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"47834cb6-f68f-43e7-891b-c3a114cb4e76","name":"Project Activity","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/project-activity/da7b4462-eaa9-4e1c-ae25-413f0df6cb76"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"174"}],"cookie":[],"responseTime":null,"body":"{\n    \"Keyon10@example.net\": {\n        \"endTime\": \"2023-09-27T09:06:00\",\n        \"idleTime\": \"00:00:00\",\n        \"startTime\": \"2023-09-27T09:05:00\",\n        \"workTime\": \"00:01:00\"\n    }\n}"},{"id":"44aac66b-ca68-4ab1-874b-8fb9219fb2d0","name":"404 Project not found","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/project-activity/00000000-0000-0000-0000-000000000000"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""}],"_postman_id":"4776370f-cad0-4538-8274-6cbde8aa1e9e"},{"name":"Project Activity Raw Data","id":"d7105fca-440f-4c27-b8e3-559ca9782f00","request":{"method":"GET","header":[],"url":"{{base_url}}/external/project-activity-raw/868193fa-b30d-4e41-8e2a-cc114f45bf57","description":"<p>Returns the individual activity records of a project (the data <em>Project Activity</em> aggregates). Role: <code>API</code>. Read-only. Overlapping heartbeats are merged so every moment is counted once.</p>\n<p><strong>Route.</strong> <code>id</code> (required): project GUID.</p>\n<p><strong>Success response</strong> (<code>200 OK</code>, JSON array). Each record:</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>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>ActivityId</code></td>\n<td>string</td>\n<td>Record id.</td>\n</tr>\n<tr>\n<td><code>UserId</code>, <code>UserEmail</code>, <code>UserIP</code></td>\n<td>string</td>\n<td>Who worked.</td>\n</tr>\n<tr>\n<td><code>StartTime</code>, <code>EndTime</code></td>\n<td>datetime</td>\n<td>Interval covered.</td>\n</tr>\n<tr>\n<td><code>Duration</code></td>\n<td>time span</td>\n<td>Length of the interval.</td>\n</tr>\n<tr>\n<td><code>ProjectId</code></td>\n<td>string</td>\n<td>Project GUID.</td>\n</tr>\n<tr>\n<td><code>IsIdle</code></td>\n<td>bool</td>\n<td><code>true</code> for idle time, <code>false</code> for active work.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Errors.</strong> <code>404 Not Found</code> (empty body) when the project doesn't exist.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","project-activity-raw","46115806-85a0-475d-a51f-512105f35ca8"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"c1c77e3a-4fa7-434f-98c6-e9f2e1d110a0","name":"Project Activity Raw Data","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/project-activity-raw/da7b4462-eaa9-4e1c-ae25-413f0df6cb76"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"388"}],"cookie":[],"responseTime":null,"body":"[\n    {\n        \"activityId\": \"3bc8c468-c34c-481f-acbe-6bb2a16fca2f\",\n        \"duration\": \"00:01:00\",\n        \"endTime\": \"2023-09-27T09:06:00\",\n        \"isIdle\": false,\n        \"projectId\": \"da7b4462-eaa9-4e1c-ae25-413f0df6cb76\",\n        \"startTime\": \"2023-09-27T09:05:00\",\n        \"userEmail\": \"Keyon10@example.net\",\n        \"userId\": \"9f2efa7f-c8ed-4a6c-9815-e937a76dbfc2\",\n        \"userIP\": \"62.90.165.53\"\n    }\n]"},{"id":"d35bc63c-85c4-4221-9502-8b6c9fed1f98","name":"404 Project not found","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/project-activity-raw/00000000-0000-0000-0000-000000000000"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""}],"_postman_id":"d7105fca-440f-4c27-b8e3-559ca9782f00"},{"name":"Project Statistics","id":"89e1a588-2564-492e-b8a6-7ede7a27b9ea","request":{"method":"GET","header":[],"url":"{{base_url}}/external/project-statistics/8b43979a-f0c7-4760-a0eb-a067d6c52aec","description":"<p>Returns content statistics and time tracking for a project. Role: <code>API</code>. Read-only.</p>\n<p><strong>Route.</strong> <code>projectId</code> (required): project GUID.</p>\n<p><strong>Success response</strong> (<code>200 OK</code>, JSON):</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>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>projectId</code>, <code>name</code>, <code>app</code></td>\n<td>string</td>\n<td>Identity of the project.</td>\n</tr>\n<tr>\n<td><code>information</code></td>\n<td>string</td>\n<td>Human-readable information line.</td>\n</tr>\n<tr>\n<td><code>progress</code></td>\n<td>number</td>\n<td>Progress percentage.</td>\n</tr>\n<tr>\n<td><code>totalWorkTime</code>, <code>totalIdleTime</code></td>\n<td>time span <code>hh:mm:ss</code></td>\n<td>Sum over all users.</td>\n</tr>\n<tr>\n<td><code>activities</code></td>\n<td>object</td>\n<td>Per user e-mail: <code>workTime</code>, <code>idleTime</code>, <code>startTime</code>, <code>endTime</code> (as in <em>Project Activity</em>).</td>\n</tr>\n<tr>\n<td><code>subtitlesCount</code>, <code>speakersCount</code>, <code>wordsCount</code></td>\n<td>int</td>\n<td>Content counts.</td>\n</tr>\n<tr>\n<td><code>charactersCount</code>, <code>charactersCountNoPunctuation</code></td>\n<td>int</td>\n<td>Character counts.</td>\n</tr>\n<tr>\n<td><code>untimedSubtitlesCount</code>, <code>emptySubtitlesCount</code></td>\n<td>int</td>\n<td>Subtitles without timing / without text.</td>\n</tr>\n<tr>\n<td><code>firstInCue</code>, <code>lastOutCue</code></td>\n<td>number or null</td>\n<td>First in-time / last out-time, in seconds.</td>\n</tr>\n<tr>\n<td><code>startTC</code></td>\n<td>number</td>\n<td>Project start timecode, in seconds.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Errors.</strong> <code>400 Bad Request</code> (\"Project ID is required.\") for an empty id; <code>404 Not Found</code> when the project doesn't exist.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","project-statistics","bd128e2b-e126-4419-a23c-1a6c3e1758bc"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"5b2d9cab-8d40-4d90-9d2e-cb51c3de45ea","name":"Project Statistics","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/project-statistics/77b936b9-606c-48cb-9c05-6706e6831234"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Cache-Control","value":"no-cache"},{"key":"Pragma","value":"no-cache"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Expires","value":"-1"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-XSS-Protection","value":"1; mode=block"},{"key":"Content-Security-Policy","value":"frame-ancestors 'self' *.ooona-test.net localhost:8011 localhost:3000; frame-src 'self' blob: https://view.officeapps.live.com/ https://docs.google.com/ https://www.youtube.com/ https://*.hubspot.com https://www.ooona.net/ https://*.ooona-test.net/ http://localhost:8088; font-src 'self' data: https://fonts.googleapis.com/ https://fonts.gstatic.com/; img-src 'self' data:  https://www.ooona.net/ https://*.ooona-test.net/ https://ooonatools.tv/ https://*.ooonatools-test.net/ https://*.hsforms.com https://*.hubspot.com https://toolkit-files-test-test.s3.amazonaws.com; default-src 'self' file: data: blob: filesystem:; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://www.dropbox.com/static/api/ https://www.youtube.com/ https://*.hubspot.com https://*.hsadspixel.net https://*.hs-scripts.com https://*.hs-analytics.net https://*.hs-banner.com https://*.hscollectedforms.net https://forms.hsforms.com https://*.usemessages.com; connect-src * blob: data:; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com/; object-src 'none'; media-src * file: data: blob: filesystem:"},{"key":"Strict-Transport-Security","value":"max-age=63072000"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"Referrer-Policy","value":"strict-origin-when-cross-origin"},{"key":"Permissions-Policy","value":"autoplay=(self \"https://*.ooonatools-test.net/\" \"https://www.youtube.com/\"), cross-origin-isolated=(self \"https://*.ooonatools-test.net/\" \"https://*.ooona-test.net/\"), encrypted-media=(self \"https://*.ooonatools-test.net/\" \"https://www.youtube.com/\"), fullscreen=(self \"https://*.ooonatools-test.net/\" \"https://*.ooona-test.net/\" \"https://www.youtube.com/\"), local-fonts=(self \"https://*.ooonatools-test.net/\"), hid=(self \"https://*.ooonatools-test.net/\"), microphone=(self \"https://*.ooonatools-test.net/\"), midi=(self \"https://*.ooonatools-test.net/\"), picture-in-picture=(self \"https://*.ooonatools-test.net/\" \"https://*.ooona-test.net/\" \"https://www.youtube.com/\"), window-management=(self \"https://*.ooonatools-test.net/\"), storage-access=(self \"https://*.ooonatools-test.net/\"), web-share=(self \"https://*.ooonatools-test.net/\" \"https://*.ooona-test.net/\"), idle-detection=(self \"https://*.ooonatools-test.net/\" \"https://*.ooona-test.net/\"), compute-pressure=(self), deferred-fetch=(self), deferred-fetch-minimal=(self), accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), bluetooth=(), browsing-topics=(), camera=(), display-capture=(), gamepad=(), geolocation=(), gyroscope=(), identity-credentials-get=(), magnetometer=(), otp-credentials=(), payment=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), usb=(), xr-spatial-tracking=()"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Access-Control-Allow-Headers","value":"*"},{"key":"Access-Control-Expose-Headers","value":"*"},{"key":"ooona-tools-version","value":"3.46.60"},{"key":"Date","value":"Wed, 16 Jul 2025 11:09:05 GMT"},{"key":"Content-Length","value":"717"}],"cookie":[],"responseTime":null,"body":"{\n    \"activities\": {\n        \"adam@ooona.net\": {\n            \"endTime\": \"2025-07-16T09:03:00\",\n            \"idleTime\": \"00:13:00\",\n            \"startTime\": \"2025-07-15T22:52:00\",\n            \"workTime\": \"00:03:00\"\n        }\n    },\n    \"app\": \"CreatePro\",\n    \"charactersCount\": 320,\n    \"charactersCountNoPunctuation\": 320,\n    \"emptySubtitlesCount\": 0,\n    \"firstInCue\": 3607.5839,\n    \"information\": \"40 subtitles\",\n    \"lastOutCue\": 3682.7925,\n    \"name\": \"Test IMSC 1.1 - Timings 2\",\n    \"progress\": 5,\n    \"projectId\": \"77b936b9-606c-48cb-9c05-6706e6831234\",\n    \"speakersCount\": 0,\n    \"startTC\": 3510.5082,\n    \"subtitlesCount\": 40,\n    \"totalIdleTime\": \"00:13:00\",\n    \"totalWorkTime\": \"00:03:00\",\n    \"untimedSubtitlesCount\": 0,\n    \"wordsCount\": 40\n}"},{"id":"d92b20a8-26bf-4c69-a2b1-23bfabd85f8f","name":"404 Project not found","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/project-statistics/00000000-0000-0000-0000-000000000000"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""}],"_postman_id":"89e1a588-2564-492e-b8a6-7ede7a27b9ea"},{"name":"Project Changes","id":"3dfda327-13ae-45cb-8c1e-35f5f3cdc7c7","request":{"method":"GET","header":[],"url":"{{base_url}}/external/project-changes/046f9786-6d6c-4faa-bbf8-68867327ff76","description":"<p>Reports how much the current subtitles of a <strong>Review Pro</strong> project differ from its original (the <code>originalProject</code> captured when the review began). Role: <code>API</code>. Read-only. Subtitles are paired by time or by index depending on the project's sync mode, with the project's minimum subtitle duration as time tolerance.</p>\n<p><strong>Route.</strong> <code>id</code> (required): project GUID.</p>\n<p><strong>Success response</strong> (<code>200 OK</code>, JSON):</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>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>projectId</code></td>\n<td>string</td>\n<td>Project GUID.</td>\n</tr>\n<tr>\n<td><code>error</code></td>\n<td>string</td>\n<td>Only present when the project has no original to compare against (see below).</td>\n</tr>\n<tr>\n<td><code>totalSubtitles</code></td>\n<td>int</td>\n<td>Subtitles in the current project.</td>\n</tr>\n<tr>\n<td><code>totalSourceSubtitles</code></td>\n<td>int</td>\n<td>Subtitles in the original.</td>\n</tr>\n<tr>\n<td><code>totalChanges</code></td>\n<td>int</td>\n<td>Subtitles changed, added or deleted.</td>\n</tr>\n<tr>\n<td><code>totalAdded</code>, <code>totalDeleted</code></td>\n<td>int</td>\n<td>Subtitles only in the current / only in the original.</td>\n</tr>\n<tr>\n<td><code>details</code></td>\n<td>object</td>\n<td>Counts of changed subtitles per kind: <code>text</code>, <code>timing</code>, <code>styling</code>, <code>horizontalPosition</code>, <code>verticalPosition</code>, <code>position</code>, <code>annotation</code>, <code>ccStyle</code>, <code>box</code>, <code>outline</code>, <code>font1</code>, <code>font2</code>. A subtitle can count in several kinds.</td>\n</tr>\n<tr>\n<td><code>textDiff</code></td>\n<td>object</td>\n<td><code>charsAdded</code>, <code>charsRemoved</code>, <code>totalOriginalChars</code>, <code>diffPercentage</code> (added + removed characters as a percentage of the original's, 2 decimals).</td>\n</tr>\n</tbody>\n</table>\n</div><p>If the project has no <code>originalProject</code> the call still returns <code>200 OK</code>, with <code>error: \"Project does not contain an originalProject.\"</code>, <code>totalSubtitles</code> filled and everything else <code>0</code>.</p>\n<p><strong>Errors.</strong> <code>404 Not Found</code> (empty body) when the project doesn't exist.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","project-changes","1a519c47-deae-4889-9757-8f07dbc00b38"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"70791d71-a60b-458b-947b-625d7f4fc1d5","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/project-changes/77b936b9-606c-48cb-9c05-6706e6831234"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"projectId\": \"77b936b9-606c-48cb-9c05-6706e6831234\",\n  \"totalSubtitles\": 42,\n  \"totalSourceSubtitles\": 40,\n  \"totalChanges\": 9,\n  \"totalAdded\": 2,\n  \"totalDeleted\": 0,\n  \"details\": {\n    \"text\": 5, \"timing\": 3, \"styling\": 1, \"horizontalPosition\": 0, \"verticalPosition\": 0,\n    \"position\": 0, \"annotation\": 0, \"ccStyle\": 0, \"box\": 0, \"outline\": 0, \"font1\": 0, \"font2\": 0\n  },\n  \"textDiff\": { \"charsAdded\": 61, \"charsRemoved\": 23, \"totalOriginalChars\": 1480, \"diffPercentage\": 5.68 }\n}"},{"id":"28dfe832-eac0-423e-ab79-d1c16653f8b2","name":"200 No original project","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/project-changes/77b936b9-606c-48cb-9c05-6706e6831234"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"projectId\": \"77b936b9-606c-48cb-9c05-6706e6831234\",\n  \"error\": \"Project does not contain an originalProject.\",\n  \"totalSubtitles\": 40,\n  \"totalSourceSubtitles\": 0,\n  \"totalChanges\": 0,\n  \"totalAdded\": 0,\n  \"totalDeleted\": 0,\n  \"details\": { \"text\": 0, \"timing\": 0, \"styling\": 0, \"horizontalPosition\": 0, \"verticalPosition\": 0, \"position\": 0, \"annotation\": 0, \"ccStyle\": 0, \"box\": 0, \"outline\": 0, \"font1\": 0, \"font2\": 0 },\n  \"textDiff\": { \"charsAdded\": 0, \"charsRemoved\": 0, \"totalOriginalChars\": 0, \"diffPercentage\": 0 }\n}"},{"id":"b55b83cb-a986-4e4c-8f2c-6e526c81f076","name":"404 Project not found","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/project-changes/00000000-0000-0000-0000-000000000000"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""}],"_postman_id":"3dfda327-13ae-45cb-8c1e-35f5f3cdc7c7"},{"name":"Projects Boundaries","id":"a744400b-83f7-41f5-aecf-7f98432d1513","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"[\"35933753-6852-452f-a7c4-5f7a909e9b0c\", \"f6bfc2e4-11c2-4447-b977-fdd047360e97\"]","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/projects-boundaries","description":"<p>Returns the first in-cue, last out-cue and subtitle count for several projects in one call. Role: <code>API</code>. Read-only (POST only because it takes a list).</p>\n<p><strong>Body.</strong> A JSON <strong>array of project GUID strings</strong> (required, non-empty), e.g. <code>[\"guid1\",\"guid2\"]</code>.</p>\n<p><strong>Success response</strong> (<code>200 OK</code>, JSON array, in request order), one object per GUID:</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>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>projectId</code></td>\n<td>string</td>\n<td>The project GUID.</td>\n</tr>\n<tr>\n<td><code>firstInCue</code>, <code>lastOutCue</code></td>\n<td>string</td>\n<td>SMPTE timecode in the project's own timecode format and frame rate.</td>\n</tr>\n<tr>\n<td><code>subtitlesCount</code></td>\n<td>int</td>\n<td>Number of subtitles.</td>\n</tr>\n<tr>\n<td><code>error</code></td>\n<td>string</td>\n<td><code>\"Project not found\"</code>, in place of the fields above, when that GUID doesn't exist (the call as a whole does not fail).</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Errors.</strong> <code>400 Bad Request</code> (\"Project IDs are required.\") for an empty or missing array.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","projects-boundaries"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"e6271aaf-4ab3-4031-b3e3-ae46a340fcad","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"[\"77b936b9-606c-48cb-9c05-6706e6831234\", \"00000000-0000-0000-0000-000000000000\"]","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/projects-boundaries"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"projectId\": \"77b936b9-606c-48cb-9c05-6706e6831234\",\n    \"firstInCue\": \"01:00:07:14\",\n    \"lastOutCue\": \"01:01:22:19\",\n    \"subtitlesCount\": 40\n  },\n  {\n    \"projectId\": \"00000000-0000-0000-0000-000000000000\",\n    \"error\": \"Project not found\"\n  }\n]"},{"id":"3d1d7a6c-0598-4db3-aede-04ce9cce2002","name":"400 Empty list","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"[]","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/projects-boundaries"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"Message\": \"Project IDs are required.\"\n}"}],"_postman_id":"a744400b-83f7-41f5-aecf-7f98432d1513"},{"name":"Export Project","id":"e4cd0c8a-7f21-44d3-88d4-5b0a4542780e","request":{"method":"POST","header":[],"url":"{{base_url}}/external/export/fcb3a21a-7607-4d00-a2b8-7090af6ec318?asSubtitles=false","description":"<p>Returns the project as OOONA project JSON. Role: <code>API</code>. Read-only (POST by design; nothing is changed, the export is written to the security log).</p>\n<p><strong>Route.</strong> <code>id</code> (required): project GUID.</p>\n<p><strong>Query string.</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>extendedProjectDataFile</code></td>\n<td>string</td>\n<td><em>(omitted)</em></td>\n<td>Optional. <code>v1</code> or <code>auto</code> returns the <em>extended project data</em> envelope (root project plus sub-projects); omitted returns the plain project JSON. Any other value raises an error.</td>\n</tr>\n<tr>\n<td><code>asSubtitles</code></td>\n<td>bool</td>\n<td><code>false</code></td>\n<td><code>true</code> returns only the subtitle data of the project instead of the full project.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Success response</strong> (<code>200 OK</code>): the JSON document <strong>serialized as a JSON string</strong> (the body is a quoted string with escaped quotes, so JSON-decode the body once more to get the object).</p>\n<p><strong>Errors.</strong> <code>404 Not Found</code> (empty body) when the project doesn't exist. To hand the project to a system that cannot send your API token, see <em>Export Project Signed URL</em>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","export","7e0d5724-ccc6-422f-a584-6058655b2dfa"],"host":["{{base_url}}"],"query":[{"disabled":true,"description":{"content":"<p>Optional: v1 or auto. Omit for plain project JSON.</p>\n","type":"text/plain"},"key":"extendedProjectDataFile","value":"v1"},{"description":{"content":"<p>true = return only the subtitles part.</p>\n","type":"text/plain"},"key":"asSubtitles","value":"false"}],"variable":[]}},"response":[{"id":"7a32ea4b-b9f2-4749-91dc-7b68d6e2deba","name":"Export Project","originalRequest":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/external/export/da7b4462-eaa9-4e1c-ae25-413f0df6cb76?asSubtitles=false","host":["{{base_url}}"],"path":["external","export","da7b4462-eaa9-4e1c-ae25-413f0df6cb76"],"query":[{"key":"extendedProjectDataFile","value":"v1","description":"Optional: v1 or auto. Omit for plain project JSON.","disabled":true},{"key":"asSubtitles","value":"false","description":"true = return only the subtitles part."}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"43212"}],"cookie":[],"responseTime":null,"body":"\"{\\n  \\\"app\\\": \\\"EditPro\\\",\\n  \\\"settings\\\": {\\n    \\\"isRtl\\\": false,\\n    \\\"showZeroParagraphInTable\\\": false,\\n    \\\"Cavena\\\": {\\n      \\\"translatedTitle\\\": null,\\n      \\\"originalTitle\\\": null,\\n      \\\"tapeNumber\\\": null,\\n      \\\"startOfMessage\\\": null,\\n      \\\"producer\\\": null,\\n      \\\"translatedEpisodeTitle\\\": null,\\n      \\\"comments\\\": null,\\n      \\\"translator\\\": null,\\n      \\\"useEmptyLinesInsteadOfVPos\\\": true\\n    },\\n    \\\"sub\\\": {\\n      \\\"useFullStopDelimiter\\\": false\\n    },\\n    \\\"exportTimecodeOffset\\\": 0,\\n    \\\"readingSpeedCountSpaces\\\": true,\\n    \\\"defaultOutline\\\": \\\"Outline\\\",\\n    \\\"autoComplyTimingGap\\\": false,\\n    \\\"absolutePositioning\\\": true,\\n    \\\"display\\\": {\\n      \\\"boxLeftMargin\\\": 18,\\n      \\\"boxOpacity\\\": 35,\\n      \\\"outlineColor\\\": \\\"#000000\\\",\\n      \\\"textColorOverride\\\": \\\"\\\",\\n      \\\"shadowColor\\\": \\\"#000000\\\",\\n      \\\"boxBottomMargin\\\": 0,\\n      \\\"outlineWidth\\\": 2,\\n      \\\"shadowOffsetX\\\": 0,\\n      \\\"boxType\\\": \\\"None\\\",\\n      \\\"letterBox\\\": \\\"None\\\",\\n      \\\"shadowOffsetY\\\": 0,\\n      \\\"antiAliasingType\\\": \\\"OuterNormal\\\",\\n      \\\"antiAliasingColor\\\": \\\"#808080\\\",\\n      \\\"isBold\\\": false,\\n      \\\"shadow1\\\": {\\n        \\\"size\\\": 0,\\n        \\\"color\\\": \\\"#000000\\\",\\n        \\\"offsetX\\\": 0,\\n        \\\"offsetY\\\": 0,\\n        \\\"blur\\\": 0,\\n        \\\"opacity\\\": 100,\\n        \\\"visible\\\": true\\n      },\\n      \\\"shadow2\\\": {\\n        \\\"size\\\": 0,\\n        \\\"color\\\": \\\"#000000\\\",\\n        \\\"offsetX\\\": 0,\\n        \\\"offsetY\\\": 0,\\n        \\\"blur\\\": 0,\\n        \\\"opacity\\\": 100,\\n        \\\"visible\\\": false\\n      },\\n      \\\"boxColor\\\": \\\"#000000\\\",\\n      \\\"boxTopMargin\\\": 0,\\n      \\\"outlineType\\\": \\\"Outline\\\",\\n      \\\"boxRightMargin\\\": 18\\n    },\\n    \\\"exportEmptySubtitles\\\": \\\"ask\\\",\\n    \\\"defaultColor\\\": null,\\n    \\\"font1\\\": \\\"Arial\\\",\\n    \\\"minSubDuration\\\": 0.8333,\\n    \\\"lineGap\\\": 1,\\n    \\\"engine\\\": \\\"OoonaConvert\\\",\\n    \\\"SMPTE_428\\\": {\\n      \\\"fontEffect\\\": \\\"none\\\",\\n      \\\"spacing\\\": \\\"0\\\",\\n      \\\"fontEffectColor\\\": \\\"\\\",\\n      \\\"feather\\\": \\\"no\\\",\\n      \\\"exportFont\\\": false,\\n      \\\"fadeUpTime\\\": 0,\\n      \\\"font2URI\\\": \\\"\\\",\\n      \\\"fadeDownTime\\\": 0,\\n      \\\"startTime\\\": 0,\\n      \\\"writeStartTime\\\": false,\\n      \\\"effectSize\\\": \\\"0.01\\\",\\n      \\\"encoding\\\": \\\"UTF-8\\\",\\n      \\\"version\\\": \\\"ST428-7-2007\\\",\\n      \\\"language\\\": \\\"English\\\",\\n      \\\"fadeDownUp\\\": false,\\n      \\\"reel\\\": 1,\\n      \\\"displayType\\\": \\\"\\\",\\n      \\\"fontURI\\\": \\\"\\\"\\n    },\\n    \\\"alignAllLines\\\": true,\\n    \\\"ccSettings\\\": {\\n      \\\"defaultOutline\\\": \\\"Outline\\\",\\n      \\\"minSubDuration\\\": 0.8333,\\n      \\\"alignAllLines\\\": true,\\n      \\\"defaultAlign\\\": \\\"Center\\\",\\n      \\\"graphicalLineLengthFormat\\\": null,\\n      \\\"preventTimingOverlap\\\": true,\\n      \\\"timingFramesGap\\\": 2,\\n      \\\"maxTimingGap\\\": null,\\n      \\\"defaultBox\\\": \\\"FixedBox\\\",\\n      \\\"graphicalLineLength\\\": false,\\n      \\\"maxSubDuration\\\": 7,\\n      \\\"defaultJustification\\\": \\\"Left\\\",\\n      \\\"screenLines\\\": 15,\\n      \\\"graphicalLineLengthFont1\\\": null,\\n      \\\"maxParagraphLines\\\": 2,\\n      \\\"graphicalLineLengthFont2\\\": null,\\n      \\\"doubleHeight\\\": false,\\n      \\\"EBU\\\": {\\n        \\\"standard\\\": \\\"OpenSubtitles\\\"\\n      },\\n      \\\"lineLength\\\": 32\\n    },\\n    \\\"mode\\\": \\\"Open\\\",\\n    \\\"font2\\\": \\\"Arial\\\",\\n    \\\"autoRecognizeTimeFormat\\\": true,\\n    \\\"importTimecodeStart\\\": null,\\n    \\\"autoBreakLine\\\": true,\\n    \\\"exportFontSize\\\": 48,\\n    \\\"timeFormat\\\": \\\"SMPTE\\\",\\n    \\\"defaultAlign\\\": \\\"Center\\\",\\n    \\\"RTF\\\": {\\n      \\\"includeInOutCues\\\": false,\\n      \\\"includeSubtitleNumber\\\": false,\\n      \\\"includeReadingSpeedInformation\\\": false,\\n      \\\"isBold\\\": false,\\n      \\\"includeItalicsUnderline\\\": false,\\n      \\\"includeAlignment\\\": false,\\n      \\\"includeColorsFormatting\\\": false\\n    },\\n    \\\"graphicalLineLengthFormat\\\": null,\\n    \\\"preventTimingOverlap\\\": true,\\n    \\\"tagsExportFilter\\\": null,\\n    \\\"defaultBotenVertical\\\": \\\"﹅\\\",\\n    \\\"replaceEllipsis\\\": 0,\\n    \\\"preserveSafeArea\\\": false,\\n    \\\"shotChangesSnapAreaFrames\\\": 8,\\n    \\\"timingFramesGap\\\": 2,\\n    \\\"pacCharacterSet1\\\": \\\"Latin\\\",\\n    \\\"replaceAsianQuotes\\\": {\\n      \\\"align\\\": true,\\n      \\\"lowerQuotes\\\": false,\\n      \\\"replace\\\": 0\\n    },\\n    \\\"track2\\\": null,\\n    \\\"filename\\\": \\\"\\\",\\n    \\\"overrides\\\": null,\\n    \\\"overrideReadingSpeed\\\": false,\\n    \\\"pacCharacterSet2\\\": \\\"Latin\\\",\\n    \\\"hideOutCue\\\": false,\\n    \\\"ai\\\": {\\n      \\\"asr\\\": {\\n        \\\"maxSentenceWordGap\\\": null,\\n        \\\"provider\\\": null\\n      },\\n      \\\"mt\\\": {\\n        \\\"provider\\\": null\\n      },\\n      \\\"tts\\\": {\\n        \\\"pitch\\\": \\\"0%\\\",\\n        \\\"languageCode\\\": null,\\n        \\\"speed\\\": \\\"0%\\\",\\n        \\\"voiceId\\\": null,\\n        \\\"provider\\\": null,\\n        \\\"country\\\": null,\\n        \\\"language\\\": null,\\n        \\\"volume\\\": \\\"0%\\\",\\n        \\\"voiceName\\\": null\\n      }\\n    },\\n    \\\"track3\\\": null,\\n    \\\"DLP\\\": {\\n      \\\"importDetectCenterLeftAligned\\\": true,\\n      \\\"reelNumber\\\": 1,\\n      \\\"overrideTextColorValue\\\": \\\"#FFFFFF\\\",\\n      \\\"overrideTextEffects\\\": false,\\n      \\\"overrideTextColor\\\": false,\\n      \\\"importOverrideSafeArea\\\": false,\\n      \\\"exportImages\\\": false,\\n      \\\"overrideEffectsColor\\\": \\\"#000000\\\",\\n      \\\"overrideEffectsType\\\": \\\"none\\\",\\n      \\\"toFrameRate\\\": \\\"24 fps\\\",\\n      \\\"useStandardFont\\\": true,\\n      \\\"applyVideoFrameRateConversion\\\": false,\\n      \\\"fadeUp\\\": 20,\\n      \\\"version\\\": \\\"DCSubtitle 1.0\\\",\\n      \\\"title\\\": \\\"\\\",\\n      \\\"presentationList\\\": false,\\n      \\\"fadeDownUp\\\": false,\\n      \\\"compressTrueTypeFont\\\": false,\\n      \\\"fontURI\\\": \\\"\\\",\\n      \\\"fadeDown\\\": 20,\\n      \\\"exportFontFile\\\": false\\n    },\\n    \\\"maxTimingGap\\\": null,\\n    \\\"audioScrubbingEnabled\\\": true,\\n    \\\"exportComments\\\": false,\\n    \\\"previewScriptSubtitles\\\": null,\\n    \\\"track4\\\": null,\\n    \\\"specialFont1\\\": \\\"\\\",\\n    \\\"fps\\\": 23.976,\\n    \\\"countryKey\\\": \\\"USA\\\",\\n    \\\"characterHalfWidth\\\": false,\\n    \\\"appendStartIndex\\\": null,\\n    \\\"sami\\\": {\\n      \\\"mediaFile\\\": \\\"test@.wmv\\\",\\n      \\\"normalFontName\\\": \\\"Arial\\\",\\n      \\\"createHTMLFile\\\": true,\\n      \\\"sourceIdFont\\\": 1,\\n      \\\"createASXFile\\\": true,\\n      \\\"sourceIdBackColor\\\": \\\"FF0000\\\",\\n      \\\"sourceIdFontSize\\\": 12,\\n      \\\"htmlCWHeight\\\": 80,\\n      \\\"sourceIdFontStyles\\\": \\\"1\\\",\\n      \\\"exportSourceId\\\": false,\\n      \\\"closePSyncTags\\\": false,\\n      \\\"normalFontColor\\\": \\\"FFFFFF\\\",\\n      \\\"sourceIdFontName\\\": \\\"Arial\\\",\\n      \\\"useHTMLRefs\\\": true,\\n      \\\"normalBackColor\\\": \\\"000000\\\",\\n      \\\"sourceId\\\": 0,\\n      \\\"htmlVideoHeight\\\": 280,\\n      \\\"normalFontSize\\\": 12,\\n      \\\"normalFontStyles\\\": \\\"1\\\",\\n      \\\"language\\\": \\\"English - United Kingdom\\\",\\n      \\\"htmlVideoWigth\\\": 320,\\n      \\\"htmlVideoBorder\\\": 1,\\n      \\\"sourceIdFontColor\\\": \\\"00FFFF\\\",\\n      \\\"normalFontNumber\\\": 0\\n    },\\n    \\\"specialFont2\\\": \\\"\\\",\\n    \\\"autoDetectLanguage\\\": false,\\n    \\\"defaultBox\\\": \\\"None\\\",\\n    \\\"replaceLongEmDash\\\": false,\\n    \\\"assForBurning\\\": false,\\n    \\\"recalculate890ScreenSettings\\\": \\\"Default\\\",\\n    \\\"STL\\\": {\\n      \\\"includeItalic\\\": true,\\n      \\\"isBold\\\": false,\\n      \\\"isItalic\\\": false,\\n      \\\"isUnderline\\\": false,\\n      \\\"userDefinedFont\\\": false,\\n      \\\"useTabChars\\\": false\\n    },\\n    \\\"readingSpeedCps\\\": 17,\\n    \\\"openSettings\\\": {\\n      \\\"defaultOutline\\\": \\\"Outline\\\",\\n      \\\"minSubDuration\\\": 0.8333,\\n      \\\"alignAllLines\\\": true,\\n      \\\"defaultAlign\\\": \\\"Center\\\",\\n      \\\"graphicalLineLengthFormat\\\": null,\\n      \\\"preventTimingOverlap\\\": true,\\n      \\\"timingFramesGap\\\": 2,\\n      \\\"maxTimingGap\\\": null,\\n      \\\"defaultBox\\\": \\\"None\\\",\\n      \\\"graphicalLineLength\\\": false,\\n      \\\"maxSubDuration\\\": 7,\\n      \\\"defaultJustification\\\": \\\"None\\\",\\n      \\\"screenLines\\\": 11,\\n      \\\"graphicalLineLengthFont1\\\": null,\\n      \\\"maxParagraphLines\\\": 2,\\n      \\\"graphicalLineLengthFont2\\\": null,\\n      \\\"doubleHeight\\\": false,\\n      \\\"EBU\\\": {\\n        \\\"standard\\\": \\\"OpenSubtitles\\\"\\n      },\\n      \\\"lineLength\\\": 42\\n    },\\n    \\\"readingSpeedCountPunctuations\\\": false,\\n    \\\"graphicalLineLength\\\": false,\\n    \\\"shotChangeSnapEndFrames\\\": 2,\\n    \\\"lockTimecodes\\\": false,\\n    \\\"scriptSettings\\\": {\\n      \\\"defaultOutline\\\": \\\"Outline\\\",\\n      \\\"minSubDuration\\\": 0.8333,\\n      \\\"alignAllLines\\\": false,\\n      \\\"defaultAlign\\\": \\\"Left\\\",\\n      \\\"graphicalLineLengthFormat\\\": null,\\n      \\\"preventTimingOverlap\\\": true,\\n      \\\"timingFramesGap\\\": 2,\\n      \\\"maxTimingGap\\\": null,\\n      \\\"defaultBox\\\": \\\"None\\\",\\n      \\\"graphicalLineLength\\\": false,\\n      \\\"maxSubDuration\\\": 7,\\n      \\\"defaultJustification\\\": \\\"None\\\",\\n      \\\"screenLines\\\": 999,\\n      \\\"graphicalLineLengthFont1\\\": null,\\n      \\\"maxParagraphLines\\\": 999,\\n      \\\"graphicalLineLengthFont2\\\": null,\\n      \\\"doubleHeight\\\": false,\\n      \\\"EBU\\\": {\\n        \\\"standard\\\": \\\"OpenSubtitles\\\"\\n      },\\n      \\\"lineLength\\\": 80\\n    },\\n    \\\"spellcheckRussianEnforceStrictYo\\\": null,\\n    \\\"batchExport\\\": false,\\n    \\\"spellcheckEnableGrammarErrors\\\": null,\\n    \\\"importClearTargetColumn\\\": false,\\n    \\\"defaultBackground\\\": null,\\n    \\\"assOmitBottomCenterPositioning\\\": false,\\n    \\\"adjustMixedAlignmentsWithSpaces\\\": false,\\n    \\\"verticalLineLength\\\": 13,\\n    \\\"previewFontSizeFromVideoFormat\\\": true,\\n    \\\"exportAnnotations\\\": false,\\n    \\\"maxSubDuration\\\": 7,\\n    \\\"verticalSubtitlesGroupNumbers\\\": 2,\\n    \\\"convertLeftToCenterLeft\\\": false,\\n    \\\"exportUntimedSubtitles\\\": \\\"ask\\\",\\n    \\\"autoSaveInterval\\\": 2,\\n    \\\"removeAllStyling\\\": false,\\n    \\\"defaultJustification\\\": \\\"None\\\",\\n    \\\"timecodeFormat\\\": \\\"24 fps\\\",\\n    \\\"autoPopulateStartTCFromDatFile\\\": null,\\n    \\\"autoTCDuration\\\": 30,\\n    \\\"videoFormat\\\": \\\"HD 1920x1080\\\",\\n    \\\"DVD\\\": {\\n      \\\"edlClipNameInSeparateLine\\\": false,\\n      \\\"languageCode\\\": \\\"ENG\\\",\\n      \\\"imagePrefix\\\": \\\"@\\\",\\n      \\\"imageLocation\\\": \\\"@\\\",\\n      \\\"scriptFileName\\\": \\\"@\\\",\\n      \\\"imageFormat\\\": \\\"PNG_8\\\",\\n      \\\"backgroundColor\\\": \\\"\\\",\\n      \\\"exportCropImage\\\": false,\\n      \\\"fcpScriptVersion\\\": 0,\\n      \\\"ultech1080ScanType\\\": 1\\n    },\\n    \\\"importTimecodeOffset\\\": null,\\n    \\\"isRtl2\\\": false,\\n    \\\"defaultBotenHorizontal\\\": \\\"●\\\",\\n    \\\"encoding\\\": \\\"utf-8\\\",\\n    \\\"screenLines\\\": 11,\\n    \\\"overrideFileName\\\": \\\"\\\",\\n    \\\"aspectRatio\\\": \\\"16:9\\\",\\n    \\\"rawScript\\\": {\\n      \\\"importRawScript\\\": false,\\n      \\\"lineDoesntEndOn\\\": \\\"\\\",\\n      \\\"lineEndPunctuation\\\": \\\":;\\\",\\n      \\\"maxLineLength\\\": 42,\\n      \\\"maxLinesPerSubtitle\\\": 2,\\n      \\\"subtitleEndPunctuation\\\": \\\".?!\\\"\\n    },\\n    \\\"timelineOffset\\\": 0,\\n    \\\"exportTimeOffset\\\": null,\\n    \\\"shotChangeSnapStartFrames\\\": 0,\\n    \\\"tracksExportFilter\\\": null,\\n    \\\"selectNextSubAfterSettingTC\\\": true,\\n    \\\"autoOutCue\\\": false,\\n    \\\"graphicalLineLengthFont1\\\": null,\\n    \\\"maxParagraphLines\\\": 2,\\n    \\\"SRT\\\": {\\n      \\\"exportColors\\\": false,\\n      \\\"smpte\\\": false,\\n      \\\"exportRaised\\\": false,\\n      \\\"exportAlignment\\\": false,\\n      \\\"exportItalics\\\": true,\\n      \\\"rtlReorderWithMarks\\\": false,\\n      \\\"RTLReorder\\\": false,\\n      \\\"exportUnderline\\\": false,\\n      \\\"exportInBold\\\": false\\n    },\\n    \\\"readingSpeedType\\\": \\\"cps\\\",\\n    \\\"includeVTTDirectionCodes\\\": false,\\n    \\\"templateId\\\": \\\"48184225-0d63-4750-be79-8640fa185db9\\\",\\n    \\\"autoComplyTiming\\\": true,\\n    \\\"graphicalLineLengthFont2\\\": null,\\n    \\\"assSeprateLineFormatting\\\": false,\\n    \\\"dictionary\\\": \\\"English en-US\\\",\\n    \\\"allowSplitParagraphs\\\": false,\\n    \\\"detectEncoding\\\": true,\\n    \\\"VTT\\\": {\\n      \\\"topAlignmentIndex\\\": 1,\\n      \\\"writeDirectionCodes\\\": false,\\n      \\\"writeHorizontalPosition\\\": true,\\n      \\\"skipCenterAligned\\\": true,\\n      \\\"writeSubtitleNumbers\\\": false,\\n      \\\"writeRegionSize\\\": false,\\n      \\\"addBoxAlignment\\\": false,\\n      \\\"skipBottomAligned\\\": true,\\n      \\\"includeStyleSection\\\": false,\\n      \\\"writeVerticalPositionInPercentage\\\": false,\\n      \\\"writeVerticalPosition\\\": true\\n    },\\n    \\\"dontCountCompositionCharacters\\\": false,\\n    \\\"spellcheckIgnoreWordsInUppercase\\\": null,\\n    \\\"previewFont\\\": \\\"\\\",\\n    \\\"convertBlackBoxesToTopAligned\\\": false,\\n    \\\"autoDetectFps\\\": false,\\n    \\\"hideSecondTimeline\\\": null,\\n    \\\"format\\\": \\\"Ooona\\\",\\n    \\\"doubleHeight\\\": false,\\n    \\\"previewFontSize\\\": 48,\\n    \\\"mediaStartTimecode\\\": 0,\\n    \\\"EBU\\\": {\\n      \\\"forceStartBoxControlCodeAtTheBeginningOfLine\\\": false,\\n      \\\"startOfProgramme\\\": null,\\n      \\\"programOriginalTitle\\\": \\\"\\\",\\n      \\\"forceDoubleHeight\\\": true,\\n      \\\"forceNormalHeightAtTheBeginningOfLine\\\": false,\\n      \\\"revisionNumber\\\": 0,\\n      \\\"languageCode\\\": \\\"00\\\",\\n      \\\"forceOpenSubtitles\\\": false,\\n      \\\"episodeTranslatedTitle\\\": \\\"\\\",\\n      \\\"headerCodePage\\\": \\\"\\\",\\n      \\\"includeColorCodes\\\": true,\\n      \\\"episodeOriginalTitle\\\": \\\"\\\",\\n      \\\"dontTreatMidRowItalicsAsSpace\\\": false,\\n      \\\"forceDoubleHeightAtTheBeginningOfLine\\\": false,\\n      \\\"editorsName\\\": \\\"\\\",\\n      \\\"exportItalicsAsLessAndMore\\\": false,\\n      \\\"useOpenModeBoxingControlCodes\\\": false,\\n      \\\"includeBoxOnOffControlCodes\\\": true,\\n      \\\"country\\\": \\\"\\\",\\n      \\\"treatLessAndMoreThanAsItalics\\\": true,\\n      \\\"characterCodeTable\\\": 0,\\n      \\\"alignWithSpaces\\\": true,\\n      \\\"referenceCode\\\": \\\"\\\",\\n      \\\"forceTeletextSubtitles\\\": false,\\n      \\\"allowNonStandardFpsInHeader\\\": false,\\n      \\\"publisher\\\": \\\"\\\",\\n      \\\"standard\\\": \\\"OpenSubtitles\\\",\\n      \\\"programTranslatedTitle\\\": \\\"\\\"\\n    },\\n    \\\"validation\\\": {},\\n    \\\"closedCaptions\\\": {\\n      \\\"languageCode\\\": \\\"\\\",\\n      \\\"blanksBetweenPopOn\\\": 2,\\n      \\\"fixTimecodeOverrun\\\": false,\\n      \\\"box\\\": \\\"None\\\",\\n      \\\"isTunnel608\\\": false,\\n      \\\"scriptVersion\\\": 0,\\n      \\\"exportChannel\\\": 1,\\n      \\\"isBold\\\": false,\\n      \\\"style\\\": \\\"PopOn\\\",\\n      \\\"extendedCharset\\\": true,\\n      \\\"sccRemoveSpaceAfterControlCodes\\\": false,\\n      \\\"chainSubtitles\\\": false,\\n      \\\"doubleControlCodes\\\": true,\\n      \\\"sccQuickTimeCompatible\\\": 0,\\n      \\\"sccUseSemiColon\\\": false,\\n      \\\"closedCaptionMode\\\": 7,\\n      \\\"exportUpperCase\\\": false\\n    },\\n    \\\"importWordWrap\\\": true,\\n    \\\"readingSpeedWpm\\\": 200,\\n    \\\"autoPopulateFpsFromDatFile\\\": null,\\n    \\\"language1\\\": \\\"English\\\",\\n    \\\"teletextSettings\\\": {\\n      \\\"defaultOutline\\\": \\\"Outline\\\",\\n      \\\"minSubDuration\\\": 0.8333,\\n      \\\"alignAllLines\\\": true,\\n      \\\"defaultAlign\\\": \\\"Center\\\",\\n      \\\"graphicalLineLengthFormat\\\": null,\\n      \\\"preventTimingOverlap\\\": true,\\n      \\\"timingFramesGap\\\": 2,\\n      \\\"maxTimingGap\\\": null,\\n      \\\"defaultBox\\\": \\\"FixedBox\\\",\\n      \\\"graphicalLineLength\\\": false,\\n      \\\"maxSubDuration\\\": 7,\\n      \\\"defaultJustification\\\": \\\"Center\\\",\\n      \\\"screenLines\\\": 23,\\n      \\\"graphicalLineLengthFont1\\\": null,\\n      \\\"maxParagraphLines\\\": 2,\\n      \\\"graphicalLineLengthFont2\\\": null,\\n      \\\"doubleHeight\\\": true,\\n      \\\"EBU\\\": {\\n        \\\"standard\\\": \\\"TeletextLevel1\\\"\\n      },\\n      \\\"lineLength\\\": 37\\n    },\\n    \\\"safeArea\\\": {\\n      \\\"bottom\\\": 10,\\n      \\\"left\\\": 10,\\n      \\\"right\\\": 10,\\n      \\\"top\\\": 10,\\n      \\\"videoHeight\\\": 720,\\n      \\\"videoWidth\\\": 1080\\n    },\\n    \\\"japaneseAgeRatingFixHiraganize\\\": false,\\n    \\\"targetTrack\\\": 0,\\n    \\\"convertFramerate\\\": \\\"none\\\",\\n    \\\"language2\\\": \\\"English\\\",\\n    \\\"lineLength\\\": 37,\\n    \\\"exportOnlySelected\\\": false,\\n    \\\"assDontIncludeNewLineAtTheEnd\\\": false,\\n    \\\"zeroParagraphTemplateId\\\": \\\"\\\",\\n    \\\"exportZero\\\": false,\\n    \\\"ageRating\\\": null,\\n    \\\"mergeAndSort\\\": false,\\n    \\\"tableFont\\\": \\\"\\\",\\n    \\\"convertNullCuesToZero\\\": false,\\n    \\\"columns\\\": [],\\n    \\\"autoTC\\\": true,\\n    \\\"autoSnapToShotChange\\\": false,\\n    \\\"recutAuto\\\": false,\\n    \\\"flavor\\\": \\\"Ooona\\\",\\n    \\\"TTML\\\": {\\n      \\\"outlineColor\\\": \\\"black\\\",\\n      \\\"simplifiedPositioning\\\": false,\\n      \\\"rubyReserveOutside\\\": true,\\n      \\\"outlineWidth\\\": 2,\\n      \\\"languageCode\\\": \\\"\\\",\\n      \\\"copyright\\\": \\\"\\\",\\n      \\\"exportvPosAsTTAF1\\\": false,\\n      \\\"outlineWidthUnit\\\": \\\"px\\\",\\n      \\\"useEditable\\\": false,\\n      \\\"burnedInTimeCode\\\": -1,\\n      \\\"isBold\\\": false,\\n      \\\"fontSize\\\": 100,\\n      \\\"rtlReorder\\\": false,\\n      \\\"customOutline\\\": false,\\n      \\\"fontColor\\\": \\\"\\\",\\n      \\\"ignoreFontProperties\\\": false,\\n      \\\"imsc\\\": {\\n        \\\"captionService\\\": \\\"F1C1CC\\\",\\n        \\\"channel\\\": \\\"CC1\\\",\\n        \\\"exportBoxed\\\": false,\\n        \\\"includeSmpteInformation\\\": false,\\n        \\\"programName\\\": \\\"\\\"\\n      },\\n      \\\"fontSizeUnit\\\": \\\"%\\\",\\n      \\\"luminanceGain\\\": null,\\n      \\\"includeStartTCAtTopDiv\\\": false,\\n      \\\"EBUTT\\\": {\\n        \\\"startOfProgramme\\\": null,\\n        \\\"programOriginalTitle\\\": \\\"\\\",\\n        \\\"revisionNumber\\\": 0,\\n        \\\"episodeTranslatedTitle\\\": \\\"\\\",\\n        \\\"headerCodePage\\\": \\\"\\\",\\n        \\\"episodeOriginalTitle\\\": \\\"\\\",\\n        \\\"editorsName\\\": \\\"\\\",\\n        \\\"documentId\\\": \\\"\\\",\\n        \\\"exportBox\\\": \\\"None\\\",\\n        \\\"referenceCode\\\": \\\"\\\",\\n        \\\"publisher\\\": \\\"\\\",\\n        \\\"standard\\\": \\\"OpenSubtitles\\\",\\n        \\\"programTranslatedTitle\\\": \\\"\\\"\\n      },\\n      \\\"ignoreInlineColors\\\": false,\\n      \\\"lineHeight\\\": 100,\\n      \\\"backColor\\\": \\\"\\\"\\n    },\\n    \\\"extension\\\": \\\"\\\",\\n    \\\"customTxt\\\": {\\n      \\\"subtitleDelimiterValue\\\": \\\"<new_line><new_line>\\\",\\n      \\\"exportReferenceCodesValue\\\": true,\\n      \\\"rowDelimiterValue\\\": \\\"<new_line>\\\",\\n      \\\"exportRaisedValue\\\": false,\\n      \\\"fileHeaderValue\\\": \\\"\\\",\\n      \\\"alignLeft\\\": false,\\n      \\\"subtitleHeaderValue\\\": \\\"<num> <in_cue> <out_cue><new_line>\\\",\\n      \\\"skipBOMValue\\\": false,\\n      \\\"rtfFontNameValue\\\": \\\"Arial\\\",\\n      \\\"exportZeroValue\\\": true,\\n      \\\"rtfOptionsValue\\\": \\\"120\\\",\\n      \\\"rtfExportValue\\\": false,\\n      \\\"rtfFontBoldValue\\\": false,\\n      \\\"fileFooterValue\\\": \\\"\\\",\\n      \\\"rtfFontSizeValue\\\": \\\"12\\\",\\n      \\\"subtitleFooterValue\\\": \\\"\\\",\\n      \\\"encodingValue\\\": \\\"65001\\\",\\n      \\\"italicStartValue\\\": \\\"<I>\\\",\\n      \\\"italicStopValue\\\": \\\"</I>\\\"\\n    },\\n    \\\"skipUntimed\\\": false,\\n    \\\"spellcheckIncludeAISuggestions\\\": null\\n  },\\n  \\\"shared\\\": false,\\n  \\\"currentTime\\\": 0,\\n  \\\"originalProject\\\": {\\n    \\\"app\\\": \\\"EditPro\\\",\\n    \\\"settings\\\": {\\n      \\\"isRtl\\\": false,\\n      \\\"showZeroParagraphInTable\\\": false,\\n      \\\"Cavena\\\": {\\n        \\\"translatedTitle\\\": null,\\n        \\\"originalTitle\\\": null,\\n        \\\"tapeNumber\\\": null,\\n        \\\"startOfMessage\\\": null,\\n        \\\"producer\\\": null,\\n        \\\"translatedEpisodeTitle\\\": null,\\n        \\\"comments\\\": null,\\n        \\\"translator\\\": null,\\n        \\\"useEmptyLinesInsteadOfVPos\\\": true\\n      },\\n      \\\"sub\\\": {\\n        \\\"useFullStopDelimiter\\\": false\\n      },\\n      \\\"exportTimecodeOffset\\\": 0,\\n      \\\"readingSpeedCountSpaces\\\": true,\\n      \\\"defaultOutline\\\": \\\"Outline\\\",\\n      \\\"autoComplyTimingGap\\\": false,\\n      \\\"absolutePositioning\\\": true,\\n      \\\"display\\\": {\\n        \\\"boxLeftMargin\\\": 18,\\n        \\\"boxOpacity\\\": 35,\\n        \\\"outlineColor\\\": \\\"#000000\\\",\\n        \\\"textColorOverride\\\": \\\"\\\",\\n        \\\"shadowColor\\\": \\\"#000000\\\",\\n        \\\"boxBottomMargin\\\": 0,\\n        \\\"outlineWidth\\\": 2,\\n        \\\"shadowOffsetX\\\": 0,\\n        \\\"boxType\\\": \\\"None\\\",\\n        \\\"letterBox\\\": \\\"None\\\",\\n        \\\"shadowOffsetY\\\": 0,\\n        \\\"antiAliasingType\\\": \\\"OuterNormal\\\",\\n        \\\"antiAliasingColor\\\": \\\"#808080\\\",\\n        \\\"isBold\\\": false,\\n        \\\"shadow1\\\": {\\n          \\\"blur\\\": 0,\\n          \\\"color\\\": \\\"#000000\\\",\\n          \\\"offsetX\\\": 0,\\n          \\\"offsetY\\\": 0,\\n          \\\"opacity\\\": 100,\\n          \\\"size\\\": 0,\\n          \\\"visible\\\": true\\n        },\\n        \\\"shadow2\\\": {\\n          \\\"blur\\\": 0,\\n          \\\"color\\\": \\\"#000000\\\",\\n          \\\"offsetX\\\": 0,\\n          \\\"offsetY\\\": 0,\\n          \\\"opacity\\\": 100,\\n          \\\"size\\\": 0,\\n          \\\"visible\\\": false\\n        },\\n        \\\"boxColor\\\": \\\"#000000\\\",\\n        \\\"boxTopMargin\\\": 0,\\n        \\\"outlineType\\\": \\\"Outline\\\",\\n        \\\"boxRightMargin\\\": 18\\n      },\\n      \\\"exportEmptySubtitles\\\": \\\"ask\\\",\\n      \\\"defaultColor\\\": null,\\n      \\\"font1\\\": \\\"Arial\\\",\\n      \\\"minSubDuration\\\": 0.8333,\\n      \\\"lineGap\\\": 1,\\n      \\\"engine\\\": \\\"OoonaConvert\\\",\\n      \\\"SMPTE_428\\\": {\\n        \\\"fontEffect\\\": \\\"none\\\",\\n        \\\"spacing\\\": \\\"0\\\",\\n        \\\"fontEffectColor\\\": \\\"\\\",\\n        \\\"feather\\\": \\\"no\\\",\\n        \\\"exportFont\\\": false,\\n        \\\"fadeUpTime\\\": 0,\\n        \\\"font2URI\\\": \\\"\\\",\\n        \\\"fadeDownTime\\\": 0,\\n        \\\"startTime\\\": 0,\\n        \\\"writeStartTime\\\": false,\\n        \\\"effectSize\\\": \\\"0.01\\\",\\n        \\\"encoding\\\": \\\"UTF-8\\\",\\n        \\\"version\\\": \\\"ST428-7-2007\\\",\\n        \\\"language\\\": \\\"English\\\",\\n        \\\"fadeDownUp\\\": false,\\n        \\\"reel\\\": 1,\\n        \\\"displayType\\\": \\\"\\\",\\n        \\\"fontURI\\\": \\\"\\\"\\n      },\\n      \\\"alignAllLines\\\": true,\\n      \\\"ccSettings\\\": {\\n        \\\"defaultOutline\\\": \\\"Outline\\\",\\n        \\\"minSubDuration\\\": 0.8333,\\n        \\\"alignAllLines\\\": true,\\n        \\\"defaultAlign\\\": \\\"Center\\\",\\n        \\\"graphicalLineLengthFormat\\\": null,\\n        \\\"preventTimingOverlap\\\": true,\\n        \\\"timingFramesGap\\\": 2,\\n        \\\"maxTimingGap\\\": null,\\n        \\\"defaultBox\\\": \\\"FixedBox\\\",\\n        \\\"graphicalLineLength\\\": false,\\n        \\\"maxSubDuration\\\": 7,\\n        \\\"defaultJustification\\\": \\\"Left\\\",\\n        \\\"screenLines\\\": 15,\\n        \\\"graphicalLineLengthFont1\\\": null,\\n        \\\"maxParagraphLines\\\": 2,\\n        \\\"graphicalLineLengthFont2\\\": null,\\n        \\\"doubleHeight\\\": false,\\n        \\\"EBU\\\": {\\n          \\\"standard\\\": \\\"OpenSubtitles\\\"\\n        },\\n        \\\"lineLength\\\": 32\\n      },\\n      \\\"mode\\\": \\\"Open\\\",\\n      \\\"font2\\\": \\\"Arial\\\",\\n      \\\"autoRecognizeTimeFormat\\\": true,\\n      \\\"importTimecodeStart\\\": null,\\n      \\\"autoBreakLine\\\": true,\\n      \\\"exportFontSize\\\": 48,\\n      \\\"timeFormat\\\": \\\"SMPTE\\\",\\n      \\\"defaultAlign\\\": \\\"Center\\\",\\n      \\\"RTF\\\": {\\n        \\\"includeAlignment\\\": false,\\n        \\\"includeColorsFormatting\\\": false,\\n        \\\"includeInOutCues\\\": false,\\n        \\\"includeItalicsUnderline\\\": false,\\n        \\\"includeReadingSpeedInformation\\\": false,\\n        \\\"includeSubtitleNumber\\\": false,\\n        \\\"isBold\\\": false\\n      },\\n      \\\"graphicalLineLengthFormat\\\": null,\\n      \\\"preventTimingOverlap\\\": true,\\n      \\\"tagsExportFilter\\\": null,\\n      \\\"defaultBotenVertical\\\": \\\"﹅\\\",\\n      \\\"replaceEllipsis\\\": 0,\\n      \\\"preserveSafeArea\\\": false,\\n      \\\"shotChangesSnapAreaFrames\\\": 8,\\n      \\\"timingFramesGap\\\": 2,\\n      \\\"pacCharacterSet1\\\": \\\"Latin\\\",\\n      \\\"replaceAsianQuotes\\\": {\\n        \\\"align\\\": true,\\n        \\\"lowerQuotes\\\": false,\\n        \\\"replace\\\": 0\\n      },\\n      \\\"track2\\\": null,\\n      \\\"filename\\\": \\\"\\\",\\n      \\\"overrides\\\": null,\\n      \\\"overrideReadingSpeed\\\": false,\\n      \\\"pacCharacterSet2\\\": \\\"Latin\\\",\\n      \\\"hideOutCue\\\": false,\\n      \\\"ai\\\": {\\n        \\\"asr\\\": {\\n          \\\"maxSentenceWordGap\\\": null,\\n          \\\"provider\\\": null\\n        },\\n        \\\"mt\\\": {\\n          \\\"provider\\\": null\\n        },\\n        \\\"tts\\\": {\\n          \\\"pitch\\\": \\\"0%\\\",\\n          \\\"languageCode\\\": null,\\n          \\\"speed\\\": \\\"0%\\\",\\n          \\\"voiceId\\\": null,\\n          \\\"provider\\\": null,\\n          \\\"country\\\": null,\\n          \\\"language\\\": null,\\n          \\\"volume\\\": \\\"0%\\\",\\n          \\\"voiceName\\\": null\\n        }\\n      },\\n      \\\"track3\\\": null,\\n      \\\"DLP\\\": {\\n        \\\"importDetectCenterLeftAligned\\\": true,\\n        \\\"reelNumber\\\": 1,\\n        \\\"overrideTextColorValue\\\": \\\"#FFFFFF\\\",\\n        \\\"overrideTextEffects\\\": false,\\n        \\\"overrideTextColor\\\": false,\\n        \\\"importOverrideSafeArea\\\": false,\\n        \\\"exportImages\\\": false,\\n        \\\"overrideEffectsColor\\\": \\\"#000000\\\",\\n        \\\"overrideEffectsType\\\": \\\"none\\\",\\n        \\\"toFrameRate\\\": \\\"24 fps\\\",\\n        \\\"useStandardFont\\\": true,\\n        \\\"applyVideoFrameRateConversion\\\": false,\\n        \\\"fadeUp\\\": 20,\\n        \\\"version\\\": \\\"DCSubtitle 1.0\\\",\\n        \\\"title\\\": \\\"\\\",\\n        \\\"presentationList\\\": false,\\n        \\\"fadeDownUp\\\": false,\\n        \\\"compressTrueTypeFont\\\": false,\\n        \\\"fontURI\\\": \\\"\\\",\\n        \\\"fadeDown\\\": 20,\\n        \\\"exportFontFile\\\": false\\n      },\\n      \\\"maxTimingGap\\\": null,\\n      \\\"audioScrubbingEnabled\\\": true,\\n      \\\"exportComments\\\": false,\\n      \\\"previewScriptSubtitles\\\": null,\\n      \\\"track4\\\": null,\\n      \\\"specialFont1\\\": \\\"\\\",\\n      \\\"fps\\\": 23.976,\\n      \\\"countryKey\\\": \\\"USA\\\",\\n      \\\"characterHalfWidth\\\": false,\\n      \\\"appendStartIndex\\\": null,\\n      \\\"sami\\\": {\\n        \\\"mediaFile\\\": \\\"test@.wmv\\\",\\n        \\\"normalFontName\\\": \\\"Arial\\\",\\n        \\\"createHTMLFile\\\": true,\\n        \\\"sourceIdFont\\\": 1,\\n        \\\"createASXFile\\\": true,\\n        \\\"sourceIdBackColor\\\": \\\"FF0000\\\",\\n        \\\"sourceIdFontSize\\\": 12,\\n        \\\"htmlCWHeight\\\": 80,\\n        \\\"sourceIdFontStyles\\\": \\\"1\\\",\\n        \\\"exportSourceId\\\": false,\\n        \\\"closePSyncTags\\\": false,\\n        \\\"normalFontColor\\\": \\\"FFFFFF\\\",\\n        \\\"sourceIdFontName\\\": \\\"Arial\\\",\\n        \\\"useHTMLRefs\\\": true,\\n        \\\"normalBackColor\\\": \\\"000000\\\",\\n        \\\"sourceId\\\": 0,\\n        \\\"htmlVideoHeight\\\": 280,\\n        \\\"normalFontSize\\\": 12,\\n        \\\"normalFontStyles\\\": \\\"1\\\",\\n        \\\"language\\\": \\\"English - United Kingdom\\\",\\n        \\\"htmlVideoWigth\\\": 320,\\n        \\\"htmlVideoBorder\\\": 1,\\n        \\\"sourceIdFontColor\\\": \\\"00FFFF\\\",\\n        \\\"normalFontNumber\\\": 0\\n      },\\n      \\\"specialFont2\\\": \\\"\\\",\\n      \\\"autoDetectLanguage\\\": false,\\n      \\\"defaultBox\\\": \\\"None\\\",\\n      \\\"replaceLongEmDash\\\": false,\\n      \\\"assForBurning\\\": false,\\n      \\\"recalculate890ScreenSettings\\\": \\\"Default\\\",\\n      \\\"STL\\\": {\\n        \\\"includeItalic\\\": true,\\n        \\\"isBold\\\": false,\\n        \\\"isItalic\\\": false,\\n        \\\"isUnderline\\\": false,\\n        \\\"userDefinedFont\\\": false,\\n        \\\"useTabChars\\\": false\\n      },\\n      \\\"readingSpeedCps\\\": 17,\\n      \\\"openSettings\\\": {\\n        \\\"defaultOutline\\\": \\\"Outline\\\",\\n        \\\"minSubDuration\\\": 0.8333,\\n        \\\"alignAllLines\\\": true,\\n        \\\"defaultAlign\\\": \\\"Center\\\",\\n        \\\"graphicalLineLengthFormat\\\": null,\\n        \\\"preventTimingOverlap\\\": true,\\n        \\\"timingFramesGap\\\": 2,\\n        \\\"maxTimingGap\\\": null,\\n        \\\"defaultBox\\\": \\\"None\\\",\\n        \\\"graphicalLineLength\\\": false,\\n        \\\"maxSubDuration\\\": 7,\\n        \\\"defaultJustification\\\": \\\"None\\\",\\n        \\\"screenLines\\\": 11,\\n        \\\"graphicalLineLengthFont1\\\": null,\\n        \\\"maxParagraphLines\\\": 2,\\n        \\\"graphicalLineLengthFont2\\\": null,\\n        \\\"doubleHeight\\\": false,\\n        \\\"EBU\\\": {\\n          \\\"standard\\\": \\\"OpenSubtitles\\\"\\n        },\\n        \\\"lineLength\\\": 42\\n      },\\n      \\\"readingSpeedCountPunctuations\\\": false,\\n      \\\"graphicalLineLength\\\": false,\\n      \\\"shotChangeSnapEndFrames\\\": 2,\\n      \\\"lockTimecodes\\\": false,\\n      \\\"scriptSettings\\\": {\\n        \\\"defaultOutline\\\": \\\"Outline\\\",\\n        \\\"minSubDuration\\\": 0.8333,\\n        \\\"alignAllLines\\\": false,\\n        \\\"defaultAlign\\\": \\\"Left\\\",\\n        \\\"graphicalLineLengthFormat\\\": null,\\n        \\\"preventTimingOverlap\\\": true,\\n        \\\"timingFramesGap\\\": 2,\\n        \\\"maxTimingGap\\\": null,\\n        \\\"defaultBox\\\": \\\"None\\\",\\n        \\\"graphicalLineLength\\\": false,\\n        \\\"maxSubDuration\\\": 7,\\n        \\\"defaultJustification\\\": \\\"None\\\",\\n        \\\"screenLines\\\": 999,\\n        \\\"graphicalLineLengthFont1\\\": null,\\n        \\\"maxParagraphLines\\\": 999,\\n        \\\"graphicalLineLengthFont2\\\": null,\\n        \\\"doubleHeight\\\": false,\\n        \\\"EBU\\\": {\\n          \\\"standard\\\": \\\"OpenSubtitles\\\"\\n        },\\n        \\\"lineLength\\\": 80\\n      },\\n      \\\"spellcheckRussianEnforceStrictYo\\\": null,\\n      \\\"batchExport\\\": false,\\n      \\\"spellcheckEnableGrammarErrors\\\": null,\\n      \\\"importClearTargetColumn\\\": false,\\n      \\\"defaultBackground\\\": null,\\n      \\\"assOmitBottomCenterPositioning\\\": false,\\n      \\\"adjustMixedAlignmentsWithSpaces\\\": false,\\n      \\\"verticalLineLength\\\": 13,\\n      \\\"previewFontSizeFromVideoFormat\\\": true,\\n      \\\"exportAnnotations\\\": false,\\n      \\\"maxSubDuration\\\": 7,\\n      \\\"verticalSubtitlesGroupNumbers\\\": 2,\\n      \\\"convertLeftToCenterLeft\\\": false,\\n      \\\"exportUntimedSubtitles\\\": \\\"ask\\\",\\n      \\\"autoSaveInterval\\\": 2,\\n      \\\"removeAllStyling\\\": false,\\n      \\\"defaultJustification\\\": \\\"None\\\",\\n      \\\"timecodeFormat\\\": \\\"24 fps\\\",\\n      \\\"autoPopulateStartTCFromDatFile\\\": null,\\n      \\\"autoTCDuration\\\": 30,\\n      \\\"videoFormat\\\": \\\"HD 1920x1080\\\",\\n      \\\"DVD\\\": {\\n        \\\"edlClipNameInSeparateLine\\\": false,\\n        \\\"languageCode\\\": \\\"ENG\\\",\\n        \\\"imagePrefix\\\": \\\"@\\\",\\n        \\\"imageLocation\\\": \\\"@\\\",\\n        \\\"scriptFileName\\\": \\\"@\\\",\\n        \\\"imageFormat\\\": \\\"PNG_8\\\",\\n        \\\"backgroundColor\\\": \\\"\\\",\\n        \\\"exportCropImage\\\": false,\\n        \\\"fcpScriptVersion\\\": 0,\\n        \\\"ultech1080ScanType\\\": 1\\n      },\\n      \\\"importTimecodeOffset\\\": null,\\n      \\\"isRtl2\\\": false,\\n      \\\"defaultBotenHorizontal\\\": \\\"●\\\",\\n      \\\"encoding\\\": \\\"utf-8\\\",\\n      \\\"screenLines\\\": 11,\\n      \\\"overrideFileName\\\": \\\"\\\",\\n      \\\"aspectRatio\\\": \\\"16:9\\\",\\n      \\\"rawScript\\\": {\\n        \\\"importRawScript\\\": false,\\n        \\\"lineDoesntEndOn\\\": \\\"\\\",\\n        \\\"lineEndPunctuation\\\": \\\":;\\\",\\n        \\\"maxLineLength\\\": 42,\\n        \\\"maxLinesPerSubtitle\\\": 2,\\n        \\\"subtitleEndPunctuation\\\": \\\".?!\\\"\\n      },\\n      \\\"timelineOffset\\\": 0,\\n      \\\"exportTimeOffset\\\": null,\\n      \\\"shotChangeSnapStartFrames\\\": 0,\\n      \\\"tracksExportFilter\\\": null,\\n      \\\"selectNextSubAfterSettingTC\\\": true,\\n      \\\"autoOutCue\\\": false,\\n      \\\"graphicalLineLengthFont1\\\": null,\\n      \\\"maxParagraphLines\\\": 2,\\n      \\\"SRT\\\": {\\n        \\\"exportColors\\\": false,\\n        \\\"smpte\\\": false,\\n        \\\"exportRaised\\\": false,\\n        \\\"exportAlignment\\\": false,\\n        \\\"exportItalics\\\": true,\\n        \\\"rtlReorderWithMarks\\\": false,\\n        \\\"RTLReorder\\\": false,\\n        \\\"exportUnderline\\\": false,\\n        \\\"exportInBold\\\": false\\n      },\\n      \\\"readingSpeedType\\\": \\\"cps\\\",\\n      \\\"includeVTTDirectionCodes\\\": false,\\n      \\\"templateId\\\": \\\"48184225-0d63-4750-be79-8640fa185db9\\\",\\n      \\\"autoComplyTiming\\\": true,\\n      \\\"graphicalLineLengthFont2\\\": null,\\n      \\\"assSeprateLineFormatting\\\": false,\\n      \\\"dictionary\\\": \\\"English en-US\\\",\\n      \\\"allowSplitParagraphs\\\": false,\\n      \\\"detectEncoding\\\": true,\\n      \\\"VTT\\\": {\\n        \\\"topAlignmentIndex\\\": 1,\\n        \\\"writeDirectionCodes\\\": false,\\n        \\\"writeHorizontalPosition\\\": true,\\n        \\\"skipCenterAligned\\\": true,\\n        \\\"writeSubtitleNumbers\\\": false,\\n        \\\"writeRegionSize\\\": false,\\n        \\\"addBoxAlignment\\\": false,\\n        \\\"skipBottomAligned\\\": true,\\n        \\\"includeStyleSection\\\": false,\\n        \\\"writeVerticalPositionInPercentage\\\": false,\\n        \\\"writeVerticalPosition\\\": true\\n      },\\n      \\\"dontCountCompositionCharacters\\\": false,\\n      \\\"spellcheckIgnoreWordsInUppercase\\\": null,\\n      \\\"previewFont\\\": \\\"\\\",\\n      \\\"convertBlackBoxesToTopAligned\\\": false,\\n      \\\"autoDetectFps\\\": false,\\n      \\\"hideSecondTimeline\\\": null,\\n      \\\"format\\\": \\\"Ooona\\\",\\n      \\\"doubleHeight\\\": false,\\n      \\\"previewFontSize\\\": 48,\\n      \\\"mediaStartTimecode\\\": 0,\\n      \\\"EBU\\\": {\\n        \\\"forceStartBoxControlCodeAtTheBeginningOfLine\\\": false,\\n        \\\"startOfProgramme\\\": null,\\n        \\\"programOriginalTitle\\\": \\\"\\\",\\n        \\\"forceDoubleHeight\\\": true,\\n        \\\"forceNormalHeightAtTheBeginningOfLine\\\": false,\\n        \\\"revisionNumber\\\": 0,\\n        \\\"languageCode\\\": \\\"00\\\",\\n        \\\"forceOpenSubtitles\\\": false,\\n        \\\"episodeTranslatedTitle\\\": \\\"\\\",\\n        \\\"headerCodePage\\\": \\\"\\\",\\n        \\\"includeColorCodes\\\": true,\\n        \\\"episodeOriginalTitle\\\": \\\"\\\",\\n        \\\"dontTreatMidRowItalicsAsSpace\\\": false,\\n        \\\"forceDoubleHeightAtTheBeginningOfLine\\\": false,\\n        \\\"editorsName\\\": \\\"\\\",\\n        \\\"exportItalicsAsLessAndMore\\\": false,\\n        \\\"useOpenModeBoxingControlCodes\\\": false,\\n        \\\"includeBoxOnOffControlCodes\\\": true,\\n        \\\"country\\\": \\\"\\\",\\n        \\\"treatLessAndMoreThanAsItalics\\\": true,\\n        \\\"characterCodeTable\\\": 0,\\n        \\\"alignWithSpaces\\\": true,\\n        \\\"referenceCode\\\": \\\"\\\",\\n        \\\"forceTeletextSubtitles\\\": false,\\n        \\\"allowNonStandardFpsInHeader\\\": false,\\n        \\\"publisher\\\": \\\"\\\",\\n        \\\"standard\\\": \\\"OpenSubtitles\\\",\\n        \\\"programTranslatedTitle\\\": \\\"\\\"\\n      },\\n      \\\"validation\\\": {},\\n      \\\"closedCaptions\\\": {\\n        \\\"languageCode\\\": \\\"\\\",\\n        \\\"blanksBetweenPopOn\\\": 2,\\n        \\\"fixTimecodeOverrun\\\": false,\\n        \\\"box\\\": \\\"None\\\",\\n        \\\"isTunnel608\\\": false,\\n        \\\"scriptVersion\\\": 0,\\n        \\\"exportChannel\\\": 1,\\n        \\\"isBold\\\": false,\\n        \\\"style\\\": \\\"PopOn\\\",\\n        \\\"extendedCharset\\\": true,\\n        \\\"sccRemoveSpaceAfterControlCodes\\\": false,\\n        \\\"chainSubtitles\\\": false,\\n        \\\"doubleControlCodes\\\": true,\\n        \\\"sccQuickTimeCompatible\\\": 0,\\n        \\\"sccUseSemiColon\\\": false,\\n        \\\"closedCaptionMode\\\": 7,\\n        \\\"exportUpperCase\\\": false\\n      },\\n      \\\"importWordWrap\\\": true,\\n      \\\"readingSpeedWpm\\\": 200,\\n      \\\"autoPopulateFpsFromDatFile\\\": null,\\n      \\\"language1\\\": \\\"English\\\",\\n      \\\"teletextSettings\\\": {\\n        \\\"defaultOutline\\\": \\\"Outline\\\",\\n        \\\"minSubDuration\\\": 0.8333,\\n        \\\"alignAllLines\\\": true,\\n        \\\"defaultAlign\\\": \\\"Center\\\",\\n        \\\"graphicalLineLengthFormat\\\": null,\\n        \\\"preventTimingOverlap\\\": true,\\n        \\\"timingFramesGap\\\": 2,\\n        \\\"maxTimingGap\\\": null,\\n        \\\"defaultBox\\\": \\\"FixedBox\\\",\\n        \\\"graphicalLineLength\\\": false,\\n        \\\"maxSubDuration\\\": 7,\\n        \\\"defaultJustification\\\": \\\"Center\\\",\\n        \\\"screenLines\\\": 23,\\n        \\\"graphicalLineLengthFont1\\\": null,\\n        \\\"maxParagraphLines\\\": 2,\\n        \\\"graphicalLineLengthFont2\\\": null,\\n        \\\"doubleHeight\\\": true,\\n        \\\"EBU\\\": {\\n          \\\"standard\\\": \\\"TeletextLevel1\\\"\\n        },\\n        \\\"lineLength\\\": 37\\n      },\\n      \\\"safeArea\\\": {\\n        \\\"bottom\\\": 10,\\n        \\\"left\\\": 10,\\n        \\\"right\\\": 10,\\n        \\\"top\\\": 10,\\n        \\\"videoHeight\\\": 720,\\n        \\\"videoWidth\\\": 1080\\n      },\\n      \\\"japaneseAgeRatingFixHiraganize\\\": false,\\n      \\\"targetTrack\\\": 0,\\n      \\\"convertFramerate\\\": \\\"none\\\",\\n      \\\"language2\\\": \\\"English\\\",\\n      \\\"lineLength\\\": 37,\\n      \\\"exportOnlySelected\\\": false,\\n      \\\"assDontIncludeNewLineAtTheEnd\\\": false,\\n      \\\"zeroParagraphTemplateId\\\": \\\"\\\",\\n      \\\"exportZero\\\": false,\\n      \\\"ageRating\\\": null,\\n      \\\"mergeAndSort\\\": false,\\n      \\\"tableFont\\\": \\\"\\\",\\n      \\\"convertNullCuesToZero\\\": false,\\n      \\\"columns\\\": [],\\n      \\\"autoTC\\\": true,\\n      \\\"autoSnapToShotChange\\\": false,\\n      \\\"recutAuto\\\": false,\\n      \\\"flavor\\\": \\\"Ooona\\\",\\n      \\\"TTML\\\": {\\n        \\\"outlineColor\\\": \\\"black\\\",\\n        \\\"simplifiedPositioning\\\": false,\\n        \\\"rubyReserveOutside\\\": true,\\n        \\\"outlineWidth\\\": 2,\\n        \\\"languageCode\\\": \\\"\\\",\\n        \\\"copyright\\\": \\\"\\\",\\n        \\\"exportvPosAsTTAF1\\\": false,\\n        \\\"outlineWidthUnit\\\": \\\"px\\\",\\n        \\\"useEditable\\\": false,\\n        \\\"burnedInTimeCode\\\": -1,\\n        \\\"isBold\\\": false,\\n        \\\"fontSize\\\": 100,\\n        \\\"rtlReorder\\\": false,\\n        \\\"customOutline\\\": false,\\n        \\\"fontColor\\\": \\\"\\\",\\n        \\\"ignoreFontProperties\\\": false,\\n        \\\"imsc\\\": {\\n          \\\"captionService\\\": \\\"F1C1CC\\\",\\n          \\\"channel\\\": \\\"CC1\\\",\\n          \\\"exportBoxed\\\": false,\\n          \\\"includeSmpteInformation\\\": false,\\n          \\\"programName\\\": \\\"\\\"\\n        },\\n        \\\"fontSizeUnit\\\": \\\"%\\\",\\n        \\\"luminanceGain\\\": null,\\n        \\\"includeStartTCAtTopDiv\\\": false,\\n        \\\"EBUTT\\\": {\\n          \\\"startOfProgramme\\\": null,\\n          \\\"programOriginalTitle\\\": \\\"\\\",\\n          \\\"revisionNumber\\\": 0,\\n          \\\"episodeTranslatedTitle\\\": \\\"\\\",\\n          \\\"headerCodePage\\\": \\\"\\\",\\n          \\\"episodeOriginalTitle\\\": \\\"\\\",\\n          \\\"editorsName\\\": \\\"\\\",\\n          \\\"documentId\\\": \\\"\\\",\\n          \\\"exportBox\\\": \\\"None\\\",\\n          \\\"referenceCode\\\": \\\"\\\",\\n          \\\"publisher\\\": \\\"\\\",\\n          \\\"standard\\\": \\\"OpenSubtitles\\\",\\n          \\\"programTranslatedTitle\\\": \\\"\\\"\\n        },\\n        \\\"ignoreInlineColors\\\": false,\\n        \\\"lineHeight\\\": 100,\\n        \\\"backColor\\\": \\\"\\\"\\n      },\\n      \\\"extension\\\": \\\"\\\",\\n      \\\"customTxt\\\": {\\n        \\\"subtitleDelimiterValue\\\": \\\"<new_line><new_line>\\\",\\n        \\\"exportReferenceCodesValue\\\": true,\\n        \\\"rowDelimiterValue\\\": \\\"<new_line>\\\",\\n        \\\"exportRaisedValue\\\": false,\\n        \\\"fileHeaderValue\\\": \\\"\\\",\\n        \\\"alignLeft\\\": false,\\n        \\\"subtitleHeaderValue\\\": \\\"<num> <in_cue> <out_cue><new_line>\\\",\\n        \\\"skipBOMValue\\\": false,\\n        \\\"rtfFontNameValue\\\": \\\"Arial\\\",\\n        \\\"exportZeroValue\\\": true,\\n        \\\"rtfOptionsValue\\\": \\\"120\\\",\\n        \\\"rtfExportValue\\\": false,\\n        \\\"rtfFontBoldValue\\\": false,\\n        \\\"fileFooterValue\\\": \\\"\\\",\\n        \\\"rtfFontSizeValue\\\": \\\"12\\\",\\n        \\\"subtitleFooterValue\\\": \\\"\\\",\\n        \\\"encodingValue\\\": \\\"65001\\\",\\n        \\\"italicStartValue\\\": \\\"<I>\\\",\\n        \\\"italicStopValue\\\": \\\"</I>\\\"\\n      },\\n      \\\"skipUntimed\\\": false,\\n      \\\"spellcheckIncludeAISuggestions\\\": null\\n    },\\n    \\\"shared\\\": false,\\n    \\\"currentTime\\\": 0,\\n    \\\"originalProject\\\": null,\\n    \\\"locked\\\": false,\\n    \\\"name\\\": \\\"cross-platform payment system\\\",\\n    \\\"local\\\": false,\\n    \\\"progress\\\": 0,\\n    \\\"sections\\\": [],\\n    \\\"lastSaved\\\": \\\"2023-09-27T09:04:33.781Z\\\",\\n    \\\"startTC\\\": 0,\\n    \\\"hiddenTracks\\\": [],\\n    \\\"spellcheckIgnoredWords\\\": [],\\n    \\\"paragraphsMap\\\": {\\n      \\\"0\\\": {\\n        \\\"index\\\": 0,\\n        \\\"targetIndex\\\": 1\\n      },\\n      \\\"1\\\": {\\n        \\\"deleted\\\": true,\\n        \\\"id\\\": \\\"6da36c22-e239-4220-950b-07a9c39ba480\\\"\\n      },\\n      \\\"2\\\": {\\n        \\\"deleted\\\": true,\\n        \\\"id\\\": \\\"1eff2d8a-4b0c-4fdc-af28-2499591ddacb\\\"\\n      }\\n    },\\n    \\\"selectedIndex\\\": 1,\\n    \\\"version\\\": \\\"3.0\\\",\\n    \\\"customShotchanges\\\": {\\n      \\\"added\\\": [],\\n      \\\"removed\\\": []\\n    },\\n    \\\"workingTrack\\\": 1,\\n    \\\"dateCreated\\\": \\\"2023-09-27T09:04:33.781Z\\\",\\n    \\\"video\\\": \\\"https://sandbox.ooonatools-test.net//Content/ten-hours.mp4\\\",\\n    \\\"id\\\": \\\"da7b4462-eaa9-4e1c-ae25-413f0df6cb76\\\",\\n    \\\"document\\\": null,\\n    \\\"subtitles\\\": {\\n      \\\"paragraphs\\\": [\\n        {\\n          \\\"spellcheck\\\": null,\\n          \\\"outline\\\": \\\"Outline\\\",\\n          \\\"start\\\": null,\\n          \\\"qcErrorCode\\\": null,\\n          \\\"color\\\": \\\"\\\",\\n          \\\"align\\\": \\\"Center\\\",\\n          \\\"omitted\\\": false,\\n          \\\"track\\\": 1,\\n          \\\"box\\\": \\\"None\\\",\\n          \\\"marked\\\": false,\\n          \\\"lastUpdateTime\\\": \\\"2023-09-27T09:04:33.781Z\\\",\\n          \\\"hash\\\": 271158780,\\n          \\\"vAlign\\\": \\\"Bottom\\\",\\n          \\\"annotation\\\": \\\"\\\",\\n          \\\"ccStyle\\\": \\\"\\\",\\n          \\\"index\\\": 1,\\n          \\\"justification\\\": \\\"None\\\",\\n          \\\"duration\\\": null,\\n          \\\"comments\\\": \\\"\\\",\\n          \\\"startLine\\\": 11,\\n          \\\"vertical\\\": false,\\n          \\\"fields\\\": null,\\n          \\\"end\\\": null,\\n          \\\"id\\\": \\\"13f39b2a-9330-4ea9-ad7d-cbe5b046a29d\\\",\\n          \\\"lines\\\": [\\n            {\\n              \\\"index\\\": 11,\\n              \\\"text\\\": \\\"\\\",\\n              \\\"align\\\": \\\"Center\\\",\\n              \\\"font\\\": 1,\\n              \\\"textLength\\\": 0,\\n              \\\"textLengthNoSpaces\\\": 0,\\n              \\\"wordCount\\\": 0\\n            }\\n          ]\\n        }\\n      ],\\n      \\\"zeroParagraph\\\": null\\n    }\\n  },\\n  \\\"locked\\\": false,\\n  \\\"name\\\": \\\"cross-platform payment system\\\",\\n  \\\"local\\\": false,\\n  \\\"information\\\": \\\"3 subtitles (3 changed)\\\",\\n  \\\"progress\\\": null,\\n  \\\"sections\\\": [],\\n  \\\"lastSaved\\\": \\\"2023-09-27T09:04:49.063Z\\\",\\n  \\\"startTC\\\": 0,\\n  \\\"hiddenTracks\\\": [],\\n  \\\"spellcheckIgnoredWords\\\": [],\\n  \\\"selectedIndex\\\": 3,\\n  \\\"version\\\": \\\"3.0\\\",\\n  \\\"customShotchanges\\\": {\\n    \\\"added\\\": [],\\n    \\\"removed\\\": []\\n  },\\n  \\\"workingTrack\\\": 1,\\n  \\\"dateCreated\\\": \\\"2023-09-27T09:04:33.781Z\\\",\\n  \\\"video\\\": \\\"https://sandbox.ooonatools-test.net//Content/ten-hours.mp4\\\",\\n  \\\"id\\\": \\\"da7b4462-eaa9-4e1c-ae25-413f0df6cb76\\\",\\n  \\\"document\\\": null,\\n  \\\"subtitles\\\": {\\n    \\\"paragraphs\\\": [\\n      {\\n        \\\"spellcheck\\\": null,\\n        \\\"outline\\\": \\\"Outline\\\",\\n        \\\"start\\\": 3.04517,\\n        \\\"qcErrorCode\\\": null,\\n        \\\"color\\\": \\\"\\\",\\n        \\\"align\\\": \\\"Center\\\",\\n        \\\"omitted\\\": false,\\n        \\\"track\\\": 1,\\n        \\\"box\\\": \\\"None\\\",\\n        \\\"marked\\\": false,\\n        \\\"lastUpdateTime\\\": \\\"2023-09-27T09:04:48.031Z\\\",\\n        \\\"vAlign\\\": \\\"Bottom\\\",\\n        \\\"annotation\\\": \\\"\\\",\\n        \\\"ccStyle\\\": \\\"\\\",\\n        \\\"index\\\": 1,\\n        \\\"justification\\\": \\\"None\\\",\\n        \\\"comments\\\": \\\"\\\",\\n        \\\"startLine\\\": 11,\\n        \\\"vertical\\\": false,\\n        \\\"fields\\\": null,\\n        \\\"end\\\": 4.46367,\\n        \\\"id\\\": \\\"13f39b2a-9330-4ea9-ad7d-cbe5b046a29d\\\",\\n        \\\"lines\\\": [\\n          {\\n            \\\"align\\\": \\\"Center\\\",\\n            \\\"text\\\": \\\"Hello\\\",\\n            \\\"font\\\": 1,\\n            \\\"index\\\": 11\\n          }\\n        ]\\n      },\\n      {\\n        \\\"spellcheck\\\": null,\\n        \\\"outline\\\": \\\"Outline\\\",\\n        \\\"start\\\": 7.34143,\\n        \\\"qcErrorCode\\\": null,\\n        \\\"color\\\": \\\"\\\",\\n        \\\"omitted\\\": false,\\n        \\\"track\\\": 1,\\n        \\\"box\\\": \\\"None\\\",\\n        \\\"marked\\\": false,\\n        \\\"lastUpdateTime\\\": \\\"2023-09-27T09:04:48.394Z\\\",\\n        \\\"vAlign\\\": \\\"Bottom\\\",\\n        \\\"annotation\\\": \\\"\\\",\\n        \\\"ccStyle\\\": \\\"PopOn\\\",\\n        \\\"index\\\": 2,\\n        \\\"justification\\\": \\\"None\\\",\\n        \\\"comments\\\": \\\"\\\",\\n        \\\"startLine\\\": 11,\\n        \\\"vertical\\\": false,\\n        \\\"fields\\\": null,\\n        \\\"end\\\": 9.63568,\\n        \\\"id\\\": \\\"6da36c22-e239-4220-950b-07a9c39ba480\\\",\\n        \\\"lines\\\": [\\n          {\\n            \\\"align\\\": \\\"Center\\\",\\n            \\\"text\\\": \\\"Hello again\\\",\\n            \\\"font\\\": 1,\\n            \\\"index\\\": 11\\n          }\\n        ]\\n      },\\n      {\\n        \\\"spellcheck\\\": null,\\n        \\\"outline\\\": \\\"Outline\\\",\\n        \\\"start\\\": null,\\n        \\\"qcErrorCode\\\": null,\\n        \\\"color\\\": \\\"\\\",\\n        \\\"omitted\\\": false,\\n        \\\"track\\\": 1,\\n        \\\"box\\\": \\\"None\\\",\\n        \\\"marked\\\": false,\\n        \\\"lastUpdateTime\\\": \\\"2023-09-27T09:04:48.404Z\\\",\\n        \\\"vAlign\\\": \\\"Bottom\\\",\\n        \\\"annotation\\\": \\\"\\\",\\n        \\\"ccStyle\\\": \\\"PopOn\\\",\\n        \\\"index\\\": 3,\\n        \\\"justification\\\": \\\"None\\\",\\n        \\\"comments\\\": \\\"\\\",\\n        \\\"startLine\\\": 11,\\n        \\\"vertical\\\": false,\\n        \\\"fields\\\": null,\\n        \\\"end\\\": null,\\n        \\\"id\\\": \\\"1eff2d8a-4b0c-4fdc-af28-2499591ddacb\\\",\\n        \\\"lines\\\": [\\n          {\\n            \\\"align\\\": \\\"Center\\\",\\n            \\\"text\\\": \\\"\\\",\\n            \\\"font\\\": 1,\\n            \\\"index\\\": 11\\n          }\\n        ]\\n      }\\n    ],\\n    \\\"zeroParagraph\\\": null\\n  }\\n}\""},{"id":"63ed5d83-306b-482c-9c97-32cc36effd7e","name":"404 Project not found","originalRequest":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/external/export/00000000-0000-0000-0000-000000000000?asSubtitles=false","host":["{{base_url}}"],"path":["external","export","00000000-0000-0000-0000-000000000000"],"query":[{"key":"extendedProjectDataFile","value":"v1","description":"Optional: v1 or auto. Omit for plain project JSON.","disabled":true},{"key":"asSubtitles","value":"false","description":"true = return only the subtitles part."}]}},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""}],"_postman_id":"e4cd0c8a-7f21-44d3-88d4-5b0a4542780e"},{"name":"Export Project Signed URL","id":"e49064bb-d6cf-4515-9332-eb7d97269b29","request":{"method":"POST","header":[],"url":"{{base_url}}/external/export/69bae15f-1b43-4448-9322-ca31ed6c7d0b/signed-url","description":"<p>Issues a short-lived, signed download URL for a project's JSON, for a consumer that cannot send your API credentials. Role: <code>API</code>. Nothing is changed; the issue is written to the security log.</p>\n<p><strong>Route.</strong> <code>id</code> (required): project GUID. <strong>Body.</strong> None.</p>\n<p><strong>Success response</strong> (<code>200 OK</code>, JSON):</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>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>url</code></td>\n<td>string</td>\n<td>Absolute <code>GET</code> URL of the form <code>.../external/signed-export/{id}?expires=&lt;unix seconds&gt;&amp;signature=&lt;signature&gt;</code>.</td>\n</tr>\n<tr>\n<td><code>expiresAt</code></td>\n<td>datetime</td>\n<td>UTC expiry. The URL is valid for <strong>15 minutes</strong>.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The id and expiry are covered by the signature, so the URL can't be pointed at another project or extended. Open it with a plain <code>GET</code> and <strong>no Authorization header</strong> (it is anonymous; see <em>Download Signed Export</em>): it returns the same project JSON as <code>POST external/export/{id}</code> with default options.</p>\n<p><strong>Errors.</strong> <code>404 Not Found</code> (empty body) when the project doesn't exist.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","export","fd5f582d-5f16-4aef-a7e9-a92ee9c8d2bc","signed-url"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"4d175f7d-a505-4ef0-9627-5f71432418c5","name":"200 OK","originalRequest":{"method":"POST","header":[],"url":"{{base_url}}/external/export/da7b4462-eaa9-4e1c-ae25-413f0df6cb76/signed-url"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"url\": \"https://sandbox.ooonatools-test.net/external/signed-export/da7b4462-eaa9-4e1c-ae25-413f0df6cb76?expires=1760526000&signature=Xk3b1Zq0m2o9YlV8n7r6u5t4s3p2o1i0h9g8f7e6d5c\",\n  \"expiresAt\": \"2026-10-15T11:00:00Z\"\n}"},{"id":"daa2b603-cab9-4c39-bbf3-95bbe7265bf7","name":"404 Project not found","originalRequest":{"method":"POST","header":[],"url":"{{base_url}}/external/export/00000000-0000-0000-0000-000000000000/signed-url"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""}],"_postman_id":"e49064bb-d6cf-4515-9332-eb7d97269b29"},{"name":"Download Signed Export","id":"cb7cb5f0-216e-49c5-82f5-9ec7e20370a8","request":{"method":"GET","header":[],"url":"{{base_url}}/external/signed-export/da7b4462-eaa9-4e1c-ae25-413f0df6cb76?expires=1760526000&signature=REPLACE_WITH_SIGNATURE","description":"<p>Anonymous download of a project's JSON via the URL returned by <em>Export Project Signed URL</em>. <strong>No authentication is required</strong>: the signature in the query string is the credential (the collection's bearer token is simply ignored). You normally don't build this request yourself; use the <code>url</code> value from the signed-url response as is.</p>\n<p><strong>Route.</strong> <code>id</code>: project GUID (part of the signed data).</p>\n<p><strong>Query string.</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>expires</code></td>\n<td>long</td>\n<td>Unix timestamp (seconds, UTC) after which the URL stops working; at most 15 minutes after issue.</td>\n</tr>\n<tr>\n<td><code>signature</code></td>\n<td>string</td>\n<td>Signature over the id and <code>expires</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Success response</strong> (<code>200 OK</code>): the project JSON, as <em>Export Project</em> returns it with default options.</p>\n<p><strong>Errors.</strong> <code>403 Forbidden</code> for a bad, tampered or expired signature (one response for all of them, so the reason isn't revealed); <code>404 Not Found</code> when the project no longer exists.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","signed-export","da7b4462-eaa9-4e1c-ae25-413f0df6cb76"],"host":["{{base_url}}"],"query":[{"description":{"content":"<p>Unix expiry timestamp from the signed URL.</p>\n","type":"text/plain"},"key":"expires","value":"1760526000"},{"description":{"content":"<p>Signature from the signed URL.</p>\n","type":"text/plain"},"key":"signature","value":"REPLACE_WITH_SIGNATURE"}],"variable":[]}},"response":[{"id":"6e974d16-5c96-4d63-9bed-55f7aac5c41e","name":"403 Invalid or expired","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/signed-export/da7b4462-eaa9-4e1c-ae25-413f0df6cb76?expires=1760526000&signature=REPLACE_WITH_SIGNATURE","host":["{{base_url}}"],"path":["external","signed-export","da7b4462-eaa9-4e1c-ae25-413f0df6cb76"],"query":[{"key":"expires","value":"1760526000","description":"Unix expiry timestamp from the signed URL."},{"key":"signature","value":"REPLACE_WITH_SIGNATURE","description":"Signature from the signed URL."}]}},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""}],"_postman_id":"cb7cb5f0-216e-49c5-82f5-9ec7e20370a8"},{"name":"Close Project","id":"0f634d90-edb6-4137-9f20-efb46b080758","request":{"method":"POST","header":[],"url":"{{base_url}}/external/close/f58ed1f5-599e-4cf1-a48b-918e2ea3d9a7","description":"<p>Closes a project: marks it closed and locked, both in the stored project file and on the project record, so it can no longer be edited. Role: <code>API</code>. Idempotent. The action is written to the security log. To re-open a closed project call the open endpoint with <code>unlock: true</code> (see <em>Create Pro Project</em>).</p>\n<p><strong>Route.</strong> <code>id</code> (required): project GUID. <strong>Body.</strong> None.</p>\n<p><strong>Success response.</strong> <code>200 OK</code> with an empty body.</p>\n<p><strong>Errors.</strong> <code>404 Not Found</code> (empty body) when the project doesn't exist.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","close","8dbaf2c8-211f-4afc-97c2-56a4cb2dbf2c"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"46d163dc-3c76-48bb-ad26-19efd7c97e69","name":"Close project","originalRequest":{"method":"POST","header":[],"url":"{{base_url}}/external/close/da6a683e-5514-4418-96e4-2db1934509a0"},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[{"key":"Content-Length","value":"0"}],"cookie":[],"responseTime":null,"body":""},{"id":"0f3a18ec-9662-43ad-ab41-6382134fc3a1","name":"404 Project not found","originalRequest":{"method":"POST","header":[],"url":"{{base_url}}/external/close/00000000-0000-0000-0000-000000000000"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""}],"_postman_id":"0f634d90-edb6-4137-9f20-efb46b080758"},{"name":"Delete Project","id":"34eff047-e416-43fa-8956-3cf58652a8e8","request":{"method":"DELETE","header":[],"url":"{{base_url}}/external/delete/00000000-0000-0000-0000-000000000000","description":"<p>Permanently deletes a project and records the deletion in the action log. Role: <code>API</code>. Not reversible. Deleting the same GUID twice returns <code>404</code> the second time.</p>\n<p><strong>Route.</strong> <code>id</code> (required): project GUID. <strong>Body.</strong> None.</p>\n<p><strong>Success response.</strong> <code>200 OK</code> with an empty body.</p>\n<p><strong>Errors.</strong> <code>404 Not Found</code> (empty body) when the project doesn't exist.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","delete","00000000-0000-0000-0000-000000000000"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"c6182b54-896a-430c-9b51-02cbe5c04923","name":"Delete Project","originalRequest":{"method":"DELETE","header":[],"url":"{{base_url}}/external/delete/da7b4462-eaa9-4e1c-ae25-413f0df6cb76"},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[{"key":"Content-Length","value":"0"}],"cookie":[],"responseTime":null,"body":""},{"id":"33f30d7e-afa6-4df9-aca3-959625393c03","name":"404 Project not found","originalRequest":{"method":"DELETE","header":[],"url":"{{base_url}}/external/delete/00000000-0000-0000-0000-000000000000"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""}],"_postman_id":"34eff047-e416-43fa-8956-3cf58652a8e8"},{"name":"Copy Projects","id":"7f6227c9-2b06-4c4e-891e-7b97eba1f84e","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"[\n  {\n    \"sourceProjectId\": \"38a35989-4193-4277-a20b-1290a2da10c8\",\n    \"sourceApp\": \"TranslatePro\",\n    \"targetProjectId\": \"1038b571-83bc-41db-8cf6-f493e6cba2b8\",\n    \"targetApp\": \"ReviewPro\",\n    \"oldTargetProjectId\": \"\",\n    \"oldTargetApp\": \"\",\n    \"newSourceProjectId\": \"\",\n    \"newSourceApp\": \"\"\n  }\n]","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/copyProjects","description":"<p>Duplicates one or more projects to new GUIDs, e.g. to hand a project on to the next step of a workflow. Role: <code>API</code>. Not idempotent: re-sending the same body fails because the targets now exist.</p>\n<p>The whole project is copied. If the copy has both an <code>originalProject</code> and a <code>masterProject</code>, the master replaces the original and the master entry is removed.</p>\n<p><strong>Body.</strong> A JSON <strong>array</strong> (required, non-empty) of items, processed in order. Each item:</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>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>sourceProjectId</code></td>\n<td>string</td>\n<td>yes</td>\n<td>GUID of the project to copy from. Must exist.</td>\n</tr>\n<tr>\n<td><code>sourceApp</code></td>\n<td>string</td>\n<td>no</td>\n<td>App of the source project (only passed along in the Translate sub-copy of a rejection).</td>\n</tr>\n<tr>\n<td><code>targetProjectId</code></td>\n<td>string</td>\n<td>yes</td>\n<td>GUID of the new project. <strong>Must not exist yet.</strong></td>\n</tr>\n<tr>\n<td><code>targetApp</code></td>\n<td>string</td>\n<td>yes</td>\n<td>App assigned to the new project, e.g. <code>ReviewPro</code>.</td>\n</tr>\n<tr>\n<td><code>oldTargetProjectId</code></td>\n<td>string</td>\n<td>no</td>\n<td>The previous project in the target's slot. When set, and the copy lacks an <code>originalProject</code> or <code>masterProject</code>, those are taken from this project so the history isn't lost.</td>\n</tr>\n<tr>\n<td><code>oldTargetApp</code></td>\n<td>string</td>\n<td>no</td>\n<td>App of <code>oldTargetProjectId</code> (not used by the code).</td>\n</tr>\n<tr>\n<td><code>newSourceProjectId</code></td>\n<td>string</td>\n<td>no</td>\n<td>Rejection only: when the source is a Translate project, the source is also duplicated to this new GUID.</td>\n</tr>\n<tr>\n<td><code>newSourceApp</code></td>\n<td>string</td>\n<td>no</td>\n<td>App for <code>newSourceProjectId</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The new project gets the target's <code>id</code> and <code>app</code>, fresh creation/modified dates, <code>locked: false</code>, progress <code>0</code> and an empty information line. The source project is not changed. The new project has no owner until it is opened for a user through the open endpoint.</p>\n<p><strong>Success response.</strong> <code>200 OK</code> with an empty body.</p>\n<p><strong>Errors.</strong> An error response (the controller throws) when the array is empty (\"Request body is empty.\"), when a source is not found (\"Source project X not found.\") or when a target already exists (\"Target project X already exists.\"). Items processed before the failing one are not rolled back.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","copyProjects"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"3258e5ee-26f3-496f-9636-5d721f5f8d3a","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"[\n  {\n    \"sourceProjectId\": \"16895ab5-d6a6-4466-afc5-7259540000b1\",\n    \"sourceApp\": \"TranslatePro\",\n    \"targetProjectId\": \"5a5b2bfb-d37b-4009-a65f-d86669374177\",\n    \"targetApp\": \"ReviewPro\",\n    \"oldTargetProjectId\": \"\",\n    \"oldTargetApp\": \"\",\n    \"newSourceProjectId\": \"\",\n    \"newSourceApp\": \"\"\n  }\n]","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/copyProjects"},"status":"OK","code":200,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""},{"id":"0a5844a1-a6f3-4b50-a3aa-a7082c009679","name":"Target already exists","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"[\n  {\n    \"sourceProjectId\": \"db93428a-be68-4cdd-b4a7-3c251bfcf74c\",\n    \"sourceApp\": \"TranslatePro\",\n    \"targetProjectId\": \"e73a6d9f-534b-49cc-a36d-4acbce5fb04b\",\n    \"targetApp\": \"ReviewPro\",\n    \"oldTargetProjectId\": \"\",\n    \"oldTargetApp\": \"\",\n    \"newSourceProjectId\": \"\",\n    \"newSourceApp\": \"\"\n  }\n]","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/copyProjects"},"status":"Internal Server Error","code":500,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"Message\": \"An error has occurred.\",\n  \"ExceptionMessage\": \"Target project 00000000-0000-0000-0000-000000000001 already exists.\"\n}"}],"_postman_id":"7f6227c9-2b06-4c4e-891e-7b97eba1f84e"},{"name":"Reject Project","id":"9e535fa9-5dfe-47c9-a0c5-7791b1b87faf","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"[\n  {\n    \"sourceProjectId\": \"edf5cf4f-409b-499d-bca2-a4a59b2c5335\",\n    \"sourceApp\": \"TranslatePro\",\n    \"targetProjectId\": \"015585d2-7d16-4841-972a-05afb918eee1\",\n    \"targetApp\": \"ReviewPro\",\n    \"oldTargetProjectId\": \"\",\n    \"oldTargetApp\": \"\",\n    \"newSourceProjectId\": \"\",\n    \"newSourceApp\": \"\"\n  }\n]","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/rejectProject","description":"<p>Rejects a project back to an earlier workflow step: copies it to a new GUID like <em>Copy Projects</em>, but takes the content from its <code>originalProject</code> (the version the step started from) rather than its current state. Role: <code>API</code>. Not idempotent (the target must not exist).</p>\n<p><strong>Rejection semantics.</strong> Only applies when the source has an <code>originalProject</code>; otherwise this behaves like <em>Copy Projects</em>.</p>\n<ul>\n<li>Source app contains \"Review\" or \"Edit\": the target is the source with its <code>masterProject</code> moved into <code>originalProject</code>.</li>\n<li>Any other app: the source's <code>originalProject</code> becomes the target project (and the source's <code>masterProject</code>, if any, becomes the target's <code>originalProject</code>).</li>\n<li>If <code>newSourceProjectId</code> is set and the source app contains \"Translat\", the source is also copied unchanged to <code>newSourceProjectId</code>, so the work done in the target column is kept.</li>\n</ul>\n<p><strong>Body.</strong> A JSON <strong>array</strong> (required, non-empty) of items, processed in order. Each item:</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>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>sourceProjectId</code></td>\n<td>string</td>\n<td>yes</td>\n<td>GUID of the project to copy from. Must exist.</td>\n</tr>\n<tr>\n<td><code>sourceApp</code></td>\n<td>string</td>\n<td>no</td>\n<td>App of the source project (only passed along in the Translate sub-copy of a rejection).</td>\n</tr>\n<tr>\n<td><code>targetProjectId</code></td>\n<td>string</td>\n<td>yes</td>\n<td>GUID of the new project. <strong>Must not exist yet.</strong></td>\n</tr>\n<tr>\n<td><code>targetApp</code></td>\n<td>string</td>\n<td>yes</td>\n<td>App assigned to the new project, e.g. <code>ReviewPro</code>.</td>\n</tr>\n<tr>\n<td><code>oldTargetProjectId</code></td>\n<td>string</td>\n<td>no</td>\n<td>The previous project in the target's slot. When set, and the copy lacks an <code>originalProject</code> or <code>masterProject</code>, those are taken from this project so the history isn't lost.</td>\n</tr>\n<tr>\n<td><code>oldTargetApp</code></td>\n<td>string</td>\n<td>no</td>\n<td>App of <code>oldTargetProjectId</code> (not used by the code).</td>\n</tr>\n<tr>\n<td><code>newSourceProjectId</code></td>\n<td>string</td>\n<td>no</td>\n<td>Rejection only: when the source is a Translate project, the source is also duplicated to this new GUID.</td>\n</tr>\n<tr>\n<td><code>newSourceApp</code></td>\n<td>string</td>\n<td>no</td>\n<td>App for <code>newSourceProjectId</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The new project gets the target's <code>id</code> and <code>app</code>, fresh creation/modified dates, <code>locked: false</code>, progress <code>0</code> and an empty information line. The source project is not changed. The new project has no owner until it is opened for a user through the open endpoint.</p>\n<p><strong>Success response.</strong> <code>200 OK</code> with an empty body.</p>\n<p><strong>Errors.</strong> An error response (the controller throws) when the array is empty (\"Request body is empty.\"), when a source is not found (\"Source project X not found.\") or when a target already exists (\"Target project X already exists.\"). Items processed before the failing one are not rolled back.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","rejectProject"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"3c141f17-6017-4e77-9ece-fa96605bf638","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"[\n  {\n    \"sourceProjectId\": \"46e63f16-d055-4584-8a6a-ef11b5889c21\",\n    \"sourceApp\": \"TranslatePro\",\n    \"targetProjectId\": \"d8db6a0b-aa4d-40eb-8c87-da3c473a2546\",\n    \"targetApp\": \"ReviewPro\",\n    \"oldTargetProjectId\": \"\",\n    \"oldTargetApp\": \"\",\n    \"newSourceProjectId\": \"\",\n    \"newSourceApp\": \"\"\n  }\n]","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/rejectProject"},"status":"OK","code":200,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""}],"_postman_id":"9e535fa9-5dfe-47c9-a0c5-7791b1b87faf"},{"name":"Merge Projects","id":"776abf89-d600-4496-87da-52d64cd446a5","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"projectGuids\": [\"959fb20a-6f76-474e-9088-f8a441d60463\", \"ca52739f-b461-4895-adfa-61d4158e5b98\", \"1c93d9b7-af17-48dd-9437-35f099e30afb\"],\n  \"configurationGuid\": \"6c7d614a-64a9-4cbe-911c-8605205619de\",\n  \"name\": \"Merged project name\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/merge/8b1b6dd0-5686-4a63-bddb-bf65e9c68b1e","description":"<p>Merges several projects into one new project, typically the slices created with <code>splitLimitation</code> (see <em>Create Pro Project</em>). Role: <code>API</code>.</p>\n<p><strong>Route.</strong> <code>id</code> (required): the GUID <strong>you choose for the new merged project</strong>. It must not exist yet.</p>\n<p><strong>Body</strong> (JSON; property names are case-insensitive).</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>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>projectGuids</code></td>\n<td>string[]</td>\n<td>yes</td>\n<td>GUIDs of the projects to merge. Unknown GUIDs are skipped; at least one must exist. The order sets which project is the base (the first) and the order of equal pieces.</td>\n</tr>\n<tr>\n<td><code>configurationGuid</code></td>\n<td>string</td>\n<td>no</td>\n<td>Saved configuration whose settings replace the merged project's settings. If it doesn't exist or can't be parsed, the first project's settings are kept.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>no</td>\n<td>Name of the merged project. Default: first project's name + \" (Merged)\".</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Behaviour.</strong> The new project starts as a copy of the first project; each project contributes the subtitles inside its <code>splitLimitation</code> range (all of them when none was set). The pieces are ordered by their first timed subtitle, concatenated and renumbered from 1. The new project is stored with progress <code>100</code> and the information line \"Merged: \". The source projects are unchanged. Each merged project is expected to have an open-request on record (i.e. to have been opened through the project endpoint); a project without one makes the call fail with an error response.</p>\n<p><strong>Success response</strong> (<code>200 OK</code>): the id of the new project (JSON string).</p>\n<p><strong>Errors.</strong> <code>400 Bad Request</code> with \"Project already exists\" when <code>{id}</code> is taken, and \"No projects found\" when none of <code>projectGuids</code> exists.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","merge","9200c727-85b8-450e-96a3-61996a651383"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"0e7549c6-6219-4a52-a7b6-fa51df780a70","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"projectGuids\": [\"d1d2d05a-8976-4332-b5c6-3a2a5cf8d6d7\", \"b9e8e57d-a2e5-40d6-a524-2eba8b656957\", \"e8e09af0-df87-45b0-b6c4-b61e0214d6df\"],\n  \"configurationGuid\": \"f1ebed6b-d9f8-44fe-968b-da86637e2ff7\",\n  \"name\": \"Merged project name\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/merge/ba9be807-836c-4c2c-862e-6a6b9962cef7"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"\"4f0c1c9e-8a53-4b4e-9f58-0d3d6d0a7b11\""},{"id":"af77bc8e-8695-4660-b026-36bf0fb1f6ab","name":"400 Project exists","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"projectGuids\": [\"cc4bffd2-164a-4b01-b604-fdf50bdddb31\", \"ca6e0514-5713-40fe-afab-02b0d8ac5ae5\", \"aeb61458-dd11-44e4-8125-3497f09fc056\"],\n  \"configurationGuid\": \"a909acd7-ca94-4870-85be-5a5c07b204c3\",\n  \"name\": \"Merged project name\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/merge/0f522996-0f86-4d36-92e6-e1b401d9aa49"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"\"Project already exists\""}],"_postman_id":"776abf89-d600-4496-87da-52d64cd446a5"}],"id":"df06aea3-599b-4e5c-adda-d5ad7beb680c","description":"<p>Create, open, inspect, export and manage projects. All requests need the <code>API</code> role (bearer token).</p>\n<p><strong>Opening a project.</strong> <code>POST external/project/{id}</code> (the Create Pro, Translate Pro and Review Pro requests; <code>POST external/MultilingualQC/{id?}</code> for multilingual QC) returns a URL you redirect your user to. The <code>ip</code> field is optional and only stored with the request for auditing; it is not currently enforced when the session link is opened. The user is logged in as the account matching the e-mail address you supply, in a session limited to this project. If the user doesn't exist (identified by e-mail) the account is created on the fly, which keeps user configuration, hotkeys, layout and theme across sessions.\nThe GUID in the URL is the unique id of the project - you generate it and keep it. Calling the endpoint the first time with a GUID creates the project; calling it again with the same GUID opens the existing project for editing.</p>\n<p><strong>One user at a time.</strong> If the project belongs to a different e-mail and was saved within the last 180 seconds, the link opens it in view-only mode without transferring ownership. Add <code>?force=true</code> to open it for the new user anyway (they may overwrite each other's work).</p>\n<p><strong>Working with a project.</strong> Status, activity, statistics, changes and boundaries are read-only. Export returns the project JSON; Export Project Signed URL returns a 15-minute anonymous download link (<code>GET external/signed-export/{id}?expires=...&amp;signature=...</code>, no authentication needed - see Download Signed Export). Close locks a project, Delete removes it, Copy Projects / Reject Project duplicate a project to a new GUID for the next workflow step, and Merge Projects joins split projects back together.</p>\n","_postman_id":"df06aea3-599b-4e5c-adda-d5ad7beb680c","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"📱 App","item":[{"name":"List all apps","event":[{"listen":"test","script":{"type":"text/javascript","exec":["var template = `<table border=\"1\">\n    <tr>\n        <th>Key</th>\n        <th>Name</th>\n        <th>Description</th>\n        <th>Icon</th>\n        <th>Color</th>\n    </tr>\n    {{#each response}}\n        <tr style=\"background-color:{{color}}\">\n            <td>{{key}}</td>\n            <td>{{name}}</td>\n            <td>{{description}}</td>\n            <td>{{icon}}</td>\n            <td>{{color}}</td>\n        </tr>\n    {{/each}}\n</table>`;\n\nvar response = pm.response.json();\npm.visualizer.set(template, { response });\n\nvar iconsReq = {\n  url: `${pm.variables.get('base_url')}/external/icons`,\n  method: 'GET',\n  header: {\n   'Accept': 'application/json',\n   'Authorization': `Bearer ${pm.variables.get('access_token')}`\n  }\n};\nvar icons = pm.sendRequest(iconsReq, function (err, res) {\n    console.log(err ? err : res.json());\n    if (err === null) {\n        var resJson = res.json();\n        pm.sendRequest(resJson.css, function (err2, res2) {\n            let style = `<style>\n                ${res2.text()}\n                @font-face {\n                    font-family: 'icomoon';\n                    src: url('${resJson.woff}?fiuctu') format('woff');\n                    font-weight: normal;\n                    font-style: normal;\n                }\n            </style>`;\n            template = `${style}${template.replace('{{icon}}', '<i class=\"icon icon-{{icon}}\"/> (icon-{{icon}})')}`;\n            pm.visualizer.set(template, { response });\n        })\n    }\n});"]}}],"id":"8592c22e-5770-4a44-9307-fac4a9db662a","request":{"method":"GET","header":[],"url":"{{base_url}}/external/apps","description":"<p>Lists the apps (tools) that can be opened with <code>POST external/app</code>. Use the <code>key</code> as the <code>app</code> value in that request.</p>\n<h2 id=\"input\">Input</h2>\n<p>None. Requires the <code>API</code> role.</p>\n<h2 id=\"output\">Output</h2>\n<p><code>200 OK</code> with an array of apps, ordered by their index in the toolbox:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>key</code></td>\n<td>App key to send as <code>app</code> to <code>POST external/app</code>.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>Display name of the app.</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td>Short description.</td>\n</tr>\n<tr>\n<td><code>icon</code></td>\n<td>Icon name in the OOONA icon font (see <code>GET external/icons</code>).</td>\n</tr>\n<tr>\n<td><code>color</code></td>\n<td>Hex colour of the app tile.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Only enabled apps that are not marked \"coming soon\" are returned, and the list is further filtered by the <code>External.Apps.Filter</code> app setting (comma separated keys, case-insensitive). When the setting is not set the default filter is <code>CreatePro, ClosedCaptions, TranslatePro, Scripting, EditPro, Converter, Compare, Viewer, AudioDescription, MultilingualQC</code>, so the sample response may include more apps than your instance returns.</p>\n<p>The test script of this request renders the result as a table in the Postman Visualizer.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","apps"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"8974d16d-26d8-4ce9-a73d-a0e2d6412992","name":"List all apps","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/apps"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"1944"}],"cookie":[],"responseTime":null,"body":"[\n    {\n        \"color\": \"#f9b57d\",\n        \"description\": \"Create subtitles from scratch\",\n        \"icon\": \"file\",\n        \"key\": \"CaptionMaker\",\n        \"name\": \"Create\"\n    },\n    {\n        \"color\": \"#81c5d7\",\n        \"description\": \"Translate subtitles file to different languages\",\n        \"icon\": \"translate\",\n        \"key\": \"Translator\",\n        \"name\": \"Translate\"\n    },\n    {\n        \"color\": \"#efefef\",\n        \"description\": \"Create an audio description for a video\",\n        \"icon\": \"audio-description\",\n        \"key\": \"AudioDescription\",\n        \"name\": \"Audio Description\"\n    },\n    {\n        \"color\": \"#b9cf8a\",\n        \"description\": \"Review a subtitle file, correct mistakes and share with clients\",\n        \"icon\": \"pencil\",\n        \"key\": \"Editor\",\n        \"name\": \"Review\"\n    },\n    {\n        \"color\": \"#BA7BA1\",\n        \"description\": \"Convert multiple files between different subtitles formats\",\n        \"icon\": \"batch-convert\",\n        \"key\": \"BatchConvert\",\n        \"name\": \"Batch Convert\"\n    },\n    {\n        \"color\": \"#BFB8C9\",\n        \"description\": \"Convert files using our API\",\n        \"icon\": \"converter\",\n        \"key\": \"ConvertApi\",\n        \"name\": \"Convert API\"\n    },\n    {\n        \"color\": \"#92a7be\",\n        \"description\": \"Burn and encode subtitles on videos\",\n        \"icon\": \"burn\",\n        \"key\": \"Encoder\",\n        \"name\": \"Burn & Encode\"\n    },\n    {\n        \"color\": \"#A5C1D7\",\n        \"description\": \"Convert subtitles for Yes.\",\n        \"icon\": \"yes\",\n        \"key\": \"YesConvert\",\n        \"name\": \"Yes Convert\"\n    },\n    {\n        \"color\": \"#9AEBDC\",\n        \"description\": \"Create segmented versions of existing subtitles files.\",\n        \"icon\": \"segmenter\",\n        \"key\": \"SubtitleSlicer\",\n        \"name\": \"Subtitle Slicer\"\n    },\n    {\n        \"color\": \"#9795e3\",\n        \"description\": \"Render TTML and IMSC files.\",\n        \"icon\": \"xml\",\n        \"key\": \"TTMLRenderer\",\n        \"name\": \"TTML Renderer\"\n    },\n    {\n        \"color\": \"#2283c5\",\n        \"description\": \"Manage user accounts\",\n        \"icon\": \"cog\",\n        \"key\": \"Admin\",\n        \"name\": \"Dashboard\"\n    }\n]"}],"_postman_id":"8592c22e-5770-4a44-9307-fac4a9db662a"},{"name":"Get icons file URLs","id":"6085bf59-5b6e-4857-b716-9567a4cda2e5","request":{"method":"GET","header":[],"url":"{{base_url}}/external/icons","description":"<p>Returns the absolute URLs of the OOONA icon font files, so you can render the <code>icon</code> names returned by <code>GET external/apps</code> in your own UI.</p>\n<h2 id=\"input\">Input</h2>\n<p>None. Requires the <code>API</code> role.</p>\n<h2 id=\"output\">Output</h2>\n<p><code>200 OK</code> with a JSON object of absolute URLs:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>eot</code>, <code>svg</code>, <code>ttf</code>, <code>woff</code></td>\n<td>The <code>icomoon</code> icon font in each format.</td>\n</tr>\n<tr>\n<td><code>css</code></td>\n<td>Stylesheet defining the <code>icon-&lt;name&gt;</code> classes (e.g. <code>icon-translate</code>).</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","icons"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"7d10e029-e2e0-43fc-9f07-287351de8568","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/icons"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"eot\": \"https://sandbox.ooonatools-test.net/Content/fonts/icomoon.eot\",\n    \"svg\": \"https://sandbox.ooonatools-test.net/Content/fonts/icomoon.svg\",\n    \"ttf\": \"https://sandbox.ooonatools-test.net/Content/fonts/icomoon.ttf\",\n    \"woff\": \"https://sandbox.ooonatools-test.net/Content/fonts/icomoon.woff\",\n    \"css\": \"https://sandbox.ooonatools-test.net/Content/icomoon.css\"\n}"}],"_postman_id":"6085bf59-5b6e-4857-b716-9567a4cda2e5"},{"name":"toolbar-options.json","id":"2853ac48-a0f8-4735-89d1-4efe5e4914d6","request":{"method":"GET","header":[],"url":"{{base_url}}/V2/toolbar-options.json","description":"<p>A static JSON file (not an API controller) served by the web app that lists every toolbar/menu item key. Use these keys in the <code>enabledMenuItems</code> (whitelist) and <code>disabledMenuItems</code> (blacklist) fields of <code>POST external/app</code> and the project endpoints.</p>\n<h2 id=\"input\">Input</h2>\n<p>None. No request body or parameters.</p>\n<h2 id=\"output\">Output</h2>\n<p><code>200 OK</code> with a JSON array of strings. Top-level menus (e.g. <code>project</code>, <code>edit</code>, <code>view</code>) are followed by their items. Enabling a sub-item without its parent menu key will not show it. The exact list can change between versions, so fetch it from your own instance.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["V2","toolbar-options.json"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"02fe5a82-0e04-409f-8483-ce76797a71e0","name":"toolbar-options.json","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/V2/toolbar-options.json"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"},{"key":"Content-Length","value":"2658"}],"cookie":[],"responseTime":null,"body":"[\n    \"project\",\n    \"newProject\",\n    \"finishProject\",\n    \"unlockProject\",\n    \"applyRevisions\",\n    \"openProject\",\n    \"saveProject\",\n    \"setupProjectWizard\",\n    \"renameProject\",\n    \"uploadProject\",\n    \"downloadProject\",\n    \"restoreProject\",\n    \"closeProject\",\n    \"importExport\",\n    \"import\",\n    \"importFromOrder\",\n    \"importTarget\",\n    \"importMaster\",\n    \"export\",\n    \"trackExport\",\n    \"exportDVDImages\",\n    \"exportScript\",\n    \"importMerge\",\n    \"importMergeTiming\",\n    \"importAppend\",\n    \"importRawScript\",\n    \"exportWord\",\n    \"exportScriptExcel\",\n    \"media\",\n    \"openMedia\",\n    \"setVideoTimecode\",\n    \"openDAT\",\n    \"downloadDAT\",\n    \"shotchangesSensitivity\",\n    \"projectJobs\",\n    \"film2\",\n    \"transcribeCurrentVideo\",\n    \"cloud-upload\",\n    \"transcodeCurrentVideo\",\n    \"lock\",\n    \"generateMediaSnapshots\",\n    \"mediaInformation\",\n    \"videoSections\",\n    \"player\",\n    \"edit\",\n    \"undo\",\n    \"redo\",\n    \"findAndReplace\",\n    \"goTo\",\n    \"textCase\",\n    \"clearText\",\n    \"textOrientation\",\n    \"vertical-text\",\n    \"phoneticGuide\",\n    \"ruby\",\n    \"insertSymbol\",\n    \"removeSDHElements\",\n    \"toggleTrack\",\n    \"subtitle\",\n    \"addSubtitle\",\n    \"deleteSubtitle\",\n    \"copyCutSubtitles\",\n    \"validationErrors\",\n    \"runChecks\",\n    \"runFixes\",\n    \"spellcheck\",\n    \"wordToPreviousLine\",\n    \"wordToNextLine\",\n    \"splitSubtitle\",\n    \"page-break\",\n    \"mergeWithNextSubtitle\",\n    \"chain\",\n    \"fileProperties\",\n    \"statistics\",\n    \"timecode\",\n    \"recutOffset\",\n    \"timecodeStretchSqueeze\",\n    \"addTrimTime\",\n    \"framerateConversion\",\n    \"clearTimecodes\",\n    \"setTimingMode\",\n    \"sortListByTimecode\",\n    \"sort-numeric-asc\",\n    \"setInOutCuesMenu\",\n    \"setInCue\",\n    \"setOutCue\",\n    \"setInOutCue\",\n    \"clearInOutCuesMenu\",\n    \"clearInCue\",\n    \"clearOutCue\",\n    \"clearInOut\",\n    \"showTimecodeDialog\",\n    \"settings\",\n    \"projectSettings\",\n    \"tracksSettings\",\n    \"overrides\",\n    \"wrench\",\n    \"hotkeys\",\n    \"personalDictionaries\",\n    \"shortForms\",\n    \"userConfiguration\",\n    \"clearSelections\",\n    \"view\",\n    \"boxPreview\",\n    \"outlinePreview\",\n    \"theme\",\n    \"tracksVisibility\",\n    \"editLayout\",\n    \"resetLayout\",\n    \"saveLayout\",\n    \"openLayout\",\n    \"toggleVideoGrid\",\n    \"toggleTimeline\",\n    \"toggleSourceSubtitles\",\n    \"toggleVideo\",\n    \"toggleDocumentPreview\",\n    \"help\",\n    \"openHelpCenter\",\n    \"openReleaseNotes\",\n    \"videoTutorials\",\n    \"video-camera\",\n    \"quickTour\",\n    \"openFAQ\",\n    \"downloadAgent\",\n    \"moveSupportBubble\",\n    \"actionBarVideoSurroundingSubs\",\n    \"quickCommand\",\n    \"ccStyle\",\n    \"mergeBlock\",\n    \"splitBlock\",\n    \"box\",\n    \"outline\",\n    \"lineAlign\",\n    \"justify\",\n    \"verticalAlign\",\n    \"mergeSubtitles\",\n    \"lineFont\",\n    \"formatSelecteSubtitles\",\n    \"formatNewText\",\n    \"omitSubtitle\",\n    \"showEditingCodes\",\n    \"moveWord\",\n    \"translateMenu\",\n    \"machineTranslation\",\n    \"exportOriginalProject\",\n    \"exportSourceSubtitles\",\n    \"exportTranslateExcel\",\n    \"overlayAttributes\",\n    \"overlayTimecodes\",\n    \"syncByTime\",\n    \"syncByIndex\",\n    \"syncReset\",\n    \"previewSource\",\n    \"reviewMenu\",\n    \"showOnlyEdited\",\n    \"showEditingDiff\",\n    \"shareReviewLink\",\n    \"syncSource\",\n    \"exportWordSummary\",\n    \"exportExcelSummary\",\n    \"toggleMasterTable\",\n    \"jumpToPreviousChange\",\n    \"jumpToNextChange\",\n    \"discardSubtitleChanges\",\n    \"reviewingCompleted\",\n    \"transcribeMenu\",\n    \"customColumns\",\n    \"generateBoxesBetweenShots\",\n    \"tab\",\n    \"exportExcel\"\n]"}],"_postman_id":"2853ac48-a0f8-4735-89d1-4efe5e4914d6"},{"name":"Open Create Pro","id":"b4662743-f62d-42cd-be76-a23843067941","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"requestId\": \"9b608067-f87e-4b97-930f-d808fb7d6c62\",\n    \"email\": \"Chad_Bednar@example.com\",\n    \"ip\": \"::1\",\n    \"app\": \"CreatePro\",\n    \"editConfiguration\": true,\n    \"allowDownload\": false,\n    \"allowUpload\": true,\n    \"allowMediaOpen\": true,\n    \"allowUnlock\": false,\n    \"allowShare\": false,\n    \"disabledMenuItems\": [],\n    \"roles\": \"\",\n    \"callbackUrl\": \"https://example.com/ooona/callback\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/app","description":"<p>Opens a <strong>Create Pro</strong> session for a user: you send the user's email, the API returns a single-use URL that logs them in with only this tool available. The user sees every project they created in this tool and can create new ones. Use <code>enabledMenuItems</code> / <code>disabledMenuItems</code> to filter the toolbar (see the examples).</p>\n<h2 id=\"request-body-json\">Request body (JSON)</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user the session is opened for. If no user holds this address one is created automatically (marked as created by <code>API</code>, assigned to the default client).</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>yes</td>\n<td>App key to open (see <code>GET external/apps</code>), e.g. <code>CreatePro</code>, <code>TranslatePro</code>, <code>EditPro</code>, <code>Converter</code>, <code>AudioDescription</code>, <code>Admin</code>. The session is limited to this single app.</td>\n</tr>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>recommended</td>\n<td>Your own identifier for this request (a GUID is fine); stored with the request.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>optional</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>editConfiguration</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to edit the configuration (import/export settings, etc.).</td>\n</tr>\n<tr>\n<td><code>allowDownload</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to download/export files.</td>\n</tr>\n<tr>\n<td><code>allowUpload</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to upload files.</td>\n</tr>\n<tr>\n<td><code>allowMediaOpen</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to open media (video/audio) files.</td>\n</tr>\n<tr>\n<td><code>allowUnlock</code></td>\n<td>boolean</td>\n<td>optional (default <code>null</code>)</td>\n<td>Allow the user to unlock projects.</td>\n</tr>\n<tr>\n<td><code>allowShare</code></td>\n<td>boolean</td>\n<td>optional (default <code>null</code>)</td>\n<td>Allow the user to share projects.</td>\n</tr>\n<tr>\n<td><code>enabledMenuItems</code></td>\n<td>string[]</td>\n<td>optional</td>\n<td>If present, only these toolbar/menu items are shown. Keys are listed in <code>toolbar-options.json</code>.</td>\n</tr>\n<tr>\n<td><code>disabledMenuItems</code></td>\n<td>string[]</td>\n<td>optional</td>\n<td>Toolbar/menu item keys to hide.</td>\n</tr>\n<tr>\n<td><code>roles</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Extra roles to add to the session.</td>\n</tr>\n<tr>\n<td><code>callbackUrl</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Callback URL stored with the request.</td>\n</tr>\n<tr>\n<td><code>baseUrl</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Base URL stored with the request.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The body uses the same model as the project endpoints, so every other property of that model (configuration GUIDs/JSON, <code>video</code>, <code>subtitlesUrl</code>, ...) is accepted and stored with the request, but they are only meaningful for project sessions (see the <strong>Project</strong> folder). Property names are case-insensitive.</p>\n<h2 id=\"response\">Response</h2>\n<p><code>200 OK</code> with a JSON string: the single-use session URL (<code>/V2/external?token=...</code>). Redirect the user to it immediately (or open it in a new tab); do not cache it. The token is valid for 24 hours, and one session per email is supported at any given time.</p>\n<p>An unreadable or empty body is not handled specially and results in a <code>500</code> server error. The endpoint requires the <code>API</code> role.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","app"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"8afb6d6b-8c05-4c8c-8797-87ec80b51835","name":"Open Create Pro with toolbar filtering","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"requestId\": \"72ac2121-1dc7-434c-8b10-400293595353\",\r\n    \"email\": \"Maud_Denesik82@example.org\",\r\n    \"ip\": \"::1\",\r\n    \"app\": \"CreatePro\",\r\n    \"editConfiguration\": true,\r\n    \"allowDownload\": false,\r\n    \"allowUpload\": true,\r\n    \"allowMediaOpen\": true,\r\n    \"enabledMenuItems\": [\r\n        \"project\",\r\n            \"newProject\", \"finishProject\", \"openProject\", \"saveProject\", \"closeProject\",\r\n        \"edit\",\r\n            \"undo\", \"redo\", \"findAndReplace\", \"goTo\",\r\n        \"subtitle\",\r\n            \"addSubtitle\", \"deleteSubtitle\", \"copyCutSubtitles\", \"validationErrors\", \"runChecks\", \"runFixes\", \"spellcheck\",\r\n            \"wordToPreviousLine\", \"wordToNextLine\", \"splitSubtitle\", \"mergeWithNextSubtitle\",\r\n        \"timecode\",\r\n            \"recutOffset\", \"timecodeStretchSqueeze\", \"addTrimTime\", \"framerateConversion\", \"clearTimecodes\", \"sortListByTimecode\",\r\n            \"setInOutCuesMenu\", \"setInCue\", \"setOutCue\", \"setInOutCue\", \"clearInOutCuesMenu\", \"clearInCue\", \"clearOutCue\", \"clearInOut\",\r\n        \"settings\",\r\n            \"projectSettings\", \"tracksSettings\", \"hotkeys\", \"personalDictionaries\", \"shortForms\", \"userConfiguration\", \"clearSelections\",\r\n        \"view\",\r\n            \"boxPreview\", \"outlinePreview\", \"theme\", \"tracksVisibility\", \"resetLayout\",\r\n        \"help\",\r\n            \"openHelpCenter\", \"videoTutorials\", \"quickTour\", \"openFAQ\", \"downloadAgent\", \"moveSupportBubble\",\r\n        \"actionBar\",\r\n            \"actionBarVideoSurroundingSubs\", \"quickCommand\", \"ccStyle\", \"mergeBlock\", \"splitBlock\", \"box\", \"outline\", \"lineAlign\", \"justify\",\r\n            \"verticalAlign\", \"mergeSubtitles\", \"formatSelecteSubtitles\", \"formatNewText\", \"omitSubtitle\", \"showEditingCodes\", \"moveWord\",\r\n        \"translateMenu\",\r\n            \"machineTranslation\", \"exportTranslateExcel\", \"overlayAttributes\", \"overlayTimecodes\", \"syncByTime\", \"syncByIndex\", \"syncReset\", \"previewSource\",\r\n        \"reviewMenu\",\r\n            \"showOnlyEdited\", \"showEditingDiff\", \"syncSource\", \"exportWordSummary\", \"exportExcelSummary\", \"toggleMasterTable\", \"jumpToPreviousChange\", \"jumpToNextChange\", \"discardSubtitleChanges\", \"reviewingCompleted\",\r\n        \"transcribeMenu\",\r\n            \"customColumns\", \"generateBoxesBetweenShots\", \"exportExcel\"\r\n    ]\r\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/app"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=TQTrD7GSuO7S2h4HrJvLq4sdayHjq0bVaViHpBCIfws\""},{"id":"b8735b07-5d0e-4b31-a122-5fe5d54d0a21","name":"Open Create Pro mini","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"requestId\": \"d53dbef9-5484-4561-bbfc-3d76f2adeb60\",\r\n    \"email\": \"Erna.Rodriguez@example.net\",\r\n    \"ip\": \"::1\",\r\n    \"app\": \"CreatePro\",\r\n    \"editConfiguration\": true,\r\n    \"allowDownload\": false,\r\n    \"allowUpload\": true,\r\n    \"allowMediaOpen\": true,\r\n    \"enabledMenuItems\": [\r\n        \"project\",\r\n            \"finishProject\", \"saveProject\",\r\n        \"edit\",\r\n            \"undo\", \"redo\", \"findAndReplace\", \"goTo\",\r\n        \"subtitle\",\r\n            \"validationErrors\",\r\n        \"settings\",\r\n            \"hotkeys\",\r\n        \"view\",\r\n            \"theme\", \"resetLayout\",\r\n        \"help\",\r\n            \"openHelpCenter\", \"quickTour\", \"moveSupportBubble\",\r\n        \"translateMenu\",\r\n            \"previewSource\",\r\n        \"reviewMenu\",\r\n            \"showOnlyEdited\", \"showEditingDiff\", \"syncSource\", \"exportWordSummary\", \"exportExcelSummary\", \"toggleMasterTable\", \"jumpToPreviousChange\", \"jumpToNextChange\", \"discardSubtitleChanges\", \"reviewingCompleted\"\r\n    ]\r\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/app"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=TQTrD7GSuO7S2h4HrJvLq4sdayHjq0bVaViHpBCIfws\""},{"id":"bce80480-a8f7-4e29-8583-6ef94d8e3b30","name":"Open Create Pro","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"requestId\": \"3c5c3e35-a1f9-4120-a848-78606df44e8a\",\r\n    \"email\": \"Trent_Nitzsche39@example.com\",\r\n    \"ip\": \"::1\",\r\n    \"app\": \"CreatePro\",\r\n    \"editConfiguration\": true,\r\n    \"allowDownload\": false,\r\n    \"allowUpload\": true,\r\n    \"allowMediaOpen\": true\r\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/app"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"99"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=TQTrD7GSuO7S2h4HrJvLq4sdayHjq0bVaViHpBCIfws\""}],"_postman_id":"b4662743-f62d-42cd-be76-a23843067941"},{"name":"Open Translate Pro","id":"9e31db7a-c549-4b4d-a49a-95cd16b1ef51","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"requestId\": \"38726ced-185a-46c7-b691-4b4159420295\",\n    \"email\": \"Blanca14@example.net\",\n    \"ip\": \"::1\",\n    \"app\": \"TranslatePro\",\n    \"editConfiguration\": true,\n    \"allowDownload\": false,\n    \"allowUpload\": true,\n    \"allowMediaOpen\": true,\n    \"allowUnlock\": false,\n    \"allowShare\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/app","description":"<p>Opens a <strong>Translate Pro</strong> session for a user: you send the user's email, the API returns a single-use URL that logs them in with only this tool available.</p>\n<h2 id=\"request-body-json\">Request body (JSON)</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user the session is opened for. If no user holds this address one is created automatically (marked as created by <code>API</code>, assigned to the default client).</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>yes</td>\n<td>App key to open (see <code>GET external/apps</code>), e.g. <code>CreatePro</code>, <code>TranslatePro</code>, <code>EditPro</code>, <code>Converter</code>, <code>AudioDescription</code>, <code>Admin</code>. The session is limited to this single app.</td>\n</tr>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>recommended</td>\n<td>Your own identifier for this request (a GUID is fine); stored with the request.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>optional</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>editConfiguration</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to edit the configuration (import/export settings, etc.).</td>\n</tr>\n<tr>\n<td><code>allowDownload</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to download/export files.</td>\n</tr>\n<tr>\n<td><code>allowUpload</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to upload files.</td>\n</tr>\n<tr>\n<td><code>allowMediaOpen</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to open media (video/audio) files.</td>\n</tr>\n<tr>\n<td><code>allowUnlock</code></td>\n<td>boolean</td>\n<td>optional (default <code>null</code>)</td>\n<td>Allow the user to unlock projects.</td>\n</tr>\n<tr>\n<td><code>allowShare</code></td>\n<td>boolean</td>\n<td>optional (default <code>null</code>)</td>\n<td>Allow the user to share projects.</td>\n</tr>\n<tr>\n<td><code>enabledMenuItems</code></td>\n<td>string[]</td>\n<td>optional</td>\n<td>If present, only these toolbar/menu items are shown. Keys are listed in <code>toolbar-options.json</code>.</td>\n</tr>\n<tr>\n<td><code>disabledMenuItems</code></td>\n<td>string[]</td>\n<td>optional</td>\n<td>Toolbar/menu item keys to hide.</td>\n</tr>\n<tr>\n<td><code>roles</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Extra roles to add to the session.</td>\n</tr>\n<tr>\n<td><code>callbackUrl</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Callback URL stored with the request.</td>\n</tr>\n<tr>\n<td><code>baseUrl</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Base URL stored with the request.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The body uses the same model as the project endpoints, so every other property of that model (configuration GUIDs/JSON, <code>video</code>, <code>subtitlesUrl</code>, ...) is accepted and stored with the request, but they are only meaningful for project sessions (see the <strong>Project</strong> folder). Property names are case-insensitive.</p>\n<h2 id=\"response\">Response</h2>\n<p><code>200 OK</code> with a JSON string: the single-use session URL (<code>/V2/external?token=...</code>). Redirect the user to it immediately (or open it in a new tab); do not cache it. The token is valid for 24 hours, and one session per email is supported at any given time.</p>\n<p>An unreadable or empty body is not handled specially and results in a <code>500</code> server error. The endpoint requires the <code>API</code> role.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","app"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"af923417-3c44-4f68-9d6e-3253863837c9","name":"Open Translate Pro","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"requestId\": \"c76c1f28-6fe4-4df8-bb2f-52f1ccf271cc\",\r\n    \"email\": \"Betty30@example.net\",\r\n    \"ip\": \"::1\",\r\n    \"app\": \"TranslatePro\",\r\n    \"editConfiguration\": true,\r\n    \"allowDownload\": false,\r\n    \"allowUpload\": true,\r\n    \"allowMediaOpen\": true\r\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/app"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"98"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=O9XGi77a2XTxj8mmwSL2aJWlvaNWdddwVc5TIYEPYs\""}],"_postman_id":"9e31db7a-c549-4b4d-a49a-95cd16b1ef51"},{"name":"Open Review","id":"8ebe640c-85ed-4145-a57d-8b642eed938c","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"requestId\": \"38336379-f3dc-4956-a6ee-23d7de30c55a\",\n    \"email\": \"Hunter_Greenholt43@example.net\",\n    \"ip\": \"::1\",\n    \"app\": \"EditPro\",\n    \"editConfiguration\": true,\n    \"allowDownload\": false,\n    \"allowUpload\": true,\n    \"allowMediaOpen\": true,\n    \"allowUnlock\": false,\n    \"allowShare\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/app","description":"<p>Opens a <strong>Review</strong> (Edit Pro) session for a user: you send the user's email, the API returns a single-use URL that logs them in with only this tool available.</p>\n<h2 id=\"request-body-json\">Request body (JSON)</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user the session is opened for. If no user holds this address one is created automatically (marked as created by <code>API</code>, assigned to the default client).</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>yes</td>\n<td>App key to open (see <code>GET external/apps</code>), e.g. <code>CreatePro</code>, <code>TranslatePro</code>, <code>EditPro</code>, <code>Converter</code>, <code>AudioDescription</code>, <code>Admin</code>. The session is limited to this single app.</td>\n</tr>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>recommended</td>\n<td>Your own identifier for this request (a GUID is fine); stored with the request.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>optional</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>editConfiguration</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to edit the configuration (import/export settings, etc.).</td>\n</tr>\n<tr>\n<td><code>allowDownload</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to download/export files.</td>\n</tr>\n<tr>\n<td><code>allowUpload</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to upload files.</td>\n</tr>\n<tr>\n<td><code>allowMediaOpen</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to open media (video/audio) files.</td>\n</tr>\n<tr>\n<td><code>allowUnlock</code></td>\n<td>boolean</td>\n<td>optional (default <code>null</code>)</td>\n<td>Allow the user to unlock projects.</td>\n</tr>\n<tr>\n<td><code>allowShare</code></td>\n<td>boolean</td>\n<td>optional (default <code>null</code>)</td>\n<td>Allow the user to share projects.</td>\n</tr>\n<tr>\n<td><code>enabledMenuItems</code></td>\n<td>string[]</td>\n<td>optional</td>\n<td>If present, only these toolbar/menu items are shown. Keys are listed in <code>toolbar-options.json</code>.</td>\n</tr>\n<tr>\n<td><code>disabledMenuItems</code></td>\n<td>string[]</td>\n<td>optional</td>\n<td>Toolbar/menu item keys to hide.</td>\n</tr>\n<tr>\n<td><code>roles</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Extra roles to add to the session.</td>\n</tr>\n<tr>\n<td><code>callbackUrl</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Callback URL stored with the request.</td>\n</tr>\n<tr>\n<td><code>baseUrl</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Base URL stored with the request.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The body uses the same model as the project endpoints, so every other property of that model (configuration GUIDs/JSON, <code>video</code>, <code>subtitlesUrl</code>, ...) is accepted and stored with the request, but they are only meaningful for project sessions (see the <strong>Project</strong> folder). Property names are case-insensitive.</p>\n<h2 id=\"response\">Response</h2>\n<p><code>200 OK</code> with a JSON string: the single-use session URL (<code>/V2/external?token=...</code>). Redirect the user to it immediately (or open it in a new tab); do not cache it. The token is valid for 24 hours, and one session per email is supported at any given time.</p>\n<p>An unreadable or empty body is not handled specially and results in a <code>500</code> server error. The endpoint requires the <code>API</code> role.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","app"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"b76d5206-ec58-445b-b023-5a688f646b92","name":"Open Review","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"requestId\": \"87dca72b-c278-44e5-b97e-aae81b3118c6\",\r\n    \"email\": \"Liza.Bruen63@example.org\",\r\n    \"ip\": \"::1\",\r\n    \"app\": \"EditPro\",\r\n    \"editConfiguration\": true,\r\n    \"allowDownload\": false,\r\n    \"allowUpload\": true,\r\n    \"allowMediaOpen\": true\r\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/app"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"97"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=4aMFoyGKgWkcLsGtaPxcPGeybQ8TxVZlSNSqrEPQw\""}],"_postman_id":"8ebe640c-85ed-4145-a57d-8b642eed938c"},{"name":"Open Convert","id":"9798fd8e-f78c-462d-bfa1-690bdf417d0b","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"requestId\": \"b6fa3468-90cb-464f-bed7-83be1af8b560\",\n    \"email\": \"Carlie.Schimmel58@example.com\",\n    \"ip\": \"::1\",\n    \"app\": \"Convert\",\n    \"editConfiguration\": true,\n    \"allowDownload\": false,\n    \"allowUpload\": true,\n    \"allowMediaOpen\": true,\n    \"allowUnlock\": false,\n    \"allowShare\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/app","description":"<p>Opens a <strong>Convert</strong> session for a user: you send the user's email, the API returns a single-use URL that logs them in with only this tool available.</p>\n<h2 id=\"request-body-json\">Request body (JSON)</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user the session is opened for. If no user holds this address one is created automatically (marked as created by <code>API</code>, assigned to the default client).</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>yes</td>\n<td>App key to open (see <code>GET external/apps</code>), e.g. <code>CreatePro</code>, <code>TranslatePro</code>, <code>EditPro</code>, <code>Converter</code>, <code>AudioDescription</code>, <code>Admin</code>. The session is limited to this single app.</td>\n</tr>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>recommended</td>\n<td>Your own identifier for this request (a GUID is fine); stored with the request.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>optional</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>editConfiguration</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to edit the configuration (import/export settings, etc.).</td>\n</tr>\n<tr>\n<td><code>allowDownload</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to download/export files.</td>\n</tr>\n<tr>\n<td><code>allowUpload</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to upload files.</td>\n</tr>\n<tr>\n<td><code>allowMediaOpen</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to open media (video/audio) files.</td>\n</tr>\n<tr>\n<td><code>allowUnlock</code></td>\n<td>boolean</td>\n<td>optional (default <code>null</code>)</td>\n<td>Allow the user to unlock projects.</td>\n</tr>\n<tr>\n<td><code>allowShare</code></td>\n<td>boolean</td>\n<td>optional (default <code>null</code>)</td>\n<td>Allow the user to share projects.</td>\n</tr>\n<tr>\n<td><code>enabledMenuItems</code></td>\n<td>string[]</td>\n<td>optional</td>\n<td>If present, only these toolbar/menu items are shown. Keys are listed in <code>toolbar-options.json</code>.</td>\n</tr>\n<tr>\n<td><code>disabledMenuItems</code></td>\n<td>string[]</td>\n<td>optional</td>\n<td>Toolbar/menu item keys to hide.</td>\n</tr>\n<tr>\n<td><code>roles</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Extra roles to add to the session.</td>\n</tr>\n<tr>\n<td><code>callbackUrl</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Callback URL stored with the request.</td>\n</tr>\n<tr>\n<td><code>baseUrl</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Base URL stored with the request.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The body uses the same model as the project endpoints, so every other property of that model (configuration GUIDs/JSON, <code>video</code>, <code>subtitlesUrl</code>, ...) is accepted and stored with the request, but they are only meaningful for project sessions (see the <strong>Project</strong> folder). Property names are case-insensitive.</p>\n<h2 id=\"response\">Response</h2>\n<p><code>200 OK</code> with a JSON string: the single-use session URL (<code>/V2/external?token=...</code>). Redirect the user to it immediately (or open it in a new tab); do not cache it. The token is valid for 24 hours, and one session per email is supported at any given time.</p>\n<p>An unreadable or empty body is not handled specially and results in a <code>500</code> server error. The endpoint requires the <code>API</code> role.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","app"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"e28e4b1e-283e-4f2f-a0b4-8281dd6b7696","name":"Open Convert","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"requestId\": \"5a00c220-f6c5-4d51-a817-8b812d1c607e\",\r\n    \"email\": \"Eudora.Smith@example.com\",\r\n    \"ip\": \"::1\",\r\n    \"app\": \"Convert\",\r\n    \"editConfiguration\": true,\r\n    \"allowDownload\": false,\r\n    \"allowUpload\": true,\r\n    \"allowMediaOpen\": true\r\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/app"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"99"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=jFT3Wcv9OoTHP7nUKVU9cHW9MR93OcYlgjWx55b8cAY\""}],"_postman_id":"9798fd8e-f78c-462d-bfa1-690bdf417d0b"},{"name":"Open Audio Description","id":"47a7f72c-6717-4652-9e2a-d15af78a76ce","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"requestId\": \"e71854c6-b527-4272-8ab8-8d3ab474f369\",\n    \"email\": \"Ernie_Ullrich@example.org\",\n    \"ip\": \"::1\",\n    \"app\": \"AudioDescription\",\n    \"editConfiguration\": true,\n    \"allowDownload\": false,\n    \"allowUpload\": true,\n    \"allowMediaOpen\": true,\n    \"allowUnlock\": false,\n    \"allowShare\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/app","description":"<p>Opens an <strong>Audio Description</strong> session for a user: you send the user's email, the API returns a single-use URL that logs them in with only this tool available.</p>\n<h2 id=\"request-body-json\">Request body (JSON)</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user the session is opened for. If no user holds this address one is created automatically (marked as created by <code>API</code>, assigned to the default client).</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>yes</td>\n<td>App key to open (see <code>GET external/apps</code>), e.g. <code>CreatePro</code>, <code>TranslatePro</code>, <code>EditPro</code>, <code>Converter</code>, <code>AudioDescription</code>, <code>Admin</code>. The session is limited to this single app.</td>\n</tr>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>recommended</td>\n<td>Your own identifier for this request (a GUID is fine); stored with the request.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>optional</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>editConfiguration</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to edit the configuration (import/export settings, etc.).</td>\n</tr>\n<tr>\n<td><code>allowDownload</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to download/export files.</td>\n</tr>\n<tr>\n<td><code>allowUpload</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to upload files.</td>\n</tr>\n<tr>\n<td><code>allowMediaOpen</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to open media (video/audio) files.</td>\n</tr>\n<tr>\n<td><code>allowUnlock</code></td>\n<td>boolean</td>\n<td>optional (default <code>null</code>)</td>\n<td>Allow the user to unlock projects.</td>\n</tr>\n<tr>\n<td><code>allowShare</code></td>\n<td>boolean</td>\n<td>optional (default <code>null</code>)</td>\n<td>Allow the user to share projects.</td>\n</tr>\n<tr>\n<td><code>enabledMenuItems</code></td>\n<td>string[]</td>\n<td>optional</td>\n<td>If present, only these toolbar/menu items are shown. Keys are listed in <code>toolbar-options.json</code>.</td>\n</tr>\n<tr>\n<td><code>disabledMenuItems</code></td>\n<td>string[]</td>\n<td>optional</td>\n<td>Toolbar/menu item keys to hide.</td>\n</tr>\n<tr>\n<td><code>roles</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Extra roles to add to the session.</td>\n</tr>\n<tr>\n<td><code>callbackUrl</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Callback URL stored with the request.</td>\n</tr>\n<tr>\n<td><code>baseUrl</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Base URL stored with the request.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The body uses the same model as the project endpoints, so every other property of that model (configuration GUIDs/JSON, <code>video</code>, <code>subtitlesUrl</code>, ...) is accepted and stored with the request, but they are only meaningful for project sessions (see the <strong>Project</strong> folder). Property names are case-insensitive.</p>\n<h2 id=\"response\">Response</h2>\n<p><code>200 OK</code> with a JSON string: the single-use session URL (<code>/V2/external?token=...</code>). Redirect the user to it immediately (or open it in a new tab); do not cache it. The token is valid for 24 hours, and one session per email is supported at any given time.</p>\n<p>An unreadable or empty body is not handled specially and results in a <code>500</code> server error. The endpoint requires the <code>API</code> role.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","app"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"efeaf821-b250-4a69-9a02-8070ab56c9f5","name":"Open Audio Description","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"requestId\": \"e8507321-ee54-4700-9452-1e2630f814f8\",\r\n    \"email\": \"Pat_Fadel@example.org\",\r\n    \"ip\": \"::1\",\r\n    \"app\": \"AudioDescription\",\r\n    \"editConfiguration\": true,\r\n    \"allowDownload\": false,\r\n    \"allowUpload\": true,\r\n    \"allowMediaOpen\": true\r\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/app"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"98"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=HFllxivVsn8xXEhILMWRgkOJ2wnvDLOee2I1jDFUfQ\""}],"_postman_id":"47a7f72c-6717-4652-9e2a-d15af78a76ce"},{"name":"Dashboard","id":"240489f8-b7cc-45a2-b950-ffcf27de7d7e","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"requestId\": \"c9b4a85c-1f79-4ee9-80d2-c1cf437490d5\",\n    \"email\": \"Monserrat68@example.org\",\n    \"ip\": \"::1\",\n    \"app\": \"Admin\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/app","description":"<p>Opens the <strong>Dashboard</strong> (<code>Admin</code> app, user and account management) for a user. Only the required fields are needed; the permission flags are not relevant for the dashboard. Returns a single-use URL.</p>\n<h2 id=\"request-body-json\">Request body (JSON)</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user the session is opened for. If no user holds this address one is created automatically (marked as created by <code>API</code>, assigned to the default client).</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>yes</td>\n<td>App key to open (see <code>GET external/apps</code>), e.g. <code>CreatePro</code>, <code>TranslatePro</code>, <code>EditPro</code>, <code>Converter</code>, <code>AudioDescription</code>, <code>Admin</code>. The session is limited to this single app.</td>\n</tr>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>recommended</td>\n<td>Your own identifier for this request (a GUID is fine); stored with the request.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>optional</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>editConfiguration</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to edit the configuration (import/export settings, etc.).</td>\n</tr>\n<tr>\n<td><code>allowDownload</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to download/export files.</td>\n</tr>\n<tr>\n<td><code>allowUpload</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to upload files.</td>\n</tr>\n<tr>\n<td><code>allowMediaOpen</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Allow the user to open media (video/audio) files.</td>\n</tr>\n<tr>\n<td><code>allowUnlock</code></td>\n<td>boolean</td>\n<td>optional (default <code>null</code>)</td>\n<td>Allow the user to unlock projects.</td>\n</tr>\n<tr>\n<td><code>allowShare</code></td>\n<td>boolean</td>\n<td>optional (default <code>null</code>)</td>\n<td>Allow the user to share projects.</td>\n</tr>\n<tr>\n<td><code>enabledMenuItems</code></td>\n<td>string[]</td>\n<td>optional</td>\n<td>If present, only these toolbar/menu items are shown. Keys are listed in <code>toolbar-options.json</code>.</td>\n</tr>\n<tr>\n<td><code>disabledMenuItems</code></td>\n<td>string[]</td>\n<td>optional</td>\n<td>Toolbar/menu item keys to hide.</td>\n</tr>\n<tr>\n<td><code>roles</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Extra roles to add to the session.</td>\n</tr>\n<tr>\n<td><code>callbackUrl</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Callback URL stored with the request.</td>\n</tr>\n<tr>\n<td><code>baseUrl</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Base URL stored with the request.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The body uses the same model as the project endpoints, so every other property of that model (configuration GUIDs/JSON, <code>video</code>, <code>subtitlesUrl</code>, ...) is accepted and stored with the request, but they are only meaningful for project sessions (see the <strong>Project</strong> folder). Property names are case-insensitive.</p>\n<h2 id=\"response\">Response</h2>\n<p><code>200 OK</code> with a JSON string: the single-use session URL (<code>/V2/external?token=...</code>). Redirect the user to it immediately (or open it in a new tab); do not cache it. The token is valid for 24 hours, and one session per email is supported at any given time.</p>\n<p>An unreadable or empty body is not handled specially and results in a <code>500</code> server error. The endpoint requires the <code>API</code> role.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","app"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"2025ab27-92e6-4baf-af8a-221611b4dae1","name":"Dashboard","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"requestId\": \"b65c8751-9d7c-4f18-86a6-03c39f1b509a\",\r\n    \"email\": \"Robin.Wolff37@example.org\",\r\n    \"ip\": \"::1\",\r\n    \"app\": \"Admin\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/app"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"98"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=PjsZ2tpD450dXTrcsjv3Cp4cKTDQ1yEPU74d6jOt7M\""}],"_postman_id":"240489f8-b7cc-45a2-b950-ffcf27de7d7e"},{"name":"Open Player","id":"01b1a75b-957f-4cdd-813e-3a40b192cad9","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"email\": \"Winona.Romaguera@example.net\",\n    \"video\": \"https://example.com/media/video.mp4\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/player","description":"<p>Creates a <strong>read-only, single-use video player</strong> link for a video. Downloads are always disabled for the session.</p>\n<p>If no user holds the supplied email one is created automatically (same as <code>POST external/app</code>).</p>\n<h2 id=\"request-body-json\">Request body (JSON)</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user the player session is created for.</td>\n</tr>\n<tr>\n<td><code>video</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The video to play. Either a plain URL, or a JSON string such as <code>{\"src\":\"https://.../video.mp4\",\"dat\":\"https://.../video.dat\",\"type\":\"video/mp4\"}</code> where <code>src</code> is the video URL, <code>dat</code> an optional metadata file URL and <code>type</code> an optional MIME type override.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"response\">Response</h2>\n<p><code>200 OK</code> with <code>{ \"url\": \"https://.../V2/player?token=...\" }</code>: redirect the user to this URL. The link is single-use and expires 5 minutes after it was created.</p>\n<h2 id=\"errors\">Errors</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>When</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400</code></td>\n<td>Empty body (<code>Request body is empty.</code>), missing <code>email</code> (<code>Email is required.</code>) or missing <code>video</code> (<code>Video is required.</code>).</td>\n</tr>\n</tbody>\n</table>\n</div><p>Requires the <code>API</code> role.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","player"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"87f52e02-9754-4422-a73e-53ccf1c5971a","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"email\": \"Barbara0@example.com\",\n    \"video\": \"https://example.com/media/video.mp4\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/player"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"url\": \"https://sandbox.ooonatools-test.net/V2/player?token=PjsZ2tpD450dXTrcsjv3Cp4cKTDQ1yEPU74d6jOt7M\"\n}"},{"id":"0b1e4222-12f6-4071-ab65-e65f38f7376d","name":"400 Video is required","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"email\": \"Orin.Gerhold@example.org\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/player"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Message\": \"Video is required.\"\n}"}],"_postman_id":"01b1a75b-957f-4cdd-813e-3a40b192cad9"}],"id":"16bbfad4-add5-43e9-9a5c-cedbc6c35d56","description":"<p>This folder contains requests to open a session for a specific tool (aka app), plus helpers for discovering the apps and their icons.</p>\n<p><code>POST external/app</code> returns a single-use URL you should redirect your user to. The user will be logged in as the user matching the email address you supplied (created automatically if it does not exist). This starts a session with only a single tool available, but the user can see every project they worked on in this tool (everything that was opened with their email address) and can create new projects.</p>\n<p><code>POST external/player</code> works the same way for a read-only video player.</p>\n<p>The <code>enabledMenuItems</code> / <code>disabledMenuItems</code> request fields accept the keys listed in <code>toolbar-options.json</code>. All requests in this folder require the <code>API</code> role.</p>\n","_postman_id":"16bbfad4-add5-43e9-9a5c-cedbc6c35d56","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"🔒 Security","item":[{"name":"SecurityLog","id":"187a0ca4-b797-4373-8a1c-b159867ab8c9","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"[\"e4c577ab-e54d-42c3-8009-fbff73347c92\", \"49a85d82-623a-4f2a-b417-ee0cf0d81164\"]","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/generateSecurityLog","description":"<p>Returns the security events recorded for the given projects: exports, project deletions and suspicious-activity events.</p>\n<h2 id=\"input\">Input</h2>\n<p>The body is a JSON <strong>array of project GUIDs</strong> (strings). Events are matched against the project id (for exports and deletions) or the project id stored on suspicious-activity events; user ids are not matched.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\"&lt;project-guid&gt;\", \"&lt;project-guid&gt;\"]\n</code></pre>\n<h2 id=\"output\">Output</h2>\n<p><code>200 OK</code> with an array of events (an empty array if nothing matches):</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Type</code></td>\n<td><code>Export</code>, <code>DeleteProject</code> or <code>SuspiciousActivity</code>.</td>\n</tr>\n<tr>\n<td><code>UserId</code></td>\n<td>Id of the user who performed the action.</td>\n</tr>\n<tr>\n<td><code>Username</code></td>\n<td>The user's email, or the id when the user no longer exists.</td>\n</tr>\n<tr>\n<td><code>IP</code></td>\n<td>IP address the action came from.</td>\n</tr>\n<tr>\n<td><code>Time</code></td>\n<td>When the event happened.</td>\n</tr>\n<tr>\n<td><code>ProjectId</code></td>\n<td>The project GUID.</td>\n</tr>\n<tr>\n<td><code>ProjectName</code></td>\n<td>Project name (empty if the project no longer exists, e.g. after deletion).</td>\n</tr>\n<tr>\n<td><code>Format</code></td>\n<td>Export format for <code>Export</code> events, otherwise empty.</td>\n</tr>\n</tbody>\n</table>\n</div><p>A malformed body returns an error status. Requires the <code>API</code> role.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","generateSecurityLog"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"6ea86fac-bd61-4ec6-9133-f0252f2598a2","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"[\"0b2f6c1e-8d57-4f0e-a4c7-5d3a9b1e2f40\"]","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/generateSecurityLog"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"[\n    {\n        \"Type\": \"Export\",\n        \"UserId\": \"7c1f3b0e-5f0a-4e4c-9a0e-1f2d3c4b5a69\",\n        \"Username\": \"user@example.com\",\n        \"IP\": \"203.0.113.10\",\n        \"Time\": \"2026-06-12T09:41:07\",\n        \"ProjectId\": \"0b2f6c1e-8d57-4f0e-a4c7-5d3a9b1e2f40\",\n        \"ProjectName\": \"Episode 101\",\n        \"Format\": \"SRT\"\n    },\n    {\n        \"Type\": \"DeleteProject\",\n        \"UserId\": \"7c1f3b0e-5f0a-4e4c-9a0e-1f2d3c4b5a69\",\n        \"Username\": \"user@example.com\",\n        \"IP\": \"203.0.113.10\",\n        \"Time\": \"2026-06-12T10:02:55\",\n        \"ProjectId\": \"0b2f6c1e-8d57-4f0e-a4c7-5d3a9b1e2f40\",\n        \"ProjectName\": \"\",\n        \"Format\": \"\"\n    }\n]"}],"_postman_id":"187a0ca4-b797-4373-8a1c-b159867ab8c9"}],"id":"13000788-3899-4550-97ad-3db889910888","description":"<p>This folder contains security-related endpoints, such as the security log of exports and project deletions. All requests require the <code>API</code> role.</p>\n","_postman_id":"13000788-3899-4550-97ad-3db889910888","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"📊 Account & usage","item":[{"name":"Instance","item":[{"name":"Dashboard statistics","id":"1b8b682b-1e9b-4ae4-b928-e8dba56315a9","request":{"method":"GET","header":[],"url":"{{base_url}}/external/statistics","description":"<p>Returns the full dashboard statistics of the instance: online users, last/this month and per-day activity, past months and general system health.</p>\n<h2 id=\"input\">Input</h2>\n<p>None. Requires the <code>API</code> role.</p>\n<h2 id=\"output\">Output</h2>\n<p><code>200 OK</code> with an object:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Total</code></td>\n<td><code>{ Value, Countries[] }</code>: overall total and its country breakdown.</td>\n</tr>\n<tr>\n<td><code>Online</code></td>\n<td>Users online now: <code>Value</code>, <code>Countries[]</code>, <code>Users[]</code> (<code>Id</code>, <code>Username</code>, <code>Email</code>, <code>Country</code>) and project counts.</td>\n</tr>\n<tr>\n<td><code>ThisMonth</code>, <code>LastMonth</code></td>\n<td>Aggregates for the month: <code>Projects</code>, <code>ProjectsCreated</code>, <code>ProjectsCompleted</code>, <code>UniqueUsersSinceBeginningOfMonth</code>, <code>ExportsCount</code>, <code>ImportsCount</code>, <code>ConvertsCount</code>, <code>ConvertApiUsage</code>, <code>QcApiUsage</code>, <code>AutomationCost</code>, plus <code>Value</code>/<code>Countries</code>.</td>\n</tr>\n<tr>\n<td><code>LastDays</code></td>\n<td>Dictionary keyed by date with the same aggregate shape per day.</td>\n</tr>\n<tr>\n<td><code>PastMonths</code></td>\n<td>Dictionary keyed by year-month with the same aggregate shape.</td>\n</tr>\n<tr>\n<td><code>General</code></td>\n<td>System health (same as <code>GET external/health</code>).</td>\n</tr>\n<tr>\n<td><code>Incomplete</code></td>\n<td><code>true</code> when the statistics could not be fully computed.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Accounts with an <code>@ooona.net</code> email are excluded from the statistics. The response can be large and slow on busy instances; for a lightweight summary use <code>GET external/stats</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","statistics"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"6acea683-3d2e-4ea3-bed4-057710a31aca","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/statistics"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Total\": {\n        \"Value\": 124,\n        \"Countries\": [\n            {\n                \"Name\": \"United Kingdom\",\n                \"UsersCount\": 40,\n                \"Users\": []\n            }\n        ]\n    },\n    \"Online\": {\n        \"Value\": 3,\n        \"Countries\": [],\n        \"Users\": [\n            {\n                \"Id\": \"7c1f3b0e\",\n                \"Username\": \"user@example.com\",\n                \"Email\": \"user@example.com\",\n                \"Country\": \"Israel\"\n            }\n        ],\n        \"Projects\": 2,\n        \"ProjectsCreated\": 0,\n        \"ProjectsCompleted\": 0,\n        \"UniqueUsersSinceBeginningOfMonth\": 0,\n        \"ExportsCount\": 0,\n        \"ImportsCount\": 0,\n        \"ConvertsCount\": 0,\n        \"ConvertApiUsage\": 0,\n        \"QcApiUsage\": 0,\n        \"AutomationCost\": 0,\n        \"Flat\": false\n    },\n    \"ThisMonth\": {\n        \"Value\": 58,\n        \"Projects\": 310,\n        \"ProjectsCreated\": 120,\n        \"ProjectsCompleted\": 85,\n        \"UniqueUsersSinceBeginningOfMonth\": 58,\n        \"ExportsCount\": 410,\n        \"ImportsCount\": 260,\n        \"ConvertsCount\": 75,\n        \"ConvertApiUsage\": 1200,\n        \"QcApiUsage\": 300,\n        \"AutomationCost\": 12.5,\n        \"Flat\": false\n    },\n    \"LastMonth\": {\n        \"Value\": 61,\n        \"Projects\": 295,\n        \"ProjectsCreated\": 140,\n        \"ProjectsCompleted\": 130,\n        \"UniqueUsersSinceBeginningOfMonth\": 61,\n        \"ExportsCount\": 390,\n        \"ImportsCount\": 240,\n        \"ConvertsCount\": 64,\n        \"ConvertApiUsage\": 1100,\n        \"QcApiUsage\": 280,\n        \"AutomationCost\": 10.0,\n        \"Flat\": false\n    },\n    \"LastDays\": {},\n    \"PastMonths\": {},\n    \"General\": {\n        \"Name\": \"Sandbox\",\n        \"Healthy\": true\n    },\n    \"Incomplete\": false\n}"}],"_postman_id":"1b8b682b-1e9b-4ae4-b928-e8dba56315a9"},{"name":"Summary stats","id":"dc3982b4-840f-4dea-9b9d-858ebc1b6fab","request":{"method":"GET","header":[],"url":"{{base_url}}/external/stats","description":"<p>Returns a compact snapshot of the instance's current activity and licence usage.</p>\n<h2 id=\"input\">Input</h2>\n<p>None. Requires the <code>API</code> role.</p>\n<h2 id=\"output\">Output</h2>\n<p><code>200 OK</code> with an object:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Day</code>, <code>Month</code></td>\n<td>The day and month the figures refer to.</td>\n</tr>\n<tr>\n<td><code>CurrentlyOnline</code></td>\n<td>Users online now.</td>\n</tr>\n<tr>\n<td><code>CurrentlyOnlineByCountry</code></td>\n<td>Array of <code>{ Country, Count }</code>.</td>\n</tr>\n<tr>\n<td><code>ResourceCountToday</code></td>\n<td>Resource count for today.</td>\n</tr>\n<tr>\n<td><code>CountryToday</code></td>\n<td>Array of <code>{ Country, Count }</code> for today.</td>\n</tr>\n<tr>\n<td><code>TasksCompletedToday</code>, <code>OrdersCreatedToday</code>, <code>FilesCreatedToday</code></td>\n<td>Today's activity counters.</td>\n</tr>\n<tr>\n<td><code>LicenseType</code></td>\n<td>The instance licence type.</td>\n</tr>\n<tr>\n<td><code>WebSiteUsersLicense</code></td>\n<td>Number of user licences.</td>\n</tr>\n<tr>\n<td><code>NumberLicensesUsed</code></td>\n<td>Approved users (licences used).</td>\n</tr>\n<tr>\n<td><code>NumberLicensesUsedThisMonth</code></td>\n<td>Licences used this month.</td>\n</tr>\n<tr>\n<td><code>Version</code></td>\n<td>Toolkit version.</td>\n</tr>\n<tr>\n<td><code>FailedLoginsThisToday</code>, <code>FailedLoginsThisMonth</code></td>\n<td>Failed login counters.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","stats"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"7c1cb815-a44b-463d-a2f3-958e2a34ed9a","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/stats"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Day\": \"2026-06-12T00:00:00\",\n    \"Month\": \"2026-06-01T00:00:00\",\n    \"CurrentlyOnline\": 3,\n    \"CurrentlyOnlineByCountry\": [\n        {\n            \"Country\": \"Israel\",\n            \"Count\": 2\n        },\n        {\n            \"Country\": \"United Kingdom\",\n            \"Count\": 1\n        }\n    ],\n    \"ResourceCountToday\": 14,\n    \"CountryToday\": [\n        {\n            \"Country\": \"Israel\",\n            \"Count\": 9\n        }\n    ],\n    \"TasksCompletedToday\": 5,\n    \"OrdersCreatedToday\": 2,\n    \"FilesCreatedToday\": 11,\n    \"LicenseType\": \"Enterprise\",\n    \"WebSiteUsersLicense\": 100,\n    \"NumberLicensesUsed\": 58,\n    \"NumberLicensesUsedThisMonth\": 41,\n    \"Version\": \"2026.6.12.1\",\n    \"FailedLoginsThisToday\": 0,\n    \"FailedLoginsThisMonth\": 4\n}"}],"_postman_id":"dc3982b4-840f-4dea-9b9d-858ebc1b6fab"},{"name":"Health","id":"f7a7a6fd-3512-4d2c-a6b9-47c1e423cb6d","request":{"method":"GET","header":[],"url":"{{base_url}}/external/health","description":"<p>Returns the instance's system health and resources (disks, memory, database size, version).</p>\n<h2 id=\"input\">Input</h2>\n<p>None. Requires the <code>API</code> role. For an unauthenticated liveness probe use <code>GET external/healthy</code> (returns the text <code>OK</code>, or a 500 when a disk is full or the database schema does not match; the optional query <code>?db=false</code> (default <code>true</code>) skips the database check, so only the disk-space check runs and the model compatibility check against the database is not performed) and <code>GET version</code> (returns the version); both allow anonymous calls.</p>\n<h2 id=\"output\">Output</h2>\n<p><code>200 OK</code> with an object:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Name</code></td>\n<td>Instance name.</td>\n</tr>\n<tr>\n<td><code>IsOoona</code>, <code>IsTest</code></td>\n<td>Whether this is an OOONA-hosted / test instance.</td>\n</tr>\n<tr>\n<td><code>Healthy</code></td>\n<td><code>true</code> when the data was collected successfully.</td>\n</tr>\n<tr>\n<td><code>Url</code></td>\n<td>The instance base URL.</td>\n</tr>\n<tr>\n<td><code>Drives</code></td>\n<td>Array of <code>{ Name, TotalSize, TotalFreeSpace }</code> (bytes).</td>\n</tr>\n<tr>\n<td><code>Ram</code></td>\n<td><code>{ Total, Free }</code> in MB.</td>\n</tr>\n<tr>\n<td><code>OS</code></td>\n<td><code>{ Name, Platform, Version }</code>; currently returned empty.</td>\n</tr>\n<tr>\n<td><code>DatabaseSize</code></td>\n<td>Database size as text.</td>\n</tr>\n<tr>\n<td><code>ComputerTime</code>, <code>ComputerUTCTime</code></td>\n<td>Server time (UTC).</td>\n</tr>\n<tr>\n<td><code>Version</code></td>\n<td>Toolkit version.</td>\n</tr>\n</tbody>\n</table>\n</div><p>If collecting the data fails, the call still returns <code>200</code> with an empty object (all fields <code>null</code>/<code>false</code>) and the error is logged server side.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","health"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"d7ff3c9a-bc51-47fe-b999-ddf5a35aeb92","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/health"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Id\": null,\n    \"Name\": \"Sandbox\",\n    \"IsOoona\": true,\n    \"IsTest\": true,\n    \"Healthy\": true,\n    \"Url\": \"https://sandbox.ooonatools-test.net\",\n    \"Drives\": [\n        {\n            \"Name\": \"C:\\\\\",\n            \"TotalSize\": 536870912000,\n            \"TotalFreeSpace\": 214748364800\n        }\n    ],\n    \"Ram\": {\n        \"Total\": 16384,\n        \"Free\": 6200\n    },\n    \"OS\": {\n        \"Name\": \"\",\n        \"Platform\": \"\",\n        \"Version\": \"\"\n    },\n    \"DatabaseSize\": \"2.4 GB\",\n    \"ComputerTime\": \"2026-06-12T09:41:07Z\",\n    \"ComputerUTCTime\": \"2026-06-12T09:41:07Z\",\n    \"Version\": \"2026.6.12.1\",\n    \"ResponseTime\": null,\n    \"Port\": null,\n    \"Error\": null\n}"}],"_postman_id":"f7a7a6fd-3512-4d2c-a6b9-47c1e423cb6d"},{"name":"Month users report","id":"0c25b1f0-7fdd-4bcb-a1ff-ea7c94634e42","request":{"method":"GET","header":[],"url":"{{base_url}}/external/monthUsersReport/:year/:month","description":"<p>Returns a report of the users who logged in during a month, as an Excel workbook.</p>\n<h2 id=\"input\">Input</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Route param</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>year</code></td>\n<td>integer</td>\n<td>Four digit year, e.g. <code>2026</code>.</td>\n</tr>\n<tr>\n<td><code>month</code></td>\n<td>integer</td>\n<td>Month number <code>1</code>-<code>12</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Requires the <code>API</code> role. System users are excluded. A user is included when an activity of theirs starts or ends in the requested month.</p>\n<h2 id=\"output\">Output</h2>\n<p><code>200 OK</code>. The workbook is returned as a <strong>base64 encoded string</strong> inside a JSON response (the raw file bytes are serialized by the JSON formatter): decode it and save it as the Excel file. One row per user with the columns <code>Username</code>, <code>Email</code> and <code>First_Month_Login</code> (the user's first login timestamp in that month).</p>\n<p>A non-numeric <code>year</code> or <code>month</code> is rejected with <code>404</code>/<code>400</code> by routing.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","monthUsersReport",":year",":month"],"host":["{{base_url}}"],"query":[],"variable":[{"id":"ef567acf-33af-4ac7-a964-fbe094c9c96f","description":{"content":"<p>Year, e.g. 2026</p>\n","type":"text/plain"},"type":"any","value":"2026","key":"year"},{"id":"9488c9e4-75eb-49c8-beed-2c124b7891c2","description":{"content":"<p>Month number, 1-12</p>\n","type":"text/plain"},"type":"any","value":"6","key":"month"}]}},"response":[{"id":"8f200085-04d9-4079-a373-d55d72ab3e16","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/monthUsersReport/2026/6","host":["{{base_url}}"],"path":["external","monthUsersReport","2026","6"],"variable":[{"key":"year","value":"2026","description":"Year, e.g. 2026"},{"key":"month","value":"6","description":"Month number, 1-12"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"\"UEsDBBQABgAIAAAAIQ...(base64 of the Excel file)...\""}],"_postman_id":"0c25b1f0-7fdd-4bcb-a1ff-ea7c94634e42"}],"id":"5edbdcbd-e759-401f-b7f7-2546c86b2930","description":"<p>Instance statistics, health and reports. Requires the <code>API</code> role.</p>\n","_postman_id":"5edbdcbd-e759-401f-b7f7-2546c86b2930","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"Usage","item":[{"name":"Usage summary","id":"db92d003-e9ca-472c-9315-1aa0af30a5f1","request":{"method":"GET","header":[],"url":"{{base_url}}/external/usage/summary?from=2026-06-01&to=2026-06-30","description":"<p>Total Convert / QC / Conform API usage counts recorded under this API key (for the <code>API</code> role the principal id is the secret-key id), over a date range.</p>\n<h2 id=\"input-query-string\">Input (query string)</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>from</code></td>\n<td>date</td>\n<td>no</td>\n<td>Start of the range, UTC (<code>yyyy-MM-dd</code> or ISO 8601). Default: first day of the current month.</td>\n</tr>\n<tr>\n<td><code>to</code></td>\n<td>date</td>\n<td>no</td>\n<td>End of the range, UTC, <strong>exclusive</strong>: records with <code>time &gt;= from &amp;&amp; time &lt; to</code> are counted. Default: now.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Roles: <code>API</code> or <code>UserAPI</code>.</p>\n<h2 id=\"output\">Output</h2>\n<p><code>200 OK</code>. JSON property names are camelCase and listed in alphabetical order:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>from</code>, <code>to</code></td>\n<td>The effective range used (<code>to</code> is exclusive).</td>\n</tr>\n<tr>\n<td><code>convert</code></td>\n<td>Number of Convert API calls.</td>\n</tr>\n<tr>\n<td><code>qc</code></td>\n<td>Number of QC API calls.</td>\n</tr>\n<tr>\n<td><code>conform</code></td>\n<td>Number of Conform API calls.</td>\n</tr>\n<tr>\n<td><code>total</code></td>\n<td>Sum of the above.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"errors\">Errors</h2>\n<p><code>400</code> with a message when <code>from</code>/<code>to</code> cannot be parsed (<code>Invalid 'from' date: ...</code>) or when <code>from</code> is later than <code>to</code> (<code>'from' must be earlier than or equal to 'to'.</code>).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","usage","summary"],"host":["{{base_url}}"],"query":[{"description":{"content":"<p>Start of the range (UTC). Optional, defaults to the first day of the current month.</p>\n","type":"text/plain"},"key":"from","value":"2026-06-01"},{"description":{"content":"<p>End of the range (UTC), exclusive. Optional, defaults to now.</p>\n","type":"text/plain"},"key":"to","value":"2026-06-30"}],"variable":[]}},"response":[{"id":"e22c50a7-fedf-408b-a8f3-224d377993a1","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/usage/summary?from=2026-06-01&to=2026-06-30","host":["{{base_url}}"],"path":["external","usage","summary"],"query":[{"key":"from","value":"2026-06-01","description":"Start of the range (UTC). Optional, defaults to the first day of the current month."},{"key":"to","value":"2026-06-30","description":"End of the range (UTC), exclusive. Optional, defaults to now."}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"conform\": 45,\n    \"convert\": 1200,\n    \"from\": \"2026-06-01T00:00:00Z\",\n    \"qc\": 300,\n    \"to\": \"2026-06-30T00:00:00Z\",\n    \"total\": 1545\n}"},{"id":"1dd58781-fb3e-4693-8dfa-d9c21775674c","name":"400 Invalid date","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/usage/summary?from=2026-06-01&to=2026-06-30","host":["{{base_url}}"],"path":["external","usage","summary"],"query":[{"key":"from","value":"2026-06-01","description":"Start of the range (UTC). Optional, defaults to the first day of the current month."},{"key":"to","value":"2026-06-30","description":"End of the range (UTC), exclusive. Optional, defaults to now."}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Message\": \"Invalid 'from' date: 'yesterday'. Use yyyy-MM-dd or an ISO 8601 date/time.\"\n}"}],"_postman_id":"db92d003-e9ca-472c-9315-1aa0af30a5f1"},{"name":"Usage records","id":"29658743-a2ee-4d2e-a15a-4b3d8414c514","request":{"method":"GET","header":[],"url":"{{base_url}}/external/usage?from=2026-06-01&to=2026-06-30&skip=0&take=1000","description":"<p>Individual API usage records recorded under this API key (for the <code>API</code> role the principal id is the secret-key id), over a date range, with paging.</p>\n<h2 id=\"input-query-string\">Input (query string)</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>from</code></td>\n<td>date</td>\n<td>no</td>\n<td>Start of the range, UTC (<code>yyyy-MM-dd</code> or ISO 8601). Default: first day of the current month.</td>\n</tr>\n<tr>\n<td><code>to</code></td>\n<td>date</td>\n<td>no</td>\n<td>End of the range, UTC, <strong>exclusive</strong>: records with <code>time &gt;= from &amp;&amp; time &lt; to</code> are counted. Default: now.</td>\n</tr>\n<tr>\n<td><code>skip</code></td>\n<td>integer</td>\n<td>no</td>\n<td>Records to skip. Default <code>0</code>; values below <code>0</code> become <code>0</code>.</td>\n</tr>\n<tr>\n<td><code>take</code></td>\n<td>integer</td>\n<td>no</td>\n<td>Page size. Default <code>1000</code>; values below <code>1</code> become <code>1</code>, values above <code>10000</code> become <code>10000</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Roles: <code>API</code> or <code>UserAPI</code>.</p>\n<h2 id=\"output\">Output</h2>\n<p><code>200 OK</code>. JSON property names are camelCase and listed in alphabetical order:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>from</code>, <code>to</code></td>\n<td>The effective range used (<code>to</code> is exclusive).</td>\n</tr>\n<tr>\n<td><code>total</code></td>\n<td>Total number of records in the range.</td>\n</tr>\n<tr>\n<td><code>skip</code>, <code>take</code></td>\n<td>The effective paging values after clamping.</td>\n</tr>\n<tr>\n<td><code>truncated</code></td>\n<td><code>true</code> when there are more records after this page (<code>skip + items &lt; total</code>); request the next page with <code>skip += take</code>.</td>\n</tr>\n<tr>\n<td><code>items</code></td>\n<td>Array of records: <code>ip</code>, <code>keyName</code>, <code>operation</code>, <code>sourceType</code>, <code>targetType</code>, <code>time</code> (the API key's custom name or masked preview; <code>null</code> if unknown). <code>time</code> is the stored date-time in UTC without a time zone suffix and up to millisecond precision, e.g. <code>2026-06-12T09:45:31.123</code> (no <code>Z</code>); only <code>from</code> / <code>to</code> in the response carry <code>Z</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"errors\">Errors</h2>\n<p><code>400</code> when <code>from</code>/<code>to</code> cannot be parsed or <code>from</code> is later than <code>to</code> (same messages as <code>GET external/usage/summary</code>).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","usage"],"host":["{{base_url}}"],"query":[{"description":{"content":"<p>Start of the range (UTC). Optional, defaults to the first day of the current month.</p>\n","type":"text/plain"},"key":"from","value":"2026-06-01"},{"description":{"content":"<p>End of the range (UTC), exclusive. Optional, defaults to now.</p>\n","type":"text/plain"},"key":"to","value":"2026-06-30"},{"description":{"content":"<p>Records to skip (default 0)</p>\n","type":"text/plain"},"key":"skip","value":"0"},{"description":{"content":"<p>Page size (default 1000, max 10000)</p>\n","type":"text/plain"},"key":"take","value":"1000"}],"variable":[]}},"response":[{"id":"2d9c0f7e-1991-49cc-bcb0-8467b839730f","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/usage?from=2026-06-01&to=2026-06-30&skip=0&take=1000","host":["{{base_url}}"],"path":["external","usage"],"query":[{"key":"from","value":"2026-06-01","description":"Start of the range (UTC). Optional, defaults to the first day of the current month."},{"key":"to","value":"2026-06-30","description":"End of the range (UTC), exclusive. Optional, defaults to now."},{"key":"skip","value":"0","description":"Records to skip (default 0)"},{"key":"take","value":"1000","description":"Page size (default 1000, max 10000)"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"from\": \"2026-06-01T00:00:00Z\",\n    \"items\": [\n        {\n            \"ip\": \"203.0.113.10\",\n            \"keyName\": \"Production key\",\n            \"operation\": \"Convert\",\n            \"sourceType\": \"SRT\",\n            \"targetType\": \"VTT\",\n            \"time\": \"2026-06-12T09:41:07.457\"\n        },\n        {\n            \"ip\": \"203.0.113.10\",\n            \"keyName\": \"Production key\",\n            \"operation\": \"QC\",\n            \"sourceType\": \"SRT\",\n            \"targetType\": null,\n            \"time\": \"2026-06-12T09:45:31.123\"\n        }\n    ],\n    \"skip\": 0,\n    \"take\": 1000,\n    \"to\": \"2026-06-30T00:00:00Z\",\n    \"total\": 2,\n    \"truncated\": false\n}"}],"_postman_id":"29658743-a2ee-4d2e-a15a-4b3d8414c514"}],"id":"b8fc9ece-89fa-4f97-bba1-b4c5edbbf8d8","description":"<p>Convert / QC / Conform API usage of the caller. Both <code>API</code> and <code>UserAPI</code> keys may call these requests. For the <code>API</code> role the principal id is the secret-key id, so usage is recorded under this API key (not under an account that owns the key); a <code>UserAPI</code> key reads the usage of its user and client.</p>\n<p>Date parameters are optional, interpreted as UTC, and accept <code>yyyy-MM-dd</code> or an ISO 8601 date/time. When omitted the range is the current month so far (first of the month to now). Invalid dates or <code>from</code> later than <code>to</code> return <code>400</code>.</p>\n","_postman_id":"b8fc9ece-89fa-4f97-bba1-b4c5edbbf8d8","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"App settings","item":[{"name":"List app settings","id":"8d5c3085-7b99-474b-afc4-283ac9050539","request":{"method":"GET","header":[],"url":"{{base_url}}/external/appSettings","description":"<p>Lists every application setting.</p>\n<h2 id=\"input\">Input</h2>\n<p>None. Requires the <code>API</code> role.</p>\n<h2 id=\"output\">Output</h2>\n<p><code>200 OK</code> with an array of settings:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Key</code></td>\n<td>The setting key.</td>\n</tr>\n<tr>\n<td><code>Name</code></td>\n<td>Display name.</td>\n</tr>\n<tr>\n<td><code>Value</code></td>\n<td>The value (masked when <code>Sensitive</code>).</td>\n</tr>\n<tr>\n<td><code>Type</code></td>\n<td>The value type.</td>\n</tr>\n<tr>\n<td><code>Sensitive</code></td>\n<td><code>true</code> if the value is masked.</td>\n</tr>\n<tr>\n<td><code>LastModified</code></td>\n<td>UTC time of the last change.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","appSettings"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"a0af2e83-d422-47d4-8f84-e8839e34ab46","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/appSettings"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"[\n    {\n        \"Key\": \"External.Apps.Filter\",\n        \"Name\": \"External.Apps.Filter\",\n        \"Value\": \"CreatePro,TranslatePro,EditPro\",\n        \"Type\": \"string\",\n        \"Sensitive\": false,\n        \"LastModified\": \"2026-06-01T10:15:00Z\"\n    },\n    {\n        \"Key\": \"OpenAI.ApiKey\",\n        \"Name\": \"OpenAI API key\",\n        \"Value\": \"********\",\n        \"Type\": \"string\",\n        \"Sensitive\": true,\n        \"LastModified\": \"2026-05-20T08:00:00Z\"\n    }\n]"}],"_postman_id":"8d5c3085-7b99-474b-afc4-283ac9050539"},{"name":"Get app setting","id":"bacfb00c-7004-4b4a-b8ce-798914243f76","request":{"method":"GET","header":[],"url":"{{base_url}}/external/appSettings/:key","description":"<p>Returns a single application setting by key.</p>\n<h2 id=\"input\">Input</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Route param</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>key</code></td>\n<td>The setting key (exact match), e.g. <code>External.Apps.Filter</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Requires the <code>API</code> role.</p>\n<h2 id=\"output\">Output</h2>\n<p><code>200 OK</code> with the setting:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Key</code></td>\n<td>The setting key.</td>\n</tr>\n<tr>\n<td><code>Name</code></td>\n<td>Display name.</td>\n</tr>\n<tr>\n<td><code>Value</code></td>\n<td>The value (masked when <code>Sensitive</code>).</td>\n</tr>\n<tr>\n<td><code>Type</code></td>\n<td>The value type.</td>\n</tr>\n<tr>\n<td><code>Sensitive</code></td>\n<td><code>true</code> if the value is masked.</td>\n</tr>\n<tr>\n<td><code>LastModified</code></td>\n<td>UTC time of the last change.</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>404 Not Found</code> when no setting has that key.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","appSettings",":key"],"host":["{{base_url}}"],"query":[],"variable":[{"id":"ee480c4b-4aeb-4825-b294-05ee8f3a3f3f","description":{"content":"<p>Setting key</p>\n","type":"text/plain"},"type":"any","value":"External.Apps.Filter","key":"key"}]}},"response":[{"id":"2bfe1a06-cdac-4e64-bfd6-a920f47013a9","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/appSettings/External.Apps.Filter","host":["{{base_url}}"],"path":["external","appSettings","External.Apps.Filter"],"variable":[{"key":"key","value":"External.Apps.Filter","description":"Setting key"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Key\": \"External.Apps.Filter\",\n    \"Name\": \"External.Apps.Filter\",\n    \"Value\": \"CreatePro,TranslatePro,EditPro\",\n    \"Type\": \"string\",\n    \"Sensitive\": false,\n    \"LastModified\": \"2026-06-01T10:15:00Z\"\n}"},{"id":"881beae7-5279-4f02-b3ad-e555421eef35","name":"404 Unknown key","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/appSettings/Unknown.Key","host":["{{base_url}}"],"path":["external","appSettings","Unknown.Key"],"variable":[{"key":"key","value":"External.Apps.Filter","description":"Setting key"}]}},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"text/plain"}],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"bacfb00c-7004-4b4a-b8ce-798914243f76"},{"name":"Update app setting","id":"1a98a69e-e44a-41ab-9dfb-2a61ee2f089a","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"Key\": \"External.Apps.Filter\",\n    \"Name\": \"External.Apps.Filter\",\n    \"Value\": \"CreatePro,TranslatePro,EditPro\",\n    \"Type\": \"string\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/appSettings","description":"<p>Creates or updates (upsert by <code>Key</code>) an application setting. Clears the instance cache so the change takes effect. Changes are written to the security log.</p>\n<h2 id=\"request-body-json\">Request body (JSON)</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Key</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The setting key. If a setting with this key exists its value is updated, otherwise a new setting is created.</td>\n</tr>\n<tr>\n<td><code>Value</code></td>\n<td>string</td>\n<td>yes (in practice)</td>\n<td>The new value.</td>\n</tr>\n<tr>\n<td><code>Name</code></td>\n<td>string</td>\n<td>no</td>\n<td>Display name, used only when <strong>creating</strong>; defaults to <code>Key</code>. Ignored for existing settings.</td>\n</tr>\n<tr>\n<td><code>Type</code></td>\n<td>string</td>\n<td>no</td>\n<td>Value type, used only when <strong>creating</strong>. Ignored for existing settings.</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>Sensitive</code> and <code>LastModified</code> in the body are ignored. If the setting is sensitive and <code>Value</code> is the masked value returned by the GET requests, the update is ignored and the stored value is kept (the response is still <code>200</code>).</p>\n<h2 id=\"output\">Output</h2>\n<p><code>200 OK</code> with the resulting setting (same shape as <code>GET external/appSettings/{key}</code>, value masked if sensitive).</p>\n<h2 id=\"errors\">Errors</h2>\n<p><code>400</code> with <code>Key is required.</code> when the body is missing or <code>Key</code> is empty. Requires the <code>API</code> role.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","appSettings"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"37993a37-f423-4229-a382-31290ff026f3","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"Key\": \"External.Apps.Filter\",\n    \"Name\": \"External.Apps.Filter\",\n    \"Value\": \"CreatePro,TranslatePro,EditPro\",\n    \"Type\": \"string\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/appSettings"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Key\": \"External.Apps.Filter\",\n    \"Name\": \"External.Apps.Filter\",\n    \"Value\": \"CreatePro,TranslatePro,EditPro\",\n    \"Type\": \"string\",\n    \"Sensitive\": false,\n    \"LastModified\": \"2026-06-01T10:15:00Z\"\n}"},{"id":"4e726b6c-6506-469b-9ac2-9431097550ea","name":"400 Key is required","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"Value\": \"x\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/appSettings"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Message\": \"Key is required.\"\n}"}],"_postman_id":"1a98a69e-e44a-41ab-9dfb-2a61ee2f089a"}],"id":"accde698-166f-4625-a6d7-466fcdd19eb4","description":"<p>Read and update the instance's application settings (the same settings table the admin \"Toolkit Settings\" page edits). Requires the <code>API</code> role.</p>\n<p>Sensitive values (API keys, secrets, tokens, passwords, credential JSON) are masked in responses and flagged with <code>\"Sensitive\": true</code>. If a masked value is echoed back in an update, the stored secret is kept and the update is ignored. Updating a setting clears the instance cache.</p>\n","_postman_id":"accde698-166f-4625-a6d7-466fcdd19eb4","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"Users","item":[{"name":"Update user email","id":"d80dce9a-705f-4851-a40c-3161c0da0388","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"from\": \"old.address@example.com\",\n    \"to\": \"new.address@example.com\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/user/update-email","description":"<p>Changes the email address of an existing user. The account is found purely by the source address, so double check <code>from</code>: a wrong value renames whichever account holds it. The user name is changed too when it equals the old email. Every outcome is written to the security log.</p>\n<h2 id=\"request-body-json\">Request body (JSON)</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>from</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user's current email.</td>\n</tr>\n<tr>\n<td><code>to</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The new email.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"output\">Output</h2>\n<ul>\n<li><code>200 OK</code> with an empty body when the email was updated.</li>\n<li><code>404 Not Found</code> when no user holds the <code>from</code> address.</li>\n<li><code>400 Bad Request</code> when another user already holds the <code>to</code> address (the message names the date that account was created).</li>\n</ul>\n<p>Requires the <code>API</code> role.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","user","update-email"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"b7171622-4b7e-436b-9d13-f02bbf1d142e","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"from\": \"old.address@example.com\",\n    \"to\": \"new.address@example.com\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/user/update-email"},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"text/plain"}],"cookie":[],"responseTime":null,"body":""},{"id":"93b84ca7-c157-4732-95f6-70ae0958e7de","name":"404 Unknown user","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"from\": \"old.address@example.com\",\n    \"to\": \"new.address@example.com\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/user/update-email"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"text/plain"}],"cookie":[],"responseTime":null,"body":""},{"id":"788954c2-abc8-4e29-b044-4fbb4e18f6e3","name":"400 Email in use","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"from\": \"old.address@example.com\",\n    \"to\": \"new.address@example.com\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/user/update-email"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"\"Email new.address@example.com is already used by a different user create at 6/1/2026 8:00:00 AM\""}],"_postman_id":"d80dce9a-705f-4851-a40c-3161c0da0388"}],"id":"38d5eda0-1d06-4c2c-860f-de735d0feee4","description":"<p>User account maintenance. Requires the <code>API</code> role.</p>\n","_postman_id":"38d5eda0-1d06-4c2c-860f-de735d0feee4","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}}],"id":"8620e8ce-6d43-4233-b691-31ffaf9a937d","description":"<p>Instance information, API usage and application settings for your OOONA Tools instance.</p>\n<ul>\n<li><strong>Instance</strong>: statistics, health and the monthly active-users report.</li>\n<li><strong>Usage</strong>: Convert / QC / Conform API usage recorded under this API key.</li>\n<li><strong>App settings</strong>: read and update the instance's application settings (the same settings as the admin \"Toolkit Settings\" page).</li>\n<li><strong>Users</strong>: user account maintenance.</li>\n</ul>\n<p>Unless noted otherwise, these requests require the <code>API</code> role (the <code>Usage</code> requests also accept <code>UserAPI</code>).</p>\n","_postman_id":"8620e8ce-6d43-4233-b691-31ffaf9a937d","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"🔢Batch export","item":[{"name":"Run batch export","id":"69ef98a7-3d9b-40f5-8c68-824d899807d4","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": \"53e72b3c-370c-4eef-85ec-021838ff4241\",\n  \"requestId\": \"ce327d6d-c8ee-4940-a3fc-f61bf25c9cb9\",\n  \"email\": \"user@example.com\",\n  \"ip\": \"::1\",\n  \"zip\": true,\n  \"bucket\": {\n    \"Name\": \"my-delivery-bucket\",\n    \"Region\": \"eu-west-1\",\n    \"AccessKeyId\": \"\",\n    \"SecretAccessKey\": \"<secret>\",\n    \"SessionToken\": \"<session token>\"\n  },\n  \"bucketPath\": \"deliveries/order-123/result.zip\",\n  \"keepInBucket\": true,\n  \"download\": false,\n  \"items\": [\n    {\n      \"configurationGuid\": \"ef3d38b7-ca46-4f03-a05a-934a82b0d231\",\n      \"configurationJson\": null,\n      \"projects\": [\n        {\n          \"id\": \"6a2d3ea3-bc9b-4f5e-87d2-7d3f58caa90f\",\n          \"name\": \"Episode 4\",\n          \"fileNamingId\": \"9c4aa8ef-bcf2-41fd-aa98-c8e0618f414d\",\n          \"configurationGuid\": \"75bd1ea9-828d-4c7e-9810-99910609fc81\",\n          \"languageConfigurationGuid\": \"ce4bf66d-2636-45ef-8538-d901acfc7a98\",\n          \"videoConfigurationGuid\": \"ba2afebb-508c-4061-80e3-7bca6de544df\",\n          \"title\": \"My Show\",\n          \"deliveryTitle\": \"My Show Delivery\",\n          \"subName\": \"Pilot\",\n          \"titleId\": \"T-0001\",\n          \"metaType\": \"Subtitle\",\n          \"serviceName\": \"Streamer\",\n          \"version\": \"1\",\n          \"season\": \"3\",\n          \"episode\": \"4\",\n          \"contentType\": \"Episode\",\n          \"timecodeFormat\": \"25 fps\",\n          \"duration\": \"002000\",\n          \"startTC\": \"00:00:00:00\",\n          \"orderNumber\": \"ORD-123\",\n          \"broadcastFileNumber\": \"0001\",\n          \"fileNameCodeProject\": \"PRJ\",\n          \"fileNameCodeConsolidated\": \"CON\",\n          \"fileNameCodeCustomer\": \"CUS\",\n          \"fileNameCodeSeries\": \"SER\",\n          \"fileNameCodeOrder\": \"ORD\",\n          \"fileNameCodeLanguage\": \"EN\",\n          \"fileNameCodeProduct\": \"PRD\",\n          \"fileNameCodeTask\": \"TSK\"\n        }\n      ]\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/batchExport","description":"<p><strong>Role:</strong> <code>API</code>.</p>\n<p>Starts a <strong>batch export</strong> session: one or many existing projects exported to files in one go, using a saved batch export configuration. The call stores the request and returns a <strong>URL</strong>; send your user to it. The hosted page loads the listed projects, exports each of them (applying the configuration's export settings and the file naming convention), and, when finished, delivers the result according to the bucket options below. The exports themselves are driven by that page through further endpoints (<code>external/batchExport/project/...</code>, <code>.../export/{id}</code>, <code>.../export/status/{id}</code>, <code>.../finish/{id}</code>), which are used by the page's own session and are not part of the API-role surface.</p>\n<p>Prerequisites: a batch export configuration created with <code>POST /external/configuration/{guid}</code> with <code>configurationType: BatchExport</code> (its <code>{guid}</code> goes in <code>items[].configurationGuid</code>), and optionally a file naming convention (<code>POST /external/fileNaming/{guid}</code>) referenced by <code>projects[].fileNamingId</code>. The user (<code>email</code>) is created as an external user when it does not exist yet. The request is written to the action log.</p>\n<p><strong>Body (JSON)</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>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>items</code></td>\n<td>array</td>\n<td>yes</td>\n<td>Groups of projects exported with the same batch export configuration. See below.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user the session runs as; created if missing.</td>\n</tr>\n<tr>\n<td><code>id</code></td>\n<td>string</td>\n<td>no</td>\n<td>Id for the stored request; generated when omitted.</td>\n</tr>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>no</td>\n<td>Your own correlation id, stored with the request.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>no</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>bucket</code></td>\n<td>object</td>\n<td>no</td>\n<td>S3 bucket (and temporary credentials) to deliver the files to: <code>Name</code>, <code>Region</code> (e.g. <code>eu-west-1</code>), <code>AccessKeyId</code>, <code>SecretAccessKey</code>, <code>SessionToken</code>. Without a bucket the files are returned to the page for download.</td>\n</tr>\n<tr>\n<td><code>bucketPath</code></td>\n<td>string</td>\n<td>no</td>\n<td>Where in the bucket the result goes. A key ending in <code>.zip</code> is the object key of the resulting archive; otherwise the exported files are placed under that folder/path.</td>\n</tr>\n<tr>\n<td><code>keepInBucket</code></td>\n<td>bool</td>\n<td>no</td>\n<td>With a bucket: keep the result in the bucket (default <code>false</code>; for zipped results the loose files are removed after zipping, and the zip is uploaded to <code>bucketPath</code> only when it ends with <code>.zip</code> and this is <code>true</code>).</td>\n</tr>\n<tr>\n<td><code>download</code></td>\n<td>bool</td>\n<td>no</td>\n<td>With a bucket: also return the result zip to the page for download (default <code>false</code>).</td>\n</tr>\n<tr>\n<td><code>zip</code></td>\n<td>bool</td>\n<td>ignored</td>\n<td>Not read. Zipping is derived: with a <code>bucket</code> the result is zipped when <code>bucketPath</code> is empty, ends with <code>.zip</code>, or <code>download</code> is <code>true</code>.</td>\n</tr>\n<tr>\n<td><code>type</code>, <code>hasBucket</code>, <code>fileNamings</code></td>\n<td></td>\n<td>ignored</td>\n<td>Set or derived by the server.</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>items[]</code></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>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>configurationGuid</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Id of the batch export configuration to use. Must match a configuration previously created through <code>POST /external/configuration/{guid}</code>; otherwise the call answers <code>404</code>.</td>\n</tr>\n<tr>\n<td><code>configurationJson</code></td>\n<td>string</td>\n<td>no</td>\n<td>Stored with the item; the configuration is resolved from <code>configurationGuid</code>.</td>\n</tr>\n<tr>\n<td><code>projects</code></td>\n<td>array</td>\n<td>yes</td>\n<td>Projects to export with this configuration.</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>items[].projects[]</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>string</td>\n<td>Id of an existing project to export (required).</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Project name (the page shows the stored project's name).</td>\n</tr>\n<tr>\n<td><code>fileNamingId</code></td>\n<td>string</td>\n<td>Id of the file naming convention applied to this project's exported file.</td>\n</tr>\n<tr>\n<td><code>configurationGuid</code>, <code>languageConfigurationGuid</code>, <code>videoConfigurationGuid</code></td>\n<td>string</td>\n<td>Project settings, language settings and video settings templates applied to this project's export.</td>\n</tr>\n<tr>\n<td><code>title</code>, <code>deliveryTitle</code>, <code>subName</code>, <code>titleId</code>, <code>metaType</code>, <code>serviceName</code>, <code>version</code>, <code>season</code>, <code>episode</code>, <code>contentType</code>, <code>timecodeFormat</code>, <code>duration</code>, <code>startTC</code>, <code>orderNumber</code>, <code>broadcastFileNumber</code></td>\n<td>string</td>\n<td>Metadata values made available to the file naming convention. All optional.</td>\n</tr>\n<tr>\n<td><code>fileNameCodeProject</code>, <code>fileNameCodeConsolidated</code>, <code>fileNameCodeCustomer</code>, <code>fileNameCodeSeries</code>, <code>fileNameCodeOrder</code>, <code>fileNameCodeLanguage</code>, <code>fileNameCodeProduct</code>, <code>fileNameCodeTask</code></td>\n<td>string</td>\n<td>File-name code values made available to the file naming convention. All optional.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output:</strong> <code>200 OK</code> with a JSON string, the URL to send the user to: <code>\"https://&lt;host&gt;/V2/external?token=&lt;token&gt;\"</code>. <code>404 Not Found</code> when an <code>items[].configurationGuid</code> does not match a known configuration. A malformed body or a missing <code>email</code> results in an error response. 401/403 without the <code>API</code> role.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","batchExport"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"493f4caa-26b8-4a3e-903f-60a7ae63c1b8","name":"200 OK","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": \"a5da9d12-cd76-4381-8ed0-9fd26e6fd696\",\n  \"requestId\": \"dd54a62e-8e89-459a-bd51-96e16275d322\",\n  \"email\": \"user@example.com\",\n  \"ip\": \"::1\",\n  \"zip\": true,\n  \"bucket\": {\n    \"Name\": \"my-delivery-bucket\",\n    \"Region\": \"eu-west-1\",\n    \"AccessKeyId\": \"ASIAXXXXXXXXXXXXXXXX\",\n    \"SecretAccessKey\": \"<secret>\",\n    \"SessionToken\": \"<session token>\"\n  },\n  \"bucketPath\": \"deliveries/order-123/result.zip\",\n  \"keepInBucket\": true,\n  \"download\": false,\n  \"items\": [\n    {\n      \"configurationGuid\": \"48b549b2-1081-46c7-87f0-faf3d13aadad\",\n      \"configurationJson\": null,\n      \"projects\": [\n        {\n          \"id\": \"9dbc1aa7-2385-4a16-9d01-0912082bb628\",\n          \"name\": \"Episode 4\",\n          \"fileNamingId\": \"0b09078d-4c61-4eed-b056-28bb9b4837e5\",\n          \"configurationGuid\": \"251c875a-bb39-486c-b79e-43279342b23a\",\n          \"languageConfigurationGuid\": \"9b04e426-8e58-4c62-aede-15acd7ac6361\",\n          \"videoConfigurationGuid\": \"8d62db50-a7fd-4b7f-bdea-a01eb3d1430f\",\n          \"title\": \"My Show\",\n          \"deliveryTitle\": \"My Show Delivery\",\n          \"subName\": \"Pilot\",\n          \"titleId\": \"T-0001\",\n          \"metaType\": \"Subtitle\",\n          \"serviceName\": \"Streamer\",\n          \"version\": \"1\",\n          \"season\": \"3\",\n          \"episode\": \"4\",\n          \"contentType\": \"Episode\",\n          \"timecodeFormat\": \"25 fps\",\n          \"duration\": \"002000\",\n          \"startTC\": \"00:00:00:00\",\n          \"orderNumber\": \"ORD-123\",\n          \"broadcastFileNumber\": \"0001\",\n          \"fileNameCodeProject\": \"PRJ\",\n          \"fileNameCodeConsolidated\": \"CON\",\n          \"fileNameCodeCustomer\": \"CUS\",\n          \"fileNameCodeSeries\": \"SER\",\n          \"fileNameCodeOrder\": \"ORD\",\n          \"fileNameCodeLanguage\": \"EN\",\n          \"fileNameCodeProduct\": \"PRD\",\n          \"fileNameCodeTask\": \"TSK\"\n        }\n      ]\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/batchExport"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=DmabPoXdZhmZVXc0CS7EQh0brCHP7MfgmgkZH8AqWQ\""},{"id":"3e1beba7-3e7a-4adf-988b-7f5dad1940fa","name":"404 Unknown configuration","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": \"b9dfee61-48d0-4ced-a970-47e4253da657\",\n  \"requestId\": \"ef1dc33b-5752-45af-bfb2-cc28edd63dd9\",\n  \"email\": \"user@example.com\",\n  \"ip\": \"::1\",\n  \"zip\": true,\n  \"bucket\": {\n    \"Name\": \"my-delivery-bucket\",\n    \"Region\": \"eu-west-1\",\n    \"AccessKeyId\": \"ASIAXXXXXXXXXXXXXXXX\",\n    \"SecretAccessKey\": \"<secret>\",\n    \"SessionToken\": \"<session token>\"\n  },\n  \"bucketPath\": \"deliveries/order-123/result.zip\",\n  \"keepInBucket\": true,\n  \"download\": false,\n  \"items\": [\n    {\n      \"configurationGuid\": \"5ea7a1e8-aba7-45ad-a29d-0ef5ce17f7ff\",\n      \"configurationJson\": null,\n      \"projects\": [\n        {\n          \"id\": \"8d471b7b-31ef-4f8d-a381-1ce036acb4e7\",\n          \"name\": \"Episode 4\",\n          \"fileNamingId\": \"fc157ead-6156-46a3-b6d2-8746946bc196\",\n          \"configurationGuid\": \"38153979-9472-4a09-9760-e13a60e2cf80\",\n          \"languageConfigurationGuid\": \"de1dd0f5-b287-4cad-af82-794405164bdd\",\n          \"videoConfigurationGuid\": \"15b11e6b-e4c8-4783-89e0-c3fa1349aaf0\",\n          \"title\": \"My Show\",\n          \"deliveryTitle\": \"My Show Delivery\",\n          \"subName\": \"Pilot\",\n          \"titleId\": \"T-0001\",\n          \"metaType\": \"Subtitle\",\n          \"serviceName\": \"Streamer\",\n          \"version\": \"1\",\n          \"season\": \"3\",\n          \"episode\": \"4\",\n          \"contentType\": \"Episode\",\n          \"timecodeFormat\": \"25 fps\",\n          \"duration\": \"002000\",\n          \"startTC\": \"00:00:00:00\",\n          \"orderNumber\": \"ORD-123\",\n          \"broadcastFileNumber\": \"0001\",\n          \"fileNameCodeProject\": \"PRJ\",\n          \"fileNameCodeConsolidated\": \"CON\",\n          \"fileNameCodeCustomer\": \"CUS\",\n          \"fileNameCodeSeries\": \"SER\",\n          \"fileNameCodeOrder\": \"ORD\",\n          \"fileNameCodeLanguage\": \"EN\",\n          \"fileNameCodeProduct\": \"PRD\",\n          \"fileNameCodeTask\": \"TSK\"\n        }\n      ]\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/batchExport"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""}],"_postman_id":"69ef98a7-3d9b-40f5-8c68-824d899807d4"}],"id":"d73c3213-5a05-492b-b577-e9209f59d6bc","description":"<p>Batch export exports multiple projects to files in one go, using an existing <a href=\"#d4d81c9a-9d8d-4c1c-b834-286e1dd7febd\">batch export configuration</a> and optionally a file naming convention.</p>\n<p><code>POST /external/batchExport</code> registers the batch and returns the URL of the hosted export page. From there the page's own session continues the flow (fetching each project, exporting it, polling long-running exports and finishing/zipping/delivering to the bucket); those follow-up routes are not part of the API-role surface and are not documented here.</p>\n","_postman_id":"d73c3213-5a05-492b-b577-e9209f59d6bc","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"🔤 File naming","item":[{"name":"Create - Update file naming","id":"9a0b6c3d-52e0-401a-8b63-8cdaed9bc6c8","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": \"d0253903-ca22-4f14-8af8-61426d1bfc94\",\n  \"requestId\": \"79048728-49b1-4178-b720-2ff1c101980f\",\n  \"ip\": \"::1\",\n  \"callbackUrl\": \"https://example.com/hooks/file-naming-saved\",\n  \"configurationJson\": \"\",\n  \"readOnly\": false,\n  \"values\": {\n    \"contentType\": [\n      \"Feature\",\n      \"Episode\",\n      \"Trailer\"\n    ],\n    \"metaType\": [\n      \"Subtitle\",\n      \"Caption\"\n    ]\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/fileNaming/64996eab-0d9e-47fc-a8ad-151b3b38f447","description":"<p><strong>Role:</strong> <code>API</code>.</p>\n<p>Starts a <strong>file naming convention</strong> editing session for the <code>{guid}</code> in the URL and returns a URL to send your user to. The user composes the naming pattern in a hosted editor (choosing which fields make up the file name, their order, separators and so on) and saves it; the result is stored as a template under <code>{guid}</code>. Use that id as <code>fileNamingId</code> on the projects of a batch export (<code>POST /external/batchExport</code>) to name the exported files.</p>\n<p>Nothing is stored as a template by this call. It stores a one-off request and returns the URL. Calling it again with the same <code>{guid}</code> updates that same request and issues a fresh token (so it also works to re-open the editor). When the user saves, the stored template is created or updated and, if you gave a <code>callbackUrl</code>, it is POSTed a plain-text body containing the naming pattern's sample file name.</p>\n<p><strong>Route</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>guid</code></td>\n<td>Id of the file naming convention. You generate and keep it; it becomes the template id.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Body (JSON)</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>Req.</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>values</code></td>\n<td>object</td>\n<td>no</td>\n<td>Dictionary of <code>field name -&gt; array of allowed values</code>. Each key is offered in the editor as a field with those options (for example the possible <code>contentType</code> or <code>metaType</code> values your delivery spec allows). Send <code>{}</code> for none.</td>\n</tr>\n<tr>\n<td><code>configurationJson</code></td>\n<td>string</td>\n<td>no</td>\n<td>Convention JSON to pre-fill the editor with. Ignored when a template with this <code>{guid}</code> already exists (the stored one is shown).</td>\n</tr>\n<tr>\n<td><code>callbackUrl</code></td>\n<td>string</td>\n<td>no</td>\n<td>URL called (POST, plain-text body) after the user saves the convention. Failures are only logged.</td>\n</tr>\n<tr>\n<td><code>readOnly</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Open the editor read-only (default <code>false</code>).</td>\n</tr>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>no</td>\n<td>Your own correlation id, stored with the request.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>no</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>id</code></td>\n<td>string</td>\n<td>no</td>\n<td>Ignored in favour of the <code>{guid}</code> in the URL.</td>\n</tr>\n<tr>\n<td><code>type</code></td>\n<td></td>\n<td>ignored</td>\n<td>Always set to <code>FileNaming</code> by the server.</td>\n</tr>\n</tbody>\n</table>\n</div><p>On a re-POST for an existing <code>{guid}</code> only the properties present in the body are changed.</p>\n<p><strong>Output:</strong> <code>200 OK</code> with a JSON string, the URL to send the user to: <code>\"https://&lt;host&gt;/V2/external?token=&lt;token&gt;\"</code>. A missing or invalid API token yields 401/403; malformed JSON yields an error response.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","fileNaming","6094b2fd-2b19-4ab8-aa2b-729d03f8c6c0"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"e81d09db-2a1e-4847-9582-f260f9b271f7","name":"200 OK","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": \"332fe3d7-85b0-4d80-a76a-184d38a2fd35\",\n  \"requestId\": \"b4ca2dbb-e271-4cae-be40-898fa43a0ca4\",\n  \"ip\": \"::1\",\n  \"callbackUrl\": \"https://example.com/hooks/file-naming-saved\",\n  \"configurationJson\": \"\",\n  \"readOnly\": false,\n  \"values\": {\n    \"contentType\": [\n      \"Feature\",\n      \"Episode\",\n      \"Trailer\"\n    ],\n    \"metaType\": [\n      \"Subtitle\",\n      \"Caption\"\n    ]\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/fileNaming/e4b6a998-b084-4b79-9c90-8ed46dca2d3b"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://sandbox.ooonatools-test.net/V2/external?token=5rfOPWHIvp8EHboP8dUEeceEGnaruVLfMb6DpZEuw\""}],"_postman_id":"9a0b6c3d-52e0-401a-8b63-8cdaed9bc6c8"}],"id":"c374aefe-cbe9-474d-9385-576563d93470","description":"<p>File naming conventions define how files are named when exported, so that batch exports match the naming rules required for delivery.</p>\n<p><code>POST /external/fileNaming/{guid}</code> creates or opens a convention for editing and returns the URL of the hosted editor. The saved convention is then referenced by <code>fileNamingId</code> in the projects of a batch export (see the Batch export folder).</p>\n","_postman_id":"c374aefe-cbe9-474d-9385-576563d93470","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"🤖 Automate","item":[{"name":"Get engines","event":[{"listen":"test","script":{"type":"text/javascript","exec":["const res = pm.response.json();\nconst engines = res.map(x => x.key).join(',');\npm.collectionVariables.set(\"ai_engines\", engines);"]}}],"id":"4cb782eb-7435-4631-8803-80b9d28bbdca","request":{"method":"GET","header":[],"url":"{{base_url}}/external/engines","description":"<p>Lists the AI engines available to the caller, with the features each one supports. Roles: <code>API</code>, <code>UserAPI</code>. The response is cached for one day on the server and the client; engines disabled on the instance (or by pricing configuration) are left out. The list is sorted by <code>name</code>.</p>\n<p><strong>Input</strong>: none.</p>\n<p><strong>Output (200)</strong>: array of</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>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>key</code></td>\n<td>string</td>\n<td><code>TYPE_Name</code>, e.g. <code>ASR_AWS</code>, <code>MT_AWS</code>, <code>Unified_OoonaAI</code>, <code>QC_OpenAI</code>. Use it as <code>engine</code> in the run requests, in <strong>Engine languages</strong> and in <strong>Estimate price</strong>.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Display name <code>Name (TYPE)</code>.</td>\n</tr>\n<tr>\n<td><code>extraFeatures</code></td>\n<td>array</td>\n<td>Optional capabilities: <code>{ key, name, description }</code>. Mostly used by Unified engines (their keys go into the <code>features</code> of a Unified request); empty for most engines.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The test script stores all keys in the collection variable <code>ai_engines</code> (used by <strong>Engine languages</strong>).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","engines"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"e3916ee2-0815-40da-8ec7-5dbc77186b91","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/engines"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"key\": \"ASR_AWS\",\n    \"name\": \"AWS (ASR)\",\n    \"extraFeatures\": []\n  },\n  {\n    \"key\": \"MT_AWS\",\n    \"name\": \"AWS (MT)\",\n    \"extraFeatures\": []\n  },\n  {\n    \"key\": \"QC_OpenAI\",\n    \"name\": \"OpenAI (QC)\",\n    \"extraFeatures\": []\n  },\n  {\n    \"key\": \"Unified_OoonaAI\",\n    \"name\": \"OoonaAI (Unified)\",\n    \"extraFeatures\": [\n      {\n        \"key\": \"transcription\",\n        \"name\": \"Transcription (ASR)\",\n        \"description\": \"Finalize transcription and consolidate word-level timestamps\"\n      },\n      {\n        \"key\": \"scenes\",\n        \"name\": \"Scene Creation\",\n        \"description\": \"Create narrative scene boundaries and consolidate scenes\"\n      },\n      {\n        \"key\": \"translation\",\n        \"name\": \"Translation\",\n        \"description\": \"Translate subtitles per target language with context-aware processing\"\n      },\n      {\n        \"key\": \"subtitles\",\n        \"name\": \"Subtitles\",\n        \"description\": \"Generate production-ready subtitles per target language\"\n      }\n    ]\n  }\n]"}],"_postman_id":"4cb782eb-7435-4631-8803-80b9d28bbdca"},{"name":"Engine languages","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["let engines = pm.collectionVariables.get('ai_engines');\nlet engine = 'MT_AWS';\nif (engines) {\n    engines = engines.split(',');\n    engine = engines[_.random(0, engines.length - 1)];\n}\npm.globals.set('random_ai_engine', engine);"]}}],"id":"18120bf4-644f-4b77-903a-cedb6cb23940","request":{"method":"GET","header":[],"url":"{{base_url}}/external/languages/{{random_ai_engine}}","description":"<p>Lists the languages an engine supports. Roles: <code>API</code>, <code>UserAPI</code>. Cached for one day.</p>\n<p><strong>Route</strong>: <code>engine</code> (required): the engine <code>key</code> from <strong>Get engines</strong> (<code>TYPE_Name</code>, case-insensitive). In this request the value comes from the variable <code>random_ai_engine</code>, picked at random from the engines saved by <strong>Get engines</strong> (run it first; falls back to <code>MT_AWS</code>).</p>\n<p><strong>Output (200)</strong>: array of <code>{ source, target[] }</code>.</p>\n<ul>\n<li>MT, Unified and QC engines: every source language with the target languages it can be translated into.</li>\n<li>Other engines (ASR, ...): each supported language with itself as the only target.</li>\n</ul>\n<p><strong>Errors</strong>: <code>404 Not Found</code> with an <strong>empty body</strong> (not the generic routing message) when the engine is unknown or disabled on the instance (engines disabled only by their pricing configuration are hidden from <em>Get engines</em> but still answer here).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","languages","{{random_ai_engine}}"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"cfe1ccf8-9e32-48f1-a67f-2e42f03b823b","name":"200 OK - MT engine","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/languages/MT_AWS"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"source\": \"English\",\n    \"target\": [\n      \"Spanish\",\n      \"French\",\n      \"German\",\n      \"Hebrew\"\n    ]\n  },\n  {\n    \"source\": \"Spanish\",\n    \"target\": [\n      \"English\",\n      \"French\"\n    ]\n  }\n]"},{"id":"067c503c-5633-483f-967b-3ee0860df072","name":"200 OK - ASR engine","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/languages/ASR_AWS"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"source\": \"English\",\n    \"target\": [\n      \"English\"\n    ]\n  },\n  {\n    \"source\": \"Spanish\",\n    \"target\": [\n      \"Spanish\"\n    ]\n  }\n]"},{"id":"b019340e-8e21-4d3f-9e9a-6866bed183eb","name":"404 Unknown engine","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/languages/MT_Nope"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":""}],"_postman_id":"18120bf4-644f-4b77-903a-cedb6cb23940"},{"name":"Estimate price","id":"79e2e1e8-e66e-4688-80ee-0d3bcee4c91f","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"engine\": \"ASR_AWS\",\n  \"duration\": 96,\n  \"features\": [\"transcription\"]\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/automate/price","description":"<p>Estimates what a job would cost <strong>before</strong> running it. Nothing is created or charged. Role: <code>API</code>.</p>\n<p>The body is the same shape as the run requests but only these fields are read. How the price is computed depends on the engine's price factor:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Price factor</th>\n<th>Typical engines</th>\n<th>What you must send</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Second</code>, <code>Minute</code>, <code>Hour</code></td>\n<td>ASR, Unified, TTS</td>\n<td><code>duration</code> in <strong>seconds</strong> (&gt; 0).</td>\n</tr>\n<tr>\n<td><code>Character</code>, <code>Word</code></td>\n<td>MT, QC</td>\n<td><code>previousProjectGuid</code> (preferred) or <code>projectGuid</code>: the project whose non-omitted subtitle text is counted.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Body fields</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>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>engine</code></td>\n<td>string</td>\n<td>yes</td>\n<td><code>TYPE_Name</code> from <strong>Get engines</strong> (must contain <code>_</code>).</td>\n</tr>\n<tr>\n<td><code>duration</code></td>\n<td>number</td>\n<td>for duration-priced engines</td>\n<td>Media length in seconds.</td>\n</tr>\n<tr>\n<td><code>previousProjectGuid</code></td>\n<td>string</td>\n<td>for text-priced engines</td>\n<td>Project to count text from (takes precedence).</td>\n</tr>\n<tr>\n<td><code>projectGuid</code></td>\n<td>string</td>\n<td>for text-priced engines</td>\n<td>Used when <code>previousProjectGuid</code> is empty.</td>\n</tr>\n<tr>\n<td><code>features</code></td>\n<td>string[] or object</td>\n<td>no</td>\n<td>Feature names (or <code>{ \"name\": true }</code>); if the engine has feature pricing, matching per-unit adjustments are added and itemised in <code>featureAdjustments</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output (200)</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>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>engine</code></td>\n<td>string</td>\n<td>The engine key you sent.</td>\n</tr>\n<tr>\n<td><code>priceFactor</code></td>\n<td>string</td>\n<td><code>Second</code>, <code>Minute</code>, <code>Hour</code>, <code>Character</code> or <code>Word</code>.</td>\n</tr>\n<tr>\n<td><code>pricePerUnit</code></td>\n<td>number</td>\n<td>Price of one unit.</td>\n</tr>\n<tr>\n<td><code>units</code></td>\n<td>number</td>\n<td>Units counted (seconds/minutes/hours, characters or words).</td>\n</tr>\n<tr>\n<td><code>estimatedAmount</code></td>\n<td>number</td>\n<td>Total estimate, including feature adjustments.</td>\n</tr>\n<tr>\n<td><code>currency</code></td>\n<td>string</td>\n<td>Currency code, e.g. <code>USD</code>.</td>\n</tr>\n<tr>\n<td><code>featureAdjustments</code></td>\n<td>object or null</td>\n<td>Per-feature adjustment amounts (positive = surcharge, negative = discount); null when no features were applied.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Errors (all 400)</strong>: <code>Engine is required.</code>; <code>Engine should be in the format TYPE_NAME (e.g. MT_AWS, ASR_OOONA).</code>; <code>Engine '&lt;key&gt;' not found or is disabled.</code>; <code>Engine '&lt;key&gt;' has no pricing configuration.</code>; <code>Engine '&lt;key&gt;' uses Second-based pricing. Please provide duration (seconds).</code>; <code>... Please provide previousProjectGuid or projectGuid.</code>; <code>Project '&lt;id&gt;' not found.</code>; <code>Project has no text content to estimate pricing.</code></p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","automate","price"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"4121124b-dc87-474e-b200-ebbe1a74ce76","name":"200 OK - duration based","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"engine\": \"ASR_AWS\",\n  \"duration\": 96,\n  \"features\": [\"transcription\"]\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/automate/price"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"engine\": \"ASR_AWS\",\n  \"priceFactor\": \"Second\",\n  \"pricePerUnit\": 0.0004,\n  \"units\": 96,\n  \"estimatedAmount\": 0.0384,\n  \"currency\": \"USD\",\n  \"featureAdjustments\": null\n}"},{"id":"c9b91c16-1cae-4cbe-ac89-7c784dd4e305","name":"200 OK - text based","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"engine\": \"MT_AWS\",\n  \"previousProjectGuid\": \"00000000-2000-0000-2000-200000000002\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/automate/price"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"engine\": \"MT_AWS\",\n  \"priceFactor\": \"Character\",\n  \"pricePerUnit\": 1.5e-05,\n  \"units\": 11380,\n  \"estimatedAmount\": 0.1707,\n  \"currency\": \"USD\",\n  \"featureAdjustments\": null\n}"},{"id":"b5d31bb0-1927-4513-a5bd-d72c271e2678","name":"400 Duration missing","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"engine\": \"ASR_AWS\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/automate/price"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"Engine 'ASR_AWS' uses Second-based pricing. Please provide duration (seconds).\""}],"_postman_id":"79e2e1e8-e66e-4688-80ee-0d3bcee4c91f"},{"name":"Run ASR","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Set lastJobId\", () => {\n    const responseJson = pm.response.json();\n    const id = responseJson.id || responseJson.jobId;\n    if (id) {\n        pm.environment.set('lastJobId', id);\n    }\n});"]}}],"id":"5c57f59d-0c32-46a4-aab1-190ca91c8d5b","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"engine\": \"ASR_AWS\",\n  \"video\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n  \"duration\": 96,\n  \"projectGuid\": \"89395228-d422-4c79-8051-bb22295cfb77\",\n  \"projectName\": \"Amyloidosis Awareness - transcript\",\n  \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\",\n  \"importConfigurationJson\": \"{ \\\"language1\\\": \\\"English\\\" }\",\n  \"exportConfigurationJson\": \"{ \\\"format\\\": \\\"TT\\\" }\",\n  \"startTC\": \"00:00:00:00\",\n  \"force\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/automate/44d2f0ee-a017-467f-9417-20b3fabf21ed","description":"<p>Starts a <strong>speech-to-text (ASR / transcription)</strong> job on a video and creates a project that receives the transcript. Role: <code>API</code>.</p>\n<p>The <code>{id}</code> in the URL becomes the project id (unless <code>projectGuid</code> is in the body) and the external request id; omit it to have a GUID generated. The call returns as soon as the job is accepted: poll <strong>Get job status</strong> or provide a <code>callbackUrl</code>, then fetch the transcript with <strong>Get job result</strong>.</p>\n<p><strong>Behaviour</strong></p>\n<ul>\n<li>The action is <code>Transcribe</code> (inferred from an <code>ASR_</code> engine, or set <code>\"action\": \"Transcribe\"</code>).</li>\n<li>A project is created (or reused when it already exists) and the engine job is started.</li>\n<li>Only one automated job per project id: a second call for the same project returns 400 unless <code>force=true</code>.</li>\n<li><strong>Cache</strong>: unless forced (<code>force</code> query param or body field), a previous successful job with the same engine, video URL (query string ignored) and language is reused: the result is applied to the project at once, a 0-cost job record is created, and the response already has <code>status: Success</code>.</li>\n<li>Pricing is per second of media; send <code>duration</code> so it is known up front. Use <strong>Estimate price</strong> to preview.</li>\n</ul>\n<p><strong>Route</strong>: <code>id</code> (optional, string): project / request id; a GUID is generated when omitted.</p>\n<p><strong>Query parameters</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>force</code></td>\n<td>bool</td>\n<td>false</td>\n<td>Allow a repeat job for the same project id and bypass the cache.</td>\n</tr>\n<tr>\n<td><code>realtime</code></td>\n<td>bool</td>\n<td>false</td>\n<td>Not used by ASR.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Body fields (ASR)</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>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>engine</code></td>\n<td>string</td>\n<td>yes (or <code>action</code>)</td>\n<td><code>ASR_&lt;Name&gt;</code> from <strong>Get engines</strong>.</td>\n</tr>\n<tr>\n<td><code>video</code></td>\n<td>string</td>\n<td>yes</td>\n<td>URL of the media to transcribe.</td>\n</tr>\n<tr>\n<td><code>duration</code></td>\n<td>number</td>\n<td>recommended</td>\n<td>Media length in seconds (billing).</td>\n</tr>\n<tr>\n<td><code>importConfigurationJson</code> / <code>importConfigurationGuid</code></td>\n<td>string</td>\n<td>no</td>\n<td>Its <code>language1</code> is the spoken language. If absent, the language comes from the project configuration (<code>configurationJson/Guid</code>, <code>languageConfigurationJson/Guid</code>).</td>\n</tr>\n<tr>\n<td><code>exportConfigurationJson</code> / <code>exportConfigurationGuid</code></td>\n<td>string</td>\n<td>no</td>\n<td>Output format settings used when files are exported to the callback.</td>\n</tr>\n<tr>\n<td><code>projectGuid</code>, <code>projectName</code>, <code>app</code></td>\n<td>string</td>\n<td>no</td>\n<td>Target project id / name / app (default <code>CreatePro</code>).</td>\n</tr>\n<tr>\n<td><code>startTC</code></td>\n<td>string</td>\n<td>no</td>\n<td>Media start timecode; applied to the transcript when the result is read.</td>\n</tr>\n<tr>\n<td><code>callbackUrl</code></td>\n<td>string</td>\n<td>no</td>\n<td>Called when the job finishes.</td>\n</tr>\n<tr>\n<td><code>force</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Same as the query param.</td>\n</tr>\n<tr>\n<td><code>configurationJson/Guid</code>, <code>languageConfigurationJson/Guid</code>, <code>videoConfigurationJson/Guid</code></td>\n<td>string</td>\n<td>no</td>\n<td>Project settings. Line length, gaps, durations and fps from them are passed to the engine.</td>\n</tr>\n</tbody>\n</table>\n</div><p>See the folder description for the remaining shared fields. <code>engineOptions</code> is not read for ASR by this action.</p>\n<p><strong>Errors</strong>: 400 <code>Automated job for project id ... already exists.</code>, 400 engine/action missing or unrecognised, 500 engine failure.</p>\n<p><strong>Output (200)</strong>: a job object.</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>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>string</td>\n<td>Toolkit job id. Use it with the status, result and cost endpoints.</td>\n</tr>\n<tr>\n<td><code>jobId</code></td>\n<td>string</td>\n<td>The engine's own job id (may be empty until the engine accepted the job). Also accepted by the status/result/cost endpoints.</td>\n</tr>\n<tr>\n<td><code>projectId</code></td>\n<td>string</td>\n<td>The Toolkit project the result is applied to.</td>\n</tr>\n<tr>\n<td><code>type</code></td>\n<td>string</td>\n<td><code>SpeechToText</code>, <code>Translation</code>, <code>Unified</code>, <code>QualityControl</code>, <code>Syncheck</code>, ...</td>\n</tr>\n<tr>\n<td><code>engine</code></td>\n<td>string</td>\n<td>Engine key, e.g. <code>AWS</code>.</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td><code>Waiting</code>, <code>Running</code>, <code>Success</code>, <code>Failure</code>, <code>Retry1</code>, <code>Retry2</code>, <code>Retry3</code>.</td>\n</tr>\n<tr>\n<td><code>progress</code></td>\n<td>number</td>\n<td>0-100.</td>\n</tr>\n<tr>\n<td><code>sourceLanguage</code> / <code>targetLanguage</code></td>\n<td>string</td>\n<td>Languages of the job.</td>\n</tr>\n<tr>\n<td><code>warning</code> / <code>error</code></td>\n<td>string</td>\n<td>Warning text, and failure reason when <code>status</code> is <code>Failure</code>.</td>\n</tr>\n<tr>\n<td><code>dateCreated</code>, <code>lastUpdated</code>, <code>startedAt</code>, <code>completedAt</code></td>\n<td>ISO date</td>\n<td>Job timestamps (<code>startedAt</code> / <code>completedAt</code> can be null).</td>\n</tr>\n<tr>\n<td><code>transactionId</code>, <code>transactionDetails</code>, <code>transactionAmount</code>, <code>transactionCurrency</code>, <code>transactionPriceFactor</code>, <code>transactionPricePerUnit</code>, <code>transactionUnits</code>, <code>transactionStatus</code></td>\n<td></td>\n<td>The wallet charge of the job (see <em>Get job cost</em>). Cached-result jobs are recorded with 0 cost.</td>\n</tr>\n<tr>\n<td><code>statusUrl</code></td>\n<td>string</td>\n<td>URL of <em>Get job status</em> for this job.</td>\n</tr>\n<tr>\n<td><code>resultUrls</code></td>\n<td>object</td>\n<td><code>raw</code>, <code>srt</code>, <code>vtt</code>, <code>ooona</code> links to <em>Get job result</em>.</td>\n</tr>\n<tr>\n<td><code>subJobs</code></td>\n<td>array</td>\n<td>Unified jobs only: one job object per target language; each has its own <code>resultUrls</code> with <code>?target=&lt;index&gt;</code>.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","automate","511e51fd-0315-49f0-a545-2df1e98cd259"],"host":["{{base_url}}"],"query":[{"disabled":true,"description":{"content":"<p>Optional. true allows a second job for a project id that already has one, and skips cached results.</p>\n","type":"text/plain"},"key":"force","value":"false"},{"disabled":true,"description":{"content":"<p>Optional. true makes MT and QC wait (MT up to 10 s, QC up to 60 s) for the result before answering.</p>\n","type":"text/plain"},"key":"realtime","value":"false"}],"variable":[]}},"response":[{"id":"b6fc8016-30ea-482f-aa6f-aa6567b51459","name":"200 OK - job started","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"engine\": \"ASR_AWS\",\n  \"video\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n  \"duration\": 96,\n  \"projectGuid\": \"296980df-48d6-4e05-acb2-b1aef45f3c65\",\n  \"projectName\": \"Amyloidosis Awareness - transcript\",\n  \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\",\n  \"importConfigurationJson\": \"{ \\\"language1\\\": \\\"English\\\" }\",\n  \"exportConfigurationJson\": \"{ \\\"format\\\": \\\"TT\\\" }\",\n  \"startTC\": \"00:00:00:00\",\n  \"force\": false\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/automate/9693f13f-793d-4c7e-8e03-424978d1f521","host":["{{base_url}}"],"path":["external","automate","e40d9684-06a2-4943-abd2-a85e76cad6c4"],"query":[{"key":"force","value":"false","description":"Optional. true allows a second job for a project id that already has one, and skips cached results.","disabled":true},{"key":"realtime","value":"false","description":"Optional. true makes MT and QC wait (MT up to 10 s, QC up to 60 s) for the result before answering.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"email\": \"api@example.com\",\n  \"projectId\": \"6f1c2f8e-2c0e-4a62-9c1f-3b7d5a9e4d10\",\n  \"type\": \"SpeechToText\",\n  \"jobId\": \"53b70a1f8e2d4c6b82a4f1e5a0c7b3d9\",\n  \"mediaId\": null,\n  \"sourceLanguage\": \"English\",\n  \"targetLanguage\": null,\n  \"status\": \"Running\",\n  \"progress\": 0,\n  \"warning\": null,\n  \"error\": null,\n  \"dateCreated\": \"2026-10-15T09:00:00Z\",\n  \"lastUpdated\": \"2026-10-15T09:00:12Z\",\n  \"startedAt\": \"2026-10-15T09:00:02Z\",\n  \"completedAt\": null,\n  \"engine\": \"AWS\",\n  \"transactionId\": \"b2f7d3a1-5c4e-4f60-9a8b-1e2d3c4b5a69\",\n  \"transactionDetails\": \"\",\n  \"transactionAmount\": 0.0,\n  \"transactionCurrency\": \"USD\",\n  \"transactionPriceFactor\": \"Second\",\n  \"transactionPricePerUnit\": 0.0,\n  \"transactionUnits\": 96.0,\n  \"transactionStatus\": \"Pending\",\n  \"statusUrl\": \"https://toolkit.example.com/external/automate/status/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"resultUrls\": {\n    \"raw\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n    \"srt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/srt\",\n    \"vtt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/vtt\",\n    \"ooona\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/ooona\"\n  },\n  \"subJobs\": null\n}"},{"id":"67b8dbe4-314c-4b7b-b291-88b75fe4e8af","name":"200 OK - cached result","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"engine\": \"ASR_AWS\",\n  \"video\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n  \"duration\": 96,\n  \"projectGuid\": \"aac67772-7f8c-4c4c-8549-79584173b9f4\",\n  \"projectName\": \"Amyloidosis Awareness - transcript\",\n  \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\",\n  \"importConfigurationJson\": \"{ \\\"language1\\\": \\\"English\\\" }\",\n  \"exportConfigurationJson\": \"{ \\\"format\\\": \\\"TT\\\" }\",\n  \"startTC\": \"00:00:00:00\",\n  \"force\": false\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/automate/12d74380-4d68-4d89-a44d-63505d770b9f","host":["{{base_url}}"],"path":["external","automate","778b9b7b-af80-413d-8200-3ec592c67894"],"query":[{"key":"force","value":"false","description":"Optional. true allows a second job for a project id that already has one, and skips cached results.","disabled":true},{"key":"realtime","value":"false","description":"Optional. true makes MT and QC wait (MT up to 10 s, QC up to 60 s) for the result before answering.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"email\": \"api@example.com\",\n  \"projectId\": \"6f1c2f8e-2c0e-4a62-9c1f-3b7d5a9e4d10\",\n  \"type\": \"SpeechToText\",\n  \"jobId\": \"53b70a1f8e2d4c6b82a4f1e5a0c7b3d9\",\n  \"mediaId\": null,\n  \"sourceLanguage\": \"English\",\n  \"targetLanguage\": null,\n  \"status\": \"Success\",\n  \"progress\": 100,\n  \"warning\": null,\n  \"error\": null,\n  \"dateCreated\": \"2026-10-15T09:00:00Z\",\n  \"lastUpdated\": \"2026-10-15T09:00:12Z\",\n  \"startedAt\": \"2026-10-15T09:00:02Z\",\n  \"completedAt\": \"2026-10-15T09:02:40Z\",\n  \"engine\": \"AWS\",\n  \"transactionId\": \"b2f7d3a1-5c4e-4f60-9a8b-1e2d3c4b5a69\",\n  \"transactionDetails\": \"Cached result\",\n  \"transactionAmount\": 0.0,\n  \"transactionCurrency\": \"USD\",\n  \"transactionPriceFactor\": \"Second\",\n  \"transactionPricePerUnit\": 0.0,\n  \"transactionUnits\": 96.0,\n  \"transactionStatus\": \"Success\",\n  \"statusUrl\": \"https://toolkit.example.com/external/automate/status/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"resultUrls\": {\n    \"raw\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n    \"srt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/srt\",\n    \"vtt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/vtt\",\n    \"ooona\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/ooona\"\n  },\n  \"subJobs\": null\n}"},{"id":"3d40bfb9-73d0-4bab-9f0b-f23460e63c86","name":"400 Job already exists","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"engine\": \"ASR_AWS\",\n  \"video\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n  \"duration\": 96,\n  \"projectGuid\": \"f45244da-fbaf-49f3-bd95-210e4c6faf2f\",\n  \"projectName\": \"Amyloidosis Awareness - transcript\",\n  \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\",\n  \"importConfigurationJson\": \"{ \\\"language1\\\": \\\"English\\\" }\",\n  \"exportConfigurationJson\": \"{ \\\"format\\\": \\\"TT\\\" }\",\n  \"startTC\": \"00:00:00:00\",\n  \"force\": false\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/automate/2204d618-4328-4a36-a9b5-e93c969b471a","host":["{{base_url}}"],"path":["external","automate","3335e3d0-0483-4fd6-86f7-df0206e7655f"],"query":[{"key":"force","value":"false","description":"Optional. true allows a second job for a project id that already has one, and skips cached results.","disabled":true},{"key":"realtime","value":"false","description":"Optional. true makes MT and QC wait (MT up to 10 s, QC up to 60 s) for the result before answering.","disabled":true}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"Message\": \"Automated job for project id 6f1c2f8e-2c0e-4a62-9c1f-3b7d5a9e4d10 already exists.\",\n  \"ExceptionMessage\": \"Automated job for project id 6f1c2f8e-2c0e-4a62-9c1f-3b7d5a9e4d10 already exists.\",\n  \"ExceptionType\": \"ArgumentException\",\n  \"ActionName\": \"Automate\",\n  \"ControllerName\": \"ExternalAutomate\",\n  \"StackTrace\": \"ExternalAutomateController.cs:144\"\n}"},{"id":"da1687b1-5e1c-4b7f-89c6-a03f4d43853d","name":"400 Missing engine","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"video\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\"\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/automate/e0177fc7-0f89-4952-b35e-398d85d0e87c","host":["{{base_url}}"],"path":["external","automate","ae60a340-7160-4fbc-81a9-1a8e622f503c"],"query":[{"key":"force","value":"false","description":"Optional. true allows a second job for a project id that already has one, and skips cached results.","disabled":true},{"key":"realtime","value":"false","description":"Optional. true makes MT and QC wait (MT up to 10 s, QC up to 60 s) for the result before answering.","disabled":true}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"Message\": \"You must specify either engine or action\",\n  \"ExceptionMessage\": \"You must specify either engine or action\",\n  \"ExceptionType\": \"ArgumentException\",\n  \"ActionName\": \"Automate\",\n  \"ControllerName\": \"ExternalAutomate\",\n  \"StackTrace\": \"ExternalAutomateController.cs:104\"\n}"}],"_postman_id":"5c57f59d-0c32-46a4-aab1-190ca91c8d5b"},{"name":"Run MT","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Set lastJobId\", () => {\n    const responseJson = pm.response.json();\n    const id = responseJson.id || responseJson.jobId;\n    if (id) {\n        pm.environment.set('lastJobId', id);\n    }\n});"]}}],"id":"6e4d77f0-2773-4df7-bf71-cb3b3155c530","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"action\": \"Translate\",\n  \"engine\": \"MT_AWS\",\n  \"projectGuid\": \"9c0e789e-930b-471f-b42d-8b43ba20484c\",\n  \"projectName\": \"Meridian - Spanish\",\n  \"subtitlesUrl\": \"https://ooona-public.s3.amazonaws.com/video/MERIDIAN/Meridian.en.Transcribe.json\",\n  \"subtitlesFileName\": \"Meridian.en.Transcribe.json\",\n  \"importConfigurationJson\": \"{ \\\"language1\\\": \\\"English\\\", \\\"format\\\": \\\"OoonaProject\\\" }\",\n  \"exportConfigurationJson\": \"{ \\\"language1\\\": \\\"Spanish\\\", \\\"format\\\": \\\"TT\\\" }\",\n  \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\",\n  \"force\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/automate/d21eac9f-d34f-4bfe-97be-33db13e1c4f0","description":"<p>Starts a <strong>machine translation</strong> job and creates a project that receives the translated text. Role: <code>API</code>.</p>\n<p>Without <code>realtime</code> the call returns right after the job is accepted: poll <strong>Get job status</strong>, or wait for <code>callbackUrl</code>, then use <strong>Get job result</strong> (<code>srt</code>, <code>vtt</code>, <code>ooona</code>, <code>json</code>). To get the translated file in the same call use <strong>Run MT realtime</strong>.</p>\n<p><strong>Route</strong>: <code>id</code> (optional, string): project / request id; a GUID is generated when omitted.</p>\n<p><strong>Source text</strong>: give either <code>previousProjectGuid</code> (an existing project, e.g. a finished ASR project, whose subtitles are copied) <strong>or</strong> <code>subtitlesUrl</code> (a file that is downloaded and imported; <code>subtitlesFileName</code> is optional; the format comes from <code>importConfigurationJson.format</code>, or from the file extension when that is missing or a generic project format like <code>OoonaProject</code>). Omitted paragraphs are not translated. With no text at all the call returns 400 <code>Original text is not provided. Nothing to translate</code>.</p>\n<p><strong>Languages</strong>: source = <code>importConfigurationJson.language1</code>, target = <code>exportConfigurationJson.language1</code> (language names as returned by <strong>Engine languages</strong>).</p>\n<p><strong>Body fields (MT)</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>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>engine</code></td>\n<td>string</td>\n<td>yes (or <code>action</code>)</td>\n<td><code>MT_&lt;Name&gt;</code> from <strong>Get engines</strong>.</td>\n</tr>\n<tr>\n<td><code>action</code></td>\n<td>string</td>\n<td>no</td>\n<td><code>Translate</code> (inferred from <code>MT_</code>).</td>\n</tr>\n<tr>\n<td><code>subtitlesUrl</code> / <code>subtitlesFileName</code></td>\n<td>string</td>\n<td>one of</td>\n<td>File to translate.</td>\n</tr>\n<tr>\n<td><code>previousProjectGuid</code></td>\n<td>string</td>\n<td>one of</td>\n<td>Existing project to translate; also keys the cache.</td>\n</tr>\n<tr>\n<td><code>importConfigurationJson</code> / <code>importConfigurationGuid</code></td>\n<td>string</td>\n<td>yes</td>\n<td><code>language1</code> = source language, <code>format</code> = format of <code>subtitlesUrl</code>.</td>\n</tr>\n<tr>\n<td><code>exportConfigurationJson</code> / <code>exportConfigurationGuid</code></td>\n<td>string</td>\n<td>yes</td>\n<td><code>language1</code> = target language; <code>format</code> / <code>extension</code> = file format returned in realtime mode and exported to the callback.</td>\n</tr>\n<tr>\n<td><code>projectGuid</code>, <code>projectName</code></td>\n<td>string</td>\n<td>no</td>\n<td>Project that receives the translation (a copy of the source project, with source and target columns).</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>no</td>\n<td>Defaults to <code>TranslatePro</code>.</td>\n</tr>\n<tr>\n<td><code>callbackUrl</code></td>\n<td>string</td>\n<td>no</td>\n<td>Called when the job finishes.</td>\n</tr>\n<tr>\n<td><code>force</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Same as the query param.</td>\n</tr>\n<tr>\n<td><code>configurationJson/Guid</code>, <code>languageConfigurationJson/Guid</code>, <code>videoConfigurationJson/Guid</code></td>\n<td>string</td>\n<td>no</td>\n<td>Project settings (line length, fps, ... are passed to the engine).</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Cache</strong>: unless forced, a previous successful job with the same engine, <code>previousProjectGuid</code>, source and target language is reused (0-cost job record, immediate <code>Success</code>).</p>\n<p><strong>Query parameters</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>force</code></td>\n<td>bool</td>\n<td>false</td>\n<td>Allow a repeat job for the same project id and bypass the cache.</td>\n</tr>\n<tr>\n<td><code>realtime</code></td>\n<td>bool</td>\n<td>false</td>\n<td>Wait for the result (see below).</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Errors</strong>: 400 <code>Original text is not provided. Nothing to translate</code>, 400 job already exists, 400 unknown engine, 500 engine failure (in <code>realtime</code> mode: the job error text).</p>\n<p><strong>Output (200)</strong>: a job object.</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>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>string</td>\n<td>Toolkit job id. Use it with the status, result and cost endpoints.</td>\n</tr>\n<tr>\n<td><code>jobId</code></td>\n<td>string</td>\n<td>The engine's own job id (may be empty until the engine accepted the job). Also accepted by the status/result/cost endpoints.</td>\n</tr>\n<tr>\n<td><code>projectId</code></td>\n<td>string</td>\n<td>The Toolkit project the result is applied to.</td>\n</tr>\n<tr>\n<td><code>type</code></td>\n<td>string</td>\n<td><code>SpeechToText</code>, <code>Translation</code>, <code>Unified</code>, <code>QualityControl</code>, <code>Syncheck</code>, ...</td>\n</tr>\n<tr>\n<td><code>engine</code></td>\n<td>string</td>\n<td>Engine key, e.g. <code>AWS</code>.</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td><code>Waiting</code>, <code>Running</code>, <code>Success</code>, <code>Failure</code>, <code>Retry1</code>, <code>Retry2</code>, <code>Retry3</code>.</td>\n</tr>\n<tr>\n<td><code>progress</code></td>\n<td>number</td>\n<td>0-100.</td>\n</tr>\n<tr>\n<td><code>sourceLanguage</code> / <code>targetLanguage</code></td>\n<td>string</td>\n<td>Languages of the job.</td>\n</tr>\n<tr>\n<td><code>warning</code> / <code>error</code></td>\n<td>string</td>\n<td>Warning text, and failure reason when <code>status</code> is <code>Failure</code>.</td>\n</tr>\n<tr>\n<td><code>dateCreated</code>, <code>lastUpdated</code>, <code>startedAt</code>, <code>completedAt</code></td>\n<td>ISO date</td>\n<td>Job timestamps (<code>startedAt</code> / <code>completedAt</code> can be null).</td>\n</tr>\n<tr>\n<td><code>transactionId</code>, <code>transactionDetails</code>, <code>transactionAmount</code>, <code>transactionCurrency</code>, <code>transactionPriceFactor</code>, <code>transactionPricePerUnit</code>, <code>transactionUnits</code>, <code>transactionStatus</code></td>\n<td></td>\n<td>The wallet charge of the job (see <em>Get job cost</em>). Cached-result jobs are recorded with 0 cost.</td>\n</tr>\n<tr>\n<td><code>statusUrl</code></td>\n<td>string</td>\n<td>URL of <em>Get job status</em> for this job.</td>\n</tr>\n<tr>\n<td><code>resultUrls</code></td>\n<td>object</td>\n<td><code>raw</code>, <code>srt</code>, <code>vtt</code>, <code>ooona</code> links to <em>Get job result</em>.</td>\n</tr>\n<tr>\n<td><code>subJobs</code></td>\n<td>array</td>\n<td>Unified jobs only: one job object per target language; each has its own <code>resultUrls</code> with <code>?target=&lt;index&gt;</code>.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","automate","a4da13d6-b729-420e-add6-6bd0a3da6bd7"],"host":["{{base_url}}"],"query":[{"disabled":true,"description":{"content":"<p>Optional. true allows a second job for a project id that already has one, and skips cached results.</p>\n","type":"text/plain"},"key":"force","value":"false"},{"disabled":true,"description":{"content":"<p>Optional. true makes MT and QC wait (MT up to 10 s, QC up to 60 s) for the result before answering.</p>\n","type":"text/plain"},"key":"realtime","value":"false"}],"variable":[]}},"response":[{"id":"5a9f7354-a8b9-4a81-b654-0e3e9f7456d5","name":"200 OK - job started","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"action\": \"Translate\",\n  \"engine\": \"MT_AWS\",\n  \"projectGuid\": \"eb109a37-5ae9-4647-b87d-1186a06ce34c\",\n  \"projectName\": \"Meridian - Spanish\",\n  \"subtitlesUrl\": \"https://ooona-public.s3.amazonaws.com/video/MERIDIAN/Meridian.en.Transcribe.json\",\n  \"subtitlesFileName\": \"Meridian.en.Transcribe.json\",\n  \"importConfigurationJson\": \"{ \\\"language1\\\": \\\"English\\\", \\\"format\\\": \\\"OoonaProject\\\" }\",\n  \"exportConfigurationJson\": \"{ \\\"language1\\\": \\\"Spanish\\\", \\\"format\\\": \\\"TT\\\" }\",\n  \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\",\n  \"force\": false\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/automate/530f1c62-b30a-41b3-b66e-6620ffef799d","host":["{{base_url}}"],"path":["external","automate","c5893bdf-c76d-4306-91f3-102721d290fb"],"query":[{"key":"force","value":"false","description":"Optional. true allows a second job for a project id that already has one, and skips cached results.","disabled":true},{"key":"realtime","value":"false","description":"Optional. true makes MT and QC wait (MT up to 10 s, QC up to 60 s) for the result before answering.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"email\": \"api@example.com\",\n  \"projectId\": \"6f1c2f8e-2c0e-4a62-9c1f-3b7d5a9e4d10\",\n  \"type\": \"Translation\",\n  \"jobId\": \"53b70a1f8e2d4c6b82a4f1e5a0c7b3d9\",\n  \"mediaId\": null,\n  \"sourceLanguage\": \"English\",\n  \"targetLanguage\": \"Spanish\",\n  \"status\": \"Running\",\n  \"progress\": 0,\n  \"warning\": null,\n  \"error\": null,\n  \"dateCreated\": \"2026-10-15T09:00:00Z\",\n  \"lastUpdated\": \"2026-10-15T09:00:12Z\",\n  \"startedAt\": \"2026-10-15T09:00:02Z\",\n  \"completedAt\": null,\n  \"engine\": \"AWS\",\n  \"transactionId\": \"b2f7d3a1-5c4e-4f60-9a8b-1e2d3c4b5a69\",\n  \"transactionDetails\": \"AWS Translation job 0.00001500$x11380 characters\",\n  \"transactionAmount\": 0.17,\n  \"transactionCurrency\": \"USD\",\n  \"transactionPriceFactor\": \"Character\",\n  \"transactionPricePerUnit\": 1.5e-05,\n  \"transactionUnits\": 11380.0,\n  \"transactionStatus\": \"Pending\",\n  \"statusUrl\": \"https://toolkit.example.com/external/automate/status/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"resultUrls\": {\n    \"raw\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n    \"srt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/srt\",\n    \"vtt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/vtt\",\n    \"ooona\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/ooona\"\n  },\n  \"subJobs\": null\n}"},{"id":"0849670d-48c5-46f2-8d11-ad4af3f8e389","name":"200 OK - cached result","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"action\": \"Translate\",\n  \"engine\": \"MT_AWS\",\n  \"projectGuid\": \"13f8561c-b784-4134-a8a7-a15329b3c821\",\n  \"projectName\": \"Meridian - Spanish\",\n  \"subtitlesUrl\": \"https://ooona-public.s3.amazonaws.com/video/MERIDIAN/Meridian.en.Transcribe.json\",\n  \"subtitlesFileName\": \"Meridian.en.Transcribe.json\",\n  \"importConfigurationJson\": \"{ \\\"language1\\\": \\\"English\\\", \\\"format\\\": \\\"OoonaProject\\\" }\",\n  \"exportConfigurationJson\": \"{ \\\"language1\\\": \\\"Spanish\\\", \\\"format\\\": \\\"TT\\\" }\",\n  \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\",\n  \"force\": false\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/automate/8bcd794d-73a9-42f0-8748-c2e7894d9169","host":["{{base_url}}"],"path":["external","automate","10619754-b189-4f26-9a36-34b78da95b43"],"query":[{"key":"force","value":"false","description":"Optional. true allows a second job for a project id that already has one, and skips cached results.","disabled":true},{"key":"realtime","value":"false","description":"Optional. true makes MT and QC wait (MT up to 10 s, QC up to 60 s) for the result before answering.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"email\": \"api@example.com\",\n  \"projectId\": \"6f1c2f8e-2c0e-4a62-9c1f-3b7d5a9e4d10\",\n  \"type\": \"Translation\",\n  \"jobId\": \"53b70a1f8e2d4c6b82a4f1e5a0c7b3d9\",\n  \"mediaId\": null,\n  \"sourceLanguage\": \"English\",\n  \"targetLanguage\": \"Spanish\",\n  \"status\": \"Success\",\n  \"progress\": 100,\n  \"warning\": null,\n  \"error\": null,\n  \"dateCreated\": \"2026-10-15T09:00:00Z\",\n  \"lastUpdated\": \"2026-10-15T09:00:12Z\",\n  \"startedAt\": \"2026-10-15T09:00:02Z\",\n  \"completedAt\": \"2026-10-15T09:02:40Z\",\n  \"engine\": \"AWS\",\n  \"transactionId\": \"b2f7d3a1-5c4e-4f60-9a8b-1e2d3c4b5a69\",\n  \"transactionDetails\": \"Cached result\",\n  \"transactionAmount\": 0.0,\n  \"transactionCurrency\": \"USD\",\n  \"transactionPriceFactor\": \"Character\",\n  \"transactionPricePerUnit\": 1.5e-05,\n  \"transactionUnits\": 11380.0,\n  \"transactionStatus\": \"Success\",\n  \"statusUrl\": \"https://toolkit.example.com/external/automate/status/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"resultUrls\": {\n    \"raw\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n    \"srt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/srt\",\n    \"vtt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/vtt\",\n    \"ooona\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/ooona\"\n  },\n  \"subJobs\": null\n}"},{"id":"2d0565ed-2ecf-425e-b793-721951cc8416","name":"400 Nothing to translate","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"action\": \"Translate\",\n  \"engine\": \"MT_AWS\",\n  \"projectGuid\": \"ce50e6a4-b2e4-43f5-91a4-c9ced3b739ca\",\n  \"projectName\": \"Meridian - Spanish\",\n  \"subtitlesUrl\": \"https://ooona-public.s3.amazonaws.com/video/MERIDIAN/Meridian.en.Transcribe.json\",\n  \"subtitlesFileName\": \"Meridian.en.Transcribe.json\",\n  \"importConfigurationJson\": \"{ \\\"language1\\\": \\\"English\\\", \\\"format\\\": \\\"OoonaProject\\\" }\",\n  \"exportConfigurationJson\": \"{ \\\"language1\\\": \\\"Spanish\\\", \\\"format\\\": \\\"TT\\\" }\",\n  \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\",\n  \"force\": false\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/automate/363b4e77-b124-4afe-b86a-9a38567dee14","host":["{{base_url}}"],"path":["external","automate","11d76a09-9d85-4e4e-9e23-77d7b9151c63"],"query":[{"key":"force","value":"false","description":"Optional. true allows a second job for a project id that already has one, and skips cached results.","disabled":true},{"key":"realtime","value":"false","description":"Optional. true makes MT and QC wait (MT up to 10 s, QC up to 60 s) for the result before answering.","disabled":true}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"Original text is not provided. Nothing to translate\""}],"_postman_id":"6e4d77f0-2773-4df7-bf71-cb3b3155c530"},{"name":"Run MT realtime","id":"ecef6916-4386-402f-87b5-a60d5e110b57","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"action\": \"Translate\",\n  \"engine\": \"MT_AWS\",\n  \"projectGuid\": \"0eb440b1-37c6-44b4-a540-3f9881ae2a84\",\n  \"projectName\": \"Meridian - Spanish\",\n  \"subtitlesUrl\": \"https://ooona-public.s3.amazonaws.com/video/MERIDIAN/Meridian.en.Transcribe.json\",\n  \"subtitlesFileName\": \"Meridian.en.Transcribe.json\",\n  \"importConfigurationJson\": \"{ \\\"language1\\\": \\\"English\\\", \\\"format\\\": \\\"OoonaProject\\\" }\",\n  \"exportConfigurationJson\": \"{ \\\"language1\\\": \\\"Spanish\\\", \\\"format\\\": \\\"TT\\\" }\",\n  \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\",\n  \"force\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/automate/b99cc0c1-7d6b-4062-a5d1-7de265f3b5ef?realtime=true","description":"<p>Same as <strong>Run MT</strong>, but with <code>realtime=true</code>: the call waits up to <strong>10 seconds</strong> for the translation and, if it finished, answers with the <strong>translated file</strong> (attachment, format taken from <code>exportConfigurationJson.format</code> / <code>extension</code>) instead of a job object. Role: <code>API</code>.</p>\n<ul>\n<li>Finished in time: <code>200</code> with the file body and <code>Content-Disposition: attachment; filename=...</code>.</li>\n<li>Not finished in 10 s: <code>200</code> with <code>{ jobId, status, projectId, statusUrl, transactionAmount, transactionCurrency, transactionDetails }</code>; continue with <strong>Get job status</strong> / <strong>Get job result</strong>.</li>\n<li>Failed: 500 with the job's error text.</li>\n<li>Cached result (not forced) with an export format set: the file is returned straight away.</li>\n</ul>\n<p>If the export configuration has no format/extension, the cached path returns the job object instead of a file.</p>\n<p><strong>Route</strong>: <code>id</code> (optional, string): project / request id; a GUID is generated when omitted.</p>\n<p><strong>Source text</strong>: give either <code>previousProjectGuid</code> (an existing project, e.g. a finished ASR project, whose subtitles are copied) <strong>or</strong> <code>subtitlesUrl</code> (a file that is downloaded and imported; <code>subtitlesFileName</code> is optional; the format comes from <code>importConfigurationJson.format</code>, or from the file extension when that is missing or a generic project format like <code>OoonaProject</code>). Omitted paragraphs are not translated. With no text at all the call returns 400 <code>Original text is not provided. Nothing to translate</code>.</p>\n<p><strong>Languages</strong>: source = <code>importConfigurationJson.language1</code>, target = <code>exportConfigurationJson.language1</code> (language names as returned by <strong>Engine languages</strong>).</p>\n<p><strong>Body fields (MT)</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>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>engine</code></td>\n<td>string</td>\n<td>yes (or <code>action</code>)</td>\n<td><code>MT_&lt;Name&gt;</code> from <strong>Get engines</strong>.</td>\n</tr>\n<tr>\n<td><code>action</code></td>\n<td>string</td>\n<td>no</td>\n<td><code>Translate</code> (inferred from <code>MT_</code>).</td>\n</tr>\n<tr>\n<td><code>subtitlesUrl</code> / <code>subtitlesFileName</code></td>\n<td>string</td>\n<td>one of</td>\n<td>File to translate.</td>\n</tr>\n<tr>\n<td><code>previousProjectGuid</code></td>\n<td>string</td>\n<td>one of</td>\n<td>Existing project to translate; also keys the cache.</td>\n</tr>\n<tr>\n<td><code>importConfigurationJson</code> / <code>importConfigurationGuid</code></td>\n<td>string</td>\n<td>yes</td>\n<td><code>language1</code> = source language, <code>format</code> = format of <code>subtitlesUrl</code>.</td>\n</tr>\n<tr>\n<td><code>exportConfigurationJson</code> / <code>exportConfigurationGuid</code></td>\n<td>string</td>\n<td>yes</td>\n<td><code>language1</code> = target language; <code>format</code> / <code>extension</code> = file format returned in realtime mode and exported to the callback.</td>\n</tr>\n<tr>\n<td><code>projectGuid</code>, <code>projectName</code></td>\n<td>string</td>\n<td>no</td>\n<td>Project that receives the translation (a copy of the source project, with source and target columns).</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>no</td>\n<td>Defaults to <code>TranslatePro</code>.</td>\n</tr>\n<tr>\n<td><code>callbackUrl</code></td>\n<td>string</td>\n<td>no</td>\n<td>Called when the job finishes.</td>\n</tr>\n<tr>\n<td><code>force</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Same as the query param.</td>\n</tr>\n<tr>\n<td><code>configurationJson/Guid</code>, <code>languageConfigurationJson/Guid</code>, <code>videoConfigurationJson/Guid</code></td>\n<td>string</td>\n<td>no</td>\n<td>Project settings (line length, fps, ... are passed to the engine).</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Cache</strong>: unless forced, a previous successful job with the same engine, <code>previousProjectGuid</code>, source and target language is reused (0-cost job record, immediate <code>Success</code>).</p>\n<p><strong>Query parameters</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>force</code></td>\n<td>bool</td>\n<td>false</td>\n<td>Allow a repeat job for the same project id and bypass the cache.</td>\n</tr>\n<tr>\n<td><code>realtime</code></td>\n<td>bool</td>\n<td>false</td>\n<td>Wait for the result (see below).</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Errors</strong>: 400 <code>Original text is not provided. Nothing to translate</code>, 400 job already exists, 400 unknown engine, 500 engine failure (in <code>realtime</code> mode: the job error text).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","automate","c558775f-9f20-4eac-a289-7f241aa9666e"],"host":["{{base_url}}"],"query":[{"description":{"content":"<p>Wait up to 10 s and return the translated file.</p>\n","type":"text/plain"},"key":"realtime","value":"true"},{"disabled":true,"description":{"content":"<p>Optional. Bypass the cache / allow a repeat job.</p>\n","type":"text/plain"},"key":"force","value":"false"}],"variable":[]}},"response":[{"id":"6a164a3a-9197-456e-9e01-7374db26767e","name":"200 OK - file","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"action\": \"Translate\",\n  \"engine\": \"MT_AWS\",\n  \"projectGuid\": \"464b77d6-960f-4284-92b8-49304f1deaad\",\n  \"projectName\": \"Meridian - Spanish\",\n  \"subtitlesUrl\": \"https://ooona-public.s3.amazonaws.com/video/MERIDIAN/Meridian.en.Transcribe.json\",\n  \"subtitlesFileName\": \"Meridian.en.Transcribe.json\",\n  \"importConfigurationJson\": \"{ \\\"language1\\\": \\\"English\\\", \\\"format\\\": \\\"OoonaProject\\\" }\",\n  \"exportConfigurationJson\": \"{ \\\"language1\\\": \\\"Spanish\\\", \\\"format\\\": \\\"TT\\\" }\",\n  \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\",\n  \"force\": false\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/automate/7f19e4a4-cee8-438f-b041-3a9cab39b3d1?realtime=true","host":["{{base_url}}"],"path":["external","automate","a03ff50b-a198-4d30-aecc-ca54de111b50"],"query":[{"key":"realtime","value":"true","description":"Wait up to 10 s and return the translated file."},{"key":"force","value":"false","description":"Optional. Bypass the cache / allow a repeat job.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"application/octet-stream"}],"cookie":[],"responseTime":null,"body":"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<tt xmlns:tts=\"http://www.w3.org/ns/ttml#styling\" xmlns:ttp=\"http://www.w3.org/ns/ttml#parameter\" xml:lang=\"es\" ttp:timeBase=\"smpte\" ttp:frameRate=\"24\" xmlns=\"http://www.w3.org/ns/ttml\">\n  <head>\n    <layout>\n      <region xml:id=\"region.10_11\" tts:displayAlign=\"after\" tts:origin=\"10% 75%\" tts:extent=\"80% 15%\" />\n    </layout>\n  </head>\n  <body>\n    <div>\n      <p begin=\"00:00:26:22\" end=\"00:00:29:15\" region=\"region.10_11\">Así que estos tipos simplemente<br/>desaparecieron.</p>\n      <p begin=\"00:00:31:00\" end=\"00:00:36:00\" region=\"region.10_11\">Sí, en ese tramo de carretera justo<br/>encima de El Matador. ¿Lo conoces?</p>\n    </div>\n  </body>\n</tt>"},{"id":"ef792756-201d-4665-bf74-a6e4e5c654d3","name":"200 OK - still running","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"action\": \"Translate\",\n  \"engine\": \"MT_AWS\",\n  \"projectGuid\": \"0eb52536-aaee-443c-a10a-ea925d652b08\",\n  \"projectName\": \"Meridian - Spanish\",\n  \"subtitlesUrl\": \"https://ooona-public.s3.amazonaws.com/video/MERIDIAN/Meridian.en.Transcribe.json\",\n  \"subtitlesFileName\": \"Meridian.en.Transcribe.json\",\n  \"importConfigurationJson\": \"{ \\\"language1\\\": \\\"English\\\", \\\"format\\\": \\\"OoonaProject\\\" }\",\n  \"exportConfigurationJson\": \"{ \\\"language1\\\": \\\"Spanish\\\", \\\"format\\\": \\\"TT\\\" }\",\n  \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\",\n  \"force\": false\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/automate/a84f56e4-fb8e-45c5-8d20-f3dacf11f181?realtime=true","host":["{{base_url}}"],"path":["external","automate","f4a461b4-13b8-4ee5-87fc-c659323b10bd"],"query":[{"key":"realtime","value":"true","description":"Wait up to 10 s and return the translated file."},{"key":"force","value":"false","description":"Optional. Bypass the cache / allow a repeat job.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"jobId\": \"53b70a1f8e2d4c6b82a4f1e5a0c7b3d9\",\n  \"status\": \"Running\",\n  \"projectId\": \"6f1c2f8e-2c0e-4a62-9c1f-3b7d5a9e4d10\",\n  \"statusUrl\": \"https://toolkit.example.com/external/automate/status/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"transactionAmount\": 0.17,\n  \"transactionCurrency\": \"USD\",\n  \"transactionDetails\": \"AWS Translation job 0.00001500$x11380 characters\"\n}"}],"_postman_id":"ecef6916-4386-402f-87b5-a60d5e110b57"},{"name":"Run Unified","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Set lastJobId\", () => {\n    const responseJson = pm.response.json();\n    const id = responseJson.id || responseJson.jobId;\n    if (id) {\n        pm.environment.set('lastJobId', id);\n    }\n});"]}}],"id":"c46214a3-306a-4c84-b74a-5330401c9c4b","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"engine\": \"Unified_OoonaAI\",\n  \"video\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n  \"videoDatUrl\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.dat\",\n  \"scriptFileUrl\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.script.pdf\",\n  \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab?id=root\",\n  \"duration\": 96,\n  \"startTC\": \"00:00:00:00\",\n\n  \"projectGuid\": \"85a0af0e-c11a-40ef-8102-f125cb67acfc\",\n  \"projectName\": \"Test project\",\n  \"importConfigurationJson\": \"{ \\\"language1\\\": \\\"English\\\" }\",\n\n  \"seriesId\": \"60a087b2a78ea8c6144922c1\",\n  \"seriesName\": \"Test series\",\n  \"season\": 1,\n  \"episode\": 1,\n  \"clientId\": \"\",\n  \"synopsisLength\": 300,\n\n  \"sourceLanguage\": \"English\",\n  \"referenceLanguage\": \"English\",\n\n  \"features\": {\n    \"transcription\": true,\n    \"scenes\": true,\n    \"translation\": true,\n    \"subtitles\": true,\n    \"synopsis\": true,\n    \"names\": true,\n    \"glossary\": true\n  },\n  \"featureSettings\": {\n    \"synopsisMaxCharacters\": 420\n  },\n  \"skipCache\": false,\n  \"force\": false,\n\n  \"targetLanguages\": [\n    {\n      \"language\": \"Spanish\",\n      \"projectGuid\": \"99847d6b-e83a-4bd6-9431-08727bdd23af\",\n      \"app\": \"EditPro\",\n      \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab?id=spa\",\n      \"importConfigurationJson\": \"{ \\\"fps\\\": 25, \\\"lineLength\\\": 42, \\\"maxParagraphLines\\\": 2, \\\"maxSubDuration\\\": 7.0, \\\"minSubDuration\\\": 1.0, \\\"timingGap\\\": 2 }\",\n      \"exportConfigurationJson\": \"{ \\\"language1\\\": \\\"Spanish\\\", \\\"format\\\": \\\"TT\\\" }\"\n    },\n    {\n      \"language\": \"French\",\n      \"projectGuid\": \"f280b999-b894-4789-ae9e-a4dbb2db138e\",\n      \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab?id=fr\",\n      \"importConfigurationJson\": \"{ \\\"fps\\\": 25, \\\"lineLength\\\": 42, \\\"maxParagraphLines\\\": 2, \\\"maxSubDuration\\\": 7.0, \\\"minSubDuration\\\": 1.0, \\\"timingGap\\\": 2 }\",\n      \"exportConfigurationJson\": \"{ \\\"language1\\\": \\\"French\\\", \\\"format\\\": \\\"TT\\\" }\",\n      \"context\": [\n        { \"type\": \"synopsis\", \"content\": \"{}\" },\n        { \"type\": \"glossary\", \"url\": \"https://ooona-public.s3.amazonaws.com/video/glossary-fr.json\" }\n      ]\n    },\n    {\n      \"language\": \"Hebrew\",\n      \"projectGuid\": \"dee5249b-7009-4c0a-b0d9-915b282a7b07\",\n      \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab?id=heb\",\n      \"importConfigurationJson\": \"{ \\\"fps\\\": 25, \\\"lineLength\\\": 42, \\\"maxParagraphLines\\\": 2, \\\"maxSubDuration\\\": 7.0, \\\"minSubDuration\\\": 1.0, \\\"timingGap\\\": 2 }\",\n      \"exportConfigurationJson\": \"{ \\\"language1\\\": \\\"Hebrew\\\", \\\"isRtl\\\": true, \\\"format\\\": \\\"TT\\\" }\"\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/automate/5a1c505c-c8fe-45bb-82ff-795dc03a02d0","description":"<p>Starts a <strong>Unified AI</strong> job: one video in, and per requested language a finished project out (transcript, translation, subtitles, synopsis, names, glossary, ... depending on the engine and the <code>features</code> you switch on). Role: <code>API</code>.</p>\n<p>The <code>{id}</code> in the URL is the id of the <strong>root (source-language) project</strong> and of the request; omit it for a generated GUID. The call returns a job object as soon as the job is created/accepted; the job has one sub-job per target language (<code>subJobs</code>), each filling its own project (<code>targetLanguages[].projectGuid</code>). Poll <strong>Get job status</strong>, or use the callbacks, and fetch each language with <strong>Get job result</strong> and <code>?target=&lt;index or language&gt;</code>.</p>\n<p><strong>Behaviour</strong></p>\n<ul>\n<li>Action <code>Unified</code> (inferred from a <code>Unified_</code> engine). Unlike ASR/MT, a repeat request for the same project id is <strong>not</strong> rejected as \"already exists\".</li>\n<li><code>video</code> may be a plain URL or a JSON string <code>{\"src\":\"&lt;media url&gt;\",\"dat\":\"&lt;dat url&gt;\"}</code>; the <code>dat</code> URL fills <code>videoDatUrl</code> when that is empty. S3 URLs (<code>video</code>, <code>scriptFileUrl</code>, <code>videoDatUrl</code>) are re-signed when possible.</li>\n<li>If the root project id equals a target language's <code>projectGuid</code>, the root gets a fresh GUID so the two do not overwrite each other.</li>\n<li>The root project and every target-language project are created if they do not exist (target app defaults to <code>EditPro</code>). Each target inherits the request's resolved configuration, and its own configuration fields override it.</li>\n<li><code>sourceLanguage</code> is optional: when empty it is asked from the engine (detected from the media).</li>\n<li><strong>Cache</strong>: unless forced, a previous successful job for the same engine, video and request is reused: the targets are filled at once with 0-cost job records and the response is already <code>Success</code>.</li>\n<li><strong>Same video, several requests</strong>: a concurrent or earlier job for the same video is linked, so extra languages are priced as additional languages and wait for the first job when it is still running. <code>force</code> does not disable this linkage, only the cache reuse (and an already finished older job is not linked for forced runs).</li>\n</ul>\n<p><strong>Route</strong>: <code>id</code> (optional, string).</p>\n<p><strong>Query parameters</strong>: <code>force</code> (bool, default false): skip cached results; <code>realtime</code> (bool): not used by Unified.</p>\n<p><strong>Body fields (Unified)</strong> (in addition to the shared fields in the folder description)</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>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>engine</code></td>\n<td>string</td>\n<td>yes</td>\n<td><code>Unified_&lt;Name&gt;</code>, e.g. <code>Unified_OoonaAI</code>, <code>Unified_BillionsOfWords</code> (see <strong>Get engines</strong>).</td>\n</tr>\n<tr>\n<td><code>video</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Media URL, or the JSON string described above.</td>\n</tr>\n<tr>\n<td><code>videoDatUrl</code></td>\n<td>string</td>\n<td>no</td>\n<td>URL of the video <code>.dat</code> JSON (waveform, shot changes, metadata).</td>\n</tr>\n<tr>\n<td><code>scriptFileUrl</code></td>\n<td>string</td>\n<td>no</td>\n<td>Production script (PDF, DOCX, RTF...), stored with the job outputs.</td>\n</tr>\n<tr>\n<td><code>duration</code></td>\n<td>number</td>\n<td>recommended</td>\n<td>Media length in seconds (pricing).</td>\n</tr>\n<tr>\n<td><code>startTC</code></td>\n<td>string</td>\n<td>no</td>\n<td>Media start timecode applied to the results.</td>\n</tr>\n<tr>\n<td><code>projectGuid</code>, <code>projectName</code></td>\n<td>string</td>\n<td>no</td>\n<td>Root project id / name.</td>\n</tr>\n<tr>\n<td><code>importConfigurationJson/Guid</code>, <code>sourceImportConfigurationJson/Guid</code>, <code>sourceLanguageConfigurationJson/Guid</code>, <code>configurationJson/Guid</code>, <code>languageConfigurationJson/Guid</code>, <code>videoConfigurationJson/Guid</code></td>\n<td>string</td>\n<td>no</td>\n<td>Settings of the root project; <code>language1</code> of the import config is the source language.</td>\n</tr>\n<tr>\n<td><code>sourceLanguage</code></td>\n<td>string</td>\n<td>no</td>\n<td>Spoken language; detected when empty.</td>\n</tr>\n<tr>\n<td><code>referenceLanguage</code></td>\n<td>string</td>\n<td>no</td>\n<td>Language used as translation reference. If it is not one of <code>targetLanguages</code>, its sub-job is hidden from <code>subJobs</code>.</td>\n</tr>\n<tr>\n<td><code>targetLanguages</code></td>\n<td>array</td>\n<td>yes</td>\n<td>See below.</td>\n</tr>\n<tr>\n<td><code>features</code></td>\n<td>object</td>\n<td>no</td>\n<td><code>{ \"&lt;feature&gt;\": true }</code>; keys from the engine's <code>extraFeatures</code> (OoonaAI: <code>transcription</code>, <code>scenes</code>, <code>translation</code>, <code>subtitles</code>, <code>synopsis</code>, <code>names</code>, <code>glossary</code>, ...).</td>\n</tr>\n<tr>\n<td><code>featureSettings</code></td>\n<td>object</td>\n<td>no</td>\n<td>Engine-specific settings (for example <code>synopsisMaxCharacters</code>, <code>force</code>).</td>\n</tr>\n<tr>\n<td><code>seriesId</code>, <code>seriesName</code></td>\n<td>string</td>\n<td>no</td>\n<td>Series the title belongs to (context is shared across episodes of a series).</td>\n</tr>\n<tr>\n<td><code>season</code>, <code>episode</code></td>\n<td>int</td>\n<td>no</td>\n<td>Episode numbers (default 0).</td>\n</tr>\n<tr>\n<td><code>seriesConfig</code></td>\n<td>object</td>\n<td>no</td>\n<td>Series configuration from a previous job, reviewed by a post-editor; overrides the default.</td>\n</tr>\n<tr>\n<td><code>clientId</code></td>\n<td>string</td>\n<td>no</td>\n<td>Client identifier passed to the engine.</td>\n</tr>\n<tr>\n<td><code>synopsisLength</code></td>\n<td>int</td>\n<td>no</td>\n<td>Maximum synopsis length in characters (documented range 50-2000, default 200).</td>\n</tr>\n<tr>\n<td><code>skipCache</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Engine reprocesses from scratch and skips series context caching.</td>\n</tr>\n<tr>\n<td><code>engineOptions</code></td>\n<td>object</td>\n<td>no</td>\n<td>Per-request engine options (see the <em>Engine options</em> folder).</td>\n</tr>\n<tr>\n<td><code>callbackUrl</code></td>\n<td>string</td>\n<td>no</td>\n<td>Called when the job finishes.</td>\n</tr>\n<tr>\n<td><code>force</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Same as the query param.</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>pendingJobId</code>, <code>firstLanguageJobId</code> and <code>isForcedRun</code> are set by the server; do not send them.</p>\n<p><strong><code>targetLanguages[]</code></strong> (one entry per output language)</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>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>language</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Target language name (see <strong>Engine languages</strong>).</td>\n</tr>\n<tr>\n<td><code>projectGuid</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Project that receives this language.</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>no</td>\n<td>Defaults to <code>EditPro</code>.</td>\n</tr>\n<tr>\n<td><code>projectName</code></td>\n<td>string</td>\n<td>no</td>\n<td>Name of the project.</td>\n</tr>\n<tr>\n<td><code>callbackUrl</code></td>\n<td>string</td>\n<td>no</td>\n<td>Callback for this language.</td>\n</tr>\n<tr>\n<td><code>importConfigurationJson/Guid</code></td>\n<td>string</td>\n<td>no</td>\n<td>Project settings: fps, <code>lineLength</code>, <code>maxParagraphLines</code>, <code>minSubDuration</code>, <code>maxSubDuration</code>, <code>timingGap</code>, ...</td>\n</tr>\n<tr>\n<td><code>exportConfigurationJson/Guid</code></td>\n<td>string</td>\n<td>no</td>\n<td>Output format settings, e.g. <code>language1</code>, <code>format</code>, <code>isRtl</code>.</td>\n</tr>\n<tr>\n<td><code>configurationJson/Guid</code>, <code>languageConfigurationJson/Guid</code>, <code>videoConfigurationJson/Guid</code></td>\n<td>string</td>\n<td>no</td>\n<td>Further settings; override the request-level ones for this language.</td>\n</tr>\n<tr>\n<td><code>previousConfigurationJson/Guid</code>, <code>previousImportConfigurationJson/Guid</code>, ...</td>\n<td>string</td>\n<td>no</td>\n<td>Fallbacks.</td>\n</tr>\n<tr>\n<td><code>context</code></td>\n<td>array</td>\n<td>no</td>\n<td>Extra context: <code>{ \"type\": \"synopsis\" or \"glossary\" ..., \"content\": \"&lt;text/JSON&gt;\", \"url\": \"&lt;file url&gt;\" }</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Errors</strong>: 400 unknown engine or action (e.g. <code>Engine action Foo not recognized...</code>); 500 engine failure.</p>\n<p><strong>Output (200)</strong>: a job object.</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>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>string</td>\n<td>Toolkit job id. Use it with the status, result and cost endpoints.</td>\n</tr>\n<tr>\n<td><code>jobId</code></td>\n<td>string</td>\n<td>The engine's own job id (may be empty until the engine accepted the job). Also accepted by the status/result/cost endpoints.</td>\n</tr>\n<tr>\n<td><code>projectId</code></td>\n<td>string</td>\n<td>The Toolkit project the result is applied to.</td>\n</tr>\n<tr>\n<td><code>type</code></td>\n<td>string</td>\n<td><code>SpeechToText</code>, <code>Translation</code>, <code>Unified</code>, <code>QualityControl</code>, <code>Syncheck</code>, ...</td>\n</tr>\n<tr>\n<td><code>engine</code></td>\n<td>string</td>\n<td>Engine key, e.g. <code>AWS</code>.</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td><code>Waiting</code>, <code>Running</code>, <code>Success</code>, <code>Failure</code>, <code>Retry1</code>, <code>Retry2</code>, <code>Retry3</code>.</td>\n</tr>\n<tr>\n<td><code>progress</code></td>\n<td>number</td>\n<td>0-100.</td>\n</tr>\n<tr>\n<td><code>sourceLanguage</code> / <code>targetLanguage</code></td>\n<td>string</td>\n<td>Languages of the job.</td>\n</tr>\n<tr>\n<td><code>warning</code> / <code>error</code></td>\n<td>string</td>\n<td>Warning text, and failure reason when <code>status</code> is <code>Failure</code>.</td>\n</tr>\n<tr>\n<td><code>dateCreated</code>, <code>lastUpdated</code>, <code>startedAt</code>, <code>completedAt</code></td>\n<td>ISO date</td>\n<td>Job timestamps (<code>startedAt</code> / <code>completedAt</code> can be null).</td>\n</tr>\n<tr>\n<td><code>transactionId</code>, <code>transactionDetails</code>, <code>transactionAmount</code>, <code>transactionCurrency</code>, <code>transactionPriceFactor</code>, <code>transactionPricePerUnit</code>, <code>transactionUnits</code>, <code>transactionStatus</code></td>\n<td></td>\n<td>The wallet charge of the job (see <em>Get job cost</em>). Cached-result jobs are recorded with 0 cost.</td>\n</tr>\n<tr>\n<td><code>statusUrl</code></td>\n<td>string</td>\n<td>URL of <em>Get job status</em> for this job.</td>\n</tr>\n<tr>\n<td><code>resultUrls</code></td>\n<td>object</td>\n<td><code>raw</code>, <code>srt</code>, <code>vtt</code>, <code>ooona</code> links to <em>Get job result</em>.</td>\n</tr>\n<tr>\n<td><code>subJobs</code></td>\n<td>array</td>\n<td>Unified jobs only: one job object per target language; each has its own <code>resultUrls</code> with <code>?target=&lt;index&gt;</code>.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","automate","53b5bdc0-a9cb-4b91-9543-ec6ef1521c76"],"host":["{{base_url}}"],"query":[{"disabled":true,"description":{"content":"<p>Optional. true allows a second job for a project id that already has one, and skips cached results.</p>\n","type":"text/plain"},"key":"force","value":"false"}],"variable":[]}},"response":[{"id":"02df9a47-17c9-42ae-9a39-9e9b1ada5897","name":"200 OK - job started","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"engine\": \"Unified_OoonaAI\",\n  \"video\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n  \"videoDatUrl\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.dat\",\n  \"scriptFileUrl\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.script.pdf\",\n  \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab?id=root\",\n  \"duration\": 96,\n  \"startTC\": \"00:00:00:00\",\n\n  \"projectGuid\": \"5fec160c-4b50-47cf-bb00-46b0d7d411e9\",\n  \"projectName\": \"Test project\",\n  \"importConfigurationJson\": \"{ \\\"language1\\\": \\\"English\\\" }\",\n\n  \"seriesId\": \"60a087b2a78ea8c6144922c1\",\n  \"seriesName\": \"Test series\",\n  \"season\": 1,\n  \"episode\": 1,\n  \"clientId\": \"\",\n  \"synopsisLength\": 300,\n\n  \"sourceLanguage\": \"English\",\n  \"referenceLanguage\": \"English\",\n\n  \"features\": {\n    \"transcription\": true,\n    \"scenes\": true,\n    \"translation\": true,\n    \"subtitles\": true,\n    \"synopsis\": true,\n    \"names\": true,\n    \"glossary\": true\n  },\n  \"featureSettings\": {\n    \"synopsisMaxCharacters\": 420\n  },\n  \"skipCache\": false,\n  \"force\": false,\n\n  \"targetLanguages\": [\n    {\n      \"language\": \"Spanish\",\n      \"projectGuid\": \"5bd44d7e-8629-44f1-ba4b-a2a656f35140\",\n      \"app\": \"EditPro\",\n      \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab?id=spa\",\n      \"importConfigurationJson\": \"{ \\\"fps\\\": 25, \\\"lineLength\\\": 42, \\\"maxParagraphLines\\\": 2, \\\"maxSubDuration\\\": 7.0, \\\"minSubDuration\\\": 1.0, \\\"timingGap\\\": 2 }\",\n      \"exportConfigurationJson\": \"{ \\\"language1\\\": \\\"Spanish\\\", \\\"format\\\": \\\"TT\\\" }\"\n    },\n    {\n      \"language\": \"French\",\n      \"projectGuid\": \"1df9bbb7-f185-49d0-8f37-428bc812b363\",\n      \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab?id=fr\",\n      \"importConfigurationJson\": \"{ \\\"fps\\\": 25, \\\"lineLength\\\": 42, \\\"maxParagraphLines\\\": 2, \\\"maxSubDuration\\\": 7.0, \\\"minSubDuration\\\": 1.0, \\\"timingGap\\\": 2 }\",\n      \"exportConfigurationJson\": \"{ \\\"language1\\\": \\\"French\\\", \\\"format\\\": \\\"TT\\\" }\",\n      \"context\": [\n        { \"type\": \"synopsis\", \"content\": \"{}\" },\n        { \"type\": \"glossary\", \"url\": \"https://ooona-public.s3.amazonaws.com/video/glossary-fr.json\" }\n      ]\n    },\n    {\n      \"language\": \"Hebrew\",\n      \"projectGuid\": \"849d31d1-2d9c-4d60-8c3f-1c3a00758baa\",\n      \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab?id=heb\",\n      \"importConfigurationJson\": \"{ \\\"fps\\\": 25, \\\"lineLength\\\": 42, \\\"maxParagraphLines\\\": 2, \\\"maxSubDuration\\\": 7.0, \\\"minSubDuration\\\": 1.0, \\\"timingGap\\\": 2 }\",\n      \"exportConfigurationJson\": \"{ \\\"language1\\\": \\\"Hebrew\\\", \\\"isRtl\\\": true, \\\"format\\\": \\\"TT\\\" }\"\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/automate/3aa8a035-053c-4834-8d1d-a47fec739735","host":["{{base_url}}"],"path":["external","automate","924a088b-d6b8-44cf-82ae-b4be475ab5a2"],"query":[{"key":"force","value":"false","description":"Optional. true allows a second job for a project id that already has one, and skips cached results.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"email\": \"api@example.com\",\n  \"projectId\": \"6f1c2f8e-2c0e-4a62-9c1f-3b7d5a9e4d10\",\n  \"type\": \"Unified\",\n  \"jobId\": \"53b70a1f8e2d4c6b82a4f1e5a0c7b3d9\",\n  \"mediaId\": null,\n  \"sourceLanguage\": \"English\",\n  \"targetLanguage\": null,\n  \"status\": \"Running\",\n  \"progress\": 5,\n  \"warning\": null,\n  \"error\": null,\n  \"dateCreated\": \"2026-10-15T09:00:00Z\",\n  \"lastUpdated\": \"2026-10-15T09:00:12Z\",\n  \"startedAt\": \"2026-10-15T09:00:02Z\",\n  \"completedAt\": null,\n  \"engine\": \"OoonaAI\",\n  \"transactionId\": \"b2f7d3a1-5c4e-4f60-9a8b-1e2d3c4b5a69\",\n  \"transactionDetails\": \"\",\n  \"transactionAmount\": 0.0,\n  \"transactionCurrency\": \"USD\",\n  \"transactionPriceFactor\": \"Second\",\n  \"transactionPricePerUnit\": 0.0,\n  \"transactionUnits\": 96.0,\n  \"transactionStatus\": \"Pending\",\n  \"statusUrl\": \"https://toolkit.example.com/external/automate/status/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"resultUrls\": {\n    \"raw\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n    \"srt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/srt\",\n    \"vtt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/vtt\",\n    \"ooona\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/ooona\"\n  },\n  \"subJobs\": [\n    {\n      \"id\": \"9d3b7c0a5e1f4a28b6c4d2e8f1a07b31\",\n      \"email\": \"api@example.com\",\n      \"projectId\": \"11111111-aaaa-4aaa-8aaa-111111111111\",\n      \"type\": \"Unified\",\n      \"jobId\": \"13b70a1f8e2d4c6b82a4f1e5a0c7b3d9\",\n      \"mediaId\": null,\n      \"sourceLanguage\": \"English\",\n      \"targetLanguage\": \"Spanish\",\n      \"status\": \"Running\",\n      \"progress\": 10,\n      \"warning\": null,\n      \"error\": null,\n      \"dateCreated\": \"2026-10-15T09:00:00Z\",\n      \"lastUpdated\": \"2026-10-15T09:00:12Z\",\n      \"startedAt\": \"2026-10-15T09:00:02Z\",\n      \"completedAt\": null,\n      \"engine\": \"OoonaAI\",\n      \"transactionId\": \"b2f7d3a1-5c4e-4f60-9a8b-1e2d3c4b5a69\",\n      \"transactionDetails\": \"\",\n      \"transactionAmount\": 0.0,\n      \"transactionCurrency\": \"USD\",\n      \"transactionPriceFactor\": \"Second\",\n      \"transactionPricePerUnit\": 0.0,\n      \"transactionUnits\": 96.0,\n      \"transactionStatus\": \"Pending\",\n      \"statusUrl\": \"https://toolkit.example.com/external/automate/status/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n      \"resultUrls\": {\n        \"raw\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35?target=0\",\n        \"srt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/srt?target=0\",\n        \"vtt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/vtt?target=0\",\n        \"ooona\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/ooona?target=0\"\n      },\n      \"subJobs\": null\n    },\n    {\n      \"id\": \"9d3b7c0a5e1f4a28b6c4d2e8f1a07b32\",\n      \"email\": \"api@example.com\",\n      \"projectId\": \"22222222-bbbb-4bbb-8bbb-222222222222\",\n      \"type\": \"Unified\",\n      \"jobId\": \"23b70a1f8e2d4c6b82a4f1e5a0c7b3d9\",\n      \"mediaId\": null,\n      \"sourceLanguage\": \"English\",\n      \"targetLanguage\": \"French\",\n      \"status\": \"Running\",\n      \"progress\": 10,\n      \"warning\": null,\n      \"error\": null,\n      \"dateCreated\": \"2026-10-15T09:00:00Z\",\n      \"lastUpdated\": \"2026-10-15T09:00:12Z\",\n      \"startedAt\": \"2026-10-15T09:00:02Z\",\n      \"completedAt\": null,\n      \"engine\": \"OoonaAI\",\n      \"transactionId\": \"b2f7d3a1-5c4e-4f60-9a8b-1e2d3c4b5a69\",\n      \"transactionDetails\": \"\",\n      \"transactionAmount\": 0.0,\n      \"transactionCurrency\": \"USD\",\n      \"transactionPriceFactor\": \"Second\",\n      \"transactionPricePerUnit\": 0.0,\n      \"transactionUnits\": 96.0,\n      \"transactionStatus\": \"Pending\",\n      \"statusUrl\": \"https://toolkit.example.com/external/automate/status/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n      \"resultUrls\": {\n        \"raw\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35?target=1\",\n        \"srt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/srt?target=1\",\n        \"vtt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/vtt?target=1\",\n        \"ooona\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/ooona?target=1\"\n      },\n      \"subJobs\": null\n    },\n    {\n      \"id\": \"9d3b7c0a5e1f4a28b6c4d2e8f1a07b33\",\n      \"email\": \"api@example.com\",\n      \"projectId\": \"33333333-cccc-4ccc-8ccc-333333333333\",\n      \"type\": \"Unified\",\n      \"jobId\": \"33b70a1f8e2d4c6b82a4f1e5a0c7b3d9\",\n      \"mediaId\": null,\n      \"sourceLanguage\": \"English\",\n      \"targetLanguage\": \"Hebrew\",\n      \"status\": \"Running\",\n      \"progress\": 10,\n      \"warning\": null,\n      \"error\": null,\n      \"dateCreated\": \"2026-10-15T09:00:00Z\",\n      \"lastUpdated\": \"2026-10-15T09:00:12Z\",\n      \"startedAt\": \"2026-10-15T09:00:02Z\",\n      \"completedAt\": null,\n      \"engine\": \"OoonaAI\",\n      \"transactionId\": \"b2f7d3a1-5c4e-4f60-9a8b-1e2d3c4b5a69\",\n      \"transactionDetails\": \"\",\n      \"transactionAmount\": 0.0,\n      \"transactionCurrency\": \"USD\",\n      \"transactionPriceFactor\": \"Second\",\n      \"transactionPricePerUnit\": 0.0,\n      \"transactionUnits\": 96.0,\n      \"transactionStatus\": \"Pending\",\n      \"statusUrl\": \"https://toolkit.example.com/external/automate/status/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n      \"resultUrls\": {\n        \"raw\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35?target=2\",\n        \"srt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/srt?target=2\",\n        \"vtt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/vtt?target=2\",\n        \"ooona\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/ooona?target=2\"\n      },\n      \"subJobs\": null\n    }\n  ]\n}"},{"id":"aefb7bbf-f68d-4a66-a2d7-bcfbddcce569","name":"400 Unrecognised engine","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"engine\": \"Foo_Bar\",\n  \"video\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\"\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/automate/0acc374c-0202-421f-881b-a9568ae870fe","host":["{{base_url}}"],"path":["external","automate","06f4e61a-6f18-42e7-aad8-5bcb9d0797bf"],"query":[{"key":"force","value":"false","description":"Optional. true allows a second job for a project id that already has one, and skips cached results.","disabled":true}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"Message\": \"Engine action Foo not recognized. Please provide a valid engine value or a valid action value.\",\n  \"ExceptionMessage\": \"Engine action Foo not recognized. Please provide a valid engine value or a valid action value.\",\n  \"ExceptionType\": \"ArgumentException\",\n  \"ActionName\": \"Automate\",\n  \"ControllerName\": \"ExternalAutomate\",\n  \"StackTrace\": \"ExternalAutomateController.cs:127\"\n}"}],"_postman_id":"c46214a3-306a-4c84-b74a-5330401c9c4b"},{"name":"Run QC","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Set lastJobId\", () => {\n    const responseJson = pm.response.json();\n    const id = responseJson.id || responseJson.jobId;\n    if (id) {\n        pm.environment.set('lastJobId', id);\n    }\n});"]}}],"id":"b59854d1-0330-4f03-85cf-a0c7de1872f3","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"action\": \"QC\",\n  \"engine\": \"QC_OpenAI\",\n  \"projectGuid\": \"76614ade-7d14-4b21-924d-a5242dc832f8\",\n  \"previousProjectGuid\": \"00000000-2000-0000-2000-200000000002\",\n  \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\",\n  \"profanityMode\": \"Flag\",\n  \"customProfanityWords\": [\"heck\"],\n  \"fixReadingSpeed\": false,\n  \"fixTimecodes\": false,\n  \"fixLineLength\": false,\n  \"synopsis\": \"A detective investigates mysterious disappearances near a seaside cliff.\",\n  \"characterNames\": [\"Foster\", \"Sullivan\"],\n  \"recurringPhrases\": [\"El Matador\"]\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/automate/32185c7e-b91a-4a33-ab32-389ae0c3eb19","description":"<p>Starts an <strong>AI quality-control (QC)</strong> job on the subtitles of a project. Role: <code>API</code>.</p>\n<p>The project (<code>projectGuid</code>, created from <code>previousProjectGuid</code> or <code>subtitlesUrl</code> when it does not exist) must contain subtitle text, otherwise the call returns 400 <code>No subtitles to check</code>. If the project has an original (source) project, the source paragraphs are sent too for bilingual checks, with the source language taken from the original project's <code>language1</code>; the target language is the project's <code>language1</code>.</p>\n<p>Poll <strong>Get job status</strong>, or use <code>realtime=true</code> to wait up to <strong>60 seconds</strong> (on success the result is applied to the project and the job object is returned; if still running, <code>{ jobId, status, projectId, statusUrl, ... }</code> is returned; on failure 500 with the error). Fetch the findings with <strong>Get job result</strong> (<code>json</code>).</p>\n<p><strong>Route</strong>: <code>id</code> (optional, string): project / request id; a GUID is generated when omitted.</p>\n<p><strong>Query parameters</strong>: <code>force</code> (bool, default false) allows a repeat job for the same project id; <code>realtime</code> (bool, default false) waits as described.</p>\n<p><strong>Body fields (QC)</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>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>engine</code></td>\n<td>string</td>\n<td>yes (or <code>action</code>)</td>\n<td><code>QC_&lt;Name&gt;</code>, e.g. <code>QC_OpenAI</code>.</td>\n</tr>\n<tr>\n<td><code>action</code></td>\n<td>string</td>\n<td>no</td>\n<td><code>QC</code> (inferred from <code>QC_</code>).</td>\n</tr>\n<tr>\n<td><code>projectGuid</code></td>\n<td>string</td>\n<td>no</td>\n<td>Project to check (defaults to the URL id).</td>\n</tr>\n<tr>\n<td><code>previousProjectGuid</code> / <code>subtitlesUrl</code></td>\n<td>string</td>\n<td>one of</td>\n<td>Where the subtitles come from when the project does not exist yet.</td>\n</tr>\n<tr>\n<td><code>profanityMode</code></td>\n<td>string</td>\n<td>no</td>\n<td><code>None</code> (default), <code>Flag</code>, <code>CensorMild</code>, <code>CensorStrict</code>.</td>\n</tr>\n<tr>\n<td><code>customProfanityWords</code></td>\n<td>string[]</td>\n<td>no</td>\n<td>Extra words to treat as profanity.</td>\n</tr>\n<tr>\n<td><code>fixReadingSpeed</code>, <code>fixTimecodes</code>, <code>fixLineLength</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Technical fixes; default false.</td>\n</tr>\n<tr>\n<td><code>synopsis</code></td>\n<td>string</td>\n<td>no</td>\n<td>Content summary for context.</td>\n</tr>\n<tr>\n<td><code>characterNames</code></td>\n<td>string[]</td>\n<td>no</td>\n<td>Names to keep consistent.</td>\n</tr>\n<tr>\n<td><code>recurringPhrases</code></td>\n<td>string[]</td>\n<td>no</td>\n<td>Phrases to keep consistent.</td>\n</tr>\n<tr>\n<td><code>callbackUrl</code></td>\n<td>string</td>\n<td>no</td>\n<td>Called when the job finishes.</td>\n</tr>\n<tr>\n<td><code>configurationJson/Guid</code>, <code>languageConfigurationJson/Guid</code>, <code>videoConfigurationJson/Guid</code>, <code>importConfigurationJson/Guid</code></td>\n<td>string</td>\n<td>no</td>\n<td>Project settings; line length, gaps, durations, fps and screen lines are passed to the engine.</td>\n</tr>\n</tbody>\n</table>\n</div><p>The QC engine model has further flags (<code>allowTextChanges</code>, <code>fixSpellingGrammar</code>, <code>fixLineBreaks</code>, <code>fixReadingSpeedAI</code>, <code>fixLineBalancing</code>, <code>fixMinDuration</code>, <code>fixMaxDuration</code>, <code>fixMinGap</code>, <code>gapSettings</code>, <code>fixShotChanges</code>, <code>fixStyles</code>, <code>fixSpeakerDashes</code>, <code>fixPositioning</code>, ...), but this endpoint copies only the fields in the table above into the QC job.</p>\n<p><strong>Errors</strong>: 400 <code>QC engine &lt;engine&gt; not found</code>, 400 <code>No subtitles to check</code>, 400 job already exists, 500 failure.</p>\n<p><strong>Output (200)</strong>: a job object.</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>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>string</td>\n<td>Toolkit job id. Use it with the status, result and cost endpoints.</td>\n</tr>\n<tr>\n<td><code>jobId</code></td>\n<td>string</td>\n<td>The engine's own job id (may be empty until the engine accepted the job). Also accepted by the status/result/cost endpoints.</td>\n</tr>\n<tr>\n<td><code>projectId</code></td>\n<td>string</td>\n<td>The Toolkit project the result is applied to.</td>\n</tr>\n<tr>\n<td><code>type</code></td>\n<td>string</td>\n<td><code>SpeechToText</code>, <code>Translation</code>, <code>Unified</code>, <code>QualityControl</code>, <code>Syncheck</code>, ...</td>\n</tr>\n<tr>\n<td><code>engine</code></td>\n<td>string</td>\n<td>Engine key, e.g. <code>AWS</code>.</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td><code>Waiting</code>, <code>Running</code>, <code>Success</code>, <code>Failure</code>, <code>Retry1</code>, <code>Retry2</code>, <code>Retry3</code>.</td>\n</tr>\n<tr>\n<td><code>progress</code></td>\n<td>number</td>\n<td>0-100.</td>\n</tr>\n<tr>\n<td><code>sourceLanguage</code> / <code>targetLanguage</code></td>\n<td>string</td>\n<td>Languages of the job.</td>\n</tr>\n<tr>\n<td><code>warning</code> / <code>error</code></td>\n<td>string</td>\n<td>Warning text, and failure reason when <code>status</code> is <code>Failure</code>.</td>\n</tr>\n<tr>\n<td><code>dateCreated</code>, <code>lastUpdated</code>, <code>startedAt</code>, <code>completedAt</code></td>\n<td>ISO date</td>\n<td>Job timestamps (<code>startedAt</code> / <code>completedAt</code> can be null).</td>\n</tr>\n<tr>\n<td><code>transactionId</code>, <code>transactionDetails</code>, <code>transactionAmount</code>, <code>transactionCurrency</code>, <code>transactionPriceFactor</code>, <code>transactionPricePerUnit</code>, <code>transactionUnits</code>, <code>transactionStatus</code></td>\n<td></td>\n<td>The wallet charge of the job (see <em>Get job cost</em>). Cached-result jobs are recorded with 0 cost.</td>\n</tr>\n<tr>\n<td><code>statusUrl</code></td>\n<td>string</td>\n<td>URL of <em>Get job status</em> for this job.</td>\n</tr>\n<tr>\n<td><code>resultUrls</code></td>\n<td>object</td>\n<td><code>raw</code>, <code>srt</code>, <code>vtt</code>, <code>ooona</code> links to <em>Get job result</em>.</td>\n</tr>\n<tr>\n<td><code>subJobs</code></td>\n<td>array</td>\n<td>Unified jobs only: one job object per target language; each has its own <code>resultUrls</code> with <code>?target=&lt;index&gt;</code>.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","automate","2e4bf064-045e-4e30-a56d-4d83803f382b"],"host":["{{base_url}}"],"query":[{"disabled":true,"description":{"content":"<p>Optional. true allows a second job for a project id that already has one, and skips cached results.</p>\n","type":"text/plain"},"key":"force","value":"false"},{"disabled":true,"description":{"content":"<p>Optional. true makes MT and QC wait (MT up to 10 s, QC up to 60 s) for the result before answering.</p>\n","type":"text/plain"},"key":"realtime","value":"false"}],"variable":[]}},"response":[{"id":"fceeb107-8bf2-4c43-aebf-4ac0559a7253","name":"200 OK - job started","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"action\": \"QC\",\n  \"engine\": \"QC_OpenAI\",\n  \"projectGuid\": \"56953150-b4ca-4358-aba1-a663a41d3191\",\n  \"previousProjectGuid\": \"00000000-2000-0000-2000-200000000002\",\n  \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\",\n  \"profanityMode\": \"Flag\",\n  \"customProfanityWords\": [\"heck\"],\n  \"fixReadingSpeed\": false,\n  \"fixTimecodes\": false,\n  \"fixLineLength\": false,\n  \"synopsis\": \"A detective investigates mysterious disappearances near a seaside cliff.\",\n  \"characterNames\": [\"Foster\", \"Sullivan\"],\n  \"recurringPhrases\": [\"El Matador\"]\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/automate/de19a930-c5d3-46ea-bce2-869ae910ef11","host":["{{base_url}}"],"path":["external","automate","3a2321d4-3a8b-42dc-9cc8-3528cc854460"],"query":[{"key":"force","value":"false","description":"Optional. true allows a second job for a project id that already has one, and skips cached results.","disabled":true},{"key":"realtime","value":"false","description":"Optional. true makes MT and QC wait (MT up to 10 s, QC up to 60 s) for the result before answering.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"email\": \"api@example.com\",\n  \"projectId\": \"6f1c2f8e-2c0e-4a62-9c1f-3b7d5a9e4d10\",\n  \"type\": \"QualityControl\",\n  \"jobId\": \"53b70a1f8e2d4c6b82a4f1e5a0c7b3d9\",\n  \"mediaId\": null,\n  \"sourceLanguage\": \"English\",\n  \"targetLanguage\": \"English\",\n  \"status\": \"Running\",\n  \"progress\": 0,\n  \"warning\": null,\n  \"error\": null,\n  \"dateCreated\": \"2026-10-15T09:00:00Z\",\n  \"lastUpdated\": \"2026-10-15T09:00:12Z\",\n  \"startedAt\": \"2026-10-15T09:00:02Z\",\n  \"completedAt\": null,\n  \"engine\": \"OpenAI\",\n  \"transactionId\": \"b2f7d3a1-5c4e-4f60-9a8b-1e2d3c4b5a69\",\n  \"transactionDetails\": \"\",\n  \"transactionAmount\": 0.0,\n  \"transactionCurrency\": \"USD\",\n  \"transactionPriceFactor\": \"Second\",\n  \"transactionPricePerUnit\": 0.0,\n  \"transactionUnits\": 96.0,\n  \"transactionStatus\": \"Pending\",\n  \"statusUrl\": \"https://toolkit.example.com/external/automate/status/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"resultUrls\": {\n    \"raw\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n    \"srt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/srt\",\n    \"vtt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/vtt\",\n    \"ooona\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/ooona\"\n  },\n  \"subJobs\": null\n}"},{"id":"aee5a737-679b-47f9-ab27-272c37b71596","name":"400 No subtitles","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"action\": \"QC\",\n  \"engine\": \"QC_OpenAI\",\n  \"projectGuid\": \"da5fcf91-5631-49c2-bfe0-ec274de62a67\",\n  \"previousProjectGuid\": \"00000000-2000-0000-2000-200000000002\",\n  \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\",\n  \"profanityMode\": \"Flag\",\n  \"customProfanityWords\": [\"heck\"],\n  \"fixReadingSpeed\": false,\n  \"fixTimecodes\": false,\n  \"fixLineLength\": false,\n  \"synopsis\": \"A detective investigates mysterious disappearances near a seaside cliff.\",\n  \"characterNames\": [\"Foster\", \"Sullivan\"],\n  \"recurringPhrases\": [\"El Matador\"]\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/automate/69527ec3-c464-4218-bb92-b41909d0c0f5","host":["{{base_url}}"],"path":["external","automate","54994e92-9437-4661-b68f-02a345e03206"],"query":[{"key":"force","value":"false","description":"Optional. true allows a second job for a project id that already has one, and skips cached results.","disabled":true},{"key":"realtime","value":"false","description":"Optional. true makes MT and QC wait (MT up to 10 s, QC up to 60 s) for the result before answering.","disabled":true}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"No subtitles to check\""}],"_postman_id":"b59854d1-0330-4f03-85cf-a0c7de1872f3"},{"name":"Run Syncheck","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Set lastJobId\", () => {\n    const responseJson = pm.response.json();\n    const id = responseJson.id || responseJson.jobId;\n    if (id) {\n        pm.environment.set('lastJobId', id);\n    }\n});"]}}],"id":"688e1786-77e5-47f1-a969-36b3a77902bd","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"action\": \"Syncheck\",\n  \"projectGuid\": \"e9acf96b-92a9-4ad2-81b8-afe73689c4cc\",\n  \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\",\n  \"syncheck\": {\n    \"mediaUrl\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n    \"mediaLanguage\": \"English\",\n    \"asrEngine\": \"AWS\",\n    \"skipContentComparison\": false,\n    \"spotsToCheck\": 3,\n    \"timecodeGraceFrames\": 5,\n    \"textFuzzyMatch\": 50,\n    \"allowedStartSilenceFrames\": 3,\n    \"allowedEndSilenceFrames\": 15,\n    \"subtitles\": [\n      {\n        \"subtitleUrl\": \"https://ooona-public.s3.amazonaws.com/video/MERIDIAN/Meridian.en.srt\",\n        \"language\": \"English\",\n        \"format\": \"SRT\"\n      }\n    ]\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/automate/c9b3356e-e85d-4037-97ff-ad5a5c3672fc","description":"<p>Starts a <strong>Syncheck</strong> job: verifies that subtitle files are in sync with a media file by transcribing sampled spots of the audio (ASR) and comparing them with the subtitles. Role: <code>API</code>.</p>\n<p>Syncheck has no <code>ASR_</code>/<code>MT_</code>-style engine prefix, so <strong><code>\"action\": \"Syncheck\"</code> must be sent explicitly</strong>, together with a <code>syncheck</code> object. The input is validated first; any problem returns 400 with a JSON list of validation errors. The call returns <code>{ jobId, status, projectId, statusUrl, transactionAmount, ... }</code> (not the full job object); poll <strong>Get job status</strong> and read the findings from <strong>Get job result</strong>, which always answers with the structured JSON for Syncheck jobs.</p>\n<p><strong>Route</strong>: <code>id</code> (optional, string). <strong>Query</strong>: <code>force</code> (bool, default false).</p>\n<p><strong><code>syncheck</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>Required</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>mediaUrl</code></td>\n<td>string</td>\n<td>yes</td>\n<td></td>\n<td>Media to check.</td>\n</tr>\n<tr>\n<td><code>mediaLanguage</code></td>\n<td>string</td>\n<td>yes</td>\n<td><code>English</code></td>\n<td>Spoken language; must be a language name known to the instance.</td>\n</tr>\n<tr>\n<td><code>subtitles</code></td>\n<td>array</td>\n<td>yes</td>\n<td>empty</td>\n<td>One entry per subtitle file (below); at least one.</td>\n</tr>\n<tr>\n<td><code>asrEngine</code></td>\n<td>string</td>\n<td>no</td>\n<td><code>AWS</code></td>\n<td>ASR engine used to transcribe the sampled spots (engine key without prefix).</td>\n</tr>\n<tr>\n<td><code>skipContentComparison</code></td>\n<td>bool</td>\n<td>no</td>\n<td>false</td>\n<td>Check timing only, skip the text comparison.</td>\n</tr>\n<tr>\n<td><code>spotsToCheck</code></td>\n<td>int</td>\n<td>no</td>\n<td>3</td>\n<td>Number of audio spots sampled.</td>\n</tr>\n<tr>\n<td><code>timecodeGraceFrames</code></td>\n<td>int</td>\n<td>no</td>\n<td>5</td>\n<td>Allowed timecode deviation, in frames.</td>\n</tr>\n<tr>\n<td><code>textFuzzyMatch</code></td>\n<td>int</td>\n<td>no</td>\n<td>50</td>\n<td>Text-match threshold used by the comparison.</td>\n</tr>\n<tr>\n<td><code>allowedStartSilenceFrames</code></td>\n<td>int</td>\n<td>no</td>\n<td>3</td>\n<td>Allowed silence before the first subtitle, in frames.</td>\n</tr>\n<tr>\n<td><code>allowedEndSilenceFrames</code></td>\n<td>int</td>\n<td>no</td>\n<td>15</td>\n<td>Allowed silence after the last subtitle, in frames.</td>\n</tr>\n<tr>\n<td><code>asrTimeTolerance</code></td>\n<td>number</td>\n<td>no</td>\n<td>0</td>\n<td>Tolerance applied to ASR word times.</td>\n</tr>\n<tr>\n<td><code>videoProcessingPayload</code></td>\n<td>string</td>\n<td>no</td>\n<td></td>\n<td>Optional pre-computed video processing data.</td>\n</tr>\n<tr>\n<td><code>startTC</code></td>\n<td>string</td>\n<td>no</td>\n<td>null</td>\n<td>Start timecode.</td>\n</tr>\n<tr>\n<td><code>engineOptions</code></td>\n<td>object</td>\n<td>no</td>\n<td></td>\n<td>Per-request engine options (see the <em>Engine options</em> folder).</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong><code>syncheck.subtitles[]</code></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>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>subtitleUrl</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Subtitle file URL.</td>\n</tr>\n<tr>\n<td><code>language</code></td>\n<td>string</td>\n<td>yes</td>\n<td>Language name of the file.</td>\n</tr>\n<tr>\n<td><code>originalSubtitleUrl</code></td>\n<td>string</td>\n<td>no</td>\n<td>Original-language file to compare against.</td>\n</tr>\n<tr>\n<td><code>autodetectLanguage</code></td>\n<td>bool</td>\n<td>no</td>\n<td>Detect the language instead of trusting <code>language</code>.</td>\n</tr>\n<tr>\n<td><code>format</code></td>\n<td>string</td>\n<td>no</td>\n<td>Subtitle format.</td>\n</tr>\n<tr>\n<td><code>importConfigurationId</code></td>\n<td>string</td>\n<td>no</td>\n<td>Import template id.</td>\n</tr>\n</tbody>\n</table>\n</div><p>(The subtitle item model has a few more optional members that are not documented here.)</p>\n<p><strong>Errors</strong>: 400 with <code>[{ \"Message\": \"MediaUrl is required\" }, ...]</code> for invalid input; 500 when the job fails to start.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","automate","d9eefd19-1ddd-4ce9-9f25-f03491ed8f57"],"host":["{{base_url}}"],"query":[{"disabled":true,"description":{"content":"<p>Optional. true allows a second job for a project id that already has one, and skips cached results.</p>\n","type":"text/plain"},"key":"force","value":"false"}],"variable":[]}},"response":[{"id":"beefb6bd-b51c-4ef5-b04a-2716f2342ec9","name":"200 OK - job started","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"action\": \"Syncheck\",\n  \"projectGuid\": \"c43c83f4-38ea-4957-bf44-4bff4d21f8dc\",\n  \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\",\n  \"syncheck\": {\n    \"mediaUrl\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n    \"mediaLanguage\": \"English\",\n    \"asrEngine\": \"AWS\",\n    \"skipContentComparison\": false,\n    \"spotsToCheck\": 3,\n    \"timecodeGraceFrames\": 5,\n    \"textFuzzyMatch\": 50,\n    \"allowedStartSilenceFrames\": 3,\n    \"allowedEndSilenceFrames\": 15,\n    \"subtitles\": [\n      {\n        \"subtitleUrl\": \"https://ooona-public.s3.amazonaws.com/video/MERIDIAN/Meridian.en.srt\",\n        \"language\": \"English\",\n        \"format\": \"SRT\"\n      }\n    ]\n  }\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/automate/aa4f584d-2c67-4b5d-acea-52bcb2d86e37","host":["{{base_url}}"],"path":["external","automate","318cf4f3-4aa3-46a3-adce-4873b54337a6"],"query":[{"key":"force","value":"false","description":"Optional. true allows a second job for a project id that already has one, and skips cached results.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"jobId\": \"9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"status\": \"Running\",\n  \"projectId\": \"6f1c2f8e-2c0e-4a62-9c1f-3b7d5a9e4d10\",\n  \"statusUrl\": \"https://toolkit.example.com/external/automate/status/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"transactionAmount\": 0.35,\n  \"transactionCurrency\": \"USD\",\n  \"transactionDetails\": \"Syncheck 96 seconds\"\n}"},{"id":"99f19c82-ff91-4d9b-8e56-47e4b4ab6a10","name":"400 Invalid input","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"action\": \"Syncheck\",\n  \"projectGuid\": \"2f0d7c04-68ce-4a32-8236-f7dc7e74690c\",\n  \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\",\n  \"syncheck\": {\n    \"mediaUrl\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n    \"mediaLanguage\": \"English\",\n    \"asrEngine\": \"AWS\",\n    \"skipContentComparison\": false,\n    \"spotsToCheck\": 3,\n    \"timecodeGraceFrames\": 5,\n    \"textFuzzyMatch\": 50,\n    \"allowedStartSilenceFrames\": 3,\n    \"allowedEndSilenceFrames\": 15,\n    \"subtitles\": [\n      {\n        \"subtitleUrl\": \"https://ooona-public.s3.amazonaws.com/video/MERIDIAN/Meridian.en.srt\",\n        \"language\": \"English\",\n        \"format\": \"SRT\"\n      }\n    ]\n  }\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/automate/8ba7bfd1-7b0b-4632-8fc6-e2a772006566","host":["{{base_url}}"],"path":["external","automate","5ca08a59-6af2-451c-b8ca-642665eeac64"],"query":[{"key":"force","value":"false","description":"Optional. true allows a second job for a project id that already has one, and skips cached results.","disabled":true}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"Message\": \"MediaUrl is required\"\n  },\n  {\n    \"Message\": \"Subtitles are required\"\n  }\n]"}],"_postman_id":"688e1786-77e5-47f1-a969-36b3a77902bd"},{"name":"Create project","id":"0d41b6a0-e83e-47c6-9484-ab57d807646c","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"action\": \"CreateProject\",\n  \"projectGuid\": \"2b75c9e1-ed68-4c9b-aaf1-158599e65856\",\n  \"projectName\": \"My new project\",\n  \"app\": \"EditPro\",\n  \"video\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n  \"subtitlesUrl\": \"https://ooona-public.s3.amazonaws.com/video/MERIDIAN/Meridian.en.srt\",\n  \"importConfigurationJson\": \"{ \\\"language1\\\": \\\"English\\\", \\\"format\\\": \\\"SRT\\\" }\",\n  \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/automate/13d32e28-1f5f-435c-a862-6ea4fe956baf","description":"<p>Creates (if it does not exist) a Toolkit project through the automation endpoint <strong>without running any engine</strong>. Role: <code>API</code>.</p>\n<p>Action <code>CreateProject</code> must be sent explicitly. The call creates the project (from an empty project, from <code>previousProjectGuid</code>, and/or by importing <code>subtitlesUrl</code>), stores the external request, and returns the <strong>project</strong> (no job, so nothing to poll and no cost). <code>id</code> / <code>projectGuid</code> is the project id. A repeat request for the same project id returns 400 unless <code>force=true</code>.</p>\n<p><strong>Route</strong>: <code>id</code> (optional). <strong>Query</strong>: <code>force</code> (bool, default false).</p>\n<p><strong>Body fields</strong>: <code>action</code> (required, <code>CreateProject</code>), <code>projectGuid</code>, <code>projectName</code>, <code>app</code> (default <code>CreatePro</code>), <code>video</code>, <code>subtitlesUrl</code> / <code>subtitlesFileName</code> (imported with <code>importConfigurationJson.format</code>, or detected from the file extension), <code>previousProjectGuid</code>, <code>importConfigurationJson/Guid</code>, <code>configurationJson/Guid</code>, <code>languageConfigurationJson/Guid</code>, <code>videoConfigurationJson/Guid</code>, <code>callbackUrl</code>, <code>startTC</code>, <code>force</code>. See the folder description for the shared fields.</p>\n<p><strong>Output (200)</strong>: the project document (<code>id</code>, <code>name</code>, <code>app</code>, <code>video</code>, <code>settings</code>, <code>subtitles</code>, <code>originalProject</code>, ...). The full project schema is not detailed here.</p>\n<p><strong>Errors</strong>: 400 job/project already exists, 400 failed import of <code>subtitlesUrl</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","automate","795c2e72-07d5-492c-a016-9ef9f29b4d7e"],"host":["{{base_url}}"],"query":[{"disabled":true,"description":{"content":"<p>Optional. true allows a second job for a project id that already has one, and skips cached results.</p>\n","type":"text/plain"},"key":"force","value":"false"}],"variable":[]}},"response":[{"id":"a83516d7-6f7e-4473-bb26-060b74a8c18c","name":"200 OK - project","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"action\": \"CreateProject\",\n  \"projectGuid\": \"cff8e049-1000-4c63-9994-c20a83222458\",\n  \"projectName\": \"My new project\",\n  \"app\": \"EditPro\",\n  \"video\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n  \"subtitlesUrl\": \"https://ooona-public.s3.amazonaws.com/video/MERIDIAN/Meridian.en.srt\",\n  \"importConfigurationJson\": \"{ \\\"language1\\\": \\\"English\\\", \\\"format\\\": \\\"SRT\\\" }\",\n  \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\"\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/automate/8fbe7c9c-2710-4c4b-aae2-f7f813f5f83c","host":["{{base_url}}"],"path":["external","automate","d72e36fd-002e-4719-8d03-6871f1e2213d"],"query":[{"key":"force","value":"false","description":"Optional. true allows a second job for a project id that already has one, and skips cached results.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"6f1c2f8e-2c0e-4a62-9c1f-3b7d5a9e4d10\",\n  \"name\": \"My new project\",\n  \"app\": \"EditPro\",\n  \"video\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n  \"isAI\": false,\n  \"locked\": false,\n  \"settings\": {\n    \"language1\": \"English\",\n    \"format\": \"SRT\"\n  },\n  \"subtitles\": {\n    \"paragraphs\": []\n  }\n}"},{"id":"907848f4-80ff-4087-873c-cf35f4326d47","name":"400 Already exists","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"action\": \"CreateProject\",\n  \"projectGuid\": \"9706df3b-b0c6-4548-a420-6151ba1ed5b0\",\n  \"projectName\": \"My new project\",\n  \"app\": \"EditPro\",\n  \"video\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n  \"subtitlesUrl\": \"https://ooona-public.s3.amazonaws.com/video/MERIDIAN/Meridian.en.srt\",\n  \"importConfigurationJson\": \"{ \\\"language1\\\": \\\"English\\\", \\\"format\\\": \\\"SRT\\\" }\",\n  \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\"\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/automate/c9339849-f4e1-42f6-aa1c-d27e32cc8758","host":["{{base_url}}"],"path":["external","automate","40751064-8cb6-429c-bb3b-cd3e03f7b3d6"],"query":[{"key":"force","value":"false","description":"Optional. true allows a second job for a project id that already has one, and skips cached results.","disabled":true}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"Message\": \"Automated job for project id 6f1c2f8e-2c0e-4a62-9c1f-3b7d5a9e4d10 already exists.\",\n  \"ExceptionMessage\": \"Automated job for project id 6f1c2f8e-2c0e-4a62-9c1f-3b7d5a9e4d10 already exists.\",\n  \"ExceptionType\": \"ArgumentException\",\n  \"ActionName\": \"Automate\",\n  \"ControllerName\": \"ExternalAutomate\",\n  \"StackTrace\": \"ExternalAutomateController.cs:144\"\n}"}],"_postman_id":"0d41b6a0-e83e-47c6-9484-ab57d807646c"},{"name":"Get job status","id":"6b4c8ced-8967-4a68-bee8-45c88e9be8f4","request":{"method":"GET","header":[],"url":"{{base_url}}/external/automate/status/{{lastJobId}}","description":"<p>Returns the current state of an automation job. Role: <code>API</code>. Poll this (or rely on your <code>callbackUrl</code>) after any Run request.</p>\n<p><strong>Route</strong>: <code>id</code> (required): the Toolkit job <code>id</code>, the engine <code>jobId</code>, the project id, or the id you used in the Run URL. The first job matching any of them is used. <code>{{lastJobId}}</code> is saved by the Run requests.</p>\n<p><strong>Query parameters</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>force</code></td>\n<td>bool</td>\n<td>false</td>\n<td>Bypass the response cache and the shortcut for finished jobs, and re-ask the engine.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Behaviour</strong></p>\n<ul>\n<li>For a running job the engine is asked for fresh status and the job (and its project) is updated when it finishes.</li>\n<li>Responses are cached per id: 29 s while <code>Waiting</code>/<code>Running</code>, 180 s between retries (<code>Retry1</code>-<code>Retry3</code>), 2 h once <code>Success</code>/<code>Failure</code>. Polling more often than that returns the cached copy; use <code>force=true</code> to refresh.</li>\n<li>Jobs that are already <code>Success</code>/<code>Failure</code>, or were created more than 25 hours ago, are answered from the stored state without contacting the engine (unless <code>force</code>).</li>\n<li>Unified jobs include <code>subJobs</code> (one per target language; the root-project job and an unrequested reference language are filtered out). Each sub-job's <code>resultUrls</code> carry <code>?target=&lt;index&gt;</code>.</li>\n<li>Poll no faster than every ~30 s.</li>\n</ul>\n<p><strong>Output (200)</strong>: a job object.</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>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>string</td>\n<td>Toolkit job id. Use it with the status, result and cost endpoints.</td>\n</tr>\n<tr>\n<td><code>jobId</code></td>\n<td>string</td>\n<td>The engine's own job id (may be empty until the engine accepted the job). Also accepted by the status/result/cost endpoints.</td>\n</tr>\n<tr>\n<td><code>projectId</code></td>\n<td>string</td>\n<td>The Toolkit project the result is applied to.</td>\n</tr>\n<tr>\n<td><code>type</code></td>\n<td>string</td>\n<td><code>SpeechToText</code>, <code>Translation</code>, <code>Unified</code>, <code>QualityControl</code>, <code>Syncheck</code>, ...</td>\n</tr>\n<tr>\n<td><code>engine</code></td>\n<td>string</td>\n<td>Engine key, e.g. <code>AWS</code>.</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td><code>Waiting</code>, <code>Running</code>, <code>Success</code>, <code>Failure</code>, <code>Retry1</code>, <code>Retry2</code>, <code>Retry3</code>.</td>\n</tr>\n<tr>\n<td><code>progress</code></td>\n<td>number</td>\n<td>0-100.</td>\n</tr>\n<tr>\n<td><code>sourceLanguage</code> / <code>targetLanguage</code></td>\n<td>string</td>\n<td>Languages of the job.</td>\n</tr>\n<tr>\n<td><code>warning</code> / <code>error</code></td>\n<td>string</td>\n<td>Warning text, and failure reason when <code>status</code> is <code>Failure</code>.</td>\n</tr>\n<tr>\n<td><code>dateCreated</code>, <code>lastUpdated</code>, <code>startedAt</code>, <code>completedAt</code></td>\n<td>ISO date</td>\n<td>Job timestamps (<code>startedAt</code> / <code>completedAt</code> can be null).</td>\n</tr>\n<tr>\n<td><code>transactionId</code>, <code>transactionDetails</code>, <code>transactionAmount</code>, <code>transactionCurrency</code>, <code>transactionPriceFactor</code>, <code>transactionPricePerUnit</code>, <code>transactionUnits</code>, <code>transactionStatus</code></td>\n<td></td>\n<td>The wallet charge of the job (see <em>Get job cost</em>). Cached-result jobs are recorded with 0 cost.</td>\n</tr>\n<tr>\n<td><code>statusUrl</code></td>\n<td>string</td>\n<td>URL of <em>Get job status</em> for this job.</td>\n</tr>\n<tr>\n<td><code>resultUrls</code></td>\n<td>object</td>\n<td><code>raw</code>, <code>srt</code>, <code>vtt</code>, <code>ooona</code> links to <em>Get job result</em>.</td>\n</tr>\n<tr>\n<td><code>subJobs</code></td>\n<td>array</td>\n<td>Unified jobs only: one job object per target language; each has its own <code>resultUrls</code> with <code>?target=&lt;index&gt;</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Errors</strong>: 404 when no job matches the id.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","automate","status","{{lastJobId}}"],"host":["{{base_url}}"],"query":[{"disabled":true,"description":{"content":"<p>Optional. true bypasses the response cache and re-checks the engine.</p>\n","type":"text/plain"},"key":"force","value":"false"}],"variable":[]}},"response":[{"id":"0c44ae3f-94cc-41ce-93f5-833ac6eafb2e","name":"200 OK - running","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/automate/status/{{lastJobId}}","host":["{{base_url}}"],"path":["external","automate","status","{{lastJobId}}"],"query":[{"key":"force","value":"false","description":"Optional. true bypasses the response cache and re-checks the engine.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"email\": \"api@example.com\",\n  \"projectId\": \"6f1c2f8e-2c0e-4a62-9c1f-3b7d5a9e4d10\",\n  \"type\": \"SpeechToText\",\n  \"jobId\": \"53b70a1f8e2d4c6b82a4f1e5a0c7b3d9\",\n  \"mediaId\": null,\n  \"sourceLanguage\": \"English\",\n  \"targetLanguage\": null,\n  \"status\": \"Running\",\n  \"progress\": 45,\n  \"warning\": null,\n  \"error\": null,\n  \"dateCreated\": \"2026-10-15T09:00:00Z\",\n  \"lastUpdated\": \"2026-10-15T09:00:12Z\",\n  \"startedAt\": \"2026-10-15T09:00:02Z\",\n  \"completedAt\": null,\n  \"engine\": \"AWS\",\n  \"transactionId\": \"b2f7d3a1-5c4e-4f60-9a8b-1e2d3c4b5a69\",\n  \"transactionDetails\": \"\",\n  \"transactionAmount\": 0.0,\n  \"transactionCurrency\": \"USD\",\n  \"transactionPriceFactor\": \"Second\",\n  \"transactionPricePerUnit\": 0.0,\n  \"transactionUnits\": 96.0,\n  \"transactionStatus\": \"Pending\",\n  \"statusUrl\": \"https://toolkit.example.com/external/automate/status/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"resultUrls\": {\n    \"raw\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n    \"srt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/srt\",\n    \"vtt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/vtt\",\n    \"ooona\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/ooona\"\n  },\n  \"subJobs\": null\n}"},{"id":"16b0d9c9-ea20-436d-b0a0-b46b9b277616","name":"200 OK - success","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/automate/status/{{lastJobId}}","host":["{{base_url}}"],"path":["external","automate","status","{{lastJobId}}"],"query":[{"key":"force","value":"false","description":"Optional. true bypasses the response cache and re-checks the engine.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"email\": \"api@example.com\",\n  \"projectId\": \"6f1c2f8e-2c0e-4a62-9c1f-3b7d5a9e4d10\",\n  \"type\": \"SpeechToText\",\n  \"jobId\": \"53b70a1f8e2d4c6b82a4f1e5a0c7b3d9\",\n  \"mediaId\": null,\n  \"sourceLanguage\": \"English\",\n  \"targetLanguage\": null,\n  \"status\": \"Success\",\n  \"progress\": 100,\n  \"warning\": null,\n  \"error\": null,\n  \"dateCreated\": \"2026-10-15T09:00:00Z\",\n  \"lastUpdated\": \"2026-10-15T09:00:12Z\",\n  \"startedAt\": \"2026-10-15T09:00:02Z\",\n  \"completedAt\": \"2026-10-15T09:02:40Z\",\n  \"engine\": \"AWS\",\n  \"transactionId\": \"b2f7d3a1-5c4e-4f60-9a8b-1e2d3c4b5a69\",\n  \"transactionDetails\": \"AWS Transcribe job 0.00040000$x96 seconds\",\n  \"transactionAmount\": 0.0384,\n  \"transactionCurrency\": \"USD\",\n  \"transactionPriceFactor\": \"Second\",\n  \"transactionPricePerUnit\": 0.0004,\n  \"transactionUnits\": 96.0,\n  \"transactionStatus\": \"Success\",\n  \"statusUrl\": \"https://toolkit.example.com/external/automate/status/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"resultUrls\": {\n    \"raw\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n    \"srt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/srt\",\n    \"vtt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/vtt\",\n    \"ooona\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/ooona\"\n  },\n  \"subJobs\": null\n}"},{"id":"e109d403-a499-4458-a7d1-998b14649d4c","name":"200 OK - failure","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/automate/status/{{lastJobId}}","host":["{{base_url}}"],"path":["external","automate","status","{{lastJobId}}"],"query":[{"key":"force","value":"false","description":"Optional. true bypasses the response cache and re-checks the engine.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"email\": \"api@example.com\",\n  \"projectId\": \"6f1c2f8e-2c0e-4a62-9c1f-3b7d5a9e4d10\",\n  \"type\": \"Translation\",\n  \"jobId\": \"53b70a1f8e2d4c6b82a4f1e5a0c7b3d9\",\n  \"mediaId\": null,\n  \"sourceLanguage\": \"English\",\n  \"targetLanguage\": \"Spanish\",\n  \"status\": \"Failure\",\n  \"progress\": 100,\n  \"warning\": null,\n  \"error\": \"The engine rejected the request: unsupported language pair\",\n  \"dateCreated\": \"2026-10-15T09:00:00Z\",\n  \"lastUpdated\": \"2026-10-15T09:00:12Z\",\n  \"startedAt\": \"2026-10-15T09:00:02Z\",\n  \"completedAt\": null,\n  \"engine\": \"AWS\",\n  \"transactionId\": \"b2f7d3a1-5c4e-4f60-9a8b-1e2d3c4b5a69\",\n  \"transactionDetails\": \"\",\n  \"transactionAmount\": 0.0,\n  \"transactionCurrency\": \"USD\",\n  \"transactionPriceFactor\": \"Second\",\n  \"transactionPricePerUnit\": 0.0,\n  \"transactionUnits\": 96.0,\n  \"transactionStatus\": \"Pending\",\n  \"statusUrl\": \"https://toolkit.example.com/external/automate/status/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"resultUrls\": {\n    \"raw\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n    \"srt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/srt\",\n    \"vtt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/vtt\",\n    \"ooona\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/ooona\"\n  },\n  \"subJobs\": null\n}"},{"id":"0e07c743-1589-41f9-ac64-ea590a1eb85f","name":"200 OK - unified with sub-jobs","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/automate/status/{{lastJobId}}","host":["{{base_url}}"],"path":["external","automate","status","{{lastJobId}}"],"query":[{"key":"force","value":"false","description":"Optional. true bypasses the response cache and re-checks the engine.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"email\": \"api@example.com\",\n  \"projectId\": \"6f1c2f8e-2c0e-4a62-9c1f-3b7d5a9e4d10\",\n  \"type\": \"Unified\",\n  \"jobId\": \"53b70a1f8e2d4c6b82a4f1e5a0c7b3d9\",\n  \"mediaId\": null,\n  \"sourceLanguage\": \"English\",\n  \"targetLanguage\": null,\n  \"status\": \"Running\",\n  \"progress\": 40,\n  \"warning\": null,\n  \"error\": null,\n  \"dateCreated\": \"2026-10-15T09:00:00Z\",\n  \"lastUpdated\": \"2026-10-15T09:00:12Z\",\n  \"startedAt\": \"2026-10-15T09:00:02Z\",\n  \"completedAt\": null,\n  \"engine\": \"OoonaAI\",\n  \"transactionId\": \"b2f7d3a1-5c4e-4f60-9a8b-1e2d3c4b5a69\",\n  \"transactionDetails\": \"\",\n  \"transactionAmount\": 0.0,\n  \"transactionCurrency\": \"USD\",\n  \"transactionPriceFactor\": \"Second\",\n  \"transactionPricePerUnit\": 0.0,\n  \"transactionUnits\": 96.0,\n  \"transactionStatus\": \"Pending\",\n  \"statusUrl\": \"https://toolkit.example.com/external/automate/status/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"resultUrls\": {\n    \"raw\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n    \"srt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/srt\",\n    \"vtt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/vtt\",\n    \"ooona\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/ooona\"\n  },\n  \"subJobs\": [\n    {\n      \"id\": \"9d3b7c0a5e1f4a28b6c4d2e8f1a07b31\",\n      \"email\": \"api@example.com\",\n      \"projectId\": \"11111111-aaaa-4aaa-8aaa-111111111111\",\n      \"type\": \"Unified\",\n      \"jobId\": \"13b70a1f8e2d4c6b82a4f1e5a0c7b3d9\",\n      \"mediaId\": null,\n      \"sourceLanguage\": \"English\",\n      \"targetLanguage\": \"Spanish\",\n      \"status\": \"Running\",\n      \"progress\": 10,\n      \"warning\": null,\n      \"error\": null,\n      \"dateCreated\": \"2026-10-15T09:00:00Z\",\n      \"lastUpdated\": \"2026-10-15T09:00:12Z\",\n      \"startedAt\": \"2026-10-15T09:00:02Z\",\n      \"completedAt\": null,\n      \"engine\": \"OoonaAI\",\n      \"transactionId\": \"b2f7d3a1-5c4e-4f60-9a8b-1e2d3c4b5a69\",\n      \"transactionDetails\": \"\",\n      \"transactionAmount\": 0.0,\n      \"transactionCurrency\": \"USD\",\n      \"transactionPriceFactor\": \"Second\",\n      \"transactionPricePerUnit\": 0.0,\n      \"transactionUnits\": 96.0,\n      \"transactionStatus\": \"Pending\",\n      \"statusUrl\": \"https://toolkit.example.com/external/automate/status/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n      \"resultUrls\": {\n        \"raw\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35?target=0\",\n        \"srt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/srt?target=0\",\n        \"vtt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/vtt?target=0\",\n        \"ooona\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/ooona?target=0\"\n      },\n      \"subJobs\": null\n    },\n    {\n      \"id\": \"9d3b7c0a5e1f4a28b6c4d2e8f1a07b32\",\n      \"email\": \"api@example.com\",\n      \"projectId\": \"22222222-bbbb-4bbb-8bbb-222222222222\",\n      \"type\": \"Unified\",\n      \"jobId\": \"23b70a1f8e2d4c6b82a4f1e5a0c7b3d9\",\n      \"mediaId\": null,\n      \"sourceLanguage\": \"English\",\n      \"targetLanguage\": \"French\",\n      \"status\": \"Running\",\n      \"progress\": 10,\n      \"warning\": null,\n      \"error\": null,\n      \"dateCreated\": \"2026-10-15T09:00:00Z\",\n      \"lastUpdated\": \"2026-10-15T09:00:12Z\",\n      \"startedAt\": \"2026-10-15T09:00:02Z\",\n      \"completedAt\": null,\n      \"engine\": \"OoonaAI\",\n      \"transactionId\": \"b2f7d3a1-5c4e-4f60-9a8b-1e2d3c4b5a69\",\n      \"transactionDetails\": \"\",\n      \"transactionAmount\": 0.0,\n      \"transactionCurrency\": \"USD\",\n      \"transactionPriceFactor\": \"Second\",\n      \"transactionPricePerUnit\": 0.0,\n      \"transactionUnits\": 96.0,\n      \"transactionStatus\": \"Pending\",\n      \"statusUrl\": \"https://toolkit.example.com/external/automate/status/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n      \"resultUrls\": {\n        \"raw\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35?target=1\",\n        \"srt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/srt?target=1\",\n        \"vtt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/vtt?target=1\",\n        \"ooona\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/ooona?target=1\"\n      },\n      \"subJobs\": null\n    },\n    {\n      \"id\": \"9d3b7c0a5e1f4a28b6c4d2e8f1a07b33\",\n      \"email\": \"api@example.com\",\n      \"projectId\": \"33333333-cccc-4ccc-8ccc-333333333333\",\n      \"type\": \"Unified\",\n      \"jobId\": \"33b70a1f8e2d4c6b82a4f1e5a0c7b3d9\",\n      \"mediaId\": null,\n      \"sourceLanguage\": \"English\",\n      \"targetLanguage\": \"Hebrew\",\n      \"status\": \"Running\",\n      \"progress\": 10,\n      \"warning\": null,\n      \"error\": null,\n      \"dateCreated\": \"2026-10-15T09:00:00Z\",\n      \"lastUpdated\": \"2026-10-15T09:00:12Z\",\n      \"startedAt\": \"2026-10-15T09:00:02Z\",\n      \"completedAt\": null,\n      \"engine\": \"OoonaAI\",\n      \"transactionId\": \"b2f7d3a1-5c4e-4f60-9a8b-1e2d3c4b5a69\",\n      \"transactionDetails\": \"\",\n      \"transactionAmount\": 0.0,\n      \"transactionCurrency\": \"USD\",\n      \"transactionPriceFactor\": \"Second\",\n      \"transactionPricePerUnit\": 0.0,\n      \"transactionUnits\": 96.0,\n      \"transactionStatus\": \"Pending\",\n      \"statusUrl\": \"https://toolkit.example.com/external/automate/status/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n      \"resultUrls\": {\n        \"raw\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35?target=2\",\n        \"srt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/srt?target=2\",\n        \"vtt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/vtt?target=2\",\n        \"ooona\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/ooona?target=2\"\n      },\n      \"subJobs\": null\n    }\n  ]\n}"},{"id":"44c6ecdf-b6b8-4f94-9d11-2cdacc0f122d","name":"404 Not found","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/automate/status/{{lastJobId}}","host":["{{base_url}}"],"path":["external","automate","status","{{lastJobId}}"],"query":[{"key":"force","value":"false","description":"Optional. true bypasses the response cache and re-checks the engine.","disabled":true}]}},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"Message\": \"No HTTP resource was found that matches the request URI.\"\n}"}],"_postman_id":"6b4c8ced-8967-4a68-bee8-45c88e9be8f4"},{"name":"Get job result","id":"3583542b-e9e6-4b22-a27f-50c0f16497e9","request":{"method":"GET","header":[],"url":"{{base_url}}/external/automate/result/{{lastJobId}}/srt","description":"<p>Downloads the result of an automation job in the requested format. Role: <code>API</code>. Call it once <strong>Get job status</strong> reports <code>Success</code>.</p>\n<p><strong>Route</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>yes</td>\n<td>Job <code>id</code>, engine <code>jobId</code>, project id or Run id (same lookup as the status call).</td>\n</tr>\n<tr>\n<td><code>format</code></td>\n<td>no</td>\n<td><code>ooona</code> (default), <code>srt</code>, <code>vtt</code> or <code>json</code>. Case-insensitive. Any other value returns 400.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Query parameters</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>target</code></td>\n<td>string</td>\n<td>Unified jobs only: pick one target language's result by <strong>index</strong> into <code>subJobs</code> (<code>0</code>, <code>1</code>, ...) or by <strong>language name</strong> (e.g. <code>Spanish</code>). Using it on a non-Unified job returns 400.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output</strong></p>\n<ul>\n<li><code>Success</code> and format <code>ooona</code> / <code>srt</code> / <code>vtt</code>: the subtitles as a <strong>file download</strong> in that format (the timecodes of ASR and Unified results are shifted by <code>startTC</code> when one was given; MT results keep the source timing). <code>ooona</code> is the Toolkit's own JSON subtitle format.</li>\n<li>Format <code>json</code>, or a job that is not <code>Success</code> yet: <code>{ \"jobId\", \"status\", \"result\", \"errors\" }</code>, where <code>result</code> is the engine's structured result (a string/JSON) and <code>errors</code> the failure text, if any.</li>\n<li>Syncheck jobs always return the structured JSON (<code>format</code> is ignored).</li>\n<li>A successful job with no stored result returns <code>{ jobId, status, result: \"\" }</code>.</li>\n</ul>\n<p><strong>Errors</strong>: 404 unknown job, or <code>target</code> language not found; 400 <code>Target-specific results are only available for unified jobs</code>; 400 <code>Job has no sub-jobs</code>; 400 <code>Target index N out of range (0-M)</code>; 400 (empty body) for an unsupported <code>format</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","automate","result","{{lastJobId}}","srt"],"host":["{{base_url}}"],"query":[{"disabled":true,"description":{"content":"<p>Optional, Unified jobs only: sub-job index (0, 1, ...) or target language name.</p>\n","type":"text/plain"},"key":"target","value":""}],"variable":[]}},"response":[{"id":"5dd85f11-9e21-4359-bbe3-7c417c977842","name":"200 OK - srt","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/automate/result/{{lastJobId}}/srt","host":["{{base_url}}"],"path":["external","automate","result","{{lastJobId}}","srt"],"query":[{"key":"target","value":"","description":"Optional, Unified jobs only: sub-job index (0, 1, ...) or target language name.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"application/octet-stream"}],"cookie":[],"responseTime":null,"body":"1\n00:00:26,022 --> 00:00:29,625\nSo these guys just disappeared?\n\n2\n00:00:31,000 --> 00:00:36,000\nYeah, on that stretch of road just\nabove El Matador. You know it?"},{"id":"c9ee18b7-0a4e-4d6e-b5e9-73cebaa58e59","name":"200 OK - vtt","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/automate/result/{{lastJobId}}/vtt","host":["{{base_url}}"],"path":["external","automate","result","{{lastJobId}}","vtt"],"query":[{"key":"target","value":"","description":"Optional, Unified jobs only: sub-job index (0, 1, ...) or target language name.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"application/octet-stream"}],"cookie":[],"responseTime":null,"body":"WEBVTT\n\n00:00:26.022 --> 00:00:29.625\nSo these guys just disappeared?\n\n00:00:31.000 --> 00:00:36.000\nYeah, on that stretch of road just\nabove El Matador. You know it?"},{"id":"24299b1f-16cd-4a97-bd22-3f0a510d74c3","name":"200 OK - json","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/automate/result/{{lastJobId}}/json","host":["{{base_url}}"],"path":["external","automate","result","{{lastJobId}}","json"],"query":[{"key":"target","value":"","description":"Optional, Unified jobs only: sub-job index (0, 1, ...) or target language name.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"jobId\": \"53b70a1f8e2d4c6b82a4f1e5a0c7b3d9\",\n  \"status\": \"Success\",\n  \"result\": \"{\\\"results\\\":{\\\"transcripts\\\":[{\\\"transcript\\\":\\\"So these guys just disappeared?\\\"}]}}\",\n  \"errors\": null\n}"},{"id":"9033d415-5c1e-4509-8da9-311c322b5897","name":"200 OK - not finished","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/automate/result/{{lastJobId}}/srt","host":["{{base_url}}"],"path":["external","automate","result","{{lastJobId}}","srt"],"query":[{"key":"target","value":"","description":"Optional, Unified jobs only: sub-job index (0, 1, ...) or target language name.","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"jobId\": \"53b70a1f8e2d4c6b82a4f1e5a0c7b3d9\",\n  \"status\": \"Running\",\n  \"result\": null,\n  \"errors\": null\n}"},{"id":"29cf7bdc-f586-4e2d-9989-980367b66c56","name":"400 Unsupported format","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/automate/result/{{lastJobId}}/docx","host":["{{base_url}}"],"path":["external","automate","result","{{lastJobId}}","docx"],"query":[{"key":"target","value":"","description":"Optional, Unified jobs only: sub-job index (0, 1, ...) or target language name.","disabled":true}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"text/plain"}],"cookie":[],"responseTime":null,"body":"\"\""},{"id":"6b5cce3a-0e09-45c4-b05a-8d80d6c6633f","name":"404 Not found","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/automate/result/{{lastJobId}}/srt","host":["{{base_url}}"],"path":["external","automate","result","{{lastJobId}}","srt"],"query":[{"key":"target","value":"","description":"Optional, Unified jobs only: sub-job index (0, 1, ...) or target language name.","disabled":true}]}},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"Message\": \"No HTTP resource was found that matches the request URI.\"\n}"}],"_postman_id":"3583542b-e9e6-4b22-a27f-50c0f16497e9"},{"name":"Get unified job result by language","id":"ff4dac54-b45c-4428-8674-7dee0ae2f3c0","request":{"method":"GET","header":[],"url":"{{base_url}}/external/automate/result/{{lastJobId}}/srt?target=Spanish","description":"<p>Downloads one target language of a <strong>Unified</strong> job as an SRT file. Same endpoint and rules as <strong>Get job result</strong>; the <code>target</code> query parameter selects the sub-job by language name (<code>Spanish</code>) or by index into <code>subJobs</code> (<code>0</code>). Role: <code>API</code>.</p>\n<p><strong>Errors</strong>: 404 when no sub-job has that language; 400 when the index is out of range, the job has no sub-jobs, or the job is not a Unified job.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","automate","result","{{lastJobId}}","srt"],"host":["{{base_url}}"],"query":[{"description":{"content":"<p>Sub-job index (0, 1, ...) or target language name.</p>\n","type":"text/plain"},"key":"target","value":"Spanish"}],"variable":[]}},"response":[{"id":"98019012-5b83-445b-8601-0107e0f89bed","name":"200 OK - srt","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/automate/result/{{lastJobId}}/srt?target=Spanish","host":["{{base_url}}"],"path":["external","automate","result","{{lastJobId}}","srt"],"query":[{"key":"target","value":"Spanish","description":"Sub-job index (0, 1, ...) or target language name."}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"application/octet-stream"}],"cookie":[],"responseTime":null,"body":"1\n00:00:26,022 --> 00:00:29,625\nAsí que estos tipos simplemente desaparecieron?\n\n2\n00:00:31,000 --> 00:00:36,000\nYeah, on that stretch of road just\nabove El Matador. You know it?"},{"id":"ad202f3d-6d20-4dac-90af-f9e92a9e4832","name":"400 Target index out of range","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/automate/result/{{lastJobId}}/srt?target=Spanish","host":["{{base_url}}"],"path":["external","automate","result","{{lastJobId}}","srt"],"query":[{"key":"target","value":"Spanish","description":"Sub-job index (0, 1, ...) or target language name."}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"Target index 7 out of range (0-2)\""}],"_postman_id":"ff4dac54-b45c-4428-8674-7dee0ae2f3c0"},{"name":"Get job cost","id":"e0860077-23c3-4496-8282-2b0e0ab1aa70","request":{"method":"GET","header":[],"url":"{{base_url}}/external/automate/cost/{{lastJobId}}","description":"<p>Returns what a job (or every job of a project) cost: a summary and the full list of wallet transactions. Role: <code>API</code>.</p>\n<p><strong>Route</strong>: <code>id</code> (required): matched against the job <code>id</code>, the engine <code>jobId</code>, the <strong>project id</strong> or the engine input key. All matching jobs are included, so a project id returns the total for every job run on that project (for example the root and all language jobs of a Unified run).</p>\n<p><strong>Output (200)</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>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>string</td>\n<td>The id you sent.</td>\n</tr>\n<tr>\n<td><code>isProjectId</code></td>\n<td>bool</td>\n<td>True when the id matched at least one job's project id.</td>\n</tr>\n<tr>\n<td><code>totalAmount</code></td>\n<td>number</td>\n<td>Sum of the transactions with status <code>Success</code> or <code>Pending</code>.</td>\n</tr>\n<tr>\n<td><code>currency</code></td>\n<td>string</td>\n<td>Currency of the total (<code>USD</code> when none).</td>\n</tr>\n<tr>\n<td><code>jobCount</code></td>\n<td>int</td>\n<td>Number of matching jobs.</td>\n</tr>\n<tr>\n<td><code>transactions</code></td>\n<td>array</td>\n<td>Oldest first; each has the fields below.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Transaction fields: <code>transactionId</code>, <code>jobId</code>, <code>engine</code>, <code>type</code> (job type), <code>status</code> (<code>Pending</code>, <code>Success</code>, <code>Failure</code>, <code>InDoubt</code>; only <code>Success</code> and <code>Pending</code> count towards the total), <code>priceFactor</code> (<code>Second</code>, <code>Minute</code>, <code>Hour</code>, <code>Character</code>, <code>Word</code>), <code>pricePerUnit</code>, <code>units</code>, <code>amount</code>, <code>currency</code> (default <code>USD</code>), <code>details</code>, <code>dateCreated</code>. Cached-result jobs show 0-amount transactions.</p>\n<p><strong>Errors</strong>: 404 when no job matches the id.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","automate","cost","{{lastJobId}}"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"3e7c735e-eab5-44a6-a92d-2eb454ee1feb","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/automate/cost/{{lastJobId}}"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"6f1c2f8e-2c0e-4a62-9c1f-3b7d5a9e4d10\",\n  \"isProjectId\": true,\n  \"totalAmount\": 0.2091,\n  \"currency\": \"USD\",\n  \"jobCount\": 2,\n  \"transactions\": [\n    {\n      \"transactionId\": \"b2f7d3a1-5c4e-4f60-9a8b-1e2d3c4b5a69\",\n      \"jobId\": \"9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n      \"engine\": \"AWS\",\n      \"type\": \"SpeechToText\",\n      \"status\": \"Success\",\n      \"priceFactor\": \"Second\",\n      \"pricePerUnit\": 0.0004,\n      \"units\": 96,\n      \"amount\": 0.0384,\n      \"currency\": \"USD\",\n      \"details\": \"AWS Transcribe job 0.00040000$x96 seconds\",\n      \"dateCreated\": \"2026-10-15T09:00:01Z\"\n    },\n    {\n      \"transactionId\": \"c4d1e8f2-7a3b-4c95-8e60-2f1a0b9c8d7e\",\n      \"jobId\": \"5e6f7a8b9c0d4e1fa2b3c4d5e6f7a8b9\",\n      \"engine\": \"AWS\",\n      \"type\": \"Translation\",\n      \"status\": \"Success\",\n      \"priceFactor\": \"Character\",\n      \"pricePerUnit\": 1.5e-05,\n      \"units\": 11380,\n      \"amount\": 0.1707,\n      \"currency\": \"USD\",\n      \"details\": \"AWS Translation job 0.00001500$x11380 characters\",\n      \"dateCreated\": \"2026-10-15T09:05:30Z\"\n    }\n  ]\n}"},{"id":"5518869d-e0a8-43cc-b303-6d41bf469ee1","name":"404 Not found","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/automate/cost/{{lastJobId}}"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"Message\": \"No HTTP resource was found that matches the request URI.\"\n}"}],"_postman_id":"e0860077-23c3-4496-8282-2b0e0ab1aa70"}],"id":"a352ea82-66d1-4bf7-8d67-6f1735524a67","description":"<p>Automation endpoints run AI engines (speech-to-text, machine translation, unified AI processing, QC, ...) against a video or a subtitles file, track the resulting job, and return the result as a project or as a file.</p>\n<p>All endpoints need an API token (role <code>API</code>); only <em>Get engines</em> and <em>Engine languages</em> also accept <code>UserAPI</code>.</p>\n<ul>\n<li><em><strong>Running 3rd party engines on your dedicated instance will be possible after signing a dedicated end-user license agreement.</strong></em></li>\n</ul>\n<h2 id=\"typical-flow\">Typical flow</h2>\n<ol>\n<li><code>GET external/engines</code> and <code>GET external/languages/{engine}</code> to see what is available.</li>\n<li>Optionally <code>POST external/automate/price</code> to estimate the cost.</li>\n<li><code>POST external/automate/{id}</code> to start a job. The id you choose becomes the project id (and external request id); omit it to get a generated GUID.</li>\n<li>Poll <code>GET external/automate/status/{id}</code> (or wait for your <code>callbackUrl</code>).</li>\n<li><code>GET external/automate/result/{id}/{format}</code> to download the result, and <code>GET external/automate/cost/{id}</code> for the charge.</li>\n</ol>\n<h2 id=\"run-request-body-post-externalautomateid\">Run request body (<code>POST external/automate/{id?}</code>)</h2>\n<p>The body is JSON. The action is taken from <code>action</code>, or inferred from the <code>engine</code> prefix: <code>ASR_</code> = Transcribe, <code>MT_</code> = Translate, <code>Unified_</code> = Unified, <code>QC_</code> = QC, <code>TTS_</code> = VoiceOver (not implemented). Any other prefix (or no engine and no action) returns 400.</p>\n<p>Supported <code>action</code> values: <code>CreateProject</code>, <code>Transcribe</code>, <code>Translate</code>, <code>Syncheck</code>, <code>Unified</code>, <code>QC</code>. <code>Transcode</code>, <code>VoiceOver</code>, <code>Validate</code> and <code>Sync</code> return 501 (not implemented). <code>FileTranslation</code> is accepted by the model but not handled by this endpoint: nothing is run and the stored request record is returned.</p>\n<h3 id=\"fields-shared-by-every-action\">Fields shared by every action</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>engine</code></td>\n<td>string</td>\n<td><code>TYPE_Name</code> as listed by <em>Get engines</em>, e.g. <code>ASR_AWS</code>, <code>MT_AWS</code>, <code>Unified_OoonaAI</code>, <code>QC_OpenAI</code>. Required unless <code>action</code> is given (and needed by every action except <code>CreateProject</code> / <code>Syncheck</code>).</td>\n</tr>\n<tr>\n<td><code>action</code></td>\n<td>string</td>\n<td>See above. Optional when <code>engine</code> has a recognised prefix.</td>\n</tr>\n<tr>\n<td><code>projectGuid</code></td>\n<td>string</td>\n<td>Id of the project the result goes to. Defaults to the id in the URL. Reused if the project already exists.</td>\n</tr>\n<tr>\n<td><code>projectName</code></td>\n<td>string</td>\n<td>Name for a newly created project.</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>App the project opens in. Defaults: <code>CreatePro</code> (ASR, QC, CreateProject), <code>TranslatePro</code> (MT), <code>EditPro</code> for Unified target projects.</td>\n</tr>\n<tr>\n<td><code>video</code></td>\n<td>string</td>\n<td>Media URL (S3 URLs are re-signed when possible).</td>\n</tr>\n<tr>\n<td><code>duration</code></td>\n<td>number</td>\n<td>Media duration in seconds. Used for ASR pricing / ASR media duration.</td>\n</tr>\n<tr>\n<td><code>subtitlesUrl</code>, <code>subtitlesFileName</code></td>\n<td>string</td>\n<td>Subtitles file to import into the new project (MT, QC, CreateProject). Format comes from <code>importConfigurationJson</code>, or from the file extension when that is missing or generic.</td>\n</tr>\n<tr>\n<td><code>previousProjectGuid</code></td>\n<td>string</td>\n<td>Existing project to copy (subtitles, original text) into the new one. Also the key of the translation cache.</td>\n</tr>\n<tr>\n<td><code>startTC</code></td>\n<td>string</td>\n<td>Start timecode of the media; applied to ASR / Unified results.</td>\n</tr>\n<tr>\n<td><code>callbackUrl</code></td>\n<td>string</td>\n<td>Called with the job outcome (and exported files on success) when the job finishes.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>Owner/notification email stored with the request.</td>\n</tr>\n<tr>\n<td><code>force</code></td>\n<td>bool</td>\n<td>Same as the <code>force</code> query param: allow a second job for the same project, and skip cached results.</td>\n</tr>\n<tr>\n<td><code>features</code></td>\n<td>string[] or object</td>\n<td>Feature names (or <code>{name: bool}</code>); used for price estimates.</td>\n</tr>\n<tr>\n<td><code>configurationJson</code> / <code>configurationGuid</code></td>\n<td>string</td>\n<td>Base project settings (JSON or template id).</td>\n</tr>\n<tr>\n<td><code>languageConfigurationJson</code> / <code>languageConfigurationGuid</code></td>\n<td>string</td>\n<td>Language settings, merged over the base.</td>\n</tr>\n<tr>\n<td><code>videoConfigurationJson</code> / <code>videoConfigurationGuid</code></td>\n<td>string</td>\n<td>Video settings (fps, ...), merged over the base.</td>\n</tr>\n<tr>\n<td><code>importConfigurationJson</code> / <code>importConfigurationGuid</code></td>\n<td>string</td>\n<td>How to read the source. <code>language1</code> is the <strong>source/media language</strong> for ASR and MT.</td>\n</tr>\n<tr>\n<td><code>exportConfigurationJson</code> / <code>exportConfigurationGuid</code></td>\n<td>string</td>\n<td>How to write the result. For MT, <code>language1</code> is the <strong>target language</strong> and <code>format</code> / <code>extension</code> picks the file format returned in realtime mode.</td>\n</tr>\n<tr>\n<td><code>previousConfigurationJson/Guid</code>, <code>previousImportConfigurationJson/Guid</code>, <code>previousExportConfigurationJson/Guid</code>, <code>previousLanguageConfigurationJson/Guid</code>, <code>previousVideoConfigurationJson/Guid</code></td>\n<td>string</td>\n<td>Fallbacks used when the matching non-<code>previous</code> value is empty.</td>\n</tr>\n</tbody>\n</table>\n</div><p>JSON values such as <code>importConfigurationJson</code> are <strong>strings containing JSON</strong> (escape the quotes).</p>\n<p>The model also accepts many project-opening / UI fields (<code>requestId</code>, <code>ip</code>, <code>roles</code>, <code>editConfiguration</code>, <code>allowDownload</code>, <code>allowUpload</code>, <code>allowMediaOpen</code>, <code>allowUnlock</code>, <code>allowShare</code>, <code>userUrl</code>, <code>taskCompleteUrl</code>, <code>fileNamingJson</code>, <code>fileNamingId</code>, <code>mediaId</code>, ...). The Automate action does not read them to run an engine.</p>\n<h2 id=\"errors\">Errors</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>When</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>400</td>\n<td>Missing/unknown engine or action, a job already exists for the project id (and <code>force</code> is not set), the id is already used, empty text to translate/check, invalid Syncheck input.</td>\n</tr>\n<tr>\n<td>401</td>\n<td>Missing/invalid token, or the instance lacks the API feature.</td>\n</tr>\n<tr>\n<td>404</td>\n<td>Job / engine not found (status, result, cost, languages).</td>\n</tr>\n<tr>\n<td>501</td>\n<td>Action not implemented.</td>\n</tr>\n<tr>\n<td>500</td>\n<td>Engine or server failure; the body carries <code>ExceptionMessage</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Error bodies look like <code>{ \"Message\": \"...\", \"ExceptionMessage\": \"...\", \"ExceptionType\": \"ArgumentException\" }</code>.</p>\n","_postman_id":"a352ea82-66d1-4bf7-8d67-6f1735524a67","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"🔄 Convert","item":[{"name":"Convert","item":[{"name":"Convert a file","id":"e211c9ac-dc1e-4e28-9fdf-9ef491e5d3a8","request":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"","type":"file","description":"<p>Subtitle file to convert (required). Only the first file is used.</p>\n","value":""},{"key":"importOverrides","value":"{\"fps\":25}","type":"text","description":"<p>Optional JSON object overriding import configuration properties, e.g. {\"format\":\"SRT\",\"fps\":25}.</p>\n"},{"key":"exportOverrides","value":"{\"fps\":23.976}","type":"text","description":"<p>Optional JSON object overriding export configuration properties, e.g. {\"format\":\"WebVTT\",\"fps\":23.976}.</p>\n"}]},"url":"{{base_url}}/external/convert/SRT/WebVTT?offset=0&offsetBefore=&offsetAfter=&startTC=&removeSegments=&addSegments=&keepSegments=&validate=false&fixDuration=&ignoreWarnings=false","description":"<p>Converts the uploaded subtitle file from one format to another, optionally retiming it on the way. Role: <code>API</code> or <code>UserAPI</code>.</p>\n<p><strong>Behaviour</strong></p>\n<ul>\n<li>Reads the first file of the multipart body, imports it, applies the retiming steps, converts the frame rate, validates and exports it.</li>\n<li>Order of operations: <code>offsetBefore</code>, then <code>keepSegments</code> (or <code>removeSegments</code> then <code>addSegments</code>), then <code>offset</code>, <code>startTC</code> and frame-rate conversion, then <code>fixDuration</code>, then <code>offsetAfter</code>.</li>\n<li><strong>Synchronous</strong> (all text formats): <code>200 OK</code> and the converted file as the response body (attachment, content type derived from the output extension). Each successful call counts once against the Convert API usage.</li>\n<li><strong>Asynchronous</strong> (image-based export formats, category <code>DVDImages</code>): <code>201 Created</code> with a JSON body that contains <code>jobId</code>. Poll <em>Get conversion job status</em>, then call <em>Download conversion result</em>.</li>\n<li>Warnings are returned in the <code>ooona-warnings</code> header (JSON array of strings) unless <code>ignoreWarnings=true</code>. With <code>validate=true</code>, validation problems (missing start time, negative or zero duration, overlapping subtitles) fail the request instead of being added to the warnings.</li>\n<li>If the file contains no subtitles the request fails with <code>Nothing to export. Imported file seems to be empty.</code></li>\n<li>A transient database failure is retried once automatically.</li>\n</ul>\n<h2 id=\"route-parameters\">Route parameters</h2>\n<p>Both route segments are optional (<code>external/convert</code>, <code>external/convert/{import}</code> and <code>external/convert/{import}/{export}</code> are all valid). Use <code>null</code> or an empty value as a placeholder when you need to skip the first segment but set the second.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Segment</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>importConfigurationId</code></td>\n<td>How the uploaded file is read. One of: a template <strong>Id</strong> or <strong>name</strong> (your own or a global <em>import</em> template, see <code>external/templates</code>), a <strong>format key</strong> from <code>GET external/formats</code> (e.g. <code>SRT</code>, <code>WebVTT</code>; uses default settings for that format), or <code>auto</code> / omitted (the format is detected from the file extension). An unknown value that is neither a template nor a format key answers 400 <code>Import configuration not found.</code>; a file whose format cannot be detected answers the same, followed by <code> Export configuration not found.</code> when the export side is also not a template.</td>\n</tr>\n<tr>\n<td><code>exportConfigurationId</code></td>\n<td>How the result is written. A template Id or name (global or yours), or a format key. <strong>Required</strong> (an export template or a format key), except that <code>exportOverrides.format</code> can replace it when the import side is a template or <code>importOverrides.format</code> is given; with a format-key, <code>auto</code> or empty (detected) import side <code>exportOverrides.format</code> is ignored and the segment is still required: omitting it does <strong>not</strong> produce same-format output. With no export template, no format key and no <code>exportOverrides.format</code> the call answers 400 <code>Export configuration not found.</code> (an unknown value answers the same). If the import side is a format key or <code>importOverrides</code> rather than a template, the text is prefixed: <code>Import configuration not found. Export configuration not found.</code></td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"custom-json-configuration-form-fields\">Custom JSON configuration (form fields)</h2>\n<p>Instead of, or on top of, a template you can send overrides as multipart form fields. Each is a JSON <strong>object</strong> (string) whose keys are properties of the configuration (the same JSON a template holds, see <code>GET external/template/{id}</code>); keys are case-insensitive, dots reach into nested objects (e.g. <code>\"TTML.LanguageCode\"</code>), and a <code>null</code> value removes the key.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Form field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>importOverrides</code></td>\n<td>JSON object (string), optional</td>\n<td>Overrides applied to the import configuration, e.g. <code>{\"format\":\"SRT\",\"fps\":25,\"encoding\":\"utf-8\"}</code>. If it contains <code>format</code>, no import template or format key is needed in the route.</td>\n</tr>\n<tr>\n<td><code>exportOverrides</code></td>\n<td>JSON object (string), optional</td>\n<td>Overrides applied to the export configuration, e.g. <code>{\"format\":\"WebVTT\",\"fps\":23.976}</code>. If it contains <code>format</code>, no export template or format key is needed in the route, but only when the import side is a template or <code>importOverrides</code> also contains <code>format</code>; otherwise it is ignored and the route's export segment must be an export template or format key.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Format keys and language names to use in these values come from the <em>Metadata</em> folder (<code>GET external/formats</code>, <code>GET external/languages</code>).</p>\n<h2 id=\"query-parameters-all-optional\">Query parameters (all optional)</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>offset</code></td>\n<td>time value</td>\n<td>none</td>\n<td>Shift all subtitles (after the segment edits and before the frame-rate conversion).</td>\n</tr>\n<tr>\n<td><code>offsetBefore</code></td>\n<td>time value</td>\n<td>none</td>\n<td>Shift applied first, before segments. SMPTE values are read with the <em>input</em> frame rate.</td>\n</tr>\n<tr>\n<td><code>offsetAfter</code></td>\n<td>time value</td>\n<td>none</td>\n<td>Shift applied last, after the frame-rate conversion and <code>fixDuration</code>. SMPTE values are read with the <em>output</em> frame rate.</td>\n</tr>\n<tr>\n<td><code>startTC</code></td>\n<td>time value</td>\n<td>none</td>\n<td>The start timecode (first frame) of the programme, in seconds or SMPTE. Sets the media start timecode of the output and shifts subtitles by the difference between the input and output frame-rate interpretation of this value.</td>\n</tr>\n<tr>\n<td><code>removeSegments</code></td>\n<td>segment list</td>\n<td>none</td>\n<td>Cut these ranges out; later subtitles move earlier. Ignored when <code>keepSegments</code> is set.</td>\n</tr>\n<tr>\n<td><code>addSegments</code></td>\n<td>segment list</td>\n<td>none</td>\n<td>Insert gaps; the range length is added to all later subtitles. Ignored when <code>keepSegments</code> is set.</td>\n</tr>\n<tr>\n<td><code>keepSegments</code></td>\n<td>segment list</td>\n<td>none</td>\n<td>Keep only these ranges and join them. A single number (no dash) keeps that many seconds of blank duration. Takes precedence over <code>removeSegments</code> / <code>addSegments</code>.</td>\n</tr>\n<tr>\n<td><code>validate</code></td>\n<td>boolean</td>\n<td><code>false</code></td>\n<td>Fail on validation errors instead of reporting them as warnings.</td>\n</tr>\n<tr>\n<td><code>fixDuration</code></td>\n<td>integer (frames)</td>\n<td>none</td>\n<td>When greater than 0, sets the minimum subtitle duration (in frames) and optimizes end cues.</td>\n</tr>\n<tr>\n<td><code>ignoreWarnings</code></td>\n<td>boolean</td>\n<td><code>false</code></td>\n<td>Omit the <code>ooona-warnings</code> header.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"time-and-segment-string-formats\">Time and segment string formats</h2>\n<ul>\n<li><strong>Time value</strong>: either seconds (a decimal number, <code>.</code> separator, e.g. <code>12.5</code>) or an SMPTE timecode <code>HH:MM:SS:FF</code> (contains a colon, e.g. <code>00:00:05:12</code>; read with the frame rate of the configuration).</li>\n<li><strong>Segment list</strong> (<code>removeSegments</code>, <code>addSegments</code>, <code>keepSegments</code>): comma-separated ranges, each <code>from-to</code> using time values, e.g. <code>10-20,100-130</code> or <code>00:00:10:00-00:00:20:00,00:01:40:00-00:02:10:00</code>. <code>from</code> must not be greater than <code>to</code>.</li>\n<li><strong>Offset</strong> (<code>offset</code>, <code>offsetBefore</code>, <code>offsetAfter</code>): one time value; positive moves subtitles later, negative earlier (e.g. <code>2.5</code>, <code>-1</code>, <code>00:00:01:00</code>). <code>0</code> and <code>00:00:00:00</code> are ignored.</li>\n</ul>\n<h2 id=\"body-multipartform-data\">Body (multipart/form-data)</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><em>(file)</em></td>\n<td>file</td>\n<td>yes</td>\n<td>The subtitle file. Only the first file is used; the field name is free.</td>\n</tr>\n<tr>\n<td><code>importOverrides</code></td>\n<td>JSON string</td>\n<td>no</td>\n<td>See above.</td>\n</tr>\n<tr>\n<td><code>exportOverrides</code></td>\n<td>JSON string</td>\n<td>no</td>\n<td>See above.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"response\">Response</h2>\n<ul>\n<li><code>200 OK</code>: the converted file (stream, <code>Content-Disposition: attachment; filename=...</code>), optional <code>ooona-warnings</code> header.</li>\n<li><code>201 Created</code>: <code>{ \"jobId\": \"...\", \"warnings\": [], ... }</code> for image-based formats; poll the status request with the <code>jobId</code>.</li>\n<li><code>400 Bad Request</code>: a JSON string (quoted text): <code>No file found in the request.</code>, <code>Import configuration not found.</code>, <code> Export configuration not found.</code> (leading space; with an import template and a bad or missing export) or <code>Import configuration not found. Export configuration not found.</code> (import side is a format key or override, or the format could not be detected), <code>File failed validation: ...</code>, <code>User is not authorized to export {format} files</code>, or any import/conversion error text.</li>\n<li><code>429 Too Many Requests</code>: <code>server_busy</code> (retry after <code>Retry-After</code> seconds) or <code>quota_exceeded</code>.</li>\n<li><code>500 Internal Server Error</code>: transient database failure that persisted after the retry.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","convert","SRT","WebVTT"],"host":["{{base_url}}"],"query":[{"description":{"content":"<p>Time value (seconds or SMPTE) shifting all subtitles. Optional.</p>\n","type":"text/plain"},"key":"offset","value":"0"},{"description":{"content":"<p>Time value applied before the segment edits. Optional.</p>\n","type":"text/plain"},"key":"offsetBefore","value":""},{"description":{"content":"<p>Time value applied last. Optional.</p>\n","type":"text/plain"},"key":"offsetAfter","value":""},{"description":{"content":"<p>Programme start timecode, e.g. 01:00:00:00. Optional.</p>\n","type":"text/plain"},"key":"startTC","value":""},{"description":{"content":"<p>Comma-separated from-to ranges to cut out, e.g. 10-20,100-130. Optional.</p>\n","type":"text/plain"},"key":"removeSegments","value":""},{"description":{"content":"<p>Comma-separated from-to ranges to insert as gaps. Optional.</p>\n","type":"text/plain"},"key":"addSegments","value":""},{"description":{"content":"<p>Comma-separated from-to ranges to keep (takes precedence over remove/add). Optional.</p>\n","type":"text/plain"},"key":"keepSegments","value":""},{"description":{"content":"<p>true: fail on validation errors instead of warning. Optional.</p>\n","type":"text/plain"},"key":"validate","value":"false"},{"description":{"content":"<p>Minimum subtitle duration in frames (integer). Optional.</p>\n","type":"text/plain"},"key":"fixDuration","value":""},{"description":{"content":"<p>true: omit the ooona-warnings header. Optional.</p>\n","type":"text/plain"},"key":"ignoreWarnings","value":"false"}],"variable":[]}},"response":[{"id":"43d22421-e355-4811-a6cd-a8b7686b86de","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"","type":"file","description":"Subtitle file to convert (required). Only the first file is used.","value":""},{"key":"importOverrides","value":"{\"fps\":25}","type":"text","description":"Optional JSON object overriding import configuration properties, e.g. {\"format\":\"SRT\",\"fps\":25}."},{"key":"exportOverrides","value":"{\"fps\":23.976}","type":"text","description":"Optional JSON object overriding export configuration properties, e.g. {\"format\":\"WebVTT\",\"fps\":23.976}."}]},"url":{"raw":"{{base_url}}/external/convert/SRT/WebVTT?offset=0&offsetBefore=&offsetAfter=&startTC=&removeSegments=&addSegments=&keepSegments=&validate=false&fixDuration=&ignoreWarnings=false","host":["{{base_url}}"],"path":["external","convert","SRT","WebVTT"],"query":[{"key":"offset","value":"0","description":"Time value (seconds or SMPTE) shifting all subtitles. Optional."},{"key":"offsetBefore","value":"","description":"Time value applied before the segment edits. Optional."},{"key":"offsetAfter","value":"","description":"Time value applied last. Optional."},{"key":"startTC","value":"","description":"Programme start timecode, e.g. 01:00:00:00. Optional."},{"key":"removeSegments","value":"","description":"Comma-separated from-to ranges to cut out, e.g. 10-20,100-130. Optional."},{"key":"addSegments","value":"","description":"Comma-separated from-to ranges to insert as gaps. Optional."},{"key":"keepSegments","value":"","description":"Comma-separated from-to ranges to keep (takes precedence over remove/add). Optional."},{"key":"validate","value":"false","description":"true: fail on validation errors instead of warning. Optional."},{"key":"fixDuration","value":"","description":"Minimum subtitle duration in frames (integer). Optional."},{"key":"ignoreWarnings","value":"false","description":"true: omit the ooona-warnings header. Optional."}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"text/vtt"}],"cookie":[],"responseTime":null,"body":"WEBVTT\n\n1\n00:00:01.000 --> 00:00:03.500\nHello world"},{"id":"173ebac4-ef1d-4f88-9150-1e6532334e6e","name":"201 Created image format job","originalRequest":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"","type":"file","description":"Subtitle file to convert (required). Only the first file is used.","value":""},{"key":"importOverrides","value":"{\"fps\":25}","type":"text","description":"Optional JSON object overriding import configuration properties, e.g. {\"format\":\"SRT\",\"fps\":25}."},{"key":"exportOverrides","value":"{\"fps\":23.976}","type":"text","description":"Optional JSON object overriding export configuration properties, e.g. {\"format\":\"WebVTT\",\"fps\":23.976}."}]},"url":{"raw":"{{base_url}}/external/convert/SRT/BluraySup?offset=0&offsetBefore=&offsetAfter=&startTC=&removeSegments=&addSegments=&keepSegments=&validate=false&fixDuration=&ignoreWarnings=false","host":["{{base_url}}"],"path":["external","convert","SRT","BluraySup"],"query":[{"key":"offset","value":"0","description":"Time value (seconds or SMPTE) shifting all subtitles. Optional."},{"key":"offsetBefore","value":"","description":"Time value applied before the segment edits. Optional."},{"key":"offsetAfter","value":"","description":"Time value applied last. Optional."},{"key":"startTC","value":"","description":"Programme start timecode, e.g. 01:00:00:00. Optional."},{"key":"removeSegments","value":"","description":"Comma-separated from-to ranges to cut out, e.g. 10-20,100-130. Optional."},{"key":"addSegments","value":"","description":"Comma-separated from-to ranges to insert as gaps. Optional."},{"key":"keepSegments","value":"","description":"Comma-separated from-to ranges to keep (takes precedence over remove/add). Optional."},{"key":"validate","value":"false","description":"true: fail on validation errors instead of warning. Optional."},{"key":"fixDuration","value":"","description":"Minimum subtitle duration in frames (integer). Optional."},{"key":"ignoreWarnings","value":"false","description":"true: omit the ooona-warnings header. Optional."}]}},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"jobId\": \"7b0f5a9c3e1d4d2e9d3b0a6f4c1e2a10\",\n  \"warnings\": []\n}"},{"id":"6395a59f-7fb9-48de-9d17-0ddb7974e3da","name":"400 Import configuration not found","originalRequest":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"","type":"file","description":"Subtitle file to convert (required). Only the first file is used.","value":""},{"key":"importOverrides","value":"{\"fps\":25}","type":"text","description":"Optional JSON object overriding import configuration properties, e.g. {\"format\":\"SRT\",\"fps\":25}."},{"key":"exportOverrides","value":"{\"fps\":23.976}","type":"text","description":"Optional JSON object overriding export configuration properties, e.g. {\"format\":\"WebVTT\",\"fps\":23.976}."}]},"url":{"raw":"{{base_url}}/external/convert/NoSuchFormat/WebVTT?offset=0&offsetBefore=&offsetAfter=&startTC=&removeSegments=&addSegments=&keepSegments=&validate=false&fixDuration=&ignoreWarnings=false","host":["{{base_url}}"],"path":["external","convert","NoSuchFormat","WebVTT"],"query":[{"key":"offset","value":"0","description":"Time value (seconds or SMPTE) shifting all subtitles. Optional."},{"key":"offsetBefore","value":"","description":"Time value applied before the segment edits. Optional."},{"key":"offsetAfter","value":"","description":"Time value applied last. Optional."},{"key":"startTC","value":"","description":"Programme start timecode, e.g. 01:00:00:00. Optional."},{"key":"removeSegments","value":"","description":"Comma-separated from-to ranges to cut out, e.g. 10-20,100-130. Optional."},{"key":"addSegments","value":"","description":"Comma-separated from-to ranges to insert as gaps. Optional."},{"key":"keepSegments","value":"","description":"Comma-separated from-to ranges to keep (takes precedence over remove/add). Optional."},{"key":"validate","value":"false","description":"true: fail on validation errors instead of warning. Optional."},{"key":"fixDuration","value":"","description":"Minimum subtitle duration in frames (integer). Optional."},{"key":"ignoreWarnings","value":"false","description":"true: omit the ooona-warnings header. Optional."}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"Import configuration not found.\""},{"id":"da008a41-0d6c-4e9f-8734-97655a5ec1e5","name":"429 Server busy","originalRequest":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"","type":"file","description":"Subtitle file to convert (required). Only the first file is used.","value":""},{"key":"importOverrides","value":"{\"fps\":25}","type":"text","description":"Optional JSON object overriding import configuration properties, e.g. {\"format\":\"SRT\",\"fps\":25}."},{"key":"exportOverrides","value":"{\"fps\":23.976}","type":"text","description":"Optional JSON object overriding export configuration properties, e.g. {\"format\":\"WebVTT\",\"fps\":23.976}."}]},"url":{"raw":"{{base_url}}/external/convert/SRT/WebVTT?offset=0&offsetBefore=&offsetAfter=&startTC=&removeSegments=&addSegments=&keepSegments=&validate=false&fixDuration=&ignoreWarnings=false","host":["{{base_url}}"],"path":["external","convert","SRT","WebVTT"],"query":[{"key":"offset","value":"0","description":"Time value (seconds or SMPTE) shifting all subtitles. Optional."},{"key":"offsetBefore","value":"","description":"Time value applied before the segment edits. Optional."},{"key":"offsetAfter","value":"","description":"Time value applied last. Optional."},{"key":"startTC","value":"","description":"Programme start timecode, e.g. 01:00:00:00. Optional."},{"key":"removeSegments","value":"","description":"Comma-separated from-to ranges to cut out, e.g. 10-20,100-130. Optional."},{"key":"addSegments","value":"","description":"Comma-separated from-to ranges to insert as gaps. Optional."},{"key":"keepSegments","value":"","description":"Comma-separated from-to ranges to keep (takes precedence over remove/add). Optional."},{"key":"validate","value":"false","description":"true: fail on validation errors instead of warning. Optional."},{"key":"fixDuration","value":"","description":"Minimum subtitle duration in frames (integer). Optional."},{"key":"ignoreWarnings","value":"false","description":"true: omit the ooona-warnings header. Optional."}]}},"status":"Too Many Requests","code":429,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"code\": \"server_busy\",\n  \"message\": \"Server is busy processing conversions. Please retry shortly.\",\n  \"retryAfterSeconds\": 5\n}"}],"_postman_id":"e211c9ac-dc1e-4e28-9fdf-9ef491e5d3a8"},{"name":"Convert a file with custom JSON config","id":"39cc8d13-1fce-46cb-8426-7ceb0e71fce0","request":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"","type":"file","description":"<p>Subtitle file to convert (required).</p>\n","value":""},{"key":"importOverrides","value":"{\"format\":\"SRT\",\"fps\":25,\"encoding\":\"utf-8\"}","type":"text","description":"<p>JSON object overriding import configuration properties.</p>\n"},{"key":"exportOverrides","value":"{\"format\":\"WebVTT\",\"fps\":25}","type":"text","description":"<p>JSON object overriding export configuration properties; \"format\" selects the output format.</p>\n"}]},"url":"{{base_url}}/external/convert","description":"<p>Same endpoint as <em>Convert a file</em>, but without any template or format key in the route: both configurations come from the <code>importOverrides</code> and <code>exportOverrides</code> form fields (both must contain <code>format</code>: with no route segments the import side is detected, so <code>exportOverrides.format</code> is only honoured when <code>importOverrides.format</code> is also given; without <code>importOverrides.format</code> the call answers <code>400</code> <code>Import configuration not found. Export configuration not found.</code>).</p>\n<p>Use <code>GET external/formats</code> for valid <code>format</code> keys. See <em>Convert a file</em> for the query parameters (<code>offset</code>, <code>offsetBefore</code>, <code>offsetAfter</code>, <code>startTC</code>, <code>removeSegments</code>, <code>addSegments</code>, <code>keepSegments</code>, <code>validate</code>, <code>fixDuration</code>, <code>ignoreWarnings</code>), the responses and the sync/async behaviour. Role: <code>API</code> or <code>UserAPI</code>.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Form field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><em>(file)</em></td>\n<td>file</td>\n<td>yes</td>\n<td>The subtitle file.</td>\n</tr>\n<tr>\n<td><code>importOverrides</code></td>\n<td>JSON string</td>\n<td>yes, it must contain <code>format</code> (the route has no import segment)</td>\n<td>e.g. <code>{\"format\":\"SRT\",\"fps\":25,\"encoding\":\"utf-8\"}</code>.</td>\n</tr>\n<tr>\n<td><code>exportOverrides</code></td>\n<td>JSON string</td>\n<td>yes, it must contain <code>format</code> (the route has no export segment)</td>\n<td>e.g. <code>{\"format\":\"WebVTT\",\"fps\":25}</code>.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","convert"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"72a448aa-1ae2-49f2-a09b-34dede4e19aa","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"","type":"file","description":"Subtitle file to convert (required).","value":""},{"key":"importOverrides","value":"{\"format\":\"SRT\",\"fps\":25,\"encoding\":\"utf-8\"}","type":"text","description":"JSON object overriding import configuration properties."},{"key":"exportOverrides","value":"{\"format\":\"WebVTT\",\"fps\":25}","type":"text","description":"JSON object overriding export configuration properties; \"format\" selects the output format."}]},"url":"{{base_url}}/external/convert"},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"text/vtt"}],"cookie":[],"responseTime":null,"body":"WEBVTT\n\n1\n00:00:01.000 --> 00:00:03.500\nHello world"}],"_postman_id":"39cc8d13-1fce-46cb-8426-7ceb0e71fce0"},{"name":"Get conversion job status","id":"a5fc4c0e-f68f-4e15-b43f-79cad7dc9985","request":{"method":"GET","header":[],"url":"{{base_url}}/external/convert/status/7b0f5a9c3e1d4d2e9d3b0a6f4c1e2a10","description":"<p>Status of an asynchronous conversion started by <em>Convert a file</em> (the <code>201 Created</code> answer for image-based export formats). Role: <code>API</code> or <code>UserAPI</code>. Only the user that started the job can read it.</p>\n<p><strong>Input</strong>: route <code>id</code> = the <code>jobId</code> from the convert response.</p>\n<p><strong>Output</strong> (<code>200 OK</code>, JSON). <code>status</code> is one of <code>Waiting</code>, <code>Running</code>, <code>Success</code>, <code>Failure</code>:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Fields</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Waiting</code> / <code>Running</code></td>\n<td><code>status</code>, <code>progress</code></td>\n</tr>\n<tr>\n<td><code>Success</code></td>\n<td><code>status</code>, <code>url</code> (absolute URL of <em>Download conversion result</em>), <code>warnings</code> (array of strings)</td>\n</tr>\n<tr>\n<td><code>Failure</code></td>\n<td><code>status</code>, <code>warnings</code>, <code>error</code></td>\n</tr>\n</tbody>\n</table>\n</div><p><code>404 Not Found</code> when the job does not exist or belongs to another user. An unexpected server error is returned as <code>200</code> with an <code>error</code> property.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","convert","status","7b0f5a9c3e1d4d2e9d3b0a6f4c1e2a10"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"567ecd8d-74be-4087-8b89-14970e245cfb","name":"200 Running","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/convert/status/7b0f5a9c3e1d4d2e9d3b0a6f4c1e2a10"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"Running\",\n  \"progress\": 40\n}"},{"id":"22182a99-bdfc-45f3-9734-65bf9c36b723","name":"200 Success","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/convert/status/7b0f5a9c3e1d4d2e9d3b0a6f4c1e2a10"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"Success\",\n  \"url\": \"https://toolkit.example.com/external/convert/download/7b0f5a9c3e1d4d2e9d3b0a6f4c1e2a10\",\n  \"warnings\": []\n}"},{"id":"d2acbc8c-eca7-4577-bc8b-41e2e7a445c8","name":"200 Failure","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/convert/status/7b0f5a9c3e1d4d2e9d3b0a6f4c1e2a10"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"Failure\",\n  \"warnings\": [],\n  \"error\": \"Export failed\"\n}"},{"id":"fbd2f292-0105-42b4-ae72-15c4df3b6afc","name":"404 Not Found","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/convert/status/unknown"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"a5fc4c0e-f68f-4e15-b43f-79cad7dc9985"},{"name":"Download conversion result","id":"79731731-1629-4886-9b2f-15f4186e2e24","request":{"method":"GET","header":[],"url":"{{base_url}}/external/convert/download/7b0f5a9c3e1d4d2e9d3b0a6f4c1e2a10","description":"<p>Downloads the result of an asynchronous conversion once its status is <code>Success</code>. Role: <code>API</code> or <code>UserAPI</code>.</p>\n<p><strong>Behaviour</strong>: answers with a redirect to a short-lived signed storage URL (the HTTP client follows it automatically and receives the file). The result can be downloaded <strong>once</strong>: the job is marked as downloaded and further calls answer <code>404</code>.</p>\n<p><strong>Input</strong>: route <code>id</code> = the <code>jobId</code>. Only the user that started the job may download it.</p>\n<p><strong>Output</strong>: redirect to the file; <code>404 Not Found</code> when the job is unknown, owned by someone else, or already downloaded. An unexpected server error is returned as <code>200</code> with an <code>error</code> property.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","convert","download","7b0f5a9c3e1d4d2e9d3b0a6f4c1e2a10"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"49811538-b6ff-4867-b1c1-50405ccc2e9f","name":"404 Already downloaded","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/convert/download/7b0f5a9c3e1d4d2e9d3b0a6f4c1e2a10"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"79731731-1629-4886-9b2f-15f4186e2e24"},{"name":"Get conversion gate stats","id":"5cceca24-0c60-4639-b8bc-a373d8f6e882","request":{"method":"GET","header":[],"url":"{{base_url}}/external/convert/gate-stats","description":"<p>Diagnostics for the conversion admission gate that protects Convert and QC from overload. Role: <code>API</code> or <code>UserAPI</code>. No input.</p>\n<p><strong>Output</strong> (<code>200 OK</code>, JSON): the throttling key used for the caller (<code>key</code>: the client id on Ooona-hosted instances, otherwise a global key) and the live gate state.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>key</code>, <code>isOoona</code>, <code>trackedKeys</code></td>\n<td>Throttle key of the caller, whether the instance is Ooona-hosted, number of tracked keys.</td>\n</tr>\n<tr>\n<td><code>cap</code>, <code>minCap</code>, <code>maxCap</code></td>\n<td>Current / minimum / maximum number of conversions allowed to run at once.</td>\n</tr>\n<tr>\n<td><code>queue</code>, <code>minQueue</code></td>\n<td>Current / minimum length of the wait queue.</td>\n</tr>\n<tr>\n<td><code>running</code>, <code>waiting</code></td>\n<td>Conversions running / waiting for the caller's key.</td>\n</tr>\n<tr>\n<td><code>globalRunning</code>, <code>rejectedTotal</code></td>\n<td>Conversions running on the instance, total rejected with 429 since start.</td>\n</tr>\n<tr>\n<td><code>capSource</code></td>\n<td>What currently drives the cap: <code>cpu</code> or <code>throughput</code>.</td>\n</tr>\n<tr>\n<td><code>machineCpuPct</code>, <code>targetCpuLow</code>, <code>targetCpuHigh</code></td>\n<td>Measured CPU and its target band.</td>\n</tr>\n<tr>\n<td><code>throughputParaPerSec</code>, <code>msPerParaBaseline</code>, <code>msPerParaCurrent</code></td>\n<td>Throughput statistics (paragraphs per second, milliseconds per paragraph).</td>\n</tr>\n<tr>\n<td><code>avgMs</code>, <code>maxMs</code></td>\n<td>Average and maximum conversion duration.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Useful to explain <code>429 server_busy</code> answers.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","convert","gate-stats"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"5e4e535a-3557-4cf3-a961-818e7f172e22","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/convert/gate-stats"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"key\": \"client-123\",\n  \"isOoona\": true,\n  \"trackedKeys\": 4,\n  \"cap\": 8,\n  \"minCap\": 2,\n  \"maxCap\": 16,\n  \"queue\": 16,\n  \"minQueue\": 4,\n  \"running\": 1,\n  \"waiting\": 0,\n  \"globalRunning\": 3,\n  \"rejectedTotal\": 0,\n  \"capSource\": \"cpu\",\n  \"machineCpuPct\": 37.5,\n  \"targetCpuLow\": 60,\n  \"targetCpuHigh\": 85,\n  \"throughputParaPerSec\": 1800.0,\n  \"msPerParaBaseline\": 0.5,\n  \"msPerParaCurrent\": 0.6,\n  \"avgMs\": 420.0,\n  \"maxMs\": 3100.0\n}"}],"_postman_id":"5cceca24-0c60-4639-b8bc-a373d8f6e882"}],"id":"26a1a1fd-af1f-473c-aa02-777554326efc","description":"<p>Convert a subtitle file to another format. Synchronous for most formats; image-based formats run as a background job (status and download requests below).</p>\n","_postman_id":"26a1a1fd-af1f-473c-aa02-777554326efc","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"Conform","item":[{"name":"List available conforms","id":"8f191895-e4a3-4a31-8ff7-380fa1fe491a","request":{"method":"GET","header":[],"url":"{{base_url}}/external/conform","description":"<p>Lists every conform (automatic fix) that can be passed in the <code>checks</code> field of <em>Run conforms on a file</em>. Role: <code>API</code> or <code>UserAPI</code>. No input.</p>\n<p><strong>Output</strong> (<code>200 OK</code>, JSON array of the 10 available conforms: <code>duration</code>, <code>maxduration</code>, <code>gap</code>, <code>shotchanges</code>, <code>linelength</code>, <code>trimspaces</code>, <code>multiplespaces</code>, <code>speakerdashes</code>, <code>positioning</code>, <code>styleremoval</code>). Property names are camelCase in alphabetical order. Each item:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>key</code></td>\n<td>The name to use as a key in the <code>checks</code> JSON.</td>\n</tr>\n<tr>\n<td><code>name</code>, <code>description</code></td>\n<td>Human readable name and what the fix does.</td>\n</tr>\n<tr>\n<td><code>valueType</code></td>\n<td>Description of the value the conform expects.</td>\n</tr>\n<tr>\n<td><code>sampleValue</code></td>\n<td>An example value.</td>\n</tr>\n<tr>\n<td><code>isRaw</code></td>\n<td>Always <code>false</code> for conforms.</td>\n</tr>\n<tr>\n<td><code>runOnRawFile</code></td>\n<td><code>true</code> when the fix works on the raw file instead of the parsed subtitles (currently <code>false</code> for every conform).</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","conform"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"2b6be04d-1cc8-449a-b51c-75a96b7c655f","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/conform"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"description\": \"Adjust all subtitles to comply with minimum duration as long as they don't overlap.\",\n    \"isRaw\": false,\n    \"key\": \"duration\",\n    \"name\": \"Minimum Duration Fix\",\n    \"runOnRawFile\": false,\n    \"sampleValue\": \"0.48\",\n    \"valueType\": \"Number - seconds value\"\n  },\n  {\n    \"description\": \"Adjust all subtitles to comply with maximum duration by truncating the end timecode.\",\n    \"isRaw\": false,\n    \"key\": \"maxduration\",\n    \"name\": \"Maximum Duration Fix\",\n    \"runOnRawFile\": false,\n    \"sampleValue\": \"7\",\n    \"valueType\": \"Number - seconds value\"\n  },\n  {\n    \"description\": \"Conform all subtitles within a certain gap to an exact timing gap.\",\n    \"isRaw\": false,\n    \"key\": \"gap\",\n    \"name\": \"Timing Gap Fix\",\n    \"runOnRawFile\": false,\n    \"sampleValue\": \"\\\"2\\\" | \\\"2/8\\\" | \\\"2/8/true\\\"\",\n    \"valueType\": \"\\\"X\\\" or \\\"X/Y\\\" or \\\"X/Y/chain\\\". X = desired gap frames, Y = snap area frames, chain = also fix overlapping cues.\"\n  },\n  {\n    \"description\": \"Snap subtitle in-cues and out-cues to nearby shot changes, and/or prevent subtitles from crossing shot change boundaries.\",\n    \"isRaw\": false,\n    \"key\": \"shotchanges\",\n    \"name\": \"Shot Changes Fix\",\n    \"runOnRawFile\": false,\n    \"sampleValue\": \"{\\\"snapStart\\\":2,\\\"snapEnd\\\":2,\\\"snapArea\\\":8,\\\"mode\\\":\\\"snap\\\",\\\"times\\\":[10.5,25.3,48.0]}\",\n    \"valueType\": \"JSON object with snapStart, snapEnd, snapArea (frames), mode (snap|dontcross|both), and times (array of shot change seconds)\"\n  },\n  {\n    \"description\": \"Adjust all subtitles to comply with maximum line length.\",\n    \"isRaw\": false,\n    \"key\": \"linelength\",\n    \"name\": \"Line Length\",\n    \"runOnRawFile\": false,\n    \"sampleValue\": \"maxLength=37,maxLines=2,minGap=2,frameRate=23.976,screenLines=11,minDuration=0.8333\",\n    \"valueType\": \"String: comma-separated key=value pairs\"\n  },\n  {\n    \"description\": \"Remove leading and trailing spaces and tabs from all subtitle lines, respecting HTML tags.\",\n    \"isRaw\": false,\n    \"key\": \"trimspaces\",\n    \"name\": \"Remove Leading/Trailing Spaces\",\n    \"runOnRawFile\": false,\n    \"sampleValue\": \"true\",\n    \"valueType\": \"Boolean\"\n  },\n  {\n    \"description\": \"Collapse multiple consecutive spaces into a single space within subtitle text.\",\n    \"isRaw\": false,\n    \"key\": \"multiplespaces\",\n    \"name\": \"Remove Multiple Spaces\",\n    \"runOnRawFile\": false,\n    \"sampleValue\": \"true\",\n    \"valueType\": \"Boolean\"\n  },\n  {\n    \"description\": \"Normalize or remove dialogue dashes (speaker indicators) at the beginning of subtitle lines.\",\n    \"isRaw\": false,\n    \"key\": \"speakerdashes\",\n    \"name\": \"Speaker Dashes Fix\",\n    \"runOnRawFile\": false,\n    \"sampleValue\": \"{\\\"mode\\\":\\\"dual\\\",\\\"dash\\\":\\\"- \\\"}\",\n    \"valueType\": \"JSON object with 'mode' (remove|single|dual) and optional 'dash' character\"\n  },\n  {\n    \"description\": \"Normalize subtitle positions to allowed horizontal and vertical positions, justification, and line indexes.\",\n    \"isRaw\": false,\n    \"key\": \"positioning\",\n    \"name\": \"Positioning Normalization\",\n    \"runOnRawFile\": false,\n    \"sampleValue\": \"{\\\"hAlign\\\":[\\\"Center\\\"],\\\"vAlign\\\":[\\\"Bottom\\\",\\\"Top\\\"],\\\"justification\\\":[\\\"None\\\"],\\\"allowedLineIndexes\\\":[1,2,14,15]}\",\n    \"valueType\": \"JSON object with hAlign, vAlign, allowedLineIndexes, screenLines, justification\"\n  },\n  {\n    \"description\": \"Remove unwanted inline styles, keeping only allowed styles. Optionally normalize colors to closest allowed values.\",\n    \"isRaw\": false,\n    \"key\": \"styleremoval\",\n    \"name\": \"Style Removal\",\n    \"runOnRawFile\": false,\n    \"sampleValue\": \"{\\\"keep\\\":[\\\"italic\\\"],\\\"colors\\\":[\\\"#FFFFFF\\\",\\\"#FFFF00\\\"],\\\"bgColors\\\":[\\\"#000000\\\"],\\\"colorThreshold\\\":80}\",\n    \"valueType\": \"JSON object with keep, colors, bgColors, colorThreshold\"\n  }\n]"}],"_postman_id":"8f191895-e4a3-4a31-8ff7-380fa1fe491a"},{"name":"Run conforms on a file","id":"acc1e4a8-082e-4a85-9fdd-e1acb844c1f1","request":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"","type":"file","description":"<p>Subtitle file to fix (required).</p>\n","value":""},{"key":"checks","value":"{\"duration\":0.83,\"gap\":\"2/8\",\"trimspaces\":true}","type":"text","description":"<p>JSON object: conform key -&gt; value (see \"List available conforms\").</p>\n"},{"key":"importOverrides","value":"{}","type":"text","description":"<p>Optional JSON object overriding import configuration properties.</p>\n"},{"key":"exportOverrides","value":"{}","type":"text","description":"<p>Optional JSON object overriding export configuration properties.</p>\n"}]},"url":"{{base_url}}/external/conform/SRT/SRT?ignoreWarnings=false","description":"<p>Applies the requested automatic fixes to the uploaded file and returns the fixed file <strong>in the same format</strong>. Role: <code>API</code> or <code>UserAPI</code>. Synchronous.</p>\n<p><strong>Route parameters</strong> (both optional): <code>importConfigurationId</code> and <code>exportConfigurationId</code>, same meaning as in <em>Convert a file</em> (template id or name, or a format key; an empty import = detect from the extension). The export format must also resolve (a format key or an export template; <code>exportOverrides.format</code> can replace it only when the import side is a template or <code>importOverrides.format</code> is given, otherwise it is ignored): an empty export segment answers <code>400</code> <code>Export configuration not found.</code> and does not default to the import format. The resolved import and export formats <strong>must be equal</strong>, otherwise the call answers <code>400 Input format (X) doesn't match output format (Y).</code> The export configuration controls how the fixed file is written (e.g. frame rate).</p>\n<p><strong>Query</strong>: <code>ignoreWarnings</code> (boolean, default <code>false</code>): omit the <code>ooona-errors</code> / <code>ooona-warnings</code> headers.</p>\n<p><strong>Body</strong> (multipart/form-data):</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>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><em>(file)</em></td>\n<td>file</td>\n<td>yes</td>\n<td>The subtitle file (first file only).</td>\n</tr>\n<tr>\n<td><code>checks</code></td>\n<td>JSON object (string)</td>\n<td>yes</td>\n<td>Map of conform key to its value, e.g. <code>{\"duration\":0.83,\"gap\":\"2/8\"}</code>. Keys and value shapes come from <em>List available conforms</em>. Unknown keys are reported as warnings (<code>Conform \"x\" not found.</code>). Raw-file conforms run first, then the others.</td>\n</tr>\n<tr>\n<td><code>importOverrides</code>, <code>exportOverrides</code></td>\n<td>JSON string</td>\n<td>no</td>\n<td>Custom configuration overrides, see <em>Convert a file</em>.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output</strong></p>\n<ul>\n<li><code>200 OK</code>: the fixed file as an attachment (<code>application/octet-stream</code>, original file name). Problems found while fixing are returned in the <code>ooona-errors</code> and <code>ooona-warnings</code> headers (JSON arrays of QC error objects <code>{code, name, error, subtitleIndex, startTime, endTime, ...}</code>, truncated and ASCII-only).</li>\n<li><code>422 Unprocessable Entity</code>: the file cannot be imported. JSON <code>{ \"success\": false, \"errors\": [...], \"warnings\": [...] }</code>; <code>errors</code> holds an <code>ImportError</code> entry (<code>code</code> <code>10</code>, <code>name</code> <code>ImportError</code>, <code>error</code> <code>File import error: ...</code>). Nothing is conformed and the untouched upload is not echoed back.</li>\n<li><code>400 Bad Request</code>, a JSON string (quoted text): the calling user lacks a format permission (<code>User is not authorized to import {format} files</code> / <code>... export {format} files</code>), or an unknown or invalid import/export configuration (<code>Import configuration not found.</code>, <code> Export configuration not found.</code> with a leading space when the import is a template, or <code>Import configuration not found. Export configuration not found.</code> when the import is a format key or override or no format can be detected from the file extension), no file in the request (<code>No file found in the request.</code>), the format mismatch above (checked right after the configuration is resolved), or a failure <strong>inside</strong> the fix run.</li>\n<li><code>401 Unauthorized</code> (<code>Invalid authorization (conversion not allowed in integrated API)</code>): thrown only when the user lookup returns no user, i.e. for the <code>API</code> role's fake integrated user (and only while conversion in integrated mode is not enabled); never for <code>UserAPI</code>.</li>\n<li><code>429</code>: the quota answer, passed through as in <em>Convert a file</em>.</li>\n<li><code>500 Internal Server Error</code>: a transient database fault (safe to retry) or a server failure saving the uploaded file.</li>\n</ul>\n<p>Each successful call counts against the Conform API usage.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","conform","SRT","SRT"],"host":["{{base_url}}"],"query":[{"description":{"content":"<p>true: omit the ooona-errors / ooona-warnings headers. Optional.</p>\n","type":"text/plain"},"key":"ignoreWarnings","value":"false"}],"variable":[]}},"response":[{"id":"e249358d-e1ac-440d-bd81-e081b858b4e7","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"","type":"file","description":"Subtitle file to fix (required).","value":""},{"key":"checks","value":"{\"duration\":0.83,\"gap\":\"2/8\",\"trimspaces\":true}","type":"text","description":"JSON object: conform key -> value (see \"List available conforms\")."},{"key":"importOverrides","value":"{}","type":"text","description":"Optional JSON object overriding import configuration properties."},{"key":"exportOverrides","value":"{}","type":"text","description":"Optional JSON object overriding export configuration properties."}]},"url":{"raw":"{{base_url}}/external/conform/SRT/SRT?ignoreWarnings=false","host":["{{base_url}}"],"path":["external","conform","SRT","SRT"],"query":[{"key":"ignoreWarnings","value":"false","description":"true: omit the ooona-errors / ooona-warnings headers. Optional."}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"application/octet-stream"}],"cookie":[],"responseTime":null,"body":"1\n00:00:01,000 --> 00:00:03,500\nHello world"},{"id":"dd407958-65c9-4f66-acf9-7e63caa56173","name":"400 Format mismatch","originalRequest":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"","type":"file","description":"Subtitle file to fix (required).","value":""},{"key":"checks","value":"{\"duration\":0.83,\"gap\":\"2/8\",\"trimspaces\":true}","type":"text","description":"JSON object: conform key -> value (see \"List available conforms\")."},{"key":"importOverrides","value":"{}","type":"text","description":"Optional JSON object overriding import configuration properties."},{"key":"exportOverrides","value":"{}","type":"text","description":"Optional JSON object overriding export configuration properties."}]},"url":{"raw":"{{base_url}}/external/conform/SRT/WebVTT?ignoreWarnings=false","host":["{{base_url}}"],"path":["external","conform","SRT","WebVTT"],"query":[{"key":"ignoreWarnings","value":"false","description":"true: omit the ooona-errors / ooona-warnings headers. Optional."}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"Input format (SRT) doesn't match output format (WebVTT).\""},{"id":"65b75943-ec33-48b7-b078-f6ce7e214c6a","name":"422 File cannot be imported","originalRequest":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"","type":"file","description":"Subtitle file to fix (required).","value":""},{"key":"checks","value":"{\"duration\":0.83,\"gap\":\"2/8\",\"trimspaces\":true}","type":"text","description":"JSON object: conform key -> value (see \"List available conforms\")."},{"key":"importOverrides","value":"{}","type":"text","description":"Optional JSON object overriding import configuration properties."},{"key":"exportOverrides","value":"{}","type":"text","description":"Optional JSON object overriding export configuration properties."}]},"url":{"raw":"{{base_url}}/external/conform/SRT/SRT?ignoreWarnings=false","host":["{{base_url}}"],"path":["external","conform","SRT","SRT"],"query":[{"key":"ignoreWarnings","value":"false","description":"true: omit the ooona-errors / ooona-warnings headers. Optional."}]}},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"errors\": [\n    {\n      \"code\": 10,\n      \"name\": \"ImportError\",\n      \"error\": \"File import error: the file could not be read\"\n    }\n  ],\n  \"warnings\": []\n}"}],"_postman_id":"acc1e4a8-082e-4a85-9fdd-e1acb844c1f1"}],"id":"a05e8c9c-62ba-4015-9de7-34cdc1f531e4","description":"<p>Conforms automatically fix a subtitle file (minimum duration, gaps, line length, ...). List the available conforms, then run the ones you want.</p>\n","_postman_id":"a05e8c9c-62ba-4015-9de7-34cdc1f531e4","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"QC","item":[{"name":"List available QC checks","id":"67126493-bc0d-46f0-80a8-b30e1382513c","request":{"method":"GET","header":[],"url":"{{base_url}}/external/qc","description":"<p>Lists every check that can be passed in the <code>checks</code> field of <em>Run QC on a file</em>. Role: <code>API</code> or <code>UserAPI</code>. No input.</p>\n<p><strong>Output</strong> (<code>200 OK</code>, JSON array). Each item: <code>key</code> (name to use in <code>checks</code>), <code>name</code>, <code>description</code>, <code>valueType</code> (what value the check expects), <code>sampleValue</code>, <code>isRaw</code> (the check runs on the raw file and still runs when the file cannot be parsed).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","qc"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"dad2a1c5-b1af-4ce9-93ab-30af0a195012","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/qc"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"key\": \"maxduration\",\n    \"name\": \"Maximum Duration\",\n    \"description\": \"Check that all subtitles are below a maximum length limit.\",\n    \"valueType\": \"Number - seconds value\",\n    \"sampleValue\": \"7\",\n    \"isRaw\": false\n  },\n  {\n    \"key\": \"linelength\",\n    \"name\": \"Line Length\",\n    \"description\": \"Validate that all lines are shorter than the specified length.\",\n    \"valueType\": \"Number\",\n    \"sampleValue\": \"37\",\n    \"isRaw\": false\n  }\n]"}],"_postman_id":"67126493-bc0d-46f0-80a8-b30e1382513c"},{"name":"Run QC on a file","id":"cda11cb3-9800-4a3e-b7ba-acb374193ba5","request":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"","type":"file","description":"<p>Subtitle file to check (required).</p>\n","value":""},{"key":"checks","value":"{\"maxduration\":7,\"linelength\":37,\"emptylines\":true}","type":"text","description":"<p>JSON object: check key -&gt; value (see \"List available QC checks\").</p>\n"},{"key":"importOverrides","value":"{}","type":"text","description":"<p>Optional JSON object overriding import configuration properties.</p>\n"}]},"url":"{{base_url}}/external/qc/SRT","description":"<p>Runs the requested checks on the uploaded file and returns a JSON report. Role: <code>API</code> or <code>UserAPI</code>. Synchronous; shares the conversion admission gate (may answer <code>429 server_busy</code>).</p>\n<p><strong>Route</strong>: <code>importConfigurationId</code> (optional): template id or name, or a format key; empty = detect the format. Same meaning as in <em>Convert a file</em> (there is no export segment).</p>\n<p><strong>Body</strong> (multipart/form-data):</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>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><em>(file)</em></td>\n<td>file</td>\n<td>yes</td>\n<td>The file to check (first file only).</td>\n</tr>\n<tr>\n<td><code>checks</code></td>\n<td>JSON object (string)</td>\n<td>no</td>\n<td>Map of check key to value, e.g. <code>{\"maxduration\":7,\"linelength\":37}</code>. Keys and value shapes come from <em>List available QC checks</em>. Unknown keys and checks that throw are reported as warnings. <code>checks</code> may be omitted: only import problems and the raw-file checks are reported.</td>\n</tr>\n<tr>\n<td><code>importOverrides</code></td>\n<td>JSON string</td>\n<td>no</td>\n<td>Custom import configuration, see <em>Convert a file</em>.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output</strong></p>\n<ul>\n<li><code>200 OK</code>, JSON <code>{ \"success\": bool, \"errors\": [...], \"warnings\": [...] }</code>. <code>success</code> is <code>true</code> when there are no errors. Each error/warning: <code>code</code>, <code>name</code> (e.g. <code>MaximumDuration</code>, <code>LineTooLong</code>, <code>ImportError</code>), <code>error</code> (message), and when relevant <code>subtitleIndex</code>, <code>subtitleLineIndex</code>, <code>actual</code>, <code>operator</code>, <code>expected</code>, <code>text</code>, <code>startTime</code>, <code>endTime</code>. A file that cannot be imported is reported as an <code>ImportError</code> in <code>errors</code> (still <code>200</code>); only raw checks run in that case.</li>\n<li><code>400 Bad Request</code>, a JSON string (quoted text): an unknown or invalid import configuration (<code>Import configuration not found.</code>, or no format can be detected from the file extension), no file in the request (<code>No file found in the request.</code>), or a failure inside the check run itself (after the file was accepted).</li>\n<li><code>401 Unauthorized</code> (<code>Invalid authorization (conversion not allowed in integrated API)</code>): thrown only when the user lookup returns no user, i.e. for the <code>API</code> role's fake integrated user (and only while conversion in integrated mode is not enabled); never for <code>UserAPI</code>.</li>\n<li><code>429</code>: <code>server_busy</code> or the quota answer, passed through.</li>\n<li><code>500 Internal Server Error</code>: a transient database fault (safe to retry) or a server failure saving the uploaded file.</li>\n</ul>\n<p>Each successful call counts against the QC API usage.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","qc","SRT"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"601c87ab-99b3-4ffa-8916-07759f98f64c","name":"200 OK with errors","originalRequest":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"","type":"file","description":"Subtitle file to check (required).","value":""},{"key":"checks","value":"{\"maxduration\":7,\"linelength\":37,\"emptylines\":true}","type":"text","description":"JSON object: check key -> value (see \"List available QC checks\")."},{"key":"importOverrides","value":"{}","type":"text","description":"Optional JSON object overriding import configuration properties."}]},"url":"{{base_url}}/external/qc/SRT"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"errors\": [\n    {\n      \"code\": 6,\n      \"name\": \"MaximumDuration\",\n      \"error\": \"Subtitle duration is above the maximum allowed.\",\n      \"subtitleIndex\": 3,\n      \"actual\": 8.4,\n      \"operator\": \">\",\n      \"expected\": 7,\n      \"text\": \"Hello world\",\n      \"startTime\": \"00:00:10:00\",\n      \"endTime\": \"00:00:18:10\"\n    }\n  ],\n  \"warnings\": []\n}"},{"id":"4eed944f-acd3-4bc3-a537-f2053143af85","name":"200 OK passed","originalRequest":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"","type":"file","description":"Subtitle file to check (required).","value":""},{"key":"checks","value":"{\"maxduration\":7,\"linelength\":37,\"emptylines\":true}","type":"text","description":"JSON object: check key -> value (see \"List available QC checks\")."},{"key":"importOverrides","value":"{}","type":"text","description":"Optional JSON object overriding import configuration properties."}]},"url":"{{base_url}}/external/qc/SRT"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"errors\": [],\n  \"warnings\": []\n}"},{"id":"f4520bf6-169a-4fc0-bcb7-8ae19a21a997","name":"400 Import configuration not found","originalRequest":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"","type":"file","description":"Subtitle file to check (required).","value":""},{"key":"checks","value":"{\"maxduration\":7,\"linelength\":37,\"emptylines\":true}","type":"text","description":"JSON object: check key -> value (see \"List available QC checks\")."},{"key":"importOverrides","value":"{}","type":"text","description":"Optional JSON object overriding import configuration properties."}]},"url":"{{base_url}}/external/qc/NoSuchFormat"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"Import configuration not found.\""}],"_postman_id":"cda11cb3-9800-4a3e-b7ba-acb374193ba5"}],"id":"ff923408-2f5c-4f66-9cf6-408ac799ab94","description":"<p>Quality control of a subtitle file against a set of checks. List the available checks, then run the ones you want.</p>\n","_postman_id":"ff923408-2f5c-4f66-9cf6-408ac799ab94","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"Retime","item":[{"name":"Retime a TTML file","id":"ce412e71-9480-4f3a-af38-833aa62067ed","request":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"","type":"file","description":"<p>TTML file to retime (required).</p>\n","value":""}]},"url":"{{base_url}}/external/retime?offset=2.5&removeSegments=10-20,100-130&addSegments=&keepSegments=&cleanAfterOffset=true","description":"<p>Shifts, cuts or extends the timing of a <strong>TTML</strong> file and returns the modified TTML. Unlike <em>Convert a file</em>, the file is edited as XML directly (no import/export), so all other TTML content and styling is preserved. Role: <code>API</code> or <code>UserAPI</code>. Synchronous; counts against the Convert API usage and its monthly quota.</p>\n<p><strong>Input</strong>: multipart/form-data with one TTML (XML) file (first file only, any field name). The frame rate (<code>ttp:frameRate</code>, <code>ttp:frameRateMultiplier</code>, <code>ttp:dropMode</code>, <code>ttp:timeBase</code>, <code>ttp:tickRate</code>) and the time expression style of the file (frames, <code>HH:MM:SS.mmm</code>, seconds, milliseconds, ticks, SMPTE) are detected from the file and kept in the output. There are no other form fields.</p>\n<p><strong>Query parameters</strong> (all optional):</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>keepSegments</code></td>\n<td>segment list (seconds)</td>\n<td>Keep only these ranges and join them; takes precedence over <code>removeSegments</code> / <code>addSegments</code>. A single number (no dash) means a duration in seconds to keep as blank.</td>\n</tr>\n<tr>\n<td><code>removeSegments</code></td>\n<td>segment list (seconds)</td>\n<td>Cut these ranges out; later cues move earlier.</td>\n</tr>\n<tr>\n<td><code>addSegments</code></td>\n<td>segment list (seconds)</td>\n<td>Insert gaps; the range length is added to all later cues.</td>\n</tr>\n<tr>\n<td><code>offset</code></td>\n<td>seconds or SMPTE</td>\n<td>Shift all cues after the segment edits. Negative results are clamped at 0.</td>\n</tr>\n<tr>\n<td><code>cleanAfterOffset</code></td>\n<td>boolean string (<code>true</code>/<code>false</code>)</td>\n<td>After the offset, remove cues whose begin and end became identical (zero length).</td>\n</tr>\n</tbody>\n</table>\n</div><p>Order: <code>keepSegments</code>, or <code>removeSegments</code> then <code>addSegments</code>, then <code>offset</code>.</p>\n<h2 id=\"time-and-segment-string-formats\">Time and segment string formats</h2>\n<ul>\n<li><strong>Segment list</strong> (<code>removeSegments</code>, <code>addSegments</code>, <code>keepSegments</code>): comma-separated ranges <code>from-to</code>, where each side is a plain number of <strong>seconds</strong> (decimal, <code>.</code> separator, e.g. <code>10-20,100-130.5</code>). SMPTE timecodes are <strong>not</strong> accepted in segment lists (each side is parsed as a number, so a value such as <code>00:00:10:00</code> fails with a parse error). <code>from</code> must not be greater than <code>to</code>. In <code>keepSegments</code> only, an entry with a single number and no dash is a duration in seconds to keep as blank. Because ranges are split on <code>-</code>, negative numbers cannot be used.</li>\n<li><strong>Offset</strong> (<code>offset</code>): the only parameter that also accepts SMPTE. One time value: either seconds (decimal, e.g. <code>2.5</code>, <code>-1</code>) or an SMPTE timecode <code>HH:MM:SS:FF</code> (contains a colon, e.g. <code>00:00:01:00</code>, read with the frame rate of the TTML file); positive moves cues later, negative earlier. <code>0</code> and <code>00:00:00:00</code> are ignored.</li>\n</ul>\n<p><strong>Output</strong></p>\n<ul>\n<li><code>200 OK</code>: the retimed TTML document as <code>text/xml</code>.</li>\n<li><code>400 Bad Request</code>: a JSON string (quoted text): <code>No file found in the request.</code>, invalid XML, an invalid segment (<code>Invalid segments value (second number must be greater than first)</code>), number parse errors (including an SMPTE timecode in a segment list), etc.</li>\n<li><code>400 Bad Request</code> also when the monthly Convert API quota is exhausted. Unlike <em>Convert a file</em> there is <strong>no <code>429</code></strong> here: the quota check runs inside the same handler that turns every exception into <code>400</code>, so the body is the generic text <code>Processing of the HTTP request resulted in an exception. Please see the HTTP response returned by the 'Response' property of this exception for details.</code> and there is no <code>Retry-After</code> header. The quota resets on the 1st of the next month (UTC).</li>\n<li><code>401 Unauthorized</code>: <code>Invalid authorization</code> when the user cannot be resolved, which only happens for the <code>API</code> role's fake integrated user, never for <code>UserAPI</code>.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","retime"],"host":["{{base_url}}"],"query":[{"description":{"content":"<p>Seconds or SMPTE timecode to shift all cues by. Optional.</p>\n","type":"text/plain"},"key":"offset","value":"2.5"},{"description":{"content":"<p>Comma-separated from-to ranges to cut out. Optional.</p>\n","type":"text/plain"},"key":"removeSegments","value":"10-20,100-130"},{"description":{"content":"<p>Comma-separated from-to ranges to insert as gaps. Optional.</p>\n","type":"text/plain"},"key":"addSegments","value":""},{"description":{"content":"<p>Comma-separated from-to ranges to keep (takes precedence over remove/add). Optional.</p>\n","type":"text/plain"},"key":"keepSegments","value":""},{"description":{"content":"<p>true: drop zero-length cues created by the offset. Optional.</p>\n","type":"text/plain"},"key":"cleanAfterOffset","value":"true"}],"variable":[]}},"response":[{"id":"91998f7c-85e0-4cd1-ba01-8c67fe637a75","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"","type":"file","description":"TTML file to retime (required).","value":""}]},"url":{"raw":"{{base_url}}/external/retime?offset=2.5&removeSegments=10-20,100-130&addSegments=&keepSegments=&cleanAfterOffset=true","host":["{{base_url}}"],"path":["external","retime"],"query":[{"key":"offset","value":"2.5","description":"Seconds or SMPTE timecode to shift all cues by. Optional."},{"key":"removeSegments","value":"10-20,100-130","description":"Comma-separated from-to ranges to cut out. Optional."},{"key":"addSegments","value":"","description":"Comma-separated from-to ranges to insert as gaps. Optional."},{"key":"keepSegments","value":"","description":"Comma-separated from-to ranges to keep (takes precedence over remove/add). Optional."},{"key":"cleanAfterOffset","value":"true","description":"true: drop zero-length cues created by the offset. Optional."}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"text/xml"}],"cookie":[],"responseTime":null,"body":"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<tt xmlns=\"http://www.w3.org/ns/ttml\" xmlns:ttp=\"http://www.w3.org/ns/ttml#parameter\" ttp:timeBase=\"media\" ttp:frameRate=\"25\" xml:lang=\"en\">\n  <body>\n    <div>\n      <p begin=\"00:00:03:12\" end=\"00:00:06:00\">Hello world</p>\n    </div>\n  </body>\n</tt>"},{"id":"c7418d40-ae3a-44bb-a6f5-7d4f836e3fa4","name":"400 Bad Request","originalRequest":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"","type":"file","description":"TTML file to retime (required).","value":""}]},"url":{"raw":"{{base_url}}/external/retime?offset=2.5&removeSegments=10-20,100-130&addSegments=&keepSegments=&cleanAfterOffset=true","host":["{{base_url}}"],"path":["external","retime"],"query":[{"key":"offset","value":"2.5","description":"Seconds or SMPTE timecode to shift all cues by. Optional."},{"key":"removeSegments","value":"10-20,100-130","description":"Comma-separated from-to ranges to cut out. Optional."},{"key":"addSegments","value":"","description":"Comma-separated from-to ranges to insert as gaps. Optional."},{"key":"keepSegments","value":"","description":"Comma-separated from-to ranges to keep (takes precedence over remove/add). Optional."},{"key":"cleanAfterOffset","value":"true","description":"true: drop zero-length cues created by the offset. Optional."}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"Invalid segments value (second number must be greater than first): 20-10\""}],"_postman_id":"ce412e71-9480-4f3a-af38-833aa62067ed"}],"id":"d9d6f141-c7ff-462e-9d2b-8a9d6c736932","description":"<p>Retime TTML files directly (offset, cut, insert) without converting them to another format.</p>\n","_postman_id":"d9d6f141-c7ff-462e-9d2b-8a9d6c736932","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"Stitch","item":[{"name":"Stitch files","id":"4569271c-5fac-4630-b6e2-f138922dfba7","request":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"","type":"file","description":"<p>First subtitle file (required).</p>\n","value":""},{"key":"","type":"file","description":"<p>Second subtitle file. Add as many files as needed.</p>\n","value":""},{"key":"importOverrides","value":"{}","type":"text","description":"<p>Optional JSON object overriding import configuration properties.</p>\n"},{"key":"exportOverrides","value":"{}","type":"text","description":"<p>Optional JSON object overriding export configuration properties.</p>\n"}]},"url":"{{base_url}}/external/stitch/SRT/SRT?offsets=0|3600&keepSegments=&offset=&ignoreWarnings=false","description":"<p>Imports one or more subtitle files, joins them into a single subtitle track and exports the result. Role: <code>API</code> or <code>UserAPI</code>. Synchronous. <strong>Usage:</strong> a successful Stitch records <strong>2</strong> usage entries (Convert API), which is 2 units of quota, because quota and usage count entries, not files; a Stitch whose export fails (the <code>500</code> below) still records 1 entry.</p>\n<p><strong>Route parameters</strong> (both optional): <code>importConfigurationId</code> / <code>exportConfigurationId</code> (they can also be passed as query parameters), same meaning as in <em>Convert a file</em>, including that the <strong>export side is required</strong> (an export format key or an export template; <code>exportOverrides.format</code> can replace it only when the import side is a template or <code>importOverrides.format</code> is given, otherwise it is ignored; omitting it does <strong>not</strong> produce same-format output and answers <code>400</code>). The same import configuration is applied to every uploaded file; the output uses the export configuration. Custom JSON configuration via the <code>importOverrides</code> / <code>exportOverrides</code> form fields works as in <em>Convert a file</em>.</p>\n<p><strong>Modes</strong></p>\n<ul>\n<li><strong>Merge</strong> (neither <code>offsets</code> nor <code>keepSegments</code>): all cues from all files are combined, sorted by start time and renumbered.</li>\n<li><strong>Offsets</strong> (<code>offsets</code>): each file is shifted by its own offset, then all are combined in file order.</li>\n<li><strong>Segments</strong> (<code>keepSegments</code>): from each file only the given ranges are kept, and the ranges are placed one after another (each file starts where the previous kept range ended).</li>\n<li><strong>Offsets and segments combined</strong>: <code>offsets</code> and <code>keepSegments</code> can be used together. Each file is first shifted by its own offset, then trimmed to its kept segments, and the kept segments are then placed one after another. Files are combined in upload order without re-sorting.</li>\n</ul>\n<p><strong>Query parameters</strong> (all optional; these are all the query parameters of the action, besides the route parameters above)</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>offsets</code></td>\n<td>pipe-separated time values</td>\n<td>One offset per uploaded file, in upload order, separated by <code>|</code>, e.g. <code>0|3600|7200</code> or <code>00:00:00:00|01:00:00:00</code>. The number must equal the number of files.</td>\n</tr>\n<tr>\n<td><code>keepSegments</code></td>\n<td>pipe-separated segment lists</td>\n<td>One segment list per file, separated by <code>|</code> (each list uses the usual comma-separated <code>from-to</code> ranges), e.g. <code>0-600|0-1200,1500-1800</code>. The number must equal the number of files.</td>\n</tr>\n<tr>\n<td><code>offset</code></td>\n<td>time value</td>\n<td>Shift applied to the merged result at the end (after <code>offsets</code> / <code>keepSegments</code>).</td>\n</tr>\n<tr>\n<td><code>ignoreWarnings</code></td>\n<td>boolean</td>\n<td>Omit the <code>ooona-warnings</code> header. Default <code>false</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"time-and-segment-string-formats\">Time and segment string formats</h2>\n<ul>\n<li><strong>Time value</strong>: either seconds (a decimal number, <code>.</code> separator, e.g. <code>12.5</code>) or an SMPTE timecode <code>HH:MM:SS:FF</code> (contains a colon, e.g. <code>00:00:05:12</code>; read with the frame rate of the configuration).</li>\n<li><strong>Segment list</strong> (<code>removeSegments</code>, <code>addSegments</code>, <code>keepSegments</code>): comma-separated ranges, each <code>from-to</code> using time values, e.g. <code>10-20,100-130</code> or <code>00:00:10:00-00:00:20:00,00:01:40:00-00:02:10:00</code>. <code>from</code> must not be greater than <code>to</code>.</li>\n<li><strong>Offset</strong> (<code>offset</code>, <code>offsetBefore</code>, <code>offsetAfter</code>): one time value; positive moves subtitles later, negative earlier (e.g. <code>2.5</code>, <code>-1</code>, <code>00:00:01:00</code>). <code>0</code> and <code>00:00:00:00</code> are ignored.</li>\n</ul>\n<p><strong>Body</strong> (multipart/form-data): one or more subtitle files (at least one is required; any field names, in the order they should be used), plus optional <code>importOverrides</code> / <code>exportOverrides</code> JSON strings.</p>\n<p><strong>Output</strong></p>\n<ul>\n<li><code>200 OK</code>: the stitched file as an attachment (<code>application/octet-stream</code>), optional <code>ooona-warnings</code> header (JSON array of strings).</li>\n<li><code>400 Bad Request</code>: a JSON string (quoted text): <code>No files found in the request.</code>, <code>The number of files (N) does not match the number of keepSegments (M)</code> / <code>... of offsets (M)</code>, an import error of any file, <code>User is not authorized to import {format} files</code> / <code>User is not authorized to export {format} files</code> (the calling user lacks the format role), or a conversion error.</li>\n<li><code>500 Internal Server Error</code>: the export failed (message from the exporter).</li>\n<li>Import / export configuration errors (when at least one file was uploaded) follow the same statuses as <em>Convert a file</em>: <code>400 Bad Request</code> (a JSON string) for <code>Import configuration not found.</code> (unknown non-<code>auto</code> import segment or an undetectable file format), <code> Export configuration not found.</code> (leading space; import is a template) or <code>Import configuration not found. Export configuration not found.</code> (import is a format key or override, or undetected), <code>401 Unauthorized</code> (<code>Invalid authorization (conversion not allowed in integrated API)</code>, only for the <code>API</code> role's fake integrated user, never for <code>UserAPI</code>), the <code>429</code> quota answer passed through, and <code>500 Internal Server Error</code> only for a transient database fault (safe to retry).</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","stitch","SRT","SRT"],"host":["{{base_url}}"],"query":[{"description":{"content":"<p>Pipe-separated offset per file (seconds or SMPTE). Optional.</p>\n","type":"text/plain"},"key":"offsets","value":"0|3600"},{"description":{"content":"<p>Pipe-separated segment list per file. Optional.</p>\n","type":"text/plain"},"key":"keepSegments","value":""},{"description":{"content":"<p>Time value applied to the merged result. Optional.</p>\n","type":"text/plain"},"key":"offset","value":""},{"description":{"content":"<p>true: omit the ooona-warnings header. Optional.</p>\n","type":"text/plain"},"key":"ignoreWarnings","value":"false"}],"variable":[]}},"response":[{"id":"6c7d6ce9-c4b1-40da-bf7a-fc17e8e2803d","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"","type":"file","description":"First subtitle file (required).","value":""},{"key":"","type":"file","description":"Second subtitle file. Add as many files as needed.","value":""},{"key":"importOverrides","value":"{}","type":"text","description":"Optional JSON object overriding import configuration properties."},{"key":"exportOverrides","value":"{}","type":"text","description":"Optional JSON object overriding export configuration properties."}]},"url":{"raw":"{{base_url}}/external/stitch/SRT/SRT?offsets=0|3600&keepSegments=&offset=&ignoreWarnings=false","host":["{{base_url}}"],"path":["external","stitch","SRT","SRT"],"query":[{"key":"offsets","value":"0|3600","description":"Pipe-separated offset per file (seconds or SMPTE). Optional."},{"key":"keepSegments","value":"","description":"Pipe-separated segment list per file. Optional."},{"key":"offset","value":"","description":"Time value applied to the merged result. Optional."},{"key":"ignoreWarnings","value":"false","description":"true: omit the ooona-warnings header. Optional."}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"application/octet-stream"}],"cookie":[],"responseTime":null,"body":"1\n00:00:01,000 --> 00:00:03,500\nPart one\n\n2\n01:00:01,000 --> 01:00:03,500\nPart two"},{"id":"b00d3ae9-1691-47e9-b824-bee74d8c085b","name":"400 Count mismatch","originalRequest":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"","type":"file","description":"First subtitle file (required).","value":""},{"key":"","type":"file","description":"Second subtitle file. Add as many files as needed.","value":""},{"key":"importOverrides","value":"{}","type":"text","description":"Optional JSON object overriding import configuration properties."},{"key":"exportOverrides","value":"{}","type":"text","description":"Optional JSON object overriding export configuration properties."}]},"url":{"raw":"{{base_url}}/external/stitch/SRT/SRT?offsets=0|3600&keepSegments=&offset=&ignoreWarnings=false","host":["{{base_url}}"],"path":["external","stitch","SRT","SRT"],"query":[{"key":"offsets","value":"0|3600","description":"Pipe-separated offset per file (seconds or SMPTE). Optional."},{"key":"keepSegments","value":"","description":"Pipe-separated segment list per file. Optional."},{"key":"offset","value":"","description":"Time value applied to the merged result. Optional."},{"key":"ignoreWarnings","value":"false","description":"true: omit the ooona-warnings header. Optional."}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"The number of files (2) does not match the number of offsets (3)\""}],"_postman_id":"4569271c-5fac-4630-b6e2-f138922dfba7"}],"id":"9f310c88-ad17-45ad-8e87-da63e9a10e6a","description":"<p>Merge several subtitle files into one output file.</p>\n","_postman_id":"9f310c88-ad17-45ad-8e87-da63e9a10e6a","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"Media","item":[{"name":"Get media id","id":"9150d1c9-c54e-47f9-8cac-ebd60b933c8c","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"https://media.example.com/videos/film/manifest.mpd","options":{"raw":{"language":"text"}}},"url":"{{base_url}}/external/getMediaId","description":"<p>Resolves the Toolkit media id of a DRM-protected video from its MPD manifest URL. Role: <code>API</code> or <code>UserAPI</code>.</p>\n<p><strong>Input</strong>: the request body is the <strong>raw MPD URL as plain text</strong> (<code>Content-Type: text/plain</code>, not JSON, not multipart). It must be an absolute URL; the Toolkit server downloads the manifest itself. If the server is refused with <code>403</code> and the URL points to a storage bucket, the server retries with a signed URL.</p>\n<p><strong>Behaviour</strong>: reads the content id from the <code>cenc:pssh</code> element of the MPD and returns it as an encrypted media id.</p>\n<ul>\n<li>The lookup is made without a Toolkit user: only videos registered on this instance as <strong>global</strong> DRM content (valid at the current time) are accepted. Content assigned only to specific users is not resolved through this endpoint.</li>\n<li>An MPD that is not DRM protected (no <code>cenc:pssh</code>) has no content id to register, so it is rejected like unknown content with <code>403</code>.</li>\n</ul>\n<p><strong>Output</strong></p>\n<ul>\n<li><code>200 OK</code> with a JSON string: the encrypted media id (<code>EncryptedMediaId</code>) of the video.</li>\n<li><code>403 Forbidden</code>: <code>User not allowed to view this media</code> (the content id is unknown on this instance, is not global, or is outside its validity window; also returned for an MPD that is not DRM protected).</li>\n<li><code>500 Internal Server Error</code>: the error message as a JSON string, e.g. <code>Invalid URL</code> (the body is not an absolute URL), <code>Could not read content id from mpd</code>, or a failure to download or parse the manifest.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","getMediaId"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"f4cc44bf-bd23-427a-88f1-05dcd4728fa4","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"https://media.example.com/videos/film/manifest.mpd","options":{"raw":{"language":"text"}}},"url":"{{base_url}}/external/getMediaId"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"ZW5jcnlwdGVkLW1lZGlhLWlkLWV4YW1wbGU\""},{"id":"7e542cd8-066b-45bc-bd9b-6c34043df60e","name":"403 Forbidden","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"https://media.example.com/videos/film/manifest.mpd","options":{"raw":{"language":"text"}}},"url":"{{base_url}}/external/getMediaId"},"status":"Forbidden","code":403,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"User not allowed to view this media\""}],"_postman_id":"9150d1c9-c54e-47f9-8cac-ebd60b933c8c"}],"id":"74171dd7-b995-4381-883c-5c037420de0b","description":"<p>Helpers for DRM-protected media.</p>\n","_postman_id":"74171dd7-b995-4381-883c-5c037420de0b","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}}],"id":"7b7bf126-e131-4583-9fe3-9b606e5c4d9f","description":"<p>Convert, conform, QC, retime and stitch subtitle files through the API. All file requests here are <code>POST</code> calls with a <strong>multipart/form-data</strong> body (the subtitle file plus optional form fields) and need the <code>API</code> or <code>UserAPI</code> role. Authentication is added by the collection script.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Folder</th>\n<th>Endpoint</th>\n<th>What it does</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Convert</td>\n<td><code>POST external/convert/...</code></td>\n<td>Convert a file between formats, optionally retiming it. Returns the converted file.</td>\n</tr>\n<tr>\n<td>Conform</td>\n<td><code>GET/POST external/conform</code></td>\n<td>Apply automatic fixes (conforms) to a file and return the fixed file.</td>\n</tr>\n<tr>\n<td>QC</td>\n<td><code>GET/POST external/qc</code></td>\n<td>Run quality checks against a file and return a JSON report.</td>\n</tr>\n<tr>\n<td>Retime</td>\n<td><code>POST external/retime</code></td>\n<td>Shift or cut TTML files without converting them.</td>\n</tr>\n<tr>\n<td>Stitch</td>\n<td><code>POST external/stitch/...</code></td>\n<td>Merge several files into one.</td>\n</tr>\n<tr>\n<td>Media</td>\n<td><code>POST external/getMediaId</code></td>\n<td>Resolve the media id of a DRM-protected MPD.</td>\n</tr>\n</tbody>\n</table>\n</div><h1 id=\"sync-vs-async\">Sync vs async</h1>\n<ul>\n<li><strong>Convert, conform, QC, retime and stitch are synchronous</strong>: the HTTP response already carries the result. Convert and QC pass through an admission gate that answers <code>429</code> (with a <code>Retry-After</code> header and <code>{ code: \"server_busy\", retryAfterSeconds }</code>) when the server is overloaded; retry after the given number of seconds. <code>GET external/convert/gate-stats</code> shows the gate state.</li>\n<li><strong>Convert to image-based formats</strong> (formats in the <code>DVDImages</code> category, see <code>GET external/formats</code>) is <strong>asynchronous</strong>: the request answers <code>201 Created</code> with a <code>jobId</code>; poll <code>GET external/convert/status/{jobId}</code> until <code>status</code> is <code>Success</code> or <code>Failure</code>, then fetch the file from <code>GET external/convert/download/{jobId}</code> (a one-time redirect to a signed URL).</li>\n<li>A monthly Convert API quota applies on hosted Ooona instances: <code>429 { code: \"quota_exceeded\", resetsAt, retryAfterSeconds }</code>.</li>\n</ul>\n<h1 id=\"common-form-fields\">Common form fields</h1>\n<p>Endpoints that import a subtitle file read the <strong>first file</strong> of the multipart body (the field name does not matter) and the optional <code>importOverrides</code> / <code>exportOverrides</code> form fields, see <em>Convert a file</em> for details.</p>\n<h1 id=\"warnings\">Warnings</h1>\n<p>Non-fatal problems are returned in the <code>ooona-warnings</code> response header (a JSON array of strings, non-ASCII replaced by <code>[UNICODE_TEXT]</code>, truncated to a size limit). Pass <code>ignoreWarnings=true</code> to omit the header.</p>\n","_postman_id":"7b7bf126-e131-4583-9fe3-9b606e5c4d9f","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"✍️ Sample workflows","item":[{"name":"🔗 Flow between apps","item":[{"name":"Step 1 - Transcribe (script)","id":"a1249034-0bbe-4e8b-8789-fada6dce1d02","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"e23b5b50-9efe-4ee7-bfa9-fbdb1eaa53a4\",\n  \"email\": \"Ressie_McClure@example.net\",\n  \"app\": \"Scripting\",\n  \"projectName\": \"Step 1 - Transcribe (script)\",\n  \"editConfiguration\": true\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000100-1001-0000-1000-000000000001?force=true","description":"<p><strong>Step 1: start the chain with a scripting session.</strong></p>\n<p>Creates the root project of the chain (<code>00000100-1001-0000-1000-000000000001</code>) with no source subtitles, opened in the <code>Scripting</code> app with <code>editConfiguration</code> on so the user can set up the project configuration. Every later step links back to this guid.</p>\n<p>Link to previous step: none, this is the root. Step 2 sends <code>00000100-1001-0000-1000-000000000001</code> as its <code>previousProjectGuid</code>.</p>\n<p><strong>Input</strong></p>\n<ul>\n<li>Route <code>id</code> (required): the project GUID, generated by your system. If a project/request with this id already exists, the stored request is <strong>updated</strong> and the existing project is opened; otherwise it is <strong>created</strong>.</li>\n<li>Body (JSON, <code>ExternalProjectViewModel</code>). Fields used in this step:</li>\n</ul>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Your own correlation id for the request.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user the session is opened for. The user is created if it does not exist and the project is assigned to them.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>optional</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>optional</td>\n<td>The application to open: <code>CreatePro</code>, <code>EditPro</code>, <code>TranslatePro</code>, <code>ReviewPro</code>, <code>Scripting</code>, ...</td>\n</tr>\n<tr>\n<td><code>projectName</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Name given to the project when it is created.</td>\n</tr>\n<tr>\n<td><code>editConfiguration</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Lets the user edit the configuration in the session.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Query <code>force</code> (optional): <code>true</code> lets this call take the project over from another user who edited it in the last 180 seconds. Without it such a project opens view-only and ownership does not change.</p>\n<p><strong>Output</strong></p>\n<ul>\n<li><code>200 OK</code>: a JSON string holding a <strong>single-use session URL</strong>, e.g. <code>\"https://&lt;your-instance&gt;/V2/external?token=&lt;token&gt;\"</code>. Open it in a browser (or iframe) to start the session. A new token is generated on every call to this endpoint.</li>\n<li>The call only stores the request. The project itself is created when the session is opened (or reused if it already exists).</li>\n<li>An empty or unparsable body returns an error response.</li>\n</ul>\n<p><strong>Role</strong>: <code>API</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","project","00000100-1001-0000-1000-000000000001"],"host":["{{base_url}}"],"query":[{"description":{"content":"<p>Optional. true = take over a project another user edited in the last 180 seconds instead of opening view-only.</p>\n","type":"text/plain"},"key":"force","value":"true"}],"variable":[]}},"response":[{"id":"3d12733f-aacf-4e1e-a29f-c15000838cf4","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"ac0e914f-c244-4f86-b66f-e01c3517d5e0\",\n  \"email\": \"Renee32@example.org\",\n  \"app\": \"Scripting\",\n  \"projectName\": \"Step 1 - Transcribe (script)\",\n  \"editConfiguration\": true\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/project/00000100-1001-0000-1000-000000000001?force=true","host":["{{base_url}}"],"path":["external","project","00000100-1001-0000-1000-000000000001"],"query":[{"key":"force","value":"true","description":"Optional. true = take over a project another user edited in the last 180 seconds instead of opening view-only."}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://tools.ooona.net/V2/external?token=8f1c2d9a5b7e4c3f9a6d0b1e2c4f7a85\""}],"_postman_id":"a1249034-0bbe-4e8b-8789-fada6dce1d02"},{"name":"Step 2 - Create Pro - Eng","id":"cabb129b-c4aa-4e8d-8a81-48a22447998c","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"7e91ed8e-5af6-4ebf-aa22-9af67feebad5\",\n  \"email\": \"Brent.Sipes83@example.net\",\n  \"app\": \"CreatePro\",\n  \"projectName\": \"Step 2 - Create Pro - Eng\",\n  \"previousProjectGuid\": \"00000100-1001-0000-1000-000000000001\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000100-1001-0000-1000-000000000002","description":"<p><strong>Step 2: open the English subtitles in Create Pro.</strong></p>\n<p>Creates a new project (<code>00000100-1001-0000-1000-000000000002</code>) in <code>CreatePro</code>, seeded from the Step 1 project.</p>\n<p>Link to previous step: <code>previousProjectGuid</code> = <code>00000100-1001-0000-1000-000000000001</code> (the Step 1 project).</p>\n<p><strong>Input</strong></p>\n<ul>\n<li>Route <code>id</code> (required): the project GUID, generated by your system. If a project/request with this id already exists, the stored request is <strong>updated</strong> and the existing project is opened; otherwise it is <strong>created</strong>.</li>\n<li>Body (JSON, <code>ExternalProjectViewModel</code>). Fields used in this step:</li>\n</ul>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Your own correlation id for the request.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user the session is opened for. The user is created if it does not exist and the project is assigned to them.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>optional</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>optional</td>\n<td>The application to open: <code>CreatePro</code>, <code>EditPro</code>, <code>TranslatePro</code>, <code>ReviewPro</code>, <code>Scripting</code>, ...</td>\n</tr>\n<tr>\n<td><code>projectName</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Name given to the project when it is created.</td>\n</tr>\n<tr>\n<td><code>previousProjectGuid</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Guid of the project this one continues from. When the session opens, that project's data is loaded as the starting content; the previous project itself is not modified. If omitted on a repeat call, a previously stored value is kept.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output</strong></p>\n<ul>\n<li><code>200 OK</code>: a JSON string holding a <strong>single-use session URL</strong>, e.g. <code>\"https://&lt;your-instance&gt;/V2/external?token=&lt;token&gt;\"</code>. Open it in a browser (or iframe) to start the session. A new token is generated on every call to this endpoint.</li>\n<li>The call only stores the request. The project itself is created when the session is opened (or reused if it already exists).</li>\n<li>An empty or unparsable body returns an error response.</li>\n</ul>\n<p><strong>Role</strong>: <code>API</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","project","00000100-1001-0000-1000-000000000002"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"77196da6-d797-4b3c-8dc7-1b94272555cf","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"6eda7b2f-a003-4069-9c6b-dc403f749da7\",\n  \"email\": \"Johnpaul_Kassulke@example.org\",\n  \"app\": \"CreatePro\",\n  \"projectName\": \"Step 2 - Create Pro - Eng\",\n  \"previousProjectGuid\": \"00000100-1001-0000-1000-000000000001\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000100-1001-0000-1000-000000000002"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://tools.ooona.net/V2/external?token=8f1c2d9a5b7e4c3f9a6d0b1e2c4f7a85\""}],"_postman_id":"cabb129b-c4aa-4e8d-8a81-48a22447998c"},{"name":"Step 3 - Review Pro - Eng","id":"3020ac1c-a9e7-450e-bad7-0fb685c6bbe5","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"adda4a4e-b770-43f6-a78e-07048420131d\",\n  \"email\": \"Louie.Fisher35@example.net\",\n  \"app\": \"EditPro\",\n  \"projectName\": \"Step 3 - Review Pro - Eng\",\n  \"previousProjectGuid\": \"00000100-1001-0000-1000-000000000002\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000100-1001-0000-1000-000000000003","description":"<p><strong>Step 3: review the English subtitles.</strong></p>\n<p>Creates a new project (<code>00000100-1001-0000-1000-000000000003</code>) in <code>EditPro</code> (review) from the Step 2 result. It is the common parent of both translation branches (4a Spanish, 4b Japanese), so one reviewed source fans out into several translations.</p>\n<p>Link to previous step: <code>previousProjectGuid</code> = <code>00000100-1001-0000-1000-000000000002</code> (the Step 2 project).</p>\n<p><strong>Input</strong></p>\n<ul>\n<li>Route <code>id</code> (required): the project GUID, generated by your system. If a project/request with this id already exists, the stored request is <strong>updated</strong> and the existing project is opened; otherwise it is <strong>created</strong>.</li>\n<li>Body (JSON, <code>ExternalProjectViewModel</code>). Fields used in this step:</li>\n</ul>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Your own correlation id for the request.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user the session is opened for. The user is created if it does not exist and the project is assigned to them.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>optional</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>optional</td>\n<td>The application to open: <code>CreatePro</code>, <code>EditPro</code>, <code>TranslatePro</code>, <code>ReviewPro</code>, <code>Scripting</code>, ...</td>\n</tr>\n<tr>\n<td><code>projectName</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Name given to the project when it is created.</td>\n</tr>\n<tr>\n<td><code>previousProjectGuid</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Guid of the project this one continues from. When the session opens, that project's data is loaded as the starting content; the previous project itself is not modified. If omitted on a repeat call, a previously stored value is kept.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output</strong></p>\n<ul>\n<li><code>200 OK</code>: a JSON string holding a <strong>single-use session URL</strong>, e.g. <code>\"https://&lt;your-instance&gt;/V2/external?token=&lt;token&gt;\"</code>. Open it in a browser (or iframe) to start the session. A new token is generated on every call to this endpoint.</li>\n<li>The call only stores the request. The project itself is created when the session is opened (or reused if it already exists).</li>\n<li>An empty or unparsable body returns an error response.</li>\n</ul>\n<p><strong>Role</strong>: <code>API</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","project","00000100-1001-0000-1000-000000000003"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"8839357a-3344-4751-95c4-3bbad986129f","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"5894ca6d-e79a-4309-85d8-fdbf1117b421\",\n  \"email\": \"Jonas.Waters94@example.net\",\n  \"app\": \"EditPro\",\n  \"projectName\": \"Step 3 - Review Pro - Eng\",\n  \"previousProjectGuid\": \"00000100-1001-0000-1000-000000000002\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000100-1001-0000-1000-000000000003"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://tools.ooona.net/V2/external?token=8f1c2d9a5b7e4c3f9a6d0b1e2c4f7a85\""}],"_postman_id":"3020ac1c-a9e7-450e-bad7-0fb685c6bbe5"},{"name":"Step 4a1 - Translate Pro - Eng>Spa","id":"f83843b2-545b-4585-bd20-416afa21ea65","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"ffb02e2c-dd6e-4e81-826d-4107e6b4cda3\",\n  \"email\": \"Ottis74@example.com\",\n  \"app\": \"TranslatePro\",\n  \"projectName\": \"Step 4a1 - Translate Pro - Eng>Spa\",\n  \"previousProjectGuid\": \"00000100-1001-0000-1000-000000000003\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000100-1001-0000-1000-0000000004a1?force=true","description":"<p><strong>Step 4a1 (branch A): translate English to Spanish.</strong></p>\n<p>Creates a project (<code>00000100-1001-0000-1000-0000000004a1</code>) in <code>TranslatePro</code> from the reviewed English project.</p>\n<p>Link to previous step: <code>previousProjectGuid</code> = <code>00000100-1001-0000-1000-000000000003</code> (the Step 3 project). This sample does not preset the target language; add <code>configurationJson</code> (for example <code>{ \"language1\": \"Spanish\" }</code>, as in the split-task sample) to preset it.</p>\n<p><strong>Input</strong></p>\n<ul>\n<li>Route <code>id</code> (required): the project GUID, generated by your system. If a project/request with this id already exists, the stored request is <strong>updated</strong> and the existing project is opened; otherwise it is <strong>created</strong>.</li>\n<li>Body (JSON, <code>ExternalProjectViewModel</code>). Fields used in this step:</li>\n</ul>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Your own correlation id for the request.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user the session is opened for. The user is created if it does not exist and the project is assigned to them.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>optional</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>optional</td>\n<td>The application to open: <code>CreatePro</code>, <code>EditPro</code>, <code>TranslatePro</code>, <code>ReviewPro</code>, <code>Scripting</code>, ...</td>\n</tr>\n<tr>\n<td><code>projectName</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Name given to the project when it is created.</td>\n</tr>\n<tr>\n<td><code>previousProjectGuid</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Guid of the project this one continues from. When the session opens, that project's data is loaded as the starting content; the previous project itself is not modified. If omitted on a repeat call, a previously stored value is kept.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Query <code>force</code> (optional): <code>true</code> lets this call take the project over from another user who edited it in the last 180 seconds. Without it such a project opens view-only and ownership does not change.</p>\n<p><strong>Output</strong></p>\n<ul>\n<li><code>200 OK</code>: a JSON string holding a <strong>single-use session URL</strong>, e.g. <code>\"https://&lt;your-instance&gt;/V2/external?token=&lt;token&gt;\"</code>. Open it in a browser (or iframe) to start the session. A new token is generated on every call to this endpoint.</li>\n<li>The call only stores the request. The project itself is created when the session is opened (or reused if it already exists).</li>\n<li>An empty or unparsable body returns an error response.</li>\n</ul>\n<p><strong>Role</strong>: <code>API</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","project","00000100-1001-0000-1000-0000000004a1"],"host":["{{base_url}}"],"query":[{"description":{"content":"<p>Optional. true = take over a project another user edited in the last 180 seconds instead of opening view-only.</p>\n","type":"text/plain"},"key":"force","value":"true"}],"variable":[]}},"response":[{"id":"1cd727a5-6b43-417c-8c70-229f9029e1b0","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"48211ae4-8528-4301-9758-a5fb900a18dd\",\n  \"email\": \"Edyth30@example.net\",\n  \"app\": \"TranslatePro\",\n  \"projectName\": \"Step 4a1 - Translate Pro - Eng>Spa\",\n  \"previousProjectGuid\": \"00000100-1001-0000-1000-000000000003\"\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/external/project/00000100-1001-0000-1000-0000000004a1?force=true","host":["{{base_url}}"],"path":["external","project","00000100-1001-0000-1000-0000000004a1"],"query":[{"key":"force","value":"true","description":"Optional. true = take over a project another user edited in the last 180 seconds instead of opening view-only."}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://tools.ooona.net/V2/external?token=8f1c2d9a5b7e4c3f9a6d0b1e2c4f7a85\""}],"_postman_id":"f83843b2-545b-4585-bd20-416afa21ea65"},{"name":"Step 4a2 - Review Pro - Spa","id":"2c96d270-9465-41b7-9fbc-ee4ee78662f4","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"51ce5a64-dd13-4447-aa3e-b56e47df31f7\",\n  \"email\": \"Carmella_Bode35@example.net\",\n  \"app\": \"EditPro\",\n  \"projectName\": \"Step 4a2 - Review Pro - Spa\",\n  \"previousProjectGuid\": \"00000100-1001-0000-1000-0000000004a1\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000100-1001-0000-1000-0000000004a2","description":"<p><strong>Step 4a2 (branch A): review the Spanish translation.</strong></p>\n<p>Creates a project (<code>00000100-1001-0000-1000-0000000004a2</code>) in <code>EditPro</code> from the Spanish translation. End of branch A.</p>\n<p>Link to previous step: <code>previousProjectGuid</code> = <code>00000100-1001-0000-1000-0000000004a1</code> (Step 4a1).</p>\n<p><strong>Input</strong></p>\n<ul>\n<li>Route <code>id</code> (required): the project GUID, generated by your system. If a project/request with this id already exists, the stored request is <strong>updated</strong> and the existing project is opened; otherwise it is <strong>created</strong>.</li>\n<li>Body (JSON, <code>ExternalProjectViewModel</code>). Fields used in this step:</li>\n</ul>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Your own correlation id for the request.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user the session is opened for. The user is created if it does not exist and the project is assigned to them.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>optional</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>optional</td>\n<td>The application to open: <code>CreatePro</code>, <code>EditPro</code>, <code>TranslatePro</code>, <code>ReviewPro</code>, <code>Scripting</code>, ...</td>\n</tr>\n<tr>\n<td><code>projectName</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Name given to the project when it is created.</td>\n</tr>\n<tr>\n<td><code>previousProjectGuid</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Guid of the project this one continues from. When the session opens, that project's data is loaded as the starting content; the previous project itself is not modified. If omitted on a repeat call, a previously stored value is kept.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output</strong></p>\n<ul>\n<li><code>200 OK</code>: a JSON string holding a <strong>single-use session URL</strong>, e.g. <code>\"https://&lt;your-instance&gt;/V2/external?token=&lt;token&gt;\"</code>. Open it in a browser (or iframe) to start the session. A new token is generated on every call to this endpoint.</li>\n<li>The call only stores the request. The project itself is created when the session is opened (or reused if it already exists).</li>\n<li>An empty or unparsable body returns an error response.</li>\n</ul>\n<p><strong>Role</strong>: <code>API</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","project","00000100-1001-0000-1000-0000000004a2"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"a0654aef-2922-4d34-b989-633b96137656","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"034d0e0c-987e-4f78-8b62-c757bf8ad522\",\n  \"email\": \"Michaela_Powlowski@example.org\",\n  \"app\": \"EditPro\",\n  \"projectName\": \"Step 4a2 - Review Pro - Spa\",\n  \"previousProjectGuid\": \"00000100-1001-0000-1000-0000000004a1\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000100-1001-0000-1000-0000000004a2"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://tools.ooona.net/V2/external?token=8f1c2d9a5b7e4c3f9a6d0b1e2c4f7a85\""}],"_postman_id":"2c96d270-9465-41b7-9fbc-ee4ee78662f4"},{"name":"Step 4b1 - Translate Pro - Eng>Jap","id":"a6c98e0e-7fb7-4e4c-88e1-bd26fc628c6e","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"efec5469-31d6-43f7-b81a-739d49ab95a7\",\n  \"email\": \"Cordelia.Jenkins@example.net\",\n  \"app\": \"TranslatePro\",\n  \"projectName\": \"Step 4b1 - Translate Pro - Eng>Jap\",\n  \"previousProjectGuid\": \"00000100-1001-0000-1000-000000000003\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000100-1001-0000-1000-0000000004b1","description":"<p><strong>Step 4b1 (branch B): translate English to Japanese.</strong></p>\n<p>Creates a project (<code>00000100-1001-0000-1000-0000000004b1</code>) in <code>TranslatePro</code> from the same reviewed English project as branch A.</p>\n<p>Link to previous step: <code>previousProjectGuid</code> = <code>00000100-1001-0000-1000-000000000003</code> (the Step 3 project, the same parent as Step 4a1). As in 4a1, add <code>configurationJson</code> to preset the target language.</p>\n<p><strong>Input</strong></p>\n<ul>\n<li>Route <code>id</code> (required): the project GUID, generated by your system. If a project/request with this id already exists, the stored request is <strong>updated</strong> and the existing project is opened; otherwise it is <strong>created</strong>.</li>\n<li>Body (JSON, <code>ExternalProjectViewModel</code>). Fields used in this step:</li>\n</ul>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Your own correlation id for the request.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user the session is opened for. The user is created if it does not exist and the project is assigned to them.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>optional</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>optional</td>\n<td>The application to open: <code>CreatePro</code>, <code>EditPro</code>, <code>TranslatePro</code>, <code>ReviewPro</code>, <code>Scripting</code>, ...</td>\n</tr>\n<tr>\n<td><code>projectName</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Name given to the project when it is created.</td>\n</tr>\n<tr>\n<td><code>previousProjectGuid</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Guid of the project this one continues from. When the session opens, that project's data is loaded as the starting content; the previous project itself is not modified. If omitted on a repeat call, a previously stored value is kept.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output</strong></p>\n<ul>\n<li><code>200 OK</code>: a JSON string holding a <strong>single-use session URL</strong>, e.g. <code>\"https://&lt;your-instance&gt;/V2/external?token=&lt;token&gt;\"</code>. Open it in a browser (or iframe) to start the session. A new token is generated on every call to this endpoint.</li>\n<li>The call only stores the request. The project itself is created when the session is opened (or reused if it already exists).</li>\n<li>An empty or unparsable body returns an error response.</li>\n</ul>\n<p><strong>Role</strong>: <code>API</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","project","00000100-1001-0000-1000-0000000004b1"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"71f7d3cf-3875-448a-9c5c-309762551171","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"87a07bf1-91da-404a-b606-3f696519e282\",\n  \"email\": \"Rebeka.White42@example.org\",\n  \"app\": \"TranslatePro\",\n  \"projectName\": \"Step 4b1 - Translate Pro - Eng>Jap\",\n  \"previousProjectGuid\": \"00000100-1001-0000-1000-000000000003\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000100-1001-0000-1000-0000000004b1"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://tools.ooona.net/V2/external?token=8f1c2d9a5b7e4c3f9a6d0b1e2c4f7a85\""}],"_postman_id":"a6c98e0e-7fb7-4e4c-88e1-bd26fc628c6e"},{"name":"Step 4b1 - Sample Translate Reject","id":"f816b630-c2d3-4d00-9b91-2ace52983534","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"febf9f82-f3d3-4bea-a2b1-3c442facb344\",\n  \"email\": \"Lenora_Okuneva10@example.org\",\n  \"app\": \"TranslatePro\",\n  \"projectName\": \"Step 4b1 - Translate Pro - Eng>Jap\",\n  \"previousProjectGuid\": \"00000100-1001-0000-1000-000000000003\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000100-1001-0000-1000-0000000004b1","description":"<p><strong>Step 4b1, repeated call (sample of re-opening the same project, for example after a rejection).</strong></p>\n<p>Sends the same body to the same project id (<code>00000100-1001-0000-1000-0000000004b1</code>) as <code>Step 4b1 - Translate Pro - Eng&gt;Jap</code>. Because the id already exists, nothing new is created: the stored request is updated, the existing project is re-opened and a <strong>new session URL</strong> is returned (the previous one stops being usable).</p>\n<p>Link to previous step: <code>previousProjectGuid</code> = <code>00000100-1001-0000-1000-000000000003</code>. The collection does not define a dedicated rejection field for this endpoint; this request only demonstrates re-opening an existing step.</p>\n<p><strong>Input</strong></p>\n<ul>\n<li>Route <code>id</code> (required): the project GUID, generated by your system. If a project/request with this id already exists, the stored request is <strong>updated</strong> and the existing project is opened; otherwise it is <strong>created</strong>.</li>\n<li>Body (JSON, <code>ExternalProjectViewModel</code>). Fields used in this step:</li>\n</ul>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Your own correlation id for the request.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user the session is opened for. The user is created if it does not exist and the project is assigned to them.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>optional</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>optional</td>\n<td>The application to open: <code>CreatePro</code>, <code>EditPro</code>, <code>TranslatePro</code>, <code>ReviewPro</code>, <code>Scripting</code>, ...</td>\n</tr>\n<tr>\n<td><code>projectName</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Name given to the project when it is created.</td>\n</tr>\n<tr>\n<td><code>previousProjectGuid</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Guid of the project this one continues from. When the session opens, that project's data is loaded as the starting content; the previous project itself is not modified. If omitted on a repeat call, a previously stored value is kept.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output</strong></p>\n<ul>\n<li><code>200 OK</code>: a JSON string holding a <strong>single-use session URL</strong>, e.g. <code>\"https://&lt;your-instance&gt;/V2/external?token=&lt;token&gt;\"</code>. Open it in a browser (or iframe) to start the session. A new token is generated on every call to this endpoint.</li>\n<li>The call only stores the request. The project itself is created when the session is opened (or reused if it already exists).</li>\n<li>An empty or unparsable body returns an error response.</li>\n</ul>\n<p><strong>Role</strong>: <code>API</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","project","00000100-1001-0000-1000-0000000004b1"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"c2494945-b2e6-4ed8-8027-2cbd0dd30181","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"ebc9f6b2-4dde-4549-9070-36401804ffe0\",\n  \"email\": \"Earlene_Lehner@example.org\",\n  \"app\": \"TranslatePro\",\n  \"projectName\": \"Step 4b1 - Translate Pro - Eng>Jap\",\n  \"previousProjectGuid\": \"00000100-1001-0000-1000-000000000003\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000100-1001-0000-1000-0000000004b1"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://tools.ooona.net/V2/external?token=8f1c2d9a5b7e4c3f9a6d0b1e2c4f7a85\""}],"_postman_id":"f816b630-c2d3-4d00-9b91-2ace52983534"},{"name":"Step 2 - Create Pro - Rejected project","id":"899124e7-5cc2-4223-807c-fc1953644df5","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"ad3ddd68-9b14-4011-a1f3-27dd4496f75e\",\n  \"email\": \"Kylee71@example.org\",\n  \"app\": \"CreatePro\",\n  \"projectName\": \"Step 2 - REJECTED Create Pro - Eng\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000100-1001-0000-8888-0000000004b1","description":"<p><strong>Alternative Step 2: a standalone project that is not part of the chain.</strong></p>\n<p>Creates a separate Create Pro project (<code>00000100-1001-0000-8888-0000000004b1</code>, a different guid from the Step 2 project) with no <code>previousProjectGuid</code>, so it starts blank and is not linked to the Step 1 project. Useful as a sample of a replacement project after a step was rejected.</p>\n<p>Link to previous step: none (no <code>previousProjectGuid</code>).</p>\n<p><strong>Input</strong></p>\n<ul>\n<li>Route <code>id</code> (required): the project GUID, generated by your system. If a project/request with this id already exists, the stored request is <strong>updated</strong> and the existing project is opened; otherwise it is <strong>created</strong>.</li>\n<li>Body (JSON, <code>ExternalProjectViewModel</code>). Fields used in this step:</li>\n</ul>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Your own correlation id for the request.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user the session is opened for. The user is created if it does not exist and the project is assigned to them.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>optional</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>optional</td>\n<td>The application to open: <code>CreatePro</code>, <code>EditPro</code>, <code>TranslatePro</code>, <code>ReviewPro</code>, <code>Scripting</code>, ...</td>\n</tr>\n<tr>\n<td><code>projectName</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Name given to the project when it is created.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output</strong></p>\n<ul>\n<li><code>200 OK</code>: a JSON string holding a <strong>single-use session URL</strong>, e.g. <code>\"https://&lt;your-instance&gt;/V2/external?token=&lt;token&gt;\"</code>. Open it in a browser (or iframe) to start the session. A new token is generated on every call to this endpoint.</li>\n<li>The call only stores the request. The project itself is created when the session is opened (or reused if it already exists).</li>\n<li>An empty or unparsable body returns an error response.</li>\n</ul>\n<p><strong>Role</strong>: <code>API</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","project","00000100-1001-0000-8888-0000000004b1"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"c941ce7f-521b-4020-9c47-bdc406c7e7df","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"593ea272-8e2f-4557-b350-7d67049aa916\",\n  \"email\": \"Brielle_Cummerata35@example.com\",\n  \"app\": \"CreatePro\",\n  \"projectName\": \"Step 2 - REJECTED Create Pro - Eng\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000100-1001-0000-8888-0000000004b1"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://tools.ooona.net/V2/external?token=8f1c2d9a5b7e4c3f9a6d0b1e2c4f7a85\""}],"_postman_id":"899124e7-5cc2-4223-807c-fc1953644df5"},{"name":"Step 4b2 - Review Pro - Jap","id":"769bfe67-15ea-4760-ba4e-ffd843a1637e","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"86287c4d-80f4-4f12-b722-4371d505844d\",\n  \"email\": \"Sydnie.Wuckert80@example.net\",\n  \"app\": \"EditPro\",\n  \"projectName\": \"Step 4b2 - Review Pro - Jap\",\n  \"previousProjectGuid\": \"00000100-1001-0000-1000-0000000004b1\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000100-1001-0000-1000-0000000004b2","description":"<p><strong>Step 4b2 (branch B): review the Japanese translation.</strong></p>\n<p>Creates a project (<code>00000100-1001-0000-1000-0000000004b2</code>) in <code>EditPro</code> from the Japanese translation. End of branch B.</p>\n<p>Link to previous step: <code>previousProjectGuid</code> = <code>00000100-1001-0000-1000-0000000004b1</code> (Step 4b1).</p>\n<p><strong>Input</strong></p>\n<ul>\n<li>Route <code>id</code> (required): the project GUID, generated by your system. If a project/request with this id already exists, the stored request is <strong>updated</strong> and the existing project is opened; otherwise it is <strong>created</strong>.</li>\n<li>Body (JSON, <code>ExternalProjectViewModel</code>). Fields used in this step:</li>\n</ul>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Your own correlation id for the request.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user the session is opened for. The user is created if it does not exist and the project is assigned to them.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>optional</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>optional</td>\n<td>The application to open: <code>CreatePro</code>, <code>EditPro</code>, <code>TranslatePro</code>, <code>ReviewPro</code>, <code>Scripting</code>, ...</td>\n</tr>\n<tr>\n<td><code>projectName</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Name given to the project when it is created.</td>\n</tr>\n<tr>\n<td><code>previousProjectGuid</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Guid of the project this one continues from. When the session opens, that project's data is loaded as the starting content; the previous project itself is not modified. If omitted on a repeat call, a previously stored value is kept.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output</strong></p>\n<ul>\n<li><code>200 OK</code>: a JSON string holding a <strong>single-use session URL</strong>, e.g. <code>\"https://&lt;your-instance&gt;/V2/external?token=&lt;token&gt;\"</code>. Open it in a browser (or iframe) to start the session. A new token is generated on every call to this endpoint.</li>\n<li>The call only stores the request. The project itself is created when the session is opened (or reused if it already exists).</li>\n<li>An empty or unparsable body returns an error response.</li>\n</ul>\n<p><strong>Role</strong>: <code>API</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","project","00000100-1001-0000-1000-0000000004b2"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"a28e0403-92be-4132-9b5b-2fc28a202a8a","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"f76218a8-bda1-45fb-91ef-e319666e82bd\",\n  \"email\": \"Alivia_Hayes@example.com\",\n  \"app\": \"EditPro\",\n  \"projectName\": \"Step 4b2 - Review Pro - Jap\",\n  \"previousProjectGuid\": \"00000100-1001-0000-1000-0000000004b1\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000100-1001-0000-1000-0000000004b2"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://tools.ooona.net/V2/external?token=8f1c2d9a5b7e4c3f9a6d0b1e2c4f7a85\""}],"_postman_id":"769bfe67-15ea-4760-ba4e-ffd843a1637e"}],"id":"9c384a45-b8c7-4c25-b0e9-e9b05f228c43","description":"<p>Sample <strong>flow between apps</strong>: a chain of projects where each step opens the result of the previous one in a different Ooona app.</p>\n<p>Every step is <code>POST external/project/{id}</code> with your own project guid. The link between steps is the <code>previousProjectGuid</code> body field: when the session opens, the previous project's data is loaded as the starting content of the new project (the previous project is not modified).</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>Step 1 Scripting\n  -&gt; Step 2 Create Pro (Eng)\n    -&gt; Step 3 Review Pro (Eng)\n      |-&gt; Step 4a1 Translate Pro (Eng&gt;Spa) -&gt; Step 4a2 Review Pro (Spa)\n      |-&gt; Step 4b1 Translate Pro (Eng&gt;Jap) -&gt; Step 4b2 Review Pro (Jap)\n</code></pre><p>How to run it: send the requests in order. Each returns a single-use session URL (a JSON string); open it in a browser, work on the project and save (Ctrl+S) before moving on, as the next step reads the saved data of the previous project. The guids are hard-coded in this sample.</p>\n<p>Two extra requests show variations: re-posting the same id re-opens the existing project with a new session URL, and <code>Step 2 - Create Pro - Rejected project</code> is a standalone project with no <code>previousProjectGuid</code>.</p>\n","_postman_id":"9c384a45-b8c7-4c25-b0e9-e9b05f228c43","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"🔗🤖  Flow between apps with automation","item":[{"name":"Run ASR","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Set lastJobId\", () => {\r\n    const responseJson = pm.response.json();\r\n\r\n    if (responseJson.jobId) {\r\n        pm.environment.set('lastJobId', responseJson.jobId);\r\n    }\r\n});"]}}],"id":"049aedb4-7c0b-44b4-a7a9-36c0fde95b12","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"engine\": \"ASR_AWS\",\r\n    \"video\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\r\n    \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\",\r\n    \"duration\": 96,\r\n    \"importConfigurationJson\": \"{ \\\"language1\\\": \\\"English (UK)\\\" }\",\r\n    \"exportConfigurationJson\": \"{ \\\"format\\\": \\\"TT\\\" }\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/automate/00000000-2000-0000-2000-200000000001","description":"<p><strong>Step 1: transcribe the video with ASR.</strong></p>\n<p>Starts a speech-to-text job. The id in the URL (<code>00000000-2000-0000-2000-200000000001</code>) becomes the project that receives the transcript; the transcript is later opened for QC in <strong>QC ASR Result</strong> (<code>previousProjectGuid</code> = this id).</p>\n<p><strong>Input</strong>: route <code>id</code> = project id (optional; generated when omitted). Body: <code>engine</code> (<code>ASR_AWS</code>), <code>video</code> (media URL), <code>duration</code> (seconds), <code>callbackUrl</code> (called when the job finishes), <code>importConfigurationJson</code> (<code>language1</code> = spoken language, here English (UK)), <code>exportConfigurationJson</code> (<code>format</code> of the files delivered to the callback). Optional query: <code>force</code> (repeat a job for the same id).</p>\n<p><strong>Output (200)</strong>: a job object (<code>id</code>, <code>status</code>, <code>progress</code>, <code>projectId</code>, <code>transaction*</code>, <code>statusUrl</code>, <code>resultUrls</code>, ...). The test script saves <code>id</code> as <code>lastJobId</code>. Poll <strong>Check ASR Status</strong>.</p>\n<p><strong>Errors</strong>: 400 when a job already exists for this project id (unless <code>force=true</code>) or the engine is unrecognised. Full field reference: see the <em>Run ASR</em> request in the Automate folder.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","automate","00000000-2000-0000-2000-200000000001"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"d2b405fe-10fc-4ae1-a650-696ff5a66184","name":"200 OK - job started","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"engine\": \"ASR_AWS\",\r\n    \"video\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\r\n    \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\",\r\n    \"duration\": 96,\r\n    \"importConfigurationJson\": \"{ \\\"language1\\\": \\\"English (UK)\\\" }\",\r\n    \"exportConfigurationJson\": \"{ \\\"format\\\": \\\"TT\\\" }\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/automate/00000000-2000-0000-2000-200000000001"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"email\": \"api@example.com\",\n  \"projectId\": \"00000000-2000-0000-2000-200000000001\",\n  \"type\": \"SpeechToText\",\n  \"jobId\": \"53b70a1f8e2d4c6b82a4f1e5a0c7b3d9\",\n  \"mediaId\": null,\n  \"sourceLanguage\": \"English (UK)\",\n  \"targetLanguage\": null,\n  \"status\": \"Running\",\n  \"progress\": 0,\n  \"warning\": null,\n  \"error\": null,\n  \"dateCreated\": \"2026-10-15T09:00:00Z\",\n  \"lastUpdated\": \"2026-10-15T09:00:12Z\",\n  \"startedAt\": \"2026-10-15T09:00:02Z\",\n  \"completedAt\": null,\n  \"engine\": \"AWS\",\n  \"transactionId\": \"b2f7d3a1-5c4e-4f60-9a8b-1e2d3c4b5a69\",\n  \"transactionDetails\": \"\",\n  \"transactionAmount\": 0.0,\n  \"transactionCurrency\": \"USD\",\n  \"transactionPriceFactor\": \"Second\",\n  \"transactionPricePerUnit\": 0.0,\n  \"transactionUnits\": 96.0,\n  \"transactionStatus\": \"Pending\",\n  \"statusUrl\": \"https://toolkit.example.com/external/automate/status/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"resultUrls\": {\n    \"raw\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n    \"srt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/srt\",\n    \"vtt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/vtt\",\n    \"ooona\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/ooona\"\n  },\n  \"subJobs\": null\n}"},{"id":"4e4851a6-984e-4089-94a6-68b2432c6190","name":"400 Job already exists","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"engine\": \"ASR_AWS\",\r\n    \"video\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\r\n    \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\",\r\n    \"duration\": 96,\r\n    \"importConfigurationJson\": \"{ \\\"language1\\\": \\\"English (UK)\\\" }\",\r\n    \"exportConfigurationJson\": \"{ \\\"format\\\": \\\"TT\\\" }\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/automate/00000000-2000-0000-2000-200000000001"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"Message\": \"Automated job for project id 00000000-2000-0000-2000-200000000001 already exists.\",\n  \"ExceptionMessage\": \"Automated job for project id 00000000-2000-0000-2000-200000000001 already exists.\",\n  \"ExceptionType\": \"ArgumentException\",\n  \"ActionName\": \"Automate\",\n  \"ControllerName\": \"ExternalAutomate\",\n  \"StackTrace\": \"ExternalAutomateController.cs:144\"\n}"}],"_postman_id":"049aedb4-7c0b-44b4-a7a9-36c0fde95b12"},{"name":"Check ASR Status","id":"4017f443-00ba-4060-be8f-7c873390b2d1","request":{"method":"GET","header":[],"url":"{{base_url}}/external/automate/status/00000000-2000-0000-2000-200000000001","description":"<p><strong>Step 1b: poll the ASR job.</strong></p>\n<p>Returns the state of the job started by <strong>Run ASR</strong>. The id is the project id used in Step 1 (a job id also works). Poll until <code>status</code> is <code>Success</code> (or <code>Failure</code>); responses are cached for ~30 s while running, so polling more often is pointless. Add <code>?force=true</code> to bypass the cache.</p>\n<p><strong>Input</strong>: route <code>id</code> (required): project id, Toolkit job id or engine job id. Query <code>force</code> (bool, default false).</p>\n<p><strong>Output (200)</strong>: a job object: <code>id</code>, <code>projectId</code>, <code>type</code>, <code>engine</code>, <code>status</code> (<code>Waiting</code>, <code>Running</code>, <code>Success</code>, <code>Failure</code>, <code>Retry1-3</code>), <code>progress</code> (0-100), <code>error</code>, <code>transactionAmount</code>/<code>transactionCurrency</code>, <code>statusUrl</code>, <code>resultUrls</code> (<code>raw</code>, <code>srt</code>, <code>vtt</code>, <code>ooona</code>).</p>\n<p><strong>Errors</strong>: 404 when no job matches. Details: see <em>Get job status</em> in the Automate folder.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","automate","status","00000000-2000-0000-2000-200000000001"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"c22960e9-378a-4b41-9275-82233bf09574","name":"200 OK - running","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/automate/status/00000000-2000-0000-2000-200000000001"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"email\": \"api@example.com\",\n  \"projectId\": \"00000000-2000-0000-2000-200000000001\",\n  \"type\": \"SpeechToText\",\n  \"jobId\": \"53b70a1f8e2d4c6b82a4f1e5a0c7b3d9\",\n  \"mediaId\": null,\n  \"sourceLanguage\": \"English (UK)\",\n  \"targetLanguage\": null,\n  \"status\": \"Running\",\n  \"progress\": 60,\n  \"warning\": null,\n  \"error\": null,\n  \"dateCreated\": \"2026-10-15T09:00:00Z\",\n  \"lastUpdated\": \"2026-10-15T09:00:12Z\",\n  \"startedAt\": \"2026-10-15T09:00:02Z\",\n  \"completedAt\": null,\n  \"engine\": \"AWS\",\n  \"transactionId\": \"b2f7d3a1-5c4e-4f60-9a8b-1e2d3c4b5a69\",\n  \"transactionDetails\": \"\",\n  \"transactionAmount\": 0.0,\n  \"transactionCurrency\": \"USD\",\n  \"transactionPriceFactor\": \"Second\",\n  \"transactionPricePerUnit\": 0.0,\n  \"transactionUnits\": 96.0,\n  \"transactionStatus\": \"Pending\",\n  \"statusUrl\": \"https://toolkit.example.com/external/automate/status/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"resultUrls\": {\n    \"raw\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n    \"srt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/srt\",\n    \"vtt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/vtt\",\n    \"ooona\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/ooona\"\n  },\n  \"subJobs\": null\n}"},{"id":"109aba49-9f4c-41bc-95c5-23afa734e67d","name":"200 OK - success","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/automate/status/00000000-2000-0000-2000-200000000001"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"email\": \"api@example.com\",\n  \"projectId\": \"00000000-2000-0000-2000-200000000001\",\n  \"type\": \"SpeechToText\",\n  \"jobId\": \"53b70a1f8e2d4c6b82a4f1e5a0c7b3d9\",\n  \"mediaId\": null,\n  \"sourceLanguage\": \"English (UK)\",\n  \"targetLanguage\": null,\n  \"status\": \"Success\",\n  \"progress\": 100,\n  \"warning\": null,\n  \"error\": null,\n  \"dateCreated\": \"2026-10-15T09:00:00Z\",\n  \"lastUpdated\": \"2026-10-15T09:00:12Z\",\n  \"startedAt\": \"2026-10-15T09:00:02Z\",\n  \"completedAt\": \"2026-10-15T09:02:40Z\",\n  \"engine\": \"AWS\",\n  \"transactionId\": \"b2f7d3a1-5c4e-4f60-9a8b-1e2d3c4b5a69\",\n  \"transactionDetails\": \"AWS Transcribe job 0.00040000$x96 seconds\",\n  \"transactionAmount\": 0.0384,\n  \"transactionCurrency\": \"USD\",\n  \"transactionPriceFactor\": \"Second\",\n  \"transactionPricePerUnit\": 0.0004,\n  \"transactionUnits\": 96.0,\n  \"transactionStatus\": \"Success\",\n  \"statusUrl\": \"https://toolkit.example.com/external/automate/status/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"resultUrls\": {\n    \"raw\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n    \"srt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/srt\",\n    \"vtt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/vtt\",\n    \"ooona\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/ooona\"\n  },\n  \"subJobs\": null\n}"},{"id":"bfeefe96-f53c-47f7-adfc-070b575c6f33","name":"404 Not found","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/external/automate/status/00000000-2000-0000-2000-200000000001"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"Message\": \"No HTTP resource was found that matches the request URI.\"\n}"}],"_postman_id":"4017f443-00ba-4060-be8f-7c873390b2d1"},{"name":"QC ASR Result","id":"01eb3c8a-0414-46da-9ef0-1d6eaad6f760","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"requestId\": \"786bc4be-bdfd-4022-bac8-572988236eec\",\r\n    \"email\": \"Grover.Kassulke18@example.org\",\r\n    \"ip\": \"::1\",\r\n    \"app\": \"ReviewPro\",\r\n    \"editConfiguration\": false,\r\n    \"allowDownload\": false,\r\n    \"allowUpload\": false,\r\n    \"allowMediaOpen\": false,\r\n    \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\",\r\n    \"previousProjectGuid\": \"00000000-2000-0000-2000-200000000001\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000000-2000-0000-2000-200000000002","description":"<p><strong>Step 2: a human reviews the ASR transcript in Review Pro.</strong></p>\n<p>Creates a new project (<code>00000000-2000-0000-2000-200000000002</code>) in <code>ReviewPro</code>, seeded from the ASR project (<code>previousProjectGuid</code> = <code>00000000-2000-0000-2000-200000000001</code>), and returns a single-use session URL for the reviewer. Call it once the ASR job succeeded. When the reviewer finishes, <code>callbackUrl</code> is called and the reviewed project can be the source of the next step.</p>\n<p><strong>Input</strong></p>\n<ul>\n<li>Route <code>id</code> (required): the new project's GUID. If a project/request with this id already exists, the stored request is updated and the existing project is opened.</li>\n<li>Body (JSON): <code>requestId</code> (your correlation id), <code>email</code> (user the session is opened for; created if unknown), <code>ip</code> (optional; stored for auditing, not enforced), <code>app</code> (<code>ReviewPro</code>), <code>editConfiguration</code> / <code>allowDownload</code> / <code>allowUpload</code> / <code>allowMediaOpen</code> (booleans enabling those UI features), <code>callbackUrl</code> (called when the task finishes), <code>previousProjectGuid</code> (project to start from).</li>\n</ul>\n<p><strong>Output (200)</strong>: a JSON string with the single-use session URL, <code>\"https://&lt;your-instance&gt;/V2/external?token=&lt;token&gt;\"</code>. Open it in a browser or iframe. A new token is generated on every call.</p>\n<p>This is the generic <code>POST external/project/{id}</code> endpoint; see the Project folder for the full reference.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","project","00000000-2000-0000-2000-200000000002"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"667fa8af-ae2c-4a29-a931-d50a05db36fe","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"requestId\": \"dc8482fc-b4f6-4e7b-ae85-f1c21036d7c1\",\r\n    \"email\": \"Eldred_Cartwright24@example.org\",\r\n    \"ip\": \"::1\",\r\n    \"app\": \"ReviewPro\",\r\n    \"editConfiguration\": false,\r\n    \"allowDownload\": false,\r\n    \"allowUpload\": false,\r\n    \"allowMediaOpen\": false,\r\n    \"callbackUrl\": \"https://webhook.site/ab0ad467-5159-4736-866b-dee71fdd3aab\",\r\n    \"previousProjectGuid\": \"00000000-2000-0000-2000-200000000001\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000000-2000-0000-2000-200000000002"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://<your-instance>/V2/external?token=<token>\""}],"_postman_id":"01eb3c8a-0414-46da-9ef0-1d6eaad6f760"},{"name":"Run MT on QCd Project","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Set lastJobId\", () => {\r\n    const responseJson = pm.response.json();\r\n\r\n    if (responseJson.jobId) {\r\n        pm.environment.set('lastJobId', responseJson.jobId);\r\n    }\r\n});"]}}],"id":"82ea3301-5666-46a1-8043-e818987ebc20","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"action\": \"Translate\",\r\n    \"engine\": \"MT_AWS\",\r\n    \"exportConfigurationJson\": \"{ \\\"language1\\\": \\\"Spanish\\\" }\",\r\n    \"previousProjectGuid\": \"00000000-2000-0000-2000-200000000002\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/automate/00000000-2000-0000-2000-200000000003","description":"<p><strong>Step 3: machine-translate the reviewed (QC'd) transcript.</strong></p>\n<p>Starts an MT job that translates the project reviewed in <strong>QC ASR Result</strong> (<code>previousProjectGuid</code> = <code>00000000-2000-0000-2000-200000000002</code>) into Spanish. The id in the URL (<code>00000000-2000-0000-2000-200000000003</code>) becomes the new translation project (opened later in <strong>QC MT Result</strong>).</p>\n<p><strong>Input</strong>: route <code>id</code> = new project id. Body: <code>action</code> (<code>Translate</code>), <code>engine</code> (<code>MT_AWS</code>), <code>exportConfigurationJson</code> (<code>language1</code> = <strong>target</strong> language; the source language comes from the previous project), <code>previousProjectGuid</code> (source project; its text is translated and it also keys the translation cache). Optional query: <code>force</code> (repeat the job / bypass the cache), <code>realtime</code> (wait up to 10 s and return the translated file).</p>\n<p><strong>Output (200)</strong>: a job object (<code>id</code>, <code>status</code>, <code>progress</code>, <code>projectId</code>, <code>transaction*</code>, <code>statusUrl</code>, <code>resultUrls</code>...). Poll with <strong>Get job status</strong> using <code>lastJobId</code> (or the project id) until <code>Success</code>.</p>\n<p><strong>Errors</strong>: 400 <code>Original text is not provided. Nothing to translate</code> when the source project has no text; 400 when a job already exists for the id. Full field reference: see <em>Run MT</em> in the Automate folder.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","automate","00000000-2000-0000-2000-200000000003"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"0c2b2ec1-8d88-40cd-baa4-f5a8200b5996","name":"200 OK - job started","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"action\": \"Translate\",\r\n    \"engine\": \"MT_AWS\",\r\n    \"exportConfigurationJson\": \"{ \\\"language1\\\": \\\"Spanish\\\" }\",\r\n    \"previousProjectGuid\": \"00000000-2000-0000-2000-200000000002\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/automate/00000000-2000-0000-2000-200000000003"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"email\": \"api@example.com\",\n  \"projectId\": \"00000000-2000-0000-2000-200000000003\",\n  \"type\": \"Translation\",\n  \"jobId\": \"53b70a1f8e2d4c6b82a4f1e5a0c7b3d9\",\n  \"mediaId\": null,\n  \"sourceLanguage\": \"English\",\n  \"targetLanguage\": \"Spanish\",\n  \"status\": \"Running\",\n  \"progress\": 0,\n  \"warning\": null,\n  \"error\": null,\n  \"dateCreated\": \"2026-10-15T09:00:00Z\",\n  \"lastUpdated\": \"2026-10-15T09:00:12Z\",\n  \"startedAt\": \"2026-10-15T09:00:02Z\",\n  \"completedAt\": null,\n  \"engine\": \"AWS\",\n  \"transactionId\": \"b2f7d3a1-5c4e-4f60-9a8b-1e2d3c4b5a69\",\n  \"transactionDetails\": \"AWS Translation job 0.00001500$x11380 characters\",\n  \"transactionAmount\": 0.17,\n  \"transactionCurrency\": \"USD\",\n  \"transactionPriceFactor\": \"Character\",\n  \"transactionPricePerUnit\": 1.5e-05,\n  \"transactionUnits\": 11380.0,\n  \"transactionStatus\": \"Pending\",\n  \"statusUrl\": \"https://toolkit.example.com/external/automate/status/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n  \"resultUrls\": {\n    \"raw\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35\",\n    \"srt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/srt\",\n    \"vtt\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/vtt\",\n    \"ooona\": \"https://toolkit.example.com/external/automate/result/9d3b7c0a5e1f4a28b6c4d2e8f1a07b35/ooona\"\n  },\n  \"subJobs\": null\n}"},{"id":"85b6163f-1069-4ff7-8658-733fdcfb291a","name":"400 Nothing to translate","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"action\": \"Translate\",\r\n    \"engine\": \"MT_AWS\",\r\n    \"exportConfigurationJson\": \"{ \\\"language1\\\": \\\"Spanish\\\" }\",\r\n    \"previousProjectGuid\": \"00000000-2000-0000-2000-200000000002\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/automate/00000000-2000-0000-2000-200000000003"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"Original text is not provided. Nothing to translate\""}],"_postman_id":"82ea3301-5666-46a1-8043-e818987ebc20"},{"name":"QC MT Result","id":"401fd661-4a65-4b60-89c7-12ab1f4224e5","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"requestId\": \"eedb2c19-9074-4883-a5bb-24b00fd15448\",\r\n    \"email\": \"Karl75@example.org\",\r\n    \"ip\": \"::1\",\r\n    \"app\": \"ReviewPro\",\r\n    \"editConfiguration\": false,\r\n    \"allowDownload\": false,\r\n    \"allowUpload\": false,\r\n    \"allowMediaOpen\": false,\r\n    \"previousProjectGuid\": \"00000000-2000-0000-2000-200000000003\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000000-2000-0000-2000-200000000004","description":"<p><strong>Step 4: a human reviews the machine translation in Review Pro.</strong></p>\n<p>Creates a new project (<code>00000000-2000-0000-2000-200000000004</code>) in <code>ReviewPro</code> seeded from the MT project (<code>previousProjectGuid</code> = <code>00000000-2000-0000-2000-200000000003</code>, the project created by <strong>Run MT on QCd Project</strong>) and returns a single-use session URL for the reviewer. Call it once the MT job succeeded.</p>\n<p><strong>Input</strong></p>\n<ul>\n<li>Route <code>id</code> (required): the new project's GUID. If it already exists the stored request is updated and the existing project opened.</li>\n<li>Body (JSON): <code>requestId</code>, <code>email</code>, <code>ip</code>, <code>app</code> (<code>ReviewPro</code>), <code>editConfiguration</code> / <code>allowDownload</code> / <code>allowUpload</code> / <code>allowMediaOpen</code> (booleans), <code>previousProjectGuid</code>. This sample sets no <code>callbackUrl</code>.</li>\n</ul>\n<p><strong>Output (200)</strong>: a JSON string with the single-use session URL, <code>\"https://&lt;your-instance&gt;/V2/external?token=&lt;token&gt;\"</code>.</p>\n<p>This is the generic <code>POST external/project/{id}</code> endpoint; see the Project folder for the full reference.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","project","00000000-2000-0000-2000-200000000004"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"967e7021-deef-45ac-9b8e-ff3b8b2012fe","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"requestId\": \"91a78830-9e12-4b71-9af5-01445667fad6\",\r\n    \"email\": \"Wilma1@example.org\",\r\n    \"ip\": \"::1\",\r\n    \"app\": \"ReviewPro\",\r\n    \"editConfiguration\": false,\r\n    \"allowDownload\": false,\r\n    \"allowUpload\": false,\r\n    \"allowMediaOpen\": false,\r\n    \"previousProjectGuid\": \"00000000-2000-0000-2000-200000000003\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000000-2000-0000-2000-200000000004"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://<your-instance>/V2/external?token=<token>\""}],"_postman_id":"401fd661-4a65-4b60-89c7-12ab1f4224e5"}],"id":"f414dbb0-f38a-4484-ab33-a929226e4b5c","description":"<p>Sample workflow based on automation with human post-processing: an AI job produces a project, a person reviews it in Review Pro, and the reviewed project feeds the next AI job.</p>\n<ol>\n<li><strong>Run ASR</strong>: transcribe the video (<code>POST external/automate/{id}</code>, engine <code>ASR_AWS</code>).</li>\n<li><strong>Check ASR Status</strong>: poll <code>GET external/automate/status/{id}</code> until <code>Success</code>.</li>\n<li><strong>QC ASR Result</strong>: open the transcript in Review Pro for a human QC (<code>POST external/project/{id}</code>, <code>previousProjectGuid</code> = ASR project).</li>\n<li><strong>Run MT on QCd Project</strong>: translate the reviewed project (<code>action: Translate</code>, <code>engine: MT_AWS</code>, <code>previousProjectGuid</code> = reviewed project).</li>\n<li><strong>QC MT Result</strong>: open the translation in Review Pro for a human QC.</li>\n</ol>\n<p>Every step chains to the previous one through <code>previousProjectGuid</code>. The sample ids (<code>00000000-2000-0000-2000-20000000000N</code>) are placeholders: use your own GUIDs.</p>\n<ul>\n<li><em><strong>Running 3rd party engines on your dedicated instance will be possible after signing a dedicated end-user license agreement.</strong></em></li>\n</ul>\n","_postman_id":"f414dbb0-f38a-4484-ab33-a929226e4b5c","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"➗ Split task","item":[{"name":"Create Pro (base project)","id":"f75e27b1-14d1-4a67-a93e-56cf1956bb69","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"c04f3e5f-39ca-4e89-adc8-a5517fc9641b\",\n  \"email\": \"Justen.Dooley@example.com\",\n  \"ip\": \"::1\",\n  \"app\": \"CreatePro\",\n  \"projectName\": \"Base project\",\n  \"subtitlesUrl\": \"https://ooona-public.s3.amazonaws.com/video/MERIDIAN/Meridian.en.json\",\n  \"subtitlesFileName\": \"Meridian.en.json\",\n  \"editConfiguration\": false,\n  \"allowDownload\": false,\n  \"allowUpload\": false,\n  \"allowMediaOpen\": false,\n  \"startTC\": \"00:00:00:00\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000000-1000-0000-1000-000000000001","description":"<p><strong>Step 1: create the base (parent) project.</strong></p>\n<p>Creates the project (<code>00000000-1000-0000-1000-000000000001</code>) that holds the full subtitle file. The next requests (the two translate tasks) are based on it, and the split indexes refer to its paragraphs.</p>\n<p>Open the returned session URL, wait until the subtitles are loaded, press Ctrl+S to save and close it. The later steps read the saved project.</p>\n<p>Link to previous step: none, this is the root.</p>\n<p><strong>Input</strong></p>\n<ul>\n<li>Route <code>id</code> (required): the project GUID, generated by your system. If a project/request with this id already exists, the stored request is <strong>updated</strong> and the existing project is opened; otherwise it is <strong>created</strong>.</li>\n<li>Body (JSON, <code>ExternalProjectViewModel</code>). Fields used in this step:</li>\n</ul>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Your own correlation id for the request.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user the session is opened for. The user is created if it does not exist and the project is assigned to them.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>optional</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>optional</td>\n<td>The application to open: <code>CreatePro</code>, <code>EditPro</code>, <code>TranslatePro</code>, <code>ReviewPro</code>, <code>Scripting</code>, ...</td>\n</tr>\n<tr>\n<td><code>projectName</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Name given to the project when it is created.</td>\n</tr>\n<tr>\n<td><code>subtitlesUrl</code></td>\n<td>string</td>\n<td>optional</td>\n<td>URL the subtitles are imported from when the project is created.</td>\n</tr>\n<tr>\n<td><code>subtitlesFileName</code></td>\n<td>string</td>\n<td>optional</td>\n<td>File name of the subtitles (used to detect the format).</td>\n</tr>\n<tr>\n<td><code>editConfiguration</code> / <code>allowDownload</code> / <code>allowUpload</code> / <code>allowMediaOpen</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Whether the session lets the user edit the configuration, download, upload and open media files.</td>\n</tr>\n<tr>\n<td><code>startTC</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Start timecode of the project, for example <code>00:00:00:00</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output</strong></p>\n<ul>\n<li><code>200 OK</code>: a JSON string holding a <strong>single-use session URL</strong>, e.g. <code>\"https://&lt;your-instance&gt;/V2/external?token=&lt;token&gt;\"</code>. Open it in a browser (or iframe) to start the session. A new token is generated on every call to this endpoint.</li>\n<li>The call only stores the request. The project itself is created when the session is opened (or reused if it already exists).</li>\n<li>An empty or unparsable body returns an error response.</li>\n</ul>\n<p><strong>Role</strong>: <code>API</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","project","00000000-1000-0000-1000-000000000001"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"b71bb686-359a-4376-bf92-ace671d1e79e","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"74bdffcd-5c05-4d42-a564-11a42f75388b\",\n  \"email\": \"Lelia27@example.com\",\n  \"ip\": \"::1\",\n  \"app\": \"CreatePro\",\n  \"projectName\": \"Base project\",\n  \"subtitlesUrl\": \"https://ooona-public.s3.amazonaws.com/video/MERIDIAN/Meridian.en.json\",\n  \"subtitlesFileName\": \"Meridian.en.json\",\n  \"editConfiguration\": false,\n  \"allowDownload\": false,\n  \"allowUpload\": false,\n  \"allowMediaOpen\": false,\n  \"startTC\": \"00:00:00:00\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000000-1000-0000-1000-000000000001"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://tools.ooona.net/V2/external?token=8f1c2d9a5b7e4c3f9a6d0b1e2c4f7a85\""}],"_postman_id":"f75e27b1-14d1-4a67-a93e-56cf1956bb69"},{"name":"Translate Pro Task 1","id":"3fe35b51-8353-4e47-9be0-e1e5173ac87f","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"7c17e86d-889c-4b01-ade2-627dd10646aa\",\n  \"email\": \"Giles61@example.net\",\n  \"app\": \"TranslatePro\",\n  \"projectName\": \"Split translate task 1/2\",\n  \"previousProjectGuid\": \"00000000-1000-0000-1000-000000000001\",\n  \"ip\": \"::1\",\n  \"editConfiguration\": false,\n  \"allowDownload\": false,\n  \"allowUpload\": false,\n  \"allowMediaOpen\": true,\n  \"configurationJson\": \"{ \\\"language1\\\": \\\"Spanish\\\" }\",\n  \"splitLimitation\": {\n    \"fromIndex\": 1,\n    \"fromTime\": \"00:00:00:00\",\n    \"mergedProjectGuid\": \"00000000-1000-0000-1000-000000000004\",\n    \"toIndex\": 15,\n    \"toTime\": \"00:00:00:00\"\n  },\n  \"roles\": \"MachineTranslation\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000000-1000-0000-1000-000000000002","description":"<p><strong>Step 2: split translate task 1 of 2 (first part).</strong></p>\n<p>Creates a project (<code>00000000-1000-0000-1000-000000000002</code>) in <code>TranslatePro</code> that is a slice of the base project. Only the paragraphs inside the <code>splitLimitation</code> range are meant to be handled in this task (index 1 to 15); the range is stored with the request and is used later by the merge step. The merge request refers to the guid you give as <code>splitLimitation.mergedProjectGuid</code>, so the same value must be used in both tasks.</p>\n<p>Link to previous step: <code>previousProjectGuid</code> = <code>00000000-1000-0000-1000-000000000001</code> (the base project). Indexes 16 to 30 are not part of either task in this sample, so they are left out of the merge.</p>\n<p><strong>Input</strong></p>\n<ul>\n<li>Route <code>id</code> (required): the project GUID, generated by your system. If a project/request with this id already exists, the stored request is <strong>updated</strong> and the existing project is opened; otherwise it is <strong>created</strong>.</li>\n<li>Body (JSON, <code>ExternalProjectViewModel</code>). Fields used in this step:</li>\n</ul>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Your own correlation id for the request.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user the session is opened for. The user is created if it does not exist and the project is assigned to them.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>optional</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>optional</td>\n<td>The application to open: <code>CreatePro</code>, <code>EditPro</code>, <code>TranslatePro</code>, <code>ReviewPro</code>, <code>Scripting</code>, ...</td>\n</tr>\n<tr>\n<td><code>projectName</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Name given to the project when it is created.</td>\n</tr>\n<tr>\n<td><code>previousProjectGuid</code></td>\n<td>string</td>\n<td>optional</td>\n<td>The base project the slice is taken from.</td>\n</tr>\n<tr>\n<td><code>editConfiguration</code> / <code>allowDownload</code> / <code>allowUpload</code> / <code>allowMediaOpen</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Whether the session lets the user edit the configuration, download, upload and open media files.</td>\n</tr>\n<tr>\n<td><code>configurationJson</code></td>\n<td>string</td>\n<td>optional</td>\n<td>JSON string with the project configuration; here it presets <code>language1</code> to Spanish.</td>\n</tr>\n<tr>\n<td><code>roles</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Roles of the session, here <code>MachineTranslation</code>.</td>\n</tr>\n<tr>\n<td><code>splitLimitation</code></td>\n<td>object</td>\n<td>optional</td>\n<td>The slice of the project this task owns (see below).</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>splitLimitation</code> fields:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>fromIndex</code></td>\n<td>number</td>\n<td>First paragraph index of the slice (<code>0</code>/omitted = no lower limit).</td>\n</tr>\n<tr>\n<td><code>toIndex</code></td>\n<td>number</td>\n<td>Last paragraph index of the slice (<code>0</code>/omitted = no upper limit).</td>\n</tr>\n<tr>\n<td><code>fromTime</code></td>\n<td>string</td>\n<td>Optional lower time limit (SMPTE <code>HH:MM:SS:FF</code> or seconds). <code>00:00:00:00</code> means not set.</td>\n</tr>\n<tr>\n<td><code>toTime</code></td>\n<td>string</td>\n<td>Optional upper time limit, same format. <code>00:00:00:00</code> means not set.</td>\n</tr>\n<tr>\n<td><code>mergedProjectGuid</code></td>\n<td>string</td>\n<td>Guid of the project that will be created by merging all the tasks of this split.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output</strong></p>\n<ul>\n<li><code>200 OK</code>: a JSON string holding a <strong>single-use session URL</strong>, e.g. <code>\"https://&lt;your-instance&gt;/V2/external?token=&lt;token&gt;\"</code>. Open it in a browser (or iframe) to start the session. A new token is generated on every call to this endpoint.</li>\n<li>The call only stores the request. The project itself is created when the session is opened (or reused if it already exists).</li>\n<li>An empty or unparsable body returns an error response.</li>\n</ul>\n<p><strong>Role</strong>: <code>API</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","project","00000000-1000-0000-1000-000000000002"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"85ca1664-a87b-4ec8-86cc-526460a8f250","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"1d6b165c-02ef-4d9e-8500-adcca726f799\",\n  \"email\": \"Myron_Okuneva@example.net\",\n  \"app\": \"TranslatePro\",\n  \"projectName\": \"Split translate task 1/2\",\n  \"previousProjectGuid\": \"00000000-1000-0000-1000-000000000001\",\n  \"ip\": \"::1\",\n  \"editConfiguration\": false,\n  \"allowDownload\": false,\n  \"allowUpload\": false,\n  \"allowMediaOpen\": true,\n  \"configurationJson\": \"{ \\\"language1\\\": \\\"Spanish\\\" }\",\n  \"splitLimitation\": {\n    \"fromIndex\": 1,\n    \"fromTime\": \"00:00:00:00\",\n    \"mergedProjectGuid\": \"00000000-1000-0000-1000-000000000004\",\n    \"toIndex\": 15,\n    \"toTime\": \"00:00:00:00\"\n  },\n  \"roles\": \"MachineTranslation\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000000-1000-0000-1000-000000000002"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://tools.ooona.net/V2/external?token=8f1c2d9a5b7e4c3f9a6d0b1e2c4f7a85\""}],"_postman_id":"3fe35b51-8353-4e47-9be0-e1e5173ac87f"},{"name":"Translate Pro Task 2","id":"b454513f-bd66-4599-bcf8-2579cf18b3cd","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"a14f0982-5daa-4452-8541-de469329a9f2\",\n  \"email\": \"Fern22@example.com\",\n  \"app\": \"TranslatePro\",\n  \"projectName\": \"Split translate task 2/2\",\n  \"previousProjectGuid\": \"00000000-1000-0000-1000-000000000001\",\n  \"ip\": \"::1\",\n  \"editConfiguration\": false,\n  \"allowDownload\": false,\n  \"allowUpload\": false,\n  \"allowMediaOpen\": true,\n  \"configurationJson\": \"{ \\\"language1\\\": \\\"Spanish\\\" }\",\n  \"splitLimitation\": {\n    \"fromIndex\": 31,\n    \"fromTime\": \"00:00:00:00\",\n    \"mergedProjectGuid\": \"00000000-1000-0000-1000-000000000004\",\n    \"toIndex\": 50,\n    \"toTime\": \"00:00:00:00\"\n  },\n  \"roles\": \"MachineTranslation\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000000-1000-0000-1000-000000000003","description":"<p><strong>Step 3: split translate task 2 of 2 (second part).</strong></p>\n<p>Creates a project (<code>00000000-1000-0000-1000-000000000003</code>) in <code>TranslatePro</code> that is a slice of the base project. Only the paragraphs inside the <code>splitLimitation</code> range are meant to be handled in this task (index 31 to 50); the range is stored with the request and is used later by the merge step. The merge request refers to the guid you give as <code>splitLimitation.mergedProjectGuid</code>, so the same value must be used in both tasks.</p>\n<p>Link to previous step: <code>previousProjectGuid</code> = <code>00000000-1000-0000-1000-000000000001</code> (the base project). Indexes 31 to 50 follow the gap left after task 1; both ranges are independent of each other.</p>\n<p><strong>Input</strong></p>\n<ul>\n<li>Route <code>id</code> (required): the project GUID, generated by your system. If a project/request with this id already exists, the stored request is <strong>updated</strong> and the existing project is opened; otherwise it is <strong>created</strong>.</li>\n<li>Body (JSON, <code>ExternalProjectViewModel</code>). Fields used in this step:</li>\n</ul>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Your own correlation id for the request.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user the session is opened for. The user is created if it does not exist and the project is assigned to them.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>optional</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>optional</td>\n<td>The application to open: <code>CreatePro</code>, <code>EditPro</code>, <code>TranslatePro</code>, <code>ReviewPro</code>, <code>Scripting</code>, ...</td>\n</tr>\n<tr>\n<td><code>projectName</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Name given to the project when it is created.</td>\n</tr>\n<tr>\n<td><code>previousProjectGuid</code></td>\n<td>string</td>\n<td>optional</td>\n<td>The base project the slice is taken from.</td>\n</tr>\n<tr>\n<td><code>editConfiguration</code> / <code>allowDownload</code> / <code>allowUpload</code> / <code>allowMediaOpen</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Whether the session lets the user edit the configuration, download, upload and open media files.</td>\n</tr>\n<tr>\n<td><code>configurationJson</code></td>\n<td>string</td>\n<td>optional</td>\n<td>JSON string with the project configuration; here it presets <code>language1</code> to Spanish.</td>\n</tr>\n<tr>\n<td><code>roles</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Roles of the session, here <code>MachineTranslation</code>.</td>\n</tr>\n<tr>\n<td><code>splitLimitation</code></td>\n<td>object</td>\n<td>optional</td>\n<td>The slice of the project this task owns (see below).</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>splitLimitation</code> fields:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>fromIndex</code></td>\n<td>number</td>\n<td>First paragraph index of the slice (<code>0</code>/omitted = no lower limit).</td>\n</tr>\n<tr>\n<td><code>toIndex</code></td>\n<td>number</td>\n<td>Last paragraph index of the slice (<code>0</code>/omitted = no upper limit).</td>\n</tr>\n<tr>\n<td><code>fromTime</code></td>\n<td>string</td>\n<td>Optional lower time limit (SMPTE <code>HH:MM:SS:FF</code> or seconds). <code>00:00:00:00</code> means not set.</td>\n</tr>\n<tr>\n<td><code>toTime</code></td>\n<td>string</td>\n<td>Optional upper time limit, same format. <code>00:00:00:00</code> means not set.</td>\n</tr>\n<tr>\n<td><code>mergedProjectGuid</code></td>\n<td>string</td>\n<td>Guid of the project that will be created by merging all the tasks of this split.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output</strong></p>\n<ul>\n<li><code>200 OK</code>: a JSON string holding a <strong>single-use session URL</strong>, e.g. <code>\"https://&lt;your-instance&gt;/V2/external?token=&lt;token&gt;\"</code>. Open it in a browser (or iframe) to start the session. A new token is generated on every call to this endpoint.</li>\n<li>The call only stores the request. The project itself is created when the session is opened (or reused if it already exists).</li>\n<li>An empty or unparsable body returns an error response.</li>\n</ul>\n<p><strong>Role</strong>: <code>API</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","project","00000000-1000-0000-1000-000000000003"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"e5307334-1ee4-4c42-9c51-31766fe4ba15","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"ac65c2ef-2ef2-46fc-be52-95a964163fe1\",\n  \"email\": \"Amari22@example.org\",\n  \"app\": \"TranslatePro\",\n  \"projectName\": \"Split translate task 2/2\",\n  \"previousProjectGuid\": \"00000000-1000-0000-1000-000000000001\",\n  \"ip\": \"::1\",\n  \"editConfiguration\": false,\n  \"allowDownload\": false,\n  \"allowUpload\": false,\n  \"allowMediaOpen\": true,\n  \"configurationJson\": \"{ \\\"language1\\\": \\\"Spanish\\\" }\",\n  \"splitLimitation\": {\n    \"fromIndex\": 31,\n    \"fromTime\": \"00:00:00:00\",\n    \"mergedProjectGuid\": \"00000000-1000-0000-1000-000000000004\",\n    \"toIndex\": 50,\n    \"toTime\": \"00:00:00:00\"\n  },\n  \"roles\": \"MachineTranslation\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000000-1000-0000-1000-000000000003"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://tools.ooona.net/V2/external?token=8f1c2d9a5b7e4c3f9a6d0b1e2c4f7a85\""}],"_postman_id":"b454513f-bd66-4599-bcf8-2579cf18b3cd"},{"name":"Merge 2 Translate Tasks","id":"c404435e-6d8b-4efe-b319-196688bbfa30","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"ProjectGuids\": [\n    \"00000000-1000-0000-1000-000000000002\",\n    \"00000000-1000-0000-1000-000000000003\"\n  ],\n  \"Name\": \"Merged project\",\n  \"ConfigurationGuid\": null\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/merge/00000000-1000-0000-1000-000000000004","description":"<p><strong>Step 4: merge the two translate tasks into one project.</strong></p>\n<p>Creates the merged project (<code>00000000-1000-0000-1000-000000000004</code>) from the existing task projects. Open and save both translate tasks first: the merge reads their saved data and the split ranges stored by their <code>POST external/project/{id}</code> requests (<code>splitLimitation</code>), and takes from each project only the paragraphs inside its range. The first project in <code>ProjectGuids</code> is used as the base for the project settings. The paragraphs of all tasks are then ordered by their start time and renumbered from 1. The merged project is created directly with progress 100 and the app of the first task.</p>\n<p>Link to previous steps: <code>ProjectGuids</code> lists the two task guids (<code>00000000-1000-0000-1000-000000000002</code>, <code>00000000-1000-0000-1000-000000000003</code>). The id in the URL is a <strong>new</strong> guid (the one both tasks announced as <code>splitLimitation.mergedProjectGuid</code>, though any unused guid works).</p>\n<p>The guids are hard-coded in this sample: running it a second time with the same guids returns 400 because the target id must be unique.</p>\n<p><strong>Input</strong></p>\n<ul>\n<li>Route <code>id</code> (required): guid of the merged project to create. Must not exist yet.</li>\n<li>Body (JSON, <code>ExternalMergeProjectViewModel</code>):</li>\n</ul>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>ProjectGuids</code></td>\n<td>string[]</td>\n<td>yes</td>\n<td>Guids of the projects to merge, in the order they should be taken.</td>\n</tr>\n<tr>\n<td><code>Name</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Name of the merged project. Default: the first project's name plus <code> (Merged)</code>.</td>\n</tr>\n<tr>\n<td><code>ConfigurationGuid</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Guid of a stored configuration whose settings replace the settings of the merged project. Ignored if not found.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output</strong></p>\n<ul>\n<li><code>200 OK</code>: a JSON string with the id of the merged project (equal to the route <code>id</code>). No session URL is returned: open it with <code>POST external/project/{id}</code> (next step).</li>\n<li><code>400 Bad Request</code> <code>\"Project already exists\"</code>: a project with the route <code>id</code> already exists.</li>\n<li><code>400 Bad Request</code> <code>\"No projects found\"</code>: none of the <code>ProjectGuids</code> exists.</li>\n<li>A listed project that has no stored external request (never opened through <code>external/project</code>) is not handled gracefully by the code and results in a server error.</li>\n</ul>\n<p><strong>Role</strong>: <code>API</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","merge","00000000-1000-0000-1000-000000000004"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"796cd44d-e09f-42a7-a194-9eb84217bdbe","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"ProjectGuids\": [\n    \"00000000-1000-0000-1000-000000000002\",\n    \"00000000-1000-0000-1000-000000000003\"\n  ],\n  \"Name\": \"Merged project\",\n  \"ConfigurationGuid\": null\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/merge/00000000-1000-0000-1000-000000000004"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"00000000-1000-0000-1000-000000000004\""},{"id":"b90980fb-4965-45dd-a001-db6b56ff882c","name":"400 Project already exists","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"ProjectGuids\": [\n    \"00000000-1000-0000-1000-000000000002\",\n    \"00000000-1000-0000-1000-000000000003\"\n  ],\n  \"Name\": \"Merged project\",\n  \"ConfigurationGuid\": null\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/merge/00000000-1000-0000-1000-000000000004"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"Message\": \"Project already exists\"\n}"},{"id":"9883884f-7baf-474f-b703-3628445156c7","name":"400 No projects found","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"ProjectGuids\": [\n    \"00000000-1000-0000-1000-000000000002\",\n    \"00000000-1000-0000-1000-000000000003\"\n  ],\n  \"Name\": \"Merged project\",\n  \"ConfigurationGuid\": null\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/merge/00000000-1000-0000-1000-000000000004"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"Message\": \"No projects found\"\n}"}],"_postman_id":"c404435e-6d8b-4efe-b319-196688bbfa30"},{"name":"Open merged project","id":"05705848-44f7-4ca4-af7b-a52e41e6ec60","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"70fb03e6-e47d-4758-b590-a60dc61b91d8\",\n  \"email\": \"Miles93@example.org\",\n  \"ip\": \"::1\",\n  \"app\": \"TranslatePro\",\n  \"editConfiguration\": false,\n  \"allowDownload\": false,\n  \"allowUpload\": false,\n  \"allowMediaOpen\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000000-1000-0000-1000-000000000004","description":"<p><strong>Step 5: open the merged project for editing.</strong></p>\n<p>Opens the project created by the merge (<code>00000000-1000-0000-1000-000000000004</code>). Because the project already exists it is opened as is, not copied.</p>\n<p>It is recommended to build a flow instead (send a new guid with <code>previousProjectGuid</code> = <code>00000000-1000-0000-1000-000000000004</code>) so that a copy is opened and the merge result stays untouched. The next request does exactly that for review.</p>\n<p>Link to previous step: the id in the URL is the id of the merge result from Step 4. No <code>previousProjectGuid</code> is sent.</p>\n<p><strong>Input</strong></p>\n<ul>\n<li>Route <code>id</code> (required): the project GUID, generated by your system. If a project/request with this id already exists, the stored request is <strong>updated</strong> and the existing project is opened; otherwise it is <strong>created</strong>.</li>\n<li>Body (JSON, <code>ExternalProjectViewModel</code>). Fields used in this step:</li>\n</ul>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Your own correlation id for the request.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user the session is opened for. The user is created if it does not exist and the project is assigned to them.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>optional</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>optional</td>\n<td>The application to open: <code>CreatePro</code>, <code>EditPro</code>, <code>TranslatePro</code>, <code>ReviewPro</code>, <code>Scripting</code>, ...</td>\n</tr>\n<tr>\n<td><code>projectName</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Name given to the project when it is created.</td>\n</tr>\n<tr>\n<td><code>editConfiguration</code> / <code>allowDownload</code> / <code>allowUpload</code> / <code>allowMediaOpen</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Whether the session lets the user edit the configuration, download, upload and open media files.</td>\n</tr>\n</tbody>\n</table>\n</div><p>If <code>email</code> belongs to a different user than the project's owner and the project was modified in the last 180 seconds, it opens view-only unless the request has <code>?force=true</code>.</p>\n<p><strong>Output</strong></p>\n<ul>\n<li><code>200 OK</code>: a JSON string holding a <strong>single-use session URL</strong>, e.g. <code>\"https://&lt;your-instance&gt;/V2/external?token=&lt;token&gt;\"</code>. Open it in a browser (or iframe) to start the session. A new token is generated on every call to this endpoint.</li>\n<li>The call only stores the request. The project itself is created when the session is opened (or reused if it already exists).</li>\n<li>An empty or unparsable body returns an error response.</li>\n</ul>\n<p><strong>Role</strong>: <code>API</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","project","00000000-1000-0000-1000-000000000004"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"36d846fb-d0cf-4fc2-b383-5463b7c17d84","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"fc94c7f1-9053-4176-b225-46cad67ff084\",\n  \"email\": \"Justen.Heidenreich20@example.org\",\n  \"ip\": \"::1\",\n  \"app\": \"TranslatePro\",\n  \"editConfiguration\": false,\n  \"allowDownload\": false,\n  \"allowUpload\": false,\n  \"allowMediaOpen\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000000-1000-0000-1000-000000000004"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://tools.ooona.net/V2/external?token=8f1c2d9a5b7e4c3f9a6d0b1e2c4f7a85\""}],"_postman_id":"05705848-44f7-4ca4-af7b-a52e41e6ec60"},{"name":"QC Merged Project","id":"5f8e22e7-4b0c-4762-a31e-53a031de3f78","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"3a0b50c5-7011-420d-916f-f8351667d400\",\n  \"email\": \"Elbert_Hauck18@example.net\",\n  \"ip\": \"::1\",\n  \"app\": \"ReviewPro\",\n  \"editConfiguration\": false,\n  \"allowDownload\": false,\n  \"allowUpload\": false,\n  \"allowMediaOpen\": false,\n  \"previousProjectGuid\": \"00000000-1000-0000-1000-000000000004\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000000-1000-0000-1000-000000000005","description":"<p><strong>Step 6: create a review project based on the merged project.</strong></p>\n<p>Creates a new project (<code>00000000-1000-0000-1000-000000000005</code>) in <code>ReviewPro</code>, creating the flow between the translate and the review apps. The merged project stays unchanged.</p>\n<p>Link to previous step: <code>previousProjectGuid</code> = <code>00000000-1000-0000-1000-000000000004</code> (the merged project).</p>\n<p><strong>Input</strong></p>\n<ul>\n<li>Route <code>id</code> (required): the project GUID, generated by your system. If a project/request with this id already exists, the stored request is <strong>updated</strong> and the existing project is opened; otherwise it is <strong>created</strong>.</li>\n<li>Body (JSON, <code>ExternalProjectViewModel</code>). Fields used in this step:</li>\n</ul>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>requestId</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Your own correlation id for the request.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>yes</td>\n<td>The user the session is opened for. The user is created if it does not exist and the project is assigned to them.</td>\n</tr>\n<tr>\n<td><code>ip</code></td>\n<td>string</td>\n<td>optional</td>\n<td>optional; stored with the request for auditing. Not currently enforced when the session link is opened.</td>\n</tr>\n<tr>\n<td><code>app</code></td>\n<td>string</td>\n<td>optional</td>\n<td>The application to open: <code>CreatePro</code>, <code>EditPro</code>, <code>TranslatePro</code>, <code>ReviewPro</code>, <code>Scripting</code>, ...</td>\n</tr>\n<tr>\n<td><code>projectName</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Name given to the project when it is created.</td>\n</tr>\n<tr>\n<td><code>editConfiguration</code> / <code>allowDownload</code> / <code>allowUpload</code> / <code>allowMediaOpen</code></td>\n<td>boolean</td>\n<td>optional (default <code>false</code>)</td>\n<td>Whether the session lets the user edit the configuration, download, upload and open media files.</td>\n</tr>\n<tr>\n<td><code>previousProjectGuid</code></td>\n<td>string</td>\n<td>optional</td>\n<td>Guid of the project this one continues from. When the session opens, that project's data is loaded as the starting content; the previous project itself is not modified. If omitted on a repeat call, a previously stored value is kept.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Output</strong></p>\n<ul>\n<li><code>200 OK</code>: a JSON string holding a <strong>single-use session URL</strong>, e.g. <code>\"https://&lt;your-instance&gt;/V2/external?token=&lt;token&gt;\"</code>. Open it in a browser (or iframe) to start the session. A new token is generated on every call to this endpoint.</li>\n<li>The call only stores the request. The project itself is created when the session is opened (or reused if it already exists).</li>\n<li>An empty or unparsable body returns an error response.</li>\n</ul>\n<p><strong>Role</strong>: <code>API</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","project","00000000-1000-0000-1000-000000000005"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"d55e3135-cae6-4aad-9c0d-353e8256bb2b","name":"200 OK","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"requestId\": \"5389f3b0-acb1-4e16-84bb-191f95acecbb\",\n  \"email\": \"Tate_Rowe@example.com\",\n  \"ip\": \"::1\",\n  \"app\": \"ReviewPro\",\n  \"editConfiguration\": false,\n  \"allowDownload\": false,\n  \"allowUpload\": false,\n  \"allowMediaOpen\": false,\n  \"previousProjectGuid\": \"00000000-1000-0000-1000-000000000004\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/external/project/00000000-1000-0000-1000-000000000005"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"\"https://tools.ooona.net/V2/external?token=8f1c2d9a5b7e4c3f9a6d0b1e2c4f7a85\""}],"_postman_id":"5f8e22e7-4b0c-4762-a31e-53a031de3f78"},{"name":"Clean up projects","id":"7b014f6c-3b47-4d79-86a6-d0ab9a4b9f01","request":{"method":"DELETE","header":[],"url":"{{base_url}}/external/delete/00000000-1000-0000-1000-000000000001","description":"<p><strong>Step 7 (optional): clean up the sample projects.</strong></p>\n<p>Deletes one project by id. Run it once per project created by this sample; the examples show the ids used in the flow: base project (<code>00000000-1000-0000-1000-000000000001</code>), task 1 (<code>00000000-1000-0000-1000-000000000002</code>), task 2 (<code>00000000-1000-0000-1000-000000000003</code>), merged project (<code>00000000-1000-0000-1000-000000000004</code>) and the review project (<code>00000000-1000-0000-1000-000000000005</code>). This is what lets you re-run the sample with the same hard-coded guids.</p>\n<p><strong>Input</strong></p>\n<ul>\n<li>Route <code>id</code> (required): the guid of the project to delete. Only the project is deleted; the stored external request is not touched by this endpoint.</li>\n</ul>\n<p><strong>Output</strong></p>\n<ul>\n<li><code>200 OK</code> with an empty body: the project was deleted (the deletion is written to the action log).</li>\n<li><code>404 Not Found</code>: no project with this id exists.</li>\n</ul>\n<p><strong>Role</strong>: <code>API</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","delete","00000000-1000-0000-1000-000000000001"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"97b58bb3-8596-4420-9b04-2dc494741290","name":"Delete QC project","originalRequest":{"method":"DELETE","header":[],"url":"{{base_url}}/external/delete/00000000-1000-0000-1000-000000000005"},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[{"key":"Content-Length","value":"0"}],"cookie":[],"responseTime":null,"body":""},{"id":"55fe9290-ea99-4940-922b-83dbfffaae69","name":"Delete Merged Project","originalRequest":{"method":"DELETE","header":[],"url":"{{base_url}}/external/delete/00000000-1000-0000-1000-000000000004"},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[{"key":"Content-Length","value":"0"}],"cookie":[],"responseTime":null,"body":""},{"id":"30ea761e-d12c-4c92-bfaa-e4374c10b54a","name":"Delete Task 1","originalRequest":{"method":"DELETE","header":[],"url":"{{base_url}}/external/delete/00000000-1000-0000-1000-000000000003"},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[{"key":"Content-Length","value":"0"}],"cookie":[],"responseTime":null,"body":""},{"id":"66dac627-6c72-498c-8a5c-1bc609f66bdf","name":"Delete Task 2","originalRequest":{"method":"DELETE","header":[],"url":"{{base_url}}/external/delete/00000000-1000-0000-1000-000000000002"},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[{"key":"Content-Length","value":"0"}],"cookie":[],"responseTime":null,"body":""},{"id":"a3ae4ab0-fb97-43ea-b5d5-2b7855ce5e83","name":"Delete Base Create Project","originalRequest":{"method":"DELETE","header":[],"url":"{{base_url}}/external/delete/00000000-1000-0000-1000-000000000001"},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[{"key":"Content-Length","value":"0"}],"cookie":[],"responseTime":null,"body":""},{"id":"90098ddf-1668-463f-90df-56a033655f74","name":"404 Project not found","originalRequest":{"method":"DELETE","header":[],"url":"{{base_url}}/external/delete/00000000-0000-0000-0000-000000000000"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":[{"key":"Content-Length","value":"0"}],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"7b014f6c-3b47-4d79-86a6-d0ab9a4b9f01"}],"id":"b96d2966-3882-4c53-9eca-8d5813fa5b40","description":"<p>Sample workflow for <strong>splitting a task</strong> between several translators and putting the pieces back together.</p>\n<p>A base project is split by paragraph indexes into two translate tasks, each task is worked on separately, the tasks are merged into one project, and the merged result is opened and reviewed.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>1. POST external/project/{base}           Create Pro, the full subtitle file\n2. POST external/project/{task1}          Translate Pro, splitLimitation index 1-15\n3. POST external/project/{task2}          Translate Pro, splitLimitation index 31-50\n4. POST external/merge/{merged}           merge task1 + task2 into a new project\n5. POST external/project/{merged}         open the merged project\n6. POST external/project/{review}         Review Pro, previousProjectGuid = merged\n7. DELETE external/delete/{id}            clean up\n</code></pre><p>How the steps are linked: the tasks point to the base project with <code>previousProjectGuid</code> and announce the future merged project in <code>splitLimitation.mergedProjectGuid</code>; the merge request lists the task guids in <code>ProjectGuids</code>; the review project points to the merge result with <code>previousProjectGuid</code>.</p>\n<p>Run the steps in order. Open each returned session URL, work on the project and save (Ctrl+S) before the next step, because later steps read the saved data. The guids are hard-coded: delete the projects (step 7) before running the sample again.</p>\n","_postman_id":"b96d2966-3882-4c53-9eca-8d5813fa5b40","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}}],"id":"7bc12e6b-0ca9-4bcb-a641-4b4e01405d83","description":"<p>Step-by-step sample workflows built from the project endpoints (<code>POST external/project/{id}</code>, <code>POST external/merge/{id}</code> and <code>DELETE external/delete/{id}</code>).</p>\n<p>All of them rely on the same idea: your system chooses the project guids, each request returns a single-use session URL that opens the project in the browser, and projects are linked together so that each step starts from the result of the previous one (<code>previousProjectGuid</code> in the request body).</p>\n<ul>\n<li><strong>Flow between apps</strong>: a chain Scripting, Create Pro, Review Pro, then two translate and review branches.</li>\n<li><strong>Split task</strong>: one project split into two translate tasks by paragraph index, merged back into one project, then reviewed.</li>\n<li><strong>Flow between apps with automation</strong>: the same kind of chain, driven by automation jobs.</li>\n</ul>\n<p>Run the requests of a folder in order; the guids are hard-coded so a sample can only run once until its projects are deleted.</p>\n","_postman_id":"7bc12e6b-0ca9-4bcb-a641-4b4e01405d83","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"🎛️ Engine options","item":[{"name":"Discovery","item":[{"name":"Get transcoder options","id":"e047e195-5469-4310-8bcf-09eebcfbb590","request":{"method":"GET","header":[],"url":"{{base_url}}/external/engines/options?type=Transcoding&engine=ooona","description":"<p>The exposed option tree of the Ooona transcoder. With an untouched instance that is <code>encode</code> (on/off), <code>encode.skip.*</code> and <code>extractDat</code> (on/off).</p>\n<ul>\n<li><code>type</code> (required): an <code>AutomatedJobType</code> name, case-insensitive. Any <code>AutomatedJobType</code> name except <code>None</code> is accepted: <code>Transcoding</code>, <code>SpeechToText</code>, <code>Translation</code>, <code>TextToSpeech</code>, <code>Timing</code>, <code>Storage</code>, <code>Syncheck</code>, <code>Unified</code>, <code>FileTranslation</code>, <code>QualityControl</code>, <code>SmartConform</code> (a type with no option schemas answers an empty result). Numbers, blanks and unknown names answer 400.</li>\n<li><code>engine</code> (optional): the engine key (<code>ooona</code>; the <code>TYPE_NAME</code> form from <code>GET external/engines</code> also works).</li>\n</ul>\n<p>Re-render your form when <code>schemaVersion</code> changes. An engine with nothing exposed answers <code>\"options\": []</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","engines","options"],"host":["{{base_url}}"],"query":[{"description":{"content":"<p>AutomatedJobType name (required)</p>\n","type":"text/plain"},"key":"type","value":"Transcoding"},{"description":{"content":"<p>Engine key (optional)</p>\n","type":"text/plain"},"key":"engine","value":"ooona"}],"variable":[]}},"response":[{"id":"50886127-32de-4aa4-acc4-b6db8f3b56bd","name":"200 Default exposure","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/engines/options?type=Transcoding&engine=ooona","host":["{{base_url}}"],"path":["external","engines","options"],"query":[{"key":"type","value":"Transcoding","description":"AutomatedJobType name (required)"},{"key":"engine","value":"ooona","description":"Engine key (optional)"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"engine\": \"ooona\",\n  \"type\": \"Transcoding\",\n  \"schemaVersion\": 1,\n  \"options\": [\n    {\n      \"key\": \"encode\",\n      \"label\": \"Encode (downconvert)\",\n      \"description\": \"Downconvert the source to a streaming-friendly MP4 proxy. Required for DASH packaging and for the burn-ins and watermark below.\",\n      \"dataType\": \"group\",\n      \"toggle\": true,\n      \"default\": true,\n      \"children\": [\n        {\n          \"key\": \"skip\",\n          \"label\": \"Skip encoding\",\n          \"description\": \"Use the source as the proxy, without encoding, when it already matches every rule below. With no extensions selected the encode is never skipped (the default).\",\n          \"dataType\": \"group\",\n          \"children\": [\n            {\n              \"key\": \"extensions\",\n              \"label\": \"File extensions\",\n              \"description\": \"Source file extensions that may skip the encode.\",\n              \"dataType\": \"multiselect\",\n              \"default\": [],\n              \"options\": [\n                {\n                  \"value\": \"mp4\",\n                  \"label\": \"MP4\"\n                },\n                {\n                  \"value\": \"mov\",\n                  \"label\": \"MOV\"\n                },\n                {\n                  \"value\": \"m4v\",\n                  \"label\": \"M4V\"\n                },\n                {\n                  \"value\": \"mkv\",\n                  \"label\": \"MKV\"\n                },\n                {\n                  \"value\": \"webm\",\n                  \"label\": \"WebM\"\n                },\n                {\n                  \"value\": \"mxf\",\n                  \"label\": \"MXF\"\n                },\n                {\n                  \"value\": \"avi\",\n                  \"label\": \"AVI\"\n                }\n              ]\n            },\n            {\n              \"key\": \"videoCodecs\",\n              \"label\": \"Video codecs\",\n              \"description\": \"Source video codecs that may skip the encode.\",\n              \"dataType\": \"multiselect\",\n              \"default\": [\n                \"h264\"\n              ],\n              \"options\": [\n                {\n                  \"value\": \"h264\",\n                  \"label\": \"H.264 / AVC\"\n                },\n                {\n                  \"value\": \"hevc\",\n                  \"label\": \"H.265 / HEVC\"\n                },\n                {\n                  \"value\": \"vp9\",\n                  \"label\": \"VP9\"\n                },\n                {\n                  \"value\": \"av1\",\n                  \"label\": \"AV1\"\n                },\n                {\n                  \"value\": \"mpeg4\",\n                  \"label\": \"MPEG-4 Part 2\"\n                },\n                {\n                  \"value\": \"prores\",\n                  \"label\": \"ProRes\"\n                }\n              ]\n            },\n            {\n              \"key\": \"audioCodecs\",\n              \"label\": \"Audio codecs\",\n              \"description\": \"Source audio codecs that may skip the encode.\",\n              \"dataType\": \"multiselect\",\n              \"default\": [\n                \"aac\"\n              ],\n              \"options\": [\n                {\n                  \"value\": \"aac\",\n                  \"label\": \"AAC\"\n                },\n                {\n                  \"value\": \"opus\",\n                  \"label\": \"Opus\"\n                },\n                {\n                  \"value\": \"mp3\",\n                  \"label\": \"MP3\"\n                },\n                {\n                  \"value\": \"ac3\",\n                  \"label\": \"AC-3\"\n                },\n                {\n                  \"value\": \"eac3\",\n                  \"label\": \"E-AC-3\"\n                },\n                {\n                  \"value\": \"pcm_s16le\",\n                  \"label\": \"PCM 16-bit\"\n                }\n              ]\n            },\n            {\n              \"key\": \"maxBitrateKbps\",\n              \"label\": \"Maximum video bitrate (Kbps)\",\n              \"description\": \"A source with a higher video bitrate is encoded.\",\n              \"dataType\": \"integer\",\n              \"default\": 1000,\n              \"min\": 100,\n              \"max\": 100000\n            },\n            {\n              \"key\": \"maxHeightPx\",\n              \"label\": \"Maximum video height (pixels)\",\n              \"description\": \"A taller source is encoded.\",\n              \"dataType\": \"integer\",\n              \"default\": 720,\n              \"min\": 144,\n              \"max\": 4320\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"key\": \"extractDat\",\n      \"label\": \"Extract .dat\",\n      \"description\": \"Metadata, waveform and shot changes written to a .dat file.\",\n      \"dataType\": \"group\",\n      \"toggle\": true,\n      \"default\": true,\n      \"children\": []\n    }\n  ]\n}"},{"id":"ffbef9a5-5a04-4b71-9dd4-ccf37e17bf9c","name":"404 Engine without options","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/engines/options?type=Transcoding&engine=ooona","host":["{{base_url}}"],"path":["external","engines","options"],"query":[{"key":"type","value":"Transcoding","description":"AutomatedJobType name (required)"},{"key":"engine","value":"ooona","description":"Engine key (optional)"}]}},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"Engine 'nope' has no options for Transcoding.\"\n}"}],"_postman_id":"e047e195-5469-4310-8bcf-09eebcfbb590"},{"name":"Get options of a type","id":"1fa0e34b-41b3-44d7-860c-7817c194dd06","request":{"method":"GET","header":[],"url":"{{base_url}}/external/engines/options?type=Transcoding","description":"<p>Without <code>engine</code>: every engine of the type that has an option schema, as <code>{ \"engines\": [ … ] }</code>. A type none of whose engines has a schema answers <code>200 { \"engines\": [] }</code> (try <code>type=SpeechToText</code>).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["external","engines","options"],"host":["{{base_url}}"],"query":[{"description":{"content":"<p>AutomatedJobType name (required)</p>\n","type":"text/plain"},"key":"type","value":"Transcoding"}],"variable":[]}},"response":[{"id":"8edce3e6-620b-48e3-9cab-e0f9d1a624bf","name":"200 Transcoding engines","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/engines/options?type=Transcoding","host":["{{base_url}}"],"path":["external","engines","options"],"query":[{"key":"type","value":"Transcoding","description":"AutomatedJobType name (required)"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"engines\": [\n    {\n      \"engine\": \"ooona\",\n      \"type\": \"Transcoding\",\n      \"schemaVersion\": 1,\n      \"options\": [\n        {\n          \"key\": \"encode\",\n          \"label\": \"Encode (downconvert)\",\n          \"description\": \"Downconvert the source to a streaming-friendly MP4 proxy. Required for DASH packaging and for the burn-ins and watermark below.\",\n          \"dataType\": \"group\",\n          \"toggle\": true,\n          \"default\": true,\n          \"children\": [\n            {\n              \"key\": \"skip\",\n              \"label\": \"Skip encoding\",\n              \"description\": \"Use the source as the proxy, without encoding, when it already matches every rule below. With no extensions selected the encode is never skipped (the default).\",\n              \"dataType\": \"group\",\n              \"children\": [\n                {\n                  \"key\": \"extensions\",\n                  \"label\": \"File extensions\",\n                  \"description\": \"Source file extensions that may skip the encode.\",\n                  \"dataType\": \"multiselect\",\n                  \"default\": [],\n                  \"options\": [\n                    {\n                      \"value\": \"mp4\",\n                      \"label\": \"MP4\"\n                    },\n                    {\n                      \"value\": \"mov\",\n                      \"label\": \"MOV\"\n                    },\n                    {\n                      \"value\": \"m4v\",\n                      \"label\": \"M4V\"\n                    },\n                    {\n                      \"value\": \"mkv\",\n                      \"label\": \"MKV\"\n                    },\n                    {\n                      \"value\": \"webm\",\n                      \"label\": \"WebM\"\n                    },\n                    {\n                      \"value\": \"mxf\",\n                      \"label\": \"MXF\"\n                    },\n                    {\n                      \"value\": \"avi\",\n                      \"label\": \"AVI\"\n                    }\n                  ]\n                },\n                {\n                  \"key\": \"videoCodecs\",\n                  \"label\": \"Video codecs\",\n                  \"description\": \"Source video codecs that may skip the encode.\",\n                  \"dataType\": \"multiselect\",\n                  \"default\": [\n                    \"h264\"\n                  ],\n                  \"options\": [\n                    {\n                      \"value\": \"h264\",\n                      \"label\": \"H.264 / AVC\"\n                    },\n                    {\n                      \"value\": \"hevc\",\n                      \"label\": \"H.265 / HEVC\"\n                    },\n                    {\n                      \"value\": \"vp9\",\n                      \"label\": \"VP9\"\n                    },\n                    {\n                      \"value\": \"av1\",\n                      \"label\": \"AV1\"\n                    },\n                    {\n                      \"value\": \"mpeg4\",\n                      \"label\": \"MPEG-4 Part 2\"\n                    },\n                    {\n                      \"value\": \"prores\",\n                      \"label\": \"ProRes\"\n                    }\n                  ]\n                },\n                {\n                  \"key\": \"audioCodecs\",\n                  \"label\": \"Audio codecs\",\n                  \"description\": \"Source audio codecs that may skip the encode.\",\n                  \"dataType\": \"multiselect\",\n                  \"default\": [\n                    \"aac\"\n                  ],\n                  \"options\": [\n                    {\n                      \"value\": \"aac\",\n                      \"label\": \"AAC\"\n                    },\n                    {\n                      \"value\": \"opus\",\n                      \"label\": \"Opus\"\n                    },\n                    {\n                      \"value\": \"mp3\",\n                      \"label\": \"MP3\"\n                    },\n                    {\n                      \"value\": \"ac3\",\n                      \"label\": \"AC-3\"\n                    },\n                    {\n                      \"value\": \"eac3\",\n                      \"label\": \"E-AC-3\"\n                    },\n                    {\n                      \"value\": \"pcm_s16le\",\n                      \"label\": \"PCM 16-bit\"\n                    }\n                  ]\n                },\n                {\n                  \"key\": \"maxBitrateKbps\",\n                  \"label\": \"Maximum video bitrate (Kbps)\",\n                  \"description\": \"A source with a higher video bitrate is encoded.\",\n                  \"dataType\": \"integer\",\n                  \"default\": 1000,\n                  \"min\": 100,\n                  \"max\": 100000\n                },\n                {\n                  \"key\": \"maxHeightPx\",\n                  \"label\": \"Maximum video height (pixels)\",\n                  \"description\": \"A taller source is encoded.\",\n                  \"dataType\": \"integer\",\n                  \"default\": 720,\n                  \"min\": 144,\n                  \"max\": 4320\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"key\": \"extractDat\",\n          \"label\": \"Extract .dat\",\n          \"description\": \"Metadata, waveform and shot changes written to a .dat file.\",\n          \"dataType\": \"group\",\n          \"toggle\": true,\n          \"default\": true,\n          \"children\": []\n        }\n      ]\n    }\n  ]\n}"},{"id":"43f32de2-bd70-4be5-9725-1d7f7da38fb2","name":"200 Type without schemas","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/engines/options?type=Transcoding","host":["{{base_url}}"],"path":["external","engines","options"],"query":[{"key":"type","value":"Transcoding","description":"AutomatedJobType name (required)"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"engines\": []\n}"},{"id":"bca222a3-08af-426e-b5eb-ce32425bc1e5","name":"400 Unknown type","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/external/engines/options?type=Transcoding","host":["{{base_url}}"],"path":["external","engines","options"],"query":[{"key":"type","value":"Transcoding","description":"AutomatedJobType name (required)"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"Invalid engine options: type: 'Transcode' is not a job type; use a name such as Transcoding\",\n  \"errors\": [\n    {\n      \"path\": \"type\",\n      \"reason\": \"'Transcode' is not a job type; use a name such as Transcoding\"\n    }\n  ]\n}"}],"_postman_id":"1fa0e34b-41b3-44d7-860c-7817c194dd06"}],"id":"e7c28596-98c2-419e-93f5-8c195703be09","description":"<p>Which options an integrator may send, as a ready-to-render form. Only exposed options are listed; <code>default</code> is the instance default when an admin set one, else the engine default. Locked, sensitive and hidden options are left out. Authentication: the API / UserAPI bearer token (same as <code>GET external/engines</code>).</p>\n","_postman_id":"e7c28596-98c2-419e-93f5-8c195703be09","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"Transcode","item":[{"name":"Get an upload URL","event":[{"listen":"test","script":{"type":"text/javascript","exec":["const res = pm.response.json();\npm.test('Has a PUT URL', () => pm.expect(res.put).to.be.a('string'));\nconst key = decodeURIComponent(new URL(res.get).pathname).replace(/^\\//, '');\npm.environment.set('transcodeUploadUrl', res.put);\npm.environment.set('transcodeS3Key', key);\nconsole.log('transcodeS3Key =', key);"]}}],"id":"bea7746f-98be-40f6-88e1-59a53ab2a131","request":{"method":"GET","header":[],"url":"{{base_url}}/upload/GetUploadUrl?id=mp4&filename=ep101.mp4","description":"<p>A presigned PUT URL in your own upload area, <code>temp/{your user id}/{guid}.mp4</code> (valid 24 h; the bucket expires <code>temp/</code> objects). <code>id</code> is the file extension: <code>mp4</code>, <code>jpg</code>, <code>doc</code>, <code>docx</code>, <code>xls</code>, <code>xlsx</code> or <code>rtf</code>.</p>\n<p>The script stores the key as <code>transcodeS3Key</code>. Note: this also creates a media library record (the <code>id</code> in the response); don't send that id as <code>mediaId</code> unless you want the library's protected version.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["upload","GetUploadUrl"],"host":["{{base_url}}"],"query":[{"description":{"content":"<p>File extension</p>\n","type":"text/plain"},"key":"id","value":"mp4"},{"description":{"content":"<p>Original file name (stored on the library record)</p>\n","type":"text/plain"},"key":"filename","value":"ep101.mp4"}],"variable":[]}},"response":[{"id":"873437de-f6a0-4893-ac5c-a566843d617a","name":"200 Upload URL","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/upload/GetUploadUrl?id=mp4&filename=ep101.mp4","host":["{{base_url}}"],"path":["upload","GetUploadUrl"],"query":[{"key":"id","value":"mp4","description":"File extension"},{"key":"filename","value":"ep101.mp4","description":"Original file name (stored on the library record)"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"put\": \"https://ooona-instance.s3.amazonaws.com/temp/a91c4e07-52d8-4b3f-8e16-7d0a9b2c3f41/3f9a1c2e-6b1d-4c55-9a7e-0d4b8f1e2a33.mp4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=86400&X-Amz-Signature=…\",\n  \"get\": \"https://ooona-instance.s3.amazonaws.com/temp/a91c4e07-52d8-4b3f-8e16-7d0a9b2c3f41/3f9a1c2e-6b1d-4c55-9a7e-0d4b8f1e2a33.mp4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=172800&X-Amz-Signature=…\",\n  \"id\": \"7c1e9d2a-0b3f-4e8a-9d61-5a2f0c7b4e18\"\n}"}],"_postman_id":"bea7746f-98be-40f6-88e1-59a53ab2a131"},{"name":"Upload the media","id":"5afdebe1-d82a-48cf-aeb3-c5e4a477dfb7","request":{"auth":{"type":"noauth","isInherited":false},"method":"PUT","header":[],"body":{"mode":"file","file":{"src":""}},"url":"{{transcodeUploadUrl}}","description":"<p>Uploads the file to the presigned URL from <em>Get an upload URL</em>. Pick the file under <strong>Body → binary</strong>. No Toolkit auth: the URL is signed. Afterwards <code>transcodeS3Key</code> names your file.</p>\n","urlObject":{"host":["{{transcodeUploadUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"5afdebe1-d82a-48cf-aeb3-c5e4a477dfb7"},{"name":"Transcode a URL (defaults)","event":[{"listen":"test","script":{"type":"text/javascript","exec":["const res = pm.response.json();\npm.test('Job created', () => pm.expect(res.id).to.be.a('string'));\npm.environment.set('transcodeJobId', res.id);"]}}],"id":"1184780a-9eac-46b0-a81c-1906eeb7d2c3","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"provider\": \"ooona\",\n  \"url\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/integrations/transcode","description":"<p>The smallest request: a public https URL, no options. The transcoder gets exactly the payload it got before engine options existed (DASH + Widevine DRM when the instance has a DRM key, <code>.dat</code> with shot changes).</p>\n<p>Outputs go to <code>/output/{path of the URL}</code> in the transcoder bucket; the status response lists them only when that path has at least two segments (as here). Use <code>outputPath</code> to choose your own location.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["api","integrations","transcode"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"a7953569-123b-4023-901a-3d06449f9ba2","name":"200 Job created","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"provider\": \"ooona\",\n  \"url\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/integrations/transcode"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"0f1e2d3c4b5a69788796a5b4c3d2e1f0\",\n  \"type\": \"Transcoding\",\n  \"engine\": \"Ooona\",\n  \"status\": \"Waiting\",\n  \"progress\": 0,\n  \"jobId\": \"0f1e2d3c4b5a69788796a5b4c3d2e1f0\",\n  \"mediaId\": null,\n  \"projectId\": \"\",\n  \"startedAt\": \"2026-10-15T09:00:00Z\",\n  \"completedAt\": null,\n  \"error\": null,\n  \"result\": null\n}"},{"id":"65263819-2b22-4cdd-acaf-8cf22acc62bf","name":"400 http or private URL","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"provider\": \"ooona\",\n  \"url\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/integrations/transcode"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"Invalid transcode request: url: url must use https\",\n  \"errors\": [\n    {\n      \"path\": \"url\",\n      \"reason\": \"url must use https\"\n    }\n  ]\n}"}],"_postman_id":"1184780a-9eac-46b0-a81c-1906eeb7d2c3"},{"name":"Transcode an s3Key","event":[{"listen":"test","script":{"type":"text/javascript","exec":["const res = pm.response.json();\npm.test('Job created', () => pm.expect(res.id).to.be.a('string'));\npm.environment.set('transcodeJobId', res.id);"]}}],"id":"8440b2ec-4f19-4b33-9aca-0ca396cba2c5","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"provider\": \"ooona\",\n  \"s3Key\": \"{{transcodeS3Key}}\",\n  \"outputPath\": \"acme/ep101\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/integrations/transcode","description":"<p>Uses the key from <em>Upload the media</em> (<code>{{transcodeS3Key}}</code>) and writes the outputs to <code>output/_clients/{your client id}/acme/ep101/</code>.</p>\n<ul>\n<li><code>s3Key</code> must be in <code>tasks/{your client id}/</code> or <code>temp/{your user id}/</code> and must exist; Toolkit presigns it for the transcoder.</li>\n<li>Send <code>url</code> <strong>or</strong> <code>s3Key</code>, never both.</li>\n<li>Give each job its own <code>outputPath</code> when you keep results side by side (the ASR video is named after the media file).</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["api","integrations","transcode"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"bf5904df-a4d9-4178-ba55-345903273575","name":"200 Job created","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"provider\": \"ooona\",\n  \"s3Key\": \"{{transcodeS3Key}}\",\n  \"outputPath\": \"acme/ep101\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/integrations/transcode"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"0f1e2d3c4b5a69788796a5b4c3d2e1f0\",\n  \"type\": \"Transcoding\",\n  \"engine\": \"Ooona\",\n  \"status\": \"Waiting\",\n  \"progress\": 0,\n  \"jobId\": \"0f1e2d3c4b5a69788796a5b4c3d2e1f0\",\n  \"mediaId\": null,\n  \"projectId\": \"\",\n  \"startedAt\": \"2026-10-15T09:00:00Z\",\n  \"completedAt\": null,\n  \"error\": null,\n  \"result\": null\n}"},{"id":"d49ad69c-b0fe-4b6f-8ad8-7a5a849ec9a5","name":"400 Foreign key","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"provider\": \"ooona\",\n  \"s3Key\": \"{{transcodeS3Key}}\",\n  \"outputPath\": \"acme/ep101\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/integrations/transcode"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"Invalid transcode request: s3Key: must be in your own storage area (tasks/<client>/ or temp/<user>/); send a 'url' instead\",\n  \"errors\": [\n    {\n      \"path\": \"s3Key\",\n      \"reason\": \"must be in your own storage area (tasks/<client>/ or temp/<user>/); send a 'url' instead\"\n    }\n  ]\n}"},{"id":"d2a9a18c-7afb-4155-bd72-3e4aadc71a93","name":"400 Bad outputPath","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"provider\": \"ooona\",\n  \"s3Key\": \"{{transcodeS3Key}}\",\n  \"outputPath\": \"acme/ep101\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/integrations/transcode"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"Invalid transcode request: outputPath: must not contain '..'\",\n  \"errors\": [\n    {\n      \"path\": \"outputPath\",\n      \"reason\": \"must not contain '..'\"\n    }\n  ]\n}"},{"id":"60f91eec-c54f-4cad-8791-dbb9ad969f62","name":"400 Both url and s3Key","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"provider\": \"ooona\",\n  \"s3Key\": \"{{transcodeS3Key}}\",\n  \"outputPath\": \"acme/ep101\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/integrations/transcode"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"Invalid transcode request: s3Key: send either 'url' or 's3Key', not both\",\n  \"errors\": [\n    {\n      \"path\": \"s3Key\",\n      \"reason\": \"send either 'url' or 's3Key', not both\"\n    }\n  ]\n}"}],"_postman_id":"8440b2ec-4f19-4b33-9aca-0ca396cba2c5"},{"name":"Transcode with skip rules","event":[{"listen":"test","script":{"type":"text/javascript","exec":["const res = pm.response.json();\npm.test('Job created', () => pm.expect(res.id).to.be.a('string'));\npm.environment.set('transcodeJobId', res.id);"]}}],"id":"18a2306d-3667-404e-8504-bb042b407b03","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"provider\": \"ooona\",\n  \"url\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n  \"outputPath\": \"acme/ep101-skip\",\n  \"engineOptions\": {\n    \"encode\": {\n      \"enabled\": true,\n      \"skip\": {\n        \"extensions\": [\n          \"mp4\",\n          \"mov\"\n        ],\n        \"videoCodecs\": [\n          \"h264\",\n          \"hevc\"\n        ],\n        \"audioCodecs\": [\n          \"aac\"\n        ],\n        \"maxBitrateKbps\": 4000,\n        \"maxHeightPx\": 1080\n      }\n    },\n    \"extractDat\": false\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/integrations/transcode","description":"<p>Only uses options that are <strong>exposed by default</strong>, so it works on an untouched instance:</p>\n<ul>\n<li><code>encode.skip.*</code>: use the source as the proxy without re-encoding when it is an MP4/MOV with H.264 or HEVC video, AAC audio, at most 4 Mbps and 1080p.</li>\n<li><code>extractDat: false</code>: no <code>.dat</code> file.</li>\n</ul>\n<p>Any value for an option that isn't exposed is ignored (and logged), not rejected.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["api","integrations","transcode"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"f1c81780-99a8-4b74-ab2d-554491875f0d","name":"200 Job created","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"provider\": \"ooona\",\n  \"url\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n  \"outputPath\": \"acme/ep101-skip\",\n  \"engineOptions\": {\n    \"encode\": {\n      \"enabled\": true,\n      \"skip\": {\n        \"extensions\": [\n          \"mp4\",\n          \"mov\"\n        ],\n        \"videoCodecs\": [\n          \"h264\",\n          \"hevc\"\n        ],\n        \"audioCodecs\": [\n          \"aac\"\n        ],\n        \"maxBitrateKbps\": 4000,\n        \"maxHeightPx\": 1080\n      }\n    },\n    \"extractDat\": false\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/integrations/transcode"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"0f1e2d3c4b5a69788796a5b4c3d2e1f0\",\n  \"type\": \"Transcoding\",\n  \"engine\": \"Ooona\",\n  \"status\": \"Waiting\",\n  \"progress\": 0,\n  \"jobId\": \"0f1e2d3c4b5a69788796a5b4c3d2e1f0\",\n  \"mediaId\": null,\n  \"projectId\": \"\",\n  \"startedAt\": \"2026-10-15T09:00:00Z\",\n  \"completedAt\": null,\n  \"error\": null,\n  \"result\": null\n}"}],"_postman_id":"18a2306d-3667-404e-8504-bb042b407b03"},{"name":"Transcode with burn-ins","event":[{"listen":"test","script":{"type":"text/javascript","exec":["const res = pm.response.json();\npm.test('Job created', () => pm.expect(res.id).to.be.a('string'));\npm.environment.set('transcodeJobId', res.id);"]}}],"id":"11774b6c-713a-4755-bedc-b2f01989351e","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"provider\": \"ooona\",\n  \"url\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n  \"outputPath\": \"acme/ep101-review\",\n  \"engineOptions\": {\n    \"encode\": {\n      \"enabled\": true,\n      \"burnSmpteTc\": true,\n      \"burnFrameCounter\": false,\n      \"burnMediaTime\": true,\n      \"watermark\": { \"s3Key\": \"temp/{{user_id}}/logo.png\" }\n    }\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/integrations/transcode","description":"<p>Needs an admin to expose <code>encode.burnSmpteTc</code>, <code>encode.burnFrameCounter</code>, <code>encode.burnMediaTime</code> and <code>encode.watermark</code> first (see <em>Admin → Expose options</em>); until then these values are ignored.</p>\n<p><code>watermark</code> is a <code>.png</code> file, sent as <code>{ \"s3Key\": \"…\" }</code> (your own area) or <code>{ \"url\": \"https://…\" }</code>. Toolkit hands the transcoder a presigned URL valid 24 hours.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["api","integrations","transcode"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"33ccb712-86ff-4fc4-b956-467b33f7d3d2","name":"200 Job created","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"provider\": \"ooona\",\n  \"url\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n  \"outputPath\": \"acme/ep101-review\",\n  \"engineOptions\": {\n    \"encode\": {\n      \"enabled\": true,\n      \"burnSmpteTc\": true,\n      \"burnFrameCounter\": false,\n      \"burnMediaTime\": true,\n      \"watermark\": { \"s3Key\": \"temp/{{user_id}}/logo.png\" }\n    }\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/integrations/transcode"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"0f1e2d3c4b5a69788796a5b4c3d2e1f0\",\n  \"type\": \"Transcoding\",\n  \"engine\": \"Ooona\",\n  \"status\": \"Waiting\",\n  \"progress\": 0,\n  \"jobId\": \"0f1e2d3c4b5a69788796a5b4c3d2e1f0\",\n  \"mediaId\": null,\n  \"projectId\": \"\",\n  \"startedAt\": \"2026-10-15T09:00:00Z\",\n  \"completedAt\": null,\n  \"error\": null,\n  \"result\": null\n}"},{"id":"89c9f880-16ae-42b0-a003-cabab8f4b1c3","name":"400 Foreign watermark key","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"provider\": \"ooona\",\n  \"url\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n  \"outputPath\": \"acme/ep101-review\",\n  \"engineOptions\": {\n    \"encode\": {\n      \"enabled\": true,\n      \"burnSmpteTc\": true,\n      \"burnFrameCounter\": false,\n      \"burnMediaTime\": true,\n      \"watermark\": { \"s3Key\": \"temp/{{user_id}}/logo.png\" }\n    }\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/integrations/transcode"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"Invalid engine options: encode.watermark: must be in your own storage area (tasks/<client>/ or temp/<user>/); send a 'url' instead\",\n  \"errors\": [\n    {\n      \"path\": \"encode.watermark\",\n      \"reason\": \"must be in your own storage area (tasks/<client>/ or temp/<user>/); send a 'url' instead\"\n    }\n  ]\n}"}],"_postman_id":"11774b6c-713a-4755-bedc-b2f01989351e"},{"name":"Transcode with extraction","event":[{"listen":"test","script":{"type":"text/javascript","exec":["const res = pm.response.json();\npm.test('Job created', () => pm.expect(res.id).to.be.a('string'));\npm.environment.set('transcodeJobId', res.id);"]}}],"id":"a85c5c13-1d3d-473b-94df-cbd46d8b262a","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"provider\": \"ooona\",\n  \"url\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n  \"outputPath\": \"acme/ep101-asr\",\n  \"engineOptions\": {\n    \"encode\": {\n      \"enabled\": true,\n      \"ffmpegArgs\": \"-c:v libx264 -crf 20 -preset slow -profile:v high\",\n      \"keepMp4\": true\n    },\n    \"extractAudio\": {\n      \"enabled\": true,\n      \"extension\": \"wav\",\n      \"ffmpegArgs\": \"-c:a pcm_s16le -ar 16000 -ac 1\"\n    },\n    \"extractAsrVideo\": {\n      \"enabled\": true,\n      \"extension\": \"mp4\",\n      \"ffmpegArgs\": \"-r 10 -b:v 300k -c:a aac -ac 1\"\n    }\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/integrations/transcode","description":"<p>Needs <code>extractAudio</code>, <code>extractAsrVideo</code> and their children exposed by an admin.</p>\n<ul>\n<li><code>extractAudio</code>: a separate audio file for ASR. <code>extension</code>: aac, m4a, mp3, wav, flac. <code>ffmpegArgs</code> allows only <code>-c:a</code>, <code>-b:a</code>, <code>-ar</code>, <code>-ac</code>.</li>\n<li><code>extractAsrVideo</code>: a low-quality <code>_asrvideo</code> MP4 with full audio. <code>extension</code>: mp4, mov, mkv. <code>ffmpegArgs</code> takes the video allowlist.</li>\n<li><code>encode.ffmpegArgs</code>: extra encoding parameters for the proxy.</li>\n<li><code>encode.keepMp4</code>: keep the MP4 proxy next to the DASH output (listed as <code>mp4</code> in the outputs).</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["api","integrations","transcode"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"574edc4f-baca-4bb4-8b3b-a1a15a2ccfe1","name":"200 Job created","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"provider\": \"ooona\",\n  \"url\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n  \"outputPath\": \"acme/ep101-asr\",\n  \"engineOptions\": {\n    \"encode\": {\n      \"enabled\": true,\n      \"ffmpegArgs\": \"-c:v libx264 -crf 20 -preset slow -profile:v high\",\n      \"keepMp4\": true\n    },\n    \"extractAudio\": {\n      \"enabled\": true,\n      \"extension\": \"wav\",\n      \"ffmpegArgs\": \"-c:a pcm_s16le -ar 16000 -ac 1\"\n    },\n    \"extractAsrVideo\": {\n      \"enabled\": true,\n      \"extension\": \"mp4\",\n      \"ffmpegArgs\": \"-r 10 -b:v 300k -c:a aac -ac 1\"\n    }\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/integrations/transcode"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"0f1e2d3c4b5a69788796a5b4c3d2e1f0\",\n  \"type\": \"Transcoding\",\n  \"engine\": \"Ooona\",\n  \"status\": \"Waiting\",\n  \"progress\": 0,\n  \"jobId\": \"0f1e2d3c4b5a69788796a5b4c3d2e1f0\",\n  \"mediaId\": null,\n  \"projectId\": \"\",\n  \"startedAt\": \"2026-10-15T09:00:00Z\",\n  \"completedAt\": null,\n  \"error\": null,\n  \"result\": null\n}"}],"_postman_id":"a85c5c13-1d3d-473b-94df-cbd46d8b262a"},{"name":"Transcode with DRM settings","event":[{"listen":"test","script":{"type":"text/javascript","exec":["const res = pm.response.json();\npm.test('Job created', () => pm.expect(res.id).to.be.a('string'));\npm.environment.set('transcodeJobId', res.id);"]}}],"id":"744422a1-7158-49c8-b559-302974bf5906","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"provider\": \"ooona\",\n  \"url\": \"https://public.ooona.net/video/Amyloidosis%20Awareness.MP4\",\n  \"outputPath\": \"acme/ep101-drm\",\n  \"engineOptions\": {\n    \"dash\": {\n      \"enabled\": true,\n      \"drm\": true\n    },\n    \"encode\": {\n      \"enabled\": true,\n      \"burnSmpteTc\": true,\n      \"burnFrameCounter\": false,\n      \"burnMediaTime\": true,\n      \"watermark\": { \"url\": \"https://public.ooona.net/ooona-semi-transparent.png\" }\n    }\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/integrations/transcode","description":"<p>Needs <code>dash</code> and <code>dash.drm</code> exposed by an admin.</p>\n<ul>\n<li><code>dash: false</code> (or <code>{ \"enabled\": false }</code>) produces an MP4 instead of DASH.</li>\n<li>There is no security level option: the Widevine license policy is set by Toolkit, for browser playback (L3).</li>\n<li><code>dash.host</code> / <code>dash.apiKey</code> are sensitive: never exposed, never accepted; the instance's DRM service is always used.</li>\n<li>A protected Task Manager upload or a media library <code>mediaId</code> always gets DASH + DRM, whatever you send.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["api","integrations","transcode"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"f4895b3f-6edb-4a52-a320-99479c14268a","name":"200 Job created","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"provider\": \"ooona\",\n  \"url\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n  \"outputPath\": \"acme/ep101-drm\",\n  \"engineOptions\": {\n    \"dash\": {\n      \"enabled\": true,\n      \"drm\": true\n    }\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/integrations/transcode"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"0f1e2d3c4b5a69788796a5b4c3d2e1f0\",\n  \"type\": \"Transcoding\",\n  \"engine\": \"Ooona\",\n  \"status\": \"Waiting\",\n  \"progress\": 0,\n  \"jobId\": \"0f1e2d3c4b5a69788796a5b4c3d2e1f0\",\n  \"mediaId\": null,\n  \"projectId\": \"\",\n  \"startedAt\": \"2026-10-15T09:00:00Z\",\n  \"completedAt\": null,\n  \"error\": null,\n  \"result\": null\n}"}],"_postman_id":"744422a1-7158-49c8-b559-302974bf5906"},{"name":"Invalid option values (400)","id":"e03f85c6-a31c-4874-9026-fbf977872815","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"provider\": \"ooona\",\n  \"url\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n  \"engineOptions\": {\n    \"encode\": {\n      \"enabled\": true,\n      \"ffmpegArgs\": \"-vf movie=/etc/passwd\",\n      \"skip\": {\n        \"maxBitrateKbps\": 50,\n        \"extensions\": [\n          \"mp4\",\n          \"exe\"\n        ]\n      }\n    }\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/integrations/transcode","description":"<p>Shows the validation errors. Every invalid <strong>exposed</strong> option is listed; nothing is created or charged. (<code>encode.ffmpegArgs</code> must be exposed for its error to show; otherwise it is ignored.)</p>\n<p>Rejected here: an integer below <code>min</code>, a value not in the multiselect list, a filter in the ffmpeg args.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["api","integrations","transcode"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"b6bd437c-542a-4f79-860d-6c30b1a8606b","name":"400 Invalid values","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"provider\": \"ooona\",\n  \"url\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n  \"engineOptions\": {\n    \"encode\": {\n      \"enabled\": true,\n      \"ffmpegArgs\": \"-vf movie=/etc/passwd\",\n      \"skip\": {\n        \"maxBitrateKbps\": 50,\n        \"extensions\": [\n          \"mp4\",\n          \"exe\"\n        ]\n      }\n    }\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/integrations/transcode"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"Invalid engine options: encode.ffmpegArgs: '-vf' is not allowed: filters can read files (movie=, amovie=, drawtext textfile=); encode.skip.extensions: must be one of: mp4, mov, m4v, mkv, webm, mxf, avi; encode.skip.maxBitrateKbps: must be at least 100\",\n  \"errors\": [\n    {\n      \"path\": \"encode.ffmpegArgs\",\n      \"reason\": \"'-vf' is not allowed: filters can read files (movie=, amovie=, drawtext textfile=)\"\n    },\n    {\n      \"path\": \"encode.skip.extensions\",\n      \"reason\": \"must be one of: mp4, mov, m4v, mkv, webm, mxf, avi\"\n    },\n    {\n      \"path\": \"encode.skip.maxBitrateKbps\",\n      \"reason\": \"must be at least 100\"\n    }\n  ]\n}"},{"id":"d2a7aa68-30c0-470a-9c02-0cfe5ba530fe","name":"400 Not an object","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"provider\": \"ooona\",\n  \"url\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n  \"engineOptions\": {\n    \"encode\": {\n      \"enabled\": true,\n      \"ffmpegArgs\": \"-vf movie=/etc/passwd\",\n      \"skip\": {\n        \"maxBitrateKbps\": 50,\n        \"extensions\": [\n          \"mp4\",\n          \"exe\"\n        ]\n      }\n    }\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/integrations/transcode"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"Invalid engine options: engineOptions: must be a JSON object\",\n  \"errors\": [\n    {\n      \"path\": \"engineOptions\",\n      \"reason\": \"must be a JSON object\"\n    }\n  ]\n}"}],"_postman_id":"e03f85c6-a31c-4874-9026-fbf977872815"},{"name":"Get transcode status","event":[{"listen":"test","script":{"type":"text/javascript","exec":["const res = pm.response.json();\npm.test('Status is known', () => pm.expect(res.status).to.be.a('string'));\nif (res.outputs) {\n  const mpd = res.outputs.files.find(f => f.kind === 'mpd');\n  if (mpd) pm.environment.set('transcodeMpdUrl', mpd.url);\n}"]}}],"id":"a737d8c3-260e-4fe5-81ae-f25d1d7655e9","request":{"method":"GET","header":[],"url":"{{base_url}}/api/integrations/transcode/ooona/{{transcodeJobId}}","description":"<p>Poll until <code>status</code> is <code>Success</code> or <code>Failure</code> (there is no callback to you for this endpoint).</p>\n<p>Once the job succeeded, the job's owner also gets <code>outputs</code>: every file the transcoder produced, each with a fresh presigned GET URL valid <code>urlValidHours</code> (24 h). URLs are made on each request: ask again for fresh ones.</p>\n<ul>\n<li><code>kind</code>: <code>mpd</code> (DASH manifest), <code>dat</code>, <code>asrVideo</code>, <code>mp4</code> (proxy), <code>audio</code>, <code>other</code> (init segments, …).</li>\n<li>DASH media segments (<code>.m4s</code>) are only counted in <code>segmentCount</code>; the manifest addresses them relatively.</li>\n<li>Use <code>outputs</code>, not the <code>result</code> URLs (those expire after ten minutes).</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["api","integrations","transcode","ooona","{{transcodeJobId}}"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"808d7ca1-e416-42d8-8740-ceb9164448fa","name":"200 Running","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/api/integrations/transcode/ooona/{{transcodeJobId}}"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"0f1e2d3c4b5a69788796a5b4c3d2e1f0\",\n  \"type\": \"Transcoding\",\n  \"engine\": \"Ooona\",\n  \"status\": \"Running\",\n  \"progress\": 42,\n  \"jobId\": \"0f1e2d3c4b5a69788796a5b4c3d2e1f0\",\n  \"mediaId\": null,\n  \"projectId\": \"\",\n  \"startedAt\": \"2026-10-15T09:00:00Z\",\n  \"completedAt\": null,\n  \"error\": null,\n  \"result\": null\n}"},{"id":"e4d3073b-8d90-474f-9789-99b0fdd468b7","name":"200 Success","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/api/integrations/transcode/ooona/{{transcodeJobId}}"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"0f1e2d3c4b5a69788796a5b4c3d2e1f0\",\n  \"type\": \"Transcoding\",\n  \"engine\": \"Ooona\",\n  \"status\": \"Success\",\n  \"progress\": 100,\n  \"jobId\": \"0f1e2d3c4b5a69788796a5b4c3d2e1f0\",\n  \"mediaId\": null,\n  \"projectId\": \"\",\n  \"startedAt\": \"2026-10-15T09:00:00Z\",\n  \"completedAt\": \"2026-10-15T09:12:41Z\",\n  \"error\": null,\n  \"result\": null,\n  \"outputs\": {\n    \"urlValidHours\": 24,\n    \"expiresAt\": \"2026-10-16T09:30:00Z\",\n    \"bucket\": \"ooona-transcoder\",\n    \"folder\": \"output/_clients/6f2b7d34/acme/ep101/tmp-3f9a1c/\",\n    \"segmentCount\": 412,\n    \"files\": [\n      {\n        \"kind\": \"mpd\",\n        \"bucket\": \"ooona-transcoder\",\n        \"key\": \"output/_clients/6f2b7d34/acme/ep101/tmp-3f9a1c/ep101.mpd\",\n        \"url\": \"https://ooona-transcoder.s3.eu-west-1.amazonaws.com/output/_clients/6f2b7d34/acme/ep101/tmp-3f9a1c/ep101.mpd?X-Amz-Expires=86400&X-Amz-Signature=…\"\n      },\n      {\n        \"kind\": \"dat\",\n        \"bucket\": \"ooona-transcoder\",\n        \"key\": \"output/_clients/6f2b7d34/acme/ep101/tmp-3f9a1c/ep101.dat\",\n        \"url\": \"https://…\"\n      },\n      {\n        \"kind\": \"asrVideo\",\n        \"bucket\": \"ooona-transcoder\",\n        \"key\": \"output/_clients/6f2b7d34/acme/ep101/ep101_asr.mp4\",\n        \"url\": \"https://…\"\n      }\n    ]\n  }\n}"},{"id":"c88c2e9d-aed7-4454-9eb9-3daf433b8a2a","name":"200 Failure","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/api/integrations/transcode/ooona/{{transcodeJobId}}"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"0f1e2d3c4b5a69788796a5b4c3d2e1f0\",\n  \"type\": \"Transcoding\",\n  \"engine\": \"Ooona\",\n  \"status\": \"Failure\",\n  \"progress\": 0,\n  \"jobId\": \"0f1e2d3c4b5a69788796a5b4c3d2e1f0\",\n  \"mediaId\": null,\n  \"projectId\": \"\",\n  \"startedAt\": \"2026-10-15T09:00:00Z\",\n  \"completedAt\": null,\n  \"error\": \"Transcoder: source could not be read\",\n  \"result\": null\n}"}],"_postman_id":"a737d8c3-260e-4fe5-81ae-f25d1d7655e9"}],"id":"7b80f55b-e62d-486d-88a9-752fc517e77e","description":"<p><code>POST api/integrations/transcode</code> starts a cloud transcode; <code>GET api/integrations/transcode/ooona/{jobId}</code> reports it, with presigned output URLs once it succeeded.</p>\n<p><strong>Body fields</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Required</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>provider</code></td>\n<td>✅</td>\n<td><code>ooona</code></td>\n</tr>\n<tr>\n<td><code>url</code></td>\n<td>one of <code>url</code>/<code>s3Key</code></td>\n<td>public https URL of the media (no credentials, must resolve to public addresses)</td>\n</tr>\n<tr>\n<td><code>s3Key</code></td>\n<td>one of <code>url</code>/<code>s3Key</code></td>\n<td>key in this instance's bucket, inside <code>tasks/{your client id}/</code> or <code>temp/{your user id}/</code>; must exist</td>\n</tr>\n<tr>\n<td><code>outputPath</code></td>\n<td>–</td>\n<td>where outputs go: <code>output/_clients/{your client id}/{outputPath}</code>. Relative, ≤ 8 folders, ≤ 200 chars, letters/digits/<code>.</code>/<code>_</code>/<code>-</code>, no <code>..</code>, no leading <code>/</code>. Not allowed with a media library <code>mediaId</code>.</td>\n</tr>\n<tr>\n<td><code>mediaId</code></td>\n<td>–</td>\n<td>a media library entry: makes its protected (DRM) version</td>\n</tr>\n<tr>\n<td><code>projectId</code></td>\n<td>–</td>\n<td>the Toolkit project this media belongs to (informational)</td>\n</tr>\n<tr>\n<td><code>engineOptions</code></td>\n<td>–</td>\n<td>option values, see the folder above</td>\n</tr>\n</tbody>\n</table>\n</div><p>Run the requests in order: <em>Get an upload URL</em> → <em>Upload the media</em> → a <em>Transcode …</em> request → <em>Get transcode status</em>. The scripts store <code>transcodeS3Key</code> and <code>transcodeJobId</code> in the environment.</p>\n<p>Errors answer <code>400 { \"message\", \"errors\": [ { \"path\", \"reason\" } ] }</code> with <code>path</code> = <code>url</code>, <code>s3Key</code>, <code>outputPath</code> or an option path, before any job or charge exists.</p>\n","_postman_id":"7b80f55b-e62d-486d-88a9-752fc517e77e","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"Other engines","item":[{"name":"Transcribe with engineOptions","id":"e5f0c1a7-826f-4ad1-b89c-5e603b7271dc","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"provider\": \"Amazon\",\n  \"url\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n  \"language\": \"en-US\",\n  \"lineLength\": 42,\n  \"engineOptions\": {\n    \"vocabulary\": \"medical\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/integrations/transcribe","description":"<p><code>engineOptions</code> is accepted and recorded on the job (<code>effectiveEngineOptions</code> with every path under <code>ignored</code>), and the ASR engine runs exactly as without it. A body whose <code>engineOptions</code> is not a JSON object still answers 400.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["api","integrations","transcribe"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"08e04435-0b2f-47c4-a89f-a7946a3ed698","name":"200 Job created","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"provider\": \"Amazon\",\n  \"url\": \"https://ooona-public.s3.amazonaws.com/video/Amyloidosis%20Awareness.MP4\",\n  \"language\": \"en-US\",\n  \"lineLength\": 42,\n  \"engineOptions\": {\n    \"vocabulary\": \"medical\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/integrations/transcribe"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"5b2c8e1f9a0d4c7e8b3f6a1d2e4c9b70\",\n  \"type\": \"SpeechToText\",\n  \"engine\": \"Amazon\",\n  \"status\": \"Waiting\",\n  \"progress\": 0\n}"}],"_postman_id":"e5f0c1a7-826f-4ad1-b89c-5e603b7271dc"}],"id":"01266468-e39b-4c1e-a08f-fcbcf2133083","description":"<p>Every engine job endpoint accepts <code>engineOptions</code>: <code>POST api/integrations/{transcode|transcribe|translate|tts|syncheck|qc|smart-conform|unified}</code> and their <code>/price</code> actions. Only the transcoder has an option schema so far (TK-4579–TK-4581 add the others), so elsewhere every key is ignored and logged, and the job runs as before.</p>\n<p>The named fields (<code>LineLength</code>, <code>Fps</code>, <code>TimingGap</code>, …) keep working. When an engine's schema maps one, <code>engineOptions</code> wins over the named field.</p>\n<p>Not covered: <code>POST external/automate</code>, multipart <code>api/integrations/file-translate</code>, and the file-based <code>external/qc</code> / <code>external/conform</code>.</p>\n","_postman_id":"01266468-e39b-4c1e-a08f-fcbcf2133083","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}},{"name":"Admin","item":[{"name":"Get exposure of every engine","id":"ffd16aa2-670a-4b7a-ad24-88ca270cefef","request":{"method":"GET","header":[],"url":"{{base_url}}/api/admin/EngineOptions","description":"<p>Every engine with an option schema, with the admin state of every option (including unexposed, locked and sensitive ones). <code>staleOverridePaths</code> lists saved overrides whose path no longer exists in the schema.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["api","admin","EngineOptions"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"2888dc30-8acd-4400-8029-fdbf001cf6d7","name":"200 Engines","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/api/admin/EngineOptions"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"engines\": [\n    {\n      \"engine\": \"ooona\",\n      \"type\": \"Transcoding\",\n      \"schemaVersion\": 1,\n      \"options\": [\n        {\n          \"path\": \"encode\",\n          \"key\": \"encode\",\n          \"label\": \"Encode (downconvert)\",\n          \"dataType\": \"group\",\n          \"toggle\": true,\n          \"default\": true,\n          \"exposedByDefault\": true,\n          \"isExposed\": true,\n          \"isLocked\": false,\n          \"isSensitive\": false,\n          \"hasOverride\": false,\n          \"effectiveDefault\": true,\n          \"children\": [\n            {\n              \"path\": \"encode.burnSmpteTc\",\n              \"key\": \"burnSmpteTc\",\n              \"label\": \"Burn SMPTE timecode\",\n              \"dataType\": \"bool\",\n              \"default\": false,\n              \"exposedByDefault\": false,\n              \"isExposed\": true,\n              \"isLocked\": false,\n              \"isSensitive\": false,\n              \"hasOverride\": true,\n              \"instanceDefault\": true,\n              \"effectiveDefault\": true\n            },\n            {\n              \"path\": \"encode.watermark\",\n              \"key\": \"watermark\",\n              \"label\": \"Watermark\",\n              \"dataType\": \"file\",\n              \"accept\": [\n                \".png\"\n              ],\n              \"exposedByDefault\": false,\n              \"isExposed\": true,\n              \"isLocked\": false,\n              \"isSensitive\": false,\n              \"hasOverride\": true\n            }\n          ]\n        },\n        {\n          \"path\": \"dash\",\n          \"key\": \"dash\",\n          \"label\": \"DASH packaging\",\n          \"dataType\": \"group\",\n          \"toggle\": true,\n          \"default\": true,\n          \"exposedByDefault\": false,\n          \"isExposed\": false,\n          \"isLocked\": true,\n          \"isSensitive\": false,\n          \"hasOverride\": true,\n          \"effectiveDefault\": true,\n          \"children\": [\n            {\n              \"path\": \"dash.apiKey\",\n              \"key\": \"apiKey\",\n              \"label\": \"DRM API key\",\n              \"dataType\": \"string\",\n              \"exposedByDefault\": false,\n              \"isExposed\": false,\n              \"isLocked\": false,\n              \"isSensitive\": true,\n              \"hasOverride\": false\n            }\n          ]\n        }\n      ],\n      \"staleOverridePaths\": []\n    }\n  ]\n}"}],"_postman_id":"ffd16aa2-670a-4b7a-ad24-88ca270cefef"},{"name":"Get exposure of the transcoder","id":"9bb2e22d-fdc6-4c6e-84c5-01361c0e631d","request":{"method":"GET","header":[],"url":"{{base_url}}/api/admin/EngineOptions?type=Transcoding&engine=ooona","description":"<p>One engine's admin tree. Each node has the schema descriptor plus <code>path</code>, <code>exposedByDefault</code>, <code>isExposed</code>, <code>isLocked</code>, <code>isSensitive</code>, <code>hasOverride</code>, <code>instanceDefault</code> (when set), <code>effectiveDefault</code>, and <code>problem</code> when a stored instance default no longer validates (it is then ignored).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["api","admin","EngineOptions"],"host":["{{base_url}}"],"query":[{"description":{"content":"<p>AutomatedJobType name</p>\n","type":"text/plain"},"key":"type","value":"Transcoding"},{"description":{"content":"<p>Engine key</p>\n","type":"text/plain"},"key":"engine","value":"ooona"}],"variable":[]}},"response":[{"id":"292b904d-2294-48e8-b7d6-dc677d5fb882","name":"200 Transcoder","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/api/admin/EngineOptions?type=Transcoding&engine=ooona","host":["{{base_url}}"],"path":["api","admin","EngineOptions"],"query":[{"key":"type","value":"Transcoding","description":"AutomatedJobType name"},{"key":"engine","value":"ooona","description":"Engine key"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"engine\": \"ooona\",\n  \"type\": \"Transcoding\",\n  \"schemaVersion\": 1,\n  \"options\": [\n    {\n      \"path\": \"encode\",\n      \"key\": \"encode\",\n      \"label\": \"Encode (downconvert)\",\n      \"dataType\": \"group\",\n      \"toggle\": true,\n      \"default\": true,\n      \"exposedByDefault\": true,\n      \"isExposed\": true,\n      \"isLocked\": false,\n      \"isSensitive\": false,\n      \"hasOverride\": false,\n      \"effectiveDefault\": true,\n      \"children\": [\n        {\n          \"path\": \"encode.burnSmpteTc\",\n          \"key\": \"burnSmpteTc\",\n          \"label\": \"Burn SMPTE timecode\",\n          \"dataType\": \"bool\",\n          \"default\": false,\n          \"exposedByDefault\": false,\n          \"isExposed\": true,\n          \"isLocked\": false,\n          \"isSensitive\": false,\n          \"hasOverride\": true,\n          \"instanceDefault\": true,\n          \"effectiveDefault\": true\n        },\n        {\n          \"path\": \"encode.watermark\",\n          \"key\": \"watermark\",\n          \"label\": \"Watermark\",\n          \"dataType\": \"file\",\n          \"accept\": [\n            \".png\"\n          ],\n          \"exposedByDefault\": false,\n          \"isExposed\": true,\n          \"isLocked\": false,\n          \"isSensitive\": false,\n          \"hasOverride\": true\n        }\n      ]\n    },\n    {\n      \"path\": \"dash\",\n      \"key\": \"dash\",\n      \"label\": \"DASH packaging\",\n      \"dataType\": \"group\",\n      \"toggle\": true,\n      \"default\": true,\n      \"exposedByDefault\": false,\n      \"isExposed\": false,\n      \"isLocked\": true,\n      \"isSensitive\": false,\n      \"hasOverride\": true,\n      \"effectiveDefault\": true,\n      \"children\": [\n        {\n          \"path\": \"dash.apiKey\",\n          \"key\": \"apiKey\",\n          \"label\": \"DRM API key\",\n          \"dataType\": \"string\",\n          \"exposedByDefault\": false,\n          \"isExposed\": false,\n          \"isLocked\": false,\n          \"isSensitive\": true,\n          \"hasOverride\": false\n        }\n      ]\n    }\n  ],\n  \"staleOverridePaths\": []\n}"},{"id":"7eff5524-59a0-4d96-9ed9-86889e76bf53","name":"404 No schema","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/api/admin/EngineOptions?type=Transcoding&engine=ooona","host":["{{base_url}}"],"path":["api","admin","EngineOptions"],"query":[{"key":"type","value":"Transcoding","description":"AutomatedJobType name"},{"key":"engine","value":"ooona","description":"Engine key"}]}},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"Engine 'Amazon' has no options for SpeechToText.\"\n}"}],"_postman_id":"9bb2e22d-fdc6-4c6e-84c5-01361c0e631d"},{"name":"Expose options","id":"4326cdde-aef9-49e7-8151-ff009b393bdf","request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"changes\": [\n    {\n      \"path\": \"encode.burnSmpteTc\",\n      \"isExposed\": true,\n      \"defaultValue\": null,\n      \"isLocked\": false\n    },\n    {\n      \"path\": \"encode.burnFrameCounter\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"encode.burnMediaTime\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"encode.watermark\",\n      \"isExposed\": true,\n      \"defaultValue\": {\n        \"s3Key\": \"branding/ooona-logo.png\"\n      }\n    },\n    {\n      \"path\": \"encode.ffmpegArgs\",\n      \"isExposed\": true,\n      \"defaultValue\": \"-crf 23 -preset medium\"\n    },\n    {\n      \"path\": \"extractAudio\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"extractAudio.extension\",\n      \"isExposed\": true,\n      \"defaultValue\": \"wav\"\n    },\n    {\n      \"path\": \"extractAudio.ffmpegArgs\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"extractAsrVideo\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"extractAsrVideo.extension\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"extractAsrVideo.ffmpegArgs\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"encode.keepMp4\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"dash\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"dash.drm\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"dash.skipSslValidation\",\n      \"isExposed\": true\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/admin/EngineOptions?type=Transcoding&engine=ooona","description":"<p>Each change <strong>replaces</strong> that path's override:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>path</code></td>\n<td>option path, e.g. <code>encode.burnSmpteTc</code></td>\n</tr>\n<tr>\n<td><code>isExposed</code></td>\n<td><code>true</code> / <code>false</code>, or <code>null</code> to follow the schema</td>\n</tr>\n<tr>\n<td><code>defaultValue</code></td>\n<td>instance default in the option's JSON shape, or <code>null</code> for none</td>\n</tr>\n<tr>\n<td><code>isLocked</code></td>\n<td><code>true</code>: integrators can't change it</td>\n</tr>\n<tr>\n<td><code>reset</code></td>\n<td><code>true</code>: remove the override (the other fields are ignored)</td>\n</tr>\n</tbody>\n</table>\n</div><p>Answers the engine's new admin tree. Discovery shows the change within 30 s. An invalid default or a sensitive path answers 400 listing every problem; nothing is saved.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["api","admin","EngineOptions"],"host":["{{base_url}}"],"query":[{"key":"type","value":"Transcoding"},{"key":"engine","value":"ooona"}],"variable":[]}},"response":[{"id":"2b8dc696-5bbb-409b-997f-853f4eae2c0f","name":"200 Saved","originalRequest":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"changes\": [\n    {\n      \"path\": \"encode.burnSmpteTc\",\n      \"isExposed\": true,\n      \"defaultValue\": null,\n      \"isLocked\": false\n    },\n    {\n      \"path\": \"encode.burnFrameCounter\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"encode.burnMediaTime\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"encode.watermark\",\n      \"isExposed\": true,\n      \"defaultValue\": {\n        \"s3Key\": \"branding/ooona-logo.png\"\n      }\n    },\n    {\n      \"path\": \"encode.ffmpegArgs\",\n      \"isExposed\": true,\n      \"defaultValue\": \"-crf 23 -preset medium\"\n    },\n    {\n      \"path\": \"extractAudio\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"extractAudio.extension\",\n      \"isExposed\": true,\n      \"defaultValue\": \"wav\"\n    },\n    {\n      \"path\": \"extractAudio.ffmpegArgs\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"extractAsrVideo\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"extractAsrVideo.extension\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"extractAsrVideo.ffmpegArgs\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"encode.keepMp4\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"dash\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"dash.drm\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"dash.skipSslValidation\",\n      \"isExposed\": true\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/api/admin/EngineOptions?type=Transcoding&engine=ooona","host":["{{base_url}}"],"path":["api","admin","EngineOptions"],"query":[{"key":"type","value":"Transcoding"},{"key":"engine","value":"ooona"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"engine\": \"ooona\",\n  \"type\": \"Transcoding\",\n  \"schemaVersion\": 1,\n  \"options\": [\n    {\n      \"path\": \"encode\",\n      \"key\": \"encode\",\n      \"label\": \"Encode (downconvert)\",\n      \"dataType\": \"group\",\n      \"toggle\": true,\n      \"default\": true,\n      \"exposedByDefault\": true,\n      \"isExposed\": true,\n      \"isLocked\": false,\n      \"isSensitive\": false,\n      \"hasOverride\": false,\n      \"effectiveDefault\": true,\n      \"children\": [\n        {\n          \"path\": \"encode.burnSmpteTc\",\n          \"key\": \"burnSmpteTc\",\n          \"label\": \"Burn SMPTE timecode\",\n          \"dataType\": \"bool\",\n          \"default\": false,\n          \"exposedByDefault\": false,\n          \"isExposed\": true,\n          \"isLocked\": false,\n          \"isSensitive\": false,\n          \"hasOverride\": true,\n          \"instanceDefault\": true,\n          \"effectiveDefault\": true\n        },\n        {\n          \"path\": \"encode.watermark\",\n          \"key\": \"watermark\",\n          \"label\": \"Watermark\",\n          \"dataType\": \"file\",\n          \"accept\": [\n            \".png\"\n          ],\n          \"exposedByDefault\": false,\n          \"isExposed\": true,\n          \"isLocked\": false,\n          \"isSensitive\": false,\n          \"hasOverride\": true\n        }\n      ]\n    },\n    {\n      \"path\": \"dash\",\n      \"key\": \"dash\",\n      \"label\": \"DASH packaging\",\n      \"dataType\": \"group\",\n      \"toggle\": true,\n      \"default\": true,\n      \"exposedByDefault\": false,\n      \"isExposed\": false,\n      \"isLocked\": true,\n      \"isSensitive\": false,\n      \"hasOverride\": true,\n      \"effectiveDefault\": true,\n      \"children\": [\n        {\n          \"path\": \"dash.apiKey\",\n          \"key\": \"apiKey\",\n          \"label\": \"DRM API key\",\n          \"dataType\": \"string\",\n          \"exposedByDefault\": false,\n          \"isExposed\": false,\n          \"isLocked\": false,\n          \"isSensitive\": true,\n          \"hasOverride\": false\n        }\n      ]\n    }\n  ],\n  \"staleOverridePaths\": []\n}"},{"id":"bd3ed3f4-c811-49c6-a4dd-8cd161317931","name":"400 Invalid changes","originalRequest":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"changes\": [\n    {\n      \"path\": \"encode.burnSmpteTc\",\n      \"isExposed\": true,\n      \"defaultValue\": null,\n      \"isLocked\": false\n    },\n    {\n      \"path\": \"encode.burnFrameCounter\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"encode.burnMediaTime\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"encode.watermark\",\n      \"isExposed\": true,\n      \"defaultValue\": {\n        \"s3Key\": \"branding/ooona-logo.png\"\n      }\n    },\n    {\n      \"path\": \"encode.ffmpegArgs\",\n      \"isExposed\": true,\n      \"defaultValue\": \"-crf 23 -preset medium\"\n    },\n    {\n      \"path\": \"extractAudio\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"extractAudio.extension\",\n      \"isExposed\": true,\n      \"defaultValue\": \"wav\"\n    },\n    {\n      \"path\": \"extractAudio.ffmpegArgs\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"extractAsrVideo\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"extractAsrVideo.extension\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"extractAsrVideo.ffmpegArgs\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"encode.keepMp4\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"dash\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"dash.drm\",\n      \"isExposed\": true\n    },\n    {\n      \"path\": \"dash.skipSslValidation\",\n      \"isExposed\": true\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/api/admin/EngineOptions?type=Transcoding&engine=ooona","host":["{{base_url}}"],"path":["api","admin","EngineOptions"],"query":[{"key":"type","value":"Transcoding"},{"key":"engine","value":"ooona"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"Invalid engine options: dash.apiKey: a sensitive option is never exposed; encode.ffmpegArgs: '-i' is not allowed: it adds an input file or URL\",\n  \"errors\": [\n    {\n      \"path\": \"dash.apiKey\",\n      \"reason\": \"a sensitive option is never exposed\"\n    },\n    {\n      \"path\": \"encode.ffmpegArgs\",\n      \"reason\": \"'-i' is not allowed: it adds an input file or URL\"\n    }\n  ]\n}"}],"_postman_id":"4326cdde-aef9-49e7-8151-ff009b393bdf"},{"name":"Lock an option","id":"243f6a82-bbaa-443d-b9ed-78f61bfce1c1","request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"changes\": [\n    {\n      \"path\": \"extractDat.excludeShotChanges\",\n      \"isExposed\": false,\n      \"defaultValue\": true,\n      \"isLocked\": true\n    },\n    {\n      \"path\": \"dash\",\n      \"isLocked\": true,\n      \"defaultValue\": true\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/admin/EngineOptions?type=Transcoding&engine=ooona","description":"<p><code>isLocked: true</code> with a <code>defaultValue</code>: every job gets that value and integrators can't change it (a locked option disappears from discovery; a request value for it is ignored). A toggle group locked on shows in discovery as a plain group whose children can still be set; locked off, it is left out with its children.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["api","admin","EngineOptions"],"host":["{{base_url}}"],"query":[{"key":"type","value":"Transcoding"},{"key":"engine","value":"ooona"}],"variable":[]}},"response":[{"id":"42d3b065-81e9-4263-9421-4b28b5459705","name":"200 Saved","originalRequest":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"changes\": [\n    {\n      \"path\": \"extractDat.excludeShotChanges\",\n      \"isExposed\": false,\n      \"defaultValue\": true,\n      \"isLocked\": true\n    },\n    {\n      \"path\": \"dash\",\n      \"isLocked\": true,\n      \"defaultValue\": true\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/api/admin/EngineOptions?type=Transcoding&engine=ooona","host":["{{base_url}}"],"path":["api","admin","EngineOptions"],"query":[{"key":"type","value":"Transcoding"},{"key":"engine","value":"ooona"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"engine\": \"ooona\",\n  \"type\": \"Transcoding\",\n  \"schemaVersion\": 1,\n  \"options\": [\n    {\n      \"path\": \"encode\",\n      \"key\": \"encode\",\n      \"label\": \"Encode (downconvert)\",\n      \"dataType\": \"group\",\n      \"toggle\": true,\n      \"default\": true,\n      \"exposedByDefault\": true,\n      \"isExposed\": true,\n      \"isLocked\": false,\n      \"isSensitive\": false,\n      \"hasOverride\": false,\n      \"effectiveDefault\": true,\n      \"children\": [\n        {\n          \"path\": \"encode.burnSmpteTc\",\n          \"key\": \"burnSmpteTc\",\n          \"label\": \"Burn SMPTE timecode\",\n          \"dataType\": \"bool\",\n          \"default\": false,\n          \"exposedByDefault\": false,\n          \"isExposed\": true,\n          \"isLocked\": false,\n          \"isSensitive\": false,\n          \"hasOverride\": true,\n          \"instanceDefault\": true,\n          \"effectiveDefault\": true\n        },\n        {\n          \"path\": \"encode.watermark\",\n          \"key\": \"watermark\",\n          \"label\": \"Watermark\",\n          \"dataType\": \"file\",\n          \"accept\": [\n            \".png\"\n          ],\n          \"exposedByDefault\": false,\n          \"isExposed\": true,\n          \"isLocked\": false,\n          \"isSensitive\": false,\n          \"hasOverride\": true\n        }\n      ]\n    },\n    {\n      \"path\": \"dash\",\n      \"key\": \"dash\",\n      \"label\": \"DASH packaging\",\n      \"dataType\": \"group\",\n      \"toggle\": true,\n      \"default\": true,\n      \"exposedByDefault\": false,\n      \"isExposed\": false,\n      \"isLocked\": true,\n      \"isSensitive\": false,\n      \"hasOverride\": true,\n      \"effectiveDefault\": true,\n      \"children\": [\n        {\n          \"path\": \"dash.apiKey\",\n          \"key\": \"apiKey\",\n          \"label\": \"DRM API key\",\n          \"dataType\": \"string\",\n          \"exposedByDefault\": false,\n          \"isExposed\": false,\n          \"isLocked\": false,\n          \"isSensitive\": true,\n          \"hasOverride\": false\n        }\n      ]\n    }\n  ],\n  \"staleOverridePaths\": []\n}"}],"_postman_id":"243f6a82-bbaa-443d-b9ed-78f61bfce1c1"},{"name":"Reset one option","id":"97a85909-0251-4d83-909a-c20ba13b4257","request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"changes\": [\n    {\n      \"path\": \"encode.watermark\",\n      \"reset\": true\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/admin/EngineOptions?type=Transcoding&engine=ooona","description":"<p><code>reset: true</code> removes the override for that path: exposure, default and lock go back to the schema.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["api","admin","EngineOptions"],"host":["{{base_url}}"],"query":[{"key":"type","value":"Transcoding"},{"key":"engine","value":"ooona"}],"variable":[]}},"response":[{"id":"8bfea513-a339-4b73-85fe-7b3e2aa46b8c","name":"200 Saved","originalRequest":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"changes\": [\n    {\n      \"path\": \"encode.watermark\",\n      \"reset\": true\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{base_url}}/api/admin/EngineOptions?type=Transcoding&engine=ooona","host":["{{base_url}}"],"path":["api","admin","EngineOptions"],"query":[{"key":"type","value":"Transcoding"},{"key":"engine","value":"ooona"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"engine\": \"ooona\",\n  \"type\": \"Transcoding\",\n  \"schemaVersion\": 1,\n  \"options\": [\n    {\n      \"path\": \"encode\",\n      \"key\": \"encode\",\n      \"label\": \"Encode (downconvert)\",\n      \"dataType\": \"group\",\n      \"toggle\": true,\n      \"default\": true,\n      \"exposedByDefault\": true,\n      \"isExposed\": true,\n      \"isLocked\": false,\n      \"isSensitive\": false,\n      \"hasOverride\": false,\n      \"effectiveDefault\": true,\n      \"children\": [\n        {\n          \"path\": \"encode.burnSmpteTc\",\n          \"key\": \"burnSmpteTc\",\n          \"label\": \"Burn SMPTE timecode\",\n          \"dataType\": \"bool\",\n          \"default\": false,\n          \"exposedByDefault\": false,\n          \"isExposed\": true,\n          \"isLocked\": false,\n          \"isSensitive\": false,\n          \"hasOverride\": true,\n          \"instanceDefault\": true,\n          \"effectiveDefault\": true\n        },\n        {\n          \"path\": \"encode.watermark\",\n          \"key\": \"watermark\",\n          \"label\": \"Watermark\",\n          \"dataType\": \"file\",\n          \"accept\": [\n            \".png\"\n          ],\n          \"exposedByDefault\": false,\n          \"isExposed\": true,\n          \"isLocked\": false,\n          \"isSensitive\": false,\n          \"hasOverride\": true\n        }\n      ]\n    },\n    {\n      \"path\": \"dash\",\n      \"key\": \"dash\",\n      \"label\": \"DASH packaging\",\n      \"dataType\": \"group\",\n      \"toggle\": true,\n      \"default\": true,\n      \"exposedByDefault\": false,\n      \"isExposed\": false,\n      \"isLocked\": true,\n      \"isSensitive\": false,\n      \"hasOverride\": true,\n      \"effectiveDefault\": true,\n      \"children\": [\n        {\n          \"path\": \"dash.apiKey\",\n          \"key\": \"apiKey\",\n          \"label\": \"DRM API key\",\n          \"dataType\": \"string\",\n          \"exposedByDefault\": false,\n          \"isExposed\": false,\n          \"isLocked\": false,\n          \"isSensitive\": true,\n          \"hasOverride\": false\n        }\n      ]\n    }\n  ],\n  \"staleOverridePaths\": []\n}"}],"_postman_id":"97a85909-0251-4d83-909a-c20ba13b4257"},{"name":"Reset the engine","id":"e7c792cc-600e-43f0-9347-471ea746c9c4","request":{"method":"POST","header":[],"url":"{{base_url}}/api/admin/EngineOptions/reset?type=Transcoding&engine=ooona","description":"<p>Removes every override of the engine and answers the schema-default tree (only <code>encode</code>, <code>encode.skip.*</code> and <code>extractDat</code> exposed).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["api","admin","EngineOptions","reset"],"host":["{{base_url}}"],"query":[{"description":{"content":"<p>AutomatedJobType name</p>\n","type":"text/plain"},"key":"type","value":"Transcoding"},{"description":{"content":"<p>Engine key</p>\n","type":"text/plain"},"key":"engine","value":"ooona"}],"variable":[]}},"response":[{"id":"505c4851-2e1f-43bf-b9a6-432471b8e505","name":"200 Reset","originalRequest":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/api/admin/EngineOptions/reset?type=Transcoding&engine=ooona","host":["{{base_url}}"],"path":["api","admin","EngineOptions","reset"],"query":[{"key":"type","value":"Transcoding","description":"AutomatedJobType name"},{"key":"engine","value":"ooona","description":"Engine key"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"engine\": \"ooona\",\n  \"type\": \"Transcoding\",\n  \"schemaVersion\": 1,\n  \"options\": [\n    {\n      \"path\": \"encode\",\n      \"key\": \"encode\",\n      \"label\": \"Encode (downconvert)\",\n      \"dataType\": \"group\",\n      \"toggle\": true,\n      \"default\": true,\n      \"exposedByDefault\": true,\n      \"isExposed\": true,\n      \"isLocked\": false,\n      \"isSensitive\": false,\n      \"hasOverride\": false,\n      \"effectiveDefault\": true,\n      \"children\": [\n        {\n          \"path\": \"encode.burnSmpteTc\",\n          \"key\": \"burnSmpteTc\",\n          \"label\": \"Burn SMPTE timecode\",\n          \"dataType\": \"bool\",\n          \"default\": false,\n          \"exposedByDefault\": false,\n          \"isExposed\": true,\n          \"isLocked\": false,\n          \"isSensitive\": false,\n          \"hasOverride\": true,\n          \"instanceDefault\": true,\n          \"effectiveDefault\": true\n        },\n        {\n          \"path\": \"encode.watermark\",\n          \"key\": \"watermark\",\n          \"label\": \"Watermark\",\n          \"dataType\": \"file\",\n          \"accept\": [\n            \".png\"\n          ],\n          \"exposedByDefault\": false,\n          \"isExposed\": true,\n          \"isLocked\": false,\n          \"isSensitive\": false,\n          \"hasOverride\": true\n        }\n      ]\n    }\n  ],\n  \"staleOverridePaths\": []\n}"}],"_postman_id":"e7c792cc-600e-43f0-9347-471ea746c9c4"},{"name":"Rerun a job","id":"62cc3f35-c8ba-4d30-8b57-c7ba2c8c2c93","request":{"method":"POST","header":[],"url":"{{base_url}}/api/admin/AutomatedJobs/rerun/{{transcodeJobId}}?skipCache=false","description":"<p>Reruns a stored job as a new job (dashboard action). For a transcode:</p>\n<ul>\n<li>the stored <code>engineOptions</code> are merged again against the <strong>current</strong> exposure and checked against the <strong>original owner's</strong> storage area;</li>\n<li>a Super admin's rerun of someone else's job stays the original owner's job and is billed to them;</li>\n<li>a protected Task Manager upload or library media keeps DRM;</li>\n<li>an expired media URL is re-signed only when it is the owner's own object in the instance bucket.</li>\n</ul>\n<p><code>skipCache=true</code> ignores cached results for engines that use them.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}},"urlObject":{"path":["api","admin","AutomatedJobs","rerun","{{transcodeJobId}}"],"host":["{{base_url}}"],"query":[{"description":{"content":"<p>Ignore cached results</p>\n","type":"text/plain"},"key":"skipCache","value":"false"}],"variable":[]}},"response":[{"id":"2ea80582-b753-4b78-bd88-f8a7e91d61ca","name":"200 Rerun created","originalRequest":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/api/admin/AutomatedJobs/rerun/{{transcodeJobId}}?skipCache=false","host":["{{base_url}}"],"path":["api","admin","AutomatedJobs","rerun","{{transcodeJobId}}"],"query":[{"key":"skipCache","value":"false","description":"Ignore cached results"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"9a8b7c6d5e4f30211203f4e5d6c7b8a9\",\n  \"message\": \"Job re-run successfully created\"\n}"}],"_postman_id":"62cc3f35-c8ba-4d30-8b57-c7ba2c8c2c93"}],"id":"392bde62-adfc-4f6d-aab2-ae989f0dc379","description":"<p>Per-instance exposure, for super users and API admins (<code>SuperOrAPI</code>). There are no per-key or per-client rules. Each server caches the resolved exposure for 30 seconds and clears it on save, so discovery reflects a change within 30 s.</p>\n<p><strong>Option state</strong> (per path): <code>isExposed</code> (null = follow the schema's <code>exposedByDefault</code>), <code>defaultValue</code> (the instance default; null = none), <code>isLocked</code> (integrators can't change it; the instance/engine default applies). Sensitive options can't be exposed or given an instance default. Instance defaults are validated like request values (incl. the ffmpeg allowlist), but an instance default's <code>s3Key</code> may name any key of the bucket (e.g. a branding watermark).</p>\n","_postman_id":"392bde62-adfc-4f6d-aab2-ae989f0dc379","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}}],"id":"08a6fbc8-6aad-49a7-b54f-2439d6415120","description":"<p>Engine options let an integrated system (e.g. Ooona Manager) see which settings of an engine this Toolkit instance lets it set, and send values for them with each job. The transcoder (<code>Transcoding</code>, engine <code>ooona</code>) is the first engine with an option schema; every other engine accepts <code>engineOptions</code> too and ignores it until it gets a schema.</p>\n<p>Tickets: epic TK-4573 (TK-4574 schema, TK-4575 exposure, TK-4577 discovery + <code>engineOptions</code>, TK-4578 transcoder options, TK-4121 transcode outputs). Full reference: <code>docs/engine-options-api.md</code> in the Toolkit repo.</p>\n<h1 id=\"🚦-typical-flow\">🚦 Typical flow</h1>\n<ol>\n<li><strong>Admin</strong> (once per instance): choose which options integrators may set, their instance defaults, and which are locked: <code>PUT api/admin/EngineOptions</code> (folder <em>Admin</em>).</li>\n<li><strong>Discover</strong> what you may send: <code>GET external/engines/options?type=Transcoding&amp;engine=ooona</code>. Cache the form per <code>schemaVersion</code>.</li>\n<li><strong>Upload</strong> the media (or use a public https URL): <code>GET upload/GetUploadUrl</code> gives a PUT URL in your own <code>temp/{user id}/</code> area.</li>\n<li><strong>Run</strong> the job with <code>engineOptions</code>: <code>POST api/integrations/transcode</code>.</li>\n<li><strong>Poll</strong> the job: <code>GET api/integrations/transcode/ooona/{jobId}</code>. A successful job carries <code>outputs</code> with presigned URLs for the MPD, DAT, ASR video, … (there is no callback to the integrator for this endpoint).</li>\n</ol>\n<h1 id=\"✍️-how-values-are-written\">✍️ How values are written</h1>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Option kind</th>\n<th>JSON</th>\n<th>Example</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>group</td>\n<td>nested object</td>\n<td><code>\"encode\": { \"skip\": { \"maxHeightPx\": 1080 } }</code></td>\n</tr>\n<tr>\n<td>toggle group</td>\n<td><code>true</code> / <code>false</code>, or <code>{ \"enabled\": true, …children }</code></td>\n<td><code>\"extractAudio\": { \"enabled\": true, \"extension\": \"wav\" }</code></td>\n</tr>\n<tr>\n<td>bool</td>\n<td><code>true</code> / <code>false</code></td>\n<td><code>\"burnSmpteTc\": true</code></td>\n</tr>\n<tr>\n<td>integer</td>\n<td>number within <code>min</code>..<code>max</code></td>\n<td><code>\"maxBitrateKbps\": 2500</code></td>\n</tr>\n<tr>\n<td>select</td>\n<td>one of the listed <code>value</code>s (a string)</td>\n<td><code>\"extension\": \"wav\"</code></td>\n</tr>\n<tr>\n<td>multiselect</td>\n<td>array of listed <code>value</code>s</td>\n<td><code>\"extensions\": [\"mp4\", \"mov\"]</code></td>\n</tr>\n<tr>\n<td>text (ffmpeg args)</td>\n<td>string, allowlisted <code>-option value</code> pairs</td>\n<td><code>\"ffmpegArgs\": \"-crf 20 -preset slow\"</code></td>\n</tr>\n<tr>\n<td>file</td>\n<td>exactly one of <code>{ \"url\": \"https://…\" }</code> or <code>{ \"s3Key\": \"…\" }</code></td>\n<td><code>\"watermark\": { \"s3Key\": \"temp/&lt;your user id&gt;/logo.png\" }</code></td>\n</tr>\n</tbody>\n</table>\n</div><p>Merge order: <strong>engine default → instance default → request value</strong>.</p>\n<ul>\n<li>Values for options that are not exposed, locked, sensitive, unknown, or inside a toggle group that is off are <strong>ignored and logged</strong>; the request still succeeds.</li>\n<li>An invalid value for an <strong>exposed</strong> option answers <code>400 { \"message\", \"errors\": [ { \"path\", \"reason\" } ] }</code>, listing every problem, before any job or wallet transaction exists.</li>\n<li>An <code>s3Key</code> you send must be in <strong>your own storage area</strong>: <code>tasks/{your client id}/</code> or <code>temp/{your user id}/</code>.</li>\n</ul>\n<h1 id=\"🎛️-transcoder-options-transcoding--ooona-schemaversion-1\">🎛️ Transcoder options (<code>Transcoding</code> / <code>ooona</code>, schemaVersion 1)</h1>\n<p>\"Exposed\" is the state before an admin changes anything. Unexposed options can be exposed by an admin.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Path</th>\n<th>Type</th>\n<th>Default</th>\n<th>Allowed values</th>\n<th>Exposed</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>encode</code></td>\n<td>toggle group</td>\n<td>on</td>\n<td></td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>encode.ffmpegArgs</code></td>\n<td>text (video ffmpeg args)</td>\n<td>–</td>\n<td>see below</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>encode.watermark</code></td>\n<td>file (<code>.png</code>)</td>\n<td>–</td>\n<td><code>{url}</code> or <code>{s3Key}</code></td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>encode.skip</code></td>\n<td>group</td>\n<td></td>\n<td></td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>encode.skip.extensions</code></td>\n<td>multiselect</td>\n<td><code>[]</code> (never skip)</td>\n<td>mp4, mov, m4v, mkv, webm, mxf, avi</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>encode.skip.videoCodecs</code></td>\n<td>multiselect</td>\n<td><code>[\"h264\"]</code></td>\n<td>h264, hevc, vp9, av1, mpeg4, prores</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>encode.skip.audioCodecs</code></td>\n<td>multiselect</td>\n<td><code>[\"aac\"]</code></td>\n<td>aac, opus, mp3, ac3, eac3, pcm_s16le</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>encode.skip.maxBitrateKbps</code></td>\n<td>integer</td>\n<td>1000</td>\n<td>100 – 100000</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>encode.skip.maxHeightPx</code></td>\n<td>integer</td>\n<td>720</td>\n<td>144 – 4320</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>encode.burnSmpteTc</code></td>\n<td>bool</td>\n<td>false</td>\n<td>top right, white on black</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>encode.burnFrameCounter</code></td>\n<td>bool</td>\n<td>false</td>\n<td>top left, yellow on black</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>encode.burnMediaTime</code></td>\n<td>bool</td>\n<td>false</td>\n<td>top centre, lime on black</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>encode.keepMp4</code></td>\n<td>bool</td>\n<td>false</td>\n<td>copy the MP4 proxy next to the DASH output</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>extractDat</code></td>\n<td>toggle group</td>\n<td>on</td>\n<td>metadata, waveform, shot changes</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>extractDat.excludeShotChanges</code></td>\n<td>bool</td>\n<td>false</td>\n<td></td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>extractAudio</code></td>\n<td>toggle group</td>\n<td>off</td>\n<td></td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>extractAudio.extension</code></td>\n<td>select</td>\n<td>aac</td>\n<td>aac, m4a, mp3, wav, flac</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>extractAudio.ffmpegArgs</code></td>\n<td>text (audio ffmpeg args)</td>\n<td>–</td>\n<td>see below</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>extractAsrVideo</code></td>\n<td>toggle group</td>\n<td>off</td>\n<td><code>_asrvideo</code> MP4, 360p 10 fps mono AAC by default</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>extractAsrVideo.extension</code></td>\n<td>select</td>\n<td>mp4</td>\n<td>mp4, mov, mkv</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>extractAsrVideo.ffmpegArgs</code></td>\n<td>text (video ffmpeg args)</td>\n<td>–</td>\n<td>see below</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>dash</code></td>\n<td>toggle group</td>\n<td>on</td>\n<td></td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>dash.drm</code></td>\n<td>bool</td>\n<td>true</td>\n<td>Widevine</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>dash.skipSslValidation</code></td>\n<td>bool</td>\n<td>false</td>\n<td>test DRM services only</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>dash.host</code>, <code>dash.apiKey</code></td>\n<td>sensitive</td>\n<td>instance</td>\n<td>never exposed, never accepted</td>\n<td>–</td>\n</tr>\n<tr>\n<td><code>deleteSource</code></td>\n<td>bool</td>\n<td>false</td>\n<td>only honoured for a source outside Toolkit's storage</td>\n<td>❌</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>ffmpeg args</strong> (<code>encode.ffmpegArgs</code>, <code>extractAsrVideo.ffmpegArgs</code>, <code>extractAudio.ffmpegArgs</code>): space-separated <code>-option value</code> pairs from an allowlist: <code>-c:v</code> (libx264, libx265, libvpx-vp9), <code>-crf</code> (0-51), <code>-preset</code>, <code>-tune</code>, <code>-profile:v</code>, <code>-level</code>, <code>-b:v</code> / <code>-maxrate</code> / <code>-bufsize</code> (<code>800k</code>, <code>2M</code>), <code>-g</code>, <code>-r</code> (<code>25</code>, <code>23.976</code>, <code>24000/1001</code>), <code>-pix_fmt</code>, <code>-c:a</code> (aac, libopus, libmp3lame, libvorbis, ac3, eac3, flac, pcm_s16le), <code>-b:a</code>, <code>-ar</code>, <code>-ac</code>. Audio extraction allows only <code>-c:a</code>, <code>-b:a</code>, <code>-ar</code>, <code>-ac</code>. Filters (<code>-vf</code>, <code>-af</code>, <code>-filter*</code>), <code>-i</code>, <code>-f</code>, <code>-map</code>, <code>-y</code>, <code>-metadata</code>, URLs, quotes, shell metacharacters and repeated options answer 400.</p>\n<p><strong>Server-side rules you can't override</strong>: a protected Task Manager upload or a media library entry (<code>mediaId</code>) always gets encode + DASH + DRM, and <code>deleteSource</code> is always off for a source in Toolkit's own storage. With every option at its default, the transcoder receives exactly the payload it got before engine options existed.</p>\n<blockquote>\n<p>Until the transcoder service maps the new keys (TK-4585) it applies the DASH/DRM <code>packaging</code> only: the other options are validated, stored and sent, but have no effect yet.</p>\n</blockquote>\n<h1 id=\"🔧-variables\">🔧 Variables</h1>\n<p>Uses the collection's <code>base_url</code>, <code>api_name</code> and <code>api_key</code> (the collection script fetches the token). Set <code>user_id</code> and <code>client_id</code> to the API user's ids: they name your own storage areas (<code>temp/{user_id}/</code>, <code>tasks/{client_id}/</code>). The requests' scripts set <code>transcodeUploadUrl</code>, <code>transcodeS3Key</code>, <code>transcodeJobId</code> and <code>transcodeMpdUrl</code> in the environment.</p>\n","_postman_id":"08a6fbc8-6aad-49a7-b54f-2439d6415120","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]},"isInherited":true,"source":{"_postman_id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","id":"2e95edd0-3d9e-4d60-a7d2-80c99eae8e0f","name":"OOONA Tools API 🛠️","type":"collection"}}}],"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access_token}}"}]}},"event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const echoPostRequest = {\n  url: `${pm.variables.get('base_url')}/token`,\n  method: 'POST',\n  header: 'Content-Type:application/x-www-form-urlencoded',\n  body: {\n    mode: 'urlencoded',\n    urlencoded: [\n        {key: \"client_id\", value: \"OoonaOnlineToolkit\"},\n        {key: \"client_secret\", value: \"256336f74c624410915f2bb278b80d63cce896d5d2d24ef9bce314ab2e11ed3a\"},\n        {key: \"grant_type\", value: \"api\"},\n        {key: \"name\", value: pm.variables.get('api_name')},\n        {key: \"key\", value: pm.variables.get('api_key')}\n    ]\n  }\n};\n\nvar getToken = true;\n\nif (!pm.environment.get('access_token_expiration') || \n    !pm.environment.get('access_token')) {\n    console.log('Token or expiration date are missing')\n} else if (pm.environment.get('access_token_expiration') <= (new Date()).getTime()) {\n    console.log('Token is expired')\n} else {\n    getToken = false;\n    console.log('Token and expiration date are all good');\n}\n\nif (getToken === true) {\n    pm.sendRequest(echoPostRequest, function (err, res) {\n    console.log(err ? err : res.json());\n        if (err === null) {\n            console.log('Saving the token and expiry date')\n            var responseJson = res.json();\n            pm.environment.set('access_token', responseJson.access_token);\n\n            var expiryDate = new Date();\n            expiryDate.setSeconds(expiryDate.getSeconds() + responseJson.expires_in);\n            pm.environment.set('access_token_expiration', expiryDate.getTime());\n        }\n    });\n}\n"]}}],"variable":[{"key":"ai_engines","value":""}]}