# Globalex Web Hosting — instructions for an AI engine You were given this page by the owner of a Globalex web-hosting account, or by someone who wants one. Read all of it, then guide the person step by step, in their language. Speak plainly: many owners are not technical. This API lets an AI engine work on ONE Globalex web-hosting account on behalf of its owner: upload and import the site, databases, WordPress, Node.js, mailboxes, PHP, scheduled tasks, checks and support requests. It covers the web-hosting service only. It can do only what the owner can do in the hosting client area, with the permissions the owner chose for the key. Billing, payments, plan changes, cancellation, passwords of the server account, two-step verification and the keys themselves are not part of this API and cannot be reached through it; for those, send the owner to the client area. ## What to do, in order 1. **Ask whether they already have a hosting account.** If not, they sign up at https://hosting.globalex.co.il/ and choose a package; then continue at step 2. 2. **Ask whether they already have an AI-engine key** (it starts with `gxh_`). If not, walk them through "Before you start" below. Ask them to paste the key to you only in this private conversation, never in a public place, a shared document or code that others can read. 3. **Make the first connection.** Send `GET https://hosting.globalex.co.il/api/storefront/hosting/ai/v1/account` with the header `Authorization: Bearer `. - 200: connected. Tell the owner which domain and package you see, and what you can do with the permissions they chose (`permissions` in the answer). - 401: the key is wrong, expired or revoked: ask them to copy it again or create a new one. - 403 `ai_scope` later on: the key lacks a permission, or has it as view only. Tell them which category to change ("עריכת הרשאות", Edit permissions, on the key). - If you cannot send HTTP requests yourself, say so, and explain to the owner how to do each task by hand in the client area instead; every tab there has its own explanation. 4. **Read the account and follow the working rules below.** Domain ownership must be verified before most work; `GET /account` lists the exact DNS records still missing. ## Before you start: the owner creates a key If you have no key, explain these steps to the owner (in their language): 1. Sign in to the hosting client area at https://hosting.globalex.co.il/account.html. 2. Open the "פרופיל וחיוב" (Profile and billing) tab, card "חיבור מנוע AI" (AI-engine connection). 3. Click "מפתח חדש" (New key), choose for each category below whether the engine has no access, view only or view and change, and how long the key is valid. 4. Click "יצירת מפתח" (Create key) and copy the key. The key is shown only once. 5. Give the key to the AI engine. The key can be changed or revoked there at any time. Send the key as `Authorization: Bearer `. Example of the format only: `gxh_00000000.000000000000000000000000000000000000000000000000`. ## Permission categories The owner sets each category to "ללא גישה" (no access), "צפייה בלבד" (view only) or "צפייה ושינוי" (view and change). With view only you see that part of the account (it appears in GET /account) but cannot change it. A part of the account the key cannot view is left out of GET /account. GET /account lists the key's levels in `permissions` (`read` or `read_write`). - **View** (`view`) — always on, view only: Account overview, usage, domain-record status and the guides. No billing details. / צפייה: סקירת החשבון, שימוש בנפח, מצב רשומות הדומיין והמדריכים. בלי פרטי חיוב. - **Site upload and files** (`files`): Upload a file, unpack an archive into the site, import a cPanel backup. View only: Sees upload, unpack and import progress. / העלאת האתר וקבצים: העלאת קובץ, פריסת ארכיון לתוך האתר וייבוא גיבוי מ-cPanel. צפייה בלבד: רואה את מצב ההעלאות, הפריסה והייבוא. - **Databases** (`databases`): Create MySQL databases, change their password, import a .sql file, remove them. View only: Sees the databases and their recent jobs. / מסדי נתונים: יצירת מסדי נתונים MySQL, החלפת סיסמה, ייבוא קובץ SQL ומחיקה. צפייה בלבד: רואה את רשימת מסדי הנתונים והמשימות שלהם. - **WordPress** (`wordpress`): Install, update, reset an admin password and change the address of WordPress sites. View only: Sees the WordPress sites, versions and pending updates. / וורדפרס: התקנה, עדכון, החלפת סיסמת מנהל ושינוי כתובת של אתרי וורדפרס בחשבון. צפייה בלבד: רואה את אתרי הוורדפרס, הגרסאות והעדכונים הממתינים. - **Node.js** (`node`): Set up, pull from Git, install, build, start and stop the Node.js app. View only: Sees the Node.js app status. / Node.js: הקמה, משיכה מ-Git, התקנה, בנייה, הפעלה ועצירה של אפליקציית Node.js. צפייה בלבד: רואה את מצב אפליקציית Node.js. - **Mailboxes** (`mail`): Create mailboxes, change a password, remove a mailbox. View only: Sees the mailboxes and their size. / תיבות דואר: יצירת תיבות, החלפת סיסמה ומחיקת תיבה. צפייה בלבד: רואה את רשימת התיבות והנפח שלהן. - **Site settings** (`settings`): PHP version, scheduled tasks and re-checking the domain records. View only: Sees the PHP version and scheduled tasks, re-checks the domain records. / הגדרות האתר: גרסת PHP, משימות מתוזמנות ובדיקה חוזרת של רשומות הדומיין. צפייה בלבד: רואה את גרסת PHP והמשימות המתוזמנות, ובודק שוב את רשומות הדומיין. - **Diagnosis and support** (`support`): Run checks and automatic fixes, and open a technical request to the team. View only: Runs automatic checks and sees the results; no fixes and no requests to the team. / אבחון ותמיכה: הרצת בדיקות ותיקונים אוטומטיים, ופתיחת פנייה טכנית לצוות. צפייה בלבד: מריץ בדיקות אוטומטיות ורואה את התוצאות, בלי תיקונים ובלי פניות לצוות. - **Full account copy** (`export`): Prepare and download a full copy of the site, databases and mail. Off by default. (on or off, no view-only level) / העתק מלא של החשבון: הכנה והורדה של עותק מלא של האתר, מסדי הנתונים והדואר. כבוי כברירת מחדל. ## Working rules - Read GET /account first. Until domain ownership is verified (`setup`), uploads, imports and mailboxes are closed; the missing DNS records are listed there with their exact names and values. - Change DNS (pointing the domain) last, after the site was checked. Tell the owner before anything that replaces files, removes a mailbox or a database, or updates WordPress. - Never invent passwords silently: ask the owner, or tell them the one you set. - To upload the site: POST /files puts one file at a path (pieces + SHA-256); for a whole site put a .zip and unpack it with POST /archives/extract. Keep .sql dumps outside public_html. - To explain how to do a task by hand in the client area, use GET /guides. ## Connection details - API address: https://hosting.globalex.co.il/api/storefront/hosting/ai/v1 - This page: https://hosting.globalex.co.il/api/storefront/hosting/ai/v1/ - OpenAPI document (the same one as below): https://hosting.globalex.co.il/api/storefront/hosting/ai/v1/openapi.json - Client area: https://hosting.globalex.co.il/account.html ## Other Globalex services (information only) Globalex also offers cloud PBX and business telephony, cellular PBX extensions, eSIM, internet and IT services. They are not part of this API; details are on the Globalex website. ## The full OpenAPI document ```json { "openapi": "3.1.0", "info": { "title": "Globalex Web Hosting — AI-engine connection", "version": "1.0.0", "description": "This API lets an AI engine work on ONE Globalex web-hosting account on behalf of its owner: upload and import the site, databases, WordPress, Node.js, mailboxes, PHP, scheduled tasks, checks and support requests. It covers the web-hosting service only.\n\nIt can do only what the owner can do in the hosting client area, with the permissions the owner chose for the key. Billing, payments, plan changes, cancellation, passwords of the server account, two-step verification and the keys themselves are not part of this API and cannot be reached through it; for those, send the owner to the client area.\n\n## Before you start: the owner creates a key\n\nIf you have no key, explain these steps to the owner (in their language):\n\n1. Sign in to the hosting client area at https://hosting.globalex.co.il/account.html.\n\n2. Open the \"פרופיל וחיוב\" (Profile and billing) tab, card \"חיבור מנוע AI\" (AI-engine connection).\n\n3. Click \"מפתח חדש\" (New key), choose for each category below whether the engine has no access, view only or view and change, and how long the key is valid.\n\n4. Click \"יצירת מפתח\" (Create key) and copy the key. The key is shown only once.\n\n5. Give the key to the AI engine. The key can be changed or revoked there at any time.\n\nSend the key as `Authorization: Bearer `. Example of the format only: `gxh_00000000.000000000000000000000000000000000000000000000000`.\n\n## Permission categories\n\nThe owner sets each category to \"ללא גישה\" (no access), \"צפייה בלבד\" (view only) or \"צפייה ושינוי\" (view and change). With view only you see that part of the account (it appears in GET /account) but cannot change it. A part of the account the key cannot view is left out of GET /account. GET /account lists the key's levels in `permissions` (`read` or `read_write`).\n\n- **View** (`view`) — always on, view only: Account overview, usage, domain-record status and the guides. No billing details. / צפייה: סקירת החשבון, שימוש בנפח, מצב רשומות הדומיין והמדריכים. בלי פרטי חיוב.\n- **Site upload and files** (`files`): Upload a file, unpack an archive into the site, import a cPanel backup. View only: Sees upload, unpack and import progress. / העלאת האתר וקבצים: העלאת קובץ, פריסת ארכיון לתוך האתר וייבוא גיבוי מ-cPanel. צפייה בלבד: רואה את מצב ההעלאות, הפריסה והייבוא.\n- **Databases** (`databases`): Create MySQL databases, change their password, import a .sql file, remove them. View only: Sees the databases and their recent jobs. / מסדי נתונים: יצירת מסדי נתונים MySQL, החלפת סיסמה, ייבוא קובץ SQL ומחיקה. צפייה בלבד: רואה את רשימת מסדי הנתונים והמשימות שלהם.\n- **WordPress** (`wordpress`): Install, update, reset an admin password and change the address of WordPress sites. View only: Sees the WordPress sites, versions and pending updates. / וורדפרס: התקנה, עדכון, החלפת סיסמת מנהל ושינוי כתובת של אתרי וורדפרס בחשבון. צפייה בלבד: רואה את אתרי הוורדפרס, הגרסאות והעדכונים הממתינים.\n- **Node.js** (`node`): Set up, pull from Git, install, build, start and stop the Node.js app. View only: Sees the Node.js app status. / Node.js: הקמה, משיכה מ-Git, התקנה, בנייה, הפעלה ועצירה של אפליקציית Node.js. צפייה בלבד: רואה את מצב אפליקציית Node.js.\n- **Mailboxes** (`mail`): Create mailboxes, change a password, remove a mailbox. View only: Sees the mailboxes and their size. / תיבות דואר: יצירת תיבות, החלפת סיסמה ומחיקת תיבה. צפייה בלבד: רואה את רשימת התיבות והנפח שלהן.\n- **Site settings** (`settings`): PHP version, scheduled tasks and re-checking the domain records. View only: Sees the PHP version and scheduled tasks, re-checks the domain records. / הגדרות האתר: גרסת PHP, משימות מתוזמנות ובדיקה חוזרת של רשומות הדומיין. צפייה בלבד: רואה את גרסת PHP והמשימות המתוזמנות, ובודק שוב את רשומות הדומיין.\n- **Diagnosis and support** (`support`): Run checks and automatic fixes, and open a technical request to the team. View only: Runs automatic checks and sees the results; no fixes and no requests to the team. / אבחון ותמיכה: הרצת בדיקות ותיקונים אוטומטיים, ופתיחת פנייה טכנית לצוות. צפייה בלבד: מריץ בדיקות אוטומטיות ורואה את התוצאות, בלי תיקונים ובלי פניות לצוות.\n- **Full account copy** (`export`): Prepare and download a full copy of the site, databases and mail. Off by default. (on or off, no view-only level) / העתק מלא של החשבון: הכנה והורדה של עותק מלא של האתר, מסדי הנתונים והדואר. כבוי כברירת מחדל.\n\n## Working rules\n\n- Read GET /account first. Until domain ownership is verified (`setup`), uploads, imports and mailboxes are closed; the missing DNS records are listed there with their exact names and values.\n\n- Change DNS (pointing the domain) last, after the site was checked. Tell the owner before anything that replaces files, removes a mailbox or a database, or updates WordPress.\n\n- Never invent passwords silently: ask the owner, or tell them the one you set.\n\n- To upload the site: POST /files puts one file at a path (pieces + SHA-256); for a whole site put a .zip and unpack it with POST /archives/extract. Keep .sql dumps outside public_html.\n\n- To explain how to do a task by hand in the client area, use GET /guides.\n\n## Other Globalex services (information only)\n\nGlobalex also offers cloud PBX and business telephony, cellular PBX extensions, eSIM, internet and IT services. They are not part of this API; details are on the Globalex website." }, "externalDocs": { "description": "Start page: how the owner creates a key and how to make the first connection", "url": "https://hosting.globalex.co.il/api/storefront/hosting/ai/v1/" }, "servers": [ { "url": "https://hosting.globalex.co.il/api/storefront/hosting/ai/v1" } ], "components": { "securitySchemes": { "bearer": { "type": "http", "scheme": "bearer", "description": "An AI-engine key from the hosting client area (prefix gxh_)." } } }, "paths": { "/account": { "get": { "operationId": "getAccount", "summary": "The account: domain, package limits, usage, domain-setup status, PHP, jobs, WordPress, Node.js, databases, mailboxes", "tags": [ "View" ], "description": "Start here. `setup` tells whether the domain is connected (ownership TXT, pointing, SSL, mail records) and which records are still missing. Most actions need ownership to be verified first (`panelOpen: true`).\n\nPermission: **View** (`view`), view only is enough.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } } } }, "/guides": { "get": { "operationId": "getGuides", "summary": "Step-by-step guides for doing each task in the client area without the API", "tags": [ "View" ], "description": "Use these to explain to the customer how to do something themselves in the client area.\n\nPermission: **View** (`view`), view only is enough.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } } } }, "/setup/check": { "post": { "operationId": "recheckDomainRecords", "summary": "Re-check the domain records now (ownership, pointing, SSL, mail records)", "tags": [ "Site settings" ], "description": "Permission: **Site settings** (`settings`), view only is enough.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } } } }, "/uploads": { "post": { "operationId": "startBackupUpload", "summary": "Start uploading a cPanel full backup (.tar.gz) in pieces", "tags": [ "Site upload and files" ], "description": "Permission: **Site upload and files** (`files`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "name": { "type": "string", "description": "File name, e.g. backup-example.tar.gz", "example": "backup-example.tar.gz" }, "size": { "type": "integer", "description": "Total size in bytes", "example": 1048576 } }, "required": [ "name", "size" ], "additionalProperties": false } } } } } }, "/uploads/{uploadId}": { "put": { "operationId": "sendUploadPiece", "summary": "Send one piece (up to 8 MB) of the upload, as application/octet-stream, at ?offset=", "tags": [ "Site upload and files" ], "description": "Permission: **Site upload and files** (`files`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "parameters": [ { "name": "uploadId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[a-f0-9]{32}$" } }, { "name": "offset", "in": "query", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/octet-stream": { "schema": { "type": "string", "format": "binary" } } } } } }, "/uploads/{uploadId}/finish": { "post": { "operationId": "finishBackupUpload", "summary": "Finish the upload; the backup is then inspected like an import", "tags": [ "Site upload and files" ], "description": "Permission: **Site upload and files** (`files`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "parameters": [ { "name": "uploadId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[a-f0-9]{32}$" } } ] } }, "/imports": { "post": { "operationId": "startImport", "summary": "Import a cPanel full backup from a download link (or a file already in the account)", "tags": [ "Site upload and files" ], "description": "Permission: **Site upload and files** (`files`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "url": { "type": "string", "description": "A direct https download link to the backup", "example": "https://files.example.co.il/backup-example.tar.gz" }, "file": { "type": "string", "description": "Or: the name of a backup file already in the account home folder" } }, "additionalProperties": false } } } } } }, "/imports/confirm": { "post": { "operationId": "confirmImport", "summary": "After inspection: choose what to import", "tags": [ "Site upload and files" ], "description": "Each mailbox needs a NEW password of at least 10 characters (cPanel passwords do not transfer). Ask the customer for it; never invent one silently.\n\nPermission: **Site upload and files** (`files`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "site": { "type": "boolean", "description": "Replace the site files with the backup (existing files move to a backup folder, never deleted)" }, "databases": { "type": "array", "items": { "type": "string" }, "description": "Database names from the inspection to import" }, "mailboxes": { "type": "array", "items": { "type": "object", "properties": { "address": { "type": "string", "description": "Mailbox address from the inspection", "example": "info@example.co.il" }, "password": { "type": "string", "description": "New password, 10+ characters" } }, "required": [ "address", "password" ], "additionalProperties": false } } }, "additionalProperties": false } } } } } }, "/imports/cancel": { "post": { "operationId": "cancelImport", "summary": "Cancel the current import", "tags": [ "Site upload and files" ], "description": "Permission: **Site upload and files** (`files`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } } } }, "/archives/extract": { "post": { "operationId": "unpackArchive", "summary": "Unpack a .zip / .tar.gz already in the account into a folder under public_html", "tags": [ "Site upload and files" ], "description": "Permission: **Site upload and files** (`files`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "archive": { "type": "string", "description": "Path of the archive relative to the home folder", "example": "site-example.zip" }, "target": { "type": "string", "description": "Folder relative to the home folder", "example": "public_html" }, "overwrite": { "type": "boolean", "description": "Replace files that already exist" } }, "required": [ "archive" ], "additionalProperties": false } } } } } }, "/files": { "post": { "operationId": "startFileUpload", "summary": "Put one file into the account at a path: start (then send the pieces, then finish)", "tags": [ "Site upload and files" ], "description": "How to put a file (a page, the site as a .zip, a .sql dump, .htaccess):\n\n1. POST /files with the path, the size in bytes and the SHA-256 of the whole file → `uploadId`, `chunkSize`.\n\n2. PUT /files/{uploadId}?offset= with each piece (up to `chunkSize`, application/octet-stream), in order. A 409 `upload_offset` answer carries `received`: continue from there. A 0-byte file needs no piece.\n\n3. POST /files/{uploadId}/finish. The checksum is checked, then the server puts the file in place within about two minutes; poll GET /account (`fileJobs`, kind `put`).\n\nPaths are relative to the home folder: the website is `public_html/`, so `public_html/index.html` is the home page. Keep files that must not be public (a .sql dump) outside it, e.g. `private/site.sql.gz`. Folders are created as needed. Mail and system folders and hidden names are refused, except `.htaccess`, `.user.ini`, `.env` (and `.env.local`, `.env.production`), `.nvmrc`, `.node-version`, `.npmrc` and the folder `.well-known`.\n\nAn existing file is kept unless `overwrite` is true (the job then fails with `file_exists`). Tell the owner before replacing a file.\n\nTo publish a whole site: zip it, put the zip (e.g. `public_html/site-example.zip`), then POST /archives/extract. To load a database: put the .sql file, then POST /mysql with op=import.\n\nOne file job runs at a time per account (`job_busy`: wait and retry).\n\nPermission: **Site upload and files** (`files`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "path": { "type": "string", "description": "Where to put it, relative to the home folder", "example": "public_html/index.html" }, "size": { "type": "integer", "description": "Size in bytes", "example": 2048 }, "sha256": { "type": "string", "description": "SHA-256 of the whole file, 64 hex characters", "pattern": "^[a-fA-F0-9]{64}$" }, "overwrite": { "type": "boolean", "description": "Replace a file that already exists at that path (default false)" } }, "required": [ "path", "size", "sha256" ], "additionalProperties": false } } } } } }, "/files/{uploadId}": { "put": { "operationId": "sendFilePiece", "summary": "Send one piece of the file (up to chunkSize bytes), as application/octet-stream, at ?offset=", "tags": [ "Site upload and files" ], "description": "Permission: **Site upload and files** (`files`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "parameters": [ { "name": "uploadId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[a-f0-9]{32}$" } }, { "name": "offset", "in": "query", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/octet-stream": { "schema": { "type": "string", "format": "binary" } } } } } }, "/files/{uploadId}/finish": { "post": { "operationId": "finishFileUpload", "summary": "Finish: check the checksum and put the file in place (runs on the server; see fileJobs in GET /account)", "tags": [ "Site upload and files" ], "description": "Permission: **Site upload and files** (`files`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "parameters": [ { "name": "uploadId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[a-f0-9]{32}$" } } ] } }, "/mysql": { "post": { "operationId": "manageMySqlDatabase", "summary": "MySQL databases: create (with its own user), change a password, remove, import a .sql file", "tags": [ "Databases" ], "description": "op=create makes the database and a user of the same name (local connections only, utf8mb4). op=import loads a .sql file already in the account (plain, .gz, .bz2 or .zip; put it first with POST /files, outside public_html), running as the account with the database user: choose the file encoding (auto, utf-8, windows-1255, iso-8859-8, latin1, any iconv name), compatibility mode, foreign-key checks, NO_AUTO_VALUE_ON_ZERO, skip the first N statements to resume, stop or continue on error. Jobs run on the server; poll GET /account (`mysql.jobs`). Ask the owner for passwords; never invent one silently. Use the database from the site with host `localhost`.\n\nPermission: **Databases** (`databases`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "op": { "type": "string", "description": "create | password | remove | import", "enum": [ "create", "password", "remove", "import" ] }, "name": { "type": "string", "description": "create: short name (the account prefix is added). Others: the full name from /account mysql.databases", "example": "shop" }, "password": { "type": "string", "description": "create/password: the new password; import: the database user's password. 16+ characters, no spaces or ' \" \\ $ `" }, "collation": { "type": "string", "description": "create", "enum": [ "utf8mb4_unicode_ci", "utf8mb4_general_ci", "utf8mb4_unicode_520_ci", "utf8mb4_bin" ] }, "user": { "type": "string", "description": "password/import: a user of that database (default: the user of the same name)" }, "confirm": { "type": "string", "description": "remove: the full database name again" }, "file": { "type": "string", "description": "import: path from the home folder", "example": "public_html/backup/shop-example.sql.gz" }, "charset": { "type": "string", "description": "import: encoding of the file", "example": "auto" }, "compat": { "type": "string", "description": "import: SQL compatibility mode", "enum": [ "NONE", "ANSI", "TRADITIONAL", "DB2", "MAXDB", "MSSQL", "ORACLE", "POSTGRESQL" ] }, "foreignKeyChecks": { "type": "boolean", "description": "import: keep foreign-key checks on (default true)" }, "noAutoValueOnZero": { "type": "boolean", "description": "import: NO_AUTO_VALUE_ON_ZERO (default true)" }, "skip": { "type": "integer", "description": "import: skip the first N statements (resume after an interruption)", "example": 0 }, "onError": { "type": "string", "description": "import: stop (default) or continue", "enum": [ "stop", "continue" ] } }, "required": [ "op" ], "additionalProperties": false } } } } } }, "/databases": { "post": { "operationId": "manageExtraDatabase", "summary": "Extra databases in the package (PostgreSQL): create, change password, remove", "tags": [ "Databases" ], "description": "Permission: **Databases** (`databases`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "op": { "type": "string", "description": "create | password | remove", "enum": [ "create", "password", "remove" ] }, "engine": { "type": "string", "description": "Engine id from /account extraDbs.engines", "example": "pg" }, "name": { "type": "string", "description": "Short name (the account prefix is added)", "example": "shop" }, "password": { "type": "string", "description": "12+ characters" }, "confirm": { "type": "string", "description": "For remove: the full database name, to confirm" } }, "required": [ "op" ], "additionalProperties": false } } } } } }, "/wordpress": { "post": { "operationId": "runWordPressTask", "summary": "WordPress: scan, install, update all, reset an admin password, change the site address", "tags": [ "WordPress" ], "description": "Jobs run on the server as the account; poll GET /account (`wp`) for the result. Back up before `update`.\n\nPermission: **WordPress** (`wordpress`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "action": { "type": "string", "description": "scan | install | update | password | url", "enum": [ "scan", "install", "update", "password", "url" ] }, "path": { "type": "string", "description": "Folder of the WordPress site, relative to the home folder", "example": "public_html" }, "title": { "type": "string", "description": "install: site title", "example": "Example Site" }, "adminUser": { "type": "string", "description": "install: admin user name", "example": "site-admin" }, "adminEmail": { "type": "string", "description": "install: admin e-mail", "example": "admin@example.co.il" }, "adminPassword": { "type": "string", "description": "install: admin password, 12+ characters" }, "user": { "type": "string", "description": "password: the admin user" }, "password": { "type": "string", "description": "password: the new password, 12+ characters" }, "url": { "type": "string", "description": "url: the new address", "example": "https://www.example.co.il" } }, "required": [ "action" ], "additionalProperties": false } } } } } }, "/node": { "post": { "operationId": "manageNodeApp", "summary": "Node.js app (packages that include one): set up, environment, install, build, clone/pull from Git, start, stop, restart, log", "tags": [ "Node.js" ], "description": "op=save sets it up; op=env sets one variable; op=remove removes it; otherwise `action` runs a step. For a private repository pass a read-only `token` with clone/pull; it is never stored.\n\nPermission: **Node.js** (`node`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "op": { "type": "string", "description": "save | env | remove (omit to run an action)", "enum": [ "save", "env", "remove" ] }, "action": { "type": "string", "description": "install | build | clone | pull | start | stop | restart | log", "enum": [ "install", "build", "clone", "pull", "start", "stop", "restart", "log" ] }, "domain": { "type": "string", "description": "save: domain or subdomain", "example": "app.example.co.il" }, "dir": { "type": "string", "description": "save: folder outside public_html", "example": "apps/app" }, "start": { "type": "string", "description": "save: start command", "example": "node server.js" }, "repoUrl": { "type": "string", "description": "save: Git repository URL", "example": "https://git.example.co.il/team/app.git" }, "repoBranch": { "type": "string", "description": "save: branch", "example": "main" }, "name": { "type": "string", "description": "env: variable name", "example": "APP_MODE" }, "value": { "type": "string", "description": "env: value" }, "remove": { "type": "boolean", "description": "env: remove the variable" }, "token": { "type": "string", "description": "clone/pull: read-only access token for a private repository" } }, "additionalProperties": false } } } } } }, "/mailboxes": { "post": { "operationId": "createMailbox", "summary": "Create a mailbox on the account domain", "tags": [ "Mailboxes" ], "description": "Permission: **Mailboxes** (`mail`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "local": { "type": "string", "description": "The part before @", "example": "info" }, "password": { "type": "string", "description": "Password, 10+ characters. Ask the customer." } }, "required": [ "local", "password" ], "additionalProperties": false } } } } } }, "/mailboxes/password": { "post": { "operationId": "changeMailboxPassword", "summary": "Change a mailbox password", "tags": [ "Mailboxes" ], "description": "Permission: **Mailboxes** (`mail`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "address": { "type": "string", "description": "Mailbox address", "example": "info@example.co.il" }, "password": { "type": "string", "description": "New password, 10+ characters" } }, "required": [ "address", "password" ], "additionalProperties": false } } } } } }, "/mailboxes/remove": { "post": { "operationId": "removeMailbox", "summary": "Remove a mailbox and its mail (confirm with the address)", "tags": [ "Mailboxes" ], "description": "Permission: **Mailboxes** (`mail`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "address": { "type": "string", "description": "Mailbox address", "example": "info@example.co.il" }, "confirm": { "type": "string", "description": "The same address again, to confirm" } }, "required": [ "address", "confirm" ], "additionalProperties": false } } } } } }, "/php": { "post": { "operationId": "setPhpVersion", "summary": "Choose the PHP version (8.3 recommended; 7.4 only for an old site). null = default", "tags": [ "Site settings" ], "description": "Permission: **Site settings** (`settings`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "version": { "type": [ "string", "null" ], "description": "One of /account php.available, e.g. \"83\"", "example": "83" } }, "additionalProperties": false } } } } } }, "/scheduled-jobs": { "post": { "operationId": "addScheduledJob", "summary": "Run a PHP file on a schedule", "tags": [ "Site settings" ], "description": "Permission: **Site settings** (`settings`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "script": { "type": "string", "description": "PHP file relative to the home folder", "example": "public_html/cron.php" }, "everyMinutes": { "type": "integer", "description": "How often, in minutes", "example": 15 } }, "required": [ "script", "everyMinutes" ], "additionalProperties": false } } } } } }, "/scheduled-jobs/{jobId}": { "delete": { "operationId": "removeScheduledJob", "summary": "Remove a scheduled job", "tags": [ "Site settings" ], "description": "Permission: **Site settings** (`settings`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "parameters": [ { "name": "jobId", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/diagnose/targets": { "get": { "operationId": "listCheckTargets", "summary": "What the checks can be run on (the account sites)", "tags": [ "View" ], "description": "Permission: **View** (`view`), view only is enough.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } } } }, "/diagnose": { "post": { "operationId": "runCheck", "summary": "Run an automatic check for a problem (issues are listed in /account diagnose)", "tags": [ "Diagnosis and support" ], "description": "Permission: **Diagnosis and support** (`support`), view only is enough.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "issue": { "type": "string", "description": "Issue id from /account diagnose" }, "inputs": { "type": "object", "description": "The inputs that issue asks for" } }, "required": [ "issue" ], "additionalProperties": false } } } } } }, "/diagnose/repair": { "post": { "operationId": "applyFix", "summary": "Apply a fix the check offered", "tags": [ "Diagnosis and support" ], "description": "Permission: **Diagnosis and support** (`support`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "caseRef": { "type": "string", "description": "The case reference the check returned" }, "action": { "type": "string", "description": "The fix id the check offered" } }, "required": [ "caseRef", "action" ], "additionalProperties": false } } } } } }, "/diagnose/feedback": { "post": { "operationId": "sendCheckFeedback", "summary": "Say whether the check solved it", "tags": [ "Diagnosis and support" ], "description": "Permission: **Diagnosis and support** (`support`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "caseRef": { "type": "string", "description": "Case reference" }, "helped": { "type": "boolean", "description": "true if solved" } }, "required": [ "caseRef", "helped" ], "additionalProperties": false } } } } } }, "/diagnose/escalate": { "post": { "operationId": "escalateCheck", "summary": "Pass the case to the support team", "tags": [ "Diagnosis and support" ], "description": "Permission: **Diagnosis and support** (`support`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "caseRef": { "type": "string", "description": "Case reference" }, "text": { "type": "string", "description": "What happened, up to 600 characters" } }, "required": [ "caseRef" ], "additionalProperties": false } } } } } }, "/support": { "post": { "operationId": "openSupportRequest", "summary": "Open a technical request to the support team (or ask for the paid migration service)", "tags": [ "Diagnosis and support" ], "description": "Permission: **Diagnosis and support** (`support`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "topic": { "type": "string", "description": "technical | migration", "enum": [ "technical", "migration" ] }, "text": { "type": "string", "description": "The request, in the customer's words" }, "nonce": { "type": "string", "description": "Any unique value, so a retry does not open a second request" } }, "required": [ "text" ], "additionalProperties": false } } } } } }, "/export": { "post": { "operationId": "prepareAccountCopy", "summary": "Prepare a full copy of the account (needs the \"Full account copy\" permission)", "tags": [ "Full account copy" ], "description": "Permission: **Full account copy** (`export`), needs view and change.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } } }, "get": { "operationId": "getAccountCopy", "summary": "The copy: progress, and a download link when ready", "tags": [ "Full account copy" ], "description": "Permission: **Full account copy** (`export`), view only is enough.", "security": [ { "bearer": [] } ], "responses": { "200": { "description": "Done. Most actions answer with the updated account view." }, "401": { "description": "No key, an unknown, revoked or expired key, or the connection is switched off." }, "403": { "description": "`ai_scope`: the key lacks this permission or has it as view only (`scope` names it; `:write` = needs view and change). Tell the owner which category to change (see the steps in info.description)." }, "409": { "description": "Not possible in the current state (e.g. `setup_needed`: verify domain ownership first)." }, "429": { "description": "Too many requests; wait and retry." } } } } } } ```