WP Engine Site Transfer API
The Site Transfer API from WP Engine — 3 operation(s) for site transfer.
The Site Transfer API from WP Engine — 3 operation(s) for site transfer.
swagger: '2.0'
info:
description: 'The API described in this document is subject to change.
'
version: 1.17.0
title: WP Engine Hosting Platform Account Site Transfer API
termsOfService: https://wpengine.com/legal/terms-of-service/
host: api.wpengineapi.com
basePath: /v1
schemes:
- https
tags:
- name: Site Transfer
paths:
/accounts/{account_id}/site_transfers:
get:
tags:
- Site Transfer
summary: List site transfers for an account
description: '# Description
Returns a paginated list of site transfers initiated from the given account.
Requires Owner or Full with Billing access.
> **Note:** This endpoint represents the state of Sites at time of transfer,
> not necessarily the current Site name or environments.
'
operationId: listAccountSiteTransfers
produces:
- application/json
parameters:
- $ref: '#/parameters/authorization'
- name: account_id
in: path
description: ID of account
required: true
type: string
format: uuid
x-example: eeda3227-9a39-46ae-9e14-20958bb4e6c9
- $ref: '#/parameters/limitParam'
- $ref: '#/parameters/offsetParam'
responses:
'200':
description: List of site transfers for the account
schema:
type: object
properties:
previous:
$ref: '#/definitions/PreviousPage'
next:
$ref: '#/definitions/NextPage'
count:
$ref: '#/definitions/ResultsCount'
results:
type: array
items:
$ref: '#/definitions/SiteTransfer'
'400':
description: Bad Request
schema:
$ref: '#/definitions/BadRequestErrorResponse'
'401':
description: Authentication Error
schema:
$ref: '#/definitions/AuthenticationErrorResponse'
'403':
description: Not authorized
schema:
$ref: '#/definitions/ForbiddenErrorResponse'
'404':
description: Not found
schema:
$ref: '#/definitions/NotFoundErrorResponse'
'429':
$ref: '#/definitions/TooManyRequestsOperation'
'500':
description: Internal Server Error
schema:
$ref: '#/definitions/InternalServerErrorResponse'
'503':
$ref: '#/definitions/ServiceUnavailableOperation'
security:
- basicAuth: []
x-amazon-apigateway-integration:
uri: https://my.wpengine.com/capi/v1/accounts/{account_id}/site_transfers
responses:
'200':
statusCode: '200'
'400':
statusCode: '400'
'401':
statusCode: '401'
'403':
statusCode: '403'
'404':
statusCode: '404'
'429':
statusCode: '429'
'500':
statusCode: '500'
'503':
statusCode: '503'
default:
statusCode: '500'
requestParameters:
integration.request.header.X-Request-ID: context.requestId
integration.request.header.sourceIp: context.identity.sourceIp
integration.request.header.authorization: method.request.header.Authorization
integration.request.path.account_id: method.request.path.account_id
integration.request.querystring.limit: method.request.querystring.limit
integration.request.querystring.offset: method.request.querystring.offset
passthroughBehavior: when_no_match
httpMethod: GET
type: http
/sites/{site_id}/site_transfers:
get:
tags:
- Site Transfer
summary: List site transfers for a site
description: '# Description
Returns a paginated list of transfers associated with the given site.
Requires Owner or Full with Billing access.
'
operationId: listSiteTransfers
produces:
- application/json
parameters:
- $ref: '#/parameters/authorization'
- name: site_id
in: path
description: ID of the site
required: true
type: string
format: uuid
x-example: a1b2c3d4-e5f6-41b2-b3d4-e5f6a1b2c3d4
- $ref: '#/parameters/limitParam'
- $ref: '#/parameters/offsetParam'
responses:
'200':
description: List of site transfers
schema:
type: object
properties:
previous:
$ref: '#/definitions/PreviousPage'
next:
$ref: '#/definitions/NextPage'
count:
$ref: '#/definitions/ResultsCount'
results:
type: array
items:
$ref: '#/definitions/SiteTransfer'
'400':
description: Bad Request
schema:
$ref: '#/definitions/BadRequestErrorResponse'
'401':
description: Authentication Error
schema:
$ref: '#/definitions/AuthenticationErrorResponse'
'403':
description: Not authorized
schema:
$ref: '#/definitions/ForbiddenErrorResponse'
'404':
description: Not found
schema:
$ref: '#/definitions/NotFoundErrorResponse'
'429':
$ref: '#/definitions/TooManyRequestsOperation'
'500':
description: Internal Server Error
schema:
$ref: '#/definitions/InternalServerErrorResponse'
'503':
$ref: '#/definitions/ServiceUnavailableOperation'
security:
- basicAuth: []
x-amazon-apigateway-integration:
uri: https://my.wpengine.com/capi/v1/sites/{site_id}/site_transfers
responses:
'200':
statusCode: '200'
'400':
statusCode: '400'
'401':
statusCode: '401'
'403':
statusCode: '403'
'404':
statusCode: '404'
'429':
statusCode: '429'
'500':
statusCode: '500'
'503':
statusCode: '503'
default:
statusCode: '500'
requestParameters:
integration.request.header.X-Request-ID: context.requestId
integration.request.header.sourceIp: context.identity.sourceIp
integration.request.header.authorization: method.request.header.Authorization
integration.request.path.site_id: method.request.path.site_id
integration.request.querystring.limit: method.request.querystring.limit
integration.request.querystring.offset: method.request.querystring.offset
passthroughBehavior: when_no_match
httpMethod: GET
type: http
post:
tags:
- Site Transfer
summary: Initiate a site transfer
description: '# Description
Requests a transfer of the given site to a destination account.
The transfer is accepted asynchronously and will initially have a `pending` or `scheduled` status.
Requires Owner or Full with Billing access on both the origin and destination accounts.
##### Constraints
* Origin and destination accounts must be different
* Sandbox sites cannot be transferred
* The destination account must have a preferred Data Center configured
* If `scheduled_time` is provided, it must be an RFC 3339 datetime between 1 hour and 7 days in the future
'
operationId: createSiteTransfer
consumes:
- application/json
produces:
- application/json
parameters:
- $ref: '#/parameters/authorization'
- name: site_id
in: path
description: ID of the site to transfer
required: true
type: string
format: uuid
x-example: a1b2c3d4-e5f6-41b2-b3d4-e5f6a1b2c3d4
- in: body
name: body
required: true
description: '##### Properties
* `destination_account_id` *(required)* — UUID of the account to transfer the site to
* `scheduled_time` *(optional)* — RFC 3339 datetime at which the transfer should be executed (must be between 1 hour and 7 days in the future). Omit to transfer immediately.
* `maintenance_mode` *(optional)* — Whether to enable maintenance mode during the transfer. Defaults to `false`.
'
schema:
type: object
required:
- destination_account_id
properties:
destination_account_id:
type: string
format: uuid
description: UUID of the destination account
example: eeda3227-9a39-46ae-9e14-20958bb4e6c9
scheduled_time:
type: string
format: date-time
description: 'RFC 3339 datetime at which to execute the transfer. Must be between 1 hour and 7 days in the future. Example: ''2026-06-01T14:30:00Z'''
example: '2026-06-01T14:30:00Z'
x-nullable: true
maintenance_mode:
type: boolean
description: Whether to enable maintenance mode on the site during the transfer
default: false
example: false
responses:
'202':
description: Transfer accepted
schema:
$ref: '#/definitions/SiteTransfer'
'400':
description: Bad Request
schema:
$ref: '#/definitions/BadRequestErrorResponse'
'401':
description: Authentication Error
schema:
$ref: '#/definitions/AuthenticationErrorResponse'
'403':
description: Not authorized
schema:
$ref: '#/definitions/ForbiddenErrorResponse'
'404':
description: Not found
schema:
$ref: '#/definitions/NotFoundErrorResponse'
'409':
description: Conflict — e.g. site already has an active transfer, site is not in a transferable state, or destination account is not eligible.
schema:
$ref: '#/definitions/ConflictErrorResponse'
'422':
description: Unprocessable Entity — e.g. validation failed on transfer parameters
schema:
$ref: '#/definitions/UnprocessableEntityErrorResponse'
'429':
$ref: '#/definitions/TooManyRequestsOperation'
'500':
description: Internal Server Error
schema:
$ref: '#/definitions/InternalServerErrorResponse'
'503':
$ref: '#/definitions/ServiceUnavailableOperation'
security:
- basicAuth: []
x-amazon-apigateway-integration:
uri: https://my.wpengine.com/capi/v1/sites/{site_id}/site_transfers
responses:
'202':
statusCode: '202'
'400':
statusCode: '400'
'401':
statusCode: '401'
'403':
statusCode: '403'
'404':
statusCode: '404'
'409':
statusCode: '409'
'422':
statusCode: '422'
'429':
statusCode: '429'
'500':
statusCode: '500'
'503':
statusCode: '503'
default:
statusCode: '500'
requestParameters:
integration.request.header.X-Request-ID: context.requestId
integration.request.header.sourceIp: context.identity.sourceIp
integration.request.header.authorization: method.request.header.Authorization
integration.request.path.site_id: method.request.path.site_id
passthroughBehavior: when_no_match
httpMethod: POST
type: http
/sites/{site_id}/site_transfers/{transfer_id}:
get:
tags:
- Site Transfer
summary: Get a site transfer by ID
description: Returns a single site transfer for the given site.
operationId: getSiteTransfer
produces:
- application/json
parameters:
- $ref: '#/parameters/authorization'
- name: site_id
in: path
description: ID of the site
required: true
type: string
format: uuid
x-example: a1b2c3d4-e5f6-41b2-b3d4-e5f6a1b2c3d4
- name: transfer_id
in: path
description: ID of the site transfer
required: true
type: string
format: uuid
x-example: 7c3e1a2b-4f5d-4e6c-b7a8-d9e0f1a2b3c4
responses:
'200':
description: Success
schema:
$ref: '#/definitions/SiteTransfer'
'401':
description: Authentication Error
schema:
$ref: '#/definitions/AuthenticationErrorResponse'
'403':
description: Not authorized
schema:
$ref: '#/definitions/ForbiddenErrorResponse'
'404':
description: Not found
schema:
$ref: '#/definitions/NotFoundErrorResponse'
'429':
$ref: '#/definitions/TooManyRequestsOperation'
'500':
description: Internal Server Error
schema:
$ref: '#/definitions/InternalServerErrorResponse'
'503':
$ref: '#/definitions/ServiceUnavailableOperation'
security:
- basicAuth: []
x-amazon-apigateway-integration:
uri: https://my.wpengine.com/capi/v1/sites/{site_id}/site_transfers/{transfer_id}
responses:
'200':
statusCode: '200'
'401':
statusCode: '401'
'403':
statusCode: '403'
'404':
statusCode: '404'
'429':
statusCode: '429'
'500':
statusCode: '500'
'503':
statusCode: '503'
default:
statusCode: '500'
requestParameters:
integration.request.header.X-Request-ID: context.requestId
integration.request.header.sourceIp: context.identity.sourceIp
integration.request.header.authorization: method.request.header.Authorization
integration.request.path.site_id: method.request.path.site_id
integration.request.path.transfer_id: method.request.path.transfer_id
passthroughBehavior: when_no_match
httpMethod: GET
type: http
delete:
tags:
- Site Transfer
summary: Cancel a scheduled site transfer
description: '# Description
Cancels a site transfer. Only transfers that have not yet started can be cancelled;
a transfer that has already started will return `409 Conflict`.
'
operationId: cancelSiteTransfer
produces:
- application/json
parameters:
- $ref: '#/parameters/authorization'
- name: site_id
in: path
description: ID of the site
required: true
type: string
format: uuid
x-example: a1b2c3d4-e5f6-41b2-b3d4-e5f6a1b2c3d4
- name: transfer_id
in: path
description: ID of the site transfer to cancel
required: true
type: string
format: uuid
x-example: 7c3e1a2b-4f5d-4e6c-b7a8-d9e0f1a2b3c4
responses:
'204':
description: Transfer cancelled
'401':
description: Authentication Error
schema:
$ref: '#/definitions/AuthenticationErrorResponse'
'403':
description: Not authorized
schema:
$ref: '#/definitions/ForbiddenErrorResponse'
'404':
description: Not found
schema:
$ref: '#/definitions/NotFoundErrorResponse'
'409':
description: Conflict — transfer has already started and cannot be cancelled
schema:
$ref: '#/definitions/ConflictErrorResponse'
'429':
$ref: '#/definitions/TooManyRequestsOperation'
'500':
description: Internal Server Error
schema:
$ref: '#/definitions/InternalServerErrorResponse'
'503':
$ref: '#/definitions/ServiceUnavailableOperation'
security:
- basicAuth: []
x-amazon-apigateway-integration:
uri: https://my.wpengine.com/capi/v1/sites/{site_id}/site_transfers/{transfer_id}
responses:
'204':
statusCode: '204'
'401':
statusCode: '401'
'403':
statusCode: '403'
'404':
statusCode: '404'
'409':
statusCode: '409'
'429':
statusCode: '429'
'500':
statusCode: '500'
'503':
statusCode: '503'
default:
statusCode: '500'
requestParameters:
integration.request.header.X-Request-ID: context.requestId
integration.request.header.sourceIp: context.identity.sourceIp
integration.request.header.authorization: method.request.header.Authorization
integration.request.path.site_id: method.request.path.site_id
integration.request.path.transfer_id: method.request.path.transfer_id
passthroughBehavior: when_no_match
httpMethod: DELETE
type: http
definitions:
InternalServerErrorResponse:
type: object
required:
- message
properties:
message:
type: string
description: A message regarding the error that occurred on the server
example: An unexpected error occurred, please try again in a few minutes
ConflictErrorResponse:
type: object
required:
- message
properties:
message:
type: string
description: A message regarding the conflict that occurred
example: Transfer has already started and cannot be cancelled
documentation_url:
type: string
description: (Optional) A URL where documentation regarding this specific error can be found
NotFoundErrorResponse:
type: object
required:
- message
properties:
message:
type: string
description: A message regarding the error that occurred on the server
example: Not Found
documentation_url:
type: string
description: (Optional) A URL where documentation regarding this specific error can be found
PreviousPage:
type: string
example: https://api.wpengineapi.com/v1/example-endpoint?limit=100&offset=0
x-nullable: true
description: Path to the previous page of results
ResourceError:
type: object
required:
- resource
- field
- type
- code
- message
properties:
resource:
type: string
description: The name of the resource that was being processed when the error occurred
example: Site
field:
type: string
description: (Optional) The specific field associated with the error
example: name
type:
type: string
description: (Optional) A type associated with the error. `invalid_value`, `access_error`, `value_unavailable`
example: invalid_value
code:
type: string
description: (Optional) A machine code relating to the error that occurred with the field and resource
example: too_long
message:
type: string
description: (Optional) A human-readable message relating to the error that occurred with the field and resource
example: Name is too long (maximum is 40 characters)
UnprocessableEntityErrorResponse:
type: object
required:
- message
properties:
message:
type: string
description: A message regarding the unprocessable entity that occurred
example: Validation failed on transfer parameters
documentation_url:
type: string
description: (Optional) A URL where documentation regarding this specific error can be found
errors:
type: array
description: An array of error objects describing specific errors that arose when servicing the request
items:
$ref: '#/definitions/ResourceError'
NextPage:
type: string
example: https://api.wpengineapi.com/v1/example-endpoint?limit=100&offset=200
x-nullable: true
description: Path to the next page of results
TooManyRequestsOperation:
description: Too many requests
BadRequestErrorResponse:
type: object
required:
- message
properties:
message:
type: string
description: A message regarding the error that occurred on the server
example: 'Invalid Site: Name cannot be empty.'
documentation_url:
type: string
description: (Optional) A URL where documentation regarding this specific error can be found
errors:
type: array
description: An array of error objects describing specific errors that arose when servicing the request
items:
$ref: '#/definitions/ResourceError'
SiteTransfer:
type: object
required:
- id
- site
- installs
- origin_account
- destination_account
- status
- created_at
- updated_at
properties:
id:
type: string
format: uuid
description: Unique identifier for the site transfer
example: 7c3e1a2b-4f5d-4e6c-b7a8-d9e0f1a2b3c4
site:
type: string
description: Name of the site being transferred (as it was at time of transfer)
example: my-wordpress-site
installs:
type: array
description: Names of the installs associated with the site at time of transfer
items:
type: string
example:
- mysite
- mysitestg
origin_account:
type: string
description: Name of the account the site is transferring from
example: Acme Corp
destination_account:
type: string
description: Name of the account the site is transferring to
example: New Owner Inc
status:
type: string
description: Current status of the transfer
enum:
- pending
- scheduled
- in_progress
- completed
- failed
- cancelled
example: scheduled
scheduled_time:
type: string
format: date-time
x-nullable: true
description: The time at which the transfer is scheduled to execute. Null for immediate transfers.
example: '2026-06-01T14:30:00Z'
created_at:
type: string
format: date-time
description: Timestamp when the transfer was created
example: '2026-05-15T10:00:00Z'
updated_at:
type: string
format: date-time
description: Timestamp when the transfer was last updated
example: '2026-05-15T10:05:00Z'
ServiceUnavailableOperation:
description: Service unavailable
ResultsCount:
type: integer
example: 225
description: The total number of results
ForbiddenErrorResponse:
type: object
required:
- message
properties:
message:
type: string
description: A message regarding the error that occurred on the server
example: You don't have permission to perform that action
documentation_url:
type: string
description: (Optional) A URL where documentation regarding this specific error can be found
AuthenticationErrorResponse:
type: object
required:
- message
properties:
message:
type: string
description: A message regarding the error that occurred on the server
example: Bad Credentials
documentation_url:
type: string
description: (Optional) A URL where documentation regarding this specific error can be found
parameters:
offsetParam:
name: offset
in: query
type: integer
required: false
default: 0
minimum: 0
description: (Optional) The first record of the result set to be retrieved
authorization:
name: Authorization
in: header
type: string
format: uuid
limitParam:
name: limit
in: query
type: integer
required: false
default: 100
minimum: 0
maximum: 100
description: (Optional) The number of records to return
securityDefinitions:
basicAuth:
type: basic
description: 'API username and password from Portal''s API Access page: https://my.wpengine.com/api_access'