# Web Cloud › Internet › Pack › Order & Installation API

> Part of the OVHcloud developer hub. Index of every page and section: https://developers.eu.ovhcloud.com/llms.txt
> The Web Cloud product's sections: https://developers.eu.ovhcloud.com/reference/web-cloud/llms.txt
> Everything in one file: https://developers.eu.ovhcloud.com/llms-full.txt

> 7 operations of the OVHcloud API. Calls carry `authorization: Bearer $OVH_TOKEN`; the EU host is shown, Canada and the United States answer on api.ca.ovhcloud.com and api.us.ovhcloud.com.

Page: https://developers.eu.ovhcloud.com/reference/web-cloud/internet/pack/order-installation/

OpenAPI v1: https://api.eu.ovhcloud.com/1.0/__schemas/developer-hub-navigation/web-cloud/internet/pack/order-installation.json?format=openapi3
OpenAPI v2: https://api.eu.ovhcloud.com/v2/__schemas/developer-hub-navigation/web-cloud/internet/pack/order-installation.json?format=openapi3

## Operations

- `POST /pack/xdsl/{packName}/addressMove/moveOffer` — Move an xDSL pack to another address
- `POST /pack/xdsl/{packName}/addressMove/offers` — Search the address move offers of an xDSL pack
- `POST /pack/xdsl/{packName}/addressMove/servicesToDeleteUnpackTerms` — List the services to delete to move an xDSL pack
- `POST /pack/xdsl/{packName}/migration/migrate` — Migrate an xDSL pack to another offer
- `POST /pack/xdsl/{packName}/migration/offers` — Search the migration offers of an xDSL pack
- `POST /pack/xdsl/{packName}/migration/servicesToDeleteUnpackTerms` — List the services to delete to migrate an xDSL pack
- `GET /pack/xdsl/{packName}/orderFollowUp` — Get the order follow-up of an xDSL pack

## Move an xDSL pack to another address

`POST /1.0/pack/xdsl/{packName}/addressMove/moveOffer`

Link: https://developers.eu.ovhcloud.com/reference/web-cloud/internet/pack/order-installation/#post-pack-xdsl-packname-addressmove-moveoffer

**Status:** Stable production version  
**IAM actions:** `packXdsl:apiovh:addressMove/moveOffer`

Move an xDSL pack to another address. Starts the move to the new address with the chosen offer, modem, installation details and services to keep or delete. Returns an asynchronous task.

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `packName` | path | string | yes | The internal name of your pack |

### Request body (required)

Type: `object`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `acceptContracts` | boolean | yes | You explicitly accept the terms of the contract corresponding to your new offer |
| `building` | string |  | Building identifier, "null" if no identifier is available |
| `buildingReference` | string |  | Building reference for FTTH and FTTE offers |
| `contactPhone` | string |  | Customer contact phone number |
| `door` | string |  | Door identifier, "null" if no identifier is available |
| `eligibilityReference` | string | yes | Eligibility reference |
| `engageMonths` | integer |  | Number of months of re-engagement |
| `floor` | string |  | Floor identifier, "null" if no identifier is available |
| `installationType` | connectivity.eligibility.InstallationTypeEnum |  | Installation type, only on FTTH technology — one of `activate`, `activate_undefined`, `create`, `multiOtp` |
| `keepCurrentNumber` | boolean | yes | Whether or not the current number should be kept |
| `meeting` | xdsl.eligibility.BookMeetingSlot |  | Data to book a meeting slot |
| `meeting.fakeMeeting` | boolean |  | Whether or not to book a fake meeting slots (if no slots are available) |
| `meeting.meetingSlot` | xdsl.eligibility.MeetingSlot |  | The time slot to book, null if fakeMeeting is true |
| `meeting.meetingSlot.endDate` | string (date-time) |  | The end of the time slot |
| `meeting.meetingSlot.slotId` | string |  | Represent a meeting id for a fiber collect operator |
| `meeting.meetingSlot.startDate` | string (date-time) |  | The beginning of the time slot |
| `meeting.meetingSlot.uiCode` | string |  | An opaque string that represents an intervention unit |
| `meeting.name` | string |  | The name of the customer |
| `modem` | pack.xdsl.ModemOptionEnum | yes | Modem option chosen for the new offer — one of `no`, `recycled`, `yes` |
| `mondialRelayId` | integer |  | Mondial relay ID if a shipping is needed |
| `moveOutDate` | string (date-time) |  | The date when the customer is no longer at the current address. Must be between now and +30 days. The default date will be the one in 30 days from now. |
| `nicShipping` | string |  | nicShipping if a shipping is needed |
| `offerName` | string | yes | Reference of the new offer |
| `ontShippingContact` | string |  | Allows you to personalize a delivery address for the ONT. If empty, the address will be that of the installation |
| `options` | pack.xdsl.migration.OfferOption[] |  | Options wanted in the new offer |
| `options[].name` | string |  | Name of the option |
| `options[].quantity` | integer |  | Number of slots, couting included slots |
| `otp` | boolean | yes | Whether an Optical Termination Point (OTP) is already installed at the address |
| `otpReference` | string |  | Reference of the Optical Termination Point |
| `productCode` | string | yes | Product code, an unique identifier for the product from addressMove/offer |
| `residence` | string |  | Residence identifier, "null" if no identifier is available |
| `stair` | string |  | Stair identifier, "null" if no identifier is available |
| `subServicesToDelete` | pack.xdsl.migration.OfferServiceToDelete[] |  | List of domains of services to delete if needed |
| `subServicesToDelete[].service` | string |  | Type of the service |
| `subServicesToDelete[].type` | pack.xdsl.ServiceNameEnum |  | Type of the service to delete — one of `domain`, `emailPro`, `exchangeAccount`, `exchangeIndividual`, `exchangeOrganization`, `grt10ho`, `grt20m10ho`, `grt20m4ho`, `grt4ho`, `grt5m10ho`, `grt5m4ho`, `grtAlt`, … |
| `subServicesToKeep` | pack.xdsl.migration.OfferServiceToKeep[] |  | List of domains of services to keep if needed |
| `subServicesToKeep[].service` | string |  | Type of the service |
| `subServicesToKeep[].type` | pack.xdsl.ServiceNameEnum |  | Type of the service to keep — one of `domain`, `emailPro`, `exchangeAccount`, `exchangeIndividual`, `exchangeOrganization`, `grt10ho`, `grt20m10ho`, `grt20m4ho`, `grt4ho`, `grt5m10ho`, `grt5m4ho`, `grtAlt`, … |

