{"note":"OpenAPI conversion -- returning structured metadata","name":"rudder-example-local","description":"Rudder API","version":"22","base_url":"https://rudder.example.com/rudder/api/latest","endpoints":177,"raw":"@lap v0.3\n# Machine-readable API spec. Each @endpoint block is one API call.\n@api Rudder API\n@base https://rudder.example.com/rudder/api/latest\n@version 22\n@auth ApiKey X-API-Token in header\n@endpoints 177\n@hint download_for_search\n@toc api(1), apiaccounts(7), archives(2), branding(3), campaigns(10), changeRequests(4), compliance(9), cve(9), datasources(7), directives(7), groups(11), info(3), inventories(5), methods(2), nodes(14), openscap(1), parameters(5), plugins(3), rules(10), scaleoutrelay(2), secret(5), securitytags(2), settings(6), status(1), system(13), systemUpdate(5), techniques(13), tenants(4), usermanagement(10), users(1), validatedUsers(2)\n\n@group api\n@endpoint GET /api/changeRequests\n@desc List all change requests\n@returns(200) {result: str, action: str, data: [map]} # Change requests information\n\n@endgroup\n\n@group apiaccounts\n@endpoint GET /apiaccounts\n@desc List all API accounts\n@returns(200) {result: str, action: str, data: map{accounts: [map]}} # Directives information\n\n@endpoint POST /apiaccounts\n@desc Create an API account\n@optional {id: str # An optional ID for that account. It needs to match [a-zA-Z0-9_-]+, name: str # Human readable name of the API account, description: str # One line API account description, status: str(enabled/disabled) # Status of that API account, generateToken: bool # Optionally specify if the token need to be generated (default true), expirationPolicy: str(never/datetime) # Optionally specify the expiration policy of the API account. Default: never, expirationDate: str(rfc3339) # Optional expiration date of the API account, tenants: str # a comma separated list of tenants allowed for that account. See tenant documentation for syntax., authorizationType: str(rw/ro/acl) # Authorization type for that account:  - ro: read-only (GET) access to all APIs - rw: read (GET) and write (other verbs) access to all APIs - acl: access control list based permission for API (need api-authorization plugin), acl: [map{path: str, actions: [str]}] # in case of ACL authorization type, the actual ACL}\n@returns(200) {result: str, id: str(uuid), action: str, data: map{accounts: [map]}} # Information about request\n\n@endpoint GET /apiaccounts/${apiAccountId}\n@desc Get an API account details\n@required {apiAccountId: str(uuid) # Id of the API account}\n@returns(200) {result: str, id: str, action: str, data: map{accounts: [map]}} # API account information\n\n@endpoint DELETE /apiaccounts/${apiAccountId}\n@desc Delete an API account\n@required {apiAccountId: str(uuid) # Id of the API account}\n@returns(200) {result: str, id: str, action: str, data: map{accounts: [map]}} # API account information\n\n@endpoint POST /apiaccounts/${apiAccountId}\n@desc Update an API account details\n@required {apiAccountId: str(uuid) # Id of the API account}\n@optional {name: str # Human readable name of the API account, description: str # One line API account description, status: str(enabled/disabled) # Status of that API account, expirationPolicy: str(never/datetime) # Optionally specify the expiration policy of the API account. Default: never, expirationDate: str(rfc3339) # Optional expiration date of the API account, tenants: str # a comma separated list of tenants allowed for that account. See tenant documentation for syntax., authorizationType: str(rw/ro/acl) # Authorization type for that account:  - ro: read-only (GET) access to all APIs - rw: read (GET) and write (other verbs) access to all APIs - acl: access control list based permission for API (need api-authorization plugin), acl: [map{path: str, actions: [str]}] # in case of ACL authorization type, the actual ACL}\n@returns(200) {result: str, action: str, data: map{accounts: [map]}} # Directives information\n\n@endpoint POST /apiaccounts/${apiAccountId}/regenerate\n@desc Regenerate the token of an API account\n@required {apiAccountId: str(uuid) # Id of the API account}\n@returns(200) {result: str, id: str, action: str, data: map{accounts: [map]}} # API account information\n\n@endpoint GET /apiaccounts/token\n@desc Get API account for the currently identified token\n@returns(200) {result: str, id: str, action: str, data: map{accounts: [map]}} # API account information\n\n@endgroup\n\n@group archives\n@endpoint GET /archives/export\n@desc Get a ZIP archive of the requested items and their dependencies\n@optional {rules: [str] # IDs (optionally with revision, '+' need to be escaped as '%2B') of rules to include.  The special key-word 'all' can be use to mean \"all non-system rules\", directives: [str] # IDs (optionally with revision, '+' need to be escaped as '%2B') of directives to include The special key-word 'all' can be use to mean \"all non-system directives\", techniques: [str] # IDs, ie technique name/technique version (optionally with revision, '+' need to be escaped as '%2B') of techniques to include The special key-word 'all' can be use to mean \"all non-system techniques\", groups: [str] # IDs (optionally with revision, '+' need to be escaped as '%2B') of groups to include The special key-word 'all' can be use to mean \"all non-system groups\", include: [str] # Scope of dependencies to include in archive, where rule as directives and groups dependencies, directives have techniques dependencies, and techniques and groups don't have dependencies. 'none' means no dependencies will be include, 'all' means that the whole tree will,  'directives' and 'groups' means to include them specifically, 'techniques' means to include both directives and techniques.}\n@returns(200) A zip archive with the queried content.\n\n@endpoint POST /archives/import\n@desc Import a ZIP archive of policies into Rudder\n@returns(200) {result: str, action: str, data: map{archiveImported: bool}} # Archive imported\n\n@endgroup\n\n@group branding\n@endpoint GET /branding\n@desc Get branding configuration\n@returns(200) {result: str, action: str, data: map{branding: map{displayBar: bool, displayLabel: bool, labelText: str, barColor: map{red: num, blue: num, green: num, alpha: num}, labelColor: map{red: num, blue: num, green: num, alpha: num}, wideLogo: map{enable: bool}, smallLogo: map{enable: bool}, displayBarLogin: bool, displayMotd: bool, motd: str}}} # Branding configuration\n\n@endpoint POST /branding\n@desc Update web interface customization\n@required {displayBar: bool # Whether header bar is displayed or not, displayLabel: bool # Whether header bar's label is displayed or not, labelText: str # The header bar's label title, barColor: map{red!: num, blue!: num, green!: num, alpha!: num}, labelColor: map{red!: num, blue!: num, green!: num, alpha!: num}, wideLogo: map{enable!: bool}, smallLogo: map{enable!: bool}, displayBarLogin: bool # Whether header bar is displayed in login page or not, displayMotd: bool # Whether the message of the day is displayed in login page or not, motd: str # Message of the day in login page}\n@returns(200) {result: str, action: str, data: map{branding: map{displayBar: bool, displayLabel: bool, labelText: str, barColor: map{red: num, blue: num, green: num, alpha: num}, labelColor: map{red: num, blue: num, green: num, alpha: num}, wideLogo: map{enable: bool}, smallLogo: map{enable: bool}, displayBarLogin: bool, displayMotd: bool, motd: str}}} # Updated\n\n@endpoint POST /branding/reload\n@desc Reload branding file\n@returns(200) {result: str, action: str, data: map{branding: map{displayBar: bool, displayLabel: bool, labelText: str, barColor: map{red: num, blue: num, green: num, alpha: num}, labelColor: map{red: num, blue: num, green: num, alpha: num}, wideLogo: map{enable: bool}, smallLogo: map{enable: bool}, displayBarLogin: bool, displayMotd: bool, motd: str}}} # Branding configuration\n\n@endgroup\n\n@group campaigns\n@endpoint GET /campaigns\n@desc Get all campaigns details\n@optional {campaignType: str(system-update/software-update) # Type of the campaigns we want, status: str(enabled/disabled/archived) # Status of the campaigns we want}\n@returns(200) {result: str, action: str, data: map{campaigns: [map]}} # Campaign details result\n\n@endpoint POST /campaigns\n@desc Save a campaign\n@optional {info: map{id: str(uuid), name: str, description: str, status: any, schedule: any} # common data about campaign, campaignType: str(system-update/software-update) # Type of campaign (with version determine what kind of campaign you handle and the details object), version: int # Version of campaign (with type determine what kind of campaign you handle and the details object), details: any}\n@returns(200) {result: str, action: str, data: map{campaigns: [map]}} # Campaign details result\n\n@endpoint GET /campaigns/events\n@desc Get all campaign events\n@optional {campaignType: str(system-update/software-update) # Type of the campaigns we want, state: str(scheduled/running/finished/skipped) # Status of the campaign events we want, campaignId: str # id of a specific campaign, limit: int # Max number of elements in response, offset: int # Offset of data in response (skip X elements), before: str(date-time), after: str(date-time), order: str(start/startDate/end/endDate), asc: str(asc/desc)}\n@returns(200) {result: str, action: str, data: map{campaignEvents: [map]}} # Campaign event details result\n\n@endpoint GET /campaigns/events/{id}\n@desc Get a campaign event details\n@required {id: str(uuid) # Id of the campaign event}\n@returns(200) {result: str, action: str, data: map{campaignEvents: [map]}} # Campaign details result\n\n@endpoint POST /campaigns/events/{id}\n@desc Update an existing event\n@required {id: str(uuid) # Id of the campaign event}\n@returns(200) {result: str, action: str, data: map{campaignEvents: [map]}} # Campaign event details result\n\n@endpoint DELETE /campaigns/events/{id}\n@desc Delete a campaign event details\n@required {id: str(uuid) # Id of the campaign event}\n@returns(200) {result: str, action: str, data: map{campaignEvents: [map]}} # Campaign event details result\n\n@endpoint GET /campaigns/{id}\n@desc Get a campaign details\n@required {id: str(uuid) # Id of the campaign}\n@returns(200) {result: str, action: str, data: map{campaigns: [map]}} # Campaign details result\n\n@endpoint DELETE /campaigns/{id}\n@desc Delete a campaign\n@required {id: str(uuid) # Id of the campaign}\n@returns(200) {result: str, action: str, data: map{campaigns: [map]}} # Campaign details result\n\n@endpoint GET /campaigns/{id}/events\n@desc Get campaign events for a campaign\n@required {id: str(uuid) # Id of the campaign}\n@optional {campaignType: str(system-update/software-update) # Type of the campaigns we want, state: str(scheduled/running/finished/skipped) # Status of the campaign events we want, limit: int # Max number of elements in response, offset: int # Offset of data in response (skip X elements), before: str(date-time), after: str(date-time), order: str(start/startDate/end/endDate), asc: str(asc/desc)}\n@returns(200) {result: str, action: str, data: map{campaignEvents: [map]}} # Campaign details result\n\n@endpoint POST /campaigns/{id}/schedule\n@desc Schedule a campaign event for a campaign\n@required {id: str(uuid) # Id of the campaign}\n@returns(200) {result: str, action: str, data: map{campaignEvents: [map]}} # Campaign events details result\n\n@endgroup\n\n@group changeRequests\n@endpoint GET /changeRequests/{changeRequestId}\n@desc Get a change request details\n@required {changeRequestId: int}\n@returns(200) {result: str, action: str, data: map{changeRequests: [map]}} # Change requests information\n\n@endpoint DELETE /changeRequests/{changeRequestId}\n@desc Decline a request details\n@required {changeRequestId: int}\n@returns(200) {result: str, action: str, data: map{changeRequests: [map]}} # Change requests information\n\n@endpoint POST /changeRequests/{changeRequestId}\n@desc Update a request details\n@required {changeRequestId: int}\n@optional {name: str # Change request name, description: str # Change request description}\n@returns(200) {result: str, action: str, data: map{changeRequests: [map]}} # Change requests information\n\n@endpoint POST /changeRequests/{changeRequestId}/accept\n@desc Accept a request details\n@required {changeRequestId: int}\n@optional {status: str(pending deployment/deployed) # New status of the change request}\n@returns(200) {result: str, action: str, data: map{changeRequests: [map]}} # Change requests information\n\n@endgroup\n\n@group compliance\n@endpoint GET /compliance\n@desc Global compliance\n@optional {precision: int=2 # Number of digits after comma in compliance percent figures}\n@returns(200) {result: str, action: str, data: map{globalCompliance: map{compliance: num(integer), complianceDetails: map{successAlreadyOK: num(float), noReport: num(float), successNotApplicable: num(float), unexpectedMissingComponent: num(float), error: num(float), unexpectedUnknownComponent: num(float), successRepaired: num(float)}}}} # Success\n\n@endpoint GET /compliance/directives\n@desc Compliance details for all directives\n@returns(200) {result: str, action: str, data: map{directivesCompliance: map{id: str(uuid), name: str, mode: str, compliance: num(float), complianceDetails: map{successAlreadyOK: num(float), noReport: num(float), successNotApplicable: num(float), unexpectedMissingComponent: num(float), error: num(float), unexpectedUnknownComponent: num(float), successRepaired: num(float)}, rules: map{id: str(uuid), name: str, mode: str, compliance: num(float), complianceDetails: map, components: [map]}, nodes: map{id: str(uuid), name: str, compliance: num(float), complianceDetails: map, rules: map}}}} # Success\n\n@endpoint GET /compliance/directives/{directiveId}\n@desc Compliance details by directive\n@required {directiveId: str(uuid) # Id of the directive}\n@optional {format: str(csv/json)=json # format of export}\n@returns(200) Success\n\n@endpoint GET /compliance/groups/{targetOrNodeGroupId}\n@desc Compliance details by group (global)\n@required {targetOrNodeGroupId: any # Id of the node group or rule target}\n@optional {level: int=10 # Number of depth level of compliance objects to display (1:rules, 2:directives, 3:components, 4:nodes, 5:values, 6:reports), precision: int=2 # Number of digits after comma in compliance percent figures}\n@returns(200) {result: str, action: str, data: map{nodeGroups: [map]}} # Success\n\n@endpoint GET /compliance/groups/{targetOrNodeGroupId}/target\n@desc Compliance details by group (targeted)\n@required {targetOrNodeGroupId: any # Id of the node group or rule target}\n@optional {level: int=10 # Number of depth level of compliance objects to display (1:rules, 2:directives, 3:components, 4:nodes, 5:values, 6:reports), precision: int=2 # Number of digits after comma in compliance percent figures}\n@returns(200) {result: str, action: str, data: map{nodeGroups: [map]}} # Success\n\n@endpoint GET /compliance/nodes\n@desc Compliance details for all nodes\n@optional {level: int=10 # Number of depth level of compliance objects to display (1:rules, 2:directives, 3:components, 4:nodes, 5:values, 6:reports), precision: int=2 # Number of digits after comma in compliance percent figures}\n@returns(200) {result: str, action: str, data: map{nodes: [map]}} # Success\n\n@endpoint GET /compliance/nodes/{nodeId}\n@desc Compliance details by node\n@required {nodeId: str(uuid (or \"root\")) # Id of the target node}\n@optional {level: int=10 # Number of depth level of compliance objects to display (1:rules, 2:directives, 3:components, 4:nodes, 5:values, 6:reports), precision: int=2 # Number of digits after comma in compliance percent figures}\n@returns(200) {result: str, action: str, data: map{nodes: [map]}} # Success\n\n@endpoint GET /compliance/rules\n@desc Compliance details for all rules\n@optional {level: int=10 # Number of depth level of compliance objects to display (1:rules, 2:directives, 3:components, 4:nodes, 5:values, 6:reports), precision: int=2 # Number of digits after comma in compliance percent figures}\n@returns(200) {result: str, action: str, data: map{rules: [map]}} # Success\n\n@endpoint GET /compliance/rules/{ruleId}\n@desc Compliance details by rule\n@required {ruleId: str(uuid) # Id of the target rule}\n@optional {level: int=10 # Number of depth level of compliance objects to display (1:rules, 2:directives, 3:components, 4:nodes, 5:values, 6:reports), precision: int=2 # Number of digits after comma in compliance percent figures}\n@returns(200) {result: str, action: str, data: map{rules: [map]}} # Success\n\n@endgroup\n\n@group cve\n@endpoint GET /cve\n@desc Get all CVE details\n@returns(200) {result: str, action: str, data: map{CVEs: [map]}} # CVE details result\n\n@endpoint POST /cve/check\n@desc Trigger a CVE check\n@returns(200) {result: str, action: str, data: map{cveChecks: [map]}} # CVE check result\n\n@endpoint GET /cve/check/config\n@desc Get CVE check config\n@returns(200) {result: str, action: str, data: map{url: str, apiKey: str}} # CVE check config\n\n@endpoint POST /cve/check/config\n@desc Update cve check config\n@optional {url: str # Url used to check CVE, apiKey: str # Token used by to contact the API to check CVE}\n@returns(200) {result: str, action: str, data: map{url: str, apiKey: str}} # new CVE check config\n\n@endpoint GET /cve/check/last\n@desc Get last CVE check result\n@optional {groupId: str # Id of node groups you want to get from last CVE check, nodeId: str # Id of nodes you want to get from last CVE check, cveId: str # Id of CVE you want to get from last CVE check, package: str # Name of packages you want to get from last CVE check, severity: str(critical/high/medium/low/none/unknown) # Severity of the CVE you want to get from last CVE check}\n@returns(200) {result: str, action: str, data: map{CVEChecks: [map]}} # Last CVE check\n\n@endpoint POST /cve/list\n@desc Get a list of CVE details\n@optional {cveIds: [str], onlyScore: bool=false # Only send score of the cve, and not the whole detailed list, minScore: num(A score between 0 and 10 as a float) # Only send CVE with a score higher than the value, maxScore: num(A score between 0 and 10 as a float) # Only send CVE with a score lower than the value, publishedDate: str(date-time) # Only send CVE with a publication date more recent than the value}\n@returns(200) {result: str, action: str, data: map{CVEs: [map]}} # CVE list\n\n@endpoint POST /cve/update\n@desc Update CVE database from remote source\n@optional {url: str # Url used to update CVE, will default to one set in config, years: [str]}\n@returns(200) {result: str, action: str, data: map{CVEs: int}} # updated CVE count\n\n@endpoint POST /cve/update/fs\n@desc Update CVE database from file system\n@returns(200) {result: str, action: str, data: map{CVEs: int}} # updated CVE count\n\n@endpoint GET /cve/{cveId}\n@desc Get a CVE details\n@required {cveId: str(CVE ID) # Id of the CVE}\n@returns(200) {result: str, action: str, data: map{CVEs: [map]}} # CVE details result\n\n@endgroup\n\n@group datasources\n@endpoint GET /datasources\n@desc List all data sources\n@returns(200) {result: str, action: str, data: map{datasources: [map]}} # Data sources information\n\n@endpoint PUT /datasources\n@desc Create a data source\n@optional {id: str # Unique identifier of the data source to create., name: str # The human readable name of the data source to create., description: str # Description of the goal of the data source to create., enabled: bool # Enable or disable data source., updateTimeout: int # Duration in seconds before aborting data source update. The main goal is to prevent never ending requests. If a periodicity if configured, you should set that timeout at a lower value., runParameters: map{onGeneration: bool, onNewNode: bool, schedule: map} # Parameters to configure when the data source is fetched to update node properties., type: map{name: str, parameters: map} # Define and configure data source type.}\n@returns(200) {result: str, action: str, data: map{datasources: [map]}} # Created\n\n@endpoint POST /datasources/reload\n@desc Update properties from data sources\n@returns(200) {result: str, action: str, data: str} # Data source reloaded\n\n@endpoint POST /datasources/reload/{datasourceId}\n@desc Update properties from data sources\n@required {datasourceId: str # Id of the data source}\n@returns(200) {result: str, action: str, data: str} # Data source reloaded\n\n@endpoint GET /datasources/{datasourceId}\n@desc Get data source configuration\n@required {datasourceId: str # Id of the data source}\n@returns(200) {result: str, action: str, data: map{datasources: [map]}} # Data source information\n\n@endpoint POST /datasources/{datasourceId}\n@desc Update a data source configuration\n@required {datasourceId: str # Id of the data source}\n@optional {id: str # Unique identifier of the data source to create., name: str # The human readable name of the data source to create., description: str # Description of the goal of the data source to create., enabled: bool # Enable or disable data source., updateTimeout: int # Duration in seconds before aborting data source update. The main goal is to prevent never ending requests. If a periodicity if configured, you should set that timeout at a lower value., runParameters: map{onGeneration: bool, onNewNode: bool, schedule: map} # Parameters to configure when the data source is fetched to update node properties., type: map{name: str, parameters: map} # Define and configure data source type.}\n@returns(200) {result: str, action: str, data: map{datasources: [map]}} # Data source information\n\n@endpoint DELETE /datasources/{datasourceId}\n@desc Delete a data source\n@required {datasourceId: str # Id of the data source}\n@returns(200) {result: str, action: str, data: map{datasources: [map]}} # Data source information\n\n@endgroup\n\n@group directives\n@endpoint GET /directives\n@desc List all directives\n@returns(200) {result: str, action: str, data: map{directives: [map]}} # Directives information\n\n@endpoint PUT /directives\n@desc Create a directive\n@optional {source: str(uuid) # The id of the directive the clone will be based onto. If this parameter if provided,  the new directive will be a clone of this source. Other value will override values from the source., id: str(uuid) # Directive id, displayName: str # Human readable name of the directive, shortDescription: str # One line directive description, longDescription: str(markdown) # Description of the technique (rendered as markdown), techniqueName: str # Directive id, techniqueVersion: str # Directive id, priority: int # Directive priority. `0` has highest priority., enabled: bool # Is the directive enabled, system: bool # If true it is an internal Rudder directive, tags: [map], parameters: map # Directive parameters (depends on the source technique)}\n@returns(200) {result: str, action: str, data: map{directives: [map]}} # Directives information\n\n@endpoint GET /directives/tree\n@desc Get directive tree\n@optional {includeSystem: bool=false # Should we include system techniques and categories in the tree or not., includeSystem: bool # Should we include system techniques and categories in the tree or not.}\n@returns(200) {result: str, action: str, data: map{directives: [map]}} # Directives tree\n\n@endpoint GET /directives/{directiveId}\n@desc Get directive details\n@required {directiveId: str(uuid) # Id of the directive}\n@returns(200) {result: str, action: str, data: map{directives: [map]}} # Directives information\n\n@endpoint DELETE /directives/{directiveId}\n@desc Delete a directive\n@required {directiveId: str(uuid) # Id of the directive}\n@returns(200) {result: str, action: str, data: map{directives: [map]}} # Directives information\n\n@endpoint POST /directives/{directiveId}\n@desc Update a directive details\n@required {directiveId: str(uuid) # Id of the directive}\n@optional {id: str(uuid) # Directive id, displayName: str # Human readable name of the directive, shortDescription: str # One line directive description, longDescription: str(markdown) # Description of the technique (rendered as markdown), techniqueName: str # Directive id, techniqueVersion: str # Directive id, priority: int # Directive priority. `0` has highest priority., enabled: bool # Is the directive enabled, system: bool # If true it is an internal Rudder directive, policyMode: str(enforce/audit) # Policy mode of the directive, tags: [map], parameters: map # Directive parameters (depends on the source technique)}\n@returns(200) {result: str, action: str, data: map{directives: [map]}} # Directives information\n\n@endpoint POST /directives/{directiveId}/check\n@desc Check that update on a directive is valid\n@required {directiveId: str(uuid) # Id of the directive}\n@optional {id: str(uuid) # Directive id, displayName: str # Human readable name of the directive, shortDescription: str # One line directive description, longDescription: str(markdown) # Description of the technique (rendered as markdown), techniqueName: str # Directive id, techniqueVersion: str # Directive id, priority: int # Directive priority. `0` has highest priority., enabled: bool # Is the directive enabled, system: bool # If true it is an internal Rudder directive, policyMode: str(enforce/audit) # Policy mode of the directive, tags: [map], parameters: map # Directive parameters (depends on the source technique)}\n@returns(200) {result: str, action: str, data: map{directives: [map]}} # Directives information\n\n@endgroup\n\n@group groups\n@endpoint GET /groups\n@desc List all groups\n@returns(200) {result: str, action: str, data: map{groups: [map]}} # Groups information\n\n@endpoint PUT /groups\n@desc Create a group\n@required {category: str(uuid) # Id of the new group's category, displayName: str # Name of the group}\n@optional {source: str(uuid) # The id of the group the clone will be based onto. If this parameter if provided,  the new group will be a clone of this source. Other value will override values from the source., id: str(uuid)={autogenerated} # Group id, only provide it when needed., description: str # Group description, query: map{select: str, composition: str, where: [map]} # The criteria defining the group. If not provided, the group will be empty., dynamic: bool=true # Should the group be dynamically refreshed (if not, it is a static group), enabled: bool=true # Enable or disable the group, properties: [map{name!: str, value!: any}] # Group properties}\n@returns(200) {result: str, action: str, data: map{groups: [map]}} # Group information\n\n@endpoint PUT /groups/categories\n@desc Create a group category\n@required {parent: str(uuid) # The parent category of the groups, name: str # Name of the group category}\n@optional {id: str(uuid)={autogenerated} # Group category id, only provide it when needed., description: str # Group category description}\n@returns(200) {result: str, action: str, data: map{groupCategories: [map]}} # Groups category information\n\n@endpoint GET /groups/categories/{groupCategoryId}\n@desc Get group category details\n@required {groupCategoryId: str(uuid)}\n@returns(200) {result: str, action: str, data: map{groupCategories: [map]}} # Groups category information\n\n@endpoint DELETE /groups/categories/{groupCategoryId}\n@desc Delete group category\n@required {groupCategoryId: str(uuid)}\n@returns(200) {result: str, action: str, data: map{groupCategories: [map]}} # Groups category information\n\n@endpoint POST /groups/categories/{groupCategoryId}\n@desc Update group category details\n@required {groupCategoryId: str(uuid), parent: str(uuid) # The parent category of the groups, name: str # Name of the group category}\n@optional {description: str # Group category description}\n@returns(200) {result: str, action: str, data: map{groupCategories: [map]}} # Groups category information\n\n@endpoint GET /groups/tree\n@desc Get groups tree\n@optional {includeSystem: bool=false # Whether to include system categories and groups in results.}\n@returns(200) {result: str, action: str, data: map{groupCategories: map}} # Groups information\n\n@endpoint GET /groups/{groupId}\n@desc Get group details\n@required {groupId: str(uuid) # Id of the group}\n@returns(200) {result: str, action: str, data: map{groups: [map]}} # Groups information\n\n@endpoint POST /groups/{groupId}\n@desc Update group details\n@required {groupId: str(uuid) # Id of the group}\n@optional {category: str(uuid) # Id of the new group's category, displayName: str # Name of the group, description: str # Group description, query: map{select: str, composition: str, where: [map]} # The criteria defining the group. If not provided, the group will be empty., dynamic: bool=true # Should the group be dynamically refreshed (if not, it is a static group), enabled: bool=true # Enable or disable the group}\n@returns(200) {result: str, action: str, data: map{groups: [map]}} # Groups information\n\n@endpoint DELETE /groups/{groupId}\n@desc Delete a group\n@required {groupId: str(uuid) # Id of the group}\n@returns(200) {result: str, action: str, data: map{groups: [map]}} # Groups information\n\n@endpoint POST /groups/{groupId}/reload\n@desc Reload a group\n@required {groupId: str(uuid) # Id of the group}\n@returns(200) {result: str, action: str, data: map{groups: [map]}} # Groups information\n\n@endgroup\n\n@group info\n@endpoint GET /info\n@desc List all endpoints\n@returns(200) {result: str, action: str, data: map{documentation: str, availableVersions: [map], endpoints: [[map]]}} # API endpoints\n\n@endpoint GET /info/details/{endpointName}\n@desc Get information about one API endpoint\n@required {endpointName: str # Name of the endpoint for which one wants information}\n@returns(200) {result: str, action: str, data: map{documentation: str, endpointName: str, endpoints: [map]}} # API Endpoint information\n\n@endpoint GET /info/{sectionId}\n@desc Get information on endpoint in a section\n@required {sectionId: str # Id of the API section}\n@returns(200) {result: str, action: str, data: map{documentation: str, availableVersions: [map], endpoints: [[map]]}} # Endpoint information\n\n@endgroup\n\n@group inventories\n@endpoint GET /inventories/info\n@desc Get information about inventory processing queue\n@returns(200) {result: str, action: str, data: map{queueMaxSize: int, queueSaturated: bool}} # Inventories information\n\n@endpoint POST /inventories/upload\n@desc Upload an inventory for processing\n@returns(200) {result: str, action: str, data: str} # Inventory uploaded\n\n@endpoint POST /inventories/watcher/restart\n@desc Restart inventory watcher\n@returns(200) {result: str, action: str, data: str} # Started\n\n@endpoint POST /inventories/watcher/start\n@desc Start inventory watcher\n@returns(200) {result: str, action: str, data: str} # Started\n\n@endpoint POST /inventories/watcher/stop\n@desc Stop inventory watcher\n@returns(200) {result: str, action: str, data: str} # Stopped\n\n@endgroup\n\n@group methods\n@endpoint GET /methods\n@desc List methods\n@returns(200) {result: str, action: str, data: map{methods: map{id: str, name: str, version: str, category: str, desc: str, documentation: str, parameters: [map], agents: [str], condition: map{prefix: str, parameter: str}, deprecated: map{info: str, replacedBy: str}}}} # Methods information\n\n@endpoint POST /methods/reload\n@desc Reload methods\n@returns(200) {result: str, action: str, data: map{methods: map{id: str, name: str, version: str, category: str, desc: str, documentation: str, parameters: [map], agents: [str], condition: map{prefix: str, parameter: str}, deprecated: map{info: str, replacedBy: str}}}} # Methods information\n\n@endgroup\n\n@group nodes\n@endpoint GET /nodes\n@desc List managed nodes\n@optional {include: str(comma-separated list)=default # Level of information to include from the node inventory. Some base levels are defined (**minimal**, **default**, **full**). You can add fields you want to a base level by adding them to the list, possible values are keys from json answer. If you don't provide a base level, they will be added to `default` level, so if you only want os details, use `minimal,os` as the value for this parameter. * **minimal** includes: `id`, `hostname` and `status` * **default** includes **minimal** plus `architectureDescription`, `description`, `ipAddresses`, `lastRunDate`, `lastInventoryDate`, `machine`, `os`, `managementTechnology`, `policyServerId`, `properties` (be careful! Only node own properties, if you also need inherited properties, look at the dedicated `/nodes/{id}/inheritedProperties` endpoint), `policyMode `, `ram` and `timezone` * **full** includes: **default** plus `accounts`, `bios`, `controllers`, `environmentVariables`, `fileSystems`, `instanceId`, `managementTechnologyDetails`, `memories`, `networkInterfaces`, `ports`, `processes`, `processors`, `slots`, `software`, `softwareUpdate`, `sound`, `storage`, `videos` and `virtualMachines`, query: any # The criterion you want to find for your nodes. Replaces the `where`, `composition` and `select` parameters in a single parameter., where: any # The criterion you want to find for your nodes, composition: str(and/or)=and # Boolean operator to use between each  `where` criteria., select: str=node # What kind of data we want to include. Here we can get policy servers/relay by setting `nodeAndPolicyServer`. Only used if `where` is defined.}\n@returns(200) {result: str, action: str, data: map{nodes: [map]}} # Nodes\n\n@endpoint PUT /nodes\n@desc Create one or several new nodes\n@returns(200) {result: str, action: str, data: map{created: [str], failed: [str]}} # Creation information\n\n@endpoint POST /nodes/applyPolicy\n@desc Trigger an agent run on all nodes\n@returns(200) {result: str, action: str, data: [map]} # Result\n\n@endpoint GET /nodes/pending\n@desc List pending nodes\n@optional {include: str(comma-separated list)=default # Level of information to include from the node inventory. Some base levels are defined (**minimal**, **default**, **full**). You can add fields you want to a base level by adding them to the list, possible values are keys from json answer. If you don't provide a base level, they will be added to `default` level, so if you only want os details, use `minimal,os` as the value for this parameter. * **minimal** includes: `id`, `hostname` and `status` * **default** includes **minimal** plus `architectureDescription`, `description`, `ipAddresses`, `lastRunDate`, `lastInventoryDate`, `machine`, `os`, `managementTechnology`, `policyServerId`, `properties` (be careful! Only node own properties, if you also need inherited properties, look at the dedicated `/nodes/{id}/inheritedProperties` endpoint), `policyMode `, `ram` and `timezone` * **full** includes: **default** plus `accounts`, `bios`, `controllers`, `environmentVariables`, `fileSystems`, `instanceId`, `managementTechnologyDetails`, `memories`, `networkInterfaces`, `ports`, `processes`, `processors`, `slots`, `software`, `softwareUpdate`, `sound`, `storage`, `videos` and `virtualMachines`, query: any # The criterion you want to find for your nodes. Replaces the `where`, `composition` and `select` parameters in a single parameter., where: any # The criterion you want to find for your nodes, composition: str(and/or)=and # Boolean operator to use between each  `where` criteria., select: str=node # What kind of data we want to include. Here we can get policy servers/relay by setting `nodeAndPolicyServer`. Only used if `where` is defined.}\n@returns(200) {result: str, action: str, data: map{nodes: [map]}} # Nodes\n\n@endpoint POST /nodes/pending\n@desc Update pending nodes status\n@optional {nodeId: [str(uuid)] # List of nodes to change status, status: str(accepted/refused) # New status of the pending node}\n@returns(200) {result: str, action: str, data: map{nodes: [map]}} # Nodes\n\n@endpoint POST /nodes/pending/{nodeId}\n@desc Update pending node status\n@required {nodeId: str(uuid (or \"root\")) # Id of the target node}\n@optional {status: str(accepted/refused) # New status of the pending node}\n@returns(200) {result: str, action: str, data: map{nodes: [map]}} # Nodes\n\n@endpoint GET /nodes/status\n@desc Get nodes acceptation status\n@required {ids: str(comma-separated list)=default # Comma separated list of node Ids}\n@returns(200) {result: str, action: str, data: map{nodes: [map]}} # nodes\n\n@endpoint GET /nodes/{nodeId}\n@desc Get information about a node\n@required {nodeId: str(uuid (or \"root\")) # Id of the target node}\n@optional {include: str(comma-separated list)=default # Level of information to include from the node inventory. Some base levels are defined (**minimal**, **default**, **full**). You can add fields you want to a base level by adding them to the list, possible values are keys from json answer. If you don't provide a base level, they will be added to `default` level, so if you only want os details, use `minimal,os` as the value for this parameter. * **minimal** includes: `id`, `hostname` and `status` * **default** includes **minimal** plus `architectureDescription`, `description`, `ipAddresses`, `lastRunDate`, `lastInventoryDate`, `machine`, `os`, `managementTechnology`, `policyServerId`, `properties` (be careful! Only node own properties, if you also need inherited properties, look at the dedicated `/nodes/{id}/inheritedProperties` endpoint), `policyMode `, `ram` and `timezone` * **full** includes: **default** plus `accounts`, `bios`, `controllers`, `environmentVariables`, `fileSystems`, `instanceId`, `managementTechnologyDetails`, `memories`, `networkInterfaces`, `ports`, `processes`, `processors`, `slots`, `software`, `softwareUpdate`, `sound`, `storage`, `videos` and `virtualMachines`}\n@returns(200) {result: str, action: str, data: map{nodes: [map]}} # Nodes\n\n@endpoint POST /nodes/{nodeId}\n@desc Update node settings and properties\n@required {nodeId: str(uuid (or \"root\")) # Id of the target node}\n@optional {properties: [map{name!: str, value!: any}], policyMode: str(audit/enforce/default) # In which mode the node will apply its configuration policy. Use `default` to use the global mode., state: str(enabled/ignored/empty-policies/initializing/preparing-eol) # The node life cycle state. See [dedicated doc](https://docs.rudder.io/reference/current/usage/advanced_node_management.html#node-lifecycle) for more information., agentKey: map{value!: str(PEM), status: str} # Information about agent key or certificate}\n@returns(200) {result: str, action: str, data: map{nodes: [map]}} # Nodes\n\n@endpoint DELETE /nodes/{nodeId}\n@desc Delete a node\n@required {nodeId: str(uuid (or \"root\")) # Id of the target node}\n@optional {mode: str(move/erase)=move # Deletion mode to use, either move to trash ('move', default) or erase ('erase')}\n@returns(200) {result: str, action: str, data: map{nodes: [map]}} # Nodes\n\n@endpoint POST /nodes/{nodeId}/applyPolicy\n@desc Trigger an agent run\n@required {nodeId: str(uuid (or \"root\")) # Id of the target node}\n@optional {classes: [str] # Parameter to trigger a specific run, like an inventory for instance.}\n@returns(200) Agent output\n\n@endpoint POST /nodes/{nodeId}/fetchData\n@desc Update properties for one node from all data sources\n@required {nodeId: str(uuid (or \"root\")) # Id of the target node}\n@returns(200) {result: str, action: str, data: str} # Data sources reloaded\n\n@endpoint POST /nodes/{nodeId}/fetchData/{datasourceId}\n@desc Update properties for one node from a data source\n@required {nodeId: str(uuid (or \"root\")) # Id of the target node, datasourceId: str # Id of the data source}\n@returns(200) {result: str, action: str, data: str} # Data sources reloaded\n\n@endpoint GET /nodes/{nodeId}/inheritedProperties\n@desc Get inherited node properties for a node\n@required {nodeId: str(uuid (or \"root\")) # Id of the target node}\n@returns(200) {result: str, action: str, data: [map]} # Node\n\n@endgroup\n\n@group openscap\n@endpoint GET /openscap/report/{nodeId}\n@desc Get an OpenSCAP report\n@required {nodeId: str(uuid (or \"root\")) # Id of the target node}\n@returns(200) Promote response\n\n@endgroup\n\n@group parameters\n@endpoint GET /parameters\n@desc List all global properties\n@returns(200) {result: str, action: str, data: map{parameters: [map]}} # Settings\n\n@endpoint PUT /parameters\n@desc Create a new property\n@required {id: str # Name of the parameter}\n@optional {value: any # Value of the parameter, description: str # Description of the parameter, overridable: bool # Is the global parameter overridable by node}\n@returns(200) {id: str, result: str, action: str, data: map{parameters: [map]}} # Settings\n\n@endpoint GET /parameters/{parameterId}\n@desc Get the value of a global property\n@required {parameterId: str # Id of the parameter to manage}\n@returns(200) {id: str, result: str, action: str, data: map{parameters: [map]}} # Settings\n\n@endpoint POST /parameters/{parameterId}\n@desc Update a global property's value\n@required {parameterId: str # Id of the parameter to manage}\n@returns(200) {id: str, result: str, action: str, data: map{parameters: [map]}} # Settings\n\n@endpoint DELETE /parameters/{parameterId}\n@desc Delete a global parameter\n@required {parameterId: str # Id of the parameter to manage}\n@returns(200) {id: str, result: str, action: str, data: map{parameters: [map]}} # Settings\n@errors {500: Non existing global property}\n\n@endgroup\n\n@group plugins\n@endpoint GET /plugins/info\n@desc Information about installed plugins\n@returns(200) {result: str, action: str, data: map{plugins: [map]}} # Settings\n\n@endpoint GET /plugins/settings\n@desc Get plugins repository settings\n@returns(200) {result: str, action: str, data: map{plugins: [map]}} # Settings\n\n@endpoint POST /plugins/settings\n@desc Update plugins settings\n@returns(200) {result: str, action: str, data: map{username: str, password: str, url: str, proxyUser: str, proxyPassword: str, proxyUrl: str}} # Settings\n\n@endgroup\n\n@group rules\n@endpoint GET /rules\n@desc List all rules\n@returns(200) {result: str, action: str, data: map{rules: [map]}} # Rules information\n\n@endpoint PUT /rules\n@desc Create a rule\n@optional {source: str(uuid) # The id of the rule the clone will be based onto. If this parameter if provided, the new rule will be a clone of this source. Other value will override values from the source., id: str(uuid) # Rule id, displayName: str # Rule name, shortDescription: str # One line rule description, longDescription: str # Rule documentation, category: str(uuid) # The parent category id. If provided, the new rule will be in this parent category, directives: [str] # Directives linked to the rule, targets: [map{include!: map, exclude!: map}] # Node and special groups targeted by that rule, enabled: bool # Is the rule enabled, system: bool # If true it is an internal Rudder rule, tags: [map]}\n@returns(200) {result: str, action: str, data: map{rules: [map]}} # Rules information\n\n@endpoint PUT /rules/categories\n@desc Create a rule category\n@required {parent: str(uuid) # The parent category of the rules, name: str # Name of the rule category}\n@optional {id: str(uuid)={autogenerated} # Rule category id, only provide it when needed., description: str # Rules category description}\n@returns(200) {result: str, action: str, data: map{ruleCategories: [map]}} # Rules category information\n\n@endpoint GET /rules/categories/{ruleCategoryId}\n@desc Get rule category details\n@required {ruleCategoryId: str(uuid)}\n@returns(200) {result: str, action: str, data: map{rulesCategories: [map]}} # Rules category information\n\n@endpoint DELETE /rules/categories/{ruleCategoryId}\n@desc Delete group category\n@required {ruleCategoryId: str(uuid)}\n@returns(200) {result: str, action: str, data: map{groupCategories: [map]}} # Groups category information\n\n@endpoint POST /rules/categories/{ruleCategoryId}\n@desc Update rule category details\n@required {ruleCategoryId: str(uuid), parent: str(uuid) # The parent category of the rules, name: str # Name of the rule category}\n@optional {description: str # Rules category description}\n@returns(200) {result: str, action: str, data: map{ruleCategories: [map]}} # Rules category information\n\n@endpoint GET /rules/tree\n@desc Get rules tree\n@returns(200) {result: str, action: str, data: map{ruleCategories: map}} # Rules information\n\n@endpoint GET /rules/{ruleId}\n@desc Get a rule details\n@required {ruleId: str(uuid) # Id of the target rule}\n@returns(200) {result: str, action: str, data: map{rules: [map]}} # Rules information\n\n@endpoint POST /rules/{ruleId}\n@desc Update a rule details\n@required {ruleId: str(uuid) # Id of the target rule}\n@optional {id: str(uuid) # Rule id, displayName: str # Rule name, shortDescription: str # One line rule description, longDescription: str # Rule documentation, category: str(uuid) # The parent category id., directives: [str] # Directives linked to the rule, targets: [map{include!: map, exclude!: map}] # Node and special groups targeted by that rule, enabled: bool # Is the rule enabled, system: bool # If true it is an internal Rudder rule, tags: [map]}\n@returns(200) {result: str, action: str, data: map{rules: [map]}} # Rules information\n\n@endpoint DELETE /rules/{ruleId}\n@desc Delete a rule\n@required {ruleId: str(uuid) # Id of the target rule}\n@returns(200) {result: str, action: str, data: map{rules: [map]}} # Rules information\n\n@endgroup\n\n@group scaleoutrelay\n@endpoint POST /scaleoutrelay/demote/{nodeId}\n@desc Demote a relay to simple node\n@required {nodeId: str(uuid (or \"root\")) # Id of the target node}\n@returns(200) {action: str, result: str, data: str} # Demote to node response\n\n@endpoint POST /scaleoutrelay/promote/{nodeId}\n@desc Promote a node to relay\n@required {nodeId: str(uuid (or \"root\")) # Id of the target node}\n@returns(200) {action: str, result: str, data: str} # Promote response\n\n@endgroup\n\n@group secret\n@endpoint GET /secret\n@desc List all secrets\n@returns(200) {result: str, action: str, data: map{secrets: [map]}} # Secrets information\n\n@endpoint POST /secret\n@desc Update a secret\n@optional {name: str # The name of the secret used as a reference on the value, description: str # The description of the secret to identify it more easily, value: str # The value of the secret it will not be exposed in the interface}\n@returns(200) {result: str, action: str, data: map{secrets: [map]}} # Secrets information\n\n@endpoint PUT /secret\n@desc Create a secret\n@optional {name: str # The name of the secret used as a reference on the value, description: str # The description of the secret to identify it more easily, value: str # The value of the secret it will not be exposed in the interface}\n@returns(200) {result: str, action: str, data: map{secrets: [map]}} # Secrets information\n\n@endpoint GET /secret/{name}\n@desc Get one secret\n@required {name: str # Unique name of the secret}\n@returns(200) {result: str, action: str, data: map{secrets: [map]}} # Secret information\n\n@endpoint DELETE /secret/{name}\n@desc Delete a secret\n@required {name: str # Unique name of the secret}\n@returns(200) {result: str, action: str, data: map{secrets: [map]}} # Secret information\n\n@endgroup\n\n@group securitytags\n@endpoint POST /securitytags/nodes\n@desc Define a tenant on nodes\n@returns(200) {result: str, action: str, data: map{securitytags: [map]}} # The list of nodes on which the tenant was changed (unchanged nodes are not included)\n\n@endpoint DELETE /securitytags/nodes\n@desc Remove tenant value on nodes\n@returns(200) {result: str, action: str, data: map{nodes: [str]}} # The list of tenants\n\n@endgroup\n\n@group settings\n@endpoint GET /settings\n@desc List all settings\n@returns(200) {result: str, action: str, data: map{settings: map{allowed_networks: [map], global_policy_mode: str, global_policy_mode_overridable: bool, run_frequency: int, first_run_hour: int, first_run_minute: int, splay_time: int, modified_file_ttl: int, output_file_ttl: int, require_time_synchronization: bool, relay_server_synchronization_method: str, relay_server_synchronize_policies: bool, relay_server_synchronize_shared_files: bool, rudder_report_protocol_default: str, reporting_mode: str, heartbeat_frequency: int, enable_change_message: bool, mandatory_change_message: bool, change_message_prompt: str, enable_change_request: bool, enable_self_validation: bool, enable_self_deployment: bool, display_recent_changes_graphs: bool, enable_javascript_directives: str, send_metrics: str, node_accept_duplicated_hostname: bool, node_onaccept_default_state: str, node_onaccept_default_policyMode: str, unexpected_unbound_var_values: bool, rudder_compute_changes: bool, rudder_generation_compute_dyngroups: bool, rudder_compute_dyngroups_max_parallelism: str, rudder_generation_max_parallelism: str, rudder_generation_js_timeout: int, rudder_generation_continue_on_error: bool, rudder_generation_delay: str, rudder_generation_policy: str}}} # Settings\n\n@endpoint GET /settings/allowed_networks/{nodeId}\n@desc Get allowed networks for a policy server\n@required {nodeId: str(uuid (or \"root\")) # Policy server ID for which you want to manage allowed networks.}\n@returns(200) {id: str, result: str, action: str, data: map{allowed_network: [str]}} # Allowed networks\n\n@endpoint POST /settings/allowed_networks/{nodeId}\n@desc Set allowed networks for a policy server\n@required {nodeId: str(uuid (or \"root\")) # Policy server ID for which you want to manage allowed networks.}\n@optional {value: [str] # New value of the allowed networks}\n@returns(200) {result: str, action: str, id: str, data: map{settings: [str]}} # Allowed Networks\n\n@endpoint POST /settings/allowed_networks/{nodeId}/diff\n@desc Modify allowed networks for a policy server\n@required {nodeId: str(uuid (or \"root\")) # Policy server ID for which you want to manage allowed networks.}\n@optional {allowed_networks: map{add: [str], delete: [str]}}\n@returns(200) {result: str, action: str, data: map{settings: [str]}} # Allowed Networks\n\n@endpoint GET /settings/{settingId}\n@desc Get the value of a setting\n@required {settingId: str # Id of the setting to set}\n@returns(200) {id: str, result: str, action: str, data: map{settingId: str}} # Settings\n\n@endpoint POST /settings/{settingId}\n@desc Set the value of a setting\n@required {settingId: str # Id of the setting to set}\n@optional {value: str # New value of the setting}\n@returns(200) {id: str, result: str, action: str, data: map{settingId: str}} # Settings\n\n@endgroup\n\n@group status\n@endpoint GET /status\n@desc Check if Rudder is alive\n@returns(200) OK status message\n\n@endgroup\n\n@group system\n@endpoint GET /system/archives/{archiveKind}\n@desc List archives\n@required {archiveKind: str(full/groups/rules/directives/parameters) # Type of archive to make}\n@returns(200) {result: str, action: str, data: map{full: [map]}} # Success\n\n@endpoint POST /system/archives/{archiveKind}\n@desc Create an archive\n@required {archiveKind: str(full/groups/rules/directives/parameters) # Type of archive to make}\n@returns(200) {result: str, action: str, data: map{full: map{commiter: str, gitCommit: str(hash), id: str}}} # Success\n\n@endpoint POST /system/archives/{archiveKind}/restore/{archiveRestoreKind}\n@desc Restore an archive\n@required {archiveKind: str(full/groups/rules/directives/parameters) # Type of archive to make, archiveRestoreKind: str(latestArchive/latestCommit/archive ID)}\n@returns(200) {result: str, action: str, data: map{full: str, groups: str, rules: str, directive: str, parameters: str}} # Success\n\n@endpoint GET /system/archives/{archiveKind}/zip/{commitId}\n@desc Get an archive as a ZIP\n@required {archiveKind: str(full/groups/rules/directives/parameters) # Type of archive to make, commitId: str # commit ID of the archive to get as a ZIP file}\n@returns(200) Success\n\n@endpoint GET /system/healthcheck\n@desc Get healthcheck\n@returns(200) {result: str, action: str, data: [map]} # Healthcheck information\n\n@endpoint GET /system/info\n@desc Get server information\n@returns(200) {result: str, action: str, data: map{rudder: any, system: any, nodes: any, plugins: [map]}} # Service information\n\n@endpoint POST /system/maintenance/purgeSoftware\n@desc Trigger batch for cleaning unreferenced software\n@returns(200) {result: str, action: str, data: [str]} # Purge Software\n\n@endpoint POST /system/regenerate/policies\n@desc Trigger a new policy generation\n@returns(200) {result: str, action: str, data: map{policies: str}} # Success\n\n@endpoint POST /system/reload\n@desc Reload both techniques and dynamic groups\n@returns(200) {result: str, action: str, data: map{groups: str, techniques: str}} # Service reload\n\n@endpoint POST /system/reload/groups\n@desc Reload dynamic groups\n@returns(200) {result: str, action: str, data: map{groups: str}} # Service reload\n\n@endpoint POST /system/reload/techniques\n@desc Reload techniques\n@returns(200) {result: str, action: str, data: map{techniques: str}} # Service reload\n\n@endpoint GET /system/status\n@desc Get server status\n@returns(200) {result: str, action: str, data: map{global: str}} # Service status\n\n@endpoint POST /system/update/policies\n@desc Trigger update of policies\n@returns(200) {result: str, action: str, data: map{policies: str}} # Success\n\n@endgroup\n\n@group systemUpdate\n@endpoint GET /systemUpdate/campaign/{id}/history\n@desc Get a campaign result history\n@required {id: str(uuid) # Id of the campaign}\n@optional {limit: int # Max number of elements in response, offset: int # Offset of data in response (skip X elements), before: str(date-time), after: str(date-time), order: str(start/startDate/end/endDate), asc: str(asc/desc)}\n@returns(200) {result: str, action: str, data: map{campaignHistory: [map]}} # Campaign result history result\n\n@endpoint GET /systemUpdate/events/{id}/report\n@desc Get report of campaign\n@required {id: str(uuid) # Id of the campaign event}\n@returns(200) CSV report for campaign detailed result\n\n@endpoint GET /systemUpdate/events/{id}/result\n@desc Get a campaign event result\n@required {id: str(uuid) # Id of the campaign event}\n@returns(200) {result: str, action: str, id: str(uuid), data: map{eventResult: [map]}} # Campaign result history result\n\n@endpoint GET /systemUpdate/events/{id}/result/{nodeId}\n@desc Get detailed campaign event result for a Node\n@required {id: str(uuid) # Id of the campaign event, nodeId: str(uuid (or \"root\")) # Id of the target node}\n@returns(200) {result: str, action: str, id: str(uuid), data: map{nodeResult: [map]}} # Campaign event result for a node\n\n@endpoint GET /systemUpdate/events/{id}/summaryReport\n@desc Get summary report of campaign\n@required {id: str(uuid) # Id of the campaign event}\n@returns(200) CSV report for campaign result\n\n@endgroup\n\n@group techniques\n@endpoint GET /techniques\n@desc List all techniques\n@returns(200) {result: str, action: str, data: map{techniques: [map]}} # Techniques information\n\n@endpoint PUT /techniques\n@desc Create technique\n@returns(200) {result: str, action: str, data: map{techniques: map{technique: map{id: str, name: str, version: str, category: str, description: str, source: str, parameters: [map], resources: [map], calls: [any]}}}} # Versions information\n\n@endpoint GET /techniques/categories\n@desc List categories\n@returns(200) {result: str, action: str, data: map{techniqueCategories: map{name: str, path: str, id: str, subcategories: [map]}}} # Categories information\n\n@endpoint POST /techniques/reload\n@desc Reload techniques\n@returns(200) {result: str, action: str, data: map{techniques: [map]}} # Techniques information\n\n@endpoint GET /techniques/versions\n@desc List versions\n@returns(200) {result: str, action: str, data: map{techniques: [map]}} # Versions information\n\n@endpoint GET /techniques/{techniqueId}\n@desc Technique metadata by ID\n@required {techniqueId: str # Technique ID}\n@returns(200) {result: str, action: str, data: map{techniques: [map]}} # Techniques information\n\n@endpoint GET /techniques/{techniqueId}/directives\n@desc List all directives based on a technique\n@required {techniqueId: str # Technique ID}\n@returns(200) {result: str, action: str, data: map{directives: [map]}} # Techniques information\n\n@endpoint POST /techniques/{techniqueId}/{techniqueVersion}\n@desc Update technique\n@required {techniqueId: str # Technique ID, techniqueVersion: str # Technique version}\n@returns(200) {result: str, action: str, data: map{techniques: map{technique: map{id: str, name: str, version: str, category: str, description: str, source: str, parameters: [map], resources: [map], calls: [any]}}}} # Versions information\n\n@endpoint DELETE /techniques/{techniqueId}/{techniqueVersion}\n@desc Delete technique\n@required {techniqueId: str # Technique ID, techniqueVersion: str # Technique version}\n@returns(200) {result: str, action: str, data: map{techniques: [map]}} # Deletion information\n\n@endpoint GET /techniques/{techniqueId}/{techniqueVersion}\n@desc Technique metadata by version and ID\n@required {techniqueId: str # Technique ID, techniqueVersion: str # Technique version}\n@returns(200) {result: str, action: str, data: map{techniques: [map]}} # Techniques information\n\n@endpoint GET /techniques/{techniqueId}/{techniqueVersion}/directives\n@desc List all directives based on a version of a technique\n@required {techniqueId: str # Technique ID, techniqueVersion: str # Technique version}\n@returns(200) {result: str, action: str, data: map{directives: [map]}} # Techniques information\n\n@endpoint GET /techniques/{techniqueId}/{techniqueVersion}/resources\n@desc Technique's resources\n@required {techniqueId: str # Technique ID, techniqueVersion: str # Technique version}\n@returns(200) {result: str, action: str, data: map{resources: [map]}} # Resources information\n\n@endpoint GET /techniques/{techniqueId}/{techniqueVersion}/revisions\n@desc Technique's revisions\n@required {techniqueId: str # Technique ID, techniqueVersion: str # Technique version}\n@returns(200) {result: str, action: str, data: map{techniques: [map]}} # Versions information\n\n@endgroup\n\n@group tenants\n@endpoint GET /tenants\n@desc Get the list of all tenants.\n@returns(200) {result: str, action: str, data: map{tenants: [map]}} # The list of tenants with their documentation information\n\n@endpoint POST /tenants\n@desc Add one or more tenants\n@returns(200) {result: str, action: str, data: map{tenants: [map]}} # List of actually added/updated tenants\n\n@endpoint DELETE /tenants\n@desc Delete a list of tenants\n@returns(200) {result: str, action: str, data: map{tenants: [str]}} # The list of tenants actually deleted. Already missing tenants are ignored.\n\n@endpoint GET /tenants/{id}\n@desc Get tenant details\n@required {id: str(string matching ^(\\p{Alnum}[\\p{Alnum}-_]*)$) # Id of the tenant}\n@returns(200) {result: str, action: str, data: map{tenants: [map]}} # Tenant information\n\n@endgroup\n\n@group usermanagement\n@endpoint POST /usermanagement\n@desc Add user\n@required {username: str # A new username, password: str # This password will be hashed for you if the `isPreHashed` is set on false, permissions: [str] # Roles or authorizations, isPreHashed: bool(false/true) # If you want to provide hashed password set this property to `true` otherwise we will hash the plain password and store the hash}\n@optional {name: str, email: str, otherInfo: map}\n@returns(200) {result: str, action: str, data: map{addedUser: map{username: str, password: str, permissions: [str], name: str, email: str, otherInfo: map}}} # Updated\n\n@endpoint POST /usermanagement/coverage/{username}\n@desc Compute the role coverage\n@required {username: str # Username of an user (unique and must not contain whitespace), permissions: [str] # List of roles, authz: [str] # List of authorizations}\n@returns(200) {action: str, result: str, data: map{coverage: map{permissions: [str], custom: [str]}}} # Roles coverage\n\n@endpoint GET /usermanagement/roles\n@desc List all roles\n@returns(200) {result: str, action: str, data: [map]} # Roles information\n\n@endpoint PUT /usermanagement/status/activate/{username}\n@desc Activate user\n@required {username: str # Username of an user (unique and must not contain whitespace)}\n@returns(200) {action: str, id: str, result: str, data: map{status: str}} # User was activated\n@errors {500: User activation was an error}\n\n@endpoint PUT /usermanagement/status/disable/{username}\n@desc Disable user\n@required {username: str # Username of an user (unique and must not contain whitespace)}\n@returns(200) {action: str, id: str, result: str, data: map{status: str}} # User was disabled\n@errors {500: User disabling was an error}\n\n@endpoint POST /usermanagement/update/info/{username}\n@desc Update user information\n@required {username: str # Username of an user (unique and must not contain whitespace)}\n@optional {name: str, email: str, otherInfo: map}\n@returns(200) {result: str, action: str, data: map{updatedUser: map{name: str, email: str, otherInfo: map}}} # Updated\n\n@endpoint POST /usermanagement/update/{username}\n@desc Update user access to Rudder\n@required {username: str # Username of an user (unique and must not contain whitespace), username: str # A new username or an empty string to ignore the update of username., password: str # This password will be hashed for you if the `isPreHashed` is set on false. Empty string means that no update is requested., permissions: [str] # Roles or authorizations, isPreHashed: bool(false/true) # If you want to provide hashed password set this property to `true` otherwise we will hash the plain password and store the hash}\n@returns(200) {result: str, action: str, data: map{updatedUser: map{username: str, password: str, permissions: [str]}}} # Updated\n\n@endpoint GET /usermanagement/users\n@desc List all users\n@returns(200) {result: str, action: str, data: map{roleListOverride: str, authenticationBackends: [str], providerProperties: map, users: [map], digest: str, tenantsEnabled: bool}} # Users information\n\n@endpoint POST /usermanagement/users/reload\n@desc Reload users\n@returns(200) {result: str, action: str, data: map{reload: map{status: str}}} # Reload information\n\n@endpoint DELETE /usermanagement/{username}\n@desc Delete an user\n@required {username: str # Username of an user (unique and must not contain whitespace)}\n@returns(200) {result: str, action: str, data: map{deletedUser: map{username: str}}} # Deleted user\n\n@endgroup\n\n@group users\n@endpoint GET /users\n@desc List user\n@returns(200) {result: str, action: str, data: [map]} # List users\n\n@endgroup\n\n@group validatedUsers\n@endpoint POST /validatedUsers\n@desc Update validated user list\n@required {validatedUsers: [str] # list of user to put in validated list}\n@returns(200) {result: str, action: str, data: map{username: str, isValidated: bool, userExists: bool}} # Updated\n\n@endpoint DELETE /validatedUsers/{username}\n@desc Remove an user from validated user list\n@required {username: str # Username of an user (unique and must not contain whitespace)}\n@returns(200) {result: str, action: str, data: str} # Removed user\n\n@endgroup\n\n@end\n"}