{
  "info": {
    "name": "OLT Multi-Vendor REST API \u2014 vendor.cuteadmoa.site",
    "_postman_id": "b7e6f1a2-3c4d-5e6f-8a9b-0c1d2e3f4a5b",
    "description": "Complete test collection for the OLT Multi-Vendor REST API.\n\n**Setup:** set `api_token` (collection variable) to your X-API-Token value, and `base_url` if you host elsewhere. Every request sends the token automatically.\n\nTest data included: sample vendor credentials body, ONU update payloads (PUT/PATCH), live-mode toggle.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    {
      "key": "base_url",
      "value": "https://vendor.cuteadmoa.site"
    },
    {
      "key": "api_token",
      "value": "my-custom-token-12345"
    },
    {
      "key": "vendor",
      "value": "bdcom"
    },
    {
      "key": "onu_id",
      "value": "1"
    }
  ],
  "item": [
    {
      "name": "Health",
      "item": [
        {
          "name": "GET /health (public)",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/health",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "health"
              ]
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 200', () => pm.response.to.have.status(200));",
                  "pm.test('Service is healthy', () => pm.expect(pm.response.json().status).to.eql('ok'));"
                ],
                "type": "text/javascript"
              }
            }
          ]
        }
      ]
    },
    {
      "name": "OLT Health",
      "item": [
        {
          "name": "GET /olts/bdcom",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-API-Token",
                "value": "{{api_token}}",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{base_url}}/olts/bdcom",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "olts",
                "bdcom"
              ]
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type is JSON', () => pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json'));",
                  "pm.test('Has vendor field', () => pm.expect(pm.response.json()).to.have.property('vendor'));"
                ],
                "type": "text/javascript"
              }
            }
          ]
        },
        {
          "name": "GET /olts/vsol",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-API-Token",
                "value": "{{api_token}}",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{base_url}}/olts/vsol",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "olts",
                "vsol"
              ]
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type is JSON', () => pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json'));"
                ],
                "type": "text/javascript"
              }
            }
          ]
        },
        {
          "name": "GET /olts/huawei",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-API-Token",
                "value": "{{api_token}}",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{base_url}}/olts/huawei",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "olts",
                "huawei"
              ]
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type is JSON', () => pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json'));"
                ],
                "type": "text/javascript"
              }
            }
          ]
        },
        {
          "name": "GET /olts/zte",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-API-Token",
                "value": "{{api_token}}",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{base_url}}/olts/zte",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "olts",
                "zte"
              ]
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type is JSON', () => pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json'));"
                ],
                "type": "text/javascript"
              }
            }
          ]
        },
        {
          "name": "GET /olts/solitine",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-API-Token",
                "value": "{{api_token}}",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{base_url}}/olts/solitine",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "olts",
                "solitine"
              ]
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type is JSON', () => pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json'));"
                ],
                "type": "text/javascript"
              }
            }
          ]
        }
      ]
    },
    {
      "name": "PON Statistics",
      "item": [
        {
          "name": "GET /pons/bdcom",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-API-Token",
                "value": "{{api_token}}",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{base_url}}/pons/bdcom",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "pons",
                "bdcom"
              ]
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type is JSON', () => pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json'));"
                ],
                "type": "text/javascript"
              }
            }
          ]
        },
        {
          "name": "GET /pons/vsol?pon_id=1",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-API-Token",
                "value": "{{api_token}}",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{base_url}}/pons/vsol?pon_id=1",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "pons",
                "vsol?pon_id=1"
              ]
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type is JSON', () => pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json'));"
                ],
                "type": "text/javascript"
              }
            }
          ]
        }
      ]
    },
    {
      "name": "ONU Status",
      "item": [
        {
          "name": "GET /onus/bdcom (all)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-API-Token",
                "value": "{{api_token}}",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{base_url}}/onus/bdcom",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "onus",
                "bdcom"
              ]
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type is JSON', () => pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json'));"
                ],
                "type": "text/javascript"
              }
            }
          ]
        },
        {
          "name": "GET /onus/bdcom?status=online",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-API-Token",
                "value": "{{api_token}}",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{base_url}}/onus/bdcom?status=online",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "onus",
                "bdcom?status=online"
              ]
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type is JSON', () => pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json'));"
                ],
                "type": "text/javascript"
              }
            }
          ]
        },
        {
          "name": "GET /onus/huawei",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-API-Token",
                "value": "{{api_token}}",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{base_url}}/onus/huawei",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "onus",
                "huawei"
              ]
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type is JSON', () => pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json'));"
                ],
                "type": "text/javascript"
              }
            }
          ]
        },
        {
          "name": "GET /onus/bdcom/1 (single)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-API-Token",
                "value": "{{api_token}}",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{base_url}}/onus/bdcom/1",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "onus",
                "bdcom",
                "1"
              ]
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type is JSON', () => pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json'));"
                ],
                "type": "text/javascript"
              }
            }
          ]
        }
      ]
    },
    {
      "name": "ONU Config (write)",
      "item": [
        {
          "name": "PUT /onus/bdcom/1 (full update)",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-API-Token",
                "value": "{{api_token}}",
                "type": "text"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/onus/bdcom/1",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "onus",
                "bdcom",
                "1"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"description\": \"Living Room ONT\",\n  \"vlan\": 100\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type is JSON', () => pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json'));"
                ],
                "type": "text/javascript"
              }
            }
          ]
        },
        {
          "name": "PATCH /onus/vsol/2 (partial)",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-API-Token",
                "value": "{{api_token}}",
                "type": "text"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/onus/vsol/2",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "onus",
                "vsol",
                "2"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"description\": \"flat-204\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type is JSON', () => pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json'));"
                ],
                "type": "text/javascript"
              }
            }
          ]
        }
      ]
    },
    {
      "name": "Device Credentials (admin)",
      "item": [
        {
          "name": "GET /api/v1/devices (status)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-API-Token",
                "value": "{{api_token}}",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/devices",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "devices"
              ]
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type is JSON', () => pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json'));"
                ],
                "type": "text/javascript"
              }
            }
          ]
        },
        {
          "name": "POST /api/v1/devices/bdcom/credentials (store)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-API-Token",
                "value": "{{api_token}}",
                "type": "text"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/devices/bdcom/credentials",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "devices",
                "bdcom",
                "credentials"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"host\": \"10.0.0.11\",\n  \"port\": 22,\n  \"protocol\": \"ssh\",\n  \"username\": \"client_user\",\n  \"password\": \"client_pass\",\n  \"snmp_community\": \"public\",\n  \"pon_types\": [\n    \"EPON\",\n    \"GPON\"\n  ],\n  \"live_mode\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type is JSON', () => pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json'));"
                ],
                "type": "text/javascript"
              }
            }
          ]
        },
        {
          "name": "POST /api/v1/devices/bdcom/test (reachability)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-API-Token",
                "value": "{{api_token}}",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/devices/bdcom/test",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "devices",
                "bdcom",
                "test"
              ]
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type is JSON', () => pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json'));"
                ],
                "type": "text/javascript"
              }
            }
          ]
        },
        {
          "name": "DELETE /api/v1/devices/bdcom/credentials (cleanup)",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-API-Token",
                "value": "{{api_token}}",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/devices/bdcom/credentials",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "devices",
                "bdcom",
                "credentials"
              ]
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type is JSON', () => pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json'));"
                ],
                "type": "text/javascript"
              }
            }
          ]
        },
        {
          "name": "PATCH /api/v1/devices/live-mode (toggle)",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "X-API-Token",
                "value": "{{api_token}}",
                "type": "text"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v1/devices/live-mode",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v1",
                "devices",
                "live-mode"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"live_mode\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 200', () => pm.response.to.have.status(200));",
                  "pm.test('Content-Type is JSON', () => pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json'));"
                ],
                "type": "text/javascript"
              }
            }
          ]
        }
      ]
    },
    {
      "name": "Auth checks",
      "item": [
        {
          "name": "No token \u2192 401",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/olts/bdcom",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "olts",
                "bdcom"
              ]
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 401', () => pm.response.to.have.status(401));",
                  "pm.test('Missing-token message', () => pm.expect(pm.response.json().detail).to.include('Missing X-API-Token'));"
                ],
                "type": "text/javascript"
              }
            }
          ]
        },
        {
          "name": "Wrong token \u2192 403",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "X-API-Token",
                "value": "definitely-wrong-token",
                "type": "text"
              }
            ],
            "url": {
              "raw": "{{base_url}}/olts/bdcom",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "olts",
                "bdcom"
              ]
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "exec": [
                  "pm.test('Status is 403', () => pm.response.to.have.status(403));"
                ],
                "type": "text/javascript"
              }
            }
          ]
        }
      ]
    }
  ]
}