partner
POST /v1/partner/customers/{externalId}/site-moves/{moveId}/retry
Re-run a failed move from where it failed.
Authentication
Send an API key as a bearer token. The key must carry the partner.domains 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/partner/customers/{externalId}/site-moves/{moveId}/retry \
-H "Authorization: Bearer zdk_live_…" \
-H "Content-Type: application/json" \
-d '{ }'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
Accepted only when the move says retryable: true — it failed after its site was built (archive_unreachable, archive_checksum_mismatch, import_failed, preview_not_serving, health_check_failed), so the slot is already spent. Send a new archive_url + archive_sha256 when the old link may have expired. Anything else is 422 move_not_retryable: start a new move. Same move id, a new attempt. Requires partner.domains.
Parameters
| Name | Type | Required | What it is |
|---|---|---|---|
externalId (path) | string | Yes | YOUR id for that customer — whatever your own system calls them. It is what makes linking idempotent, and it is scoped to your partner programme: another partner's id is a 404… |
moveId (path) | string | Yes | The move's id, as createPartnerSiteMove returned it. |
Request body
| Name | Type | Required | What it is |
|---|---|---|---|
archive_url | string | No | — |
archive_sha256 | string | No | — |
Response
| Name | Type | Required | What it is |
|---|---|---|---|
id | string | Yes | — |
status | string<queued, importing, imported, going_live, live, failed, cancelled> | Yes | imported — built and answering on preview_url; switch DNS, then call goLivePartnerSiteMove. live — the domain is served by us over HTTPS; only now delete the original. |
domain | string | Yes | — |
app | string | Yes | — |
subscription_id | string | Yes | — |
v2_site_id | object | Yes | Our site id, once the site exists. |
source_ref | string | Yes | — |
replaced_site | boolean | Yes | Whether the move imported into an existing empty site. |
preview_url | string | Yes | An https address that serves the imported site with no DNS change, or "" until imported. |
origin | object | Yes | What the domain's web record must point at. Publish an A to each a address; aaaa is empty while the box has no IPv6 — publish no AAAA then. |
tls | object | Yes | — |
checks | object | Yes | What we measured on the preview after the import. |
error_code | string | Yes | — |
error | string | Yes | — |
created_at | string | Yes | — |
updated_at | string | Yes | — |
live_at | object | Yes | — |
step | string<queued, creating_site, waiting_for_space, downloading, importing_files, importing_database, checking, ready_to_switch, waiting_for_dns, switching, securing, live, failed, cancelled> | No | Where the move is, finer than status — show it with progress and elapsed_seconds so a long import never looks crashed. There is no size limit and no clock on a move's size… |
progress | object | No | Measured on the hosting box while it applies the archive. null means not known yet — never zero. |
started_at | string | No | — |
step_started_at | object | No | — |
elapsed_seconds | integer | No | — |
retryable | boolean | No | — |
dns_case | string<partner_switch, customer_switch, unknown> | No | — |
dns_holder | string | No | — |
switch | object | No | EXACTLY what to publish for the domain to be served by us. |
rollback_advised | boolean | No | Your switch did not take within the attempt: restore the records you saved in dns.current. The original never stopped serving. |
waiting_since | object | No | — |
reminders_sent | integer | No | — |
extra_disk_mb | integer | No | Free disk space (MB) this move gave the site on top of its plan so the move could land whatever its size (D28455). 0 when the plan's own space was enough. Always present. |
extra_disk_expires_at | object | No | When extra_disk_mb ends: 7 days after live_at (D28457). null while the move is still running (the extra is open-ended until it goes live) or when there is no extra.… |
Errors this endpoint can return
401 · 403 · 404 · 422 · 429