hosting

POST /v1/migrations/ai-moves

Ask our AI to move a site here — free, overseen by our team.

All hosting endpoints

All developer docs →

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

NameTypeRequiredWhat it is
target_domainstringYesThe domain being moved.
site_idobjectNoMove into this site; omit to create one.
product_linestringNoThe line a new site is created on.
platformstring<cpanel, plesk, directadmin, wordpress, moodle, joomla, static, other>Yes—
source_urlsstring[]Yes—
accessAiMoveAccessYesAt least one of ssh, panel, ftp; database and wp_admin help the checks.
approx_sizestring<under_1gb, 1_10gb, 10_50gb, over_50gb, unknown>No—
move_itemsstring<files, databases, mail, dns, other_sites>[]No—
cutover_windowstringNo—
timezonestringNo—
contact_namestringNo—
contact_emailstringNo—
notesstringNo—
consentbooleanYesMust be true: our AI may sign in to the old host and copy the site (read-only).
edge_choicestring<auto, ours, theirs>NoThe 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

NameTypeRequiredWhat it is
idstringYes—
org_idstringYes—
site_idobjectNo—
target_domainstringYes—
product_linestringNo—
stagestring<received, checking_access, needs_access, checking_fit, needs_upgrade, ready_to_copy, copying, verifying, awaiting_cutover, done, needs_staff, cancelled>Yes—
pausedbooleanYes—
taken_overbooleanYesA person from our migration team has taken it over.
platformstringYes—
source_urlsstring[]Yes—
access_kindsstring[]Yes—
access_reportobjectNoPer access kind, ok or the refusal code of the last check.
routestringNoThe route chosen (ssh, cpanel, plesk, directadmin, ftp).
inventoryobjectNo—
fitobjectNoThe plan-fit verdict and any upgrade offered (engine-quoted).
approx_sizestringNo—
move_itemsstring[]No—
cutover_windowstringNo—
timezonestringNo—
ticket_idobjectNo—
checksobjectNoThe switch-over verdict: preview, app, passed (both), then live after the switch-over.
go_atobjectNoWhen the GO was given.
needsstring<, access, mailboxes, replace>NoWhat a waiting move is asking the customer for.
preview_urlstringNoThe preview address, while waiting to switch over.
extra_purchase_idobjectNo—
started_by_staffbooleanNo—
created_atobjectYes—
updated_atobjectNo—
completed_atobjectNo—

Errors this endpoint can return

401 · 403 · 422 · 503