```json
{
  "acceptContracts": true,
  "building": "string",
  "buildingReference": "string",
  "contactPhone": "string",
  "door": "string",
  "eligibilityReference": "string",
  "engageMonths": 0,
  "floor": "string",
  "installationType": "activate",
  "keepCurrentNumber": true,
  "meeting": {
    "fakeMeeting": true,
    "meetingSlot": {
      "endDate": "2024-01-01T12:00:00Z",
      "slotId": "string",
      "startDate": "2024-01-01T12:00:00Z",
      "uiCode": "string"
    },
    "name": "string"
  },
  "modem": "no",
  "mondialRelayId": 0,
  "moveOutDate": "2024-01-01T12:00:00Z",
  "nicShipping": "string",
  "offerName": "string",
  "ontShippingContact": "string",
  "options": [
    {
      "name": "string",
      "quantity": 0
    }
  ],
  "otp": true,
  "otpReference": "string",
  "productCode": "string",
  "residence": "string",
  "stair": "string",
  "subServicesToDelete": [
    {
      "service": "string",
      "type": "domain"
    }
  ],
  "subServicesToKeep": [
    {
      "service": "string",
      "type": "domain"
    }
  ]
}
```

### Responses

| Status | Type | Description |
| --- | --- | --- |
| 200 | pack.xdsl.AsyncTask_long | successful operation |

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `error` | string |  | Error |
| `result` | integer |  |  |
| `status` | pack.xdsl.AsyncTaskStatusEnum |  | Status of the call — one of `error`, `ok`, `pending` |

```json
{
  "error": "string",
  "result": 0,
  "status": "error"
}
```

### Example

```bash
curl -X POST \
  "https://api.eu.ovhcloud.com/1.0/pack/xdsl/{packName}/addressMove/moveOffer" \
  -H "accept: application/json" \
  -H "authorization: Bearer $OVH_TOKEN" \
  -H "content-type: application/json" \
  -d '{ }'
```

```python
'''
First, install the latest release of Python wrapper: $ pip install ovh
'''
import json
import ovh

# Instantiate an OVH Client.
# You can generate new credentials with full access to your account on
# the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)
client = ovh.Client(
	endpoint='ovh-eu',               # Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)
	application_key='xxxxxxxxxx',    # Application Key
	application_secret='xxxxxxxxxx', # Application Secret
	consumer_key='xxxxxxxxxx',       # Consumer Key
)

# Request body type: pack.xdsl.migration.OfferServiceToKeep[]
result = client.post("/pack/xdsl/{packName}/addressMove/moveOffer",
	acceptContracts = None, # You explicitly accept the terms of the contract corresponding to your new offer (type: boolean)
	building = None, # Building identifier, "null" if no identifier is available (type: string, nullable)
	buildingReference = None, # Building reference for FTTH and FTTE offers (type: string, nullable)
	contactPhone = None, # Customer contact phone number (type: string, nullable)
	door = None, # Door identifier, "null" if no identifier is available (type: string, nullable)
	eligibilityReference = None, # Eligibility reference (type: string)
	engageMonths = None, # Number of months of re-engagement (type: long, nullable)
	floor = None, # Floor identifier, "null" if no identifier is available (type: string, nullable)
	installationType = None, # Installation type, only on FTTH technology (type: connectivity.eligibility.InstallationTypeEnum, nullable)
	keepCurrentNumber = None, # Whether or not the current number should be kept (type: boolean)
	meeting = None, # Data to book a meeting slot (type: xdsl.eligibility.BookMeetingSlot, nullable)
	modem = None, # Modem option chosen for the new offer (type: pack.xdsl.ModemOptionEnum)
	mondialRelayId = None, # Mondial relay ID if a shipping is needed (type: long, nullable)
	moveOutDate = None, # The date when the customer is no longer at the current address. Must be between now and +30 days. The default date will be the one in 30 days from now. (type: datetime, nullable)
	nicShipping = None, # nicShipping if a shipping is needed (type: string, nullable)
	offerName = None, # Reference of the new offer (type: string)
	ontShippingContact = None, # Allows you to personalize a delivery address for the ONT. If empty, the address will be that of the installation (type: string, nullable)
	options = None, # Options wanted in the new offer (type: pack.xdsl.migration.OfferOption[], nullable)
	otp = None, # Whether an Optical Termination Point (OTP) is already installed at the address (type: boolean)
	otpReference = None, # Reference of the Optical Termination Point (type: string, nullable)
	productCode = None, # Product code, an unique identifier for the product from addressMove/offer (type: string)
	residence = None, # Residence identifier, "null" if no identifier is available (type: string, nullable)
	stair = None, # Stair identifier, "null" if no identifier is available (type: string, nullable)
	subServicesToDelete = None, # List of domains of services to delete if needed (type: pack.xdsl.migration.OfferServiceToDelete[], nullable)
	subServicesToKeep = None, # List of domains of services to keep if needed (type: pack.xdsl.migration.OfferServiceToKeep[], nullable)
)

# Pretty print
print(json.dumps(result, indent=4))
```

