{"files":{"SKILL.md":"---\nname: rudder-api\ndescription: \"Rudder API skill. Use when working with Rudder for api, apiaccounts, archives. Covers 177 endpoints.\"\nversion: 1.0.0\ngenerator: lapsh\n---\n\n# Rudder API\nAPI version: 22\n\n## Auth\nApiKey X-API-Token in header\n\n## Base URL\nhttps://rudder.example.com/rudder/api/latest\n\n## Setup\n1. Set your API key in the appropriate header\n2. GET /api/changeRequests -- list all change requests\n3. POST /apiaccounts -- create first apiaccount\n\n## Endpoints\n177 endpoints across 31 groups. See references/api-spec.lap for full details.\n\n### Api\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /api/changeRequests | List all change requests |\n\n### Apiaccounts\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /apiaccounts | List all API accounts |\n| POST | /apiaccounts | Create an API account |\n| GET | /apiaccounts/${apiAccountId} | Get an API account details |\n| DELETE | /apiaccounts/${apiAccountId} | Delete an API account |\n| POST | /apiaccounts/${apiAccountId} | Update an API account details |\n| POST | /apiaccounts/${apiAccountId}/regenerate | Regenerate the token of an API account |\n| GET | /apiaccounts/token | Get API account for the currently identified token |\n\n### Archives\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /archives/export | Get a ZIP archive of the requested items and their dependencies |\n| POST | /archives/import | Import a ZIP archive of policies into Rudder |\n\n### Branding\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /branding | Get branding configuration |\n| POST | /branding | Update web interface customization |\n| POST | /branding/reload | Reload branding file |\n\n### Campaigns\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /campaigns | Get all campaigns details |\n| POST | /campaigns | Save a campaign |\n| GET | /campaigns/events | Get all campaign events |\n| GET | /campaigns/events/{id} | Get a campaign event details |\n| POST | /campaigns/events/{id} | Update an existing event |\n| DELETE | /campaigns/events/{id} | Delete a campaign event details |\n| GET | /campaigns/{id} | Get a campaign details |\n| DELETE | /campaigns/{id} | Delete a campaign |\n| GET | /campaigns/{id}/events | Get campaign events for a campaign |\n| POST | /campaigns/{id}/schedule | Schedule a campaign event for a campaign |\n\n### ChangeRequests\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /changeRequests/{changeRequestId} | Get a change request details |\n| DELETE | /changeRequests/{changeRequestId} | Decline a request details |\n| POST | /changeRequests/{changeRequestId} | Update a request details |\n| POST | /changeRequests/{changeRequestId}/accept | Accept a request details |\n\n### Compliance\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /compliance | Global compliance |\n| GET | /compliance/directives | Compliance details for all directives |\n| GET | /compliance/directives/{directiveId} | Compliance details by directive |\n| GET | /compliance/groups/{targetOrNodeGroupId} | Compliance details by group (global) |\n| GET | /compliance/groups/{targetOrNodeGroupId}/target | Compliance details by group (targeted) |\n| GET | /compliance/nodes | Compliance details for all nodes |\n| GET | /compliance/nodes/{nodeId} | Compliance details by node |\n| GET | /compliance/rules | Compliance details for all rules |\n| GET | /compliance/rules/{ruleId} | Compliance details by rule |\n\n### Cve\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /cve | Get all CVE details |\n| POST | /cve/check | Trigger a CVE check |\n| GET | /cve/check/config | Get CVE check config |\n| POST | /cve/check/config | Update cve check config |\n| GET | /cve/check/last | Get last CVE check result |\n| POST | /cve/list | Get a list of CVE details |\n| POST | /cve/update | Update CVE database from remote source |\n| POST | /cve/update/fs | Update CVE database from file system |\n| GET | /cve/{cveId} | Get a CVE details |\n\n### Datasources\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /datasources | List all data sources |\n| PUT | /datasources | Create a data source |\n| POST | /datasources/reload | Update properties from data sources |\n| POST | /datasources/reload/{datasourceId} | Update properties from data sources |\n| GET | /datasources/{datasourceId} | Get data source configuration |\n| POST | /datasources/{datasourceId} | Update a data source configuration |\n| DELETE | /datasources/{datasourceId} | Delete a data source |\n\n### Directives\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /directives | List all directives |\n| PUT | /directives | Create a directive |\n| GET | /directives/tree | Get directive tree |\n| GET | /directives/{directiveId} | Get directive details |\n| DELETE | /directives/{directiveId} | Delete a directive |\n| POST | /directives/{directiveId} | Update a directive details |\n| POST | /directives/{directiveId}/check | Check that update on a directive is valid |\n\n### Groups\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /groups | List all groups |\n| PUT | /groups | Create a group |\n| PUT | /groups/categories | Create a group category |\n| GET | /groups/categories/{groupCategoryId} | Get group category details |\n| DELETE | /groups/categories/{groupCategoryId} | Delete group category |\n| POST | /groups/categories/{groupCategoryId} | Update group category details |\n| GET | /groups/tree | Get groups tree |\n| GET | /groups/{groupId} | Get group details |\n| POST | /groups/{groupId} | Update group details |\n| DELETE | /groups/{groupId} | Delete a group |\n| POST | /groups/{groupId}/reload | Reload a group |\n\n### Info\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /info | List all endpoints |\n| GET | /info/details/{endpointName} | Get information about one API endpoint |\n| GET | /info/{sectionId} | Get information on endpoint in a section |\n\n### Inventories\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /inventories/info | Get information about inventory processing queue |\n| POST | /inventories/upload | Upload an inventory for processing |\n| POST | /inventories/watcher/restart | Restart inventory watcher |\n| POST | /inventories/watcher/start | Start inventory watcher |\n| POST | /inventories/watcher/stop | Stop inventory watcher |\n\n### Methods\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /methods | List methods |\n| POST | /methods/reload | Reload methods |\n\n### Nodes\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /nodes | List managed nodes |\n| PUT | /nodes | Create one or several new nodes |\n| POST | /nodes/applyPolicy | Trigger an agent run on all nodes |\n| GET | /nodes/pending | List pending nodes |\n| POST | /nodes/pending | Update pending nodes status |\n| POST | /nodes/pending/{nodeId} | Update pending node status |\n| GET | /nodes/status | Get nodes acceptation status |\n| GET | /nodes/{nodeId} | Get information about a node |\n| POST | /nodes/{nodeId} | Update node settings and properties |\n| DELETE | /nodes/{nodeId} | Delete a node |\n| POST | /nodes/{nodeId}/applyPolicy | Trigger an agent run |\n| POST | /nodes/{nodeId}/fetchData | Update properties for one node from all data sources |\n| POST | /nodes/{nodeId}/fetchData/{datasourceId} | Update properties for one node from a data source |\n| GET | /nodes/{nodeId}/inheritedProperties | Get inherited node properties for a node |\n\n### Openscap\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /openscap/report/{nodeId} | Get an OpenSCAP report |\n\n### Parameters\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /parameters | List all global properties |\n| PUT | /parameters | Create a new property |\n| GET | /parameters/{parameterId} | Get the value of a global property |\n| POST | /parameters/{parameterId} | Update a global property's value |\n| DELETE | /parameters/{parameterId} | Delete a global parameter |\n\n### Plugins\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /plugins/info | Information about installed plugins |\n| GET | /plugins/settings | Get plugins repository settings |\n| POST | /plugins/settings | Update plugins settings |\n\n### Rules\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /rules | List all rules |\n| PUT | /rules | Create a rule |\n| PUT | /rules/categories | Create a rule category |\n| GET | /rules/categories/{ruleCategoryId} | Get rule category details |\n| DELETE | /rules/categories/{ruleCategoryId} | Delete group category |\n| POST | /rules/categories/{ruleCategoryId} | Update rule category details |\n| GET | /rules/tree | Get rules tree |\n| GET | /rules/{ruleId} | Get a rule details |\n| POST | /rules/{ruleId} | Update a rule details |\n| DELETE | /rules/{ruleId} | Delete a rule |\n\n### Scaleoutrelay\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /scaleoutrelay/demote/{nodeId} | Demote a relay to simple node |\n| POST | /scaleoutrelay/promote/{nodeId} | Promote a node to relay |\n\n### Secret\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /secret | List all secrets |\n| POST | /secret | Update a secret |\n| PUT | /secret | Create a secret |\n| GET | /secret/{name} | Get one secret |\n| DELETE | /secret/{name} | Delete a secret |\n\n### Securitytags\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /securitytags/nodes | Define a tenant on nodes |\n| DELETE | /securitytags/nodes | Remove tenant value on nodes |\n\n### Settings\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /settings | List all settings |\n| GET | /settings/allowed_networks/{nodeId} | Get allowed networks for a policy server |\n| POST | /settings/allowed_networks/{nodeId} | Set allowed networks for a policy server |\n| POST | /settings/allowed_networks/{nodeId}/diff | Modify allowed networks for a policy server |\n| GET | /settings/{settingId} | Get the value of a setting |\n| POST | /settings/{settingId} | Set the value of a setting |\n\n### Status\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /status | Check if Rudder is alive |\n\n### System\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /system/archives/{archiveKind} | List archives |\n| POST | /system/archives/{archiveKind} | Create an archive |\n| POST | /system/archives/{archiveKind}/restore/{archiveRestoreKind} | Restore an archive |\n| GET | /system/archives/{archiveKind}/zip/{commitId} | Get an archive as a ZIP |\n| GET | /system/healthcheck | Get healthcheck |\n| GET | /system/info | Get server information |\n| POST | /system/maintenance/purgeSoftware | Trigger batch for cleaning unreferenced software |\n| POST | /system/regenerate/policies | Trigger a new policy generation |\n| POST | /system/reload | Reload both techniques and dynamic groups |\n| POST | /system/reload/groups | Reload dynamic groups |\n| POST | /system/reload/techniques | Reload techniques |\n| GET | /system/status | Get server status |\n| POST | /system/update/policies | Trigger update of policies |\n\n### SystemUpdate\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /systemUpdate/campaign/{id}/history | Get a campaign result history |\n| GET | /systemUpdate/events/{id}/report | Get report of campaign |\n| GET | /systemUpdate/events/{id}/result | Get a campaign event result |\n| GET | /systemUpdate/events/{id}/result/{nodeId} | Get detailed campaign event result for a Node |\n| GET | /systemUpdate/events/{id}/summaryReport | Get summary report of campaign |\n\n### Techniques\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /techniques | List all techniques |\n| PUT | /techniques | Create technique |\n| GET | /techniques/categories | List categories |\n| POST | /techniques/reload | Reload techniques |\n| GET | /techniques/versions | List versions |\n| GET | /techniques/{techniqueId} | Technique metadata by ID |\n| GET | /techniques/{techniqueId}/directives | List all directives based on a technique |\n| POST | /techniques/{techniqueId}/{techniqueVersion} | Update technique |\n| DELETE | /techniques/{techniqueId}/{techniqueVersion} | Delete technique |\n| GET | /techniques/{techniqueId}/{techniqueVersion} | Technique metadata by version and ID |\n| GET | /techniques/{techniqueId}/{techniqueVersion}/directives | List all directives based on a version of a technique |\n| GET | /techniques/{techniqueId}/{techniqueVersion}/resources | Technique's resources |\n| GET | /techniques/{techniqueId}/{techniqueVersion}/revisions | Technique's revisions |\n\n### Tenants\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /tenants | Get the list of all tenants. |\n| POST | /tenants | Add one or more tenants |\n| DELETE | /tenants | Delete a list of tenants |\n| GET | /tenants/{id} | Get tenant details |\n\n### Usermanagement\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /usermanagement | Add user |\n| POST | /usermanagement/coverage/{username} | Compute the role coverage |\n| GET | /usermanagement/roles | List all roles |\n| PUT | /usermanagement/status/activate/{username} | Activate user |\n| PUT | /usermanagement/status/disable/{username} | Disable user |\n| POST | /usermanagement/update/info/{username} | Update user information |\n| POST | /usermanagement/update/{username} | Update user access to Rudder |\n| GET | /usermanagement/users | List all users |\n| POST | /usermanagement/users/reload | Reload users |\n| DELETE | /usermanagement/{username} | Delete an user |\n\n### Users\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /users | List user |\n\n### ValidatedUsers\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /validatedUsers | Update validated user list |\n| DELETE | /validatedUsers/{username} | Remove an user from validated user list |\n\n## Common Questions\nMatch user requests to endpoints in references/api-spec.lap. Key patterns:\n- \"List all changeRequests?\" -> GET /api/changeRequests\n- \"List all apiaccounts?\" -> GET /apiaccounts\n- \"Create a apiaccount?\" -> POST /apiaccounts\n- \"Get ${apiAccountId} details?\" -> GET /apiaccounts/${apiAccountId}\n- \"Delete a ${apiAccountId}?\" -> DELETE /apiaccounts/${apiAccountId}\n- \"Create a regenerate?\" -> POST /apiaccounts/${apiAccountId}/regenerate\n- \"List all token?\" -> GET /apiaccounts/token\n- \"List all export?\" -> GET /archives/export\n- \"Create a import?\" -> POST /archives/import\n- \"List all branding?\" -> GET /branding\n- \"Create a branding?\" -> POST /branding\n- \"Create a reload?\" -> POST /branding/reload\n- \"List all campaigns?\" -> GET /campaigns\n- \"Create a campaign?\" -> POST /campaigns\n- \"List all events?\" -> GET /campaigns/events\n- \"Get event details?\" -> GET /campaigns/events/{id}\n- \"Delete a event?\" -> DELETE /campaigns/events/{id}\n- \"Get campaign details?\" -> GET /campaigns/{id}\n- \"Delete a campaign?\" -> DELETE /campaigns/{id}\n- \"Create a schedule?\" -> POST /campaigns/{id}/schedule\n- \"Get changeRequest details?\" -> GET /changeRequests/{changeRequestId}\n- \"Delete a changeRequest?\" -> DELETE /changeRequests/{changeRequestId}\n- \"Create a accept?\" -> POST /changeRequests/{changeRequestId}/accept\n- \"List all compliance?\" -> GET /compliance\n- \"List all directives?\" -> GET /compliance/directives\n- \"Get directive details?\" -> GET /compliance/directives/{directiveId}\n- \"Get group details?\" -> GET /compliance/groups/{targetOrNodeGroupId}\n- \"List all target?\" -> GET /compliance/groups/{targetOrNodeGroupId}/target\n- \"List all nodes?\" -> GET /compliance/nodes\n- \"Get node details?\" -> GET /compliance/nodes/{nodeId}\n- \"List all rules?\" -> GET /compliance/rules\n- \"Get rule details?\" -> GET /compliance/rules/{ruleId}\n- \"List all cve?\" -> GET /cve\n- \"Create a check?\" -> POST /cve/check\n- \"List all config?\" -> GET /cve/check/config\n- \"Create a config?\" -> POST /cve/check/config\n- \"List all last?\" -> GET /cve/check/last\n- \"Create a list?\" -> POST /cve/list\n- \"Create a update?\" -> POST /cve/update\n- \"Create a f?\" -> POST /cve/update/fs\n- \"Get cve details?\" -> GET /cve/{cveId}\n- \"List all datasources?\" -> GET /datasources\n- \"Get datasource details?\" -> GET /datasources/{datasourceId}\n- \"Delete a datasource?\" -> DELETE /datasources/{datasourceId}\n- \"List all tree?\" -> GET /directives/tree\n- \"Delete a directive?\" -> DELETE /directives/{directiveId}\n- \"List all groups?\" -> GET /groups\n- \"Get category details?\" -> GET /groups/categories/{groupCategoryId}\n- \"Delete a category?\" -> DELETE /groups/categories/{groupCategoryId}\n- \"Delete a group?\" -> DELETE /groups/{groupId}\n- \"List all info?\" -> GET /info\n- \"Get detail details?\" -> GET /info/details/{endpointName}\n- \"Get info details?\" -> GET /info/{sectionId}\n- \"Create a upload?\" -> POST /inventories/upload\n- \"Create a restart?\" -> POST /inventories/watcher/restart\n- \"Create a start?\" -> POST /inventories/watcher/start\n- \"Create a stop?\" -> POST /inventories/watcher/stop\n- \"List all methods?\" -> GET /methods\n- \"Search nodes?\" -> GET /nodes\n- \"Create a applyPolicy?\" -> POST /nodes/applyPolicy\n- \"Search pending?\" -> GET /nodes/pending\n- \"Create a pending?\" -> POST /nodes/pending\n- \"List all status?\" -> GET /nodes/status\n- \"Delete a node?\" -> DELETE /nodes/{nodeId}\n- \"Create a fetchData?\" -> POST /nodes/{nodeId}/fetchData\n- \"List all inheritedProperties?\" -> GET /nodes/{nodeId}/inheritedProperties\n- \"Get report details?\" -> GET /openscap/report/{nodeId}\n- \"List all parameters?\" -> GET /parameters\n- \"Get parameter details?\" -> GET /parameters/{parameterId}\n- \"Delete a parameter?\" -> DELETE /parameters/{parameterId}\n- \"List all settings?\" -> GET /plugins/settings\n- \"Create a setting?\" -> POST /plugins/settings\n- \"Delete a rule?\" -> DELETE /rules/{ruleId}\n- \"List all secret?\" -> GET /secret\n- \"Create a secret?\" -> POST /secret\n- \"Get secret details?\" -> GET /secret/{name}\n- \"Delete a secret?\" -> DELETE /secret/{name}\n- \"Create a node?\" -> POST /securitytags/nodes\n- \"Get allowed_network details?\" -> GET /settings/allowed_networks/{nodeId}\n- \"Create a diff?\" -> POST /settings/allowed_networks/{nodeId}/diff\n- \"Get setting details?\" -> GET /settings/{settingId}\n- \"Get archive details?\" -> GET /system/archives/{archiveKind}\n- \"Get zip details?\" -> GET /system/archives/{archiveKind}/zip/{commitId}\n- \"List all healthcheck?\" -> GET /system/healthcheck\n- \"Create a purgeSoftware?\" -> POST /system/maintenance/purgeSoftware\n- \"Create a policy?\" -> POST /system/regenerate/policies\n- \"Create a group?\" -> POST /system/reload/groups\n- \"Create a technique?\" -> POST /system/reload/techniques\n- \"List all history?\" -> GET /systemUpdate/campaign/{id}/history\n- \"List all report?\" -> GET /systemUpdate/events/{id}/report\n- \"List all result?\" -> GET /systemUpdate/events/{id}/result\n- \"Get result details?\" -> GET /systemUpdate/events/{id}/result/{nodeId}\n- \"List all summaryReport?\" -> GET /systemUpdate/events/{id}/summaryReport\n- \"List all techniques?\" -> GET /techniques\n- \"List all categories?\" -> GET /techniques/categories\n- \"List all versions?\" -> GET /techniques/versions\n- \"Get technique details?\" -> GET /techniques/{techniqueId}\n- \"Delete a technique?\" -> DELETE /techniques/{techniqueId}/{techniqueVersion}\n- \"List all resources?\" -> GET /techniques/{techniqueId}/{techniqueVersion}/resources\n- \"List all revisions?\" -> GET /techniques/{techniqueId}/{techniqueVersion}/revisions\n- \"List all tenants?\" -> GET /tenants\n- \"Create a tenant?\" -> POST /tenants\n- \"Get tenant details?\" -> GET /tenants/{id}\n- \"Create a usermanagement?\" -> POST /usermanagement\n- \"List all roles?\" -> GET /usermanagement/roles\n- \"Update a activate?\" -> PUT /usermanagement/status/activate/{username}\n- \"Update a disable?\" -> PUT /usermanagement/status/disable/{username}\n- \"List all users?\" -> GET /usermanagement/users\n- \"Delete a usermanagement?\" -> DELETE /usermanagement/{username}\n- \"Create a validatedUser?\" -> POST /validatedUsers\n- \"Delete a validatedUser?\" -> DELETE /validatedUsers/{username}\n- \"How to authenticate?\" -> See Auth section above\n\n## Response Tips\n- Check response schemas in references/api-spec.lap for field details\n- Paginated endpoints accept limit/offset or cursor parameters\n- Create/update endpoints return the modified resource on success\n- Error responses include status codes and descriptions in the spec\n\n## References\n- Full spec: See references/api-spec.lap for complete endpoint details, parameter tables, and response schemas\n\n> Generated from the official API spec by [LAP](https://lap.sh)\n","references/api-spec.lap":"@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"}}