[Development Guides Home](/guides) >> [Guide to Standardized Hooks](/guides/guide-to-standardized-hooks) >> [Hookable Events](/guides/guide-to-standardized-hooks/guide-to-standardized-hooks-hookable-events)

# Guide to Standardized Hooks - Whostmgr Functions

The `Whostmgr` category's events occur during WHM functions.

## Accounts Hooks

These hooks affect account creation, deletion, shell access and more:

### Accounts::change_package

This event triggers whenever a hosting plan (package) or an account's use of it changes.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Available.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action code runs before the change.
* `post` — Hook actions code runs after the change.


#### pre returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `cur_pkg` | *string* | The hosting plan's (package's) current name. | A valid hosting plan name. | `oldpackagename` |
| `new_pkg` | *string* | The new hosting plan's (package's) name. | A valid hosting plan name. | `newpackagename` |
| `user` | *string* | The user for whom the package will change. | A valid username on the server. | `username` |


#### post returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `cur_pkg` | *string* | The hosting plan's (package's) current name. | A valid hosting plan name. | `oldpackagename` |
| `new_pkg` | *string* | The new hosting plan's (package's) name. | A valid hosting plan name. | `newpackagename` |
| `user` | *string* | The user for whom the package changed. | A valid username on the server. | `username` |


### Accounts::Create

This event triggers whenever the system creates an account.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Available.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action code runs before the system creates the account.
* `post` — Hook actions code runs after the system creates the account.


#### Returns

This event returns the WHM API 1 [`createacct`](/openapi/whm/operation/createacct) function's returns.

### Accounts::Modify

This event triggers whenever the system modifies an account.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Available.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action code runs before the change.
* `post` — Hook actions code runs after the change.


#### Returns

This event returns the WHM API 1 [`modifyacct`](/openapi/whm/operation/modifyacct) function's returns.

### Accounts::Rearrangeacct

This event triggers whenever the system performs an account rearrangement, whether through a transfer or the WHM interface.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Available.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action code runs before the change.
* `post` — Hook actions code runs after the change.


#### Returns

The `pre` and `post` stages do not produce output.

### Accounts::Remove

This event triggers whenever the system deletes an account.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Available.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action code runs before the system deletes the account.
* `post` — Hook actions code runs after the system deletes the account.


#### Returns

This event returns the WHM API 1 [`removeacct`](/openapi/whm/operation/removeacct) function's returns.

### AccountEnhancements::Assign

This event triggers whenever the system assigns a cPanel account's [Account Enhancements](https://go.cpanel.net/account-enhancements).

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Available.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action code runs before the system assigns the Account Enhancements.
* `post` — Hook actions code runs after the system assigns the Account Enhancements.


#### Returns

#### pre returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `id` | *string* | The Account Enhancement's human-readable ID. | An Account Enhancement ID. | `my-enhancement-example` |
| `name` | *string* | The Account Enhancement's name. | A valid string. | `My Enhancement Example` |


#### post returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `id` | *string* | The Account Enhancement's human-readable ID. | An Account Enhancement ID. | `my-enhancement-example` |
| `name` | *string* | The Account Enhancement's name. | A valid string. | `My Enhancement Example` |


### AccountEnhancements::Unassign

This event triggers whenever the system unassigns a cPanel account's [Account Enhancements](https://go.cpanel.net/account-enhancements).

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Available.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action code runs before the system unassigns the Account Enhancements.
* `post` — Hook actions code runs after the system unassigns the Account Enhancements.


#### Returns

#### pre returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `id` | *string* | The Account Enhancement's human-readable ID. | An Account Enhancement ID. | `my-enhancement-example` |
| `name` | *string* | The Account Enhancement's name. | A valid string. | `My Enhancement Example` |


#### post returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `id` | *string* | The Account Enhancement's human-readable ID. | The Account Enhancement's human-readable ID. | `my-enhancement-example` |
| `name` | *string* | The Account Enhancement's name. | A valid string. | `My Enhancement Example` |


### Accounts::set_shell

This event triggers whenever the system modifies an account's shell.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Available.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action code runs before the system modifies the shell.
* `post` — Hook actions code runs after the system modifies the shell.