```php
<?php
/**
 * First, download the latest release of PHP wrapper on github
 * And include this script into the folder with extracted files
 */
require __DIR__ . '/vendor/autoload.php';
use \Ovh\Api;

/**
 * Instantiate an OVH Client.
 * You can generate new credentials with full access to your account on
 * the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)
 */
$ovh = new Api('xxxxxxxxxx',  // Application Key
               'xxxxxxxxxx',  // Application Secret
               'ovh-eu',      // Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)
               'xxxxxxxxxx'); // Consumer Key

// Request body type: pack.xdsl.migration.OfferServiceToKeep[]
$result = $ovh->post("/pack/xdsl/{packName}/addressMove/moveOffer", array(
	acceptContracts => null, // You explicitly accept the terms of the contract corresponding to your new offer (type: boolean)
	building => null, // Building identifier, "null" if no identifier is available (type: string, nullable)
	buildingReference => null, // Building reference for FTTH and FTTE offers (type: string, nullable)
	contactPhone => null, // Customer contact phone number (type: string, nullable)
	door => null, // Door identifier, "null" if no identifier is available (type: string, nullable)
	eligibilityReference => null, // Eligibility reference (type: string)
	engageMonths => null, // Number of months of re-engagement (type: long, nullable)
	floor => null, // Floor identifier, "null" if no identifier is available (type: string, nullable)
	installationType => null, // Installation type, only on FTTH technology (type: connectivity.eligibility.InstallationTypeEnum, nullable)
	keepCurrentNumber => null, // Whether or not the current number should be kept (type: boolean)
	meeting => null, // Data to book a meeting slot (type: xdsl.eligibility.BookMeetingSlot, nullable)
	modem => null, // Modem option chosen for the new offer (type: pack.xdsl.ModemOptionEnum)
	mondialRelayId => null, // Mondial relay ID if a shipping is needed (type: long, nullable)
	moveOutDate => null, // The date when the customer is no longer at the current address. Must be between now and +30 days. The default date will be the one in 30 days from now. (type: datetime, nullable)
	nicShipping => null, // nicShipping if a shipping is needed (type: string, nullable)
	offerName => null, // Reference of the new offer (type: string)
	ontShippingContact => null, // Allows you to personalize a delivery address for the ONT. If empty, the address will be that of the installation (type: string, nullable)
	options => null, // Options wanted in the new offer (type: pack.xdsl.migration.OfferOption[], nullable)
	otp => null, // Whether an Optical Termination Point (OTP) is already installed at the address (type: boolean)
	otpReference => null, // Reference of the Optical Termination Point (type: string, nullable)
	productCode => null, // Product code, an unique identifier for the product from addressMove/offer (type: string)
	residence => null, // Residence identifier, "null" if no identifier is available (type: string, nullable)
	stair => null, // Stair identifier, "null" if no identifier is available (type: string, nullable)
	subServicesToDelete => null, // List of domains of services to delete if needed (type: pack.xdsl.migration.OfferServiceToDelete[], nullable)
	subServicesToKeep => null, // List of domains of services to keep if needed (type: pack.xdsl.migration.OfferServiceToKeep[], nullable)
));

print_r($result);
?>
```

## Search the address move offers of an xDSL pack

`POST /1.0/pack/xdsl/{packName}/addressMove/offers`

Link: https://developers.eu.ovhcloud.com/reference/web-cloud/internet/pack/order-installation/#post-pack-xdsl-packname-addressmove-offers

**Status:** Stable production version  
**IAM actions:** `packXdsl:apiovh:addressMove/offers/create`

Search the address move offers of an xDSL pack. Returns, as an asynchronous task, the offers available at the new address for the given eligibility reference.

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `packName` | path | string | yes | The internal name of your pack |

### Request body (required)

Type: `object`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `eligibilityReference` | string | yes | Eligibility reference |

```json
{
  "eligibilityReference": "string"
}
```

### Responses

| Status | Type | Description |
| --- | --- | --- |
| 200 | pack.xdsl.AsyncTask_pack.xdsl.addressMove.MoveOfferResponse | successful operation |

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `error` | string |  | Error |
| `result` | pack.xdsl.addressMove.MoveOfferResponse |  | List of available Move address offer |
| `result.offers` | pack.xdsl.addressMove.MoveOffer[] |  | Array of offers |
| `result.offers[].contracts` | order.Contract[] |  | Contracts details for this offer |
| `result.offers[].customOntAddress` | boolean |  | Tells if the custom ont address is available on the offer |
| `result.offers[].description` | string |  | Description of the offer |
| `result.offers[].engageMonths` | integer |  | Number of months of engagement |
| `result.offers[].engaged` | boolean |  | Tells if the customer is still engaged |
| `result.offers[].modemOptions` | pack.xdsl.migration.OfferModemOption[] |  | List of modems for this offer |
| `result.offers[].modemReferenceToReturn` | string |  | Modem reference (Mac or Serial) to be returned |
| `result.offers[].needModem` | boolean |  | Tells if the offer needs a modem |
| `result.offers[].needNewModem` | boolean |  | Tells if the customer will have to change its modem |
| `result.offers[].offerName` | string |  | Name of the offer |
| `result.offers[].operator` | string |  | Collection operator (CO) |
| `result.offers[].options` | pack.xdsl.migration.OfferAvailableOption[] |  | Available options for the migration |
| `result.offers[].prices` | pack.xdsl.addressMove.PriceOffer |  | Prices detailed applicable for this offer |
| `result.offers[].productCodes` | string[] |  | List of product from provider available for an offer |
| `result.offers[].subServicesToDelete` | pack.xdsl.migration.SubServiceToDelete[] |  | List of sub services to delete |
| `result.offers[].url` | string |  | URL of the offer |
| `status` | pack.xdsl.AsyncTaskStatusEnum |  | Status of the call — one of `error`, `ok`, `pending` |

```json
{
  "error": "string",
  "result": {
    "offers": [
      {
        "contracts": [
          {
            "content": "string",
            "name": "string",
            "url": "string"
          }
        ],
        "customOntAddress": true,
        "description": "string",
        "engageMonths": 0,
        "engaged": true,
        "modemOptions": [
          {
            "name": "string",
            "price": {
              "currencyCode": null,
              "text": null,
              "value": null
            }
          }
        ],
        "modemReferenceToReturn": "string",
        "needModem": true,
        "needNewModem": true,
        "offerName": "string",
        "operator": "string",
        "options": [
          {
            "duration": 0,
            "included": 0,
            "name": "string",
            "optional": 0,
            "optionalPrice": {
              "currencyCode": null,
              "text": null,
              "value": null
            }
          }
        ],
        "prices": {
          "creationLineFees": {
            "description": "string",
            "price": {
              "currencyCode": null,
              "text": null,
              "value": null
            }
          },
          "currentOfferPrice": {
            "description": "string",
            "price": {
              "currencyCode": null,
              "text": null,
              "value": null
            }
          },
          "due": {
            "description": "string",
            "price": {
              "currencyCode": null,
  …
```

### Example

```bash
curl -X POST \
  "https://api.eu.ovhcloud.com/1.0/pack/xdsl/{packName}/addressMove/offers" \
  -H "accept: application/json" \
  -H "authorization: Bearer $OVH_TOKEN" \
  -H "content-type: application/json" \
  -d '{ }'
```

```python
'''
First, install the latest release of Python wrapper: $ pip install ovh
'''
import json
import ovh

# Instantiate an OVH Client.
# You can generate new credentials with full access to your account on
# the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)
client = ovh.Client(
	endpoint='ovh-eu',               # Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)
	application_key='xxxxxxxxxx',    # Application Key
	application_secret='xxxxxxxxxx', # Application Secret
	consumer_key='xxxxxxxxxx',       # Consumer Key
)

# Request body type: string
result = client.post("/pack/xdsl/{packName}/addressMove/offers",
	eligibilityReference = None, # Eligibility reference (type: string)
)

# Pretty print
print(json.dumps(result, indent=4))
```

