Service Key Provisioning Workflow

Connect or Disconnect Virtual Connect 

This page describes how to use the IX-API to provision and deprovision a Virtual Connect (point to point virtual circuit). 

Two provisioning workflows are available for Virtual Connect.

Joining member account.

This is the IX-API default. The A side creates a point to point virtual circuit, adds a B side as an explicit joining member account for that virtual circuit, and chooses their own cloud access port and VLAN setting. The B side is able to join the point to point virtual circuit as they are attributed as a joining member account and they choose their cloud access port / VLAN settings to complete their side of the virtual circuit.  

Service key

This is an Interxion extension to the core IX-API. An inviting party provides a subscribing party a service key for a cloud access p[ort. The subscribing party uses the service key to create a point to point virtual circuit and chooses their cloud access port / VLAN setting. The inviting party is able to see the virtual circuit as their service key is used and they choose their cloud access port (has to match that referenced by the service key) / VLAN setting to complete their side of the virtual circuit.

This page describes the Service Key Provisioning Workflow.

1. Request Client Credentials

Follow the description on this page Requesting IX-API Client Credentials 

You shall receive the credentials via separate emails: 

  • EMAIL 1 shall contain client_id, login URL and IX-API URL 

  • EMAIL 2 shall contain client_secret 

2. Download Postman Collection

This Postman Collection provides examples of all the API calls you need to make to connect / disconnect a point to point virtual circuit (virtual connect) 

3. Provision a Virtual Connect (point to point virtual circuit) using service key provisioning workflow

Step 1: Inviting party uses client credentials to generate an access token 

The Inviting Party makes the following request to generate an access token: 

curl --location --request POST 'https://{{login-url}}/connect/token' \ 
--header 'content-type: application/x-www-form-urlencoded' \ 
--data-urlencode 'grant_type=client_credentials' \ 
--data-urlencode 'client_id=<client_id>' \ 
--data-urlencode 'client_secret=<client_secret>' 

The response is a http 200 OK with response body containing the access token. 


   "access_token": "{YOUR_TOKEN}", 
   "expires_in": 3600, 
   "token_type": "Bearer", 
   "scope": "resource.api resource.ixapi resource.productcatalogapi" 
}

Every time the Inviting Party wants to make an API request they shall use this access token. 

Authentication 

When you make an API call, you need to use an “Authorization” HTTP header to provide your API key, with a “Bearer” prefix. For example: 

Authorization: Bearer {YOUR_TOKEN}

Step 2: Inviting Party chooses Cloud Access Port and passes service key to Subscribing Party

The Inviting Party makes the following request to read all their Cloud Access Ports so that they can choose the one they want to provide the Service Key of to the Subscribing Party; additionally, they shall provide the pop of the Cloud Access Port so the Subscribing Party knows where it is.

curl --location --request GET 'https://{{ix-api-url}}/extensions/inxn-servicekey-v1/connections' \
--header 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6I...'

The response is an http 200 OK with response body containing cloud access ports from which the Inviting Party can choose a Service Key of to pass to the Subscribing Party; additionally, they shall provide the pop of the Cloud Access Port so the Subscribing Party knows where it is.

[
    {
        "id": "CANL-051223",
        "service_key": "43feb84d-1808-464f-98cf-c197a1835a8b",
        "mode": "standalone",
        "outer_vlan_ethertypes": [
            "0x8100"
        ],
        "state": "production",
        "vlan_types": [
            "dot1q",
            "qinq"
        ],
        "billing_account": "A0015750",
        "capacity_allocated": 800,
        "capacity_allocation_limit": 1000,
        "consuming_account": "A0015750",
        "contract_ref": "Test",
        "external_ref": "Ext Ref Test",
        "managing_account": "A0015750",
        "name": "CANL-051223",
        "pop": "AMS5-B",
        "port_quantity": 1,
        "port_reservations": [
            "CANL-051223"
        ],
        "ports": [
            "CANL-051223"
        ],
        "product_offering": "503233.AMS5-B.S",
        "purchase_order": "PO Test",
        "role_assignments": [
            "f7f73ff8-f658-45d6-2376-08d9b0f3961e",
            "3c4b453b-f5a1-4435-2375-08d9b0f3961e"
        ],
        "speed": 1000
    } ...

]

Step 3: Subscribing party uses client credentials to generate an access token 

The Subscribing Party makes the following request to generate an access token: 

curl --location --request POST 'https://{{login-url}}/connect/token' \ 
--header 'content-type: application/x-www-form-urlencoded' \ 
--data-urlencode 'grant_type=client_credentials' \ 
--data-urlencode 'client_id=<client_id>' \ 
--data-urlencode 'client_secret=<client_secret>' 

The response is a http 200 OK with response body containing the access token. 


   "access_token": "{YOUR_TOKEN}", 
   "expires_in": 3600, 
   "token_type": "Bearer", 
   "scope": "resource.api resource.ixapi resource.productcatalogapi" 

Every time the Inviting Party wants to make an API request they shall use this access token. 

Authentication 

When you make an API call, you need to use an “Authorization” HTTP header to provide your API key, with a “Bearer” prefix. For example: 

Authorization: Bearer {YOUR_TOKEN}

Step 4: Subscribing Party chooses Product Offerings

Step 4: Subscribing Party can decode service key

Subscribing Party can decode the service key provided by the Inviting Party using the following request:

curl --location --request GET 'https://{{ix-api-url}}/ixapi/v2/extensions/inxn-servicekey-v1/service-keys/1314785d-9908-48f9-b599-2df513ff7e01 \
    --header 'Authorization: Bearer {YOUR_TOKEN}'

