WP Engine Site Transfer API

The Site Transfer API from WP Engine — 3 operation(s) for site transfer.

OpenAPI Specification

wpengine-site-transfer-api-openapi.yml Raw ↑
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'