```php
<?php
/**
 * First, download the latest release of PHP wrapper on github
 * And include this script into the folder with extracted files
 */
require __DIR__ . '/vendor/autoload.php';
use \Ovh\Api;

/**
 * Instantiate an OVH Client.
 * You can generate new credentials with full access to your account on
 * the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)
 */
$ovh = new Api('xxxxxxxxxx',  // Application Key
               'xxxxxxxxxx',  // Application Secret
               'ovh-eu',      // Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)
               'xxxxxxxxxx'); // Consumer Key

// Request body type: string
$result = $ovh->post("/pack/xdsl/{packName}/addressMove/offers", array(
	eligibilityReference => null, // Eligibility reference (type: string)
));

print_r($result);
?>
```

## List the services to delete to move an xDSL pack

`POST /1.0/pack/xdsl/{packName}/addressMove/servicesToDeleteUnpackTerms`

Link: https://developers.eu.ovhcloud.com/reference/web-cloud/internet/pack/order-installation/#post-pack-xdsl-packname-addressmove-servicestodeleteunpackterms

**Status:** Stable production version  
**IAM actions:** `packXdsl:apiovh:addressMove/servicesToDeleteUnpackTerms/create`

List the services to delete to move an xDSL pack. Returns, by service type, the number of services to delete and their unpack terms for the offer at the new address.

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `packName` | path | string | yes | The internal name of your pack |

### Request body (required)

Type: `object`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `eligibilityReference` | string | yes | Eligibility reference |
| `offerName` | string | yes | Reference of the new offer |
| `options` | pack.xdsl.migration.OfferOption[] |  | Options wanted in the new offer |
| `options[].name` | string |  | Name of the option |
| `options[].quantity` | integer |  | Number of slots, couting included slots |

```json
{
  "eligibilityReference": "string",
  "offerName": "string",
  "options": [
    {
      "name": "string",
      "quantity": 0
    }
  ]
}
```

### Responses

| Status | Type | Description |
| --- | --- | --- |
| 200 | pack.xdsl.migration.SubServicesDetailsToDelete[] | successful operation |

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `numberToDelete` | integer |  | Number of services to be deleted |
| `services` | pack.xdsl.migration.SubServiceDetails[] |  | List of domains of sub services with unpack terms |
| `services[].isAllowed` | boolean |  | Tells whether or not the service can be unpacked |
| `services[].price` | order.Price |  | Price bill on the unpack action |
| `services[].price.currencyCode` | order.CurrencyCodeEnum |  | one of `AUD`, `CAD`, `CZK`, `EUR`, `GBP`, `INR`, `LTL`, `MAD`, `N/A`, `PLN`, `SGD`, `TND`, … |
| `services[].price.text` | string |  |  |
| `services[].price.value` | number |  |  |
| `services[].renewPeriod` | number |  | Renew period in month of the service |
| `services[].renewPrice` | order.Price |  | The price it will cost when it will be renewed |
| `services[].renewPrice.currencyCode` | order.CurrencyCodeEnum |  | one of `AUD`, `CAD`, `CZK`, `EUR`, `GBP`, `INR`, `LTL`, `MAD`, `N/A`, `PLN`, `SGD`, `TND`, … |
| `services[].renewPrice.text` | string |  |  |
| `services[].renewPrice.value` | number |  |  |
| `services[].service` | string |  | sub service name |
| `type` | pack.xdsl.ServiceNameEnum |  | Type of service to be deleted — one of `domain`, `emailPro`, `exchangeAccount`, `exchangeIndividual`, `exchangeOrganization`, `grt10ho`, `grt20m10ho`, `grt20m4ho`, `grt4ho`, `grt5m10ho`, `grt5m4ho`, `grtAlt`, … |

```json
[
  {
    "numberToDelete": 0,
    "services": [
      {
        "isAllowed": true,
        "price": {
          "currencyCode": "AUD",
          "text": "string",
          "value": 0
        },
        "renewPeriod": 0,
        "renewPrice": {
          "currencyCode": "AUD",
          "text": "string",
          "value": 0
        },
        "service": "string"
      }
    ],
    "type": "domain"
  }
]
```

### Example

```bash
curl -X POST \
  "https://api.eu.ovhcloud.com/1.0/pack/xdsl/{packName}/addressMove/servicesToDeleteUnpackTerms" \
  -H "accept: application/json" \
  -H "authorization: Bearer $OVH_TOKEN" \
  -H "content-type: application/json" \
  -d '{ }'
```

```python
'''
First, install the latest release of Python wrapper: $ pip install ovh
'''
import json
import ovh

# Instantiate an OVH Client.
# You can generate new credentials with full access to your account on
# the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)
client = ovh.Client(
	endpoint='ovh-eu',               # Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)
	application_key='xxxxxxxxxx',    # Application Key
	application_secret='xxxxxxxxxx', # Application Secret
	consumer_key='xxxxxxxxxx',       # Consumer Key
)

# Request body type: pack.xdsl.migration.OfferOption[]
result = client.post("/pack/xdsl/{packName}/addressMove/servicesToDeleteUnpackTerms",
	eligibilityReference = None, # Eligibility reference (type: string)
	offerName = None, # Reference of the new offer (type: string)
	options = None, # Options wanted in the new offer (type: pack.xdsl.migration.OfferOption[], nullable)
)

# Pretty print
print(json.dumps(result, indent=4))
```

```php
<?php
/**
 * First, download the latest release of PHP wrapper on github
 * And include this script into the folder with extracted files
 */
require __DIR__ . '/vendor/autoload.php';
use \Ovh\Api;

/**
 * Instantiate an OVH Client.
 * You can generate new credentials with full access to your account on
 * the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)
 */
$ovh = new Api('xxxxxxxxxx',  // Application Key
               'xxxxxxxxxx',  // Application Secret
               'ovh-eu',      // Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)
               'xxxxxxxxxx'); // Consumer Key

// Request body type: pack.xdsl.migration.OfferOption[]
$result = $ovh->post("/pack/xdsl/{packName}/addressMove/servicesToDeleteUnpackTerms", array(
	eligibilityReference => null, // Eligibility reference (type: string)
	offerName => null, // Reference of the new offer (type: string)
	options => null, // Options wanted in the new offer (type: pack.xdsl.migration.OfferOption[], nullable)
));

print_r($result);
?>
```

## Migrate an xDSL pack to another offer

`POST /1.0/pack/xdsl/{packName}/migration/migrate`

Link: https://developers.eu.ovhcloud.com/reference/web-cloud/internet/pack/order-installation/#post-pack-xdsl-packname-migration-migrate

**Status:** Stable production version  
**IAM actions:** `packXdsl:apiovh:migration/migrate`

