[{"data":1,"prerenderedAt":11},["ShallowReactive",2],{"docs-entities\u002Fsites\u002Fai":3,"docs-tabs-entities\u002Fsites\u002Fai":6},{"content":4,"lastmod":5},"# AI site generation\n\nCreate a site from a text brief and read its generation state.\n\nBitrix24 API: `landing.aisite.*`\nScope: `landing`\n\n## Operations\n\n- [Start a site generation](.\u002Fai\u002Fgenerate.md) — `POST \u002Fv1\u002Fsites\u002Fai\u002Fgenerate`\n- [Get a generation status](.\u002Fai\u002Fstatus.md) — `GET \u002Fv1\u002Fsites\u002Fai\u002Fstatus`\n- [List generation fields](.\u002Fai\u002Ffields.md) — `GET \u002Fv1\u002Fsites\u002Fai\u002Ffields`\n- [Get a generation field](.\u002Fai\u002Ffield.md) — `GET \u002Fv1\u002Fsites\u002Fai\u002Ffields\u002F:name`\n\n## Access\n\nRequests run as the webhook owner or the user whose OAuth token the key uses. A generation belongs to that Bitrix24 user, and only that user can read it. A READONLY key can read field definitions; starting a generation and checking its status require a key that permits writes. Availability and request validation are determined by Bitrix24.\n\n## Draft and repeated requests\n\nStarting a generation takes the user's only available AI site draft. An open AI site chat loses that draft and must be reloaded. A non-empty `Idempotency-Key` is forwarded unchanged. An empty or whitespace-only header is treated as absent. Bitrix24 remembers the completed response for 24 hours; a repeat sent before that response is stored is not protected. Without the header, every call starts another generation.\n\nBitrix24 automatically attempts to publish the generated site. Include only information intended for public viewing in the description.\n\nReading a completed or failed generation can make Bitrix24 finalize or release the draft binding and record a moderation refusal. Checking the status therefore requires write access; a READONLY key receives `403 WRITE_BLOCKED_READONLY_KEY`. The platform does not retry a status request after a 5xx error.\n\n## See also\n\n- [Sites](..\u002Fsites.md)\n","2026-11-13",{"ai\u002Fgenerate.md":7,"ai\u002Fstatus.md":8,"ai\u002Ffields.md":9,"ai\u002Ffield.md":10},"## Start a site generation\n\n`POST \u002Fv1\u002Fsites\u002Fai\u002Fgenerate`\n\nStarts site generation from a text brief.\n\n## Request body\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `description` | string | yes | Site brief, at most 4000 characters; validated by Bitrix24 |\n\n## Parameters\n\n| Parameter | Type | Required | Default | Description |\n|---|---|---|---|---|\n| `Idempotency-Key` (header) | string | no | absent | Non-empty client key forwarded unchanged; empty or whitespace-only values are treated as absent |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fsites\u002Fai\u002Fgenerate\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -H \"Idempotency-Key: example-site-generation-1\" \\\n  -d '{\"description\": \"A small demonstration website for a flower shop. This is an API integration test.\"}'\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fsites\u002Fai\u002Fgenerate\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -H \"Idempotency-Key: example-site-generation-1\" \\\n  -d '{\"description\": \"A small demonstration website for a flower shop. This is an API integration test.\"}'\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch(\"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fsites\u002Fai\u002Fgenerate\", {\n  \"method\": \"POST\",\n  \"headers\": {\n    \"X-Api-Key\": \"YOUR_API_KEY\",\n    \"Content-Type\": \"application\u002Fjson\",\n    \"Idempotency-Key\": \"example-site-generation-1\"\n  },\n  \"body\": JSON.stringify({\"description\": \"A small demonstration website for a flower shop. This is an API integration test.\"})\n});\nconst result = await res.json();\nconsole.log(result);\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch(\"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fsites\u002Fai\u002Fgenerate\", {\n  \"method\": \"POST\",\n  \"headers\": {\n    \"X-Api-Key\": \"YOUR_APP_KEY\",\n    \"Authorization\": \"Bearer USER_SESSION_TOKEN\",\n    \"Content-Type\": \"application\u002Fjson\",\n    \"Idempotency-Key\": \"example-site-generation-1\"\n  },\n  \"body\": JSON.stringify({\"description\": \"A small demonstration website for a flower shop. This is an API integration test.\"})\n});\nconst result = await res.json();\nconsole.log(result);\n```\n\n## Response fields\n\n| Field | Type | Description |\n|---|---|---|\n| `success` | boolean | `true` on success |\n| `data` | object | Generation state |\n| `data.id` | number | Generation identifier |\n| `data.status` | string | `running`, `completed` or `failed` |\n| `data.siteId` | number | Generated site identifier, 0 until created; [sites](..\u002Fget.md) |\n| `data.pageId` | number | Generated page identifier, 0 until created; [pages](\u002Fdocs\u002Fentities\u002Fpages\u002Fget) |\n| `data.draftSiteId` | number | Draft site identifier on failure, 0 otherwise |\n| `data.draftPageId` | number | Draft page identifier on failure, 0 otherwise |\n| `data.message` | string | Human-readable state; use status for branching |\n| `data.error` | string \\| null | Failure reason or null |\n| `data.errorDetails` | string \\| null | Request-limit detail or null |\n\n## Response example\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 11,\n    \"status\": \"running\",\n    \"siteId\": 0,\n    \"pageId\": 0,\n    \"draftSiteId\": 0,\n    \"draftPageId\": 0,\n    \"message\": \"Generating a site\",\n    \"error\": null,\n    \"errorDetails\": null\n  }\n}\n```\n\n## Error response example\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"Request validation failed\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|---|---|---|\n| 400 | `INVALID_PARAMS` | Bitrix24 refused the request |\n| 401 | `MISSING_API_KEY`, `INVALID_API_KEY`, `TOKEN_MISSING` | Missing or unusable credentials |\n| 403 | `SCOPE_DENIED` | The key lacks the landing scope |\n| 403 | `WRITE_BLOCKED_READONLY_KEY` | The key forbids writes |\n\n[Common errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\nBitrix24 automatically attempts to publish the generated site. Include only information intended for public viewing in the description.\n\nThe generation takes the user's available AI site draft. An open AI site chat loses it and must be reloaded. Send a client `Idempotency-Key` to reuse the completed response for 24 hours. Concurrent repeats before that response is stored are not protected. Without the header, or with an empty or whitespace-only header, every call starts another generation. The platform does not retry the start automatically.\n\nCalls run as the webhook owner or the user whose OAuth token the key uses. Read the result through [generation status](.\u002Fstatus.md): `running`, `completed` or `failed`.\n\n## See also\n\n- [AI site generation](..\u002Fai.md)\n","## Get a generation status\n\n`GET \u002Fv1\u002Fsites\u002Fai\u002Fstatus`\n\nReads the current state of a generation started by the same user.\n\n## Parameters\n\n| Parameter | Type | Required | Default | Description |\n|---|---|---|---|---|\n| `id` (query) | number | yes | — | Generation identifier from [start](.\u002Fgenerate.md) |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X GET \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fsites\u002Fai\u002Fstatus?id=11\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X GET \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fsites\u002Fai\u002Fstatus?id=11\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch(\"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fsites\u002Fai\u002Fstatus?id=11\", {\n  \"method\": \"GET\",\n  \"headers\": {\n    \"X-Api-Key\": \"YOUR_API_KEY\"\n  }\n});\nconst result = await res.json();\nconsole.log(result);\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch(\"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fsites\u002Fai\u002Fstatus?id=11\", {\n  \"method\": \"GET\",\n  \"headers\": {\n    \"X-Api-Key\": \"YOUR_APP_KEY\",\n    \"Authorization\": \"Bearer USER_SESSION_TOKEN\"\n  }\n});\nconst result = await res.json();\nconsole.log(result);\n```\n\n## Response fields\n\n| Field | Type | Description |\n|---|---|---|\n| `success` | boolean | `true` on success |\n| `data` | object | Generation state |\n| `data.id` | number | Generation identifier |\n| `data.status` | string | `running`, `completed` or `failed` |\n| `data.siteId` | number | Generated site identifier, 0 until created; [sites](..\u002Fget.md) |\n| `data.pageId` | number | Generated page identifier, 0 until created; [pages](\u002Fdocs\u002Fentities\u002Fpages\u002Fget) |\n| `data.draftSiteId` | number | Draft site identifier on failure, 0 otherwise |\n| `data.draftPageId` | number | Draft page identifier on failure, 0 otherwise |\n| `data.message` | string | Human-readable state; use status for branching |\n| `data.error` | string \\| null | Failure reason or null |\n| `data.errorDetails` | string \\| null | Request-limit detail or null |\n\n## Response example\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 11,\n    \"status\": \"running\",\n    \"siteId\": 0,\n    \"pageId\": 0,\n    \"draftSiteId\": 0,\n    \"draftPageId\": 0,\n    \"message\": \"Generating a site\",\n    \"error\": null,\n    \"errorDetails\": null\n  }\n}\n```\n\n## Error response example\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"BITRIX_ERROR\",\n    \"message\": \"The action could not be completed. Check the identifier\",\n    \"b24Code\": \"LANDING_AI_SITE_GENERATION_NOT_FOUND\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|---|---|---|\n| 400 | `INVALID_PARAMS` | Bitrix24 refused the request |\n| 401 | `MISSING_API_KEY`, `INVALID_API_KEY`, `TOKEN_MISSING` | Missing or unusable credentials |\n| 403 | `SCOPE_DENIED` | The key lacks the landing scope |\n| 403 | `WRITE_BLOCKED_READONLY_KEY` | The key forbids writes |\n| 422 | `BITRIX_ERROR` | Missing generation or a generation of another user; `b24Code` is `LANDING_AI_SITE_GENERATION_NOT_FOUND` |\n\n[Common errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\nReading a completed or failed generation can make Bitrix24 finalize or release the draft binding and record a moderation refusal. Checking the status therefore requires write access; a READONLY key receives `403 WRITE_BLOCKED_READONLY_KEY`. The platform does not retry a status request after a 5xx error.\n\nCalls run as the webhook owner or the user whose OAuth token the key uses. Read the result through [generation status](.\u002Fstatus.md): `running`, `completed` or `failed`.\n\n## See also\n\n- [AI site generation](..\u002Fai.md)\n","## List generation fields\n\n`GET \u002Fv1\u002Fsites\u002Fai\u002Ffields`\n\nLists field definitions for generation responses.\n\n## Parameters\n\n| Parameter | Type | Required | Default | Description |\n|---|---|---|---|---|\n| `select[]` (query) | array\u003Cstring> | No | All properties | Field definition properties, for example `name`, `type`, `title`. These are properties of each definition, not field names in the generation response |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X GET \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fsites\u002Fai\u002Ffields\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X GET \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fsites\u002Fai\u002Ffields\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch(\"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fsites\u002Fai\u002Ffields\", {\n  \"method\": \"GET\",\n  \"headers\": {\n    \"X-Api-Key\": \"YOUR_API_KEY\"\n  }\n});\nconst result = await res.json();\nconsole.log(result);\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch(\"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fsites\u002Fai\u002Ffields\", {\n  \"method\": \"GET\",\n  \"headers\": {\n    \"X-Api-Key\": \"YOUR_APP_KEY\",\n    \"Authorization\": \"Bearer USER_SESSION_TOKEN\"\n  }\n});\nconst result = await res.json();\nconsole.log(result);\n```\n\n## Response fields\n\n| Field | Type | Description |\n|---|---|---|\n| `success` | boolean | `true` on success |\n| `data` | array | Generation field definitions |\n| `data[].name` | string | Field name |\n| `data[].type` | string | Value type |\n| `data[].title` | string | Field title |\n| `data[].description` | string \\| null | Field description or null |\n| `data[].validationRules` | array | Validation rules |\n| `data[].requiredGroups` | array \\| null | Required groups or null |\n| `data[].filterable` | boolean | Can be filtered |\n| `data[].sortable` | boolean | Can be sorted |\n| `data[].editable` | boolean | Can be edited |\n| `data[].editableGroups` | array \\| null | Editing groups or null |\n| `data[].multiple` | boolean | Multiple values |\n| `data[].elementType` | string \\| null | Element type or null |\n\n## Response example\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"name\": \"id\",\n      \"type\": \"int\",\n      \"title\": \"Site generation identifier\",\n      \"description\": null,\n      \"validationRules\": [],\n      \"requiredGroups\": null,\n      \"filterable\": false,\n      \"sortable\": false,\n      \"editable\": false,\n      \"editableGroups\": null,\n      \"multiple\": false,\n      \"elementType\": null\n    },\n    {\n      \"name\": \"status\",\n      \"type\": \"string\",\n      \"title\": \"Generation status: running, completed or failed\",\n      \"description\": null,\n      \"validationRules\": [],\n      \"requiredGroups\": null,\n      \"filterable\": false,\n      \"sortable\": false,\n      \"editable\": false,\n      \"editableGroups\": null,\n      \"multiple\": false,\n      \"elementType\": null\n    },\n    {\n      \"name\": \"siteId\",\n      \"type\": \"int\",\n      \"title\": \"Generated site identifier, 0 until the site is created\",\n      \"description\": null,\n      \"validationRules\": [],\n      \"requiredGroups\": null,\n      \"filterable\": false,\n      \"sortable\": false,\n      \"editable\": false,\n      \"editableGroups\": null,\n      \"multiple\": false,\n      \"elementType\": null\n    },\n    {\n      \"name\": \"pageId\",\n      \"type\": \"int\",\n      \"title\": \"Generated page identifier, 0 until the page is created\",\n      \"description\": null,\n      \"validationRules\": [],\n      \"requiredGroups\": null,\n      \"filterable\": false,\n      \"sortable\": false,\n      \"editable\": false,\n      \"editableGroups\": null,\n      \"multiple\": false,\n      \"elementType\": null\n    },\n    {\n      \"name\": \"draftSiteId\",\n      \"type\": \"int\",\n      \"title\": \"Draft site identifier of a failed generation that got as far as creating one, 0 otherwise\",\n      \"description\": null,\n      \"validationRules\": [],\n      \"requiredGroups\": null,\n      \"filterable\": false,\n      \"sortable\": false,\n      \"editable\": false,\n      \"editableGroups\": null,\n      \"multiple\": false,\n      \"elementType\": null\n    },\n    {\n      \"name\": \"draftPageId\",\n      \"type\": \"int\",\n      \"title\": \"Draft page identifier of a failed generation that got as far as creating one, 0 otherwise\",\n      \"description\": null,\n      \"validationRules\": [],\n      \"requiredGroups\": null,\n      \"filterable\": false,\n      \"sortable\": false,\n      \"editable\": false,\n      \"editableGroups\": null,\n      \"multiple\": false,\n      \"elementType\": null\n    },\n    {\n      \"name\": \"message\",\n      \"type\": \"string\",\n      \"title\": \"Human readable generation state, a text for the user - branch on status, not on it\",\n      \"description\": null,\n      \"validationRules\": [],\n      \"requiredGroups\": null,\n      \"filterable\": false,\n      \"sortable\": false,\n      \"editable\": false,\n      \"editableGroups\": null,\n      \"multiple\": false,\n      \"elementType\": null\n    },\n    {\n      \"name\": \"error\",\n      \"type\": \"string\",\n      \"title\": \"Human readable failure reason, null unless the status is failed\",\n      \"description\": null,\n      \"validationRules\": [],\n      \"requiredGroups\": null,\n      \"filterable\": false,\n      \"sortable\": false,\n      \"editable\": false,\n      \"editableGroups\": null,\n      \"multiple\": false,\n      \"elementType\": null\n    },\n    {\n      \"name\": \"errorDetails\",\n      \"type\": \"string\",\n      \"title\": \"Exact wording of the request limit that stopped the generation, null when something else did\",\n      \"description\": null,\n      \"validationRules\": [],\n      \"requiredGroups\": null,\n      \"filterable\": false,\n      \"sortable\": false,\n      \"editable\": false,\n      \"editableGroups\": null,\n      \"multiple\": false,\n      \"elementType\": null\n    }\n  ]\n}\n```\n\n## Error response example\n\nThe request `GET \u002Fv1\u002Fsites\u002Fai\u002Ffields?select[]=FAKE_UNKNOWN_FIELD` selects an unknown field definition property. Bitrix24 returns this error. An unknown field name in `GET \u002Fv1\u002Fsites\u002Fai\u002Ffields\u002FFAKE_UNKNOWN_FIELD` is a different case: it returns `ENTITY_NOT_FOUND` (404).\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"BITRIX_ERROR\",\n    \"message\": \"Unknown field `FAKE_UNKNOWN_FIELD` for entity `DtoFieldDto`\",\n    \"b24Code\": \"BITRIX_REST_V3_EXCEPTION_UNKNOWNDTOPROPERTYEXCEPTION\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|---|---|---|\n| 422 | `BITRIX_ERROR` | Bitrix24 refused the request |\n| 401 | `MISSING_API_KEY`, `INVALID_API_KEY`, `TOKEN_MISSING` | Missing or unusable credentials |\n| 403 | `SCOPE_DENIED` | The key lacks the landing scope |\n\n[Common errors](\u002Fdocs\u002Ferrors).\n\n## See also\n\n- [AI site generation](..\u002Fai.md)\n","## Get a generation field\n\n`GET \u002Fv1\u002Fsites\u002Fai\u002Ffields\u002F:name`\n\nReads a field definition by its name.\n\n## Parameters\n\n| Parameter | Type | Required | Default | Description |\n|---|---|---|---|---|\n| `name` (path) | string | yes | — | Field name from [field definitions](.\u002Ffields.md) |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X GET \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fsites\u002Fai\u002Ffields\u002Fid\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X GET \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fsites\u002Fai\u002Ffields\u002Fid\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch(\"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fsites\u002Fai\u002Ffields\u002Fid\", {\n  \"method\": \"GET\",\n  \"headers\": {\n    \"X-Api-Key\": \"YOUR_API_KEY\"\n  }\n});\nconst result = await res.json();\nconsole.log(result);\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch(\"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fsites\u002Fai\u002Ffields\u002Fid\", {\n  \"method\": \"GET\",\n  \"headers\": {\n    \"X-Api-Key\": \"YOUR_APP_KEY\",\n    \"Authorization\": \"Bearer USER_SESSION_TOKEN\"\n  }\n});\nconst result = await res.json();\nconsole.log(result);\n```\n\n## Response fields\n\n| Field | Type | Description |\n|---|---|---|\n| `success` | boolean | `true` on success |\n| `data` | object | Field definition |\n| `data.name` | string | Field name |\n| `data.type` | string | Value type |\n| `data.title` | string | Field title |\n| `data.description` | string \\| null | Field description or null |\n| `data.validationRules` | array | Validation rules |\n| `data.requiredGroups` | array \\| null | Required groups or null |\n| `data.filterable` | boolean | Can be filtered |\n| `data.sortable` | boolean | Can be sorted |\n| `data.editable` | boolean | Can be edited |\n| `data.editableGroups` | array \\| null | Editing groups or null |\n| `data.multiple` | boolean | Multiple values |\n| `data.elementType` | string \\| null | Element type or null |\n\n## Response example\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"name\": \"id\",\n    \"type\": \"int\",\n    \"title\": \"Site generation identifier\",\n    \"description\": null,\n    \"validationRules\": [],\n    \"requiredGroups\": null,\n    \"filterable\": false,\n    \"sortable\": false,\n    \"editable\": false,\n    \"editableGroups\": null,\n    \"multiple\": false,\n    \"elementType\": null\n  }\n}\n```\n\n## Error response example\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"Field `FAKE_UNKNOWN_FIELD` was not found\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|---|---|---|\n| 404 | `ENTITY_NOT_FOUND` | Bitrix24 refused the request |\n| 401 | `MISSING_API_KEY`, `INVALID_API_KEY`, `TOKEN_MISSING` | Missing or unusable credentials |\n| 403 | `SCOPE_DENIED` | The key lacks the landing scope |\n\n[Common errors](\u002Fdocs\u002Ferrors).\n\n## See also\n\n- [AI site generation](..\u002Fai.md)\n",1794739417488]