@hostinger/mcp 3.2.0 → 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,20 @@ Generated at release time from the diff between the previous and current
4
4
  build. Tool changes are listed individually; everything else is summarised
5
5
  by area.
6
6
 
7
+ ## v3.2.1 — 2026-10-19
8
+
9
+ ### Operations
10
+
11
+ - Changed the description of `hosting_websites_list-setups`
12
+ - Changed the description and input schema of `hosting_websites_start-setup`
13
+ - Changed the description and input schema of `wordpress_installations_install`
14
+
15
+ ### Also in this release
16
+
17
+ - Documentation: `README.md`
18
+ - Request handling and authentication: `src/core/runtime.js`, `src/core/runtime.ts`
19
+ - Build and packaging: `types.d.ts`
20
+
7
21
  ## v3.2.0 — 2026-10-19
8
22
 
9
23
  ### Operations
package/README.md CHANGED
@@ -2325,8 +2325,9 @@ wait for `status: completed` before uploading files, deploying or creating datab
2325
2325
  `failed` means the setup stopped before finishing or has not reported progress for
2326
2326
  over an hour. Setups older than 24 hours are not listed.
2327
2327
 
2328
- `type` is the website type the setup was started with (`wordpress`, `headless_wordpress`,
2329
- `headless_ecommerce`, `headless_pocketbase`), or `null` for an empty website.
2328
+ `type` is the website type the setup was started with (`wordpress`, `headless_empty`,
2329
+ `headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`), or `null` for an empty
2330
+ website.
2330
2331
 
2331
2332
  - **Method**: `GET`
2332
2333
  - **Path**: `/api/hosting/v1/onboardings`
@@ -2335,17 +2336,25 @@ over an hour. Setups older than 24 hours are not listed.
2335
2336
 
2336
2337
  Starts a website setup on a Web or Cloud hosting order and returns the created setup
2337
2338
  right away; the website itself is provisioned asynchronously. Poll the list website
2338
- setups endpoint with the `domain` filter every 10 to 15 seconds and wait for
2339
- `status: completed` before uploading files, deploying or creating databases.
2339
+ setups endpoint (`hosting_websites_list-setups`) with the `domain` filter every 10 to 15
2340
+ seconds and wait for `status: completed` before uploading files, deploying or creating
2341
+ databases.
2340
2342
 
2341
2343
  Omit `type` for an empty website. `type: wordpress` installs WordPress in the website
2342
2344
  root with the admin user, email and password from `wordpress`, the domain as the site
2343
2345
  title, and `en_US` when `wordpress.language` is omitted. The headless types
2344
- (`headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`) create a headless
2345
- website; `headless_wordpress` additionally installs WordPress into the `cms` directory
2346
- of the website root with generated credentials.
2347
-
2348
- Omit `domain` to set the website up on a generated temporary free subdomain.
2346
+ (`headless_empty`, `headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`)
2347
+ create a headless website; `headless_wordpress` additionally installs WordPress into the
2348
+ `cms` directory of the website root with generated credentials. `headless_empty` installs
2349
+ nothing: WordPress can be added later through
2350
+ `POST /api/hosting/v1/accounts/{username}/wordpress/installations`
2351
+ (`wordpress_installations_install`) with `type: headless`.
2352
+
2353
+ Omit `domain` to set the website up on a generated temporary free subdomain. To know the
2354
+ free subdomain before the call, so a timed-out call can be looked up and retried on the
2355
+ same domain, generate one through `POST /api/hosting/v1/domains/free-subdomains`
2356
+ (`hosting_domains_generate-free-subdomain`) and send it as `domain`. It is accepted for
2357
+ 24 hours, only from the client that generated it.
2349
2358
 
2350
2359
  When the order has no hosting account yet, the setup creates one first, in the datacenter
2351
2360
  given by `datacenter_code` or the order's default datacenter when it is omitted.
@@ -4486,19 +4495,29 @@ database files that have been uploaded to the website's directory.
4486
4495
  Install WordPress on an existing website.
4487
4496
 
4488
4497
  The website must already exist before calling this endpoint. To create a new
4489
- website first, use POST /api/hosting/v1/websites and poll
4490
- GET /api/hosting/v1/websites until it appears.
4491
-
4492
- Call GET /api/hosting/v1/wordpress/installations filtered by username and
4493
- domain before proceeding to check whether WordPress is already installed on
4494
- the target domain/path. If WordPress already exists and `overwrite` is false
4495
- (the default), the async job will fail.
4498
+ website first, use POST /api/hosting/v1/orders/{order_id}/onboardings
4499
+ (`hosting_websites_start-setup`) and poll GET /api/hosting/v1/onboardings
4500
+ (`hosting_websites_list-setups`) with the `domain` filter until its `status` is
4501
+ `completed`.
4502
+
4503
+ Send `type: headless` to turn a headless website (for example one created by
4504
+ `hosting_websites_start-setup` with `type: headless_empty`) into a headless WordPress
4505
+ website: WordPress is installed into the `cms` directory with the Hostinger headless
4506
+ MU plugin and the website is marked as a headless WordPress website. `directory` is
4507
+ not allowed with it. The target website must already be headless: the headless
4508
+ install rewrites the root `.htaccess`, so on any other website the request is
4509
+ rejected with 422.
4510
+
4511
+ Call GET /api/hosting/v1/wordpress/installations (`wordpress_installations_list`)
4512
+ filtered by username and domain before proceeding to check whether WordPress is
4513
+ already installed on the target domain/path. If WordPress already exists and
4514
+ `overwrite` is false (the default), the async job will fail.
4496
4515
 
4497
4516
  This operation is asynchronous: a successful response only means the install
4498
4517
  job has been queued, not that WordPress is ready. Installation typically
4499
- takes 1-2 minutes. Poll GET /api/hosting/v1/wordpress/installations filtered
4500
- by username and domain to track progress. When the installation appears in
4501
- that list, WordPress is ready.
4518
+ takes 1-2 minutes. Poll GET /api/hosting/v1/wordpress/installations
4519
+ (`wordpress_installations_list`) filtered by username and domain to track
4520
+ progress. When the installation appears in that list, WordPress is ready.
4502
4521
 
4503
4522
  Returns 422 when the account already uses all the databases its plan allows,
4504
4523
  unless `database.name` is an existing database on the account.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hostinger-api-mcp",
3
- "version": "3.2.0",
3
+ "version": "3.2.1",
4
4
  "description": "Hostinger API — manage domains, DNS, hosting, VPS, billing and more from Gemini CLI.",