The response is an http 200 OK with response body containing metadata describing the cloud access port of the service key provided by the Inviting Party:

  {
        "id": "1314785d-9908-48f9-b599-2df513ff7e01",
        "mode": "standalone",
        "connection": "CANL-50312",
        "legal_name": "Truphone Limited",
        "max_capacity": 200,
        "metro_area": "AMS",
        "metro_area_network": "AMS",
    "pop": "AMS7-A"
     }

Step 5: Subscribing Party chooses Product Offerings

Make the following request to retrieve all product-offerings you have permission/authorisation for. This request uses the Subscribing Party client credentials access token.

curl --location --request GET 'https://{{ix-api-url}}/ixapi/v2/product-offerings' \
     --header 'Authorization: Bearer {YOUR_TOKEN}'

The response is a http 200 OK with response body containing product-offerings

[
 {
        "id": "503128.LON.AMS",
        "physical_port_speed": 5000,
        "bandwidth_max": 5000,
        "bandwidth_min": 5000,
        "resource_type": "network_service",
        "provider_vlans": "single",
        "display_name": "London-Amsterdam-Cloud Connect : Virtual Connect Service - 5Gb",
        "downgrade_allowed": false,
        "handover_metro_area": "LON",
        "handover_metro_area_network": "LON",
        "name": "London-Amsterdam-Cloud Connect : Virtual Connect Service - 5Gb",
        "service_provider": "Interxion",
        "type": "p2p_vc",
        "upgrade_allowed": false,
        "service_metro_area": "AMS",
        "service_metro_area_network": "AMS"
    },
...
]

In the response the relevant product offerings have "type": "p2p_vc". The product-offering selected should have a service-metro-area matching the Pop provided by the Inviting Party for their Service Key

Step 6: Subscribing Party chooses their Cloud Access Port

Make the following request to retrieve all cloud access ports you have permissions for using the extension implementation. This request uses the Subscribing Party client credentials access token.

curl --location --request GET 'https://{{ix-api-url}}/ixapi/v2/extensions/inxn-servicekey-v1/product-offerings' \
--header 'Authorization: Bearer {YOUR_TOKEN}'

The response is a http 200 OK with response body containing cloud access ports.

[

{
    "id": "CAUK-051612",
    "service_key": "350abe46-4c08-46a2-8788-a9761b316d42",
    "mode": "standalone",
    "outer_vlan_ethertypes": [
        "0x8100"
    ],
    "state": "production",
    "vlan_types": [
        "dot1q",
        "qinq"
    ],
    "billing_account": "A0073476",
    "capacity_allocated": 950,
    "capacity_allocation_limit": 10000,
    "consuming_account": "A0073476",
    "contract_ref": null,
    "external_ref": null,
    "managing_account": "A0073476",
    "name": "CAUK-051612",
    "pop": "LON1-A",
    "port_quantity": 1,
    "port_reservations": [
        "CAUK-051612"
    ],
    "ports": [
        "CAUK-051612"
    ],
    "product_offering": "503235.LON1-A.E",
    "role_assignments": [],
    "speed": 10000
}...

]

The selected Cloud Access Port should match the handover_metro_area network of the selected product-offerings.

Step 7: Subscribing Party creates Virtual Connect

Make the following request to request a point to point virtual circuit. This request uses the Subscribing Party client credentials access token.

The request requires the following properties:

  • Subscribing Party client credentials access token

  • "managing_account" a mandatory property which is the account who will manage the the Virtual Connect.

  • "consuming_account" a mandatory property which is the account who will consume the Virtual Connect and can be the same as the "managing_account"

  • "external_reference" an optional property which is a free text value for the client to provide a customer reference value

  • "purchase_order" an optional property which is a free text value for the client to provide a purchase order number value

  • "contract_ref" an optional property which is free text value for the client to provide a contract reference value

  • "billing_account" a mandatory property which is the account who will be billed for the Virtual Connect.

  • "product_offering" a mandatory property which is the id of the product-offering selected in earlier steps

  • "service-key" a mandatory property which is the service-key shared by the inviting party.

curl --location --request POST 'https://{{ix-api-url}}/ixapi/v2/extensions/inxn-servicekey-v1/network-services' \
     --header 'Authorization: Bearer {YOUR_TOKEN}' \
     --header 'Content-Type: text/plain' \
     --data-raw '{
        "type": "p2p_vc",
        "managing_account": "A0073476",
        "consuming_account": "A0073476",
        "external_ref": "4364",
        "purchase_order": "6434664",
        "contract_ref": "TEST Ref",
        "product_offering": "inxn-virtual-connect",
        "billing_account": "A0073476",
        "service_key": "e8167d16-28b9-4bba-b016-25bc87c84c39"
     }'

This will return a http 201 created response with response body as follows:

{
    "id": "VLC00050251",
    "state": "requested",
    "nsc_required_contact_roles": [
        "4699403d-b264-4a47-9bbb-2c956dcd1a12",
        "9a442fef-ff8f-4c2e-93e5-46425c00fd4b"
    ],
    "contract_ref": "TEST Ref",
    "external_ref": "4364",
    "status": [
        {
            "severity": 6,
            "tag": "requested",
            "message": "Eline service was requested",
            "attrs": {
                "request_date": "2022-03-22T00:00:00"
            },
            "timestamp": "2022-03-22T20:52:33"
        }
    ],
    "billing_account": "A0073476",
    "capacity": 100,
    "consuming_account": "A0073476",
    "joining_member_account": "A0087264",
    "managing_account": "A0073476",
    "product_offering": "inxn-virtual-connect",
    "purchase_order": "6434664",
    "service_key": "e8167d16-28b9-4bba-b016-25bc87c84c39",
    "type": "p2p_vc"
}

