Forward Enterprise Complete API

OpenAPI 3.2.0 REST API for Forward Enterprise — model and verify networks. Covers Networks, Snapshots, Checks, Path Search, the Network Query Engine (NQE), and Vulnerability Analysis. 189 operations; HTTP Basic authentication.

OpenAPI Specification

forward-networks-complete-openapi-original.json Raw ↑
{
  "openapi": "3.2.0",
  "info": {
    "title": "Forward Networks: Complete API",
    "description": "Model and verify networks",
    "contact": {
      "email": "support@forwardnetworks.com"
    },
    "license": {
      "name": "MIT",
      "url": "https://spdx.org/licenses/MIT"
    },
    "version": "26.6"
  },
  "servers": [
    {
      "url": "/api"
    }
  ],
  "tags": [
    {
      "name": "Aliases",
      "description": "Define groups of network infrastructure elements or packet header values",
      "summary": "Aliases"
    },
    {
      "name": "Checks",
      "description": "Enable or define automated checks that verify network policy and behavior",
      "summary": "Checks"
    },
    {
      "name": "Classic Devices",
      "description": "Specify the network devices to collect from and model",
      "summary": "Classic Devices"
    },
    {
      "name": "Credentials",
      "description": "Provide network device credentials needed for network collection",
      "summary": "Credentials"
    },
    {
      "name": "Current Version",
      "description": "Get current API version information",
      "summary": "Current Version"
    },
    {
      "name": "Device Tags",
      "description": "List or manage tags associated with network devices and endpoints",
      "summary": "Device Tags"
    },
    {
      "name": "Jump Servers",
      "description": "Configure jump servers to assist in reaching network devices",
      "summary": "Jump Servers"
    },
    {
      "name": "Network Collection",
      "description": "Configure configuration and state collection from network devices",
      "summary": "Network Collection"
    },
    {
      "name": "Network Devices",
      "description": "List the modeled network devices",
      "summary": "Network Devices"
    },
    {
      "name": "Network Endpoints",
      "description": "Configure network endpoint profiles and specify the network endpoints to collect from",
      "summary": "Network Endpoints"
    },
    {
      "name": "Network Locations",
      "description": "Get, create, update, or delete a network's user-defined locations",
      "summary": "Network Locations"
    },
    {
      "name": "Network Snapshots",
      "description": "List or manage the network Snapshots collected from network devices",
      "summary": "Network Snapshots"
    },
    {
      "name": "Network Topology",
      "description": "List the links inferred between network devices and override them if necessary",
      "summary": "Network Topology"
    },
    {
      "name": "Networks",
      "description": "Create, list, rename, or delete model networks",
      "summary": "Networks"
    },
    {
      "name": "NQE",
      "description": "Ask the Network Query Engine for structured, vendor-agnostic network information",
      "summary": "NQE"
    },
    {
      "name": "Path Search",
      "description": "Trace packets through the network model",
      "summary": "Path Search"
    },
    {
      "name": "Synthetic Devices",
      "description": "Model a network’s internet connections, intranets, L2VPNs, L3VPNs, WAN circuits, and encryptors",
      "summary": "Synthetic Devices"
    },
    {
      "name": "System Administration",
      "description": "Administer the system, including database backups",
      "summary": "System Administration"
    },
    {
      "name": "User Accounts",
      "description": "Manage user accounts",
      "summary": "User Accounts"
    },
    {
      "name": "Vulnerability Analysis",
      "description": "Identify network devices potentially impacted by CVEs",
      "summary": "Vulnerability Analysis"
    }
  ],
  "paths": {
    "/snapshots/{snapshotId}/aliases": {
      "get": {
        "tags": [
          "Aliases"
        ],
        "summary": "Get all Aliases",
        "operationId": "getAllAliases",
        "parameters": [
          {
            "name": "snapshotId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Aliases"
                }
              }
            }
          },
          "409": {
            "description": "The system is currently processing this Snapshot.\n\nNote: GET /networks/{networkId}/snapshots/latestProcessed can be used to determine when processing of the\nlatest Snapshot is done or to identify an alternate Snapshot that has already been processed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorInfo"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_token": []
          }
        ]
      },
      "delete": {
        "tags": [
          "Aliases"
        ],
        "summary": "Delete Aliases",
        "description": "Use the optional `name` parameter to delete only specific Aliases. It can be repeated as in\n`?name=foo&name=bar`. Omit the `name` parameter to delete all Aliases active in the Snapshot.",
        "operationId": "deactivateAliases",
        "parameters": [
          {
            "name": "snapshotId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "name",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK. The response contains the deleted Aliases.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Aliases"
                }
              }
            }
          },
          "409": {
            "description": "The system is currently processing this Snapshot.\n\nNote: GET /networks/{networkId}/snapshots/latestProcessed can be used to determine when processing of the\nlatest Snapshot is done or to identify an alternate Snapshot that has already been processed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorInfo"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_token": []
          }
        ]
      }
    },
    "/snapshots/{snapshotId}/aliases/{name}": {
      "get": {
        "tags": [
          "Aliases"
        ],
        "summary": "Get an Alias",
        "operationId": "getSingleAlias",
        "parameters": [
          {
            "name": "snapshotId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AliasAndValue"
                }
              }
            }
          },
          "409": {
            "description": "The system is currently processing this Snapshot.\n\nNote: GET /networks/{networkId}/snapshots/latestProcessed can be used to determine when processing of the\nlatest Snapshot is done or to identify an alternate Snapshot that has already been processed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorInfo"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_token": []
          }
        ]
      },
      "put": {
        "tags": [
          "Aliases"
        ],
        "summary": "Create an Alias",
        "operationId": "createAlias",
        "parameters": [
          {
            "name": "snapshotId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AliasBuilder"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Alias"
                }
              }
            }
          },
          "409": {
            "description": "The system is currently processing this Snapshot.\n\nNote: GET /networks/{networkId}/snapshots/latestProcessed can be used to determine when processing of the\nlatest Snapshot is done or to identify an alternate Snapshot that has already been processed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorInfo"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_token": []
          }
        ]
      },
      "delete": {
        "tags": [
          "Aliases"
        ],
        "summary": "Delete an Alias",
        "operationId": "deactivateAlias",
        "parameters": [
          {
            "name": "snapshotId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Alias"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_token": []
          }
        ]
      }
    },
    "/predefinedChecks": {
      "get": {
        "tags": [
          "Checks"
        ],
        "summary": "Get available Predefined checks",
        "operationId": "getAvailablePredefinedChecks",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AvailablePredefinedCheck"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "api_token": []
          }
        ]
      }
    },
    "/snapshots/{snapshotId}/checks": {
      "get": {
        "tags": [
          "Checks"
        ],
        "summary": "Get checks (with status)",
        "operationId": "getChecks",
        "parameters": [
          {
            "name": "snapshotId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "type",
            "in": "query",
            "description": "Can be repeated to request multiple types (as in `?type=NQE&type=Predefined`) or omitted to request all\ntypes.",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/CheckType"
              }
            }
          },
          {
            "name": "priority",
            "in": "query",
            "description": "Can be repeated to request multiple priorities (as in `?priority=HIGH&priority=LOW`) or omitted to request\nall priorities.",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/CheckPriority"
              }
            }
          },
          {
            "name": "status",
            "in": "query",
            "description": "Can be repeated to request multiple statuses (as in `?status=FAIL&status=ERROR`) or omitted to request all\nstatuses.\n\n**Note:** The response will never contain results with `status` NONE or PROCESSING. The server will wait to\nrespond, if necessary, until processing finishes or times out.",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/CheckStatus"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/NetworkCheckResult"
                  }
                }
              }
            }
          },
          "409": {
            "description": "The system is currently processing this Snapshot.\n\nNote: GET /networks/{networkId}/snapshots/latestProcessed can be used to determine when processing of the\nlatest Snapshot is done or to identify an alternate Snapshot that has already been processed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorInfo"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_token": []
          }
        ]
      },
      "post": {
        "tags": [
          "Checks"
        ],
        "summary": "Add a check",
        "description": "Note that the returned NetworkCheckResult will never have status of type NONE or PROCESSING",
        "operationId": "addCheck",
        "parameters": [
          {
            "name": "snapshotId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "persistent",
            "in": "query",
            "description": "Whether to associate check with any later snapshots (including future snapshots) too",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NewNetworkCheck"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NetworkCheckResult"
                }
              }
            }
          },
          "409": {
            "description": "The system is currently processing this Snapshot.\n\nNote: GET /networks/{networkId}/snapshots/latestProcessed can be used to determine when processing of the\nlatest Snapshot is done or to identify an alternate Snapshot that has already been processed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorInfo"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_token": []
          }
        ]
      },
      "delete": {
        "tags": [
          "Checks"
        ],
        "summary": "Deactivate all checks",
        "operationId": "deactivateChecks",
        "parameters": [
          {
            "name": "snapshotId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_token": []
          }
        ]
      }
    },
    "/snapshots/{snapshotId}/checks/{checkId}": {
      "get": {
        "tags": [
          "Checks"
        ],
        "summary": "Get a check (with status)",
        "description": "Note that the returned NetworkCheckResults will never have status of type NONE or PROCESSING",
        "operationId": "getCheck",
        "parameters": [
          {
            "name": "snapshotId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "checkId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NetworkCheckResultWithDiagnosis"
                }
              }
            }
          },
          "409": {
            "description": "The system is currently processing this Snapshot.\n\nNote: GET /networks/{networkId}/snapshots/latestProcessed can be used to determine when processing of the\nlatest Snapshot is done or to identify an alternate Snapshot that has already been processed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorInfo"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_token": []
          }
        ]
      },
      "delete": {
        "tags": [
          "Checks"
        ],
        "summary": "Deactivate a check",
        "operationId": "deactivateCheck",
        "parameters": [
          {
            "name": "snapshotId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "checkId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_token": []
          }
        ]
      }
    },
    "/networks/{networkId}/classic-devices": {
      "get": {
        "tags": [
          "Classic Devices"
        ],
        "summary": "Get all classic devices",
        "operationId": "getClassicDevices",
        "x-position": 1,
        "parameters": [
          {
            "name": "networkId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "with",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "tags",
                  "locationId",
                  "testResult"
                ]
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClassicDevices"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_token": []
          }
        ]
      },
      "post": {
        "tags": [
          "Classic Devices"
        ],
        "summary": "Add a new classic device",
        "operationId": "addClassicDevice",
        "x-position": 3,
        "parameters": [
          {
            "name": "networkId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NewClassicDevice"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClassicDevice"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_token": []
          }
        ]
      },
      "patch": {
        "tags": [
          "Classic Devices"
        ],
        "summary": "Update specific classic devices",
        "description": "All JSON properties in the `update` object are optional. Include only the properties you wish\nto change.",
        "operationId": "patchClassicDevices",
        "x-position": 8,
        "parameters": [
          {
            "name": "networkId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClassicDevicesPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": "No Content",
            "content": {}
          }
        },
        "security": [
          {
            "api_token": []
          }
        ]
      }
    },
    "/networks/{networkId}/classic-devices?action=addBatch": {
      "post": {
        "tags": [
          "Classic Devices"
        ],
        "summary": "Add new classic devices",
        "operationId": "addClassicDevices",
        "x-position": 4,
        "parameters": [
          {
            "name": "networkId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/NewClassicDevice"
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": "No Content",
            "content": {}
          }
        },
        "security": [
          {
            "api_token": []
          }
        ]
      }
    },
    "/networks/{networkId}/classic-devices?action=deleteAll": {
      "post": {
        "tags": [
          "Classic Devices"
        ],
        "summary": "Delete all of a network’s classic devices",
        "operationId": "deleteAllClassicDevices",
        "x-position": 7,
        "parameters": [
          {
            "name": "networkId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {}
          }
        },
        "security": [
          {
            "api_token": []
          }
        ]
      }
    },
    "/networks/{networkId}/classic-devices?action=deleteBatch": {
      "post": {
        "tags": [
          "Classic Devices"
        ],
        "summary": "Delete specific classic devices",
        "operationId": "deleteClassicDevices",
        "x-position": 6,
        "parameters": [
          {
            "name": "networkId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeviceCriteria"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": "No Content",
            "content": {}
          }
        },
        "security": [
          {
            "api_token": []
          }
        ]
      }
    },
    "/networks/{networkId}/classic-devices?action=getBatch": {
      "post": {
        "tags": [
          "Classic Devices"
        ],
        "summary": "Get specific classic devices",
        "operationId": "getSpecificClassicDevices",
        "x-position": 2,
        "parameters": [
          {
            "name": "networkId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "with",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "tags",
                  "locationId",
                  "testResult"
                ]
              }
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeviceNames"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClassicDevices"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_token": []
          }
        ]
      }
    },
    "/networks/{networkId}/classic-devices?action=putBatch": {
      "post": {
        "tags": [
          "Classic Devices"
        ],
        "summary": "Add or update classic devices",
        "operationId": "putClassicDevices",
        "x-position": 5,
        "parameters": [
          {
            "name": "networkId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/NewClassicDevice"
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": "No Content",
            "content": {}
          }
        },
        "security": [
          {
            "api_token": []
          }
        ]
      }
    },
    "/networks/{networkId}/classic-devices/{deviceName}": {
      "get": {
        "tags": [
          "Classic Devices"
        ],
        "summary": "Get a classic device",
        "operationId": "getClassicDevice",
        "x-position": 9,
        "parameters": [
          {
            "name": "networkId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "deviceName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "with",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "tags",
                  "locationId",
                  "testResult"
                ]
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClassicDevice"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_token": []
          }
        ]
      },
      "put": {
        "tags": [
          "Classic Devices"
        ],
        "summary": "Add or update a classic device",
        "operationId": "putClassicDevice",
        "x-position": 10,
        "parameters": [
          {
            "name": "networkId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "deviceName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NewClassicDevice"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClassicDevice"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_token": []
          }
        ]
      },
      "patch": {
        "tags": [
          "Classic Devices"
        ],
        "summary": "Update a classic device",
        "description": "All JSON properties in the request body are optional. Include only the properties you wish to\nchange.",
        "operationId": "patchClassicDevice",
        "x-position": 11,
        "parameters": [
          {
            "name": "networkId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "deviceName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClassicDevicePatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClassicDevice"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_token": []
          }
        ]
      },
      "delete": {
        "tags": [
          "Classic Devices"
        ],
        "summary": "Delete a classic device",
        "operationId": "deleteClassicDevice",
        "x-position": 12,
        "parameters": [
          {
            "name": "networkId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "deviceName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {}
          }
        },
        "security":

# --- truncated at 32 KB (595 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/forward-networks/refs/heads/main/openapi/forward-networks-complete-openapi-original.json