#### Returns

#### pre returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `new_shell` | *string* | The new shell setting. | `noshell`  `nologin`  `false`   `shutdown`   `sync` | `noshell` |
| `current_shell` | *string* | The current shell setting. | `noshell`  `nologin`  `false`  `shutdown`  `sync` | `nologin` |
| `user` | *string* | The account for which shell settings will change. | A valid username on the server. | `username` |


#### post returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `new_shell` | *string* | The new shell setting. | `noshell`  `nologin`  `false`   `shutdown`   `sync` | `noshell` |
| `current_shell` | *string* | The previous shell setting. | `noshell`  `nologin`  `false`  `shutdown`  `sync` | `nologin` |
| `user` | *string* | The account for which shell settings changed. | A valid username on the server. | `username` |
| `rawout` | *string* | Additonal raw output from the event. | A string value. | `raw output` |


### Accounts::SiteIP::set

This event triggers whenever the system changes a user's IP address.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Available.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action code runs before the system changes the IP address.
* `post` — Hook actions code runs after the system changes the IP address.


#### pre returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `user` | *string* | The account's username. | A valid username that exists on the system. | `example` |
| `oldip` | *string* | The old IP address. | A valid IP address on the system. | `192.0.2.0` |
| `newip` | *string* | The new IP address. | A valid IP address on the system. | `192.0.2.1` |


#### post returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `user` | *string* | The account's username. | A valid username that exists on the system. | `example` |
| `oldip` | *string* | The old IP address. | A valid IP address on the system. | `192.0.2.0` |
| `newip` | *string* | The new IP address. | A valid IP address on the system. | `192.0.2.1` |


### Accounts::suspendacct

This event triggers whenever the system suspends an account.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Available.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action code runs before the system suspends the account.
* `post` — Hook actions code runs after the system suspends the account.


#### pre returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `user` | *string* | The account to suspend. | A valid username on the server. | `username` |
| `reason` | *string* | The reason for suspension, if one exists. | A string value. | `Nonpayment` |
| `disallowun` | *Boolean* | Whether resellers can unsuspend the account. | `1` — Resellers **cannot** unsuspend the account. `0` — Resellers **can** unsuspend the account. | `1` |


#### post returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `user` | *string* | The suspended account. | A valid username on the server. | `username` |
| `reason` | *string* | The reason for suspension, if one exists. | A string value. | `Nonpayment` |
| `disallowun` | *Boolean* | Whether resellers can unsuspend the account. | `1` — Resellers **cannot** unsuspend the account. `0` — Resellers **can** unsuspend the account. | `1` |
| `rawout` | *string* | The event's raw output. | A string value. | `raw output` |


### Accounts::unsuspendacct

This event triggers whenever the system unsuspends an account.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Available.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action code runs before the system unsuspends the account.
* `post` — Hook actions code runs after the system unsuspends the account.


#### pre returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `user` | *string* | The account to unsuspend. | A valid username on the server. | `username` |


#### post returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `user` | *string* | The unsuspended account. | A valid username on the server. | `username` |
| `rawout` | *string* | The event's raw output. | A string value. | `raw output` |


## AutoSSL Hook

This hook affects the AutoSSL service:

### AutoSSL::installssl

This event triggers when the AutoSSL service installs or changes an SSL certificate. This hook does **not** listen for uninstallation events.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Available.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action allows for pre-installation validation and actions.
* `post` — Hook action allows for post-installation validation and actions.


#### pre returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `domain_set_name` | *string* | **Required**  The domain name. | A valid domain name. | `example.com` |
| `username` | *string* | **Required**  The user who owns the given `domain_set_name`. | A valid string. | `example` |
| `certificate_pem` | *string* | **Required**  The certificate in PEM format. | A valid SSL certificate in PEM format. | `-----BEGIN CERTIFICATE-----\r\n`  `MIIEEzCCAvugAwIBAgIJALF/jFpw6p1bMA0GCSqG...`  `-----END CERTIFICATE-----` |
| `key_pem` | *string* | **Required**  The certificate's key in PEM format. | A valid private key in PEM format. | `-----BEGIN RSA PRIVATE KEY-----`  `MIIEpAIBAAKCAQEA4AVM6J4Qg3DIFWr/eJ5GRm...`  `-----END RSA PRIVATE KEY-----` |
| `cab_pem` | *string* | The certificate's CA bundle in PEM format.  If you do not use this parameter, the system will automatically determine the appropriate CA bundle file to use. | A valid CA bundle in PEM format. | `-----BEGIN CERTIFICATE-----\r\n`  `MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEB...`  `-----END CERTIFICATE-----` |