The property in the response "nsc_required_contact_roles" shall provide identifiers for the role assignments that must be provided for the A and B side of the point to point virtual circuit. This property may return an empty array if no contact roles are required.

Step 8: Subscribing party de-references roles

If the response in Step 5 returns identifiers for "nsc_required_contact_roles" then this query shall provide the roles that must be provided when the network-service-configs are requested in later steps.

Make the following request to retrieve all roles you have permission/authorisation for. This request uses the Subscribing Party client credentials access token. (The Inviting Party would need to use their own access token to determine the same for their side.)

curl --location --request GET 'https://{{ix-api-url}}/ixapi/v2/roles' \
     --header 'Authorization: Bearer {YOUR_TOKEN}'

The response is a http 200 OK with response body containing roles

[
    {
        "id": "4699403d-b264-4a47-9bbb-2c956dcd1a12",
        "name": "Implementation",
        "required_fields": [
            "name",
            "email",
            "telephone"
        ] ...
    },
...
]

Existing role-assignments can be used but if needed new ones can be created whereby a contact is created first and assigned to a role using role-assignments.

Adding contacts

A Contact is assigned a Role via Role-Assignments. If a role assignment is needed as per property "nsc_required_contact_roles" then a Contact can be created and assigned a role.

Make the following request to create a contact. This request uses the Subscribing Party client credentials access token. (The Inviting Party would need to use their own access token to determine the same for their side.)

curl --location --request POST 'https://{{ix-api-url}}/ixapi/v2/contacts' \
     --header 'Authorization: Bearer {YOUR_TOKEN}' \
--data-raw '{
     "managing_account": "A0087999",
     "consuming_account": "A0087999",
     "name": "Panda Lion",
     "email": "dummy2@dummy.com",
     "telephone": "+2314412333223"
}'

 The response is a http 200 OK with response body containing contact:

{
    "id": "0092d959-6f47-478e-d2e2-08d9b8c2e666",
    "consuming_account": "A0087999",
    "email": "dummy2@dummy.com",
    "external_ref": null,
    "managing_account": "A0087999",
    "name": "Panda Lion",
    "telephone": "+2314412333223"
}

A single contact can be assigned to multiple role assignments. Please create as many Contacts as needed for the role assignments.

Adding role assignments - associating a contact to a role

To assign a Role to a Contact the following step is followed to create a Role Assignment.

Make the following request  to create a role assignment. This request uses the Subscribing Party client credentials access token. (The Inviting Party would need to use their own access token to determine the same for their side.)

curl --location --request POST 'https://{{ix-api-url}}/ixapi/v2/role-assignments' \
     --header 'Authorization: Bearer {YOUR_TOKEN}' \
--data-raw '{
     "role": "4699403D-B264-4A47-9BBB-2C956DCD1A12",
     "contact": "7b1bf663-e8e5-4493-29f5-08d9ba38d667",
}'


The response is an http 201 Created with response body containing role assignment:

{
    "id": "15c2001a-9bc8-4236-c560-08d9ba38e2ec",
    "contact": "7b1bf663-e8e5-4493-29f5-08d9ba38d667",
    "role": "4699403d-b264-4a47-9bbb-2c956dcd1a12"
}

Step 9: Subscribing Party submits A side CAP and VLAN for Virtual Connect

The Subscribing Party makes the following request to add the A side of the point to point virtual circuit, specifically which cloud access port to use and the VLAN setting. If the "nsc_required_contact_roles" in step 5 listed contacts for the network-service-configs then these must be provided in this request payload through the property "role-assignments". This request uses the Subscribing Party client credentials access token. 

curl --location --request POST 'https://{{ix-api-url}}/ixapi/v2/network-service-configs' \
--header 'Authorization: Bearer {YOUR_TOKEN}' \
--data-raw '{
    "type": "p2p_vc",
    "managing_account": "A0073476",
    "consuming_account": "A0073476",
    "external_ref": "4364",
    "network_service": "VLC00050255",
    "purchase_order": "6434664",
    "contract_ref": "NA",
    "billing_account": "A0073476",
    "role_assignments": [
        "3f403181-2dc0-42b2-08dc-08d99f835763",
        "c23c1a9c-5813-4fe1-08dd-08d99f835763"
    ],
    "connection": "CAUK-051612",
    "vlan_config": {
        "vlan_type": "dot1q",
        "vlan": 2203,
        "vlan_ethertype": "0x8100"
}' 

The response is a http 201 created. The "state": "allocated" indicates the resource is reserved and awaits the B side.

{
    "id": "9186f4ab-36ea-4609-80cc-5d8a494b981a",
    "type": "p2p_vc",
    "network_service": "VLC00050255",
    "managing_account": "A0073476",
    "consuming_account": "A0073476",
    "external_ref": "4364",
    "purchase_order": "6434664",
    "contract_ref": "NA",
    "billing_account": "A0073476",
    "role_assignments": [
        "3f403181-2dc0-42b2-08dc-08d99f835763",
        "c23c1a9c-5813-4fe1-08dd-08d99f835763"
    ],
    "connection": "CAUK-051612",
    "network_feature_configs": [],
    "vlan_config": {
        "vlan_type": "dot1q",
        "vlan": 2203,
        "vlan_ethertype": "0x8100"
    },
    "state": "allocated",
    "status": []
}

Step 10: Inviting Party reads Virtual Connects to see if one is awaiting their action

The inviting party reads virtual connects to discover the A side has used their service key and initiated the virtual connect.

The inviting party uses the following request:

