{"info":{"_postman_id":"4ad20bb5-7c9e-4555-8e4b-8807758efc53","name":"Mira External API","description":"<html><head></head><body><h1 id=\"mira-external-api\">Mira External API</h1>\n<p>The Mira External API provides <strong>read-only</strong> programmatic access to your Mira data sites, cylinders, and scans.</p>\n<h2 id=\"authentication\">Authentication</h2>\n<p>All API requests require a <strong>Bearer Token</strong> obtained from the Developer Settings page in your Mira dashboard.</p>\n<h3 id=\"getting-your-api-key\">Getting Your API Key</h3>\n<ol>\n<li><p>Log in to your Mira dashboard</p>\n</li>\n<li><p>Navigate to <strong>Settings → Developer</strong></p>\n</li>\n<li><p>Click <strong>Create New API Key</strong></p>\n</li>\n<li><p>Give your key a descriptive name (e.g. \"ERP Integration\")</p>\n</li>\n<li><p>Copy the token immediately it will only be shown once</p>\n</li>\n<li><p>Use it as a Bearer token in the <code>Authorization</code> header</p>\n</li>\n</ol>\n<h3 id=\"using-the-token\">Using the Token</h3>\n<p>Include the token in every request:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>Authorization: Bearer 1|aBcDeFgHiJkLmNoPqRsTuVwXyZ123456789...\n\n</code></pre><p>Tokens expire after <strong>1 year</strong>. You can regenerate or revoke tokens at any time from the Developer Settings page.</p>\n<h2 id=\"base-url\">Base URL</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>https://mira.javolin.com/api/external\n\n</code></pre><h2 id=\"rate-limiting\">Rate Limiting</h2>\n<p>API calls are tracked and can be reviewed on the Developer Settings page.</p>\n<h2 id=\"data-access\">Data Access</h2>\n<p>You will only see data belonging to your company. Admin users can see all data.</p>\n<h2 id=\"available-endpoints\">Available Endpoints</h2>\n<p>This is a <strong>read-only</strong> API. Only <code>GET</code> requests are supported.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Method</th>\n<th>Endpoint</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>GET</td>\n<td><code>/sites</code></td>\n<td>List all sites</td>\n</tr>\n<tr>\n<td>GET</td>\n<td><code>/sites/{id}</code></td>\n<td>Get a single site</td>\n</tr>\n<tr>\n<td>GET</td>\n<td><code>/cylinders</code></td>\n<td>List all cylinders</td>\n</tr>\n<tr>\n<td>GET</td>\n<td><code>/cylinders/{id}</code></td>\n<td>Get a single cylinder</td>\n</tr>\n<tr>\n<td>GET</td>\n<td><code>/scans</code></td>\n<td>List all scans</td>\n</tr>\n<tr>\n<td>GET</td>\n<td><code>/scans/{id}</code></td>\n<td>Get a single scan</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"resources\">Resources</h2>\n<ul>\n<li><p><strong>Sites:</strong> Physical locations where cylinders are managed</p>\n</li>\n<li><p><strong>Cylinders:</strong> Anilox rollers with specifications and measurements</p>\n</li>\n<li><p><strong>Scans:</strong> Individual scan measurements taken on cylinders</p>\n</li>\n</ul>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[{"content":"Mira External API","slug":"mira-external-api"}],"owner":"795003","collectionId":"4ad20bb5-7c9e-4555-8e4b-8807758efc53","publishedId":"2sBXcKBHbp","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2026-03-03T10:36:09.000Z"},"item":[{"name":"Authentication","item":[{"name":"Verify Token","id":"0ea4771e-a023-435b-b927-1f013daddc81","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://mira.javolin.com/api/external/user","description":"<h2 id=\"verify-token\">Verify Token</h2>\n<p>Returns the currently authenticated user's profile. Use this to verify your API token is valid and working.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns the full user object including name, email, and preferences.</p>\n","urlObject":{"path":["user"],"host":["https://mira.javolin.com/api/external"],"query":[],"variable":[]}},"response":[{"id":"dd6e694d-aad6-4311-a62d-b66c68d8705d","name":"Valid Token","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"78|fWZ3ITZxmhRsa7XRsVTlDgmspT0xt7S5BlHSOakC63301551"}},"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://mira.javolin.com/api/external/user","description":"## Verify Token\n\nReturns the currently authenticated user's profile. Use this to verify your API token is valid and working.\n\n### Response\n\nReturns the full user object including name, email, and preferences."},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"id\": 1,\n    \"name\": \"John Doe\",\n    \"email\": \"john@example.com\",\n    \"created_at\": \"2025-06-15T08:00:00.000000Z\"\n}"},{"id":"8c2e47aa-5715-46e3-b8e5-4b5405be02de","name":"Invalid / Expired Token","originalRequest":{"auth":{"type":"bearer","bearer":{"token":"78|fWZ3ITZxmhRsa7XRsVTlDgmspT0xt7S5BlHSOakC63301551"}},"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://mira.javolin.com/api/external/user","description":"## Verify Token\n\nReturns the currently authenticated user's profile. Use this to verify your API token is valid and working.\n\n### Response\n\nReturns the full user object including name, email, and preferences."},"status":"Unauthenticated","code":401,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"message\": \"Unauthenticated.\"\n}"}],"_postman_id":"0ea4771e-a023-435b-b927-1f013daddc81"}],"id":"d6e132c9-20f0-4ddf-804c-4ecf9b534b24","description":"<p>Verify your API token is working correctly.</p>\n<h3 id=\"how-to-get-a-token\">How to get a token</h3>\n<ol>\n<li>Log in to the Mira dashboard</li>\n<li>Go to <strong>Settings → Developer</strong></li>\n<li>Click <strong>Create New API Key</strong></li>\n<li>Copy the token (shown only once)</li>\n<li>Set it as the <code>api_token</code> collection variable or pass it as <code>Authorization: Bearer &lt;token&gt;</code></li>\n</ol>\n","_postman_id":"d6e132c9-20f0-4ddf-804c-4ecf9b534b24","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"YOUR_API_TOKEN_HERE"}]},"isInherited":true,"source":{"_postman_id":"4ad20bb5-7c9e-4555-8e4b-8807758efc53","id":"4ad20bb5-7c9e-4555-8e4b-8807758efc53","name":"Mira External API","type":"collection"}}},{"name":"Sites","item":[{"name":"List All Sites","id":"2fe8dc25-f143-4f42-b06c-17484facf928","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://mira.javolin.com/api/external/sites?page=1","description":"<h2 id=\"list-all-sites\">List All Sites</h2>\n<p>Returns a paginated list of sites accessible to the authenticated user.</p>\n<h3 id=\"query-parameters\">Query Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>page</code></td>\n<td>integer</td>\n<td>Page number (default: 1)</td>\n</tr>\n<tr>\n<td><code>search</code></td>\n<td>string</td>\n<td>Search by site name</td>\n</tr>\n<tr>\n<td><code>company_id</code></td>\n<td>string</td>\n<td>Filter by company ID. Use <code>all</code> to skip filter</td>\n</tr>\n<tr>\n<td><code>sort_by</code></td>\n<td>string</td>\n<td>Sort field: <code>name</code>, <code>city</code>, <code>company</code>, <code>cylinders</code>, <code>updated_at</code></td>\n</tr>\n<tr>\n<td><code>sort_dir</code></td>\n<td>string</td>\n<td>Sort direction: <code>asc</code> or <code>desc</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"access-control\">Access Control</h3>\n<p>Non-admin users only see sites belonging to their company.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"YOUR_API_TOKEN_HERE"}]},"isInherited":true,"source":{"_postman_id":"4ad20bb5-7c9e-4555-8e4b-8807758efc53","id":"4ad20bb5-7c9e-4555-8e4b-8807758efc53","name":"Mira External API","type":"collection"}},"urlObject":{"path":["sites"],"host":["https://mira.javolin.com/api/external"],"query":[{"description":{"content":"<p>Page number for pagination</p>\n","type":"text/plain"},"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>Search sites by name</p>\n","type":"text/plain"},"key":"search","value":""},{"disabled":true,"description":{"content":"<p>Filter by company ID (use 'all' to skip filter)</p>\n","type":"text/plain"},"key":"company_id","value":""},{"disabled":true,"description":{"content":"<p>Sort by: name, city, company, cylinders, updated_at</p>\n","type":"text/plain"},"key":"sort_by","value":"name"},{"disabled":true,"description":{"content":"<p>Sort direction: asc or desc</p>\n","type":"text/plain"},"key":"sort_dir","value":"asc"}],"variable":[]}},"response":[{"id":"80778e41-111d-4680-8e3a-86d03f6bdd1c","name":"Site List","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"https://mira.javolin.com/api/external/sites?page=1","host":["https://mira.javolin.com/api/external"],"path":["sites"],"query":[{"key":"page","value":"1","description":"Page number for pagination"},{"key":"search","value":"","description":"Search sites by name","disabled":true},{"key":"company_id","value":"","description":"Filter by company ID (use 'all' to skip filter)","disabled":true},{"key":"sort_by","value":"name","description":"Sort by: name, city, company, cylinders, updated_at","disabled":true},{"key":"sort_dir","value":"asc","description":"Sort direction: asc or desc","disabled":true}]},"description":"## List All Sites\n\nReturns a paginated list of sites accessible to the authenticated user.\n\n### Query Parameters\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `page` | integer | Page number (default: 1) |\n| `search` | string | Search by site name |\n| `company_id` | string | Filter by company ID. Use `all` to skip filter |\n| `sort_by` | string | Sort field: `name`, `city`, `company`, `cylinders`, `updated_at` |\n| `sort_dir` | string | Sort direction: `asc` or `desc` |\n\n### Access Control\n\nNon-admin users only see sites belonging to their company."},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"id\": 1,\n            \"uid\": \"abc-123-def\",\n            \"name\": \"Chicago Plant\",\n            \"company_id\": \"5\",\n            \"coordinate\": \"41.8781,-87.6298\",\n            \"country\": \"US\",\n            \"state\": \"IL\",\n            \"city\": \"Chicago\",\n            \"license_id\": null,\n            \"meta\": null,\n            \"last_call\": \"2025-12-01T10:30:00.000000Z\",\n            \"created_at\": \"2025-06-15T08:00:00.000000Z\",\n            \"updated_at\": \"2025-12-01T10:30:00.000000Z\",\n            \"cylinders_count\": 24,\n            \"company\": {\n                \"id\": 5,\n                \"name\": \"Acme Printing\"\n            }\n        }\n    ],\n    \"links\": {\n        \"first\": \"https://mira.javolin.com/api/external/sites?page=1\",\n        \"last\": \"https://mira.javolin.com/api/external/sites?page=3\",\n        \"prev\": null,\n        \"next\": \"https://mira.javolin.com/api/external/sites?page=2\"\n    },\n    \"meta\": {\n        \"current_page\": 1,\n        \"last_page\": 3,\n        \"per_page\": 15,\n        \"total\": 42\n    }\n}"}],"_postman_id":"2fe8dc25-f143-4f42-b06c-17484facf928"},{"name":"Get Single Site","id":"738c9438-cd7a-4412-93bb-263c530bcbe8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://mira.javolin.com/api/external/sites/:id","description":"<h2 id=\"get-single-site\">Get Single Site</h2>\n<p>Returns details for a specific site including its company and cylinder count.</p>\n<h3 id=\"path-parameters\">Path Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>integer</td>\n<td>The site ID</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"YOUR_API_TOKEN_HERE"}]},"isInherited":true,"source":{"_postman_id":"4ad20bb5-7c9e-4555-8e4b-8807758efc53","id":"4ad20bb5-7c9e-4555-8e4b-8807758efc53","name":"Mira External API","type":"collection"}},"urlObject":{"path":["sites",":id"],"host":["https://mira.javolin.com/api/external"],"query":[],"variable":[{"id":"861bd7dd-3b9e-477b-affd-e1686a11af98","description":{"content":"<p>Site ID</p>\n","type":"text/plain"},"type":"any","value":"1","key":"id"}]}},"response":[],"_postman_id":"738c9438-cd7a-4412-93bb-263c530bcbe8"}],"id":"7f89e7e9-0b9c-4e44-b3a5-c4bbf041c9b4","description":"<p>Sites represent physical locations where cylinders are managed and scanned. Each site belongs to a company and can have many cylinders.</p>\n<h3 id=\"key-fields\">Key Fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>integer</td>\n<td>Unique site ID</td>\n</tr>\n<tr>\n<td><code>uid</code></td>\n<td>string</td>\n<td>UUID identifier</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Site name</td>\n</tr>\n<tr>\n<td><code>city</code></td>\n<td>string</td>\n<td>City</td>\n</tr>\n<tr>\n<td><code>state</code></td>\n<td>string</td>\n<td>State/Province</td>\n</tr>\n<tr>\n<td><code>country</code></td>\n<td>string</td>\n<td>Country</td>\n</tr>\n<tr>\n<td><code>coordinate</code></td>\n<td>string</td>\n<td>GPS coordinates (lat,lng)</td>\n</tr>\n<tr>\n<td><code>company_id</code></td>\n<td>string</td>\n<td>Associated company ID</td>\n</tr>\n<tr>\n<td><code>cylinders_count</code></td>\n<td>integer</td>\n<td>Number of cylinders at this site</td>\n</tr>\n<tr>\n<td><code>last_call</code></td>\n<td>datetime</td>\n<td>Last activity timestamp</td>\n</tr>\n</tbody>\n</table>\n</div>","_postman_id":"7f89e7e9-0b9c-4e44-b3a5-c4bbf041c9b4","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"YOUR_API_TOKEN_HERE"}]},"isInherited":true,"source":{"_postman_id":"4ad20bb5-7c9e-4555-8e4b-8807758efc53","id":"4ad20bb5-7c9e-4555-8e4b-8807758efc53","name":"Mira External API","type":"collection"}}},{"name":"Cylinders","item":[{"name":"List All Cylinders","id":"14a7685c-6742-47d0-8c4b-9da3408d7f7e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://mira.javolin.com/api/external/cylinders?page=1","description":"<h2 id=\"list-all-cylinders\">List All Cylinders</h2>\n<p>Returns a paginated list of cylinders with computed fields.</p>\n<h3 id=\"query-parameters\">Query Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>page</code></td>\n<td>integer</td>\n<td>Page number (default: 1)</td>\n</tr>\n<tr>\n<td><code>site_id</code></td>\n<td>string</td>\n<td>Filter by site ID</td>\n</tr>\n<tr>\n<td><code>search</code></td>\n<td>string</td>\n<td>Search by press_id, serial_number, or cylinder_id</td>\n</tr>\n<tr>\n<td><code>manufacturer</code></td>\n<td>string</td>\n<td>Filter by manufacturer (partial match)</td>\n</tr>\n<tr>\n<td><code>press_id</code></td>\n<td>string</td>\n<td>Filter by press ID (partial match)</td>\n</tr>\n<tr>\n<td><code>cylinder_id</code></td>\n<td>string</td>\n<td>Filter by cylinder ID (partial match)</td>\n</tr>\n<tr>\n<td><code>require_action</code></td>\n<td>boolean</td>\n<td>Only show low-volume cylinders (below 80% of spec)</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"computed-fields\">Computed Fields</h3>\n<p>Each cylinder includes:</p>\n<ul>\n<li><code>volume_percentage</code> — <code>ROUND((current_volume / spec_volume) * 100)</code> </li>\n<li><code>scans_count</code> — Total number of scans</li>\n<li><code>last_scan_date</code> — Date of the most recent scan</li>\n</ul>\n<h3 id=\"access-control\">Access Control</h3>\n<p>Non-admin users only see cylinders belonging to their company.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"YOUR_API_TOKEN_HERE"}]},"isInherited":true,"source":{"_postman_id":"4ad20bb5-7c9e-4555-8e4b-8807758efc53","id":"4ad20bb5-7c9e-4555-8e4b-8807758efc53","name":"Mira External API","type":"collection"}},"urlObject":{"path":["cylinders"],"host":["https://mira.javolin.com/api/external"],"query":[{"description":{"content":"<p>Page number for pagination</p>\n","type":"text/plain"},"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>Filter by site ID</p>\n","type":"text/plain"},"key":"site_id","value":""},{"disabled":true,"description":{"content":"<p>Search by press_id, serial_number, or cylinder_id</p>\n","type":"text/plain"},"key":"search","value":""},{"disabled":true,"description":{"content":"<p>Filter by manufacturer name (partial match)</p>\n","type":"text/plain"},"key":"manufacturer","value":""},{"disabled":true,"description":{"content":"<p>Filter by press ID (partial match)</p>\n","type":"text/plain"},"key":"press_id","value":""},{"disabled":true,"description":{"content":"<p>Filter by cylinder ID (partial match)</p>\n","type":"text/plain"},"key":"cylinder_id","value":""},{"disabled":true,"description":{"content":"<p>Only show cylinders below 80% volume threshold</p>\n","type":"text/plain"},"key":"require_action","value":"true"}],"variable":[]}},"response":[{"id":"47127bc5-366c-43a3-a78f-60b5c82c8c02","name":"Cylinder List","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"https://mira.javolin.com/api/external/cylinders?page=1","host":["https://mira.javolin.com/api/external"],"path":["cylinders"],"query":[{"key":"page","value":"1","description":"Page number for pagination"},{"key":"site_id","value":"","description":"Filter by site ID","disabled":true},{"key":"search","value":"","description":"Search by press_id, serial_number, or cylinder_id","disabled":true},{"key":"manufacturer","value":"","description":"Filter by manufacturer name (partial match)","disabled":true},{"key":"press_id","value":"","description":"Filter by press ID (partial match)","disabled":true},{"key":"cylinder_id","value":"","description":"Filter by cylinder ID (partial match)","disabled":true},{"key":"require_action","value":"true","description":"Only show cylinders below 80% volume threshold","disabled":true}]},"description":"## List All Cylinders\n\nReturns a paginated list of cylinders with computed fields.\n\n### Query Parameters\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `page` | integer | Page number (default: 1) |\n| `site_id` | string | Filter by site ID |\n| `search` | string | Search by press_id, serial_number, or cylinder_id |\n| `manufacturer` | string | Filter by manufacturer (partial match) |\n| `press_id` | string | Filter by press ID (partial match) |\n| `cylinder_id` | string | Filter by cylinder ID (partial match) |\n| `require_action` | boolean | Only show low-volume cylinders (below 80% of spec) |\n\n### Computed Fields\n\nEach cylinder includes:\n- `volume_percentage` — `ROUND((current_volume / spec_volume) * 100)` \n- `scans_count` — Total number of scans\n- `last_scan_date` — Date of the most recent scan\n\n### Access Control\n\nNon-admin users only see cylinders belonging to their company."},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"id\": 1,\n            \"uid\": \"cyl-abc-123\",\n            \"site_id\": \"1\",\n            \"cylinder_id\": \"ANX-001\",\n            \"manufacturer\": \"Praxair\",\n            \"serial_number\": \"SN-2024-0451\",\n            \"cylinder_type\": \"anilox\",\n            \"diameter\": 150.0,\n            \"length\": 1200.0,\n            \"face_width\": 1050.0,\n            \"dead_band_width\": 25.0,\n            \"num_bands\": 3,\n            \"tir_left\": 0.0,\n            \"tir_center\": 0.0,\n            \"tir_right\": 0.0,\n            \"engraver_id\": \"\",\n            \"engraver_operator\": \"\",\n            \"customer_id\": \"\",\n            \"customer_name\": \"Acme Corp\",\n            \"customer_po\": \"\",\n            \"work_order_number\": \"\",\n            \"spec_line_screen\": 800.0,\n            \"spec_screen_angle\": 60.0,\n            \"spec_volume\": 4.5,\n            \"current_volume\": 3.8,\n            \"press_id\": \"PRESS-A\",\n            \"designation\": null,\n            \"manufacture_date\": \"2024-01-15\",\n            \"comment\": null,\n            \"meta\": null,\n            \"created_at\": \"2025-06-15T08:00:00.000000Z\",\n            \"updated_at\": \"2025-12-01T10:30:00.000000Z\",\n            \"volume_percentage\": 84,\n            \"scans_count\": 12,\n            \"last_scan_date\": \"2025-11-28T14:22:00.000000Z\"\n        }\n    ],\n    \"links\": {\n        \"first\": \"https://mira.javolin.com/api/external/cylinders?page=1\",\n        \"last\": \"https://mira.javolin.com/api/external/cylinders?page=5\",\n        \"prev\": null,\n        \"next\": \"https://mira.javolin.com/api/external/cylinders?page=2\"\n    },\n    \"meta\": {\n        \"current_page\": 1,\n        \"last_page\": 5,\n        \"per_page\": 15,\n        \"total\": 72\n    }\n}"}],"_postman_id":"14a7685c-6742-47d0-8c4b-9da3408d7f7e"},{"name":"Get Single Cylinder","id":"095dcd16-99fd-4b00-af06-6130453057e7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://mira.javolin.com/api/external/cylinders/:id","description":"<h2 id=\"get-single-cylinder\">Get Single Cylinder</h2>\n<p>Returns details for a specific cylinder including its computed fields.</p>\n<h3 id=\"path-parameters\">Path Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>integer</td>\n<td>The cylinder database ID</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"YOUR_API_TOKEN_HERE"}]},"isInherited":true,"source":{"_postman_id":"4ad20bb5-7c9e-4555-8e4b-8807758efc53","id":"4ad20bb5-7c9e-4555-8e4b-8807758efc53","name":"Mira External API","type":"collection"}},"urlObject":{"path":["cylinders",":id"],"host":["https://mira.javolin.com/api/external"],"query":[],"variable":[{"id":"2d0de92f-d509-4c35-97d5-b05cbd1b6270","description":{"content":"<p>Cylinder ID (database ID)</p>\n","type":"text/plain"},"type":"any","value":"1","key":"id"}]}},"response":[],"_postman_id":"095dcd16-99fd-4b00-af06-6130453057e7"}],"id":"eb2ffd5b-82be-4e0b-a850-25612570167d","description":"<p>Cylinders represent anilox rollers. Each cylinder belongs to a site and has specifications (volume, line screen, screen angle) along with physical measurements. Cylinders can have many scans over time to track wear.</p>\n<h3 id=\"key-fields\">Key Fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>integer</td>\n<td>Unique database ID</td>\n</tr>\n<tr>\n<td><code>cylinder_id</code></td>\n<td>string</td>\n<td>Human-readable cylinder identifier</td>\n</tr>\n<tr>\n<td><code>serial_number</code></td>\n<td>string</td>\n<td>Manufacturer serial number</td>\n</tr>\n<tr>\n<td><code>manufacturer</code></td>\n<td>string</td>\n<td>Cylinder manufacturer</td>\n</tr>\n<tr>\n<td><code>cylinder_type</code></td>\n<td>string</td>\n<td>Type (e.g. \"anilox\")</td>\n</tr>\n<tr>\n<td><code>diameter</code></td>\n<td>float</td>\n<td>Roller diameter (mm)</td>\n</tr>\n<tr>\n<td><code>length</code></td>\n<td>float</td>\n<td>Roller length (mm)</td>\n</tr>\n<tr>\n<td><code>face_width</code></td>\n<td>float</td>\n<td>Engraved face width (mm)</td>\n</tr>\n<tr>\n<td><code>spec_volume</code></td>\n<td>float</td>\n<td>Specified volume (BCM)</td>\n</tr>\n<tr>\n<td><code>current_volume</code></td>\n<td>float</td>\n<td>Current measured volume (BCM)</td>\n</tr>\n<tr>\n<td><code>spec_line_screen</code></td>\n<td>float</td>\n<td>Specified line screen (LPI)</td>\n</tr>\n<tr>\n<td><code>spec_screen_angle</code></td>\n<td>float</td>\n<td>Specified screen angle (degrees)</td>\n</tr>\n<tr>\n<td><code>press_id</code></td>\n<td>string</td>\n<td>Press identifier</td>\n</tr>\n<tr>\n<td><code>volume_percentage</code></td>\n<td>integer</td>\n<td>Computed: (current / spec) * 100</td>\n</tr>\n<tr>\n<td><code>scans_count</code></td>\n<td>integer</td>\n<td>Total number of scans</td>\n</tr>\n<tr>\n<td><code>last_scan_date</code></td>\n<td>datetime</td>\n<td>Date of most recent scan</td>\n</tr>\n</tbody>\n</table>\n</div>","_postman_id":"eb2ffd5b-82be-4e0b-a850-25612570167d","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"YOUR_API_TOKEN_HERE"}]},"isInherited":true,"source":{"_postman_id":"4ad20bb5-7c9e-4555-8e4b-8807758efc53","id":"4ad20bb5-7c9e-4555-8e4b-8807758efc53","name":"Mira External API","type":"collection"}}},{"name":"Scans","item":[{"name":"List All Scans","id":"f4cf4071-b643-4e39-aa6a-dccc0517ef13","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://mira.javolin.com/api/external/scans?page=1","description":"<h2 id=\"list-all-scans\">List All Scans</h2>\n<p>Returns a paginated list of scan measurements. Scans are ordered by group number and recency.</p>\n<h3 id=\"query-parameters\">Query Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>page</code></td>\n<td>integer</td>\n<td>Page number (default: 1)</td>\n</tr>\n<tr>\n<td><code>cylinder_id</code></td>\n<td>string</td>\n<td>Filter scans by cylinder ID</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"computed-fields\">Computed Fields</h3>\n<p>Each scan includes these computed attributes:</p>\n<ul>\n<li><code>volume_bcm</code> — <code>cell_volume + cap_volume + correction_factor</code></li>\n<li><code>depth_volume_ratio</code> — <code>cell_depth / volume_bcm</code> (unit-aware based on user preferences)</li>\n<li><code>depth_opening_ratio</code> — <code>cell_depth / cell_opening</code></li>\n<li><code>media_urls</code> — Signed S3 URLs for 3D picture and PCD file (valid for ~10 minutes)</li>\n<li><code>instrument</code> — Related instrument details</li>\n</ul>\n<h3 id=\"access-control\">Access Control</h3>\n<p>Non-admin users only see scans from sites belonging to their company.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"YOUR_API_TOKEN_HERE"}]},"isInherited":true,"source":{"_postman_id":"4ad20bb5-7c9e-4555-8e4b-8807758efc53","id":"4ad20bb5-7c9e-4555-8e4b-8807758efc53","name":"Mira External API","type":"collection"}},"urlObject":{"path":["scans"],"host":["https://mira.javolin.com/api/external"],"query":[{"description":{"content":"<p>Page number for pagination</p>\n","type":"text/plain"},"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>Filter by cylinder ID (database ID)</p>\n","type":"text/plain"},"key":"cylinder_id","value":""}],"variable":[]}},"response":[{"id":"3b69cd16-441e-44b8-9153-2ffe74d858c1","name":"Scan List","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"https://mira.javolin.com/api/external/scans?page=1","host":["https://mira.javolin.com/api/external"],"path":["scans"],"query":[{"key":"page","value":"1","description":"Page number for pagination"},{"key":"cylinder_id","value":"","description":"Filter by cylinder ID (database ID)","disabled":true}]},"description":"## List All Scans\n\nReturns a paginated list of scan measurements. Scans are ordered by group number and recency.\n\n### Query Parameters\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `page` | integer | Page number (default: 1) |\n| `cylinder_id` | string | Filter scans by cylinder ID |\n\n### Computed Fields\n\nEach scan includes these computed attributes:\n- `volume_bcm` — `cell_volume + cap_volume + correction_factor`\n- `depth_volume_ratio` — `cell_depth / volume_bcm` (unit-aware based on user preferences)\n- `depth_opening_ratio` — `cell_depth / cell_opening`\n- `media_urls` — Signed S3 URLs for 3D picture and PCD file (valid for ~10 minutes)\n- `instrument` — Related instrument details\n\n### Access Control\n\nNon-admin users only see scans from sites belonging to their company."},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": [\n        {\n            \"id\": 1,\n            \"uid\": \"scan-abc-123\",\n            \"site_id\": \"1\",\n            \"cylinder_id\": \"1\",\n            \"group_number\": 1,\n            \"scan_number\": 1,\n            \"band_number\": 1,\n            \"scan_date_time\": \"2025-11-28T14:22:00.000000Z\",\n            \"cell_volume\": 3.2,\n            \"cap_volume\": 0.5,\n            \"correction_factor\": 0.1,\n            \"line_screen\": 800.0,\n            \"screen_angle\": 60.0,\n            \"cells_analyzed\": 150,\n            \"cell_depth\": 28.5,\n            \"cell_opening\": 22.3,\n            \"cell_length\": 18.1,\n            \"saddle_depth\": 5.2,\n            \"wall_width\": 4.8,\n            \"channel_width\": 12.5,\n            \"land_area_percent\": 35.0,\n            \"stylus_angle\": 120.0,\n            \"status\": 0,\n            \"image_file_name\": \"scan_001.png\",\n            \"point_cloud_file_name\": \"scan_001.pcd\",\n            \"scan_comment\": null,\n            \"meta\": {\n                \"resource_path\": \"sites/1/cylinders/ANX-001/\"\n            },\n            \"volume_bcm\": 3.8,\n            \"depth_volume_ratio\": 7.5,\n            \"depth_opening_ratio\": 1.278,\n            \"media_urls\": {\n                \"picture_3d\": \"https://s3.amazonaws.com/...signed-url...\",\n                \"pcd_file\": \"https://s3.amazonaws.com/...signed-url...\"\n            },\n            \"instrument\": null,\n            \"site\": {\n                \"id\": 1,\n                \"name\": \"Chicago Plant\"\n            },\n            \"created_at\": \"2025-11-28T14:22:00.000000Z\",\n            \"updated_at\": \"2025-11-28T14:22:00.000000Z\"\n        }\n    ],\n    \"links\": {\n        \"first\": \"https://mira.javolin.com/api/external/scans?page=1\",\n        \"last\": \"https://mira.javolin.com/api/external/scans?page=10\",\n        \"prev\": null,\n        \"next\": \"https://mira.javolin.com/api/external/scans?page=2\"\n    },\n    \"meta\": {\n        \"current_page\": 1,\n        \"last_page\": 10,\n        \"per_page\": 15,\n        \"total\": 148\n    }\n}"}],"_postman_id":"f4cf4071-b643-4e39-aa6a-dccc0517ef13"},{"name":"Get Single Scan","id":"572f00a8-1364-4b30-a1a1-9153093fadad","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://mira.javolin.com/api/external/scans/:id","description":"<h2 id=\"get-single-scan\">Get Single Scan</h2>\n<p>Returns details for a specific scan including computed fields and signed media URLs.</p>\n<h3 id=\"path-parameters\">Path Parameters</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>integer</td>\n<td>The scan database ID</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"media-urls\">Media URLs</h3>\n<p>The <code>media_urls</code> field contains time-limited signed S3 URLs:</p>\n<ul>\n<li><code>picture_3d</code> — 3D scan image</li>\n<li><code>pcd_file</code> — Point cloud data file</li>\n</ul>\n<p>These URLs expire after approximately <strong>10 minutes</strong>. Request the scan again to get fresh URLs.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"YOUR_API_TOKEN_HERE"}]},"isInherited":true,"source":{"_postman_id":"4ad20bb5-7c9e-4555-8e4b-8807758efc53","id":"4ad20bb5-7c9e-4555-8e4b-8807758efc53","name":"Mira External API","type":"collection"}},"urlObject":{"path":["scans",":id"],"host":["https://mira.javolin.com/api/external"],"query":[],"variable":[{"id":"db0c8b52-d307-47d2-8c1d-4bda5e28f47b","description":{"content":"<p>Scan ID</p>\n","type":"text/plain"},"type":"any","value":"1","key":"id"}]}},"response":[],"_postman_id":"572f00a8-1364-4b30-a1a1-9153093fadad"}],"id":"52a60f89-fcc4-48aa-9b5c-1547d9fa116b","description":"<p>Scans represent individual measurements taken on a cylinder band. Each scan captures cell geometry, volume data, and optionally includes 3D images and point cloud files.</p>\n<h3 id=\"key-fields\">Key Fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>integer</td>\n<td>Unique scan ID</td>\n</tr>\n<tr>\n<td><code>site_id</code></td>\n<td>string</td>\n<td>Site this scan was taken at</td>\n</tr>\n<tr>\n<td><code>cylinder_id</code></td>\n<td>string</td>\n<td>Cylinder this scan belongs to</td>\n</tr>\n<tr>\n<td><code>group_number</code></td>\n<td>integer</td>\n<td>Measurement group</td>\n</tr>\n<tr>\n<td><code>scan_number</code></td>\n<td>integer</td>\n<td>Scan sequence number</td>\n</tr>\n<tr>\n<td><code>band_number</code></td>\n<td>integer</td>\n<td>Band position on cylinder</td>\n</tr>\n<tr>\n<td><code>scan_date_time</code></td>\n<td>datetime</td>\n<td>When the scan was taken</td>\n</tr>\n<tr>\n<td><code>cell_volume</code></td>\n<td>float</td>\n<td>Measured cell volume</td>\n</tr>\n<tr>\n<td><code>cap_volume</code></td>\n<td>float</td>\n<td>Measured cap volume</td>\n</tr>\n<tr>\n<td><code>correction_factor</code></td>\n<td>float</td>\n<td>Volume correction factor</td>\n</tr>\n<tr>\n<td><code>volume_bcm</code></td>\n<td>float</td>\n<td>Computed: cell_volume + cap_volume + correction_factor</td>\n</tr>\n<tr>\n<td><code>cell_depth</code></td>\n<td>float</td>\n<td>Measured cell depth</td>\n</tr>\n<tr>\n<td><code>cell_opening</code></td>\n<td>float</td>\n<td>Measured cell opening</td>\n</tr>\n<tr>\n<td><code>line_screen</code></td>\n<td>float</td>\n<td>Measured line screen (LPI)</td>\n</tr>\n<tr>\n<td><code>screen_angle</code></td>\n<td>float</td>\n<td>Measured screen angle (degrees)</td>\n</tr>\n<tr>\n<td><code>depth_volume_ratio</code></td>\n<td>float</td>\n<td>Computed: cell_depth / volume_bcm</td>\n</tr>\n<tr>\n<td><code>depth_opening_ratio</code></td>\n<td>float</td>\n<td>Computed: cell_depth / cell_opening</td>\n</tr>\n<tr>\n<td><code>media_urls</code></td>\n<td>object</td>\n<td>Signed S3 URLs for 3D image and PCD file (~10 min expiry)</td>\n</tr>\n</tbody>\n</table>\n</div>","_postman_id":"52a60f89-fcc4-48aa-9b5c-1547d9fa116b","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"YOUR_API_TOKEN_HERE"}]},"isInherited":true,"source":{"_postman_id":"4ad20bb5-7c9e-4555-8e4b-8807758efc53","id":"4ad20bb5-7c9e-4555-8e4b-8807758efc53","name":"Mira External API","type":"collection"}}}],"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"YOUR_API_TOKEN_HERE"}]}},"variable":[{"key":"base_url","value":"https://mira.javolin.com/api/external","type":"string"},{"key":"api_token","value":"YOUR_API_TOKEN_HERE","type":"string"}]}