#### post returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `rawout` | *string* | The function's raw output. | A valid string in HTML format. | `The Certificate for the domain example.com was installed on the IP 192.168.0.20.` |
| `status` | *Boolean* | Whether the function was successful. | `1` — Success.  `0` — Failure. | `1` |


## Domain Hook

These hooks affect a user's domains:

### Domain::addsubdomain

This event triggers whenever a user creates a subdomain.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Available.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action code runs before the change.
* `post` — Hook actions code runs after the change.


#### pre returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `user` | *string* | The user who creates the subdomain. | A valid username. | `username` |
| `subdomain` | *string* | The subdomain the user creates. | A valid subdomain name. | `subdomain.example.com` |
| `rootdomain` | *string* | The root domain of the new subdomain. | A valid domain name. | `example.com` |


#### post returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `user` | *string* | The user who creates the subdomain. | A valid username. | `username` |
| `subdomain` | *string* | The subdomain the user creates. | A valid subdomain name. | `subdomain.example.com` |
| `rootdomain` | *string* | The root domain of the new subdomain. | A valid domain name. | `example.com` |


### Domain::delsubdomain

This event triggers whenever a user deletes a subdomain.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Available.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action code runs before the change.
* `post` — Hook actions code runs after the change.


#### pre returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `user` | *string* | The user who is deleting the subdomain. | A valid username. | `username` |
| `subdomain` | *string* | The subdomain the user is deleting. | A valid subdomain name. | `subdomain.example.com` |
| `rootdomain` | *string* | The root domain of the subdomain to be deleted. | A valid domain name. | `example.com` |


#### post returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `user` | *string* | The user who is deleting the subdomain. | A valid username. | `username` |
| `subdomain` | *string* | The subdomain the user is deleting. | A valid subdomain name. | `subdomain.example.com` |
| `rootdomain` | *string* | The root domain of the subdomain to be deleted. | A valid domain name. | `example.com` |


### Domain::park

This event triggers whenever a user creates a domain alias (parks a domain).

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Available.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action code runs before the change.
* `post` — Hook actions code runs after the change.


#### pre returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `target_domain` | *string* | The domain name for which to create an alias. | A valid domain name. | `example.com` |
| `new_domain` | *string* | The domain name to which the alias will point. | A valid domain name. | `park.example.com` |
| `user` | *string* | The user who will create the alias. | A valid username on the server. | `username` |


#### post returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `target_domain` | *string* | The domain name for which you created an alias. | A valid domain name. | `example.com` |
| `new_domain` | *string* | The domain name to which the alias points. | A valid domain name. | `park.example.com` |
| `user` | *string* | The user who created the alias. | A valid username on the server. | `username` |


## Lang Hooks

These hooks affect the `php.ini` file:

### Lang::PHP::ini_set_content

This event triggers when an administrator uploads a new complete `php.ini` file. When you hook this event, you **must** also hook UAPI's [`LangPHP::php_ini_set_user_content`](/openapi/cpanel/operation/php_ini_set_user_content) function to ensure consistent behavior.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Unavailable.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action code runs before the change.
* `post` — Hook actions code runs after the change.


#### Returns

This event returns the WHM API 1 [`php_ini_set_content`](/openapi/whm/operation/php_ini_set_content) function's returns.

### Lang::PHP::ini_set_directives

This event triggers when an administrator changes the directives in the `php.ini` file. When you hook this event, you **must** also hook UAPI's [`LangPHP::php_ini_set_user_basic_directives`](/openapi/cpanel/operation/php_ini_set_user_basic_directives) function to ensure consistent behavior.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Unavailable.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action code runs before the system changes the directives.
* `post` — Hook actions code runs after the system changes the directives.