curl --location --request GET 'https://{{ix-api-url}}/ixapi/v2/extensions/inxn-servicekey-v1/network-services' \
--header 'Authorization: Bearer {YOUR_TOKEN}'

This shall result in an http 200 OK response with response body as follows:

{
    "id": "VLC00050255",
    "state": "requested",
    "nsc_required_contact_roles": [
        "4699403d-b264-4a47-9bbb-2c956dcd1a12",
        "9a442fef-ff8f-4c2e-93e5-46425c00fd4b"
    ],
    "contract_ref": "TEST Ref",
    "external_ref": "4364",
    "status": [
        {
            "severity": 6,
            "tag": "requested",
            "message": "Eline service was requested",
            "attrs": {
                "request_date": "2022-03-23T00:00:00"
            },
            "timestamp": "2022-03-23T18:50:17"
        }
    ],
    "billing_account": "A0073476",
    "capacity": 100,
    "consuming_account": "A0073476",
    "joining_member_account": "A0087264",
    "managing_account": "A0073476",
    "product_offering": "inxn-virtual-connect",
    "purchase_order": "6434664",
    "service_key": "e8167d16-28b9-4bba-b016-25bc87c84c39",
    "type": "p2p_vc"
}

The Inviting Party can see the point to point virtual circuit as requested using their service-key.

The Inviting Party can choose to 

  • Accept the Virtual Connect - see flow from Step 10

  • Decline the Virtual Connect - see flow from Step Alt1-1 below.

Step 11: Inviting Party accepts Virtual Connect creating B side CAP and VLAN

The Inviting Party (B side) may require client credentials to be used to retrieve an access token authorised to complete actions as the B side. 

Make the following request to add the B side of the point to point virtual circuit, specifically which cloud access port to use and the VLAN setting. If the "nsc_required_contact_roles" in step 5 listed contacts for the network-service-configs then these must be provided in this request payload through the property "role-assignments".

curl --location --request POST 'https://{{ix-api-url}}/ixapi/v2/extensions/inxn-servicekey-v1/network-service-configs' \
--header 'Authorization: Bearer {YOUR_TOKEN}' \
--data-raw '{
    "type": "p2p_vc",
    "managing_account": "A0087264",
    "consuming_account": "A0087264",
    "external_ref": "4364",
    "network_service": "VLC00050255",
    "purchase_order": "6434664",
    "contract_ref": "NA",
    "billing_account": "A0087264",
    "role_assignments": [
        "eeb1b37d-375d-4331-728f-08da0c39180b",
        "2eb856a2-ba09-4a04-7290-08da0c39180b"
    ],
    "connection": "CANL-051305",
    "vlan_config": {
        "vlan_type": "dot1q",
        "vlan": 2204,
        "vlan_ethertype": "0x8100"
    }
}' 

The response is a http 201 created. The "state": "allocated" indicates the resource is reserved and this triggers provisioning.

{

    "id": "7f4db82c-21f6-439a-812e-410f6f37867a",
    "type": "p2p_vc",
    "network_service": "VLC00050255",
    "managing_account": "A0087264",
    "consuming_account": "A0087264",
    "external_ref": "4364",
    "purchase_order": "6434664",
    "contract_ref": "NA",
    "billing_account": "A0087264",
    "role_assignments": [
        "eeb1b37d-375d-4331-728f-08da0c39180b",
        "2eb856a2-ba09-4a04-7290-08da0c39180b"
    ],
    "connection": "CANL-051305",
    "network_feature_configs": [],
    "vlan_config": {
        "vlan_type": "dot1q",
        "vlan": 2204,
        "vlan_ethertype": "0x8100"
    },
    "state": "allocated",
    "status": []
}

Step 12: Both parties can read point to point virtual circuit to check it is provisioned

Make the following request to check the state of the point to point virtual circuit. The state shall change to "Production" when the installation completes.  This request uses the Subscribing Party client credentials access token. (The Inviting Party would need to use their own access token to determine the same.)

curl --location --request GET 'https://{{ix-api-url}}/ixapi/v2/extensions/inxn-servicekey-v1/network-services/<id>' \
--header 'Authorization: Bearer {YOUR_TOKEN}'

This shall result in an http 200 OK response with response body as follows:

{
    "id": "VLC00050255",
    "state": "allocated",
    "nsc_required_contact_roles": [
        "4699403d-b264-4a47-9bbb-2c956dcd1a12",
        "9a442fef-ff8f-4c2e-93e5-46425c00fd4b"
    ],
    "contract_ref": "TEST Ref",
    "external_ref": "4364",
    "status": [
        {
            "severity": 6,
            "tag": "requested",
            "message": "Eline service was requested",
            "attrs": {
                "request_date": "2022-03-23T00:00:00"
            },
            "timestamp": "2022-03-23T19:01:02"
        }
    ],
    "billing_account": "A0073476",
    "capacity": 100,
    "consuming_account": "A0073476",
    "joining_member_account": "A0087264",
    "managing_account": "A0073476",
    "product_offering": "inxn-virtual-connect",
    "purchase_order": "6434664",
    "service_key": "e8167d16-28b9-4bba-b016-25bc87c84c39",
    "type": "p2p_vc"
}

Step Alt1-1: Alternate Flow - Inviting Party declines Virtual Connect

The Inviting Party decides to not accept the Virtual Connect and can use the following request using their access token.

curl --location --request DELETE 'https://api-a1.interxion.com/ixapi/v2/network-services/VLC00050324' \
--header 'Authorization: Bearer {YOUR_TOKEN}'

An http 202 Accepted response is returned with the following response body.

