# Convert website of a web hosting package

> Make a website an alias of another one, or an alias a website of its own.

- Effect: Destructive - Removes something for good. Agents ask first.
- Idempotent: no
- Stability: beta
- MCP tool: `manitu_webhosting_web_vhost_convert` on https://mcp.manitu.de/mcp
- REST: `POST https://api.manitu.de/v1/webhosting/web/vhost/convert`
- Needs: `service_webhosting`
- Page: /reference/webhosting/web/vhost/convert/

**Removes something for good. Agents name what will be lost and wait for an explicit yes; a program should ask the same.**

## MCP tool

`manitu_webhosting_web_vhost_convert`

### Description for the model

Converts a website (vHost) of a web hosting package of the manitu customer account this connection works in, by site_id and fqdn from manitu_webhosting_web_vhost_list. to alias (alias_of required - another website, not an alias): it then shows what that website shows, with its HTTPS settings; its own folder or redirect, HSTS and alternative hostname are given up for good, its own aliases move to that website (moved_alias_list). to website: an alias becomes a website of its own and keeps showing what it showed, changeable with manitu_webhosting_web_vhost_set. Status, certificate and description stay. A websitebuilder cannot be converted (not_convertible); converting to the type it has is a conflict (already_type). Takes up to an hour everywhere. Refused with a conflict when the package cannot be changed now (not_configurable). Tell the customer what is given up and ask for an explicit yes first.

### Arguments

- `site_id` (integer | string, required) - The site_id from manitu_webhosting_list - never guess one. (pattern `"^[1-9][0-9]*$"`; minimum `1`)
- `fqdn` (string, required) - The website from manitu_webhosting_web_vhost_list, e.g. shop.example.de. Never guess one. (minLength `3`; maxLength `253`)
- `to` (string, required) - website or alias. (one of `"website"`, `"alias"`)
- `alias_of` (string) - For to alias - required then: the website (or websitebuilder) it belongs to, by fqdn from manitu_webhosting_web_vhost_list. Not an alias, not itself. (minLength `3`; maxLength `253`)
- `redirect_to_parent` (boolean) - For to alias: redirect visitors to that website's name (HTTP 301, default true); false: show the same under its own name.

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "manitu_webhosting_web_vhost_convert",
    "arguments": {
      "site_id": 12345,
      "fqdn": "example.com",
      "to": "website"
    }
  }
}
```

## REST

`POST https://api.manitu.de/v1/webhosting/web/vhost/convert`

### Authentication

One of `X-API-Key`, `Authorization: Bearer …` - never more than one in a request.

### Request body

JSON; unknown fields are refused.

- `site_id` (integer | string, required) - The site_id from manitu_webhosting_list - never guess one. (pattern `"^[1-9][0-9]*$"`; minimum `1`)
- `fqdn` (string, required) - The website from manitu_webhosting_web_vhost_list, e.g. shop.example.de. Never guess one. (minLength `3`; maxLength `253`)
- `to` (string, required) - website or alias. (one of `"website"`, `"alias"`)
- `alias_of` (string) - For to alias - required then: the website (or websitebuilder) it belongs to, by fqdn from manitu_webhosting_web_vhost_list. Not an alias, not itself. (minLength `3`; maxLength `253`)
- `redirect_to_parent` (boolean) - For to alias: redirect visitors to that website's name (HTTP 301, default true); false: show the same under its own name.

### Response

In `data`; the rest of the body as on every call.