#### Returns

This event returns the WHM API 1 [`php_ini_set_directives`](/openapi/whm/operation/php_ini_set_directives) function's returns.

### Lang::PHP::set_handler

This event triggers when an administrator changes the handler that serves the PHP files for any version of PHP.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Unavailable.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action code runs before the system changes the handler.
* `post` — Hook actions code runs after the system changes the handler.


#### Returns

This event returns the WHM API 1 [`php_set_handler`](/openapi/whm/operation/php_set_handler) function's returns.

### Lang::PHP::set_system_default_version

This event triggers when an administrator changes the system default PHP version.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Unavailable.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action code runs before the system changes the default PHP version.
* `post` — Hook actions code runs after the system changes the default PHP version.


#### Returns

This event returns the WHM API 1 [`php_set_system_default_version`](/openapi/whm/operation/php_set_system_default_version) function's returns.

### Lang::PHP::set_vhost_versions

This event triggers when an administrator changes the PHP version for a specific virtual host. When you hook this event, you **must** also hook UAPI's [`LangPHP::php_set_vhost_versions`](/openapi/cpanel/operation/php_set_vhost_versions) function to ensure consistent behavior.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Unavailable.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action code runs before the system changes the virtual host's PHP version.
* `post` — Hook actions code runs after the system changes the virtual host's PHP version.


#### Returns

This event returns the WHM API 1 [`php_set_vhost_versions`](/openapi/whm/operation/php_set_vhost_versions) function's returns.

## RemoteMySQL Hook

This hook affects Remote MySQL® profiles:

### RemoteMySQL::activate_profile

This event triggers whenever the system activates a  Remote MySQL® profile.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Available.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action code runs before the system activates the remote profile.
* `post` — Hook actions code runs after the system activates the remote profile.


#### pre input parameters

| Parameter | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `profile_name` | *string* | The Remote MySQL profile's name. | A valid profile name on the server. | `notlocalhost` |


#### post input parameters

| Parameter | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `profile_name` | *string* | The Remote MySQL profile's name. | A valid profile name on the server. | `notlocalhost` |


#### pre returns

The `pre` stage does not return output.

#### post returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `result` | *Boolean* | Whether the function succeeded. | `1` — The function succeeded.  `0` — The function failed. | `1` |


## ParkAdmin Hooks

These hooks affect domains handled by ParkAdmin:

### ParkAdmin::park

This event triggers whenever the system parks a domain.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Available.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action code runs before the system parks the domain.
* `post` — Hook actions code runs after the system parks the domain.


#### pre returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `user` | *string* | The cPanel account that owns the domains. | A valid username on the server. | `username` |
| `target_domain` | *string* | The domain on which to park the `new_domain` domain. | A valid domain. | `example.com` |
| `new_domain` | *string* | The domain to park on the `target_domain` domain. | A valid domain. | `parkeddomain.com` |


#### post returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `user` | *string* | The cPanel account that owns the domains. | A valid username on the server. | `username` |
| `target_domain` | *string* | The domain on which the system parked the `new_domain` domain. | A valid domain. | `example.com` |
| `new_domain` | *string* | The domain that the system parked on the `target_domain` domain. | A valid domain. | `parkeddomain.com` |


### ParkAdmin::unpark

This event triggers whenever the system unparks a domain.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Available.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action code runs before the system unparks the domain.
* `post` — Hook actions code runs after the system unparks the domain.


#### pre returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `user` | *string* | The cPanel account that owns the domains. | A valid username on the server. | `username` |
| `parent_domain` | *string* | The domain on which the domain is parked. | A valid domain. | `example.com` |
| `domain` | *string* | The domain to unpark. | A valid domain. | `parkeddomain.com` |


#### post returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `user` | *string* | The cPanel account that owns the domains. | A valid username on the server. | `username` |
| `parent_domain` | *string* | The domain on which the domain was parked. | A valid domain. | `example.com` |
| `domain` | *string* | The unparked domain. | A valid domain. | `parkeddomain.com` |


