LISNR Portal API

The LISNR Portal API is the account-management surface behind portal.lisnr.com. It authenticates portal users, manages the users on an account, returns the account and its licensed products, creates and deletes LISNR applications, mints and revokes the per-application API tokens used against the Tones Service API and the SDK tokens used to initialize the Radius object in the client SDKs, lists downloadable SDK releases with their documentation and sample projects, and lists account invoices. LISNR does not publish an OpenAPI for this surface; the description carried in this repo is derived from the first-party Portal single-page application and is labelled as observed, not authoritative.

OpenAPI Specification

lisnr-portal-openapi-derived.json Raw ↑
{
  "openapi": "3.0.3",
  "info": {
    "title": "LISNR Portal API (observed)",
    "version": "v2",
    "description": "Unofficial OpenAPI description of the LISNR Portal API, DERIVED by the API Evangelist enrichment pipeline from the first-party LISNR Portal single-page application bundle (https://portal.lisnr.com/scripts/script.865ef81c.js, build 2025-12-16). Paths, HTTP methods, path/query parameters, the `Authorization: JWT <token>` scheme and the `{ result: ... }` response envelope are all OBSERVED from that first-party client. Request and response body schemas are NOT described here because LISNR does not publish them; nothing has been invented. LISNR publishes an official OpenAPI only for the Tones Service API (see openapi/lisnr-tones-openapi-original.json).",
    "contact": {
      "name": "LISNR Technical Support",
      "email": "techsupport@lisnr.com"
    },
    "x-apievangelist-provenance": {
      "method": "derived",
      "source": "https://portal.lisnr.com/scripts/script.865ef81c.js",
      "config_source": "https://portal.lisnr.com/config.js",
      "build": "2025-12-16T18:23:14Z",
      "note": "Observed client surface, not a LISNR-published specification."
    }
  },
  "servers": [
    {
      "url": "https://api.lisnr.com",
      "description": "LISNR Portal API (apiBaseURL from portal config.js)"
    }
  ],
  "security": [
    {
      "jwtToken": []
    }
  ],
  "tags": [
    {
      "name": "Authentication"
    },
    {
      "name": "Users"
    },
    {
      "name": "Notifications"
    },
    {
      "name": "Accounts"
    },
    {
      "name": "Applications"
    },
    {
      "name": "API Tokens"
    },
    {
      "name": "SDK Tokens"
    },
    {
      "name": "SDK Releases"
    },
    {
      "name": "Billing"
    }
  ],
  "paths": {
    "/v2/auth/login": {
      "post": {
        "operationId": "login",
        "summary": "Authenticate a portal user",
        "tags": [
          "Authentication"
        ],
        "responses": {
          "200": {
            "description": "Success. Payload is returned on the `result` property of the response envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials were not provided, or are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          }
        },
        "description": "Exchange username + password for a JWT bearer token.",
        "security": []
      }
    },
    "/v2/auth/password/reset": {
      "post": {
        "operationId": "forgotPassword",
        "summary": "Request a password reset",
        "tags": [
          "Authentication"
        ],
        "responses": {
          "200": {
            "description": "Success. Payload is returned on the `result` property of the response envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials were not provided, or are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          }
        },
        "description": "Send a password reset email for the given username.",
        "security": []
      }
    },
    "/v2/auth/password/reset/{token}": {
      "post": {
        "operationId": "confirmPasswordReset",
        "summary": "Complete a password reset",
        "tags": [
          "Authentication"
        ],
        "responses": {
          "200": {
            "description": "Success. Payload is returned on the `result` property of the response envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials were not provided, or are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          }
        },
        "description": "Complete a password reset using the emailed token.",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": []
      }
    },
    "/v2/auth/password/change": {
      "post": {
        "operationId": "changePassword",
        "summary": "Change the current user's password",
        "tags": [
          "Authentication"
        ],
        "responses": {
          "200": {
            "description": "Success. Payload is returned on the `result` property of the response envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials were not provided, or are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwtToken": []
          }
        ]
      }
    },
    "/v2/auth/customer-agreement/accept": {
      "post": {
        "operationId": "acceptCustomerAgreement",
        "summary": "Accept the customer agreement",
        "tags": [
          "Authentication"
        ],
        "responses": {
          "200": {
            "description": "Success. Payload is returned on the `result` property of the response envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials were not provided, or are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          }
        },
        "description": "Accept the LISNR customer agreement by supplying initials.",
        "security": [
          {
            "jwtToken": []
          }
        ]
      }
    },
    "/v2/users/": {
      "get": {
        "operationId": "listUsers",
        "summary": "List users on the account",
        "tags": [
          "Users"
        ],
        "responses": {
          "200": {
            "description": "Success. Payload is returned on the `result` property of the response envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials were not provided, or are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "jwtToken": []
          }
        ]
      },
      "post": {
        "operationId": "createUser",
        "summary": "Create a user on the account",
        "tags": [
          "Users"
        ],
        "responses": {
          "200": {
            "description": "Success. Payload is returned on the `result` property of the response envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials were not provided, or are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwtToken": []
          }
        ]
      }
    },
    "/v2/users/me": {
      "get": {
        "operationId": "getCurrentUser",
        "summary": "Get the authenticated user",
        "tags": [
          "Users"
        ],
        "responses": {
          "200": {
            "description": "Success. Payload is returned on the `result` property of the response envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials were not provided, or are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwtToken": []
          }
        ]
      }
    },
    "/v2/users/{id}": {
      "get": {
        "operationId": "getUser",
        "summary": "Get a user by id",
        "tags": [
          "Users"
        ],
        "responses": {
          "200": {
            "description": "Success. Payload is returned on the `result` property of the response envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials were not provided, or are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "jwtToken": []
          }
        ]
      },
      "put": {
        "operationId": "updateUser",
        "summary": "Update a user",
        "tags": [
          "Users"
        ],
        "responses": {
          "200": {
            "description": "Success. Payload is returned on the `result` property of the response envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials were not provided, or are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          }
        },
        "description": "Used by the portal to toggle a user's enabled state and to set a password.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "jwtToken": []
          }
        ]
      }
    },
    "/v2/users/{userid}/notifications/": {
      "get": {
        "operationId": "listNotifications",
        "summary": "List a user's notifications",
        "tags": [
          "Notifications"
        ],
        "responses": {
          "200": {
            "description": "Success. Payload is returned on the `result` property of the response envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials were not provided, or are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "userid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "jwtToken": []
          }
        ]
      }
    },
    "/v2/users/{userid}/notifications/{id}": {
      "patch": {
        "operationId": "updateNotification",
        "summary": "Update a notification",
        "tags": [
          "Notifications"
        ],
        "responses": {
          "200": {
            "description": "Success. Payload is returned on the `result` property of the response envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials were not provided, or are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          }
        },
        "description": "Marks a notification read (is_read) or dismissed (is_dismissed).",
        "parameters": [
          {
            "name": "userid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "jwtToken": []
          }
        ]
      }
    },
    "/v2/accounts": {
      "get": {
        "operationId": "listAccounts",
        "summary": "Get the authenticated user's account",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "200": {
            "description": "Success. Payload is returned on the `result` property of the response envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials were not provided, or are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          }
        },
        "description": "Returns the account, including the licensed products list (legacy, radius, radius3, point, sda).",
        "security": [
          {
            "jwtToken": []
          }
        ]
      }
    },
    "/v2/apps": {
      "get": {
        "operationId": "listApps",
        "summary": "List applications",
        "tags": [
          "Applications"
        ],
        "responses": {
          "200": {
            "description": "Success. Payload is returned on the `result` property of the response envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials were not provided, or are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwtToken": []
          }
        ]
      },
      "post": {
        "operationId": "createApp",
        "summary": "Create an application",
        "tags": [
          "Applications"
        ],
        "responses": {
          "200": {
            "description": "Success. Payload is returned on the `result` property of the response envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials were not provided, or are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          }
        },
        "security": [
          {
            "jwtToken": []
          }
        ]
      }
    },
    "/v2/apps/{id}": {
      "get": {
        "operationId": "getApp",
        "summary": "Get an application",
        "tags": [
          "Applications"
        ],
        "responses": {
          "200": {
            "description": "Success. Payload is returned on the `result` property of the response envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials were not provided, or are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "jwtToken": []
          }
        ]
      },
      "put": {
        "operationId": "updateApp",
        "summary": "Update an application",
        "tags": [
          "Applications"
        ],
        "responses": {
          "200": {
            "description": "Success. Payload is returned on the `result` property of the response envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials were not provided, or are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "jwtToken": []
          }
        ]
      },
      "delete": {
        "operationId": "deleteApp",
        "summary": "Delete an application",
        "tags": [
          "Applications"
        ],
        "responses": {
          "200": {
            "description": "Success. Payload is returned on the `result` property of the response envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials were not provided, or are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "jwtToken": []
          }
        ]
      }
    },
    "/v2/apps/{id}/api-tokens": {
      "get": {
        "operationId": "listApiTokens",
        "summary": "List API tokens for an application",
        "tags": [
          "API Tokens"
        ],
        "responses": {
          "200": {
            "description": "Success. Payload is returned on the `result` property of the response envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials were not provided, or are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "jwtToken": []
          }
        ]
      },
      "post": {
        "operationId": "createApiToken",
        "summary": "Create an API token for an application",
        "tags": [
          "API Tokens"
        ],
        "responses": {
          "200": {
            "description": "Success. Payload is returned on the `result` property of the response envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials were not provided, or are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          }
        },
        "description": "API tokens authorize calls to the Tones Service API on behalf of a LISNR application.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "jwtToken": []
          }
        ]
      }
    },
    "/v2/apps/{id}/api-tokens/{token_id}": {
      "delete": {
        "operationId": "deleteApiToken",
        "summary": "Delete an API token",
        "tags": [
          "API Tokens"
        ],
        "responses": {
          "200": {
            "description": "Success. Payload is returned on the `result` property of the response envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials were not provided, or are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "token_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "jwtToken": []
          }
        ]
      }
    },
    "/v2/apps/{id}/sdk-tokens": {
      "get": {
        "operationId": "listSdkTokens",
        "summary": "List SDK tokens for an application",
        "tags": [
          "SDK Tokens"
        ],
        "responses": {
          "200": {
            "description": "Success. Payload is returned on the `result` property of the response envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials were not provided, or are not valid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            

# --- truncated at 32 KB (39 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/lisnr/refs/heads/main/openapi/lisnr-portal-openapi-derived.json