{
    "id": "VLC00050324",
    "state": "cancelled",
    "nsc_required_contact_roles": [],
    "contract_ref": "TEST Ref",
    "capacity": 100,
    "status": [
        {
            "severity": 6,
            "tag": "requested",
            "message": "Eline service was requested",
            "attrs": {
                "request_date": "2022-04-07T00:00:00"
            },
            "timestamp": "2022-04-07T12:33:56"
        },
        {
            "severity": 6,
            "tag": "Not Accepted",
            "message": "Truphone Ltd. declined your connection request",
            "attrs": null,
            "timestamp": "2022-04-07T12:34:02"
        }
    ],
    "consuming_account": "A0087264",
    "external_ref": "4364",
    "managing_account": "A0087264",
    "product_offering": "503121.AMS.AMS",
    "type": "p2p_vc",
    "billing_account": "A0087264",
    "joining_member_account": "A0015750",
    "purchase_order": "6434664"
}

Step Alt1-2: Alternate Flow - Subscribing Party reads Virtual Connect and sees cancelled state

After the Inviting Party declines the Virtual Connect, the Subscribing Party can read the Virtual Connect making the following request using their access token.

curl --location --request GET 'https://api-a1.interxion.com/ixapi/v2/network-services/VLC00050324' \
--header 'Authorization: Bearer {YOUR_TOKEN}'

An http 200 Accepted response is returned with the following response body.

{
    "id": "VLC00050324",
    "state": "cancelled",
    "nsc_required_contact_roles": [],
    "contract_ref": "TEST Ref",
    "capacity": 100,
    "status": [
        {
            "severity": 6,
            "tag": "requested",
            "message": "Eline service was requested",
            "attrs": {
                "request_date": "2022-04-07T00:00:00"
            },
            "timestamp": "2022-04-07T12:33:56"
        },
        {
            "severity": 6,
            "tag": "Not Accepted",
            "message": "Truphone Ltd. declined your connection request",
            "attrs": null,
            "timestamp": "2022-04-07T12:34:02"
        }
    ],
    "consuming_account": "A0087264",
    "external_ref": "4364",
    "managing_account": "A0087264",
    "product_offering": "503121.AMS.AMS",
    "type": "p2p_vc",
    "billing_account": "A0087264",
    "joining_member_account": "A0015750",
    "purchase_order": "6434664"
}

The inviting party can see the property "state" has value "cancelled" and the property "status" shows a "Not Accepted" property "tag".

Step Alt1-3: Alternate Flow - Subscribing party deletes Virtual Connect

The Subscribing Party makes this request  to delete the point to point virtual circuit using their access token.

curl --location --request DELETE 'https://{{ix-api-url}}/ixapi/V2/extensions/inxn-servicekey-v1/network-services/VLC00050255' \
     --header 'Authorization: Bearer {YOUR_TOKEN}'

An http 200 Accepted response is returned with the following response body.

{
    "id": "VLC00050324",
    "state": "cancelled",
    "nsc_required_contact_roles": [],
    "contract_ref": "TEST Ref",
    "capacity": 100,
    "status": [
        {
            "severity": 6,
            "tag": "requested",
            "message": "Eline service was requested",
            "attrs": {
                "request_date": "2022-04-07T00:00:00"
            },
            "timestamp": "2022-04-07T12:33:56"
        },
        {
            "severity": 6,
            "tag": "Not Accepted",
            "message": "Truphone Ltd. declined your connection request",
            "attrs": null,
            "timestamp": "2022-04-07T12:34:02"
        }
    ],
    "consuming_account": "A0087264",
    "external_ref": "4364",
    "managing_account": "A0087264",
    "product_offering": "503121.AMS.AMS",
    "type": "p2p_vc",
    "billing_account": "A0087264",
    "joining_member_account": "A0015750",
    "purchase_order": "6434664"
}

Step Alt1-4: Subscribing Party confirms Virtual Connect is deleted

To check the Virtual Connect is deleted the Subscribing Party makes a request to read the Virtual Connect using their access token:

curl --location --request GET 'https://{{ix-api-url}}/ixapi/v2/ixapi/V2/extensions/network-services/<id>' \
--header 'Authorization: Bearer {YOUR_TOKEN}'

The response shall be an http 404 Not Found confirming the cancelled Virtual Connect is deleted.

4. Deprovision a Virtual Connect (point to point virtual circuit) using service key provisioning workflow

Both sides of the Virtual Connect can request its disconnect. Four scenarios are possible:

Scenario 1: Subscribing Party requests immediate service Disconnect and billing ceases after 30 days.

Scenario 2: Subscribing Party requests disconnect at end of notice period and billing ceases on same day i.e. 30 days.

Scenario 3: Inviting Party requests Disconnect and Subscribing Party takes no action. In this case the service will disconnect in 30 days and billing cease in 60 days.

Scenario 4: Inviting Party requests Disconnect and Subscribing Party intervenes to do an immediate disconnect of service. In this case, when the subscribing party intervenes, service is immediately disconnect and billing stops after 30 days from the request.

Scenario 1: Subscribing Party requests immediate service disconnect 

Scenario 1 Step 1: Subscribing party immediate Virtual Connect Disconnect

The subscribing party can request an immediate disconnect or at the end of the notice period (30 days).

To disconnect immediate, make this request  to request disconnect of the point to point virtual circuit using the Subscribing Party access token.

curl --location --request DELETE 'https://{{ix-api-url}}/ixapi/V2/extensions/inxn-servicekey-v1/network-services/VLC00050255' \
     --header 'Authorization: Bearer {YOUR_TOKEN}'

The response is an http 202 Accepted with response body 

