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'