Migrate an xDSL pack to another offer. Starts the migration to the selected offer with its options, modem, installation details and services to keep or delete. Returns the task that performs it.

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `packName` | path | string | yes | The internal name of your pack |

### Request body (required)

Type: `object`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `acceptContracts` | boolean | yes | You explicitly accept the terms of the contract corresponding to your new offer |
| `buildingReference` | string |  | Building reference for FTTH and FTTE offers |
| `contactPhone` | string |  | Customer contact phone number |
| `engageMonths` | integer |  | Number of months of re-engagement |
| `floor` | string |  | Floor identifier, "_NA_" if no identifier is available |
| `installationType` | connectivity.eligibility.InstallationTypeEnum |  | Installation type, only on FTTH technology — one of `activate`, `activate_undefined`, `create`, `multiOtp` |
| `meeting` | xdsl.eligibility.BookMeetingSlot |  | Data to book a meeting slot |
| `meeting.fakeMeeting` | boolean |  | Whether or not to book a fake meeting slots (if no slots are available) |
| `meeting.meetingSlot` | xdsl.eligibility.MeetingSlot |  | The time slot to book, null if fakeMeeting is true |
| `meeting.meetingSlot.endDate` | string (date-time) |  | The end of the time slot |
| `meeting.meetingSlot.slotId` | string |  | Represent a meeting id for a fiber collect operator |
| `meeting.meetingSlot.startDate` | string (date-time) |  | The beginning of the time slot |
| `meeting.meetingSlot.uiCode` | string |  | An opaque string that represents an intervention unit |
| `meeting.name` | string |  | The name of the customer |
| `modem` | pack.xdsl.ModemOptionEnum | yes | Modem option chosen for the new offer — one of `no`, `recycled`, `yes` |
| `mondialRelayId` | integer |  | Mondial relay ID if a shipping is needed |
| `nicShipping` | string |  | nicShipping if a shipping is needed |
| `offerName` | string | yes | Reference of the new offer |
| `ontShippingContact` | string |  | Allows you to personalize a delivery address for the ONT. If empty, the address will be that of the installation |
| `options` | pack.xdsl.migration.OfferOption[] |  | Options wanted in the new offer |
| `options[].name` | string |  | Name of the option |
| `options[].quantity` | integer |  | Number of slots, couting included slots |
| `otp` | boolean |  | Whether an Optical Termination Point (OTP) is already installed at the address |
| `otpReference` | string |  | Reference of the Optical Termination Point |
| `productCode` | string |  | Product code, an unique identifier to designate the chosen offer |
| `stair` | string |  | Stair identifier, "_NA_" if no identifier is available |
| `subServicesToDelete` | pack.xdsl.migration.OfferServiceToDelete[] |  | List of domains of services to delete if needed |
| `subServicesToDelete[].service` | string |  | Type of the service |
| `subServicesToDelete[].type` | pack.xdsl.ServiceNameEnum |  | Type of the service to delete — one of `domain`, `emailPro`, `exchangeAccount`, `exchangeIndividual`, `exchangeOrganization`, `grt10ho`, `grt20m10ho`, `grt20m4ho`, `grt4ho`, `grt5m10ho`, `grt5m4ho`, `grtAlt`, … |
| `subServicesToKeep` | pack.xdsl.migration.OfferServiceToKeep[] |  | List of domains of services to keep if needed |
| `subServicesToKeep[].service` | string |  | Type of the service |
| `subServicesToKeep[].type` | pack.xdsl.ServiceNameEnum |  | Type of the service to keep — one of `domain`, `emailPro`, `exchangeAccount`, `exchangeIndividual`, `exchangeOrganization`, `grt10ho`, `grt20m10ho`, `grt20m4ho`, `grt4ho`, `grt5m10ho`, `grt5m4ho`, `grtAlt`, … |

```json
{
  "acceptContracts": true,
  "buildingReference": "string",
  "contactPhone": "string",
  "engageMonths": 0,
  "floor": "string",
  "installationType": "activate",
  "meeting": {
    "fakeMeeting": true,
    "meetingSlot": {
      "endDate": "2024-01-01T12:00:00Z",
      "slotId": "string",
      "startDate": "2024-01-01T12:00:00Z",
      "uiCode": "string"
    },
    "name": "string"
  },
  "modem": "no",
  "mondialRelayId": 0,
  "nicShipping": "string",
  "offerName": "string",
  "ontShippingContact": "string",
  "options": [
    {
      "name": "string",
      "quantity": 0
    }
  ],
  "otp": true,
  "otpReference": "string",
  "productCode": "string",
  "stair": "string",
  "subServicesToDelete": [
    {
      "service": "string",
      "type": "domain"
    }
  ],
  "subServicesToKeep": [
    {
      "service": "string",
      "type": "domain"
    }
  ]
}
```

### Responses

| Status | Type | Description |
| --- | --- | --- |
| 200 | pack.xdsl.Task | successful operation |

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `function` | string | read-only |  |
| `id` | integer | read-only |  |
| `status` | pack.xdsl.TaskStatusEnum | read-only | Status of a task. — one of `cancelled`, `doing`, `done`, `error`, `problem`, `todo` |
| `updateDate` | string (date-time) | read-only |  |

```json
{
  "function": "string",
  "id": 0,
  "status": "cancelled",
  "updateDate": "2024-01-01T12:00:00Z"
}
```

### Example

```bash
curl -X POST \
  "https://api.eu.ovhcloud.com/1.0/pack/xdsl/{packName}/migration/migrate" \
  -H "accept: application/json" \
  -H "authorization: Bearer $OVH_TOKEN" \
  -H "content-type: application/json" \
  -d '{ }'
```