## Package Hook

This hook affects account package access verification:

### Packages::verify_input_data

This event triggers when an account package is added or modified.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Available.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action allows for package field input checks and rejects the creation or modification of the package if values do not match desired criteria.
* `post` — N/A


#### pre returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `bwlimit` | *string* | The hosting plan's maximum bandwidth use. This parameter defaults to `unlimited`. | A positive integer between one and 999,999 that represents the maximum bandwidth use, in megabytes (MB).  `0`, `unlimited`, or `null` — The account has unlimited bandwidth. | `unlimited` |
| `cgi` | *Boolean* | Whether CGI access is enabled for the account. When a [server profile](https://docs.cpanel.net/whm/server-configuration/server-profile/) disables the [Web Server role](https://docs.cpanel.net/knowledge-base/general-systems-administration/how-to-use-server-profiles/#roles), this parameter defaults to `0`. On these servers, you **cannot** enable CGI access.  This parameter defaults to `1`. | `1` — Enabled.  `0` — Disabled. | `1` |
| `ip` | *string* | Whether the account has a dedicated IP address.  This parameter defaults to `n`. | `y` — The account has a dedicated IP address.  `n` — The account does not have a dedicated IP address. | `n` |
| `maxsub` | *string* | The hosting plan's maximum number of subdomains. | `unlimited`  An integer that represents a number of subdomains. | `unlimited` |
| `maxpop` | *string* | The hosting plan's maximum number of email accounts.  This parameter defaults to `unlimited`. | A positive integer between one and 999,999.  `0`, `unlimited`, or `null` — The account has unlimited email accounts. | `unlimited` |
| `maxlst` | *string* | The hosting plan's maximum number of mailing lists. | `unlimited`  An integer that represents a number of mailing lists. | `unlimited` |
| `cpmod` | *string* | The hosting plan's cPanel theme.  This parameter defaults to the server's [default cPanel theme](https://docs.cpanel.net/whm/server-configuration/basic-webhost-manager-setup/). | `jupiter`  A valid theme on the server. | `jupiter` |
| `language` | *string* | The hosting plan's default locale.  This value defaults to the server's default locale. | A two-letter [ISO-3166 code](http://www.iso.org/iso/country_codes.htm). | `en` |
| `featurelist` | *string* | The hosting plan's feature list.  If you do not use this parameter, the function assigns the `default` feature list to the hosting plan's accounts. | A valid feature list name on the server. | `default` |
| `maxftp` | *string* | The hosting plan's maximum number of FTP accounts.  This parameter defaults to `unlimited`. | A positive integer between one and 999,999.  `0`, `unlimited`, or `null` — The account has unlimited FTP accounts. | `unlimited` |
| `max_emails_per_hour` | *string* | The maximum number of emails that the account can send in one hour.  This parameter defaults to `unlimited`. | A positive integer.  `0` or `unlimited` — The account can send an unlimited number of emails. | `unlimited` |
| `maxaddon` | *string* | The hosting plan's maximum number of addon domains.  This parameter defaults to `unlimited`. | A positive integer between one and 999,999.  `0`, `unlimited`, or `null` — The account has unlimited addon domains. | `0` |
| `maxsql` | *string* | The hosting plan's maximum number of each available type of SQL database.  For example, if you set this value to `5` and the system administrator allows MySQL® and PostgreSQL® databases, users can create up to five MySQL databases and up to five PostgreSQL databases.  This parameter defaults to `unlimited`. | A positive integer between one and 999,999.  `0`, `unlimited`, or `null` — The account has unlimited databases. | `unlimited` |
| `hasshell` | *Boolean* | Whether the account has shell access.  This parameter defaults to `0`. | `1` — The account has shell access.  `0` — No shell access. | `0` |
| `edit` | *string* | Whether the user wishes to modify or add an existing package extension.  This parameter is part of the API call and **not** included in the package. The system displays `yes` when a user modifies an existing package extension and `no` when they wish to add one. | `yes` — The user wishes to **modify** an existing package extension.  `no` — The user wishes to **add** an existing package extension. | `yes` |
| `max_defer_fail_percentages` | *integer* | The percentage of failed or deferred email messages that the account can send per hour before outgoing mail is rate-limited. | A positive integer.  `0` or `unlimited` — The account can send an unlimited number of failed or deferred messages. | `unlimited` |
| `quota` | *integer* | The hosting plan's disk space quota.  This parameter defaults to `0` (unlimited). | A positive integer between one and 999,999 that represents the maximum disk space that the account may use, in megabytes (MB).  `0` — The hosting plan's disk space is unlimited. | `unlimited` |
| `maxpark` | *string* | The hosting plan's maximum number of parked domains (aliases).  This parameter defaults to `unlimited`. | A positive integer between one and 999,999.  `0`, `unlimited`, or `null` — The account has unlimited parked domains. | `0` |
| `name` | *string* | The hosting plan name. | An existing hosting plan name on the server. | `exampleplan` |
| `_package_extensions` | *string* | The hosting plan's package extensions.  If you do not provide a value, the hosting plan will not include package extensions. | A space-delimited list of one or more [package extensions](/guides/guide-to-package-extensions) on the server. Extension names and variables are **case-sensitive**.  You can also include the extension's variables in your function call, in `key=value` format. Consult the extension's documentation for a list of possible variables. | `extension1` `extension2` `extension3` |
| `digestauth` | *string* | Whether to enable Digest Authentication for the account. | `y` — Enable.  `n` — Disable. | `n` |


#### post returns

The `post` stage does not return output.

## Server profile

This hook affects manually changing a server type.

### Server::Type::Change::disable

This event triggers when a system administrator manually changes the server type and disables services or roles.

Note:
When changing the server type, you may receive both `Server::Type::Change::disable` and `Server::Type::Change::enable` events, depending on how the change affects the server.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Unavailable.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — N/A
* `post` — Hook action occurs after the server type changes.


#### pre returns

The `pre` stage does not return output.

#### post returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `services` | *string* | Array of services disabled by the server type change. | The short name of a `systemd` service. | `httpd` |
| `changed_roles` | *string* | Array of server roles disabled by the server type change. | A list of disabled `Cpanel::Server::Type::*::Change` roles. | `Cpanel::Server::Type::Role::FTP::Change` |


### Server::Type::Change::enable

This event triggers when a system administrator manually changes the server type and enables services or roles.

Note:
When changing the server type, you may receive both `Server::Type::Change::disable` and `Server::Type::Change::enable` events, depending on how the change affects the server.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Unavailable.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — N/A
* `post` — Hook action occurs after the server type changes.


#### pre returns

The `pre` stage does not return output.

#### post returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `services` | *string* | Array of services disabled by the server type change. | The short name of a `systemd` service. | `cpdavd` |
| `changed_roles` | *string* | Array of server roles enabled by the server type change. | A list of enabled `Cpanel::Server::Type::*::Change` roles. | `Cpanel::Server::Type::Role::WebDisk::Change` |


## SSL Hook

This hook affects manual SSL modification:

### SSL::installssl

This event triggers when a system administrator manually installs or changes an SSL certificate via WHM interfaces or WHM API 1 functions.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Available.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action allows for pre-installation validation and actions.
* `post` — Hook action allows for post-installation validation and actions.


#### pre returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `domain` | *string* | **Required**  The domain's name. | A valid domain name. | `example.com` |
| `crt` | *string* | **Required**  The certificate's text. | A valid SSL certificate. | `-----BEGIN CERTIFICATE-----\r\n`  `MIIEEzCCAvugAwIBAgIJALF/jFpw...`  `-----END CERTIFICATE-----%0` |
| `key` | *string* | **Required**  The certificate's key. | A valid private key. | ` -----BEGIN RSA PRIVATE KEY-----`  `MIIEpAIBAAKCAQEA4AVM6J4Qg3DI...`  `-----END RSA PRIVATE KEY-----` |
| `cab` | *string* | The certificate's CA bundle.  If you do not use this parameter, the system will automatically determine the appropriate CA bundle file to use. | A valid CA bundle. | `-----BEGIN CERTIFICATE-----\r\n`  `MIIB+jCCAWMCAgGjMA0GCSqGSIb3...`  `-----END CERTIFICATE-----` |
| `ip` | *string* | The IP address of the certificate's domain.  This parameter defaults to the local IP address for the domain. | A valid IP address. | `192.168.0.20` |


#### post returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `rawout` | *string* | The function's raw output. | A valid string in HTML format. | `The Certificate for the domain example.com was installed on the IP 192.168.0.20.` |
| `status` | *Boolean* | Whether the function was successful. | `1` — Success.  `0` — Failure. | `1` |


## Transfer Hook

This hook tracks transfer sessions:

### Transfers::Session

This event triggers when the system begins or finishes a transfer session.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Available.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action occurs before the transfer session begins.
* `post` — Hook action occurs after transfer finishes.


#### pre returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `creator` | *string* | The user under which the server created the transfer session. | A valid string. | `root` |
| `pid` | *integer* | The transfer session's process ID. | A valid PID.  `0` — The session has not started yet. | `0` |
| `version` | *string* | The transfer system's version. | A valid string. | `2.3` |
| `sessionid` | *string* | The transfer session's ID. | A valid string. | `sourceexampcopya20190429175239zSOL` |
| `starttime` | *string* | The transfer session's start time. | A date and time in `YYYY-MM-DD HH:MM:SS` format. | `2019-04-29 17:52:39` |
| `state` | *integer* | The current state of the transfer session. | `0` — The session has not started yet. | `0` |
| `targethost` | *string* | The target system's hostname. | A valid hostname. | `target.example.com` |
| `initiator` | *string* | The service that initiated the transfer session. | A valid service name. | `copyacct` |
| `endtime` | *string* | When the transfer session ended. | `undef` — The session has not started yet. | `undef` |
| `starttime_unix` | *integer* | When the transfer session started. | A positive integer that represents a time, in Unix time. | `1556560359` |
| `source_host` | *string* | The source system's hostname. | A valid hostname. | `source.example.com` |
| `endtime_unix` | *integer* | When the transfer session ended. | `undef` — The session has not started yet. | `undef` |


#### post returns

| Return | Type | Description | Possible values | Example |
|  --- | --- | --- | --- | --- |
| `creator` | *string* | The user under which the server created the transfer session. | A valid string. | `root` |
| `pid` | *integer* | The transfer session's process ID. | A valid integer. | `13401` |
| `version` | *string* | The transfer system's version. | A valid string. | `2.3` |
| `sessionid` | *string* | The transfer session's ID. | A valid string. | `sourceexampcopya20190429175239zSOL` |
| `starttime` | *string* | The transfer session's start time. | A date and time in `YYYY-MM-DD HH:MM:SS` format. | `2019-04-29 17:52:39` |
| `state` | *integer* | The current state of the transfer session. | `100` — The session has ended. | `100` |
| `targethost` | *string* | The target system's hostname. | A valid hostname. | `target.example.com` |
| `initiator` | *string* | The service that initiated the transfer session. | A valid service name. | `copyacct` |
| `endtime` | *string* | When the transfer session ended. | A date and time in `YYYY-MM-DD HH:MM:SS` format. | `2019-04-29 17:53:5` |
| `starttime_unix` | *integer* | When the transfer session started. | A positive integer that represents a time, in Unix time. | `1556560359` |
| `source_host` | *string* | The source system's hostname. | A valid hostname. | `source.example.com` |
| `endtime_unix` | *integer* | When the transfer session ended. | A positive integer that represents a time, in Unix time. | `1556560432` |


## TweakSettings Hook

This hook tracks user modifications of TweakSettings:

### TweakSettings::Main

This event triggers before or after a user modifies a [*Tweak Setting*](https://docs.cpanel.net/whm/server-configuration/tweak-settings/) value.

#### Information

* **Action code runs as:** `root`
* **Blocking attribute:** Unavailable.
* **Escalate privileges attribute:** N/A


#### Available stages

* `pre` — Hook action occurs before updating the *Tweak Setting* value.
* `post` — Hook action occurs after updating the *Tweak Setting* value.


#### Returns

The `pre` and `post` stages do not return output.