{
    "id": "VLC00050255",
    "state": "decommission_requested",
    "nsc_required_contact_roles": [],
    "contract_ref": "TEST Ref",
    "external_ref": "4364",
    "status": [
        {
            "severity": 6,
            "tag": "requested",
            "message": "Eline service was requested",
            "attrs": {
                "request_date": "2022-03-23T00:00:00"
            },
            "timestamp": "2022-03-23T19:25:07"
        },
        {
            "severity": 6,
            "tag": "Decommission-Requested",
            "message": "Test Company Cloud Connect has requested disconnection",
            "attrs": null,
            "timestamp": "2022-03-23T19:25:10"
        }
    ],
    "billing_account": "A0073476",
    "capacity": 100,
    "charged_until": "2022-03-23",
    "consuming_account": "A0073476",
    "decommission_at": "2022-03-23",
    "joining_member_account": "A0087264",
    "managing_account": "A0073476",
    "product_offering": "inxn-virtual-connect",
    "purchase_order": "6434664",
    "service_key": "e8167d16-28b9-4bba-b016-25bc87c84c39",
    "type": "p2p_vc"
}

The "charged_until" is the date on which billing will end and the "decommission_at" is the date on which the point to point virtual circuit shall be de-provisioned.

Scenario 1 Step 2. Subscribing Party check Virtual Connect disconnected

To check the disconnect has completed, read the cloud access port using the request here:

curl --location --request GET 'https://{{ix-api-url}}/ixapi/v2/ixapi/V2/extensions/network-services/<id>' \
--header 'Authorization: Bearer {YOUR_TOKEN}'

The response shall be as below until the point to point virtual circuit is deprovisioned when instead an http 404 Not Found shall be returned.

{
    "id": "VLC00050255",
    "state": "decommission_requested",
    "nsc_required_contact_roles": [],
    "contract_ref": "TEST Ref",
    "external_ref": "4364",
    "status": [
        {
            "severity": 6,
            "tag": "requested",
            "message": "Eline service was requested",
            "attrs": {
                "request_date": "2022-03-23T00:00:00"
            },
            "timestamp": "2022-03-23T19:25:07"
        },
        {
            "severity": 6,
            "tag": "Decommission-Requested",
            "message": "Test Company Cloud Connect has requested disconnection",
            "attrs": null,
            "timestamp": "2022-03-23T19:25:10"
        }
    ],
    "billing_account": "A0073476",
    "capacity": 100,
    "charged_until": "2022-03-23",
    "consuming_account": "A0073476",
    "decommission_at": "2022-03-23",
    "joining_member_account": "A0087264",
    "managing_account": "A0073476",
    "product_offering": "inxn-virtual-connect",
    "purchase_order": "6434664",
    "service_key": "e8167d16-28b9-4bba-b016-25bc87c84c39",
    "type": "p2p_vc"
}

Scenario 2: Subscribing Party requests service disconnect at end of notice period

Scenario 2 Step 1: Subscribing party Virtual Connect Disconnect end of notice period

The subscribing party can requests service disconnect at end of notice period (i.e. 30 days).

To disconnect at end of notice period, make this request  to request disconnect of the point to point virtual circuit using the Subscribing Party access token.

curl --location --request DELETE 'https://api-a1.interxion.com/ixapi/v2/network-services/VLC000503' \
--header 'Authorization: Bearer {YOUR_TOKEN} ' \
--header 'Content-Type: text/plain' \
--data-raw '{
    "decommission_at": "2022-04-24"
}'

The response is an http 202 Accepted with response body 

{
    "id": "VLC00050255",
    "state": "decommission_requested",
    "nsc_required_contact_roles": [],
    "contract_ref": "TEST Ref",
    "external_ref": "4364",
    "status": [
        {
            "severity": 6,
            "tag": "requested",
            "message": "Eline service was requested",
            "attrs": {
                "request_date": "2022-03-23T00:00:00"
            },
            "timestamp": "2022-03-23T19:25:07"
        },
        {
            "severity": 6,
            "tag": "Decommission-Requested",
            "message": "Test Company Cloud Connect has requested disconnection",
            "attrs": null,
            "timestamp": "2022-03-23T19:25:10"
        }
    ],
    "billing_account": "A0073476",
    "capacity": 100,
    "charged_until": "2022-03-23",
    "consuming_account": "A0073476",
    "decommission_at": "2022-03-23",
    "joining_member_account": "A0087264",
    "managing_account": "A0073476",
    "product_offering": "inxn-virtual-connect",
    "purchase_order": "6434664",
    "service_key": "e8167d16-28b9-4bba-b016-25bc87c84c39",
    "type": "p2p_vc"
}

The "charged_until" is the date on which billing will end and the "decommission_at" is the date on which the point to point virtual circuit shall be de-provisioned.

Scenario 2 Step 2. Subscribing Party check Virtual Connect disconnected

To check the disconnect has completed, read the cloud access port using the request here:

curl --location --request GET 'https://{{ix-api-url}}/ixapi/v2/ixapi/V2/extensions/network-services/<id>' \
--header 'Authorization: Bearer {YOUR_TOKEN}'

The response shall be as below until the point to point virtual circuit is deprovisioned when instead an http 404 Not Found shall be returned.

