zerotier-central-api 1.2.1

ZeroTier Central API for Rust
Documentation
{
  "openapi": "3.0.0",
  "info": {
    "description": "ZeroTier Central Network Management Portal API.<p>All API requests must have an API token header specified in the <code>Authorization: token xxxxx</code> format.  You can generate your API key by logging into <a href=\"https://my.zerotier.com\">ZeroTier Central</a> and creating a token on the Account page.</p><p>eg. <code>curl -X GET -H \"Authorization: token xxxxx\" https://api.zerotier.com/api/v1/network</code></p><p><h3>Rate Limiting</h3></p><p>The ZeroTier Central API implements rate limiting.  Paid users are limited to 100 requests per second.  Free users are limited to 20 requests per second.</p> <p> You can get the OpenAPI spec here as well: <code>https://docs.zerotier.com/openapi/centralv1.json</code></p>",
    "version": "v1",
    "title": "ZeroTier Central API",
    "contact": {
      "name": "ZeroTier Support Discussion Forum",
      "url": "https://discuss.zerotier.com"
    },
    "license": {
      "name": "Apache 2.0",
      "url": "http://www.apache.org/licenses/LICENSE-2.0.html"
    }
  },
  "servers": [
    {
      "url": "https://api.zerotier.com/api/v1",
      "description": "Production Server"
    }
  ],
  "tags": [
    {
      "name": "network",
      "description": "Network operations"
    },
    {
      "name": "network-member",
      "description": "Network member operations"
    },
    {
      "name": "user",
      "description": "User management operations"
    },
    {
      "name": "organizations",
      "description": "Organization management. Note: Organizations require a paid account and cannot be created via the API"
    },
    {
      "name": "util",
      "description": "Utility endpoints"
    }
  ],
  "paths": {
    "/status": {
      "get": {
        "tags": ["util"],
        "summary": "Obtain the overall status of the account tied to the API token in use.",
        "operationId": "getStatus",
        "responses": {
          "200": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Status"
                }
              }
            }
          }
        }
      }
    },
    "/network": {
      "get": {
        "tags": ["network"],
        "summary": "Returns a list of Networks you have access to.",
        "operationId": "getNetworkList",
        "responses": {
          "200": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Network"
                  }
                }
              }
            }
          },
          "403": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "post": {
        "tags": ["network"],
        "summary": "Create a new network.",
        "operationId": "newNetwork",
        "requestBody": {
          "description": "empty JSON object",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Network creation succeeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Network"
                }
              }
            }
          },
          "403": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/network/{networkID}": {
      "get": {
        "tags": ["network"],
        "summary": "Get network by ID",
        "description": "Returns a single network",
        "operationId": "getNetworkByID",
        "parameters": [
          {
            "name": "networkID",
            "description": "ID of the network to return",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "get success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Network"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "403": {
            "$ref": "#/components/responses/AccessDeniedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      },
      "post": {
        "tags": ["network"],
        "summary": "update network configuration",
        "operationId": "updateNetwork",
        "parameters": [
          {
            "name": "networkID",
            "description": "ID of the network to change",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "Network object JSON",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Network"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Network"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "403": {
            "$ref": "#/components/responses/AccessDeniedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      },
      "delete": {
        "tags": ["network"],
        "summary": "delete network",
        "operationId": "deleteNetwork",
        "parameters": [
          {
            "name": "networkID",
            "description": "ID of the network",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "network deleted"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "403": {
            "$ref": "#/components/responses/AccessDeniedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/network/{networkID}/member": {
      "get": {
        "tags": ["network-member"],
        "summary": "Returns a list of Members on the network.",
        "operationId": "getNetworkMemberList",
        "parameters": [
          {
            "name": "networkID",
            "description": "ID of the network to return",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "member list get success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Member"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "403": {
            "$ref": "#/components/responses/AccessDeniedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/network/{networkID}/member/{memberID}": {
      "get": {
        "tags": ["network-member"],
        "operationId": "getNetworkMember",
        "summary": "Return an individual member on a network",
        "parameters": [
          {
            "name": "networkID",
            "description": "ID of the network",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "memberID",
            "description": "ID of the member",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "member get success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Member"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "403": {
            "$ref": "#/components/responses/AccessDeniedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      },
      "post": {
        "tags": ["network-member"],
        "operationId": "updateNetworkMember",
        "summary": "Modify a network member",
        "parameters": [
          {
            "name": "networkID",
            "description": "ID of the network",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "memberID",
            "description": "ID of the member",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "Member object JSON",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Member"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "member changed successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Member"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "403": {
            "$ref": "#/components/responses/AccessDeniedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      },
      "delete": {
        "tags": ["network-member"],
        "operationId": "deleteNetworkMember",
        "summary": "Delete a network member",
        "parameters": [
          {
            "name": "networkID",
            "description": "ID of the network",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "memberID",
            "description": "ID of the member",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "member deleted"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "403": {
            "$ref": "#/components/responses/AccessDeniedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/user/{userID}": {
      "get": {
        "tags": ["user"],
        "operationId": "getUserByID",
        "summary": "Get user record",
        "parameters": [
          {
            "name": "userID",
            "description": "User ID",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "User get success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/User"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "403": {
            "$ref": "#/components/responses/AccessDeniedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      },
      "post": {
        "tags": ["user"],
        "operationId": "updateUserByID",
        "summary": "Update user record (SMS number or Display Name only)",
        "parameters": [
          {
            "name": "userID",
            "description": "User ID",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "User object JSON",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/User"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "User update success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/User"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "403": {
            "$ref": "#/components/responses/AccessDeniedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      },
      "delete": {
        "tags": ["user"],
        "operationId": "deleteUserByID",
        "summary": "Delete user",
        "description": "Deletes the user and all associated networks.  This is not reversible. Delete at your own risk.",
        "parameters": [
          {
            "name": "userID",
            "description": "User ID",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "user deleted"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "403": {
            "$ref": "#/components/responses/AccessDeniedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/user/{userID}/token": {
      "post": {
        "tags": ["user"],
        "operationId": "addAPIToken",
        "summary": "Add an API token",
        "parameters": [
          {
            "name": "userID",
            "description": "User ID",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "APIToken JSON object",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/APIToken"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "API Token added",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/APIToken"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "403": {
            "$ref": "#/components/responses/AccessDeniedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/user/{userID}/token/{tokenName}": {
      "delete": {
        "tags": ["user"],
        "operationId": "deleteAPIToken",
        "summary": "Delete API Token",
        "parameters": [
          {
            "name": "userID",
            "description": "User ID",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "tokenName",
            "description": "Token Name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "API token deleted"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "403": {
            "$ref": "#/components/responses/AccessDeniedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/org": {
      "get": {
        "tags": ["organizations"],
        "operationId": "getOrganization",
        "summary": "Get the current user's organization",
        "responses": {
          "200": {
            "description": "Get my organization",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Organization"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "403": {
            "$ref": "#/components/responses/AccessDeniedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/org/{orgID}": {
      "get": {
        "tags": ["organizations"],
        "operationId": "getOrganizationByID",
        "summary": "Get organization by ID",
        "parameters": [
          {
            "name": "orgID",
            "description": "Organization ID",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Organization",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Organization"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "403": {
            "$ref": "#/components/responses/AccessDeniedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/org/{orgID}/user": {
      "get": {
        "tags": ["organizations"],
        "operationId": "getOrganizationMembers",
        "summary": "Get list of organization members",
        "parameters": [
          {
            "name": "orgID",
            "description": "Organization ID",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Get organization members success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganizationMember"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "403": {
            "$ref": "#/components/responses/AccessDeniedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/org-invitation": {
      "get": {
        "tags": ["organizations"],
        "operationId": "getOrganizationInvitationList",
        "summary": "Get list of organization invitations",
        "responses": {
          "200": {
            "description": "Get list of invitations",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/OrganizationInvitation"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "403": {
            "$ref": "#/components/responses/AccessDeniedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      },
      "post": {
        "tags": ["organizations"],
        "operationId": "inviteUserByEmail",
        "summary": "Invite a user to your organization by email",
        "requestBody": {
          "description": "Organization Invitation JSON object",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OrganizationInvitation"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "User invited to organization",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganizationInvitation"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "403": {
            "$ref": "#/components/responses/AccessDeniedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/org-invitation/{inviteID}": {
      "get": {
        "tags": ["organizations"],
        "operationId": "getInvitationByID",
        "summary": "Get organization invitation",
        "parameters": [
          {
            "name": "inviteID",
            "description": "Invitation ID",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Get organization invitation",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganizationInvitation"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "403": {
            "$ref": "#/components/responses/AccessDeniedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      },
      "post": {
        "tags": ["organizations"],
        "operationId": "acceptInvitation",
        "summary": "Accept organization invitation",
        "parameters": [
          {
            "name": "inviteID",
            "description": "Invitation ID",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Organization invitation accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganizationInvitation"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "403": {
            "$ref": "#/components/responses/AccessDeniedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      },
      "delete": {
        "tags": ["organizations"],
        "operationId": "declineInvitation",
        "summary": "Decline organization invitation",
        "parameters": [
          {
            "name": "inviteID",
            "description": "Invitation ID",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "organization invitation declined"
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "403": {
            "$ref": "#/components/responses/AccessDeniedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/randomToken": {
      "get": {
        "tags": ["util"],
        "operationId": "getRandomToken",
        "summary": "Get a random 32 character token",
        "description": "Get a random 32 character.  Used by the web UI to generate API keys",
        "responses": {
          "200": {
            "description": "Random token",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RandomToken"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "tokenAuth": {
        "type": "http",
        "scheme": "token"
      }
    },
    "responses": {
      "BadRequest": {
        "description": "Bad request"
      },
      "AccessDeniedError": {
        "description": "Access denied"
      },
      "NotFound": {
        "description": "Item not found"
      },
      "UnauthorizedError": {
        "description": "Authorization required"
      }
    },
    "schemas": {
      "Network": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "example": "8056c2e21c000001",
            "readOnly": true,
            "nullable": true
          },
          "clock": {
            "type": "integer",
            "format": "int64",
            "example": 12345,
            "readOnly": true,
            "nullable": true
          },
          "config": {
            "$ref": "#/components/schemas/NetworkConfig",
            "nullable": true
          },
          "description": {
            "type": "string",
            "example": "Some descriptive text about my network.",
            "nullable": true
          },
          "rulesSource": {
            "type": "string",
            "example": "accept;",
            "nullable": true
          },
          "permissions": {
            "$ref": "#/components/schemas/PermissionsMap",
            "nullable": true
          },
          "ownerId": {
            "type": "string",
            "example": "00000000-0000-0000-0000-000000000000",
            "nullable": true
          },
          "onlineMemberCount": {
            "type": "integer",
            "example": 123,
            "readOnly": true,
            "nullable": true,
            "description": "Note: May be 0 on endpoints returning lists of Networks"
          },
          "authorizedMemberCount": {
            "type": "integer",
            "example": 200,
            "readOnly": true,
            "nullable": true
          },
          "totalMemberCount": {
            "type": "integer",
            "example": 250,
            "readOnly": true,
            "nullable": true
          },
          "capabilitiesByName": {
            "type": "object",
            "nullable": true
          },
          "tagsByName": {
            "type": "object",
            "nullable": true
          }
        },
        "description": "Network object"
      },
      "NetworkConfig": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "example": "8056c2e21c000001",
            "description": "Network ID",
            "readOnly": true,
            "nullable": true
          },
          "creationTime": {
            "type": "integer",
            "format": "int64",
            "example": 1442292672978,
            "description": "Time the network was created",
            "readOnly": true,
            "nullable": true
          },
          "capabilities": {
            "type": "array",
            "description": "Array of network capabilities",
            "items": {
              "type": "object"
            },
            "nullable": true
          },
          "dns": {
            "type": "object",
            "$ref": "#/components/schemas/DNS",
            "nullable": true
          },
          "enableBroadcast": {
            "type": "boolean",
            "example": true,
            "description": "Enable broadcast packets on the network",
            "nullable": true
          },
          "ipAssignmentPools": {
            "type": "array",
            "description": "Range of IP addresses for the auto assign pool",
            "items": {
              "$ref": "#/components/schemas/IPRange"
            },
            "nullable": true
          },
          "lastModified": {
            "type": "integer",
            "format": "int64",
            "example": 1588184318235,
            "description": "Time the network was last modified",
            "readOnly": true,
            "nullable": true
          },
          "mtu": {
            "type": "integer",
            "example": 2800,
            "description": "MTU to set on the client virtual network adapter",
            "nullable": true
          },
          "multicastLimit": {
            "type": "integer",
            "example": 32,
            "description": "Maximum number of recipients per multicast or broadcast. Warning - Setting this to 0 will disable IPv4 communication on your network!",
            "nullable": true
          },
          "name": {
            "type": "string",
            "example": "My ZeroTier Network",
            "nullable": true
          },
          "private": {
            "type": "boolean",
            "example": true,
            "description": "Whether or not the network is private.  If false, members will *NOT* need to be authorized to join.",
            "nullable": true
          },
          "routes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Route"
            },
            "nullable": true
          },
          "rules": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "nullable": true
          },
          "v4AssignMode": {
            "$ref": "#/components/schemas/IPV4AssignMode",
            "nullable": true
          },
          "v6AssignMode": {
            "$ref": "#/components/schemas/IPV6AssignMode",
            "nullable": true
          }
        }
      },
      "Member": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "example": "8056c2e21c000001-abcdef0123",
            "description": "concatenation of network ID and member ID",
            "readOnly": true,
            "deprecated": true,
            "nullable": true
          },
          "clock": {
            "type": "integer",
            "format": "int64",
            "example": 1612993759070,
            "readOnly": true,
            "nullable": true
          },
          "networkId": {
            "type": "string",
            "example": "8056c2e21c000001",
            "readOnly": true,
            "nullable": true
          },
          "nodeId": {
            "type": "string",
            "example": "abcdef01234",
            "description": "ZeroTier ID of the member",
            "readOnly": true,
            "nullable": true
          },
          "controllerId": {
            "type": "string",
            "example": "8056c2e21c",
            "readOnly": true,
            "deprecated": true,
            "nullable": true
          },
          "hidden": {
            "type": "boolean",
            "example": false,
            "description": "Whether or not the member is hidden in the UI",
            "nullable": true
          },
          "name": {
            "type": "string",
            "example": "my-cray-supercomputer",
            "readOnly": false,
            "description": "User defined name of the member",
            "nullable": true
          },
          "description": {
            "type": "string",
            "example": "My super awesome cray that I got ZeroTier to run on",
            "readOnly": false,
            "description": "User defined description of the member",
            "nullable": true
          },
          "config": {
            "$ref": "#/components/schemas/MemberConfig",
            "nullable": true
          },
          "lastOnline": {
            "type": "integer",
            "format": "int64",
            "readOnly": true,
            "description": "Last seen time of the member.  Note: This data is considered ephemeral and may be reset to 0 at any time without warning.",
            "example": 1612993673254,
            "nullable": true
          },
          "physicalAddress": {
            "type": "string",
            "readOnly": true,
            "description": "IP address the member last spoke to the controller via.  Note: This data is considered ephemeral and may be reset to 0 at any time without warning.",
            "example": "8.8.8.8",
            "nullable": true
          },
          "clientVersion": {
            "type": "string",
            "readOnly": true,
            "description": "ZeroTier version the member is running",
            "example": "1.6.3",
            "nullable": true
          },
          "protocolVersion": {
            "type": "integer",
            "readOnly": true,
            "description": "ZeroTier protocol version",
            "example": 12,
            "nullable": true
          },
          "supportsRulesEngine": {
            "type": "boolean",
            "readOnly": true,
            "description": "Whether or not the client version is new enough to support the rules engine (1.4.0+)",
            "nullable": true
          }
        }
      },
      "MemberConfig": {
        "type": "object",
        "properties": {
          "activeBridge": {
            "type": "boolean",
            "readOnly": false,
            "description": "Allow the member to be a bridge on the network",
            "example": false,
            "nullable": true
          },
          "authorized": {
            "type": "boolean",
            "readOnly": false,
            "description": "Is the member authorized on the network",
            "example": true,
            "nullable": true
          },
          "capabilities": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "nullable": true
          },
          "creationTime": {
            "type": "integer",
            "format": "int64",
            "readOnly": true,
            "description": "Time the member was created or first tried to join the network",
            "example": 1599853509872,
            "nullable": true
          },
          "id": {
            "type": "string",
            "readOnly": true,
            "description": "ID of the member node.  This is the 10 digit identifier that identifies a ZeroTier node.",
            "example": "abcdef01234",
            "nullable": true
          },
          "identity": {
            "type": "string",
            "readOnly": true,
            "description": "Public Key of the member's Identity",
            "example": "abcdef0123:0:abcdef0123abcdef0123abcdef0123abcdef0123abcdef0123abcdef0123abcdef0123",
            "nullable": true
          },
          "ipAssignments": {
            "type": "array",
            "readOnly": false,
            "description": "List of assigned IP addresses",
            "items": {
              "type": "string"
            },
            "example": ["10.0.0.3"],
            "nullable": true
          },
          "lastAuthorizedTime": {
            "type": "integer",
            "format": "int64",
            "readOnly": true,
            "description": "Time the member was authorized on the network",
            "example": 1599853637989,
            "nullable": true
          },
          "lastDeauthorizedTime": {
            "type": "integer",
            "format": "int64",
            "readOnly": true,
            "description": "Time the member was deauthorized on the network",
            "example": 0,
            "nullable": true
          },
          "noAutoAssignIps": {
            "type": "boolean",
            "readOnly": false,
            "description": "Exempt this member from the IP auto assignment pool on a Network",
            "example": false,
            "nullable": true
          },
          "revision": {
            "type": "integer",
            "readOnly": true,
            "description": "Member record revision count",
            "example": 123,
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "array",
              "items": {
                "anyOf": [{ "type": "integer" }, { "type": "boolean" }]
              }
            },
            "nullable": true,
            "readOnly": false,
            "description": "Array of 2 member tuples of tag [ID, tag value]",
            "example": [[123, 456]]
          },
          "vMajor": {
            "type": "integer",
            "readOnly": true,
            "description": "Major version of the client",
            "example": 1,
            "nullable": true
          },
          "vMinor": {
            "type": "integer",
            "readOnly": true,
            "description": "Minor version of the client",
            "example": 6,
            "nullable": true
          },
          "vRev": {
            "type": "integer",
            "readOnly": true,
            "description": "Revision number of the client",
            "example": 3,
            "nullable": true
          },
          "vProto": {
            "type": "integer",
            "readOnly": true,
            "description": "Protocol version of the client",
            "example": 12,
            "nullable": true
          }
        }
      },
      "User": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "readOnly": true,
            "description": "User ID",
            "example": "00000000-0000-0000-0000-000000000000"
          },
          "orgId": {
            "type": "string",
            "readOnly": true,
            "description": "Organization ID",
            "example": "00000000-0000-0000-0000-000000000000"
          },
          "globalPermissions": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/Permissions"
              }
            ]
          },
          "displayName": {
            "type": "string",
            "readOnly": false,
            "description": "Display Name",
            "example": "Joe User"
          },
          "email": {
            "type": "string",
            "readOnly": true,
            "description": "User email address",
            "example": "user@example.com"
          },
          "auth": {
            "readOnly": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/AuthMethods"
              }
            ]
          },
          "smsNumber": {
            "type": "string",
            "readOnly": false,
            "description": "SMS number",
            "example": "+1-800-555-1212",
            "deprecated": true
          },
          "tokens": {
            "type": "array",
            "readOnly": true,
            "items": {
              "type": "string"
            },
            "example": ["my-token-id"],
            "description": "List of API token names."
          }
        }
      },
      "Organization": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "example": "00000000-0000-0000-0000-000000000000",
            "description": "Organization ID"
          },
          "ownerId": {
            "type": "string",
            "description": "User ID of the organization owner",
            "example": "00000000-0000-0000-0000-000000000000",
            "readOnly": true
          },
          "ownerEmail": {
            "type": "string",
            "description": "Organization owner's email address",
            "example": "user@example.com",
            "readOnly": true
          },
          "members": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OrganizationMember"
            },
            "description": "List of organization members"
          },
          "ssoConfig": {
            "type": "object",
            "$ref": "#/components/schemas/SsoConfig",
            "description": "Organization wide SSO configuration"
          }
        }
      },
      "SsoConfig": {
        "type": "object",
        "properties": {
          "clientId": {
            "type": "string",
            "example": "oidc-client-id",
            "description": "OIDC Client ID"
          },
          "issuer": {
            "type": "string",
            "example": "https://example.com/oidc/auth",
            "description": "OIDC Issuer URL"
          },
          "enabled": {
            "type": "boolean",
            "example": true,
            "description": "Enabled flag for SSO"
          }
        }
      },
      "OrganizationMember": {
        "type": "object",
        "properties": {
          "orgId": {
            "type": "string",
            "readOnly": true,
            "description": "Organization ID",
            "example": "00000000-0000-0000-0000-000000000000"
          },
          "userId": {
            "type": "string",
            "readOnly": false,
            "description": "User ID",
            "example": "00000000-0000-0000-0000-000000000000"
          },
          "name": {
            "type": "string",
            "readOnly": true,
            "nullable": true,
            "description": "Organization member display name",
            "example": "Joe User"
          },
          "email": {
            "type": "string",
            "readOnly": true,
            "nullable": true,
            "description": "Organization member email address"
          }
        }
      },
      "OrganizationInvitation": {
        "type": "object",
        "properties": {
          "orgId": {
            "type": "string",
            "description": "Organization ID",
            "example": "00000000-0000-0000-0000-000000000000",
            "readOnly": true
          },
          "email": {
            "type": "string",
            "description": "Email address of invitee",
            "example": "joe@user.com"
          },
          "id": {
            "type": "string",
            "description": "Invitation ID",
            "example": "00000000-0000-0000-0000-000000000000",
            "readOnly": true
          },
          "creation_time": {
            "type": "integer",
            "format": "int64",
            "description": "Creation time of the invite",
            "example": 1613067920454,
            "readOnly": true
          },
          "status": {
            "readOnly": true,
            "description": "Invitation status",
            "example": "pending",
            "allOf": [
              {
                "$ref": "#/components/schemas/InviteStatus"
              }
            ]
          },
          "update_time": {
            "type": "integer",
            "format": "int64",
            "description": "Last updated time of the invitation",
            "example": 1613067920454,
            "readOnly": true
          },
          "ownerEmail": {
            "type": "string",
            "description": "Organization owner email address",
            "example": "user@example.com",
            "readOnly": true
          }
        }
      },
      "PermissionsMap": {
        "type": "object",
        "additionalProperties": {
          "$ref": "#/components/schemas/Permissions"
        },
        "example": {
          "00000000-0000-0000-0000-000000000000": {
            "a": true,
            "d": true,
            "m": true,
            "r": true
          }
        }
      },
      "Permissions": {
        "type": "object",
        "properties": {
          "a": {
            "type": "boolean",
            "example": true,
            "description": "Authorize permission"
          },
          "d": {
            "type": "boolean",
            "example": true,
            "description": "Delete permission"
          },
          "m": {
            "type": "boolean",
            "example": true,
            "description": "Modify network settings permission"
          },
          "r": {
            "type": "boolean",
            "example": true,
            "description": "Read network settings permission"
          }
        }
      },
      "IPRange": {
        "type": "object",
        "properties": {
          "ipRangeStart": {
            "type": "string",
            "example": "10.0.0.1"
          },
          "ipRangeEnd": {
            "type": "string",
            "example": "10.0.0.255"
          }
        }
      },
      "DNS": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string",
            "example": "some.domain",
            "description": "Search domain to use for DNS records"
          },
          "servers": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "example": ["10.0.0.3"],
            "description": "IP address of unicast DNS service",
            "nullable": true
          }
        }
      },
      "Route": {
        "type": "object",
        "properties": {
          "target": {
            "type": "string",
            "example": "10.0.0.0/24"
          },
          "via": {
            "type": "string",
            "example": null,
            "nullable": true
          }
        }
      },
      "IPV4AssignMode": {
        "type": "object",
        "properties": {
          "zt": {
            "type": "boolean",
            "example": true
          }
        }
      },
      "IPV6AssignMode": {
        "type": "object",
        "properties": {
          "6plane": {
            "type": "boolean",
            "example": true,
            "nullable": true
          },
          "rfc4193": {
            "type": "boolean",
            "example": false,
            "nullable": true
          },
          "zt": {
            "type": "boolean",
            "example": false,
            "nullable": true
          }
        }
      },
      "AuthMethods": {
        "type": "object",
        "properties": {
          "local": {
            "type": "string",
            "example": "user@example.com",
            "description": "email address for built-in authentication",
            "nullable": true,
            "readOnly": true
          },
          "google": {
            "type": "string",
            "example": "156162346876134683",
            "description": "Google OIDC ID",
            "nullable": true,
            "readOnly": true
          },
          "oidc": {
            "type": "string",
            "example": "00000000-0000-0000-0000-000000000000",
            "description": "Generic OIDC ID",
            "nullable": true,
            "readOnly": true
          }
        }
      },
      "APIToken": {
        "type": "object",
        "properties": {
          "tokenName": {
            "type": "string",
            "example": "my-super-secret-token",
            "description": "user specified token name",
            "readOnly": false
          },
          "token": {
            "type": "string",
            "example": "adsf98ashdkjh3689adsfnj3$ADn",
            "description": "API Token.  Minimum 32 characters. This token is encrypted in the database and can not be retrieved once set",
            "readOnly": false,
            "writeOnly": true
          }
        }
      },
      "InviteStatus": {
        "type": "string",
        "enum": ["pending", "accepted", "canceled"]
      },
      "Status": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "example": "central_status"
          },
          "type": {
            "type": "string",
            "example": "CentralStatus"
          },
          "clock": {
            "type": "integer",
            "format": "int64",
            "example": 1613067920454,
            "readOnly": true,
            "description": "Current time on server"
          },
          "version": {
            "type": "string",
            "example": "1.6.5"
          },
          "apiVersion": {
            "type": "string",
            "example": "4"
          },
          "uptime": {
            "type": "integer",
            "format": "int64",
            "example": 1613067920454,
            "readOnly": true,
            "description": "Uptime on server"
          },
          "user": {
            "$ref": "#/components/schemas/User"
          },
          "readOnlyMode": {
            "type": "boolean"
          },
          "loginMethods": {
            "type": "object",
            "properties": {
              "local": {
                "type": "boolean"
              },
              "google": {
                "type": "boolean"
              },
              "twitter": {
                "type": "boolean"
              },
              "facebook": {
                "type": "boolean"
              },
              "github": {
                "type": "boolean"
              },
              "saml": {
                "type": "boolean"
              },
              "oidc": {
                "type": "boolean"
              }
            }
          }
        }
      },
      "RandomToken": {
        "type": "object",
        "properties": {
          "clock": {
            "type": "integer",
            "format": "int64",
            "example": 1613067920454,
            "readOnly": true,
            "description": "Current time on server"
          },
          "hex": {
            "type": "string",
            "example": "16924f3ff478526cffb1b89b1040b33c8dbd3c09e07f39691f615769121c0d76",
            "readOnly": true,
            "description": "hex encoded random bytes of the token"
          },
          "token": {
            "type": "string",
            "example": "wwrb66uUh18Fqc38rd8jMd5RFJzRsCn4",
            "readOnly": true,
            "description": "Random 32 character token"
          }
        }
      }
    }
  },
  "security": [
    {
      "bearerAuth": []
    }
  ]
}