hostinger-api-mcp 1.60.1 → 1.61.0
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 +33 -0
- package/README.md +113 -14
- package/gemini-extension.json +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
- package/src/core/runtime.js +1 -1
- package/src/core/runtime.ts +1 -1
- package/src/core/tools/all.js +305 -6
- package/src/core/tools/all.ts +305 -6
- package/src/core/tools/hosting.js +305 -6
- package/src/core/tools/hosting.ts +305 -6
- package/src/servers/agency-hosting.js +1 -1
- package/src/servers/agency-hosting.ts +1 -1
- package/src/servers/all.js +1 -1
- package/src/servers/all.ts +1 -1
- package/src/servers/billing.js +1 -1
- package/src/servers/billing.ts +1 -1
- package/src/servers/dns.js +1 -1
- package/src/servers/dns.ts +1 -1
- package/src/servers/domains.js +1 -1
- package/src/servers/domains.ts +1 -1
- package/src/servers/ecommerce.js +1 -1
- package/src/servers/ecommerce.ts +1 -1
- package/src/servers/horizons.js +1 -1
- package/src/servers/horizons.ts +1 -1
- package/src/servers/hosting.js +1 -1
- package/src/servers/hosting.ts +1 -1
- package/src/servers/mail.js +1 -1
- package/src/servers/mail.ts +1 -1
- package/src/servers/reach.js +1 -1
- package/src/servers/reach.ts +1 -1
- package/src/servers/vps.js +1 -1
- package/src/servers/vps.ts +1 -1
- package/src/servers/wordpress.js +1 -1
- package/src/servers/wordpress.ts +1 -1
- package/types.d.ts +216 -14
|
@@ -1396,6 +1396,141 @@ export default [
|
|
|
1396
1396
|
],
|
|
1397
1397
|
"group": "hosting"
|
|
1398
1398
|
},
|
|
1399
|
+
{
|
|
1400
|
+
"name": "hosting_getGitAutoDeploymentSettingsV1",
|
|
1401
|
+
"title": "Get Git auto-deployment settings",
|
|
1402
|
+
"annotations": {
|
|
1403
|
+
"title": "Get Git auto-deployment settings",
|
|
1404
|
+
"readOnlyHint": true,
|
|
1405
|
+
"destructiveHint": false
|
|
1406
|
+
},
|
|
1407
|
+
"description": "Returns the Git auto-deployment settings of the website: which repository and branch deploy\ninto which directory, and whether pushes trigger a deployment. `is_enabled` false keeps the\nrepository link but ignores pushes.\n\nWhen the website has no auto-deployment configured every field is null. Save settings with\n`Update Git auto-deployment settings`.",
|
|
1408
|
+
"method": "GET",
|
|
1409
|
+
"path": "/api/hosting/v1/accounts/{username}/websites/{domain}/git/auto-deployments/settings",
|
|
1410
|
+
"inputSchema": {
|
|
1411
|
+
"type": "object",
|
|
1412
|
+
"properties": {
|
|
1413
|
+
"username": {
|
|
1414
|
+
"type": "string",
|
|
1415
|
+
"description": "username parameter"
|
|
1416
|
+
},
|
|
1417
|
+
"domain": {
|
|
1418
|
+
"type": "string",
|
|
1419
|
+
"description": "Domain name"
|
|
1420
|
+
}
|
|
1421
|
+
},
|
|
1422
|
+
"required": [
|
|
1423
|
+
"username",
|
|
1424
|
+
"domain"
|
|
1425
|
+
]
|
|
1426
|
+
},
|
|
1427
|
+
"security": [
|
|
1428
|
+
{
|
|
1429
|
+
"apiToken": []
|
|
1430
|
+
}
|
|
1431
|
+
],
|
|
1432
|
+
"group": "hosting"
|
|
1433
|
+
},
|
|
1434
|
+
{
|
|
1435
|
+
"name": "hosting_updateGitAutoDeploymentSettingsV1",
|
|
1436
|
+
"title": "Update Git auto-deployment settings",
|
|
1437
|
+
"annotations": {
|
|
1438
|
+
"title": "Update Git auto-deployment settings",
|
|
1439
|
+
"readOnlyHint": false,
|
|
1440
|
+
"destructiveHint": true,
|
|
1441
|
+
"idempotentHint": true
|
|
1442
|
+
},
|
|
1443
|
+
"description": "Creates or replaces the Git auto-deployment settings of the website: repository, branch, the\ndirectory under the document root to deploy into, and `is_enabled`. Send the full set;\n`is_enabled` defaults to true and `directory` to the document root. `installation_uuid` must\nbe an installation from `List Git installations` that belongs to the same customer as the\nwebsite.\n\nFor PHP and static websites, saving with `is_enabled` true deploys the branch right away and\nevery later push to that branch deploys again. For Node.js and Website Builder websites saving\ndoes not clone anything. On a Node.js website start the first deploy with\n`Start Node.js build` using `source_type` `git`; pushes then trigger new builds with the build\nsettings stored for the website.",
|
|
1444
|
+
"method": "PUT",
|
|
1445
|
+
"path": "/api/hosting/v1/accounts/{username}/websites/{domain}/git/auto-deployments/settings",
|
|
1446
|
+
"inputSchema": {
|
|
1447
|
+
"type": "object",
|
|
1448
|
+
"properties": {
|
|
1449
|
+
"username": {
|
|
1450
|
+
"type": "string",
|
|
1451
|
+
"description": "username parameter"
|
|
1452
|
+
},
|
|
1453
|
+
"domain": {
|
|
1454
|
+
"type": "string",
|
|
1455
|
+
"description": "Domain name"
|
|
1456
|
+
},
|
|
1457
|
+
"installation_uuid": {
|
|
1458
|
+
"type": "string",
|
|
1459
|
+
"description": "Active Git installation from `List Git installations`"
|
|
1460
|
+
},
|
|
1461
|
+
"owner": {
|
|
1462
|
+
"type": "string",
|
|
1463
|
+
"description": "Repository owner login, as returned by `List Git installation repositories`. GitLab group\npaths use slashes."
|
|
1464
|
+
},
|
|
1465
|
+
"repository": {
|
|
1466
|
+
"type": "string",
|
|
1467
|
+
"description": "Repository name without the .git suffix"
|
|
1468
|
+
},
|
|
1469
|
+
"branch": {
|
|
1470
|
+
"type": "string",
|
|
1471
|
+
"description": "Branch to deploy"
|
|
1472
|
+
},
|
|
1473
|
+
"directory": {
|
|
1474
|
+
"type": "string",
|
|
1475
|
+
"description": "Subdirectory under the website document root to deploy into. Empty, null or omitted means\nthe document root."
|
|
1476
|
+
},
|
|
1477
|
+
"is_enabled": {
|
|
1478
|
+
"type": "boolean",
|
|
1479
|
+
"description": "Whether pushes to the branch deploy automatically"
|
|
1480
|
+
}
|
|
1481
|
+
},
|
|
1482
|
+
"required": [
|
|
1483
|
+
"username",
|
|
1484
|
+
"domain",
|
|
1485
|
+
"installation_uuid",
|
|
1486
|
+
"owner",
|
|
1487
|
+
"repository",
|
|
1488
|
+
"branch"
|
|
1489
|
+
]
|
|
1490
|
+
},
|
|
1491
|
+
"security": [
|
|
1492
|
+
{
|
|
1493
|
+
"apiToken": []
|
|
1494
|
+
}
|
|
1495
|
+
],
|
|
1496
|
+
"group": "hosting"
|
|
1497
|
+
},
|
|
1498
|
+
{
|
|
1499
|
+
"name": "hosting_deleteGitAutoDeploymentSettingsV1",
|
|
1500
|
+
"title": "Delete Git auto-deployment settings",
|
|
1501
|
+
"annotations": {
|
|
1502
|
+
"title": "Delete Git auto-deployment settings",
|
|
1503
|
+
"readOnlyHint": false,
|
|
1504
|
+
"destructiveHint": true,
|
|
1505
|
+
"idempotentHint": true
|
|
1506
|
+
},
|
|
1507
|
+
"description": "Removes the Git auto-deployment settings of the website. Files already deployed stay on the\nwebsite; pushes stop deploying until settings are saved again. Succeeds also when nothing is\nconfigured.",
|
|
1508
|
+
"method": "DELETE",
|
|
1509
|
+
"path": "/api/hosting/v1/accounts/{username}/websites/{domain}/git/auto-deployments/settings",
|
|
1510
|
+
"inputSchema": {
|
|
1511
|
+
"type": "object",
|
|
1512
|
+
"properties": {
|
|
1513
|
+
"username": {
|
|
1514
|
+
"type": "string",
|
|
1515
|
+
"description": "username parameter"
|
|
1516
|
+
},
|
|
1517
|
+
"domain": {
|
|
1518
|
+
"type": "string",
|
|
1519
|
+
"description": "Domain name"
|
|
1520
|
+
}
|
|
1521
|
+
},
|
|
1522
|
+
"required": [
|
|
1523
|
+
"username",
|
|
1524
|
+
"domain"
|
|
1525
|
+
]
|
|
1526
|
+
},
|
|
1527
|
+
"security": [
|
|
1528
|
+
{
|
|
1529
|
+
"apiToken": []
|
|
1530
|
+
}
|
|
1531
|
+
],
|
|
1532
|
+
"group": "hosting"
|
|
1533
|
+
},
|
|
1399
1534
|
{
|
|
1400
1535
|
"name": "hosting_listGitInstallationsV1",
|
|
1401
1536
|
"title": "List Git installations",
|
|
@@ -1404,7 +1539,7 @@ export default [
|
|
|
1404
1539
|
"readOnlyHint": true,
|
|
1405
1540
|
"destructiveHint": false
|
|
1406
1541
|
},
|
|
1407
|
-
"description": "Lists the Git provider accounts the customer has connected. Only installations with status\n`active` are returned unless the `status` filter says otherwise.\n\nAn empty list means the customer has no active installation. Check `status=suspended` and\n`status=pending` as well. If there is none at all, GitHub has to be
|
|
1542
|
+
"description": "Lists the Git provider accounts the customer has connected. Only installations with status\n`active` are returned unless the `status` filter says otherwise.\n\nAn empty list means the customer has no active installation. Check `status=suspended` and\n`status=pending` as well. If there is none at all, a Git provider (GitHub or GitLab) has to be\nconnected once in hPanel (Websites, Manage, Advanced, Git; or Add Website, Node.js Web App,\nImport Git Repository); this endpoint then lists the new installation.\n\nUse `uuid` as the path parameter of `List Git installation repositories`, and as\n`installation_uuid` in `Start Node.js build` with `source_type` `git` and in\n`Update Git auto-deployment settings`.",
|
|
1408
1543
|
"method": "GET",
|
|
1409
1544
|
"path": "/api/hosting/v1/git/installations",
|
|
1410
1545
|
"inputSchema": {
|
|
@@ -1446,7 +1581,7 @@ export default [
|
|
|
1446
1581
|
"readOnlyHint": true,
|
|
1447
1582
|
"destructiveHint": false
|
|
1448
1583
|
},
|
|
1449
|
-
"description": "Lists the repositories the Git installation can access, read live from the provider. Works\nfor github and gitlab installations. Use an active installation: a suspended or pending one\nis still queried and the call fails with whatever the provider answers. The list is cut at\nthe first 500 repositories in the order the provider returns them; when the account has\nmore, name the repository directly instead of searching this list.\n\n`owner`, `name` and `default_branch`
|
|
1584
|
+
"description": "Lists the repositories the Git installation can access, read live from the provider. Works\nfor github and gitlab installations. Use an active installation: a suspended or pending one\nis still queried and the call fails with whatever the provider answers. The list is cut at\nthe first 500 repositories in the order the provider returns them; when the account has\nmore, name the repository directly instead of searching this list.\n\n`owner`, `name` and a branch (`default_branch` or another one) go into `source_options` of\n`Start Node.js build` or into `Update Git auto-deployment settings`. Returns 404 when the\ninstallation does not belong to the customer. Limited to 10 calls per minute per API client\n(429 above that).",
|
|
1450
1585
|
"method": "GET",
|
|
1451
1586
|
"path": "/api/hosting/v1/git/installations/{uuid}/repositories",
|
|
1452
1587
|
"inputSchema": {
|
|
@@ -1533,7 +1668,7 @@ export default [
|
|
|
1533
1668
|
"readOnlyHint": false,
|
|
1534
1669
|
"destructiveHint": false
|
|
1535
1670
|
},
|
|
1536
|
-
"description": "Start a Node.js build process using files already present on the website's file storage.\n\nWARNING: on success this overwrites the website's existing contents and cannot be\nundone — verify this is intended before calling this endpoint.\n\
|
|
1671
|
+
"description": "Start a Node.js build process using files already present on the website's file storage.\n\nWARNING: on success this overwrites the website's existing contents and cannot be\nundone — verify this is intended before calling this endpoint.\n\nWith `source_type` `archive`, `source_options.archive_path` must point to an existing\narchive file on the server (relative to the website document root). Use the\n`Generate Upload URL` endpoint to obtain credentials and upload the archive first. To\nauto-detect build settings from an archive before starting, first call the\n`Get Node.js Build Settings from Archive` endpoint.\n\nWith `source_type` `git`, `source_options` carries `owner`, `repository`, `branch` and\n`installation_uuid`. Take the installation from `List Git installations` and the owner and\nrepository from `List Git installation repositories`; the branch is cloned at its current\nhead. The installation must belong to the same customer as the website.\n\nThe returned build `uuid` can be used to poll progress and retrieve logs via\nthe `Get Node.js Build Logs` endpoint.",
|
|
1537
1672
|
"method": "POST",
|
|
1538
1673
|
"path": "/api/hosting/v1/accounts/{username}/websites/{domain}/nodejs/builds",
|
|
1539
1674
|
"inputSchema": {
|
|
@@ -1609,18 +1744,35 @@ export default [
|
|
|
1609
1744
|
},
|
|
1610
1745
|
"source_type": {
|
|
1611
1746
|
"type": "string",
|
|
1612
|
-
"description": "
|
|
1747
|
+
"description": "Where the files come from: `archive` (an uploaded archive on the website) or `git`\n(a branch of a repository reachable through a Git installation).",
|
|
1613
1748
|
"enum": [
|
|
1614
|
-
"archive"
|
|
1749
|
+
"archive",
|
|
1750
|
+
"git"
|
|
1615
1751
|
]
|
|
1616
1752
|
},
|
|
1617
1753
|
"source_options": {
|
|
1618
1754
|
"type": "object",
|
|
1619
|
-
"description": "Source-specific options",
|
|
1755
|
+
"description": "Source-specific options. For `archive` send `archive_path`. For `git` send `owner`,\n`repository`, `branch` and `installation_uuid`, taken from `List Git installations`\nand `List Git installation repositories`.",
|
|
1620
1756
|
"properties": {
|
|
1621
1757
|
"archive_path": {
|
|
1622
1758
|
"type": "string",
|
|
1623
1759
|
"description": "The path to the archive file relative to the document root of the vhost (required if source is \"archive\")"
|
|
1760
|
+
},
|
|
1761
|
+
"owner": {
|
|
1762
|
+
"type": "string",
|
|
1763
|
+
"description": "Repository owner login (required if source is \"git\"). GitLab group paths use\nslashes."
|
|
1764
|
+
},
|
|
1765
|
+
"repository": {
|
|
1766
|
+
"type": "string",
|
|
1767
|
+
"description": "Repository name without the .git suffix (required if source is \"git\")"
|
|
1768
|
+
},
|
|
1769
|
+
"branch": {
|
|
1770
|
+
"type": "string",
|
|
1771
|
+
"description": "Branch to build (required if source is \"git\")"
|
|
1772
|
+
},
|
|
1773
|
+
"installation_uuid": {
|
|
1774
|
+
"type": "string",
|
|
1775
|
+
"description": "Git installation used to access the repository (required if source is \"git\")"
|
|
1624
1776
|
}
|
|
1625
1777
|
}
|
|
1626
1778
|
}
|
|
@@ -2692,6 +2844,153 @@ export default [
|
|
|
2692
2844
|
],
|
|
2693
2845
|
"group": "hosting"
|
|
2694
2846
|
},
|
|
2847
|
+
{
|
|
2848
|
+
"name": "hosting_installSSLV1",
|
|
2849
|
+
"title": "Install SSL",
|
|
2850
|
+
"annotations": {
|
|
2851
|
+
"title": "Install SSL",
|
|
2852
|
+
"readOnlyHint": false,
|
|
2853
|
+
"destructiveHint": false
|
|
2854
|
+
},
|
|
2855
|
+
"description": "Requests a lifetime SSL certificate for the website. The installation runs in the background;\n`Get SSL status` reports `active` or `failed` when it ends. An `active` lifetime certificate\ndoes not block the request: a new installation is requested, which is how a certificate is\nreinstalled.\n\nReturns 422 for free subdomains (their certificate is managed by the platform), while an\ninstallation is `installing` or `waiting_for_retry`, when the website's certificate was\nrevoked (it cannot be reissued), and when an uploaded custom certificate is installed; that\none has to be uninstalled first.",
|
|
2856
|
+
"method": "POST",
|
|
2857
|
+
"path": "/api/hosting/v1/accounts/{username}/websites/{domain}/ssl/setup",
|
|
2858
|
+
"inputSchema": {
|
|
2859
|
+
"type": "object",
|
|
2860
|
+
"properties": {
|
|
2861
|
+
"username": {
|
|
2862
|
+
"type": "string",
|
|
2863
|
+
"description": "username parameter"
|
|
2864
|
+
},
|
|
2865
|
+
"domain": {
|
|
2866
|
+
"type": "string",
|
|
2867
|
+
"description": "Domain name"
|
|
2868
|
+
}
|
|
2869
|
+
},
|
|
2870
|
+
"required": [
|
|
2871
|
+
"username",
|
|
2872
|
+
"domain"
|
|
2873
|
+
]
|
|
2874
|
+
},
|
|
2875
|
+
"security": [
|
|
2876
|
+
{
|
|
2877
|
+
"apiToken": []
|
|
2878
|
+
}
|
|
2879
|
+
],
|
|
2880
|
+
"group": "hosting"
|
|
2881
|
+
},
|
|
2882
|
+
{
|
|
2883
|
+
"name": "hosting_getSSLStatusV1",
|
|
2884
|
+
"title": "Get SSL status",
|
|
2885
|
+
"annotations": {
|
|
2886
|
+
"title": "Get SSL status",
|
|
2887
|
+
"readOnlyHint": true,
|
|
2888
|
+
"destructiveHint": false
|
|
2889
|
+
},
|
|
2890
|
+
"description": "Returns the SSL state of the website: the certificate `status` and `provider`, whether the\ncertificate is a lifetime one managed by the platform, whether HTTP requests are redirected to\nHTTPS, when the certificate stops being valid and the last installation error.\n\n`installing` and `waiting_for_retry` mean an installation is in progress. `failed` means the\nlast installation gave up, or the website was not updated for 60 minutes while `installing`;\n`last_error` holds the reason when it is a known message, otherwise it is null. `expired`\nmeans the assigned certificate's validity has ended. `not_installed` means no certificate is\nassigned. Free subdomains use a platform-managed certificate: with no installation recorded\nthey report `active` with `provider` and `expires_at` null.",
|
|
2891
|
+
"method": "GET",
|
|
2892
|
+
"path": "/api/hosting/v1/accounts/{username}/websites/{domain}/ssl/status",
|
|
2893
|
+
"inputSchema": {
|
|
2894
|
+
"type": "object",
|
|
2895
|
+
"properties": {
|
|
2896
|
+
"username": {
|
|
2897
|
+
"type": "string",
|
|
2898
|
+
"description": "username parameter"
|
|
2899
|
+
},
|
|
2900
|
+
"domain": {
|
|
2901
|
+
"type": "string",
|
|
2902
|
+
"description": "Domain name"
|
|
2903
|
+
}
|
|
2904
|
+
},
|
|
2905
|
+
"required": [
|
|
2906
|
+
"username",
|
|
2907
|
+
"domain"
|
|
2908
|
+
]
|
|
2909
|
+
},
|
|
2910
|
+
"security": [
|
|
2911
|
+
{
|
|
2912
|
+
"apiToken": []
|
|
2913
|
+
}
|
|
2914
|
+
],
|
|
2915
|
+
"group": "hosting"
|
|
2916
|
+
},
|
|
2917
|
+
{
|
|
2918
|
+
"name": "hosting_toggleHTTPSRedirectV1",
|
|
2919
|
+
"title": "Toggle HTTPS redirect",
|
|
2920
|
+
"annotations": {
|
|
2921
|
+
"title": "Toggle HTTPS redirect",
|
|
2922
|
+
"readOnlyHint": false,
|
|
2923
|
+
"destructiveHint": true,
|
|
2924
|
+
"idempotentHint": true
|
|
2925
|
+
},
|
|
2926
|
+
"description": "Turns the HTTP to HTTPS redirect of the website on or off, based on `is_enabled`. Does\nnothing when the redirect is already in the requested state. Turning it on requires an\ninstalled certificate (`status` `active` or `expired` on `Get SSL status`) and returns 422\nwhen there is none; turning it off is always accepted.",
|
|
2927
|
+
"method": "PATCH",
|
|
2928
|
+
"path": "/api/hosting/v1/accounts/{username}/websites/{domain}/ssl/https-redirect/toggle",
|
|
2929
|
+
"inputSchema": {
|
|
2930
|
+
"type": "object",
|
|
2931
|
+
"properties": {
|
|
2932
|
+
"username": {
|
|
2933
|
+
"type": "string",
|
|
2934
|
+
"description": "username parameter"
|
|
2935
|
+
},
|
|
2936
|
+
"domain": {
|
|
2937
|
+
"type": "string",
|
|
2938
|
+
"description": "Domain name"
|
|
2939
|
+
},
|
|
2940
|
+
"is_enabled": {
|
|
2941
|
+
"type": "boolean",
|
|
2942
|
+
"description": "Turn the HTTP to HTTPS redirect on (true) or off (false) for the website."
|
|
2943
|
+
}
|
|
2944
|
+
},
|
|
2945
|
+
"required": [
|
|
2946
|
+
"username",
|
|
2947
|
+
"domain",
|
|
2948
|
+
"is_enabled"
|
|
2949
|
+
]
|
|
2950
|
+
},
|
|
2951
|
+
"security": [
|
|
2952
|
+
{
|
|
2953
|
+
"apiToken": []
|
|
2954
|
+
}
|
|
2955
|
+
],
|
|
2956
|
+
"group": "hosting"
|
|
2957
|
+
},
|
|
2958
|
+
{
|
|
2959
|
+
"name": "hosting_uninstallSSLV1",
|
|
2960
|
+
"title": "Uninstall SSL",
|
|
2961
|
+
"annotations": {
|
|
2962
|
+
"title": "Uninstall SSL",
|
|
2963
|
+
"readOnlyHint": false,
|
|
2964
|
+
"destructiveHint": true,
|
|
2965
|
+
"idempotentHint": true
|
|
2966
|
+
},
|
|
2967
|
+
"description": "Removes the SSL certificate assigned to the website, turns the HTTPS redirect off and cancels\na pending installation retry. The website serves plain HTTP until a new installation\ncompletes. `Get SSL status` reports `not_installed` as soon as the call returns; the call also\nsucceeds when no certificate is assigned, so repeating it is safe.\n\nReturns 422 for free subdomains (their certificate is managed by the platform) and while an\ninstallation is `installing`.",
|
|
2968
|
+
"method": "DELETE",
|
|
2969
|
+
"path": "/api/hosting/v1/accounts/{username}/websites/{domain}/ssl",
|
|
2970
|
+
"inputSchema": {
|
|
2971
|
+
"type": "object",
|
|
2972
|
+
"properties": {
|
|
2973
|
+
"username": {
|
|
2974
|
+
"type": "string",
|
|
2975
|
+
"description": "username parameter"
|
|
2976
|
+
},
|
|
2977
|
+
"domain": {
|
|
2978
|
+
"type": "string",
|
|
2979
|
+
"description": "Domain name"
|
|
2980
|
+
}
|
|
2981
|
+
},
|
|
2982
|
+
"required": [
|
|
2983
|
+
"username",
|
|
2984
|
+
"domain"
|
|
2985
|
+
]
|
|
2986
|
+
},
|
|
2987
|
+
"security": [
|
|
2988
|
+
{
|
|
2989
|
+
"apiToken": []
|
|
2990
|
+
}
|
|
2991
|
+
],
|
|
2992
|
+
"group": "hosting"
|
|
2993
|
+
},
|
|
2695
2994
|
{
|
|
2696
2995
|
"name": "hosting_listWebsitesV1",
|
|
2697
2996
|
"title": "List websites",
|