{
    "id": "VLC00050255",
    "state": "decommission_requested",
    "nsc_required_contact_roles": [],
    "contract_ref": "TEST Ref",
    "external_ref": "4364",
    "status": [
        {
            "severity": 6,
            "tag": "requested",
            "message": "Eline service was requested",
            "attrs": {
                "request_date": "2022-03-23T00:00:00"
            },
            "timestamp": "2022-03-23T19:25:07"
        },
        {
            "severity": 6,
            "tag": "Decommission-Requested",
            "message": "Test Company Cloud Connect has requested disconnection",
            "attrs": null,
            "timestamp": "2022-03-23T19:25:10"
        }
    ],
    "billing_account": "A0073476",
    "capacity": 100,
    "charged_until": "2022-03-23",
    "consuming_account": "A0073476",
    "decommission_at": "2022-03-23",
    "joining_member_account": "A0087264",
    "managing_account": "A0073476",
    "product_offering": "inxn-virtual-connect",
    "purchase_order": "6434664",
    "service_key": "e8167d16-28b9-4bba-b016-25bc87c84c39",
    "type": "p2p_vc"
}

Scenario 3:  Inviting Party requests Disconnect and Subscribing Party takes no action.

In this case the service will disconnect in 30 days and billing cease in 60 days.

Scenario 3 Step 1: Inviting party requests Virtual Connect disconnect

The inviting party can requests service disconnect. The service will disconnect at the end of the notice period (30 days) and billing shall be stopped after 60 days.

To disconnect at end of notice period, make this request  to request disconnect of the point to point virtual circuit using the Inviting Party access token.

curl --location --request DELETE 'https://{{ix-api-url}}/ixapi/V2/extensions/inxn-servicekey-v1/network-services/VLC00050255' \
     --header 'Authorization: Bearer {YOUR_TOKEN}'

The response is an http 202 Accepted with response body 

{
    "id": "VLC00050255",
    "state": "decommission_requested",
    "nsc_required_contact_roles": [],
    "contract_ref": "TEST Ref",
    "external_ref": "4364",
    "status": [
        {
            "severity": 6,
            "tag": "requested",
            "message": "Eline service was requested",
            "attrs": {
                "request_date": "2022-03-23T00:00:00"
            },
            "timestamp": "2022-03-23T19:25:07"
        },
        {
            "severity": 6,
            "tag": "Decommission-Requested",
            "message": "Test Company Cloud Connect has requested disconnection",
            "attrs": null,
            "timestamp": "2022-03-23T19:25:10"
        }
    ],
    "billing_account": "A0073476",
    "capacity": 100,
    "charged_until": "<Sixty days from request date>",
    "consuming_account": "A0073476",
    "decommission_at": "<Thirty days from request date>",
    "joining_member_account": "A0087264",
    "managing_account": "A0073476",
    "product_offering": "inxn-virtual-connect",
    "purchase_order": "6434664",
    "service_key": "e8167d16-28b9-4bba-b016-25bc87c84c39",
    "type": "p2p_vc"
}

The "charged_until" is the date on which billing will end and the "decommission_at" is the date on which the point to point virtual circuit shall be de-provisioned.

Scenario 3 Step 2. Inviting Party or Subscribing Party check Virtual Connect disconnected

To check the disconnect has completed, read the cloud access port using the request here and the relevant access token.

curl --location --request GET 'https://{{ix-api-url}}/ixapi/v2/ixapi/V2/extensions/network-services/<id>' \
--header 'Authorization: Bearer {YOUR_TOKEN}'

The response shall be as below until the point to point virtual circuit is deprovisioned when instead an http 404 Not Found shall be returned. The billing shall stop in 60 days from the original disconnect request.

{
    "id": "VLC00050255",
    "state": "decommission_requested",
    "nsc_required_contact_roles": [],
    "contract_ref": "TEST Ref",
    "external_ref": "4364",
    "status": [
        {
            "severity": 6,
            "tag": "requested",
            "message": "Eline service was requested",
            "attrs": {
                "request_date": "2022-03-23T00:00:00"
            },
            "timestamp": "2022-03-23T19:25:07"
        },
        {
            "severity": 6,
            "tag": "Decommission-Requested",
            "message": "Test Company Cloud Connect has requested disconnection",
            "attrs": null,
            "timestamp": "2022-03-23T19:25:10"
        }
    ],
    "billing_account": "A0073476",
    "capacity": 100,
    "charged_until": "2022-03-23",
    "consuming_account": "A0073476",
    "decommission_at": "2022-03-23",
    "joining_member_account": "A0087264",
    "managing_account": "A0073476",
    "product_offering": "inxn-virtual-connect",
    "purchase_order": "6434664",
    "service_key": "e8167d16-28b9-4bba-b016-25bc87c84c39",
    "type": "p2p_vc"
}

Scenario 4:  Inviting Party requests Disconnect and Subscribing Party takes action.

Scenario 4 Step 1: Inviting party requests Virtual Connect disconnect

The inviting party can requests service disconnect. The service will disconnect at the end of the notice period (30 days) and billing shall be stopped after 60 days.

The Inviting Party makes the following request:

curl --location --request DELETE 'https://{{ix-api-url}}/ixapi/V2/extensions/inxn-servicekey-v1/network-services/VLC00050255' \
     --header 'Authorization: Bearer {YOUR_TOKEN}'

The response is an http 202 Accepted with response body 

{
    "id": "VLC00000038",
    "state": "decommission_requested",
    "nsc_required_contact_roles": [],
    "capacity": 100,
    "status": [
        {
            "severity": 6,
            "tag": "requested",
            "message": "Eline service was requested",
            "attrs": {
                "request_date": "2022-04-13T00:00:00"
            },
            "timestamp": "2022-04-13T12:02:24"
        },
        {
            "severity": 6,
            "tag": "Decommission-Requested-B-Side",
            "message": "Truphone Ltd. has requested disconnection",
            "attrs": null,
            "timestamp": "2022-04-13T12:02:26"
        }
    ],
    "consuming_account": "A0087263",
    "managing_account": "A0087263",
    "product_offering": "503121.AMS.AMS",
    "type": "p2p_vc",
    "billing_account": "A0087263",
    "decommission_at": "2022-05-13",
    "joining_member_account": "A0015750"
}