- `fqdn` (string, required) - The name, e.g. www.example.de - a domain or subdomain of the package; what the other tools take. Unicode for an internationalized domain.
- `fqdn_ascii` (string, required) - The same name as DNS has it (xn--... for an internationalized domain).
- `type` (string, required) - website (the customer's files from a folder, or a redirect to a URL), websitebuilder (made with manitu's website builder) or alias (a further name of a website - see alias). (one of `"website"`, `"websitebuilder"`, `"alias"`)
- `status` (string, required) - inactive: switched off, the files are kept - visitors get when_inactive. (one of `"active"`, `"inactive"`)
- `when_inactive` (object, required) - What visitors get while it is inactive.
  - `when_inactive.response` (string, required) - An HTTP status (403, 404, 503 - 503 tells search engines to come back), hide (as if there were no website) or page (a page of manitu's, see page). (one of `"http_status_403"`, `"http_status_404"`, `"http_status_503"`, `"hide"`, `"page"`)
  - `when_inactive.page` (string | null, required) - Which page, for response page: disabled, underconstruction or maintenance. (one of `"disabled"`, `"underconstruction"`, `"maintenance"`, `null`)
- `website` (object | null, required) - For type website, else null.
  - `website.target_dir` (string | null, required) - The folder shown, relative to the web root, e.g. /htdocs/www.example.com/ (the older layout: /web/...) - see manitu_webhosting_web_structure_get; null when it redirects.
  - `website.redirect_url` (string | null, required) - The URL every visitor is sent to - null when it shows a folder.
  - `website.allow_wordpress_xmlrpc` (boolean, required) - WordPress' XML-RPC interface reachable - off by default, a frequent target of brute force attacks that manitu's firewall cannot block.
- `websitebuilder` (object | null, required) - For type websitebuilder, else null. The editor opens with manitu_webhosting_web_vhost_websitebuilder_get.
  - `websitebuilder.target_dir` (string, required) - The folder manitu set for it - not to be changed.
- `alias` (object | null, required) - For type alias, else null. An alias shows what its website shows, with its HTTPS settings; status, certificate and description are its own.
  - `alias.of` (string | null, required) - The website it belongs to (fqdn) - null only for an old alias that lost it.
  - `alias.redirect_to_parent` (boolean, required) - Visitors are redirected to the website's name (HTTP 301); false: the alias shows the same under its own name.
- `https` (object | null, required) - For a website or websitebuilder; null for an alias (its website's apply).
  - `https.redirect` (boolean, required) - Visitors coming with http:// are sent to https://.
  - `https.hsts` (object, required) - HSTS (Strict-Transport-Security): browsers remember to use only HTTPS.
    - `https.hsts.active` (boolean, required)
    - `https.hsts.max_age` (integer, required) - How long browsers remember it, in seconds.
    - `https.hsts.include_subdomains` (boolean, required)
    - `https.hsts.preload` (boolean, required)
- `alternative_hostname` (object | null, required) - A second name under vhost.manitu.de that shows the same - e.g. before a domain transfer or while DNS is not there yet. Null for an alias.
  - `alternative_hostname.active` (boolean, required)
  - `alternative_hostname.fqdn` (string | null, required) - The name, e.g. 1a2b3c4d.vhost.manitu.de - null while not active. A new one each time it is switched on.
  - `alternative_hostname.noindex` (boolean, required) - Search engines are asked not to index it under this name.
- `alias_list` (array of string | null, required) - Its aliases (fqdn) - null for an alias.
- `certificate` (object | null, required) - Its SSL certificate - null if none.
  - `certificate.type` (string, required) - (one of `"letsencrypt"`, `"custom"`)
  - `certificate.status` (string, required) - pending: asked for, usually issued within an hour; error: could not be issued - often the name does not point to manitu yet. (one of `"active"`, `"pending"`, `"error"`, `"expired"`)
  - `certificate.expires_at` (string | null, required) - When it runs out (the same as manitu_webhosting_web_certificate_get) - Let's Encrypt renews in time; null while pending. (format `date-time`)
- `description` (string | null, required) - What the customer wrote about it (his description), null if nothing - not its name or user name.
- `created_at` (string | null, required) - (format `date-time`)
- `moved_alias_list` (array of string, required) - The aliases it had as a website - they belong to its new website (alias.of) now.

### Statuses

- `200` Success.
- `400` The request does not match the declared input schema.
- `401` No credential was presented, or it was not recognised.
- `403` The credential is not permitted to use this operation.
- `500` The server failed. Nothing about the request was wrong. Whether a change took effect is not known - check before trying it again.
- `503` The channel this operation forwards through is unavailable.

### Example

```sh
curl -X POST 'https://api.manitu.de/v1/webhosting/web/vhost/convert' \
  -H 'X-API-Key: $API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"site_id":12345,"fqdn":"example.com","to":"website"}'
```

## Example result

```json
{
  "fqdn": "example.com",
  "fqdn_ascii": "string",
  "type": "website",
  "status": "active",
  "when_inactive": {
    "response": "http_status_403",
    "page": "disabled"
  },
  "website": {
    "target_dir": "/web",
    "redirect_url": "https://www.example.com/",
    "allow_wordpress_xmlrpc": true
  },
  "websitebuilder": {
    "target_dir": "/web"
  },
  "alias": {
    "of": "string",
    "redirect_to_parent": true
  },
  "https": {
    "redirect": true,
    "hsts": {
      "active": true,
      "max_age": 1,
      "include_subdomains": true,
      "preload": true
    }
  },
  "alternative_hostname": {
    "active": true,
    "fqdn": "example.com",
    "noindex": true
  },
  "alias_list": [
    "string"
  ],
  "certificate": {
    "type": "letsencrypt",
    "status": "active",
    "expires_at": "2026-10-23T12:00:00+02:00"
  },
  "description": "Example",
  "created_at": "2026-10-23T12:00:00+02:00",
  "moved_alias_list": [
    "string"
  ]
}
```