```python
'''
First, install the latest release of Python wrapper: $ pip install ovh
'''
import json
import ovh

# Instantiate an OVH Client.
# You can generate new credentials with full access to your account on
# the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)
client = ovh.Client(
	endpoint='ovh-eu',               # Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)
	application_key='xxxxxxxxxx',    # Application Key
	application_secret='xxxxxxxxxx', # Application Secret
	consumer_key='xxxxxxxxxx',       # Consumer Key
)

# Request body type: pack.xdsl.migration.OfferServiceToKeep[]
result = client.post("/pack/xdsl/{packName}/migration/migrate",
	acceptContracts = None, # You explicitly accept the terms of the contract corresponding to your new offer (type: boolean)
	buildingReference = None, # Building reference for FTTH and FTTE offers (type: string, nullable)
	contactPhone = None, # Customer contact phone number (type: string, nullable)
	engageMonths = None, # Number of months of re-engagement (type: long, nullable)
	floor = None, # Floor identifier, "_NA_" if no identifier is available (type: string, nullable)
	installationType = None, # Installation type, only on FTTH technology (type: connectivity.eligibility.InstallationTypeEnum, nullable)
	meeting = None, # Data to book a meeting slot (type: xdsl.eligibility.BookMeetingSlot, nullable)
	modem = None, # Modem option chosen for the new offer (type: pack.xdsl.ModemOptionEnum)
	mondialRelayId = None, # Mondial relay ID if a shipping is needed (type: long, nullable)
	nicShipping = None, # nicShipping if a shipping is needed (type: string, nullable)
	offerName = None, # Reference of the new offer (type: string)
	ontShippingContact = None, # Allows you to personalize a delivery address for the ONT. If empty, the address will be that of the installation (type: string, nullable)
	options = None, # Options wanted in the new offer (type: pack.xdsl.migration.OfferOption[], nullable)
	otp = None, # Whether an Optical Termination Point (OTP) is already installed at the address (type: boolean, nullable)
	otpReference = None, # Reference of the Optical Termination Point (type: string, nullable)
	productCode = None, # Product code, an unique identifier to designate the chosen offer (type: string, nullable)
	stair = None, # Stair identifier, "_NA_" if no identifier is available (type: string, nullable)
	subServicesToDelete = None, # List of domains of services to delete if needed (type: pack.xdsl.migration.OfferServiceToDelete[], nullable)
	subServicesToKeep = None, # List of domains of services to keep if needed (type: pack.xdsl.migration.OfferServiceToKeep[], nullable)
)

# Pretty print
print(json.dumps(result, indent=4))
```

```php
<?php
/**
 * First, download the latest release of PHP wrapper on github
 * And include this script into the folder with extracted files
 */
require __DIR__ . '/vendor/autoload.php';
use \Ovh\Api;

/**
 * Instantiate an OVH Client.
 * You can generate new credentials with full access to your account on
 * the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)
 */
$ovh = new Api('xxxxxxxxxx',  // Application Key
               'xxxxxxxxxx',  // Application Secret
               'ovh-eu',      // Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)
               'xxxxxxxxxx'); // Consumer Key

// Request body type: pack.xdsl.migration.OfferServiceToKeep[]
$result = $ovh->post("/pack/xdsl/{packName}/migration/migrate", array(
	acceptContracts => null, // You explicitly accept the terms of the contract corresponding to your new offer (type: boolean)
	buildingReference => null, // Building reference for FTTH and FTTE offers (type: string, nullable)
	contactPhone => null, // Customer contact phone number (type: string, nullable)
	engageMonths => null, // Number of months of re-engagement (type: long, nullable)
	floor => null, // Floor identifier, "_NA_" if no identifier is available (type: string, nullable)
	installationType => null, // Installation type, only on FTTH technology (type: connectivity.eligibility.InstallationTypeEnum, nullable)
	meeting => null, // Data to book a meeting slot (type: xdsl.eligibility.BookMeetingSlot, nullable)
	modem => null, // Modem option chosen for the new offer (type: pack.xdsl.ModemOptionEnum)
	mondialRelayId => null, // Mondial relay ID if a shipping is needed (type: long, nullable)
	nicShipping => null, // nicShipping if a shipping is needed (type: string, nullable)
	offerName => null, // Reference of the new offer (type: string)
	ontShippingContact => null, // Allows you to personalize a delivery address for the ONT. If empty, the address will be that of the installation (type: string, nullable)
	options => null, // Options wanted in the new offer (type: pack.xdsl.migration.OfferOption[], nullable)
	otp => null, // Whether an Optical Termination Point (OTP) is already installed at the address (type: boolean, nullable)
	otpReference => null, // Reference of the Optical Termination Point (type: string, nullable)
	productCode => null, // Product code, an unique identifier to designate the chosen offer (type: string, nullable)
	stair => null, // Stair identifier, "_NA_" if no identifier is available (type: string, nullable)
	subServicesToDelete => null, // List of domains of services to delete if needed (type: pack.xdsl.migration.OfferServiceToDelete[], nullable)
	subServicesToKeep => null, // List of domains of services to keep if needed (type: pack.xdsl.migration.OfferServiceToKeep[], nullable)
));

print_r($result);
?>
```

## Search the migration offers of an xDSL pack

`POST /1.0/pack/xdsl/{packName}/migration/offers`

Link: https://developers.eu.ovhcloud.com/reference/web-cloud/internet/pack/order-installation/#post-pack-xdsl-packname-migration-offers

**Status:** Stable production version  
**IAM actions:** `packXdsl:apiovh:migration/offers/create`

Search the migration offers of an xDSL pack. Returns, as an asynchronous task, the offers the pack can migrate to and, for fiber, the buildings to choose from.

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `packName` | path | string | yes | The internal name of your pack |

### Request body (required)

Type: `object`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `buildingReference` | string |  | Building reference for FTTH and FTTE offers |

```json
{
  "buildingReference": "string"
}
```

### Responses