5
5
  "mcpServers": {
6
6
  "hostinger": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hostinger/mcp",
3
- "version": "3.2.0",
3
+ "version": "3.2.1",
4
4
  "mcpName": "io.github.hostinger/hostinger-api-mcp",
5
5
  "description": "MCP server for Hostinger API",
6
6
  "repository": {
package/server.json CHANGED
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/hostinger/api-mcp-server",
7
7
  "source": "github"
8
8
  },
9
- "version": "3.2.0",
9
+ "version": "3.2.1",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "@hostinger/mcp",
14
- "version": "3.2.0",
14
+ "version": "3.2.1",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },
@@ -66,7 +66,7 @@ const GetSkillRequestSchema = z.object({
66
66
 
67
67
  /**
68
68
  * MCP Server for Hostinger API
69
- * Generated from OpenAPI spec version 2.1.0
69
+ * Generated from OpenAPI spec version 2.1.1
70
70
  */
71
71
  class MCPServer {
72
72
  constructor({ name, version, tools, instructions, skills = [] }) {
@@ -97,7 +97,7 @@ interface Skill { uri: string; frontmatter: Record<string, unknown>; resources:
97
97
 
98
98
  /**
99
99
  * MCP Server for Hostinger API
100
- * Generated from OpenAPI spec version 2.1.0
100
+ * Generated from OpenAPI spec version 2.1.1
101
101
  */
102
102
  class MCPServer {
103
103
  private readonly name: string;
@@ -8708,7 +8708,7 @@ export default [
8708
8708
  "readOnlyHint": true,
8709
8709
  "destructiveHint": false
8710
8710
  },
8711
- "description": "Returns the website setups started in the last 24 hours for the hosting accounts\naccessible to the authenticated client, newest first. Narrow the list with the\n`order_id`, `subscription_id` or `domain` filters.\n\nMeant for polling right after creating a website or starting a website setup: the\nwebsite shows up in the websites list before its server-side setup has finished, and\nwhile the setup is `running` endpoints that operate on that website may respond with\n`404` or `409`. Poll this endpoint with the `domain` filter every 10 to 15 seconds and\nwait for `status: completed` before uploading files, deploying or creating databases.\n`failed` means the setup stopped before finishing or has not reported progress for\nover an hour. Setups older than 24 hours are not listed.\n\n`type` is the website type the setup was started with (`wordpress`, `headless_wordpress`,\n`headless_ecommerce`, `headless_pocketbase`), or `null` for an empty website.",
8711
+ "description": "Returns the website setups started in the last 24 hours for the hosting accounts\naccessible to the authenticated client, newest first. Narrow the list with the\n`order_id`, `subscription_id` or `domain` filters.\n\nMeant for polling right after creating a website or starting a website setup: the\nwebsite shows up in the websites list before its server-side setup has finished, and\nwhile the setup is `running` endpoints that operate on that website may respond with\n`404` or `409`. Poll this endpoint with the `domain` filter every 10 to 15 seconds and\nwait for `status: completed` before uploading files, deploying or creating databases.\n`failed` means the setup stopped before finishing or has not reported progress for\nover an hour. Setups older than 24 hours are not listed.\n\n`type` is the website type the setup was started with (`wordpress`, `headless_empty`,\n`headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`), or `null` for an empty\nwebsite.",
8712
8712
  "method": "GET",
8713
8713
  "path": "/api/hosting/v1/onboardings",
8714
8714
  "inputSchema": {
@@ -8744,7 +8744,7 @@ export default [
8744
8744
  "readOnlyHint": false,
8745
8745
  "destructiveHint": false
8746
8746
  },
8747
- "description": "Starts a website setup on a Web or Cloud hosting order and returns the created setup\nright away; the website itself is provisioned asynchronously. Poll the list website\nsetups endpoint with the `domain` filter every 10 to 15 seconds and wait for\n`status: completed` before uploading files, deploying or creating databases.\n\nOmit `type` for an empty website. `type: wordpress` installs WordPress in the website\nroot with the admin user, email and password from `wordpress`, the domain as the site\ntitle, and `en_US` when `wordpress.language` is omitted. The headless types\n(`headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`) create a headless\nwebsite; `headless_wordpress` additionally installs WordPress into the `cms` directory\nof the website root with generated credentials.\n\nOmit `domain` to set the website up on a generated temporary free subdomain.\n\nWhen the order has no hosting account yet, the setup creates one first, in the datacenter\ngiven by `datacenter_code` or the order's default datacenter when it is omitted.\nReturns 404 when the order does not exist or is not accessible to the authenticated\nclient, and 409 with a `Retry-After` header while a setup for the same domain is still\nrunning.",
8747
+ "description": "Starts a website setup on a Web or Cloud hosting order and returns the created setup\nright away; the website itself is provisioned asynchronously. Poll the list website\nsetups endpoint (`hosting_websites_list-setups`) with the `domain` filter every 10 to 15\nseconds and wait for `status: completed` before uploading files, deploying or creating\ndatabases.\n\nOmit `type` for an empty website. `type: wordpress` installs WordPress in the website\nroot with the admin user, email and password from `wordpress`, the domain as the site\ntitle, and `en_US` when `wordpress.language` is omitted. The headless types\n(`headless_empty`, `headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`)\ncreate a headless website; `headless_wordpress` additionally installs WordPress into the\n`cms` directory of the website root with generated credentials. `headless_empty` installs\nnothing: WordPress can be added later through\n`POST /api/hosting/v1/accounts/{username}/wordpress/installations`\n(`wordpress_installations_install`) with `type: headless`.\n\nOmit `domain` to set the website up on a generated temporary free subdomain. To know the\nfree subdomain before the call, so a timed-out call can be looked up and retried on the\nsame domain, generate one through `POST /api/hosting/v1/domains/free-subdomains`\n(`hosting_domains_generate-free-subdomain`) and send it as `domain`. It is accepted for\n24 hours, only from the client that generated it.\n\nWhen the order has no hosting account yet, the setup creates one first, in the datacenter\ngiven by `datacenter_code` or the order's default datacenter when it is omitted.\nReturns 404 when the order does not exist or is not accessible to the authenticated\nclient, and 409 with a `Retry-After` header while a setup for the same domain is still\nrunning.",
8748
8748
  "method": "POST",
8749
8749
  "path": "/api/hosting/v1/orders/{order_id}/onboardings",
8750
8750
  "inputSchema": {
@@ -8756,9 +8756,10 @@ export default [
8756
8756
  },
8757
8757
  "type": {
8758
8758
  "type": "string",
8759
- "description": "Website type. Omit or `null` for an empty website. `wordpress` installs WordPress in the website root and requires `wordpress`. The headless types (`headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`) create a headless website; `headless_wordpress` additionally installs WordPress into the `cms` directory with generated credentials.",
8759
+ "description": "Website type. Omit or `null` for an empty website. `wordpress` installs WordPress in the website root and requires `wordpress`. The headless types (`headless_empty`, `headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`) create a headless website; `headless_wordpress` additionally installs WordPress into the `cms` directory with generated credentials. `headless_empty` installs nothing, so WordPress can be added later through `POST /api/hosting/v1/accounts/{username}/wordpress/installations` (`wordpress_installations_install`) with `type: headless`.",
8760
8760
  "enum": [
8761
8761
  "wordpress",
8762
+ "headless_empty",
8762
8763
  "headless_wordpress",
8763
8764
  "headless_ecommerce",
8764
8765
  "headless_pocketbase"
@@ -8766,7 +8767,7 @@ export default [
8766
8767
  },
8767
8768
  "domain": {
8768
8769
  "type": "string",
8769
- "description": "Customer-owned domain. Cannot start with \"www.\" and can have at most one subdomain level, e.g. `blog.example.com`. Omit or `null` to set the website up on a generated temporary free subdomain."
8770
+ "description": "Customer-owned domain, or a free subdomain you generated through `POST /api/hosting/v1/domains/free-subdomains` (`hosting_domains_generate-free-subdomain`) in the last 24 hours. Cannot start with \"www.\" and can have at most one subdomain level, e.g. `blog.example.com`. Omit or `null` to set the website up on a generated temporary free subdomain."
8770
8771
  },
8771
8772
  "datacenter_code": {
8772
8773
  "type": "string",
@@ -16593,7 +16594,7 @@ export default [
16593
16594
  "readOnlyHint": false,
16594
16595
  "destructiveHint": false
16595
16596
  },
16596
- "description": "Install WordPress on an existing website.\n\nThe website must already exist before calling this endpoint. To create a new\nwebsite first, use POST /api/hosting/v1/websites and poll\nGET /api/hosting/v1/websites until it appears.\n\nCall GET /api/hosting/v1/wordpress/installations filtered by username and\ndomain before proceeding to check whether WordPress is already installed on\nthe target domain/path. If WordPress already exists and `overwrite` is false\n(the default), the async job will fail.\n\nThis operation is asynchronous: a successful response only means the install\njob has been queued, not that WordPress is ready. Installation typically\ntakes 1-2 minutes. Poll GET /api/hosting/v1/wordpress/installations filtered\nby username and domain to track progress. When the installation appears in\nthat list, WordPress is ready.\n\nReturns 422 when the account already uses all the databases its plan allows,\nunless `database.name` is an existing database on the account.",
16597
+ "description": "Install WordPress on an existing website.\n\nThe website must already exist before calling this endpoint. To create a new\nwebsite first, use POST /api/hosting/v1/orders/{order_id}/onboardings\n(`hosting_websites_start-setup`) and poll GET /api/hosting/v1/onboardings\n(`hosting_websites_list-setups`) with the `domain` filter until its `status` is\n`completed`.\n\nSend `type: headless` to turn a headless website (for example one created by\n`hosting_websites_start-setup` with `type: headless_empty`) into a headless WordPress\nwebsite: WordPress is installed into the `cms` directory with the Hostinger headless\nMU plugin and the website is marked as a headless WordPress website. `directory` is\nnot allowed with it. The target website must already be headless: the headless\ninstall rewrites the root `.htaccess`, so on any other website the request is\nrejected with 422.\n\nCall GET /api/hosting/v1/wordpress/installations (`wordpress_installations_list`)\nfiltered by username and domain before proceeding to check whether WordPress is\nalready installed on the target domain/path. If WordPress already exists and\n`overwrite` is false (the default), the async job will fail.\n\nThis operation is asynchronous: a successful response only means the install\njob has been queued, not that WordPress is ready. Installation typically\ntakes 1-2 minutes. Poll GET /api/hosting/v1/wordpress/installations\n(`wordpress_installations_list`) filtered by username and domain to track\nprogress. When the installation appears in that list, WordPress is ready.\n\nReturns 422 when the account already uses all the databases its plan allows,\nunless `database.name` is an existing database on the account.",
16597
16598
  "method": "POST",
16598
16599
  "path": "/api/hosting/v1/accounts/{username}/wordpress/installations",
16599
16600
  "inputSchema": {
@@ -16615,9 +16616,17 @@ export default [
16615
16616
  "type": "string",
16616
16617
  "description": "WordPress locale. Defaults to en_US when omitted."
16617
16618
  },
16619
+ "type": {
16620
+ "type": "string",
16621
+ "description": "Installation kind; `default` when omitted. `headless` installs WordPress into the `cms` directory with the Hostinger headless MU plugin and marks the website as a headless WordPress website. Accepted only for a website that is already headless, e.g. one created by `POST /api/hosting/v1/orders/{order_id}/onboardings` (`hosting_websites_start-setup`) with `type: headless_empty`; any other website is rejected with 422.",
16622
+ "enum": [
16623
+ "default",
16624
+ "headless"
16625
+ ]
16626
+ },
16618
16627
  "directory": {
16619
16628
  "type": "string",
16620
- "description": "Relative directory to install WordPress into. Defaults to the website root when omitted."
16629
+ "description": "Installation subdirectory relative to the document root; omit for the root. Not allowed with `type: headless`, which always installs into `cms`."
16621
16630
  },
16622
16631
  "overwrite": {
16623
16632
  "type": "boolean",
@@ -8724,7 +8724,7 @@ const tools: OpenApiTool[] = [
8724
8724
  "readOnlyHint": true,
8725
8725
  "destructiveHint": false
8726
8726
  },
8727
- "description": "Returns the website setups started in the last 24 hours for the hosting accounts\naccessible to the authenticated client, newest first. Narrow the list with the\n`order_id`, `subscription_id` or `domain` filters.\n\nMeant for polling right after creating a website or starting a website setup: the\nwebsite shows up in the websites list before its server-side setup has finished, and\nwhile the setup is `running` endpoints that operate on that website may respond with\n`404` or `409`. Poll this endpoint with the `domain` filter every 10 to 15 seconds and\nwait for `status: completed` before uploading files, deploying or creating databases.\n`failed` means the setup stopped before finishing or has not reported progress for\nover an hour. Setups older than 24 hours are not listed.\n\n`type` is the website type the setup was started with (`wordpress`, `headless_wordpress`,\n`headless_ecommerce`, `headless_pocketbase`), or `null` for an empty website.",
8727
+ "description": "Returns the website setups started in the last 24 hours for the hosting accounts\naccessible to the authenticated client, newest first. Narrow the list with the\n`order_id`, `subscription_id` or `domain` filters.\n\nMeant for polling right after creating a website or starting a website setup: the\nwebsite shows up in the websites list before its server-side setup has finished, and\nwhile the setup is `running` endpoints that operate on that website may respond with\n`404` or `409`. Poll this endpoint with the `domain` filter every 10 to 15 seconds and\nwait for `status: completed` before uploading files, deploying or creating databases.\n`failed` means the setup stopped before finishing or has not reported progress for\nover an hour. Setups older than 24 hours are not listed.\n\n`type` is the website type the setup was started with (`wordpress`, `headless_empty`,\n`headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`), or `null` for an empty\nwebsite.",
8728
8728
  "method": "GET",
8729
8729
  "path": "/api/hosting/v1/onboardings",
8730
8730
  "inputSchema": {
@@ -8760,7 +8760,7 @@ const tools: OpenApiTool[] = [
8760
8760
  "readOnlyHint": false,
8761
8761
  "destructiveHint": false
8762
8762
  },
8763
- "description": "Starts a website setup on a Web or Cloud hosting order and returns the created setup\nright away; the website itself is provisioned asynchronously. Poll the list website\nsetups endpoint with the `domain` filter every 10 to 15 seconds and wait for\n`status: completed` before uploading files, deploying or creating databases.\n\nOmit `type` for an empty website. `type: wordpress` installs WordPress in the website\nroot with the admin user, email and password from `wordpress`, the domain as the site\ntitle, and `en_US` when `wordpress.language` is omitted. The headless types\n(`headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`) create a headless\nwebsite; `headless_wordpress` additionally installs WordPress into the `cms` directory\nof the website root with generated credentials.\n\nOmit `domain` to set the website up on a generated temporary free subdomain.\n\nWhen the order has no hosting account yet, the setup creates one first, in the datacenter\ngiven by `datacenter_code` or the order's default datacenter when it is omitted.\nReturns 404 when the order does not exist or is not accessible to the authenticated\nclient, and 409 with a `Retry-After` header while a setup for the same domain is still\nrunning.",
8763
+ "description": "Starts a website setup on a Web or Cloud hosting order and returns the created setup\nright away; the website itself is provisioned asynchronously. Poll the list website\nsetups endpoint (`hosting_websites_list-setups`) with the `domain` filter every 10 to 15\nseconds and wait for `status: completed` before uploading files, deploying or creating\ndatabases.\n\nOmit `type` for an empty website. `type: wordpress` installs WordPress in the website\nroot with the admin user, email and password from `wordpress`, the domain as the site\ntitle, and `en_US` when `wordpress.language` is omitted. The headless types\n(`headless_empty`, `headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`)\ncreate a headless website; `headless_wordpress` additionally installs WordPress into the\n`cms` directory of the website root with generated credentials. `headless_empty` installs\nnothing: WordPress can be added later through\n`POST /api/hosting/v1/accounts/{username}/wordpress/installations`\n(`wordpress_installations_install`) with `type: headless`.\n\nOmit `domain` to set the website up on a generated temporary free subdomain. To know the\nfree subdomain before the call, so a timed-out call can be looked up and retried on the\nsame domain, generate one through `POST /api/hosting/v1/domains/free-subdomains`\n(`hosting_domains_generate-free-subdomain`) and send it as `domain`. It is accepted for\n24 hours, only from the client that generated it.\n\nWhen the order has no hosting account yet, the setup creates one first, in the datacenter\ngiven by `datacenter_code` or the order's default datacenter when it is omitted.\nReturns 404 when the order does not exist or is not accessible to the authenticated\nclient, and 409 with a `Retry-After` header while a setup for the same domain is still\nrunning.",
8764
8764
  "method": "POST",
8765
8765
  "path": "/api/hosting/v1/orders/{order_id}/onboardings",
8766
8766
  "inputSchema": {
@@ -8772,9 +8772,10 @@ const tools: OpenApiTool[] = [
8772
8772
  },
8773
8773
  "type": {
8774
8774
  "type": "string",
8775
- "description": "Website type. Omit or `null` for an empty website. `wordpress` installs WordPress in the website root and requires `wordpress`. The headless types (`headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`) create a headless website; `headless_wordpress` additionally installs WordPress into the `cms` directory with generated credentials.",
8775
+ "description": "Website type. Omit or `null` for an empty website. `wordpress` installs WordPress in the website root and requires `wordpress`. The headless types (`headless_empty`, `headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`) create a headless website; `headless_wordpress` additionally installs WordPress into the `cms` directory with generated credentials. `headless_empty` installs nothing, so WordPress can be added later through `POST /api/hosting/v1/accounts/{username}/wordpress/installations` (`wordpress_installations_install`) with `type: headless`.",
8776
8776
  "enum": [
8777
8777
  "wordpress",
8778
+ "headless_empty",
8778
8779
  "headless_wordpress",
8779
8780
  "headless_ecommerce",
8780
8781
  "headless_pocketbase"
@@ -8782,7 +8783,7 @@ const tools: OpenApiTool[] = [
8782
8783
  },
8783
8784
  "domain": {
8784
8785
  "type": "string",
8785
- "description": "Customer-owned domain. Cannot start with \"www.\" and can have at most one subdomain level, e.g. `blog.example.com`. Omit or `null` to set the website up on a generated temporary free subdomain."
8786
+ "description": "Customer-owned domain, or a free subdomain you generated through `POST /api/hosting/v1/domains/free-subdomains` (`hosting_domains_generate-free-subdomain`) in the last 24 hours. Cannot start with \"www.\" and can have at most one subdomain level, e.g. `blog.example.com`. Omit or `null` to set the website up on a generated temporary free subdomain."
8786
8787
  },
8787
8788
  "datacenter_code": {
8788
8789
  "type": "string",
@@ -16609,7 +16610,7 @@ const tools: OpenApiTool[] = [
16609
16610
  "readOnlyHint": false,
16610
16611
  "destructiveHint": false
16611
16612
  },
16612
- "description": "Install WordPress on an existing website.\n\nThe website must already exist before calling this endpoint. To create a new\nwebsite first, use POST /api/hosting/v1/websites and poll\nGET /api/hosting/v1/websites until it appears.\n\nCall GET /api/hosting/v1/wordpress/installations filtered by username and\ndomain before proceeding to check whether WordPress is already installed on\nthe target domain/path. If WordPress already exists and `overwrite` is false\n(the default), the async job will fail.\n\nThis operation is asynchronous: a successful response only means the install\njob has been queued, not that WordPress is ready. Installation typically\ntakes 1-2 minutes. Poll GET /api/hosting/v1/wordpress/installations filtered\nby username and domain to track progress. When the installation appears in\nthat list, WordPress is ready.\n\nReturns 422 when the account already uses all the databases its plan allows,\nunless `database.name` is an existing database on the account.",
16613
+ "description": "Install WordPress on an existing website.\n\nThe website must already exist before calling this endpoint. To create a new\nwebsite first, use POST /api/hosting/v1/orders/{order_id}/onboardings\n(`hosting_websites_start-setup`) and poll GET /api/hosting/v1/onboardings\n(`hosting_websites_list-setups`) with the `domain` filter until its `status` is\n`completed`.\n\nSend `type: headless` to turn a headless website (for example one created by\n`hosting_websites_start-setup` with `type: headless_empty`) into a headless WordPress\nwebsite: WordPress is installed into the `cms` directory with the Hostinger headless\nMU plugin and the website is marked as a headless WordPress website. `directory` is\nnot allowed with it. The target website must already be headless: the headless\ninstall rewrites the root `.htaccess`, so on any other website the request is\nrejected with 422.\n\nCall GET /api/hosting/v1/wordpress/installations (`wordpress_installations_list`)\nfiltered by username and domain before proceeding to check whether WordPress is\nalready installed on the target domain/path. If WordPress already exists and\n`overwrite` is false (the default), the async job will fail.\n\nThis operation is asynchronous: a successful response only means the install\njob has been queued, not that WordPress is ready. Installation typically\ntakes 1-2 minutes. Poll GET /api/hosting/v1/wordpress/installations\n(`wordpress_installations_list`) filtered by username and domain to track\nprogress. When the installation appears in that list, WordPress is ready.\n\nReturns 422 when the account already uses all the databases its plan allows,\nunless `database.name` is an existing database on the account.",
16613
16614
  "method": "POST",
16614
16615
  "path": "/api/hosting/v1/accounts/{username}/wordpress/installations",
16615
16616
  "inputSchema": {
@@ -16631,9 +16632,17 @@ const tools: OpenApiTool[] = [
16631
16632
  "type": "string",
16632
16633
  "description": "WordPress locale. Defaults to en_US when omitted."
16633
16634
  },
16635
+ "type": {
16636
+ "type": "string",
16637
+ "description": "Installation kind; `default` when omitted. `headless` installs WordPress into the `cms` directory with the Hostinger headless MU plugin and marks the website as a headless WordPress website. Accepted only for a website that is already headless, e.g. one created by `POST /api/hosting/v1/orders/{order_id}/onboardings` (`hosting_websites_start-setup`) with `type: headless_empty`; any other website is rejected with 422.",
16638
+ "enum": [
16639
+ "default",
16640
+ "headless"
16641
+ ]
16642
+ },
16634
16643
  "directory": {
16635
16644
  "type": "string",
16636
- "description": "Relative directory to install WordPress into. Defaults to the website root when omitted."
16645
+ "description": "Installation subdirectory relative to the document root; omit for the root. Not allowed with `type: headless`, which always installs into `cms`."
16637
16646
  },
16638
16647
  "overwrite": {
16639
16648
  "type": "boolean",
@@ -3018,7 +3018,7 @@ export default [
3018
3018
  "readOnlyHint": true,
3019
3019
  "destructiveHint": false
3020
3020
  },
3021
- "description": "Returns the website setups started in the last 24 hours for the hosting accounts\naccessible to the authenticated client, newest first. Narrow the list with the\n`order_id`, `subscription_id` or `domain` filters.\n\nMeant for polling right after creating a website or starting a website setup: the\nwebsite shows up in the websites list before its server-side setup has finished, and\nwhile the setup is `running` endpoints that operate on that website may respond with\n`404` or `409`. Poll this endpoint with the `domain` filter every 10 to 15 seconds and\nwait for `status: completed` before uploading files, deploying or creating databases.\n`failed` means the setup stopped before finishing or has not reported progress for\nover an hour. Setups older than 24 hours are not listed.\n\n`type` is the website type the setup was started with (`wordpress`, `headless_wordpress`,\n`headless_ecommerce`, `headless_pocketbase`), or `null` for an empty website.",
3021
+ "description": "Returns the website setups started in the last 24 hours for the hosting accounts\naccessible to the authenticated client, newest first. Narrow the list with the\n`order_id`, `subscription_id` or `domain` filters.\n\nMeant for polling right after creating a website or starting a website setup: the\nwebsite shows up in the websites list before its server-side setup has finished, and\nwhile the setup is `running` endpoints that operate on that website may respond with\n`404` or `409`. Poll this endpoint with the `domain` filter every 10 to 15 seconds and\nwait for `status: completed` before uploading files, deploying or creating databases.\n`failed` means the setup stopped before finishing or has not reported progress for\nover an hour. Setups older than 24 hours are not listed.\n\n`type` is the website type the setup was started with (`wordpress`, `headless_empty`,\n`headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`), or `null` for an empty\nwebsite.",
3022
3022
  "method": "GET",
3023
3023
  "path": "/api/hosting/v1/onboardings",
3024
3024
  "inputSchema": {
@@ -3054,7 +3054,7 @@ export default [
3054
3054
  "readOnlyHint": false,
3055
3055
  "destructiveHint": false
3056
3056
  },
3057
- "description": "Starts a website setup on a Web or Cloud hosting order and returns the created setup\nright away; the website itself is provisioned asynchronously. Poll the list website\nsetups endpoint with the `domain` filter every 10 to 15 seconds and wait for\n`status: completed` before uploading files, deploying or creating databases.\n\nOmit `type` for an empty website. `type: wordpress` installs WordPress in the website\nroot with the admin user, email and password from `wordpress`, the domain as the site\ntitle, and `en_US` when `wordpress.language` is omitted. The headless types\n(`headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`) create a headless\nwebsite; `headless_wordpress` additionally installs WordPress into the `cms` directory\nof the website root with generated credentials.\n\nOmit `domain` to set the website up on a generated temporary free subdomain.\n\nWhen the order has no hosting account yet, the setup creates one first, in the datacenter\ngiven by `datacenter_code` or the order's default datacenter when it is omitted.\nReturns 404 when the order does not exist or is not accessible to the authenticated\nclient, and 409 with a `Retry-After` header while a setup for the same domain is still\nrunning.",
3057
+ "description": "Starts a website setup on a Web or Cloud hosting order and returns the created setup\nright away; the website itself is provisioned asynchronously. Poll the list website\nsetups endpoint (`hosting_websites_list-setups`) with the `domain` filter every 10 to 15\nseconds and wait for `status: completed` before uploading files, deploying or creating\ndatabases.\n\nOmit `type` for an empty website. `type: wordpress` installs WordPress in the website\nroot with the admin user, email and password from `wordpress`, the domain as the site\ntitle, and `en_US` when `wordpress.language` is omitted. The headless types\n(`headless_empty`, `headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`)\ncreate a headless website; `headless_wordpress` additionally installs WordPress into the\n`cms` directory of the website root with generated credentials. `headless_empty` installs\nnothing: WordPress can be added later through\n`POST /api/hosting/v1/accounts/{username}/wordpress/installations`\n(`wordpress_installations_install`) with `type: headless`.\n\nOmit `domain` to set the website up on a generated temporary free subdomain. To know the\nfree subdomain before the call, so a timed-out call can be looked up and retried on the\nsame domain, generate one through `POST /api/hosting/v1/domains/free-subdomains`\n(`hosting_domains_generate-free-subdomain`) and send it as `domain`. It is accepted for\n24 hours, only from the client that generated it.\n\nWhen the order has no hosting account yet, the setup creates one first, in the datacenter\ngiven by `datacenter_code` or the order's default datacenter when it is omitted.\nReturns 404 when the order does not exist or is not accessible to the authenticated\nclient, and 409 with a `Retry-After` header while a setup for the same domain is still\nrunning.",
3058
3058
  "method": "POST",
3059
3059
  "path": "/api/hosting/v1/orders/{order_id}/onboardings",
3060
3060
  "inputSchema": {
@@ -3066,9 +3066,10 @@ export default [
3066
3066
  },
3067
3067
  "type": {
3068
3068
  "type": "string",
3069
- "description": "Website type. Omit or `null` for an empty website. `wordpress` installs WordPress in the website root and requires `wordpress`. The headless types (`headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`) create a headless website; `headless_wordpress` additionally installs WordPress into the `cms` directory with generated credentials.",
3069
+ "description": "Website type. Omit or `null` for an empty website. `wordpress` installs WordPress in the website root and requires `wordpress`. The headless types (`headless_empty`, `headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`) create a headless website; `headless_wordpress` additionally installs WordPress into the `cms` directory with generated credentials. `headless_empty` installs nothing, so WordPress can be added later through `POST /api/hosting/v1/accounts/{username}/wordpress/installations` (`wordpress_installations_install`) with `type: headless`.",
3070
3070
  "enum": [
3071
3071
  "wordpress",
3072
+ "headless_empty",
3072
3073
  "headless_wordpress",
3073
3074
  "headless_ecommerce",
3074
3075
  "headless_pocketbase"
@@ -3076,7 +3077,7 @@ export default [
3076
3077
  },
3077
3078
  "domain": {
3078
3079
  "type": "string",
3079
- "description": "Customer-owned domain. Cannot start with \"www.\" and can have at most one subdomain level, e.g. `blog.example.com`. Omit or `null` to set the website up on a generated temporary free subdomain."
3080
+ "description": "Customer-owned domain, or a free subdomain you generated through `POST /api/hosting/v1/domains/free-subdomains` (`hosting_domains_generate-free-subdomain`) in the last 24 hours. Cannot start with \"www.\" and can have at most one subdomain level, e.g. `blog.example.com`. Omit or `null` to set the website up on a generated temporary free subdomain."
3080
3081
  },
3081
3082
  "datacenter_code": {
3082
3083
  "type": "string",
@@ -3034,7 +3034,7 @@ const tools: OpenApiTool[] = [
3034
3034
  "readOnlyHint": true,
3035
3035
  "destructiveHint": false
3036
3036
  },
3037
- "description": "Returns the website setups started in the last 24 hours for the hosting accounts\naccessible to the authenticated client, newest first. Narrow the list with the\n`order_id`, `subscription_id` or `domain` filters.\n\nMeant for polling right after creating a website or starting a website setup: the\nwebsite shows up in the websites list before its server-side setup has finished, and\nwhile the setup is `running` endpoints that operate on that website may respond with\n`404` or `409`. Poll this endpoint with the `domain` filter every 10 to 15 seconds and\nwait for `status: completed` before uploading files, deploying or creating databases.\n`failed` means the setup stopped before finishing or has not reported progress for\nover an hour. Setups older than 24 hours are not listed.\n\n`type` is the website type the setup was started with (`wordpress`, `headless_wordpress`,\n`headless_ecommerce`, `headless_pocketbase`), or `null` for an empty website.",
3037
+ "description": "Returns the website setups started in the last 24 hours for the hosting accounts\naccessible to the authenticated client, newest first. Narrow the list with the\n`order_id`, `subscription_id` or `domain` filters.\n\nMeant for polling right after creating a website or starting a website setup: the\nwebsite shows up in the websites list before its server-side setup has finished, and\nwhile the setup is `running` endpoints that operate on that website may respond with\n`404` or `409`. Poll this endpoint with the `domain` filter every 10 to 15 seconds and\nwait for `status: completed` before uploading files, deploying or creating databases.\n`failed` means the setup stopped before finishing or has not reported progress for\nover an hour. Setups older than 24 hours are not listed.\n\n`type` is the website type the setup was started with (`wordpress`, `headless_empty`,\n`headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`), or `null` for an empty\nwebsite.",
3038
3038
  "method": "GET",
3039
3039
  "path": "/api/hosting/v1/onboardings",
3040
3040
  "inputSchema": {
@@ -3070,7 +3070,7 @@ const tools: OpenApiTool[] = [
3070
3070
  "readOnlyHint": false,
3071
3071
  "destructiveHint": false
3072
3072
  },
3073
- "description": "Starts a website setup on a Web or Cloud hosting order and returns the created setup\nright away; the website itself is provisioned asynchronously. Poll the list website\nsetups endpoint with the `domain` filter every 10 to 15 seconds and wait for\n`status: completed` before uploading files, deploying or creating databases.\n\nOmit `type` for an empty website. `type: wordpress` installs WordPress in the website\nroot with the admin user, email and password from `wordpress`, the domain as the site\ntitle, and `en_US` when `wordpress.language` is omitted. The headless types\n(`headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`) create a headless\nwebsite; `headless_wordpress` additionally installs WordPress into the `cms` directory\nof the website root with generated credentials.\n\nOmit `domain` to set the website up on a generated temporary free subdomain.\n\nWhen the order has no hosting account yet, the setup creates one first, in the datacenter\ngiven by `datacenter_code` or the order's default datacenter when it is omitted.\nReturns 404 when the order does not exist or is not accessible to the authenticated\nclient, and 409 with a `Retry-After` header while a setup for the same domain is still\nrunning.",
3073
+ "description": "Starts a website setup on a Web or Cloud hosting order and returns the created setup\nright away; the website itself is provisioned asynchronously. Poll the list website\nsetups endpoint (`hosting_websites_list-setups`) with the `domain` filter every 10 to 15\nseconds and wait for `status: completed` before uploading files, deploying or creating\ndatabases.\n\nOmit `type` for an empty website. `type: wordpress` installs WordPress in the website\nroot with the admin user, email and password from `wordpress`, the domain as the site\ntitle, and `en_US` when `wordpress.language` is omitted. The headless types\n(`headless_empty`, `headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`)\ncreate a headless website; `headless_wordpress` additionally installs WordPress into the\n`cms` directory of the website root with generated credentials. `headless_empty` installs\nnothing: WordPress can be added later through\n`POST /api/hosting/v1/accounts/{username}/wordpress/installations`\n(`wordpress_installations_install`) with `type: headless`.\n\nOmit `domain` to set the website up on a generated temporary free subdomain. To know the\nfree subdomain before the call, so a timed-out call can be looked up and retried on the\nsame domain, generate one through `POST /api/hosting/v1/domains/free-subdomains`\n(`hosting_domains_generate-free-subdomain`) and send it as `domain`. It is accepted for\n24 hours, only from the client that generated it.\n\nWhen the order has no hosting account yet, the setup creates one first, in the datacenter\ngiven by `datacenter_code` or the order's default datacenter when it is omitted.\nReturns 404 when the order does not exist or is not accessible to the authenticated\nclient, and 409 with a `Retry-After` header while a setup for the same domain is still\nrunning.",
3074
3074
  "method": "POST",
3075
3075
  "path": "/api/hosting/v1/orders/{order_id}/onboardings",
3076
3076
  "inputSchema": {
@@ -3082,9 +3082,10 @@ const tools: OpenApiTool[] = [
3082
3082
  },
3083
3083
  "type": {
3084
3084
  "type": "string",
3085
- "description": "Website type. Omit or `null` for an empty website. `wordpress` installs WordPress in the website root and requires `wordpress`. The headless types (`headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`) create a headless website; `headless_wordpress` additionally installs WordPress into the `cms` directory with generated credentials.",
3085
+ "description": "Website type. Omit or `null` for an empty website. `wordpress` installs WordPress in the website root and requires `wordpress`. The headless types (`headless_empty`, `headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`) create a headless website; `headless_wordpress` additionally installs WordPress into the `cms` directory with generated credentials. `headless_empty` installs nothing, so WordPress can be added later through `POST /api/hosting/v1/accounts/{username}/wordpress/installations` (`wordpress_installations_install`) with `type: headless`.",
3086
3086
  "enum": [
3087
3087
  "wordpress",
3088
+ "headless_empty",
3088
3089
  "headless_wordpress",
3089
3090
  "headless_ecommerce",
3090
3091
  "headless_pocketbase"
@@ -3092,7 +3093,7 @@ const tools: OpenApiTool[] = [
3092
3093
  },
3093
3094
  "domain": {
3094
3095
  "type": "string",
3095
- "description": "Customer-owned domain. Cannot start with \"www.\" and can have at most one subdomain level, e.g. `blog.example.com`. Omit or `null` to set the website up on a generated temporary free subdomain."
3096
+ "description": "Customer-owned domain, or a free subdomain you generated through `POST /api/hosting/v1/domains/free-subdomains` (`hosting_domains_generate-free-subdomain`) in the last 24 hours. Cannot start with \"www.\" and can have at most one subdomain level, e.g. `blog.example.com`. Omit or `null` to set the website up on a generated temporary free subdomain."
3096
3097
  },
3097
3098
  "datacenter_code": {
3098
3099
  "type": "string",
@@ -376,7 +376,7 @@ export default [
376
376
  "readOnlyHint": false,
377
377
  "destructiveHint": false
378
378
  },
379
- "description": "Install WordPress on an existing website.\n\nThe website must already exist before calling this endpoint. To create a new\nwebsite first, use POST /api/hosting/v1/websites and poll\nGET /api/hosting/v1/websites until it appears.\n\nCall GET /api/hosting/v1/wordpress/installations filtered by username and\ndomain before proceeding to check whether WordPress is already installed on\nthe target domain/path. If WordPress already exists and `overwrite` is false\n(the default), the async job will fail.\n\nThis operation is asynchronous: a successful response only means the install\njob has been queued, not that WordPress is ready. Installation typically\ntakes 1-2 minutes. Poll GET /api/hosting/v1/wordpress/installations filtered\nby username and domain to track progress. When the installation appears in\nthat list, WordPress is ready.\n\nReturns 422 when the account already uses all the databases its plan allows,\nunless `database.name` is an existing database on the account.",
379
+ "description": "Install WordPress on an existing website.\n\nThe website must already exist before calling this endpoint. To create a new\nwebsite first, use POST /api/hosting/v1/orders/{order_id}/onboardings\n(`hosting_websites_start-setup`) and poll GET /api/hosting/v1/onboardings\n(`hosting_websites_list-setups`) with the `domain` filter until its `status` is\n`completed`.\n\nSend `type: headless` to turn a headless website (for example one created by\n`hosting_websites_start-setup` with `type: headless_empty`) into a headless WordPress\nwebsite: WordPress is installed into the `cms` directory with the Hostinger headless\nMU plugin and the website is marked as a headless WordPress website. `directory` is\nnot allowed with it. The target website must already be headless: the headless\ninstall rewrites the root `.htaccess`, so on any other website the request is\nrejected with 422.\n\nCall GET /api/hosting/v1/wordpress/installations (`wordpress_installations_list`)\nfiltered by username and domain before proceeding to check whether WordPress is\nalready installed on the target domain/path. If WordPress already exists and\n`overwrite` is false (the default), the async job will fail.\n\nThis operation is asynchronous: a successful response only means the install\njob has been queued, not that WordPress is ready. Installation typically\ntakes 1-2 minutes. Poll GET /api/hosting/v1/wordpress/installations\n(`wordpress_installations_list`) filtered by username and domain to track\nprogress. When the installation appears in that list, WordPress is ready.\n\nReturns 422 when the account already uses all the databases its plan allows,\nunless `database.name` is an existing database on the account.",
380
380
  "method": "POST",
381
381
  "path": "/api/hosting/v1/accounts/{username}/wordpress/installations",
382
382
  "inputSchema": {
@@ -398,9 +398,17 @@ export default [
398
398
  "type": "string",
399
399
  "description": "WordPress locale. Defaults to en_US when omitted."
400
400
  },
401
+ "type": {
402
+ "type": "string",
403
+ "description": "Installation kind; `default` when omitted. `headless` installs WordPress into the `cms` directory with the Hostinger headless MU plugin and marks the website as a headless WordPress website. Accepted only for a website that is already headless, e.g. one created by `POST /api/hosting/v1/orders/{order_id}/onboardings` (`hosting_websites_start-setup`) with `type: headless_empty`; any other website is rejected with 422.",
404
+ "enum": [
405
+ "default",
406
+ "headless"
407
+ ]
408
+ },
401
409
  "directory": {
402
410
  "type": "string",
403
- "description": "Relative directory to install WordPress into. Defaults to the website root when omitted."
411
+ "description": "Installation subdirectory relative to the document root; omit for the root. Not allowed with `type: headless`, which always installs into `cms`."
404
412
  },
405
413
  "overwrite": {
406
414
  "type": "boolean",
@@ -392,7 +392,7 @@ const tools: OpenApiTool[] = [
392
392
  "readOnlyHint": false,
393
393
  "destructiveHint": false
394
394
  },
395
- "description": "Install WordPress on an existing website.\n\nThe website must already exist before calling this endpoint. To create a new\nwebsite first, use POST /api/hosting/v1/websites and poll\nGET /api/hosting/v1/websites until it appears.\n\nCall GET /api/hosting/v1/wordpress/installations filtered by username and\ndomain before proceeding to check whether WordPress is already installed on\nthe target domain/path. If WordPress already exists and `overwrite` is false\n(the default), the async job will fail.\n\nThis operation is asynchronous: a successful response only means the install\njob has been queued, not that WordPress is ready. Installation typically\ntakes 1-2 minutes. Poll GET /api/hosting/v1/wordpress/installations filtered\nby username and domain to track progress. When the installation appears in\nthat list, WordPress is ready.\n\nReturns 422 when the account already uses all the databases its plan allows,\nunless `database.name` is an existing database on the account.",
395
+ "description": "Install WordPress on an existing website.\n\nThe website must already exist before calling this endpoint. To create a new\nwebsite first, use POST /api/hosting/v1/orders/{order_id}/onboardings\n(`hosting_websites_start-setup`) and poll GET /api/hosting/v1/onboardings\n(`hosting_websites_list-setups`) with the `domain` filter until its `status` is\n`completed`.\n\nSend `type: headless` to turn a headless website (for example one created by\n`hosting_websites_start-setup` with `type: headless_empty`) into a headless WordPress\nwebsite: WordPress is installed into the `cms` directory with the Hostinger headless\nMU plugin and the website is marked as a headless WordPress website. `directory` is\nnot allowed with it. The target website must already be headless: the headless\ninstall rewrites the root `.htaccess`, so on any other website the request is\nrejected with 422.\n\nCall GET /api/hosting/v1/wordpress/installations (`wordpress_installations_list`)\nfiltered by username and domain before proceeding to check whether WordPress is\nalready installed on the target domain/path. If WordPress already exists and\n`overwrite` is false (the default), the async job will fail.\n\nThis operation is asynchronous: a successful response only means the install\njob has been queued, not that WordPress is ready. Installation typically\ntakes 1-2 minutes. Poll GET /api/hosting/v1/wordpress/installations\n(`wordpress_installations_list`) filtered by username and domain to track\nprogress. When the installation appears in that list, WordPress is ready.\n\nReturns 422 when the account already uses all the databases its plan allows,\nunless `database.name` is an existing database on the account.",
396
396
  "method": "POST",
397
397
  "path": "/api/hosting/v1/accounts/{username}/wordpress/installations",
398
398
  "inputSchema": {
@@ -414,9 +414,17 @@ const tools: OpenApiTool[] = [
414
414
  "type": "string",
415
415
  "description": "WordPress locale. Defaults to en_US when omitted."
416
416
  },
417
+ "type": {
418
+ "type": "string",
419
+ "description": "Installation kind; `default` when omitted. `headless` installs WordPress into the `cms` directory with the Hostinger headless MU plugin and marks the website as a headless WordPress website. Accepted only for a website that is already headless, e.g. one created by `POST /api/hosting/v1/orders/{order_id}/onboardings` (`hosting_websites_start-setup`) with `type: headless_empty`; any other website is rejected with 422.",
420
+ "enum": [
421
+ "default",
422
+ "headless"
423
+ ]
424
+ },
417
425
  "directory": {
418
426
  "type": "string",
419
- "description": "Relative directory to install WordPress into. Defaults to the website root when omitted."
427
+ "description": "Installation subdirectory relative to the document root; omit for the root. Not allowed with `type: headless`, which always installs into `cms`."
420
428
  },
421
429
  "overwrite": {
422
430
  "type": "boolean",
@@ -4,4 +4,4 @@ import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/agency-hosting.js';
5
5
  import instructions from '../core/instructions.agency-hosting.js';
6
6
 
7
- startServer({ name: 'hostinger-agency-hosting-mcp', version: '3.2.0', tools, instructions });
7
+ startServer({ name: 'hostinger-agency-hosting-mcp', version: '3.2.1', tools, instructions });
@@ -4,4 +4,4 @@ import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/agency-hosting.js';
5
5
  import instructions from '../core/instructions.agency-hosting.js';
6
6
 
7
- startServer({ name: 'hostinger-agency-hosting-mcp', version: '3.2.0', tools, instructions });
7
+ startServer({ name: 'hostinger-agency-hosting-mcp', version: '3.2.1', tools, instructions });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/agent-readiness.js';
5
5
 
6
- startServer({ name: 'hostinger-agent-readiness-mcp', version: '3.2.0', tools });
6
+ startServer({ name: 'hostinger-agent-readiness-mcp', version: '3.2.1', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/agent-readiness.js';
5
5
 
6
- startServer({ name: 'hostinger-agent-readiness-mcp', version: '3.2.0', tools });
6
+ startServer({ name: 'hostinger-agent-readiness-mcp', version: '3.2.1', tools });
@@ -5,4 +5,4 @@ import tools from '../core/tools/all.js';
5
5
  import instructions from '../core/instructions.js';
6
6
  import skills from '../core/skills.js';
7
7
 
8
- startServer({ name: 'hostinger-api-mcp', version: '3.2.0', tools, instructions, skills });
8
+ startServer({ name: 'hostinger-api-mcp', version: '3.2.1', tools, instructions, skills });
@@ -5,4 +5,4 @@ import tools from '../core/tools/all.js';
5
5
  import instructions from '../core/instructions.js';
6
6
  import skills from '../core/skills.js';
7
7
 
8
- startServer({ name: 'hostinger-api-mcp', version: '3.2.0', tools, instructions, skills });
8
+ startServer({ name: 'hostinger-api-mcp', version: '3.2.1', tools, instructions, skills });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/billing.js';
5
5
 
6
- startServer({ name: 'hostinger-billing-mcp', version: '3.2.0', tools });
6
+ startServer({ name: 'hostinger-billing-mcp', version: '3.2.1', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/billing.js';
5
5
 
6
- startServer({ name: 'hostinger-billing-mcp', version: '3.2.0', tools });
6
+ startServer({ name: 'hostinger-billing-mcp', version: '3.2.1', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/dns.js';
5
5
 
6
- startServer({ name: 'hostinger-dns-mcp', version: '3.2.0', tools });
6
+ startServer({ name: 'hostinger-dns-mcp', version: '3.2.1', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/dns.js';
5
5
 
6
- startServer({ name: 'hostinger-dns-mcp', version: '3.2.0', tools });
6
+ startServer({ name: 'hostinger-dns-mcp', version: '3.2.1', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/domains.js';
5
5
 
6
- startServer({ name: 'hostinger-domains-mcp', version: '3.2.0', tools });
6
+ startServer({ name: 'hostinger-domains-mcp', version: '3.2.1', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/domains.js';
5
5
 
6
- startServer({ name: 'hostinger-domains-mcp', version: '3.2.0', tools });
6
+ startServer({ name: 'hostinger-domains-mcp', version: '3.2.1', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/ecommerce.js';
5
5
 
6
- startServer({ name: 'hostinger-ecommerce-mcp', version: '3.2.0', tools });
6
+ startServer({ name: 'hostinger-ecommerce-mcp', version: '3.2.1', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/ecommerce.js';
5
5
 
6
- startServer({ name: 'hostinger-ecommerce-mcp', version: '3.2.0', tools });
6
+ startServer({ name: 'hostinger-ecommerce-mcp', version: '3.2.1', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/horizons.js';
5
5
 
6
- startServer({ name: 'hostinger-horizons-mcp', version: '3.2.0', tools });
6
+ startServer({ name: 'hostinger-horizons-mcp', version: '3.2.1', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/horizons.js';
5
5
 
6
- startServer({ name: 'hostinger-horizons-mcp', version: '3.2.0', tools });
6
+ startServer({ name: 'hostinger-horizons-mcp', version: '3.2.1', tools });
@@ -4,4 +4,4 @@ import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/hosting.js';
5
5
  import instructions from '../core/instructions.js';
6
6
 
7
- startServer({ name: 'hostinger-hosting-mcp', version: '3.2.0', tools, instructions });
7
+ startServer({ name: 'hostinger-hosting-mcp', version: '3.2.1', tools, instructions });
@@ -4,4 +4,4 @@ import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/hosting.js';
5
5
  import instructions from '../core/instructions.js';
6
6
 
7
- startServer({ name: 'hostinger-hosting-mcp', version: '3.2.0', tools, instructions });
7
+ startServer({ name: 'hostinger-hosting-mcp', version: '3.2.1', tools, instructions });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/mail.js';
5
5
 
6
- startServer({ name: 'hostinger-mail-mcp', version: '3.2.0', tools });
6
+ startServer({ name: 'hostinger-mail-mcp', version: '3.2.1', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/mail.js';
5
5
 
6
- startServer({ name: 'hostinger-mail-mcp', version: '3.2.0', tools });
6
+ startServer({ name: 'hostinger-mail-mcp', version: '3.2.1', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/reach.js';
5
5
 
6
- startServer({ name: 'hostinger-reach-mcp', version: '3.2.0', tools });
6
+ startServer({ name: 'hostinger-reach-mcp', version: '3.2.1', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/reach.js';
5
5
 
6
- startServer({ name: 'hostinger-reach-mcp', version: '3.2.0', tools });
6
+ startServer({ name: 'hostinger-reach-mcp', version: '3.2.1', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/vps.js';
5
5
 
6
- startServer({ name: 'hostinger-vps-mcp', version: '3.2.0', tools });
6
+ startServer({ name: 'hostinger-vps-mcp', version: '3.2.1', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/vps.js';
5
5
 
6
- startServer({ name: 'hostinger-vps-mcp', version: '3.2.0', tools });
6
+ startServer({ name: 'hostinger-vps-mcp', version: '3.2.1', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/wordpress.js';
5
5
 
6
- startServer({ name: 'hostinger-wordpress-mcp', version: '3.2.0', tools });
6
+ startServer({ name: 'hostinger-wordpress-mcp', version: '3.2.1', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/wordpress.js';
5
5
 
6
- startServer({ name: 'hostinger-wordpress-mcp', version: '3.2.0', tools });
6
+ startServer({ name: 'hostinger-wordpress-mcp', version: '3.2.1', tools });
package/types.d.ts CHANGED
@@ -4957,8 +4957,9 @@ wait for `status: completed` before uploading files, deploying or creating datab
4957
4957
  `failed` means the setup stopped before finishing or has not reported progress for
4958
4958
  over an hour. Setups older than 24 hours are not listed.
4959
4959
 
4960
- `type` is the website type the setup was started with (`wordpress`, `headless_wordpress`,
4961
- `headless_ecommerce`, `headless_pocketbase`), or `null` for an empty website.
4960
+ `type` is the website type the setup was started with (`wordpress`, `headless_empty`,
4961
+ `headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`), or `null` for an empty
4962
+ website.
4962
4963
  */
4963
4964
  "hosting_websites_list-setups": {
4964
4965
  params: {
@@ -4981,17 +4982,25 @@ over an hour. Setups older than 24 hours are not listed.
4981
4982
  /**
4982
4983
  * Starts a website setup on a Web or Cloud hosting order and returns the created setup
4983
4984
  right away; the website itself is provisioned asynchronously. Poll the list website
4984
- setups endpoint with the `domain` filter every 10 to 15 seconds and wait for
4985
- `status: completed` before uploading files, deploying or creating databases.
4985
+ setups endpoint (`hosting_websites_list-setups`) with the `domain` filter every 10 to 15
4986
+ seconds and wait for `status: completed` before uploading files, deploying or creating
4987
+ databases.
4986
4988
 
4987
4989
  Omit `type` for an empty website. `type: wordpress` installs WordPress in the website
4988
4990
  root with the admin user, email and password from `wordpress`, the domain as the site
4989
4991
  title, and `en_US` when `wordpress.language` is omitted. The headless types
4990
- (`headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`) create a headless
4991
- website; `headless_wordpress` additionally installs WordPress into the `cms` directory
4992
- of the website root with generated credentials.
4993
-
4994
- Omit `domain` to set the website up on a generated temporary free subdomain.
4992
+ (`headless_empty`, `headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`)
4993
+ create a headless website; `headless_wordpress` additionally installs WordPress into the
4994
+ `cms` directory of the website root with generated credentials. `headless_empty` installs
4995
+ nothing: WordPress can be added later through
4996
+ `POST /api/hosting/v1/accounts/{username}/wordpress/installations`
4997
+ (`wordpress_installations_install`) with `type: headless`.
4998
+
4999
+ Omit `domain` to set the website up on a generated temporary free subdomain. To know the
5000
+ free subdomain before the call, so a timed-out call can be looked up and retried on the
5001
+ same domain, generate one through `POST /api/hosting/v1/domains/free-subdomains`
5002
+ (`hosting_domains_generate-free-subdomain`) and send it as `domain`. It is accepted for
5003
+ 24 hours, only from the client that generated it.
4995
5004
 
4996
5005
  When the order has no hosting account yet, the setup creates one first, in the datacenter
4997
5006
  given by `datacenter_code` or the order's default datacenter when it is omitted.
@@ -5006,11 +5015,11 @@ running.
5006
5015
  */
5007
5016
  order_id: number;
5008
5017
  /**
5009
- * Website type. Omit or `null` for an empty website. `wordpress` installs WordPress in the website root and requires `wordpress`. The headless types (`headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`) create a headless website; `headless_wordpress` additionally installs WordPress into the `cms` directory with generated credentials.
5018
+ * Website type. Omit or `null` for an empty website. `wordpress` installs WordPress in the website root and requires `wordpress`. The headless types (`headless_empty`, `headless_wordpress`, `headless_ecommerce`, `headless_pocketbase`) create a headless website; `headless_wordpress` additionally installs WordPress into the `cms` directory with generated credentials. `headless_empty` installs nothing, so WordPress can be added later through `POST /api/hosting/v1/accounts/{username}/wordpress/installations` (`wordpress_installations_install`) with `type: headless`.
5010
5019
  */
5011
5020
  type?: string;
5012
5021
  /**
5013
- * Customer-owned domain. Cannot start with "www." and can have at most one subdomain level, e.g. `blog.example.com`. Omit or `null` to set the website up on a generated temporary free subdomain.
5022
+ * Customer-owned domain, or a free subdomain you generated through `POST /api/hosting/v1/domains/free-subdomains` (`hosting_domains_generate-free-subdomain`) in the last 24 hours. Cannot start with "www." and can have at most one subdomain level, e.g. `blog.example.com`. Omit or `null` to set the website up on a generated temporary free subdomain.
5014
5023
  */
5015
5024
  domain?: string;
5016
5025
  /**
@@ -9666,19 +9675,29 @@ database files that have been uploaded to the website's directory.
9666
9675
  * Install WordPress on an existing website.
9667
9676
 
9668
9677
  The website must already exist before calling this endpoint. To create a new
9669
- website first, use POST /api/hosting/v1/websites and poll
9670
- GET /api/hosting/v1/websites until it appears.
9671
-
9672
- Call GET /api/hosting/v1/wordpress/installations filtered by username and
9673
- domain before proceeding to check whether WordPress is already installed on
9674
- the target domain/path. If WordPress already exists and `overwrite` is false
9675
- (the default), the async job will fail.
9678
+ website first, use POST /api/hosting/v1/orders/{order_id}/onboardings
9679
+ (`hosting_websites_start-setup`) and poll GET /api/hosting/v1/onboardings
9680
+ (`hosting_websites_list-setups`) with the `domain` filter until its `status` is
9681
+ `completed`.
9682
+
9683
+ Send `type: headless` to turn a headless website (for example one created by
9684
+ `hosting_websites_start-setup` with `type: headless_empty`) into a headless WordPress
9685
+ website: WordPress is installed into the `cms` directory with the Hostinger headless
9686
+ MU plugin and the website is marked as a headless WordPress website. `directory` is
9687
+ not allowed with it. The target website must already be headless: the headless
9688
+ install rewrites the root `.htaccess`, so on any other website the request is
9689
+ rejected with 422.
9690
+
9691
+ Call GET /api/hosting/v1/wordpress/installations (`wordpress_installations_list`)
9692
+ filtered by username and domain before proceeding to check whether WordPress is
9693
+ already installed on the target domain/path. If WordPress already exists and
9694
+ `overwrite` is false (the default), the async job will fail.
9676
9695
 
9677
9696
  This operation is asynchronous: a successful response only means the install
9678
9697
  job has been queued, not that WordPress is ready. Installation typically
9679
- takes 1-2 minutes. Poll GET /api/hosting/v1/wordpress/installations filtered
9680
- by username and domain to track progress. When the installation appears in
9681
- that list, WordPress is ready.
9698
+ takes 1-2 minutes. Poll GET /api/hosting/v1/wordpress/installations
9699
+ (`wordpress_installations_list`) filtered by username and domain to track
9700
+ progress. When the installation appears in that list, WordPress is ready.
9682
9701
 
9683
9702
  Returns 422 when the account already uses all the databases its plan allows,
9684
9703
  unless `database.name` is an existing database on the account.
@@ -9702,7 +9721,11 @@ unless `database.name` is an existing database on the account.
9702
9721
  */
9703
9722
  language?: string;
9704
9723
  /**
9705
- * Relative directory to install WordPress into. Defaults to the website root when omitted.
9724
+ * Installation kind; `default` when omitted. `headless` installs WordPress into the `cms` directory with the Hostinger headless MU plugin and marks the website as a headless WordPress website. Accepted only for a website that is already headless, e.g. one created by `POST /api/hosting/v1/orders/{order_id}/onboardings` (`hosting_websites_start-setup`) with `type: headless_empty`; any other website is rejected with 422.
9725
+ */
9726
+ type?: string;
9727
+ /**
9728
+ * Installation subdirectory relative to the document root; omit for the root. Not allowed with `type: headless`, which always installs into `cms`.
9706
9729
  */
9707
9730
  directory?: string;
9708
9731
  /**