hosting
POST /v1/migrations/ai-moves
Ask our AI to move a site here — free, overseen by our team.
Authentication
Send an API key as a bearer token. The key must carry the hosting.import.manage permission; a key without it is refused with 403, not 404.
This endpoint takes no organisation id. Your key already identifies the organisation it belongs to, and the response is scoped to it.
Try it
Replace anything in angle brackets with your own values, and the key placeholder with a key from your dashboard.
curl -X POST https://api.zinndigital.com/v1/migrations/ai-moves \
-H "Authorization: Bearer zdk_live_…" \
-H "Content-Type: application/json" \
-d '{ "target_domain": <string>, "platform": <string<cpanel, plesk, directadmin, wordpress, moodle, joomla, static, other>>, "source_urls": <string[]>, "access": <AiMoveAccess>, "consent": <boolean> }'Signed in? The API console in your dashboard fills in your real organisation id and your own key, and runs the request against the live API so you can see the actual response. Open this endpoint in the API console
Details
The intake. The access given (access) is written straight to Vault and never stored, logged or returned; the request keeps only which kinds of access were given and the host each points at. A $0 managed_migration purchase keeps the SLA, and a support ticket is opened for the customer and linked both ways — every step the AI takes is posted there. Refused with 403 unless eligible (getAiMoveEligibility): a trial is refused with ai_move_trial. With no site_id the move creates the site, which needs sites.create. Requires hosting.import.manage.
Request body
| Name | Type | Required | What it is |
|---|---|---|---|
target_domain | string | Yes | The domain being moved. |
site_id | object | No | Move into this site; omit to create one. |
product_line | string | No | The line a new site is created on. |
platform | string<cpanel, plesk, directadmin, wordpress, moodle, joomla, static, other> | Yes | — |
source_urls | string[] | Yes | — |
access | AiMoveAccess | Yes | At least one of ssh, panel, ftp; database and wp_admin help the checks. |
approx_size | string<under_1gb, 1_10gb, 10_50gb, over_50gb, unknown> | No | — |
move_items | string<files, databases, mail, dns, other_sites>[] | No | — |
cutover_window | string | No | — |
timezone | string | No | — |
contact_name | string | No | — |
contact_email | string | No | — |
notes | string | No | — |
consent | boolean | Yes | Must be true: our AI may sign in to the old host and copy the site (read-only). |
edge_choice | string<auto, ours, theirs> | No | The CDN the new site is created on: auto uses the account's own connected CDN if it has one, else ours. Footprint-Free lines ignore it (pool rules). |
Response
| Name | Type | Required | What it is |
|---|---|---|---|
id | string | Yes | — |
org_id | string | Yes | — |
site_id | object | No | — |
target_domain | string | Yes | — |
product_line | string | No | — |
stage | string<received, checking_access, needs_access, checking_fit, needs_upgrade, ready_to_copy, copying, verifying, awaiting_cutover, done, needs_staff, cancelled> | Yes | — |
paused | boolean | Yes | — |
taken_over | boolean | Yes | A person from our migration team has taken it over. |
platform | string | Yes | — |
source_urls | string[] | Yes | — |
access_kinds | string[] | Yes | — |
access_report | object | No | Per access kind, ok or the refusal code of the last check. |
route | string | No | The route chosen (ssh, cpanel, plesk, directadmin, ftp). |
inventory | object | No | — |
fit | object | No | The plan-fit verdict and any upgrade offered (engine-quoted). |
approx_size | string | No | — |
move_items | string[] | No | — |
cutover_window | string | No | — |
timezone | string | No | — |
ticket_id | object | No | — |
checks | object | No | The switch-over verdict: preview, app, passed (both), then live after the switch-over. |
go_at | object | No | When the GO was given. |
needs | string<, access, mailboxes, replace> | No | What a waiting move is asking the customer for. |
preview_url | string | No | The preview address, while waiting to switch over. |
extra_purchase_id | object | No | — |
started_by_staff | boolean | No | — |
created_at | object | Yes | — |
updated_at | object | No | — |
completed_at | object | No | — |
Errors this endpoint can return
401 · 403 · 422 · 503