{
  "swagger": "2.0",
  "basePath": "/cerebrum/v1",
  "paths": {
    "/accounts/": {
      "get": {
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "$ref": "#/definitions/AccountList"
            }
          }
        },
        "summary": "List accounts",
        "operationId": "get_account_list_resource",
        "parameters": [
          {
            "name": "name",
            "in": "query",
            "type": "string",
            "description": "Filter by account name. Accepts * and ? as wildcards."
          },
          {
            "name": "context",
            "in": "query",
            "type": "string",
            "description": "Filter by context. Accepts * and ? as wildcards."
          },
          {
            "name": "owner_id",
            "in": "query",
            "type": "integer",
            "description": "Filter by owner entity ID."
          },
          {
            "name": "owner_type",
            "in": "query",
            "type": "string",
            "description": "Filter by owner entity type."
          },
          {
            "name": "expire_start",
            "in": "query",
            "type": "string",
            "description": "Filter by expiration start date."
          },
          {
            "name": "expire_stop",
            "in": "query",
            "type": "string",
            "description": "Filter by expiration end date."
          },
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{name}": {
      "parameters": [
        {
          "description": "account name",
          "name": "name",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ],
      "get": {
        "responses": {
          "404": {
            "description": "Not Found"
          },
          "200": {
            "description": "Success",
            "schema": {
              "$ref": "#/definitions/Account"
            }
          }
        },
        "summary": "Get account information",
        "operationId": "get_account_resource",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{name}/affiliations": {
      "parameters": [
        {
          "description": "account name",
          "name": "name",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ],
      "get": {
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "$ref": "#/definitions/AccountAffiliationList"
            }
          }
        },
        "summary": "List affiliations for an account",
        "operationId": "get_account_affiliation_list_resource",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{name}/contacts": {
      "parameters": [
        {
          "description": "account name",
          "name": "name",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ],
      "get": {
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "$ref": "#/definitions/EntityContactInfoList"
            }
          }
        },
        "summary": "Lists contact information for an account",
        "operationId": "get_account_contact_info_list_resource",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{name}/emailaddresses": {
      "parameters": [
        {
          "description": "account name",
          "name": "name",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ],
      "get": {
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "$ref": "#/definitions/AccountEmailAddress"
            }
          }
        },
        "summary": "Get the email addresses for an account",
        "operationId": "get_account_email_address_resource",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{name}/groups": {
      "parameters": [
        {
          "description": "account name",
          "name": "name",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ],
      "get": {
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "properties": {
                "groups": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/GroupListItem"
                  }
                }
              }
            }
          }
        },
        "summary": "List groups an account is a member of",
        "operationId": "get_account_group_list_resource",
        "parameters": [
          {
            "name": "indirect_memberships",
            "in": "query",
            "type": "string",
            "description": "If true, include indirect group memberships."
          },
          {
            "name": "filter_expired",
            "in": "query",
            "type": "string",
            "description": "If false, include expired groups."
          },
          {
            "name": "expired_only",
            "in": "query",
            "type": "string",
            "description": "If true, only include expired groups."
          },
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{name}/homes": {
      "parameters": [
        {
          "description": "account name",
          "name": "name",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ],
      "get": {
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "$ref": "#/definitions/AccountHomeList"
            }
          }
        },
        "summary": "List home directories for an account",
        "operationId": "get_account_home_list_resource",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{name}/password": {
      "parameters": [
        {
          "description": "account name",
          "name": "name",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ],
      "post": {
        "responses": {
          "400": {
            "description": "Invalid password"
          },
          "200": {
            "description": "Password changed",
            "schema": {
              "$ref": "#/definitions/PasswordChanged"
            }
          }
        },
        "summary": "Change the password for this account",
        "operationId": "post_account_password_resource",
        "parameters": [
          {
            "name": "password",
            "in": "query",
            "type": "string",
            "description": "Password, leave empty to generate one"
          }
        ],
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{name}/password/check": {
      "parameters": [
        {
          "description": "account name",
          "name": "name",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ],
      "post": {
        "responses": {
          "400": {
            "description": "Password missing or contains unsupported characters"
          },
          "200": {
            "description": "Password check result"
          }
        },
        "summary": "Check if a password is valid according to rules",
        "operationId": "post_account_password_checker_resource",
        "parameters": [
          {
            "name": "password",
            "in": "query",
            "type": "string",
            "required": true,
            "description": "Password"
          }
        ],
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{name}/password/verify": {
      "parameters": [
        {
          "description": "account name",
          "name": "name",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ],
      "post": {
        "responses": {
          "400": {
            "description": "Password missing or contains unsupported characters"
          },
          "200": {
            "description": "Password verification",
            "schema": {
              "$ref": "#/definitions/PasswordVerification"
            }
          }
        },
        "summary": "Verify the password for this account",
        "operationId": "post_account_password_verifier_resource",
        "parameters": [
          {
            "name": "password",
            "in": "query",
            "type": "string",
            "required": true,
            "description": "Password"
          }
        ],
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{name}/posix": {
      "parameters": [
        {
          "description": "account name",
          "name": "name",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ],
      "get": {
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "$ref": "#/definitions/PosixAccount"
            }
          }
        },
        "summary": "Get POSIX account information",
        "operationId": "get_posix_account_resource",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{name}/quarantines": {
      "parameters": [
        {
          "description": "account name",
          "name": "name",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ],
      "get": {
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "$ref": "#/definitions/AccountQuarantineList"
            }
          }
        },
        "summary": "Get account quarantines",
        "operationId": "get_account_quarantine_list_resource",
        "parameters": [
          {
            "name": "context",
            "in": "query",
            "type": "string",
            "description": "Consider locked status based on context."
          },
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "accounts"
        ]
      }
    },
    "/accounts/{name}/quarantines/{quarantine}": {
      "parameters": [
        {
          "description": "account name",
          "name": "name",
          "in": "path",
          "required": true,
          "type": "string"
        },
        {
          "description": "quarantine type",
          "name": "quarantine",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ],
      "get": {
        "responses": {
          "404": {
            "description": "account or quarantine not found"
          },
          "400": {
            "description": "invalid quarantine type"
          },
          "200": {
            "description": "Success",
            "schema": {
              "$ref": "#/definitions/EntityQuarantine"
            }
          }
        },
        "summary": "Get account quarantines",
        "operationId": "get_account_quarantine_item_resource",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "accounts"
        ]
      },
      "delete": {
        "responses": {
          "404": {
            "description": "account or quarantine not found"
          },
          "400": {
            "description": "invalid quarantine type"
          },
          "204": {
            "description": "quarantine removed"
          }
        },
        "summary": "Remove quarantine from account",
        "operationId": "delete_account_quarantine_item_resource",
        "tags": [
          "accounts"
        ]
      },
      "put": {
        "responses": {
          "200": {
            "description": "quarantine updated"
          },
          "404": {
            "description": "account not found"
          },
          "400": {
            "description": "invalid quarantine type"
          },
          "201": {
            "description": "quarantine added"
          }
        },
        "summary": "Add quarantine on account",
        "description": "Note that all datetime inputs are stripped of time info, and turned\ninto dates (in local time). E.g.\n\n- 2017-01-01T00+08 -> 2016-12-31T17+01 -> 2016-12-31",
        "operationId": "put_account_quarantine_item_resource",
        "parameters": [
          {
            "name": "start",
            "in": "query",
            "type": "string",
            "required": true,
            "description": "when the quarantine should take effect (ISO8601 datetime)"
          },
          {
            "name": "end",
            "in": "query",
            "type": "string",
            "description": "if/when the quarantine should end (ISO8601 datetime)"
          },
          {
            "name": "disable_until",
            "in": "query",
            "type": "string",
            "description": "if/when the quarantine should really start (ISO8601 datetime)"
          },
          {
            "name": "comment",
            "in": "query",
            "type": "string",
            "description": "{error_msg}"
          },
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "accounts"
        ]
      }
    },
    "/contexts/": {
      "get": {
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/Context"
              }
            }
          }
        },
        "summary": "List contexts",
        "operationId": "get_context_list_resource",
        "parameters": [
          {
            "name": "entity_types",
            "in": "query",
            "type": "array",
            "description": "Filter by entity type(s)",
            "items": {
              "type": "string"
            },
            "collectionFormat": "multi"
          },
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "contexts"
        ]
      }
    },
    "/emailaddresses/{address}": {
      "parameters": [
        {
          "description": "Email address",
          "name": "address",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ],
      "get": {
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/EmailAddress"
              }
            }
          }
        },
        "summary": "Get email address information",
        "operationId": "get_email_addresses_resource",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "emailaddresses"
        ]
      }
    },
    "/groups/": {
      "get": {
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "properties": {
                "groups": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/GroupListItem"
                  }
                }
              }
            }
          }
        },
        "summary": "List groups",
        "operationId": "get_group_list_resource",
        "parameters": [
          {
            "name": "name",
            "in": "query",
            "type": "string",
            "description": "Filter by name. Accepts * and ? as wildcards."
          },
          {
            "name": "description",
            "in": "query",
            "type": "string",
            "description": "Filter by description. Accepts * and ? as wildcards."
          },
          {
            "name": "context",
            "in": "query",
            "type": "string",
            "description": "Filter by context."
          },
          {
            "name": "member_id",
            "in": "query",
            "type": "array",
            "description": "Filter by memberships. Only groups that have member_id as a member will be returned. If member_id is a sequence, the group is returned if any of the IDs are a member of it.",
            "items": {
              "type": "integer"
            },
            "collectionFormat": "multi"
          },
          {
            "name": "indirect_members",
            "in": "query",
            "type": "boolean",
            "description": "If true, alter the behavior of the member_id filter to also include groups where member_id is an indirect member."
          },
          {
            "name": "filter_expired",
            "in": "query",
            "type": "boolean",
            "description": "If false, include expired groups."
          },
          {
            "name": "expired_only",
            "in": "query",
            "type": "boolean",
            "description": "If true, only include expired groups."
          },
          {
            "name": "creator_id",
            "in": "query",
            "type": "integer",
            "description": "Filter by creator entity ID."
          },
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "groups"
        ]
      }
    },
    "/groups/{name}": {
      "parameters": [
        {
          "description": "group name",
          "name": "name",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ],
      "get": {
        "responses": {
          "200": {
            "description": "Group found",
            "schema": {
              "$ref": "#/definitions/Group"
            }
          },
          "404": {
            "description": "Group not found"
          }
        },
        "summary": "Get group information",
        "operationId": "get_group_resource",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "groups"
        ]
      },
      "delete": {
        "responses": {
          "404": {
            "description": "group not found"
          },
          "204": {
            "description": "group deleted"
          }
        },
        "summary": "Delete group",
        "operationId": "delete_group_resource",
        "tags": [
          "groups"
        ]
      },
      "put": {
        "responses": {
          "200": {
            "description": "Group updated",
            "schema": {
              "$ref": "#/definitions/Group"
            }
          },
          "400": {
            "description": "Illegal group name"
          },
          "201": {
            "description": "Group created",
            "schema": {
              "$ref": "#/definitions/Group"
            }
          }
        },
        "summary": "Create or update group",
        "operationId": "put_group_resource",
        "parameters": [
          {
            "name": "visibility",
            "in": "query",
            "type": "string",
            "required": true,
            "description": "{error_msg}",
            "enum": [
              "all",
              "none",
              "internal"
            ]
          },
          {
            "name": "description",
            "in": "query",
            "type": "string",
            "description": "{error_msg}"
          },
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "groups"
        ]
      }
    },
    "/groups/{name}/contexts/{context}": {
      "parameters": [
        {
          "description": "group name",
          "name": "name",
          "in": "path",
          "required": true,
          "type": "string"
        },
        {
          "description": "group context",
          "name": "context",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ],
      "get": {
        "responses": {
          "404": {
            "description": "group or context not found"
          },
          "400": {
            "description": "invalid context"
          },
          "204": {
            "description": "context found on group"
          }
        },
        "summary": "Check if group has context",
        "operationId": "get_group_context_resource",
        "tags": [
          "groups"
        ]
      },
      "delete": {
        "responses": {
          "404": {
            "description": "group not found"
          },
          "400": {
            "description": "invalid context"
          },
          "204": {
            "description": "context removed"
          }
        },
        "summary": "Remove context from group",
        "operationId": "delete_group_context_resource",
        "tags": [
          "groups"
        ]
      },
      "put": {
        "responses": {
          "404": {
            "description": "group not found"
          },
          "400": {
            "description": "invalid context"
          },
          "204": {
            "description": "context added"
          }
        },
        "summary": "Add context on group",
        "operationId": "put_group_context_resource",
        "tags": [
          "groups"
        ]
      }
    },
    "/groups/{name}/members/": {
      "get": {
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "properties": {
                "members": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/GroupMember"
                  }
                }
              }
            }
          }
        },
        "summary": "List members of a group",
        "operationId": "get_group_member_list_resource",
        "parameters": [
          {
            "name": "name",
            "in": "path",
            "required": true,
            "type": "string",
            "description": "group name"
          },
          {
            "name": "type",
            "in": "query",
            "type": "string",
            "description": "Filter by entity type."
          },
          {
            "name": "context",
            "in": "query",
            "type": "string",
            "description": "Filter by context. Accepts * and ? as wildcards."
          },
          {
            "name": "filter_expired",
            "in": "query",
            "type": "boolean",
            "description": "If false, include members that are expired."
          },
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "groups"
        ]
      },
      "put": {
        "responses": {
          "404": {
            "description": "group or member not found"
          },
          "200": {
            "description": "members added"
          }
        },
        "summary": "Set the member list to the provided set of members",
        "operationId": "put_group_member_list_resource",
        "parameters": [
          {
            "name": "members",
            "in": "query",
            "type": "array",
            "description": "{error_msg}",
            "default": [],
            "items": {
              "type": "string"
            },
            "collectionFormat": "multi"
          },
          {
            "name": "name",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "tags": [
          "groups"
        ]
      }
    },
    "/groups/{name}/members/{member_id}": {
      "parameters": [
        {
          "description": "group name",
          "name": "name",
          "in": "path",
          "required": true,
          "type": "string"
        },
        {
          "description": "member id",
          "name": "member_id",
          "in": "path",
          "required": true,
          "type": "integer"
        }
      ],
      "get": {
        "responses": {
          "200": {
            "description": "member found in group",
            "schema": {
              "$ref": "#/definitions/GroupMember"
            }
          },
          "404": {
            "description": "group or member not found"
          }
        },
        "summary": "Check if member exists in group",
        "operationId": "get_group_member_resource",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "groups"
        ]
      },
      "delete": {
        "responses": {
          "404": {
            "description": "group or member not found"
          },
          "204": {
            "description": "member removed"
          }
        },
        "summary": "Remove member from group",
        "operationId": "delete_group_member_resource",
        "tags": [
          "groups"
        ]
      },
      "put": {
        "responses": {
          "200": {
            "description": "member added",
            "schema": {
              "$ref": "#/definitions/GroupMember"
            }
          },
          "422": {
            "description": "policy-groups accepts only group members"
          },
          "404": {
            "description": "group or member not found"
          }
        },
        "summary": "Add member to group",
        "operationId": "put_group_member_resource",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "groups"
        ]
      }
    },
    "/groups/{name}/moderators/": {
      "parameters": [
        {
          "description": "group name",
          "name": "name",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ],
      "get": {
        "responses": {
          "200": {
            "description": "group found"
          },
          "404": {
            "description": "group not found"
          }
        },
        "summary": "Get admins for this group",
        "operationId": "get_group_moderator_list_resource",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "groups"
        ]
      }
    },
    "/groups/{name}/moderators/{role}/{moderator_id}": {
      "parameters": [
        {
          "description": "group name",
          "name": "name",
          "in": "path",
          "required": true,
          "type": "string"
        },
        {
          "description": "id of the moderator",
          "name": "moderator_id",
          "in": "path",
          "required": true,
          "type": "integer"
        },
        {
          "name": "role",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ],
      "delete": {
        "responses": {
          "409": {
            "description": "too few administrators"
          },
          "404": {
            "description": "group or moderator not found"
          },
          "400": {
            "description": "invalid opset"
          },
          "204": {
            "description": "moderator removed"
          }
        },
        "summary": "Remove a group moderator",
        "operationId": "delete_group_moderator_resource",
        "tags": [
          "groups"
        ]
      },
      "put": {
        "responses": {
          "404": {
            "description": "group or moderator not found"
          },
          "400": {
            "description": "invalid role"
          },
          "204": {
            "description": "moderator added"
          }
        },
        "summary": "Add a group moderator",
        "operationId": "put_group_moderator_resource",
        "tags": [
          "groups"
        ]
      }
    },
    "/groups/{name}/posix": {
      "get": {
        "responses": {
          "200": {
            "description": "posix data",
            "schema": {
              "$ref": "#/definitions/PosixGroup"
            }
          },
          "404": {
            "description": "group not found"
          }
        },
        "summary": "Get POSIX group information",
        "operationId": "get_posix_group_resource",
        "parameters": [
          {
            "name": "name",
            "in": "path",
            "required": true,
            "type": "string",
            "description": "group name"
          },
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "groups"
        ]
      }
    },
    "/notes/": {
      "post": {
        "responses": {
          "400": {
            "description": "Invalid note parameter(s)"
          },
          "201": {
            "description": "Note created",
            "schema": {
              "$ref": "#/definitions/EntityNote"
            }
          }
        },
        "summary": "Create a new note",
        "operationId": "post_entity_notes",
        "parameters": [
          {
            "name": "entity_id",
            "in": "query",
            "type": "string",
            "required": true,
            "description": "Note for entity_id."
          },
          {
            "name": "subject",
            "in": "query",
            "type": "string",
            "required": true,
            "description": "Note subject."
          },
          {
            "name": "body",
            "in": "query",
            "type": "string",
            "description": "Note body."
          },
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "notes"
        ]
      },
      "get": {
        "responses": {
          "400": {
            "description": "Invalid search parameter(s)"
          },
          "200": {
            "description": "Success",
            "schema": {
              "$ref": "#/definitions/EntityNoteRefList"
            }
          }
        },
        "summary": "Get list of entity notes",
        "operationId": "get_entity_notes",
        "parameters": [
          {
            "name": "entity_id",
            "in": "query",
            "type": "string",
            "description": "Only include notes for this entity id."
          },
          {
            "name": "creator_id",
            "in": "query",
            "type": "string",
            "description": "Only include notes created by this account id."
          },
          {
            "name": "after",
            "in": "query",
            "type": "string",
            "description": "Only include notes created after this date (ISO-8601 datetime, date, or time)."
          },
          {
            "name": "before",
            "in": "query",
            "type": "string",
            "description": "Only include notes created before this date (ISO-8601 datetime, date, or time)."
          },
          {
            "name": "subject",
            "in": "query",
            "type": "string",
            "description": "Only include notes with this subject (supports case-insensitive glob-like patterns)."
          },
          {
            "name": "body",
            "in": "query",
            "type": "string",
            "description": "Only include notes with this content (supports case-insensitive glob-like patterns)."
          },
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "notes"
        ]
      }
    },
    "/notes/{id}": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "type": "integer"
        }
      ],
      "get": {
        "responses": {
          "404": {
            "description": "Note not found"
          },
          "200": {
            "description": "Note found",
            "schema": {
              "$ref": "#/definitions/EntityNote"
            }
          }
        },
        "summary": "Get a note by note id",
        "operationId": "get_entity_note",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "notes"
        ]
      },
      "delete": {
        "responses": {
          "404": {
            "description": "Note not found"
          },
          "204": {
            "description": "Note deleted"
          }
        },
        "summary": "Delete a note by note id",
        "operationId": "delete_entity_note",
        "tags": [
          "notes"
        ]
      }
    },
    "/ous/{id}": {
      "parameters": [
        {
          "description": "OU ID",
          "name": "id",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ],
      "get": {
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "$ref": "#/definitions/OrganizationalUnit"
            }
          }
        },
        "summary": "Get organizational unit information",
        "operationId": "get_organizational_unit_resource",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "ous"
        ]
      }
    },
    "/persons/{id}": {
      "parameters": [
        {
          "description": "Person entity ID",
          "name": "id",
          "in": "path",
          "required": true,
          "type": "integer"
        }
      ],
      "get": {
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "$ref": "#/definitions/Person"
            }
          }
        },
        "summary": "Get person information",
        "operationId": "get_person_resource",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "persons"
        ]
      }
    },
    "/persons/{id}/accounts": {
      "parameters": [
        {
          "description": "Person entity ID",
          "name": "id",
          "in": "path",
          "required": true,
          "type": "integer"
        }
      ],
      "get": {
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "$ref": "#/definitions/PersonAccountList"
            }
          }
        },
        "summary": "Get the accounts of a person",
        "operationId": "get_person_account_list_resource",
        "parameters": [
          {
            "name": "include_expired",
            "in": "query",
            "type": "string",
            "description": "If true, include expired accounts. Default is false (exclude expired accounts).",
            "default": false
          },
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "persons"
        ]
      }
    },
    "/persons/{id}/addresses": {
      "parameters": [
        {
          "description": "Person entity ID",
          "name": "id",
          "in": "path",
          "required": true,
          "type": "integer"
        }
      ],
      "get": {
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "properties": {
                "addresses": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/PersonAddress"
                  }
                }
              }
            }
          }
        },
        "summary": "Get the addresses of a person",
        "operationId": "get_person_address_list_resource",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "persons"
        ]
      }
    },
    "/persons/{id}/affiliations": {
      "parameters": [
        {
          "description": "Person entity ID",
          "name": "id",
          "in": "path",
          "required": true,
          "type": "integer"
        }
      ],
      "get": {
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "$ref": "#/definitions/PersonAffiliationList"
            }
          }
        },
        "summary": "List person affiliations",
        "operationId": "get_person_affiliation_list_resource",
        "parameters": [
          {
            "name": "include_deleted",
            "in": "query",
            "type": "string",
            "description": "If true, deleted affiliations are included."
          },
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "persons"
        ]
      }
    },
    "/persons/{id}/consents": {
      "parameters": [
        {
          "description": "Person entity ID",
          "name": "id",
          "in": "path",
          "required": true,
          "type": "integer"
        }
      ],
      "get": {
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "properties": {
                "consents": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/EntityConsent"
                  }
                }
              }
            }
          }
        },
        "summary": "Get the consents of a person",
        "operationId": "get_person_consent_list_resource",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "persons"
        ]
      }
    },
    "/persons/{id}/contacts": {
      "parameters": [
        {
          "description": "Person entity ID",
          "name": "id",
          "in": "path",
          "required": true,
          "type": "integer"
        }
      ],
      "get": {
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "$ref": "#/definitions/EntityContactInfoList"
            }
          }
        },
        "summary": "Get person contact information",
        "operationId": "get_person_contact_info_list_resource",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "persons"
        ]
      }
    },
    "/persons/{id}/external-ids": {
      "parameters": [
        {
          "description": "Person entity ID",
          "name": "id",
          "in": "path",
          "required": true,
          "type": "integer"
        }
      ],
      "get": {
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "properties": {
                "external_ids": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/EntityExternalId"
                  }
                }
              }
            }
          }
        },
        "summary": "Get external IDs of a person",
        "operationId": "get_person_external_id_list_resource",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "persons"
        ]
      }
    },
    "/persons/{id}/groups": {
      "parameters": [
        {
          "description": "Person entity ID",
          "name": "id",
          "in": "path",
          "required": true,
          "type": "integer"
        }
      ],
      "get": {
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "properties": {
                "groups": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/GroupListItem"
                  }
                }
              }
            }
          }
        },
        "summary": "List groups a person is a member of",
        "operationId": "get_person_group_list_resource",
        "parameters": [
          {
            "name": "indirect_memberships",
            "in": "query",
            "type": "string",
            "description": "If true, include indirect group memberships."
          },
          {
            "name": "filter_expired",
            "in": "query",
            "type": "string",
            "description": "If false, include expired groups."
          },
          {
            "name": "expired_only",
            "in": "query",
            "type": "string",
            "description": "If true, only include expired groups."
          },
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "persons"
        ]
      }
    },
    "/persons/{id}/otp/default": {
      "parameters": [
        {
          "description": "Person entity ID",
          "name": "id",
          "in": "path",
          "required": true,
          "type": "integer"
        }
      ],
      "get": {
        "responses": {
          "200": {
            "description": "Success"
          }
        },
        "operationId": "get_person_set_otp_secret",
        "tags": [
          "persons"
        ]
      },
      "delete": {
        "responses": {
          "204": {
            "description": "secret deleted"
          }
        },
        "operationId": "delete_person_set_otp_secret",
        "tags": [
          "persons"
        ]
      },
      "put": {
        "responses": {
          "204": {
            "description": "secret validated and stored"
          }
        },
        "operationId": "put_person_set_otp_secret",
        "parameters": [
          {
            "name": "secret",
            "in": "query",
            "type": "string",
            "required": true,
            "description": "OTP secret"
          }
        ],
        "tags": [
          "persons"
        ]
      }
    },
    "/search/persons/affiliations": {
      "get": {
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "properties": {
                "persons": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/PersonResult"
                  }
                }
              }
            }
          }
        },
        "operationId": "get_aff_search_resource",
        "parameters": [
          {
            "name": "affiliation",
            "in": "query",
            "type": "string",
            "description": "Filter by affiliation or status, e.g ANSATT or ANSATT/tekadm"
          },
          {
            "name": "location",
            "in": "query",
            "type": "string",
            "description": "Filter by location using six-digit stedkode, e.g 373022"
          },
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "search"
        ]
      }
    },
    "/search/persons/external-ids": {
      "get": {
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "properties": {
                "external_ids": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/ExternalIdItem"
                  }
                }
              }
            }
          }
        },
        "summary": "Get external IDs",
        "operationId": "get_external_id_resource",
        "parameters": [
          {
            "name": "source_system",
            "in": "query",
            "type": "array",
            "description": "Filter by one or more source systems.",
            "items": {
              "type": "string"
            },
            "collectionFormat": "multi"
          },
          {
            "name": "id_type",
            "in": "query",
            "type": "array",
            "description": "Filter by one or more ID types.",
            "items": {
              "type": "string"
            },
            "collectionFormat": "multi"
          },
          {
            "name": "external_id",
            "in": "query",
            "type": "string",
            "required": true,
            "description": "Filter by external ID."
          },
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "search"
        ]
      }
    },
    "/voip/addresses/": {
      "post": {
        "responses": {
          "400": {
            "description": "Invalid address data"
          },
          "200": {
            "description": "Address created",
            "schema": {
              "$ref": "#/definitions/VoipAddress"
            }
          }
        },
        "summary": "Create a new VoipAddress for a given owner",
        "operationId": "post_voip_address_list_resource",
        "parameters": [
          {
            "name": "owner_id",
            "in": "query",
            "type": "integer",
            "required": true,
            "description": "Address owner"
          },
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "voip"
        ]
      },
      "get": {
        "responses": {
          "400": {
            "description": "Invalid search parameter(s)"
          },
          "200": {
            "description": "Success",
            "schema": {
              "$ref": "#/definitions/VoipAddressList"
            }
          }
        },
        "summary": "Search for voip addresses",
        "description": "Search by entity_id, owner_entity_id, or contact info.",
        "operationId": "get_voip_address_list_resource",
        "parameters": [
          {
            "name": "owner_id",
            "in": "query",
            "type": "integer",
            "description": "Filter addresses by owner id"
          },
          {
            "name": "owner_type",
            "in": "query",
            "type": "string",
            "description": "Filter addresses by owner type"
          },
          {
            "name": "contact_value",
            "in": "query",
            "type": "string",
            "description": "Filter addresses by contact value"
          },
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "voip"
        ]
      }
    },
    "/voip/addresses/{address_id}": {
      "parameters": [
        {
          "description": "VoIP address id",
          "name": "address_id",
          "in": "path",
          "required": true,
          "type": "integer"
        }
      ],
      "get": {
        "responses": {
          "404": {
            "description": "Address missing"
          },
          "200": {
            "description": "Address found",
            "schema": {
              "$ref": "#/definitions/VoipAddress"
            }
          }
        },
        "summary": "Get voip address information",
        "operationId": "get_voip_address_resource",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "voip"
        ]
      },
      "delete": {
        "responses": {
          "400": {
            "description": "Address with VOIP clients not deleted"
          },
          "204": {
            "description": "Address deleted"
          }
        },
        "summary": "Delete a voip address",
        "operationId": "delete_voip_address_resource",
        "tags": [
          "voip"
        ]
      }
    },
    "/voip/addresses/{address_id}/numbers": {
      "parameters": [
        {
          "description": "VoIP address id",
          "name": "address_id",
          "in": "path",
          "required": true,
          "type": "integer"
        }
      ],
      "post": {
        "responses": {
          "400": {
            "description": "Number not added"
          },
          "201": {
            "description": "Number added",
            "schema": {
              "$ref": "#/definitions/VoipNumber"
            }
          }
        },
        "summary": "Generate and add a phone number to a voip address",
        "operationId": "post_voip_number_collection_resource",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "voip"
        ]
      },
      "get": {
        "responses": {
          "404": {
            "description": "Address missing"
          },
          "200": {
            "description": "Address numbers found",
            "schema": {
              "$ref": "#/definitions/VoipNumberList"
            }
          }
        },
        "summary": "Get voip numbers for a given address",
        "operationId": "get_voip_number_collection_resource",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "voip"
        ]
      }
    },
    "/voip/addresses/{address_id}/numbers/{number}": {
      "parameters": [
        {
          "description": "VoIP address id",
          "name": "address_id",
          "in": "path",
          "required": true,
          "type": "integer"
        },
        {
          "description": "VoIP phone number",
          "name": "number",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ],
      "get": {
        "responses": {
          "404": {
            "description": "Address or number not found"
          },
          "200": {
            "description": "Address number found",
            "schema": {
              "$ref": "#/definitions/VoipNumber"
            }
          }
        },
        "summary": "Get details for a given number",
        "operationId": "get_voip_number_resource",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "voip"
        ]
      },
      "delete": {
        "responses": {
          "404": {
            "description": "Number not found"
          },
          "204": {
            "description": "Number deleted"
          }
        },
        "summary": "Delete a phone number from a voip address",
        "operationId": "delete_voip_number_resource",
        "tags": [
          "voip"
        ]
      },
      "put": {
        "responses": {
          "404": {
            "description": "Address not found"
          },
          "400": {
            "description": "Invalid request"
          },
          "201": {
            "description": "Number added",
            "schema": {
              "$ref": "#/definitions/VoipNumber"
            }
          },
          "200": {
            "description": "Success",
            "schema": {
              "$ref": "#/definitions/VoipNumber"
            }
          }
        },
        "summary": "Add number or update extension for the given address",
        "operationId": "put_voip_number_resource",
        "parameters": [
          {
            "name": "extension",
            "in": "query",
            "type": "string",
            "description": "Extension number to add (will auto-generate if empty)"
          },
          {
            "name": "priority",
            "in": "query",
            "type": "integer",
            "description": "Optional priority value - should normally be omitted"
          },
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "voip"
        ]
      }
    },
    "/voip/services/": {
      "post": {
        "responses": {
          "400": {
            "description": "Service not created"
          },
          "201": {
            "description": "Service created"
          }
        },
        "summary": "Create a new voip service",
        "operationId": "post_voip_service_list_resource",
        "parameters": [
          {
            "name": "payload",
            "required": true,
            "in": "body",
            "schema": {
              "$ref": "#/definitions/VoipServiceCreate"
            }
          }
        ],
        "tags": [
          "voip"
        ]
      },
      "get": {
        "responses": {
          "400": {
            "description": "Invalid search parameter(s)"
          },
          "200": {
            "description": "Success",
            "schema": {
              "$ref": "#/definitions/VoipServiceList"
            }
          }
        },
        "summary": "List or search for voip services",
        "operationId": "get_voip_service_list_resource",
        "parameters": [
          {
            "name": "ou_id",
            "in": "query",
            "type": "integer",
            "description": "Only include services for the given org unit id (ou entity-id)"
          },
          {
            "name": "location",
            "in": "query",
            "type": "integer",
            "description": "Only include services by org unit location code (stedkode)"
          },
          {
            "name": "description",
            "in": "query",
            "type": "string",
            "description": "Only include services with the given description (supports case-insensitive glob-like patterns)"
          },
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "voip"
        ]
      }
    },
    "/voip/services/{service_id}": {
      "parameters": [
        {
          "description": "Service entity ID",
          "name": "service_id",
          "in": "path",
          "required": true,
          "type": "integer"
        }
      ],
      "get": {
        "responses": {
          "404": {
            "description": "Service not found"
          },
          "200": {
            "description": "Service found",
            "schema": {
              "$ref": "#/definitions/VoipService"
            }
          }
        },
        "summary": "Get voip service information",
        "operationId": "get_voip_service_resource",
        "parameters": [
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "voip"
        ]
      },
      "delete": {
        "responses": {
          "404": {
            "description": "Service not found"
          },
          "204": {
            "description": "Service deleted"
          }
        },
        "summary": "Delete a voip service",
        "operationId": "delete_voip_service_resource",
        "tags": [
          "voip"
        ]
      },
      "put": {
        "responses": {
          "404": {
            "description": "Service not found"
          },
          "400": {
            "description": "Invalid service parameters"
          },
          "200": {
            "description": "Service updated",
            "schema": {
              "$ref": "#/definitions/VoipService"
            }
          }
        },
        "summary": "Update voip service information",
        "operationId": "put_voip_service_resource",
        "parameters": [
          {
            "name": "payload",
            "required": true,
            "in": "body",
            "schema": {
              "$ref": "#/definitions/VoipServiceUpdate"
            }
          },
          {
            "name": "X-Fields",
            "in": "header",
            "type": "string",
            "format": "mask",
            "description": "An optional fields mask"
          }
        ],
        "tags": [
          "voip"
        ]
      }
    }
  },
  "info": {
    "title": "Cerebrum REST API",
    "version": "1.0",
    "description": "Cerebrum is a user administration and identity management system."
  },
  "produces": [
    "application/json"
  ],
  "consumes": [
    "application/json"
  ],
  "tags": [
    {
      "name": "accounts",
      "description": "Account operations"
    },
    {
      "name": "groups",
      "description": "Group operations"
    },
    {
      "name": "emailaddresses",
      "description": "Email address operations"
    },
    {
      "name": "contexts",
      "description": "Context operations"
    },
    {
      "name": "ous",
      "description": "Organizational unit operations"
    },
    {
      "name": "persons",
      "description": "Person operations"
    },
    {
      "name": "search",
      "description": "Search operations"
    },
    {
      "name": "notes",
      "description": "Entity notes"
    },
    {
      "name": "voip",
      "description": "VoIP service and address namespace"
    }
  ],
  "definitions": {
    "Account": {
      "properties": {
        "href": {
          "type": "string",
          "description": "URL to this resource"
        },
        "name": {
          "type": "string",
          "description": "Account name"
        },
        "id": {
          "type": "integer",
          "description": "Entity ID"
        },
        "owner": {
          "description": "Entity owner",
          "allOf": [
            {
              "$ref": "#/definitions/EntityOwner"
            }
          ]
        },
        "created_at": {
          "type": "string",
          "format": "date-time",
          "description": "Account creation timestamp"
        },
        "expire_date": {
          "type": "string",
          "format": "date-time",
          "description": "Expiration date"
        },
        "contexts": {
          "type": "array",
          "description": "Visible in these contexts",
          "items": {
            "type": "string"
          }
        },
        "primary_email": {
          "type": "string",
          "description": "Primary email address"
        },
        "active": {
          "type": "boolean",
          "description": "Is this account active, i.e. not deleted or expired?"
        }
      },
      "type": "object"
    },
    "EntityOwner": {
      "properties": {
        "id": {
          "type": "integer",
          "description": "Entity ID"
        },
        "type": {
          "type": "string",
          "description": "Entity type"
        },
        "href": {
          "type": "string",
          "description": "URL to resource"
        },
        "name": {
          "type": "string",
          "description": "Name"
        }
      },
      "type": "object"
    },
    "PosixAccount": {
      "properties": {
        "href": {
          "type": "string",
          "description": "URL to this resource"
        },
        "name": {
          "type": "string",
          "description": "Account name"
        },
        "id": {
          "type": "integer",
          "description": "Entity ID"
        },
        "posix": {
          "type": "boolean",
          "description": "Is this a POSIX account?"
        },
        "posix_uid": {
          "type": "integer",
          "description": "POSIX UID"
        },
        "posix_shell": {
          "type": "string",
          "description": "POSIX shell"
        },
        "default_file_group": {
          "description": "Default file group",
          "allOf": [
            {
              "$ref": "#/definitions/Group"
            }
          ]
        }
      },
      "type": "object"
    },
    "Group": {
      "properties": {
        "href": {
          "type": "string",
          "description": "URL to this resource"
        },
        "id": {
          "type": "integer",
          "description": "group id"
        },
        "name": {
          "type": "string",
          "description": "group name"
        },
        "visibility": {
          "type": "string",
          "description": "group visibility"
        },
        "description": {
          "type": "string",
          "description": "group description"
        },
        "created_at": {
          "type": "string",
          "format": "date-time",
          "description": "creation timestamp"
        },
        "expire_date": {
          "type": "string",
          "format": "date-time",
          "description": "expire date"
        },
        "contexts": {
          "type": "array",
          "description": "Visible in these contexts",
          "items": {
            "type": "string"
          }
        },
        "moderators": {
          "type": "string",
          "description": "URL to the resource containing group moderators"
        },
        "members": {
          "type": "string",
          "description": "URL to the resource containing group members"
        }
      },
      "type": "object"
    },
    "AccountQuarantineList": {
      "properties": {
        "locked": {
          "type": "boolean",
          "description": "Is this account locked?"
        },
        "quarantines": {
          "type": "array",
          "description": "List of quarantines",
          "items": {
            "$ref": "#/definitions/EntityQuarantine"
          }
        }
      },
      "type": "object"
    },
    "EntityQuarantine": {
      "properties": {
        "type": {
          "type": "string",
          "description": "Type of quarantine"
        },
        "comment": {
          "type": "string",
          "description": "Reason of quarantine"
        },
        "start": {
          "type": "string",
          "format": "date-time",
          "description": "Quarantine start date"
        },
        "end": {
          "type": "string",
          "format": "date-time",
          "description": "Quarantine end date"
        },
        "disable_until": {
          "type": "string",
          "format": "date-time",
          "description": "Quarantine disabled until"
        },
        "active": {
          "type": "boolean",
          "description": "Quarantine currently active"
        }
      },
      "type": "object"
    },
    "AccountEmailAddress": {
      "properties": {
        "primary": {
          "type": "string",
          "description": "Primary email address for this account"
        },
        "addresses": {
          "type": "array",
          "description": "All addresses targeting this account",
          "items": {
            "$ref": "#/definitions/EmailAddress"
          }
        }
      },
      "type": "object"
    },
    "EmailAddress": {
      "properties": {
        "value": {
          "type": "string",
          "description": "The email address"
        },
        "type": {
          "type": "string",
          "description": "Email address target type, i.e. 'forward', 'account"
        },
        "target_entity_type": {
          "type": "string",
          "description": "Email address target entity type"
        },
        "target_entity_name": {
          "type": "string",
          "description": "Email address target entity name"
        }
      },
      "type": "object"
    },
    "AccountList": {
      "properties": {
        "accounts": {
          "type": "array",
          "description": "List of accounts",
          "items": {
            "$ref": "#/definitions/AccountListItem"
          }
        }
      },
      "type": "object"
    },
    "AccountListItem": {
      "properties": {
        "href": {
          "type": "string",
          "description": "URL to this resource"
        },
        "name": {
          "type": "string",
          "description": "Account name"
        },
        "id": {
          "type": "integer",
          "description": "Account entity ID"
        },
        "owner": {
          "description": "Account owner",
          "allOf": [
            {
              "$ref": "#/definitions/EntityOwner"
            }
          ]
        },
        "expire_date": {
          "type": "string",
          "format": "date-time",
          "description": "Expiration date"
        },
        "np_type": {
          "type": "string",
          "description": "Non-personal account type (null if personal)"
        }
      },
      "type": "object"
    },
    "GroupListItem": {
      "properties": {
        "href": {
          "type": "string",
          "description": "URL to this resource"
        },
        "id": {
          "type": "integer",
          "description": "group id"
        },
        "name": {
          "type": "string",
          "description": "group name"
        },
        "visibility": {
          "type": "string",
          "description": "group visibility"
        },
        "description": {
          "type": "string",
          "description": "group description"
        },
        "created_at": {
          "type": "string",
          "format": "date-time",
          "description": "creation timestamp"
        },
        "expire_date": {
          "type": "string",
          "format": "date-time",
          "description": "expire date"
        }
      },
      "type": "object"
    },
    "EntityContactInfoList": {
      "properties": {
        "contacts": {
          "type": "array",
          "description": "Contact information",
          "items": {
            "$ref": "#/definitions/EntityContactInfo"
          }
        }
      },
      "type": "object"
    },
    "EntityContactInfo": {
      "properties": {
        "value": {
          "type": "string",
          "description": "Value"
        },
        "alias": {
          "type": "string",
          "description": "Alias"
        },
        "preference": {
          "type": "integer",
          "description": "Preference/priority, 1 = highest"
        },
        "type": {
          "type": "string",
          "description": "Type"
        },
        "entity_id": {
          "type": "integer",
          "description": "Entity ID"
        },
        "description": {
          "type": "string",
          "description": "Description"
        },
        "source_system": {
          "type": "string",
          "description": "Source system"
        },
        "last_modified": {
          "type": "string",
          "format": "date-time",
          "description": "Last modified timestamp"
        }
      },
      "type": "object"
    },
    "AccountAffiliationList": {
      "properties": {
        "affiliations": {
          "type": "array",
          "description": "Account affiliations",
          "items": {
            "$ref": "#/definitions/AccountAffiliation"
          }
        }
      },
      "type": "object"
    },
    "AccountAffiliation": {
      "properties": {
        "affiliation": {
          "type": "string",
          "description": "Affiliation name"
        },
        "priority": {
          "type": "integer",
          "description": "Affiliation priority"
        },
        "ou": {
          "description": "Organizational unit",
          "allOf": [
            {
              "$ref": "#/definitions/OU"
            }
          ]
        }
      },
      "type": "object"
    },
    "OU": {
      "properties": {
        "href": {
          "type": "string",
          "description": "OU resource URL"
        },
        "id": {
          "type": "integer",
          "description": "OU entity ID"
        }
      },
      "type": "object"
    },
    "AccountHomeList": {
      "properties": {
        "homes": {
          "type": "array",
          "description": "Home directories",
          "items": {
            "$ref": "#/definitions/AccountHome"
          }
        }
      },
      "type": "object"
    },
    "AccountHome": {
      "properties": {
        "homedir_id": {
          "type": "integer",
          "description": "Home directory entity ID"
        },
        "home": {
          "type": "string",
          "description": "Home directory path"
        },
        "context": {
          "type": "string",
          "description": "Context"
        },
        "status": {
          "type": "string",
          "description": "Home status"
        },
        "disk_id": {
          "type": "integer",
          "description": "Disk entity ID"
        }
      },
      "type": "object"
    },
    "PasswordChanged": {
      "properties": {
        "password": {
          "type": "string",
          "description": "New password"
        }
      },
      "type": "object"
    },
    "PasswordVerification": {
      "properties": {
        "verified": {
          "type": "boolean",
          "description": "Did the password match?"
        }
      },
      "type": "object"
    },
    "GroupMember": {
      "properties": {
        "href": {
          "type": "string",
          "description": "path to member resource"
        },
        "id": {
          "type": "integer",
          "description": "member id"
        },
        "type": {
          "type": "string",
          "description": "member type"
        },
        "name": {
          "type": "string",
          "description": "member name"
        }
      },
      "type": "object"
    },
    "PosixGroup": {
      "properties": {
        "href": {
          "type": "string",
          "description": "URL to this resource"
        },
        "id": {
          "type": "integer",
          "description": "group id"
        },
        "posix": {
          "type": "boolean",
          "description": "Is this a POSIX group?"
        },
        "posix_gid": {
          "type": "integer",
          "description": "Group POSIX GID"
        }
      },
      "type": "object"
    },
    "Context": {
      "properties": {
        "context": {
          "type": "string",
          "description": "Context name"
        },
        "description": {
          "type": "string",
          "description": "Context description"
        },
        "entity_type": {
          "type": "string",
          "description": ""
        }
      },
      "type": "object"
    },
    "OrganizationalUnit": {
      "properties": {
        "href": {
          "type": "string",
          "description": "URL to this resource"
        },
        "id": {
          "type": "integer",
          "description": "OU entity ID"
        },
        "contact": {
          "type": "array",
          "description": "Contact information",
          "items": {
            "$ref": "#/definitions/EntityContactInfo"
          }
        },
        "names": {
          "type": "array",
          "description": "Names",
          "items": {
            "$ref": "#/definitions/EntityNameWithLanguage"
          }
        },
        "contexts": {
          "type": "array",
          "description": "Visible in these contexts",
          "items": {
            "type": "string"
          }
        },
        "stedkode": {
          "type": "string"
        },
        "fakultet": {
          "type": "integer"
        },
        "institutt": {
          "type": "integer"
        },
        "avdeling": {
          "type": "integer"
        }
      },
      "type": "object"
    },
    "EntityNameWithLanguage": {
      "properties": {
        "variant": {
          "type": "string",
          "description": "Name variant"
        },
        "language": {
          "type": "string",
          "description": "Language"
        },
        "name": {
          "type": "string",
          "description": "Name"
        }
      },
      "type": "object"
    },
    "Person": {
      "properties": {
        "href": {
          "type": "string",
          "description": "URL to this resource"
        },
        "id": {
          "type": "integer",
          "description": "Person entity ID"
        },
        "birth_date": {
          "type": "string",
          "format": "date-time",
          "description": "Birth date"
        },
        "created_at": {
          "type": "string",
          "format": "date-time",
          "description": "Creation timestamp"
        },
        "names": {
          "type": "array",
          "description": "Names",
          "items": {
            "$ref": "#/definitions/PersonName"
          }
        },
        "contexts": {
          "type": "array",
          "description": "Visible in these contexts",
          "items": {
            "type": "string"
          }
        }
      },
      "type": "object"
    },
    "PersonName": {
      "properties": {
        "source_system": {
          "type": "string",
          "description": "Source system"
        },
        "variant": {
          "type": "string",
          "description": "Name variant"
        },
        "name": {
          "type": "string",
          "description": "Name value"
        }
      },
      "type": "object"
    },
    "PersonAffiliationList": {
      "properties": {
        "affiliations": {
          "type": "array",
          "description": "List of person affiliations",
          "items": {
            "$ref": "#/definitions/PersonAffiliation"
          }
        }
      },
      "type": "object"
    },
    "PersonAffiliation": {
      "properties": {
        "affiliation": {
          "type": "string",
          "description": "Affiliation type"
        },
        "status": {
          "type": "string",
          "description": "Affiliation status"
        },
        "ou": {
          "description": "Organizational unit",
          "allOf": [
            {
              "$ref": "#/definitions/OU"
            }
          ]
        },
        "create_date": {
          "type": "string",
          "format": "date-time",
          "description": "Creation date"
        },
        "last_date": {
          "type": "string",
          "format": "date-time",
          "description": "Last seen in source system"
        },
        "deleted_date": {
          "type": "string",
          "format": "date-time",
          "description": "Deletion date"
        },
        "source_system": {
          "type": "string",
          "description": "Source system"
        }
      },
      "type": "object"
    },
    "EntityExternalId": {
      "properties": {
        "external_id": {
          "type": "string",
          "description": "External ID"
        },
        "id_type": {
          "type": "string",
          "description": "External ID type"
        },
        "source_system": {
          "type": "string",
          "description": "Source system"
        }
      },
      "type": "object"
    },
    "PersonAccountList": {
      "properties": {
        "accounts": {
          "type": "array",
          "description": "List of accounts",
          "items": {
            "$ref": "#/definitions/PersonAccount"
          }
        }
      },
      "type": "object"
    },
    "PersonAccount": {
      "properties": {
        "href": {
          "type": "string",
          "description": "URL to this resource"
        },
        "id": {
          "type": "string",
          "description": "Account ID"
        },
        "name": {
          "type": "string",
          "description": "Account name"
        },
        "primary": {
          "type": "boolean",
          "description": "Is this a primary account?"
        }
      },
      "type": "object"
    },
    "EntityConsent": {
      "properties": {
        "name": {
          "type": "string",
          "description": "Consent name"
        },
        "description": {
          "type": "string",
          "description": "Consent description"
        },
        "type": {
          "type": "string",
          "description": "Consent type"
        },
        "set_at": {
          "type": "string",
          "format": "date-time",
          "description": "Consent set at"
        },
        "expires": {
          "type": "string",
          "format": "date-time",
          "description": "Consent expires at"
        }
      },
      "type": "object"
    },
    "PersonAddress": {
      "properties": {
        "source_system": {
          "type": "string",
          "description": "Source system"
        },
        "address_type": {
          "type": "string",
          "description": "Address type"
        },
        "address_text": {
          "type": "string",
          "description": "Address text"
        },
        "p_o_box": {
          "type": "string",
          "description": "Postal box"
        },
        "postal_number": {
          "type": "string",
          "description": "Postal number"
        },
        "city": {
          "type": "string",
          "description": "City"
        },
        "country": {
          "type": "string",
          "description": "Country"
        }
      },
      "type": "object"
    },
    "PersonResult": {
      "properties": {
        "id": {
          "type": "integer"
        },
        "href": {
          "type": "string",
          "description": "URL to this resource"
        }
      },
      "type": "object"
    },
    "ExternalIdItem": {
      "properties": {
        "href": {
          "type": "string",
          "description": "URL to this resource"
        },
        "person_id": {
          "type": "integer",
          "description": "Person ID"
        },
        "source_system": {
          "type": "string",
          "description": "Source system"
        },
        "id_type": {
          "type": "string",
          "description": "External ID type"
        },
        "external_id": {
          "type": "string",
          "description": "External ID value"
        }
      },
      "type": "object"
    },
    "EntityNote": {
      "allOf": [
        {
          "$ref": "#/definitions/EntityNoteRef"
        },
        {
          "properties": {
            "body": {
              "type": "string",
              "description": "Note body",
              "example": "System account for system Foo.\nOnly used for file + file group ownership\nNo interactive use."
            },
            "creator": {
              "$ref": "#/definitions/EntityNoteEntityRef"
            },
            "entity": {
              "$ref": "#/definitions/EntityNoteEntityRef"
            }
          },
          "type": "object"
        }
      ]
    },
    "EntityNoteRef": {
      "properties": {
        "id": {
          "type": "integer",
          "description": "Unique note id",
          "example": 1234
        },
        "href": {
          "type": "string",
          "description": "URL to this resource",
          "example": "/path/to/notes/1234"
        },
        "subject": {
          "type": "string",
          "description": "Note subject line (max 70 chars)",
          "example": "Description/Usage",
          "minLength": 1,
          "maxLength": 70
        },
        "created_at": {
          "type": "string",
          "format": "date-time",
          "description": "Note create datetime",
          "example": "2026-07-02T12:26:03+02:00"
        }
      },
      "type": "object"
    },
    "EntityNoteEntityRef": {
      "properties": {
        "id": {
          "type": "integer",
          "description": "Entity Id",
          "example": 108
        },
        "type": {
          "type": "string",
          "description": "Entity type",
          "example": "account"
        },
        "name": {
          "type": "string",
          "description": "Entity name (if available)",
          "example": "foo-system"
        },
        "href": {
          "type": "string",
          "description": "Url to entity (if available)",
          "example": "/v1/accounts/foo-system"
        }
      },
      "type": "object"
    },
    "EntityNoteRefList": {
      "properties": {
        "filters": {
          "description": "Filters used for this list",
          "allOf": [
            {
              "$ref": "#/definitions/NoteFilters"
            }
          ]
        },
        "items": {
          "type": "array",
          "description": "Matching item references",
          "items": {
            "$ref": "#/definitions/EntityNoteRef"
          }
        }
      },
      "type": "object"
    },
    "NoteFilters": {
      "properties": {
        "creator_id": {
          "type": "integer",
          "example": 108
        },
        "entity_id": {
          "type": "integer",
          "example": 108
        },
        "before": {
          "type": "string",
          "format": "date-time",
          "description": "Note create datetime",
          "example": "2026-07-02T12:26:03+02:00"
        },
        "after": {
          "type": "string",
          "format": "date-time",
          "description": "Note create datetime",
          "example": "2026-07-02T12:26:03+02:00"
        },
        "subject": {
          "type": "string",
          "example": "subj*"
        },
        "body": {
          "type": "string",
          "example": "*body*"
        }
      },
      "type": "object"
    },
    "VoipServiceCreate": {
      "required": [
        "description",
        "ou_id",
        "service_type"
      ],
      "properties": {
        "service_type": {
          "type": "string",
          "description": "Service type code",
          "example": "voip_service_teknisk"
        },
        "description": {
          "type": "string",
          "description": "Service description (must be unique)",
          "example": "Vakttelefon, eksempel"
        },
        "ou_id": {
          "type": "integer",
          "description": "Organizational unit ID",
          "example": 110
        }
      },
      "type": "object"
    },
    "VoipServiceList": {
      "properties": {
        "services": {
          "type": "array",
          "description": "List of voip services",
          "items": {
            "$ref": "#/definitions/VoipService"
          }
        }
      },
      "type": "object"
    },
    "VoipService": {
      "properties": {
        "href": {
          "type": "string",
          "description": "URL to this service",
          "example": "/path/to/voip-services/101"
        },
        "service_id": {
          "type": "integer",
          "description": "Service entity ID",
          "example": 101
        },
        "service_type": {
          "type": "string",
          "description": "Service type",
          "example": "voip_service_teknisk"
        },
        "description": {
          "type": "string",
          "description": "Service description",
          "example": "Vakttelefon, eksempel"
        },
        "ou": {
          "description": "Organizational unit",
          "example": {
            "href": "/path/to/ous/110",
            "id": 110
          },
          "allOf": [
            {
              "$ref": "#/definitions/OU"
            }
          ]
        }
      },
      "type": "object"
    },
    "VoipServiceUpdate": {
      "properties": {
        "service_type": {
          "type": "string",
          "description": "New service type code",
          "example": "voip_service_teknisk"
        },
        "description": {
          "type": "string",
          "description": "New service description",
          "example": "Vakttelefon, eksempel"
        },
        "ou_id": {
          "type": "integer",
          "description": "New organizational unit ID",
          "example": 110
        }
      },
      "type": "object"
    },
    "VoipAddress": {
      "allOf": [
        {
          "$ref": "#/definitions/VoipAddressListItem"
        },
        {
          "properties": {
            "cn": {
              "type": "string",
              "description": "Common name"
            },
            "sip_uri": {
              "type": "array",
              "description": "SIP URI",
              "example": [
                "sip:+68051234@example.org",
                "sip:51234@exmaple.org",
                "sip:username@example.org",
                "sip:first.last@example.org"
              ],
              "items": {
                "type": "string"
              }
            },
            "sip_primary_uri": {
              "type": "string",
              "description": "Primary SIP URI",
              "example": "sip:first.last@example.org"
            },
            "e164_uri": {
              "type": "string",
              "description": "E.164 URI",
              "example": "sip:68051234@example.org"
            },
            "extension_uri": {
              "type": "string",
              "description": "Extension URI",
              "example": "sip:51234@example.org"
            },
            "clients": {
              "type": "array",
              "description": "Associated client IDs",
              "example": [
                103,
                104
              ],
              "items": {
                "type": "integer"
              }
            }
          },
          "type": "object"
        }
      ]
    },
    "VoipAddressListItem": {
      "properties": {
        "href": {
          "type": "string",
          "description": "URL to this address",
          "example": "/path/to/voip-addresses/102"
        },
        "address_id": {
          "type": "integer",
          "description": "Address entity ID",
          "example": 102
        },
        "owner": {
          "description": "Entity owner",
          "example": {
            "id": 112,
            "type": "person",
            "href": "/path/to/persons/112",
            "name": null
          },
          "allOf": [
            {
              "$ref": "#/definitions/EntityOwner"
            }
          ]
        }
      },
      "type": "object"
    },
    "VoipAddressList": {
      "properties": {
        "addresses": {
          "type": "array",
          "description": "List of voip addresses",
          "items": {
            "$ref": "#/definitions/VoipAddressListItem"
          }
        }
      },
      "type": "object"
    },
    "VoipNumber": {
      "properties": {
        "number": {
          "type": "string",
          "description": "VoIP phone number",
          "example": "+4768051234"
        },
        "extension": {
          "type": "string",
          "description": "VoIP phone extension",
          "example": "51234"
        },
        "priority": {
          "type": "integer",
          "description": "Contact priority",
          "example": 1
        }
      },
      "type": "object"
    },
    "VoipNumberList": {
      "properties": {
        "numbers": {
          "type": "array",
          "description": "List of voip numbers",
          "items": {
            "$ref": "#/definitions/VoipNumber"
          }
        }
      },
      "type": "object"
    }
  },
  "responses": {
    "ParseError": {
      "description": "When a mask can't be parsed"
    },
    "MaskError": {
      "description": "When any error occurs on mask"
    }
  }
}
