{"activeVersionTag":"latest","latestAvailableVersionTag":"latest","collection":{"info":{"_postman_id":"14d7ad01-629e-9985-753c-9b12f2c9ff35","name":"SmartOLT","description":"<h1>SmartOLT API</h1>\n<p><strong>Machine-readable version (OpenAPI, for tools and AI assistants):</strong> <a href=\"https://www.smartolt.com/openapi.json\">https://www.smartolt.com/openapi.json</a></p>\n\n---\n\n<h2>🔴 The API changed. Please read this page again.</h2>\n<h4>Updated October 2026. Check your integration against these changes:</h4>\n<ul><li><strong>🆕 Real-time events.</strong> Get ONU status changes, ONU changes, signal changes and PON outages when they occur. Use an event stream (SSE) or a webhook. You do not need to poll the API. See <strong>Real-time events</strong> below.\n</li><li><strong>⚡ Asynchronous calls for high-volume actions.</strong> Send <code>async=1</code> to enable or disable ONUs, change CATV or change speed profiles. The request does not wait for the OLT. See <strong>Asynchronous calls</strong> below.\n</li><li><strong>📦 Bulk actions.</strong> One bulk call can contain up to <strong>10,000 ONU IDs</strong> with <code>async=1</code>. Do not send one call for each ONU. See <strong>Recommended API usage</strong> below.\n</li><li><strong>🆕 ONU status history.</strong> Get how long an ONU was Online, LOS, Power fail or Offline, for up to 365 days. See <strong>Get ONU status history by ONU unique external ID</strong>.\n</li><li><strong>🆕 MAC addresses.</strong> Get the MAC addresses behind an ONU, or find the ONU of a MAC address. See <strong>Get ONU MAC addresses by ONU unique external ID</strong> and <strong>Search ONU by MAC address</strong>.\n</li></ul>\n<h4>⚠️ If your system polls Get all ONUs statuses or Get all ONUs signals, change it to use real-time events.</h4>\n\n---\n\n<h2>How to call the API</h2>\n<ul><li>Send each request to <code>https://&lt;your-subdomain&gt;.smartolt.com/api/...</code>.\n</li><li>Send your API key in the <code>X-Token</code> header.\n</li><li>Every response has <code>status</code>. When <code>status</code> is <code>false</code>, read <code>error</code> for the message and <code>error_code</code> for the reason, when it is present. A call over the API call rate limit is the exception. See <strong>Limits</strong>.\n</li></ul>\n<h2>Limits</h2>\n<h4>API access is a privilege. Use it responsibly.</h4>\n<ul><li>The default budget is <strong>1,000 API calls per hour</strong>. For very large installations, we can review and extend the budget if the operational requirements justify it.\n</li><li>Asynchronous calls have their own budget, by default <strong>5,000 calls per hour</strong>.\n</li><li>The default limit is <strong>15 calls per second</strong>. If you send more, all your calls are blocked for 10 seconds.\n</li><li>Some endpoints have their own hourly limit. The description of the endpoint gives it.\n</li><li>When you are over the per-hour, per-10-minute or per-second limit, the API returns HTTP <strong>429</strong> and a <code>Retry-After</code> header. Wait that number of seconds before you call again.\n</li><li>The body of that 429 has <code>response_code</code> set to <code>rate_limit_exceeded</code> and the message in <code>response</code>. It also has <code>violation_type</code> (<code>per_hour</code>, <code>per_10min</code> or <code>per_second</code>) and <code>retry_after</code>, the same number of seconds.\n</li><li>When you are over the limit of one endpoint, the 429 has <code>error</code> and <code>error_code</code>, like other errors.\n</li><li>Each response has <code>X-RateLimit-Limit</code>, <code>X-RateLimit-Remaining</code> and <code>X-RateLimit-Reset</code> headers. <code>X-RateLimit-Reset</code> is the number of seconds until the budget resets.\n</li></ul>\n<p>If you use the API too much, SmartOLT can limit your calls or revoke your API access.</p>\n<h4><strong>Keep a local copy of your data</strong> and update it from events.</h4>\n<h4><strong>Add a random delay to scheduled requests.</strong> For example, do not send a request exactly every 5 minutes at fixed times. Add a small random delay to each call, so that many systems do not call the API at the same time.</h4>\n<h2>Real-time events (new)</h2>\n<p><strong>Receive changes as they happen.</strong> SmartOLT can now notify your integration when something changes: an ONU goes offline, its signal drops, a new ONU appears unconfigured, or a PON port fails. Use webhooks or the event stream instead of asking for the status of every ONU every few minutes.</p>\n<ul><li><strong>Event stream (SSE):</strong> your system keeps one connection open, and the events arrive on it.\n</li><li><strong>Webhook:</strong> SmartOLT sends each batch of events as an HTTPS POST to your URL. Set it up in <strong>General &gt; API key &gt; Edit &gt; Webhook</strong>.\n</li></ul>\n<p>Event types: <code>onu.status_changed</code>, <code>onu.authorized</code>, <code>onu.updated</code>, <code>onu.deleted</code>, <code>onu.signal_changed</code>, <code>onu.signal_reading</code>, <code>onu.rx1490_reading</code>, <code>pon.outage_started</code>, <code>pon.outage_ended</code>, <code>olt.status_stale</code>, <code>olt.status_fresh</code>, <code>onu.unconfigured_detected</code>. See the <strong>Real-time events</strong> folder.</p>\n<h2>Asynchronous calls (recommended for high-volume actions)</h2>\n<p><strong>For high-volume actions, use asynchronous calls.</strong> Use them to enable ONUs, disable ONUs, change CATV or change speed profiles on many ONUs. Send <code>async=1</code> with the request. SmartOLT checks the request, puts the work in a queue and returns immediately. The request does not wait for the OLT.</p>\n<p>These endpoints accept <code>async=1</code>:</p>\n<ul><li>Single ONU: <a href=\"https://api.smartolt.com/#393d530b-5d69-4d25-9a2b-130282097b23\"><code>enable</code></a>, <a href=\"https://api.smartolt.com/#22e14a03-1c8c-4335-8439-41ef87b0bc41\"><code>disable</code></a>, <a href=\"https://api.smartolt.com/#b7a4be0a-daf3-4d7d-b819-99cb1515a1e7\"><code>enable_catv</code></a>, <a href=\"https://api.smartolt.com/#21201bf3-37a6-455e-8703-96af40b0ee9e\"><code>disable_catv</code></a>, <a href=\"https://api.smartolt.com/#6b753440-3567-8644-bfed-045dbfe3f248\"><code>update_onu_speed_profiles</code></a>\n</li><li>Multiple ONUs: <a href=\"https://api.smartolt.com/#c8208da1-5f58-40b7-a86b-838babbddff6\"><code>bulk_enable</code></a>, <a href=\"https://api.smartolt.com/#05f55ab8-6dbe-42b0-9f75-bcbeb170f0fd\"><code>bulk_disable</code></a>, <a href=\"https://api.smartolt.com/#3a5bd9ce-a30c-49ab-9012-98d763b58c9e\"><code>bulk_enable_catv</code></a>, <a href=\"https://api.smartolt.com/#4f3b2fab-ad08-4735-b64b-5dfbd06ba9b7\"><code>bulk_disable_catv</code></a>, <a href=\"https://api.smartolt.com/#536e8e0e-82bb-4ce8-a1bf-ee8a845045ee\"><code>bulk_update_speed_profiles</code></a>\n</li></ul>\n<p><a href=\"https://api.smartolt.com/#54eb4b99-51a4-4374-bc04-594f7490462c\"><code>bulk_apply_configuration_preset</code></a> and <a href=\"https://api.smartolt.com/#e367973e-13ce-4d0c-a1f8-a7d121d90adc\"><code>bulk_remove_configuration_preset</code></a> are always asynchronous. They also use the asynchronous budget.</p>\n<p><strong>Why use asynchronous calls:</strong></p>\n<ul><li>The request returns immediately. A normal request waits until the OLT finishes the command.\n</li><li>A bulk call accepts up to <strong>10,000 ONU IDs</strong> with <code>async=1</code>, and only up to <strong>50 ONU IDs</strong> without <code>async=1</code>.\n</li><li>Asynchronous calls use their own hourly budget, not the normal budget.\n</li><li>SmartOLT runs all actions for one ONU in the order it received them.\n</li></ul>\n<p><strong>How to use asynchronous calls:</strong></p>\n<ol><li>Send the request with <code>async=1</code>.\n</li><li>Read the <code>queued</code> field in the response. It shows which ONUs SmartOLT queued.\n</li><li>Some minutes later, call <a href=\"https://api.smartolt.com/#6088e6c4-89ba-4c44-989b-d894fe6f13c9\"><code>check_bulk_task_status</code></a> to see the result for each ONU. Do not call it in a tight loop. Each status check counts in the normal hourly budget.\n</li></ol>\n<p><strong>Important:</strong> <code>&quot;queued&quot;: true</code> means that SmartOLT accepted the action. It does not mean that the OLT did it. A request without <code>async=1</code> can also return <code>&quot;queued&quot;: true</code> when the ONU already has queued actions. Do not mark the action as done until <a href=\"https://api.smartolt.com/#6088e6c4-89ba-4c44-989b-d894fe6f13c9\"><code>check_bulk_task_status</code></a> shows <code>succeeded</code>.</p>\n<h2>Recommended API usage</h2>\n<ul><li><strong>ONU statuses</strong>\n<ul><li>Use the <code>onu.status_changed</code> real-time event.\n</li><li>If you cannot use events, call <a href=\"https://api.smartolt.com/#dd7eff97-6229-497c-9cde-6acd0ad09aee\">Get all ONUs statuses</a> every <strong>5-7 minutes</strong>, and store the response between calls.\n</li></ul>\n</li><li><strong>ONU signal levels</strong>\n<ul><li>Use the <code>onu.signal_reading</code> or <code>onu.signal_changed</code> real-time events for the 1310 value, and the <code>onu.rx1490_reading</code> event for the 1490 value.\n</li><li>Call <a href=\"https://api.smartolt.com/#43e3094c-0db5-46ea-821e-1ae9c4038006\">Get all ONUs signals</a> at start-up or after a <code>resync</code> event. If you cannot use events, call it every <strong>15-30 minutes</strong>, and store the response between calls.\n</li></ul>\n</li><li><strong>High-volume actions</strong> (enable, disable, CATV, speed profiles on many ONUs)\n<ul><li>Use one bulk call with <code>async=1</code> for up to <strong>10,000 ONU IDs</strong>. Without <code>async=1</code>, a bulk call can only contain up to 50 ONU IDs.\n</li><li>Do not send one call for each ONU.\n</li></ul>\n</li></ul>\n<h4><strong>Important:</strong> Do not poll individual ONUs again and again when a bulk endpoint or a real-time event gives the same data. Your integration must store data, use reasonable polling intervals and use bulk calls. If your integration uses the API too much, SmartOLT can limit its calls to protect the platform for all users.</h4>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","isPublicCollection":true,"owner":"2941216","team":68669,"collectionId":"14d7ad01-629e-9985-753c-9b12f2c9ff35","publishedId":"71CXC8s","public":true,"publicUrl":"https://api.smartolt.com","privateUrl":"https://go.postman.co/documentation/2941216-14d7ad01-629e-9985-753c-9b12f2c9ff35","customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"008FFB"},"documentationLayout":"classic-double-column","version":"8.12.12","publishDate":"2019-08-10T06:40:00.000Z","activeVersionTag":"latest","documentationTheme":"light","metaTags":{},"logos":{}},"statusCode":200},"environments":[],"user":{"authenticated":false,"permissions":{"publish":false}},"run":{"button":{"js":"https://run.pstmn.io/button.js","css":"https://run.pstmn.io/button.css"}},"web":"https://www.getpostman.com/","team":{"logo":"https://res.cloudinary.com/postman/image/upload/t_team_logo_pubdoc/v1/team/9b7225abda83d5bf2480a755d7ee1feb2525deb25764b240883f237f51607ddb","favicon":"https://smartolt.com/favicon.ico"},"isEnvFetchError":false,"languages":"[{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"HttpClient\"},{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"RestSharp\"},{\"key\":\"curl\",\"label\":\"cURL\",\"variant\":\"cURL\"},{\"key\":\"dart\",\"label\":\"Dart\",\"variant\":\"http\"},{\"key\":\"go\",\"label\":\"Go\",\"variant\":\"Native\"},{\"key\":\"http\",\"label\":\"HTTP\",\"variant\":\"HTTP\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"OkHttp\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"Unirest\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"Fetch\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"jQuery\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"XHR\"},{\"key\":\"c\",\"label\":\"C\",\"variant\":\"libcurl\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Axios\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Native\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Request\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Unirest\"},{\"key\":\"objective-c\",\"label\":\"Objective-C\",\"variant\":\"NSURLSession\"},{\"key\":\"ocaml\",\"label\":\"OCaml\",\"variant\":\"Cohttp\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"cURL\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"Guzzle\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"HTTP_Request2\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"pecl_http\"},{\"key\":\"powershell\",\"label\":\"PowerShell\",\"variant\":\"RestMethod\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"http.client\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"Requests\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"httr\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"RCurl\"},{\"key\":\"ruby\",\"label\":\"Ruby\",\"variant\":\"Net::HTTP\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"Httpie\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"wget\"},{\"key\":\"swift\",\"label\":\"Swift\",\"variant\":\"URLSession\"}]","languageSettings":[{"key":"csharp","label":"C#","variant":"HttpClient"},{"key":"csharp","label":"C#","variant":"RestSharp"},{"key":"curl","label":"cURL","variant":"cURL"},{"key":"dart","label":"Dart","variant":"http"},{"key":"go","label":"Go","variant":"Native"},{"key":"http","label":"HTTP","variant":"HTTP"},{"key":"java","label":"Java","variant":"OkHttp"},{"key":"java","label":"Java","variant":"Unirest"},{"key":"javascript","label":"JavaScript","variant":"Fetch"},{"key":"javascript","label":"JavaScript","variant":"jQuery"},{"key":"javascript","label":"JavaScript","variant":"XHR"},{"key":"c","label":"C","variant":"libcurl"},{"key":"nodejs","label":"NodeJs","variant":"Axios"},{"key":"nodejs","label":"NodeJs","variant":"Native"},{"key":"nodejs","label":"NodeJs","variant":"Request"},{"key":"nodejs","label":"NodeJs","variant":"Unirest"},{"key":"objective-c","label":"Objective-C","variant":"NSURLSession"},{"key":"ocaml","label":"OCaml","variant":"Cohttp"},{"key":"php","label":"PHP","variant":"cURL"},{"key":"php","label":"PHP","variant":"Guzzle"},{"key":"php","label":"PHP","variant":"HTTP_Request2"},{"key":"php","label":"PHP","variant":"pecl_http"},{"key":"powershell","label":"PowerShell","variant":"RestMethod"},{"key":"python","label":"Python","variant":"http.client"},{"key":"python","label":"Python","variant":"Requests"},{"key":"r","label":"R","variant":"httr"},{"key":"r","label":"R","variant":"RCurl"},{"key":"ruby","label":"Ruby","variant":"Net::HTTP"},{"key":"shell","label":"Shell","variant":"Httpie"},{"key":"shell","label":"Shell","variant":"wget"},{"key":"swift","label":"Swift","variant":"URLSession"}],"languageOptions":[{"label":"C# - HttpClient","value":"csharp - HttpClient - C#"},{"label":"C# - RestSharp","value":"csharp - RestSharp - C#"},{"label":"cURL - cURL","value":"curl - cURL - cURL"},{"label":"Dart - http","value":"dart - http - Dart"},{"label":"Go - Native","value":"go - Native - Go"},{"label":"HTTP - HTTP","value":"http - HTTP - HTTP"},{"label":"Java - OkHttp","value":"java - OkHttp - Java"},{"label":"Java - Unirest","value":"java - Unirest - Java"},{"label":"JavaScript - Fetch","value":"javascript - Fetch - JavaScript"},{"label":"JavaScript - jQuery","value":"javascript - jQuery - JavaScript"},{"label":"JavaScript - XHR","value":"javascript - XHR - JavaScript"},{"label":"C - libcurl","value":"c - libcurl - C"},{"label":"NodeJs - Axios","value":"nodejs - Axios - NodeJs"},{"label":"NodeJs - Native","value":"nodejs - Native - NodeJs"},{"label":"NodeJs - Request","value":"nodejs - Request - NodeJs"},{"label":"NodeJs - Unirest","value":"nodejs - Unirest - NodeJs"},{"label":"Objective-C - NSURLSession","value":"objective-c - NSURLSession - Objective-C"},{"label":"OCaml - Cohttp","value":"ocaml - Cohttp - OCaml"},{"label":"PHP - cURL","value":"php - cURL - PHP"},{"label":"PHP - Guzzle","value":"php - Guzzle - PHP"},{"label":"PHP - HTTP_Request2","value":"php - HTTP_Request2 - PHP"},{"label":"PHP - pecl_http","value":"php - pecl_http - PHP"},{"label":"PowerShell - RestMethod","value":"powershell - RestMethod - PowerShell"},{"label":"Python - http.client","value":"python - http.client - Python"},{"label":"Python - Requests","value":"python - Requests - Python"},{"label":"R - httr","value":"r - httr - R"},{"label":"R - RCurl","value":"r - RCurl - R"},{"label":"Ruby - Net::HTTP","value":"ruby - Net::HTTP - Ruby"},{"label":"Shell - Httpie","value":"shell - Httpie - Shell"},{"label":"Shell - wget","value":"shell - wget - Shell"},{"label":"Swift - URLSession","value":"swift - URLSession - Swift"}],"layoutOptions":[{"value":"classic-single-column","label":"Single Column"},{"value":"classic-double-column","label":"Double Column"}],"versionOptions":[],"environmentOptions":[{"value":"0","label":"No Environment"}],"canonicalUrl":"https://api.smartolt.com/view/metadata/71CXC8s"}