| Status | Type | Description |
| --- | --- | --- |
| 200 | pack.xdsl.AsyncTask_pack.xdsl.migration.MigrationOfferResponse | successful operation |

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `error` | string |  | Error |
| `result` | pack.xdsl.migration.MigrationOfferResponse |  | List of available Migration offer |
| `result.buildings` | connectivity.eligibility.Building[] |  | Array of buildings |
| `result.buildings[].name` | string |  | Building name |
| `result.buildings[].nro` | string |  | Building NRO (Optical main distribution frame) |
| `result.buildings[].reference` | string |  | Identifier which refer to a building uniquely |
| `result.buildings[].stairs` | connectivity.eligibility.BuildingStair[] |  | Stairs for this building |
| `result.buildings[].type` | connectivity.eligibility.BuildingTypeEnum |  | Building type — one of `BUILDING`, `HOUSE` |
| `result.offers` | pack.xdsl.migration.MigrationOffer[] |  | Array of offers |
| `result.offers[].contractList` | string[] |  | DEPRECATED - List of contracts |
| `result.offers[].contracts` | order.Contract[] |  | List of contracts for this offer |
| `result.offers[].currentOfferPrice` | order.Price |  | Price of the current offer |
| `result.offers[].customOntAddress` | boolean |  | Tells if the custom ont address is available on the offer |
| `result.offers[].description` | string |  | Description of the offer |
| `result.offers[].due` | order.Price |  | Price to make the migration |
| `result.offers[].engageMonths` | integer |  | Number of months of engagement |
| `result.offers[].engaged` | boolean |  | Tells if the customer is still engaged |
| `result.offers[].engagementMonths` | integer[] |  | List of number of months possible for engagement |
| `result.offers[].firstYearPromo` | order.Price |  | Subscription price the first year |
| `result.offers[].gtrComfortFees` | order.Price |  | Install fee for GTR option comfort additional cost |
| `result.offers[].installFees` | order.Price |  | Installation fees |
| `result.offers[].modemMacToReturn` | string |  | Mac address of the modem to be returned |
| `result.offers[].modemOptions` | pack.xdsl.migration.OfferModemOption[] |  | List of modems for this offer |
| `result.offers[].modemRental` | order.Price |  | Price for modem rental |
| `result.offers[].multiOtp` | boolean |  | Tells if the multiOtp is possible on the address |
| `result.offers[].needModem` | boolean |  | Tells if the offer needs a modem |
| `result.offers[].needNewModem` | boolean |  | Tells if the customer will have to change its modem |
| `result.offers[].offerName` | string |  | Name of the offer |
| `result.offers[].operator` | string |  | Collection operator (CO) |
| `result.offers[].options` | pack.xdsl.migration.OfferAvailableOption[] |  | Available options for the migration |
| `result.offers[].price` | order.Price |  | Price of the offer |
| `result.offers[].promotion` | pack.xdsl.migrationAndAddressMove.Promotion |  | Promotion, if available |
| `result.offers[].providerAI` | order.Price |  | Subscription price for provider AI additional cost |
| `result.offers[].providerOrange` | order.Price |  | Subscription price for provider ORANGE additional cost |
| `result.offers[].subServicesToDelete` | pack.xdsl.migration.SubServiceToDelete[] |  | List of sub services to delete |
| `result.offers[].url` | string |  | URL of the offer |
| `status` | pack.xdsl.AsyncTaskStatusEnum |  | Status of the call — one of `error`, `ok`, `pending` |

```json
{
  "error": "string",
  "result": {
    "buildings": [
      {
        "name": "string",
        "nro": "string",
        "reference": "string",
        "stairs": [
          {
            "floors": [
              null
            ],
            "stair": "string"
          }
        ],
        "type": "BUILDING"
      }
    ],
    "offers": [
      {
        "contractList": [
          "string"
        ],
        "contracts": [
          {
            "content": "string",
            "name": "string",
            "url": "string"
          }
        ],
        "currentOfferPrice": {
          "currencyCode": "AUD",
          "text": "string",
          "value": 0
        },
        "customOntAddress": true,
        "description": "string",
        "due": {
          "currencyCode": "AUD",
          "text": "string",
          "value": 0
        },
        "engageMonths": 0,
        "engaged": true,
        "engagementMonths": [
          0
        ],
        "firstYearPromo": {
          "currencyCode": "AUD",
          "text": "string",
          "value": 0
        },
        "gtrComfortFees": {
          "currencyCode": "AUD",
          "text": "string",
          "value": 0
        },
        "installFees": {
          "currencyCode": "AUD",
          "text": "string",
          "value": 0
        },
        "modemMacToReturn": "string",
        "modemOptions": [
          {
            "name": "string",
            "price": {
              "currencyCode": null,
              "text": null,
              "value": null
            }
          }
        ],
  …
```

### Example

```bash
curl -X POST \
  "https://api.eu.ovhcloud.com/1.0/pack/xdsl/{packName}/migration/offers" \
  -H "accept: application/json" \
  -H "authorization: Bearer $OVH_TOKEN" \
  -H "content-type: application/json" \
  -d '{ }'
```

```python
'''
First, install the latest release of Python wrapper: $ pip install ovh
'''
import json
import ovh

# Instantiate an OVH Client.
# You can generate new credentials with full access to your account on
# the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)
client = ovh.Client(
	endpoint='ovh-eu',               # Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)
	application_key='xxxxxxxxxx',    # Application Key
	application_secret='xxxxxxxxxx', # Application Secret
	consumer_key='xxxxxxxxxx',       # Consumer Key
)

# Request body type: string
result = client.post("/pack/xdsl/{packName}/migration/offers",
	buildingReference = None, # Building reference for FTTH and FTTE offers (type: string, nullable)
)

# Pretty print
print(json.dumps(result, indent=4))
```

```php
<?php
/**
 * First, download the latest release of PHP wrapper on github
 * And include this script into the folder with extracted files
 */
require __DIR__ . '/vendor/autoload.php';
use \Ovh\Api;

/**
 * Instantiate an OVH Client.
 * You can generate new credentials with full access to your account on
 * the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)
 */
$ovh = new Api('xxxxxxxxxx',  // Application Key
               'xxxxxxxxxx',  // Application Secret
               'ovh-eu',      // Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)
               'xxxxxxxxxx'); // Consumer Key

// Request body type: string
$result = $ovh->post("/pack/xdsl/{packName}/migration/offers", array(
	buildingReference => null, // Building reference for FTTH and FTTE offers (type: string, nullable)
));

print_r($result);
?>
```

## List the services to delete to migrate an xDSL pack

`POST /1.0/pack/xdsl/{packName}/migration/servicesToDeleteUnpackTerms`

Link: https://developers.eu.ovhcloud.com/reference/web-cloud/internet/pack/order-installation/#post-pack-xdsl-packname-migration-servicestodeleteunpackterms

**Status:** Stable production version  
**IAM actions:** `packXdsl:apiovh:migration/servicesToDeleteUnpackTerms/create`

List the services to delete to migrate an xDSL pack. Returns, by service type, the number of services to delete and their unpack terms for the target offer.

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `packName` | path | string | yes | The internal name of your pack |

### Request body (required)

Type: `object`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `offerName` | string | yes | Reference of the new offer |
| `options` | pack.xdsl.migration.OfferOption[] |  | Options wanted in the new offer |
| `options[].name` | string |  | Name of the option |
| `options[].quantity` | integer |  | Number of slots, couting included slots |

```json
{
  "offerName": "string",
  "options": [
    {
      "name": "string",
      "quantity": 0
    }
  ]
}
```

### Responses