The "decommission_at" is the date on which the point to point virtual circuit shall be de-provisioned.

Scenario 4 Step 2.  Subscribing Party check Virtual Connect and see Inviting Party has made disconnect request

Subscribing party reads the Virtual Connect and sees that the Inviting Party has requested a disconnect.

curl --location --request GET 'https://{{ix-api-url}}/ixapi/v2/ixapi/V2/extensions/network-services/<id>' \
--header 'Authorization: Bearer {YOUR_TOKEN}'

The response shall be as below until the point to point virtual circuit is deprovisioned when instead an http 404 Not Found shall be returned. The billing shall stop in 60 days from the original disconnect request.

{
    "id": "VLC00050255",
    "state": "decommission_requested",
    "nsc_required_contact_roles": [],
    "contract_ref": "TEST Ref",
    "external_ref": "4364",
    "status": [
        {
            "severity": 6,
            "tag": "requested",
            "message": "Eline service was requested",
            "attrs": {
                "request_date": "2022-03-23T00:00:00"
            },
            "timestamp": "2022-03-23T19:25:07"
        },
        {
            "severity": 6,
            "tag": "Decommission-Requested",
            "message": "Test Company Cloud Connect has requested disconnection",
            "attrs": null,
            "timestamp": "2022-03-23T19:25:10"
        }
    ],
    "billing_account": "A0073476",
    "capacity": 100,
    "charged_until": "2022-03-23",
    "consuming_account": "A0073476",
    "decommission_at": "2022-03-23",
    "joining_member_account": "A0087264",
    "managing_account": "A0073476",
    "product_offering": "inxn-virtual-connect",
    "purchase_order": "6434664",
    "service_key": "e8167d16-28b9-4bba-b016-25bc87c84c39",
    "type": "p2p_vc"
}

Scenario 4 Step 3: Subscribing party requests Virtual Connect disconnect

The Subscribing Party can requests service disconnect after the Inviting Party has done so. The service will disconnect immediately and billing shall be stopped after 30 days.

The Subscribing Party makes the following request:

curl --location --request DELETE 'https://{{ix-api-url}}/ixapi/V2/extensions/inxn-servicekey-v1/network-services/VLC00050255' \
     --header 'Authorization: Bearer {YOUR_TOKEN}'

The response is an http 202 Accepted with response body 

{
    "id": "VLC00000038",
    "state": "decommission_requested",
    "nsc_required_contact_roles": [],
    "capacity": 100,
    "status": [
        {
            "severity": 6,
            "tag": "requested",
            "message": "Eline service was requested",
            "attrs": {
                "request_date": "2022-04-13T00:00:00"
            },
            "timestamp": "2022-04-13T12:05:48"
        },
        {
            "severity": 6,
            "tag": "Decommission-Requested-B-Side",
            "message": "Truphone Ltd. has requested disconnection",
            "attrs": null,
            "timestamp": "2022-04-13T12:02:26"
        },
        {
            "severity": 6,
            "tag": "Decommission-Requested",
            "message": "Test Company Cloud Connect has requested disconnection",
            "attrs": null,
            "timestamp": "2022-04-13T12:05:51"
        }
    ],
    "consuming_account": "A0087263",
    "external_ref": "4364",
    "managing_account": "A0087263",
    "product_offering": "503121.AMS.AMS",
    "type": "p2p_vc",
    "billing_account": "A0087263",
    "charged_until": "2022-04-14",
    "contract_ref": "TEST Ref",
    "decommission_at": "2022-04-13",
    "joining_member_account": "A0015750",
    "purchase_order": "6434664"
}

The "charged_unitl" is the date on which billing shall stop and "decommission_at" is the date on which the point to point virtual circuit shall be de-provisioned.

Scenario 4 Step 4. Inviting Party or Subscribing Party check Virtual Connect disconnected

To check the disconnect has completed, read the cloud access port using the request here and the relevant access token.

curl --location --request GET 'https://{{ix-api-url}}/ixapi/v2/ixapi/V2/extensions/network-services/<id>' \
--header 'Authorization: Bearer {YOUR_TOKEN}'

The response shall be as below until the point to point virtual circuit is deprovisioned when instead an http 404 Not Found shall be returned. The billing shall stop in 60 days from the original disconnect request.

{
    "id": "VLC00000038",
    "state": "decommission_requested",
    "nsc_required_contact_roles": [],
    "capacity": 100,
    "status": [
        {
            "severity": 6,
            "tag": "requested",
            "message": "Eline service was requested",
            "attrs": {
                "request_date": "2022-04-13T00:00:00"
            },
            "timestamp": "2022-04-13T12:05:48"
        },
        {
            "severity": 6,
            "tag": "Decommission-Requested-B-Side",
            "message": "Truphone Ltd. has requested disconnection",
            "attrs": null,
            "timestamp": "2022-04-13T12:02:26"
        },
        {
            "severity": 6,
            "tag": "Decommission-Requested",
            "message": "Test Company Cloud Connect has requested disconnection",
            "attrs": null,
            "timestamp": "2022-04-13T12:05:51"
        }
    ],
    "consuming_account": "A0087263",
    "external_ref": "4364",
    "managing_account": "A0087263",
    "product_offering": "503121.AMS.AMS",
    "type": "p2p_vc",
    "billing_account": "A0087263",
    "charged_until": "2022-04-14",
    "contract_ref": "TEST Ref",
    "decommission_at": "2022-04-13",
    "joining_member_account": "A0015750",
    "purchase_order": "6434664"
}