| Status | Type | Description |
| --- | --- | --- |
| 200 | pack.xdsl.migration.SubServicesDetailsToDelete[] | successful operation |

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `numberToDelete` | integer |  | Number of services to be deleted |
| `services` | pack.xdsl.migration.SubServiceDetails[] |  | List of domains of sub services with unpack terms |
| `services[].isAllowed` | boolean |  | Tells whether or not the service can be unpacked |
| `services[].price` | order.Price |  | Price bill on the unpack action |
| `services[].price.currencyCode` | order.CurrencyCodeEnum |  | one of `AUD`, `CAD`, `CZK`, `EUR`, `GBP`, `INR`, `LTL`, `MAD`, `N/A`, `PLN`, `SGD`, `TND`, … |
| `services[].price.text` | string |  |  |
| `services[].price.value` | number |  |  |
| `services[].renewPeriod` | number |  | Renew period in month of the service |
| `services[].renewPrice` | order.Price |  | The price it will cost when it will be renewed |
| `services[].renewPrice.currencyCode` | order.CurrencyCodeEnum |  | one of `AUD`, `CAD`, `CZK`, `EUR`, `GBP`, `INR`, `LTL`, `MAD`, `N/A`, `PLN`, `SGD`, `TND`, … |
| `services[].renewPrice.text` | string |  |  |
| `services[].renewPrice.value` | number |  |  |
| `services[].service` | string |  | sub service name |
| `type` | pack.xdsl.ServiceNameEnum |  | Type of service to be deleted — one of `domain`, `emailPro`, `exchangeAccount`, `exchangeIndividual`, `exchangeOrganization`, `grt10ho`, `grt20m10ho`, `grt20m4ho`, `grt4ho`, `grt5m10ho`, `grt5m4ho`, `grtAlt`, … |

```json
[
  {
    "numberToDelete": 0,
    "services": [
      {
        "isAllowed": true,
        "price": {
          "currencyCode": "AUD",
          "text": "string",
          "value": 0
        },
        "renewPeriod": 0,
        "renewPrice": {
          "currencyCode": "AUD",
          "text": "string",
          "value": 0
        },
        "service": "string"
      }
    ],
    "type": "domain"
  }
]
```

### Example

```bash
curl -X POST \
  "https://api.eu.ovhcloud.com/1.0/pack/xdsl/{packName}/migration/servicesToDeleteUnpackTerms" \
  -H "accept: application/json" \
  -H "authorization: Bearer $OVH_TOKEN" \
  -H "content-type: application/json" \
  -d '{ }'
```

```python
'''
First, install the latest release of Python wrapper: $ pip install ovh
'''
import json
import ovh

# Instantiate an OVH Client.
# You can generate new credentials with full access to your account on
# the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)
client = ovh.Client(
	endpoint='ovh-eu',               # Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)
	application_key='xxxxxxxxxx',    # Application Key
	application_secret='xxxxxxxxxx', # Application Secret
	consumer_key='xxxxxxxxxx',       # Consumer Key
)

result = client.post("/pack/xdsl/{packName}/migration/servicesToDeleteUnpackTerms",
	offerName = None, # Reference of the new offer (type: string)
	options = None, # Options wanted in the new offer (type: pack.xdsl.migration.OfferOption[], nullable)
)

# Pretty print
print(json.dumps(result, indent=4))
```

```php
<?php
/**
 * First, download the latest release of PHP wrapper on github
 * And include this script into the folder with extracted files
 */
require __DIR__ . '/vendor/autoload.php';
use \Ovh\Api;

/**
 * Instantiate an OVH Client.
 * You can generate new credentials with full access to your account on
 * the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)
 */
$ovh = new Api('xxxxxxxxxx',  // Application Key
               'xxxxxxxxxx',  // Application Secret
               'ovh-eu',      // Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)
               'xxxxxxxxxx'); // Consumer Key

$result = $ovh->post("/pack/xdsl/{packName}/migration/servicesToDeleteUnpackTerms", array(
	offerName => null, // Reference of the new offer (type: string)
	options => null, // Options wanted in the new offer (type: pack.xdsl.migration.OfferOption[], nullable)
));

print_r($result);
?>
```

## Get the order follow-up of an xDSL pack

`GET /1.0/pack/xdsl/{packName}/orderFollowUp`

Link: https://developers.eu.ovhcloud.com/reference/web-cloud/internet/pack/order-installation/#get-pack-xdsl-packname-orderfollowup

**Status:** Stable production version  
**IAM actions:** `packXdsl:apiovh:orderFollowUp/get`

Get the order follow-up of an xDSL pack. Returns the steps of the pack order with their status, expected duration, completion date and comments.

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `packName` | path | string | yes | The internal name of your pack |

### Responses

| Status | Type | Description |
| --- | --- | --- |
| 200 | pack.xdsl.OrderFollowUpStep[] | successful operation |

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `comments` | string[] |  | Additional information about the step |
| `doneDate` | string (date-time) |  | Date when the step has been done |
| `durationUnit` | string |  | Unit used for the expected duration step |
| `expectedDuration` | integer |  | Expected duration step |
| `name` | string |  | Order follow up step name |
| `status` | string |  | Status of the step |

```json
[
  {
    "comments": [
      "string"
    ],
    "doneDate": "2024-01-01T12:00:00Z",
    "durationUnit": "string",
    "expectedDuration": 0,
    "name": "string",
    "status": "string"
  }
]
```

### Example

```bash
curl -X GET \
  "https://api.eu.ovhcloud.com/1.0/pack/xdsl/{packName}/orderFollowUp" \
  -H "accept: application/json" \
  -H "authorization: Bearer $OVH_TOKEN"
```

```python
'''
First, install the latest release of Python wrapper: $ pip install ovh
'''
import json
import ovh

# Instantiate an OVH Client.
# You can generate new credentials with full access to your account on
# the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)
client = ovh.Client(
	endpoint='ovh-eu',               # Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)
	application_key='xxxxxxxxxx',    # Application Key
	application_secret='xxxxxxxxxx', # Application Secret
	consumer_key='xxxxxxxxxx',       # Consumer Key
)

result = client.get("/pack/xdsl/{packName}/orderFollowUp")

# Pretty print
print(json.dumps(result, indent=4))
```

```php
<?php
/**
 * First, download the latest release of PHP wrapper on github
 * And include this script into the folder with extracted files
 */
require __DIR__ . '/vendor/autoload.php';
use \Ovh\Api;

/**
 * Instantiate an OVH Client.
 * You can generate new credentials with full access to your account on
 * the token creation page (https://api.ovh.com/createToken/index.cgi?GET=/*&PUT=/*&POST=/*&DELETE=/*)
 */
$ovh = new Api('xxxxxxxxxx',  // Application Key
               'xxxxxxxxxx',  // Application Secret
               'ovh-eu',      // Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application)
               'xxxxxxxxxx'); // Consumer Key

$result = $ovh->get("/pack/xdsl/{packName}/orderFollowUp");

print_r($result);
?>
```
