Getting Started

Account

In order to use IX-API, you need to have an account with the Internet Exchange. This can either be your own existing account (created by the IXP), or if you order on behalf of a sub-customer, you can create it yourself, using the accounts_create operation.

Fill in the details of your sub customer. If you are a reseller, the “billing_information” should point to your own invoicing details.

The “managing_account” must point to your own (reseller) account ID. In order to find your own account ID, please use the accounts_list operation.

The account that does not have a “managing_account” is your account.

After creation, a GET request will retrieve the status of the contract creation request. The “state” and “status” attributes give an indication of next steps. This could involve an out-of-band membership process, document signing, the creation of contacts/roles, or the order of a network service to activate a membership.

The “state” attribute is a single word indicating the state of the account, e.g. “requested”, “production”, “error” (see States Documentation. )

The “status” is a more detailed, human-readable description of the account state, including instructions on how to move from e.g. “requested” or “error” to “production”.

POST /accounts accounts_create
{
  "managing_account": "<my_account_id>",
  "name": "Moonpeer Inc.",
  "legal_name": "Moon Network Services LLS.",
  "external_ref": "IX:Service:23042",
  "discoverable": false,
  "metro_area_network_presence": [
    "14021",
    "12939"
  ],
  "address": {
    "country": "US",
    "locality": "Mountain View",
    "region": "CA",
    "postal_code": "9409",
    "street_address": "1600 Amphitheatre Pkwy.",
    "post_office_box_number": "2335232"
  }
}
Status: 201 Content-Type: application/json Response
{
  "state": "requested",
  "status": [
    {
      "severity": 2,
      "tag": "toc_required",
      "message": "It is required to upload the signed Terms of Conditions document.",
      "attrs": {
        "url": "https://documents.my-ix.example/"
      },
      "timestamp": "2019-08-24T14:15:22Z"
    }
  ],
  "managing_account": "my-account",
  "name": "Moonpeer Inc.",
  "legal_name": "Moon Network Services LLS.",
  "external_ref": "IX:Service:23042",
  "discoverable": false,
  "metro_area_network_presence": [
    "14021",
    "12939"
  ],
  "id": "1a2b3c4d-5e6f-7g8h-9i0j-1k2l3m4n5o6p",
  "address": {
    "country": "US",
    "locality": "Mountain View",
    "region": "CA",
    "postal_code": "9409",
    "street_address": "1600 Amphitheatre Pkwy.",
    "post_office_box_number": "2335232"
  }
}

Contact

In order for an account to be operational or Terms & Conditions to be accepted, some exchanges may require contacts assigned to specific roles. The exchanges should provide such information in the account status field mentioned above.

You can create a contact with the contacts_create operation.

The role assignment can then be performed finding the requested role using roles_list.

Finally assigning the requested role to the created or pre-existing contact, with the role_assignments_create operation.

POST /contacts contacts_create
{
  "managing_account": "<my_account_id>",
  "consuming_account": "<customer_accont_id>",
  "name": "Some A. Name",
  "telephone": "+123 123123123123",
  "email": "info@moon-peer.net"
}
GET /roles roles_list
Status: 200 Content-Type: application/json Response
[
  {
    "id": "role:noc",
    "name": "noc",
    "required_fields": ["name", "email"]
  }
]
POST /role-assignments role_assignments_create
{
  "role": "<role_id>",
  "contact": "<contact_id>"
}

Connection

Some exchanges might support the provisioning of connections via IX-API, some will require you to order them using a different interface and process. For the first case, please refer to ordering a connection section . Regardless, any new network service will require a connection to be deployed onto, and therefore this constitutes a prerequisite to the follow up documentation.

Your connection list can be retrieved with the connections_list operation.

GET /connections connections_list
Status: 200 Content-Type: application/json Response
[
  {
    "state": "production",
    "status": [],
    "current_billing_start_date": "2019-08-24",
    "managing_account": "<my_account_id>",
    "consuming_account": "<my_account_id>",
    "billing_account": "<my_account_id>",
    "external_ref": "IX:Service:23042",
    "purchase_order": "Project: DC Moon",
    "contract_ref": "contract:31824",
    "role_assignments": [
      "c-impl:123",
      "c-noc:331"
    ],
    "mode": "lag_lacp",
    "lacp_timeout": "slow",
    "product_offering": "string",
    "id": "string",
    "name": "string",
    "ports": ["23", "42", "5"],
    "port_reservations": ["2312"],
    "pop": "pop:127388:LD3",
    "speed": 20000,
    "capacity_allocated": 0,
    "capacity_allocation_limit": 25000,
    "vlan_types": ["port", "qinq", "dot1q"],
    "outer_vlan_ethertypes": ["0x8100"],
    "port_quantity": 1,
    "subscriber_side_demarcs": []
  }
]

Service VLAN

Each creation of a Network Service Config requires a VLAN config to be specified.

The VLAN types and ethertypes offered by an Exchange can be discovered from the “vlan_types” and “outer_vlan_ethertypes” properties for each individual Connection . These may vary within an Exchange depending on constraints within connected hardware.

Exchanges may choose to support multiple types of VLAN tagging. Currently the possible types are:

  1. Dot1Q: Providing a single VLAN tag to identify the service.
  2. QinQ: Providing two VLAN tags to identify the service.
  3. Port: Untagged.

The supported ethertype of the outer tag in hexadecimal notation are: “0x8100” (standard 802.1q), “0x88a8” (8021.ad stacked tags), and “0x9100” (pre-802.1q Cisco VLAN tags)

Product Offerings

IX-API v2 supports a variety of network services from standard peering to various private interconnection options. In order to discover them you can list the product offerings with product_offerings_list.

Once found the suitable offering, its ID can be used to order the service itself. As mentioned above, some exchanges may require specific services to be ordered first for new accounts to move to production status. In that case the related info will be available in the account “status” field.

We will provide a guide for each different service provisioning starting from peering.

GET /product-offerings product_offerings_list
Status: 200 Content-Type: application/json Response
[
  {
    "type": "exchange_lan",
    "id": "string",
    "name": "string",
    "display_name": "string",
    "exchange_logo": "https://example.ix/resources/ixpLogo",
    "service_provider_logo": "https://example.ix/resources/providerLogo",
    "product_logo": "https://example.ix/resources/products/activeCloudPremium",
    "resource_type": "network_service",
    "handover_metro_area_network": "191239810",
    "handover_metro_area": "met:29381993:NYC",
    "physical_port_speed": 0,
    "service_provider": "Example IX",
    "downgrade_allowed": true,
    "upgrade_allowed": true,
    "orderable_not_before": "2019-08-24T14:15:22Z",
    "orderable_not_after": "2019-08-24T14:15:22Z",
    "contract_terms": "2 weeks and 1 day, renewing every 37 days afterwards, first 66 days free",
    "notice_period": "at least 2 weeks before the end of every odd month",
    "provider_vlans": "single",
    "service_metro_area_network": "9123843",
    "service_metro_area": "met:213913485:LON",
    "bandwidth_min": 0,
    "bandwidth_max": 0,
    "exchange_lan_network_service": "network-service:123123"
  }
]

Exchange LAN Public Peering

As mentioned above, you will need to find the suitable public peering service product offering, which would include properties such as specific LAN instance and bandwidth. The list of product offerings can be obtained using the product_offerings_list operation with an applied filter: GET /product-offerings?type=exchange_lan

The complete list of required properties is specified in the response of the product product_offerings_read endpoint.

Next you will need to create a Network Service Config (NSC) which will represent your public peering service. In order to do that, you will require several properties as described in the network_service_configs_create operation.

We list here the steps to obtain all the required properties.

The type for the NSC must match the type of the network service which in this case is exchange_lan.

The product_offering ID is the same as the previously selected product offering response.

Likewise, the network_service ID is available in the previously selected product offering response under exchange_lan_network_service.

You will also need account IDs (managing_account, consuming_account, billing_account). If you are creating the service for yourself they will all match. Otherwise the consuming_account will be your sub-customer account ID and the billing_account could either be your or your sub-customer account ID depending on the billing policy of the exchange.

Next you will need to specify on which connection the service will reside. On how to obtain a connection ID please refer to Connection.

The connection needs to be in the same handover_metro_area_network specified in the product offering.

When creating an NSC will also require a vlan config. Please see the Service VLAN section on how to specify it.

Specific services require specific contacts to be assigned to specific roles in that service context. Effectively being responsible for certain aspects of the service lifecycle (E.g: NOC contact supposedly reachable 24/7 for emergencies). You can find the required role assignments for a NSC in the corresponding network_services_read response in the nsc_required_contact_roles property.

Once you found out the required role assignment you need to either pick from existing or create the corresponding role assignments and specify their role assignments IDs during the creation of the NSC.

Finally, for public peering services, you will also require a MAC address. You can list mac addresses using macs_list or register a new mac address via macs_create.

Once you have selected a suitable MAC address you can use the MAC address ID during the creation of the NSC.

POST /macs macs_create
{
  "managing_account": "<my_account_id>",
  "consuming_account": "<customer_account_id>",
  "address": "42:23:bc:8e:b8:b0"
}
POST /network-service-configs network_service_configs_create
{
  "type": "exchange_lan",
  "network_service": "<network_service_id>",
  "managing_account": "<my_account_id>",
  "billing_account": "<my_account_id>",
  "consuming_account": "<customer_account_id>",
  "product_offering": "<product_offering_id>",
  "external_ref": "IX:Service:23042",
  "purchase_order": "Project: DC Moon",
  "contract_ref": "contract:31824",
  "role_assignments": ["<noc_role_assignment_id>"],
  "connection": "string",
  "vlan_config": {
    "vlan_type": "dot1q",
    "vlan": 23,
    "vlan_ethertype": "0x8100"
  },
  "capacity": null,
  "asns": [
    4294967295
  ],
  "macs": [
     "<mac_address_id>"
  ],
  "listed": true
}
Status: 201 Content-Type: application/json Response
{
  "type": "exchange_lan",
  "state": "error",
  "status": [
    {
      "severity": 2,
      "tag": "network_feature_config_required",
      "message": "This service requires a route server network feature id: 2342.",
      "attrs": {
        "network_feature": "2342"
      },
      "timestamp": "2019-08-24T14:15:22Z"
    }
  ],
  "current_billing_start_date": "2019-08-24",
  "id": "ff4e3e4-5f6a-4b7b-8c8c-9d9d9d9d9d9d",
  "network_service": "string",
  "managing_account": "<my_account_id>",
  "consuming_account": "<customer_account_id>",
  "external_ref": "IX:Service:23042",
  "purchase_order": "Project: DC Moon",
  "contract_ref": "contract:31824",
  "billing_account": "string",
  "role_assignments": [
    "c-impl:123",
    "c-noc:331"
  ],
  "connection": "string",
  "network_feature_configs": [
    "12356",
    "43829"
  ],
  "vlan_config": {
    "vlan_type": "dot1q",
    "vlan": 23,
    "vlan_ethertype": "0x8100"
  },
  "capacity": 1,
  "asns": [
    4294967295
  ],
  "macs": [
    "<mac_address_id>"
  ],
  "ips": [
    "<new_ip_address_id>"
  ],
  "listed": true,
  "product_offering": "<product_offering_id>"
}

Some exchanges might require you to create a Network Feature Config (NFC) alongside the NSC.

You can find the required Network Features to configure for a specific NSC with the network_features_list operation and providing the ID of the network service and required as filters: GET /network-features?required=true&network_service=<network_service_id>

If an NFC is required the corresponding NSC will stay in an error state until the NFC has been created. On how to create a NFC please refer to setting up a Route Server Session .

Depending on each exchange level of automation the provisioning of the service may or may not be on demand. Because of that you may need to poll the state of the newly created service via this using network_service_configs_read

GET /network-features network_features_list
Status: 200 Content-Type: application/json Response
[
  {
    "type": "route_server",
    "id": "string",
    "name": "string",
    "required": true,
    "nfc_required_contact_roles": [
      "role:noc", "role:implementation"
    ],
    "flags": [
      {
        "name": "RPKI-HARD-FILTER",
        "description": "RPKI reject invalid filtering is available",
        "mandatory": true
      }
    ],
    "network_service": "string",
    "asn": 0,
    "fqdn": "rs1.example.ix",
    "looking_glass_url": "https://lg.example.ix/rs1",
    "address_families": [
      "af_inet"
    ],
    "session_mode": "public",
    "available_bgp_session_types": [
      "passive"
    ],
    "ip_v4": "192.42.23.1",
    "ip_v6": "2001:23:42::1"
  }
]

Optional: Update peering IP FQDN

You may want to update the peering IP FQDN, in order to do so you will need to find the IP address the exchange assigned for your public peering service, using the ips_list operation, filtering by network service config ID: GET /ips?network_service_config=<nsc_id>

And then you will need to update the FQDN property with ips_partial_update .

PATCH /ips/<id> ips_partial_update
{
  "fqdn": "gw01.dc.example.ix"
}

Microsoft Azure Peering Service (MAPS)

First you will need to choose the right MAPS Product Offering which includes properties such as specific LAN instance and bandwidth. Use the filters to find a product offering that matches.

The resource_type of the product offering should be network_service_config.

You now will need to find the MAPS network service to configure by querying the Network Services endpoint and filter by the ID of the product offering using network_services_list: GET /network-services?product_offering=<id>

Next you will need to create a Network Service Config (NSC) in order to join the MAPS virtual circuit. You will require several properties as specified in the network_service_configs_create operation.

We list here the steps to obtain all the required properties and constraints.

  • The type for the NSC must match the type of the Network Service.
  • The product_offering ID is the same as the previously selected Product Offering response.
  • The network_service ID is retrieved from the network_service_list query.

You will also need Account IDs (managing_account, consuming_account, billing_account). If you are creating the service for yourself they will all match. Otherwise the consuming_account will be your sub-customer account ID and the billing_account could either be your or your sub-customer account ID depending on the billing policy of the exchange.

Next you will need to specify on which connection the service will reside. On how to obtain a connection ID please refer to Connection in Getting Started. The connection needs to be in the same handover_metro_area_network specified in the product offering.

When creating an NSC will also require a vlan config. Please see the Service VLAN section on how to specify it.

This service may require specific contacts to be assigned to specific roles in that service context. You can find the required role assignments for a NSC in the nsc_required_contact_roles property in the Network Service you queried before.

After creating the Network Service Config, you need to set up a Route Server Session.

POST /network-service-configs network_service_configs_create
{
  "type": "<network_service_type>",
  "managing_account": "<my_account_id>",
  "billing_account": "<my_account_id>",
  "consuming_account": "<customer_account_id>",
  "connection": "<connection_id>",
  "network_service": "<network_service_id>",
  "product_offering": "<product_offering_id>",
  "role_assignments": ["<noc_role_assignment_id>"],
  "vlan_config": {
    "vlan_type": "dot1q",
    "vlan": 42
  },
  // ... type specific required fields ...
}

Closed User Groups (mp2mp_vc)

A closed user group is a participant-owned multi-user LAN service. You could either join an existing closed user group or create a new one.

Joining a Closed User Group

Query the network_services_list endpoint to retrieve the list of Network Services. You can filter by type in order to only list closed user groups: GET /network-services?type=mp2mp_vc

Within the result set, choose the appropriate network service. Normally, the closed used groups identify themselves via the property display_name.

The selected Network Service contains the property nsc_product_offerings which is a list of compatible Product Offerings of resource_type: network_service_config. You can use those ids to filter the product_offerings_list endpoint: GET /product-offerings?id=id1,id2,id3...

Once, you found a suitable product_offering (i.e. by choosing bandwidth or handover_metro_area_network) you can go ahead and create the Network Service Config. For this, use network_service_configs_create with the network_service and selected product_offering IDs.

Some exchanges require or allow mp2mp_vc circuits with MAC ACL Protection. In those cases, you would find a value describing the policy in the Network Service object in property mac_acl_protection.

For the selection and adding a MAC Address, please see configuring Exchange LAN Public Peering.

We list here the steps to obtain all the required properties.

  • The type for the NSC must match the type of the network service which in this case is mp2mp_vc.
  • The product_offering ID from the previously selected product offering response.
  • The network_service ID selected earlier.

You will also need Account IDs (managing_account, consuming_account, billing_account). If you are creating the service for yourself they will all match. Otherwise the consuming_account will be your sub-customer account ID and the billing_account could either be your or your sub-customer account ID depending on the billing policy of the exchange.

Next you will need to specify on which connection the service will reside. On how to obtain a connection ID please refer to Connection . The connection needs to be in the same handover_metro_area_network specified in the product offering.

When creating an NSC will also require a vlan config. Please see the Service VLAN section on how to specify it.

Specific services require specific contacts to be assigned to specific roles in that service context. Effectively being responsible for certain aspects of the service lifecycle (E.g: NOC contact supposedly reachable 24/7 for emergencies). You can find the required role assignments for a NSC using network_services_read on the selected Network Service in the nsc_required_contact_roles property.

Once you found out the required role assignment you need to either pick from existing or create the corresponding role assignments and specify their role assignments IDs during the creation of the NSC.

POST /network-service-configs network_service_configs_create
{
  "type": "mp2mp_vc",
  "managing_account": "<my_account_id>",
  "billing_account": "<my_account_id>",
  "consuming_account": "<customer_account_id>",
  "connection": "<connection_id>",
  "network_service": "<network_service_id>",
  "product_offering": "<product_offering_id>",
  "capacity": null,
  "role_assignments": [
    "<noc_role_assignment_id>",
    "<impl_role_assignment_id>"
  ],
  "vlan_config": {
    "vlan_type": "dot1q",
    "vlan": 23
  },
  "macs": ["<mac_address_id>"]
}

Creating a Closed User Group

First select a product offering of the type mp2mp_vc matching your criteria like handover and service metro area network.

Then create the network service using network_services_create with type mp2mp_vc and providing the ID of the selected product_offering.

You will also need Account IDs (managing_account, consuming_account, billing_account). If you are creating the service for yourself they will all match. Otherwise the consuming_account will be your sub-customer account ID and the billing_account could either be your or your sub-customer account ID depending on the billing policy of the exchange. Optionally you could specify a display name for the network service to make it easily identifiable by other users.

Closed user groups can have an either public or private joining policy.

If private, the network service is only visible to users that have been invited by the owner by creation of a specific member joining rule for the joining member.

If public, the network service is visible to all users of the API and able to join unless there is a member joining rule in place, denying such access.

Creat a member joining rules with the member_joining_rules_create operation.

You can choose to either allow or deny access to a customer identified by the consuming_account property. You need to specify the id of the network_service.

In case of allow, you can specify a minimal bandwidth requirement or limit.

Some exchanges might require you to join your own mp2mp_vc Network Service in order for it to become operational. In this case, follow the instructions in the above section.

POST /network-services network_services_create
{
  "type": "mp2mp_vc",
  "product_offering": "<product_offering_id>",
  "managing_account": "<my_account_id>",
  "consuming_account": "<customer_account_id>",
  "billing_account": "<my_account_id>",
  "display_name": "My Closed User Group",
  "public": false
}
Status: 201 Content-Type: application/json Response
{
  "id": "ffaaaaaa-1dd1-11b2-801b-000000000000",
  "type": "mp2mp_vc",
  "state": "requested",
  "status": [
    {
      "severity": 2,
      "tag": "member_joining_rule_required",
      "message": "A joining rule is required for non public Closed User Groups.",
      "attrs": {},
      "timestamp": "2019-08-24T14:15:22Z"
    },
    {
      "severity": 2,
      "tag": "nsc_required",
      "message": "Please join the closed user group by creating a Network Service Config.",
      "attrs": {},
      "timestamp": "2019-08-24T14:15:22Z"
    }
  ],
  "nsc_product_offerings": ["<nsc_product_offering_id>"],
  "nsc_required_contact_roles": [
    "<noc_role_id>",
    "<impl_role_id>"
  ],
  "mac_acl_protection": false,
  "product_offering": "<product_offering_id>",
  "managing_account": "<my_account_id>",
  "consuming_account": "<customer_account_id>",
  "billing_account": "<my_account_id>",
  "display_name": "My Closed User Group",
  "public": false,
  "member_joining_rules": [],
  "network_features": []
}
POST /member-joining-rules member_joining_rules_create
{
  "type": "allow",
  "managing_account": "<my_account_id>",
  "consuming_account": "<account_allowed_to_join_id>",
  "network_service": "<network_service_id>"
}

Private Virtual Circuit (p2p_vc)

A Private Virtual Circuit (sometimes referred to also as private VLAN) is a participant-owned LAN service between two parties. You could either join an existing private virtual circuit upon invitation by the owner or create a new one.

Creating a Private Virtual Circuit

First select a product offering of the type p2p_vc matching your criteria like handover and service metro area network.

Then create the Network Service using with the network_services_create operation.

Choosing the type: p2p_vc and providing the id of the selected product offering.

You will also need Account IDs (managing_account, consuming_account, billing_account). If you are creating the service for yourself they will all match. Otherwise the consuming_account will be your sub-customer account ID and the billing_account could either be your or your sub-customer account ID depending on the billing policy of the exchange.

Furthermore private virtual circuits require you to specify a joining_member_account. That is the account ID of the B side party of the service. The account ID for the B side has to be communicated directly by the user, alternatively if the B side user specified in account property discoverable as true such ID would be queryable using accounts_list.

Finally if you want to create a private virtual circuit between two of your own connections you can specify your own account ID as joining_member_account.

Optionally you could specify a display_name for the network service to make it easily identifiable by other users.

Once the Network Service is created then you can proceed creating the respective A-Side Network Service Config.

The created Network Service has the property nsc_product_offerings which is a list of compatible resource_type Network Service Config Product Offerings. If the property contains an empty list that means that the NSC does not have a commercial impact and can be created without the product offering property. If not empty, you can use those ids to filter the product_offerings_list endpoint like this GET /product-offerings?id=id1,id2,id3...

Once, you found a suitable product_offering (i.e. by choosing bandwidth or handover metro area network) you can go ahead and create the Network Service Config. For this, use network_service_configs_create with the network_service id and product_offering which can be found here.

We list here the steps to obtain all the required properties.

  • The type for the NSC must match the type of the network service which in this case is p2p_vc.
  • The product_offering ID from the previously selected product offering response.
  • The network_service ID selected earlier.

You will also need Account IDs (managing_account, consuming_account, billing_account). If you are creating the service for yourself they will all match. Otherwise the consuming_account will be your sub-customer account ID and the billing_account could either be your or your sub-customer account ID depending on the billing policy of the exchange.

Next you will need to specify on which connection the service will reside. On how to obtain a connection ID please refer to Connection . The connection needs to be in the same handover_metro_area_network specified in the product offering.

When creating an NSC will also require a vlan config. Please see the Service VLAN section on how to specify it.

Specific services require specific contacts to be assigned to specific roles in that service context. Effectively being responsible for certain aspects of the service lifecycle (E.g: NOC contact supposedly reachable 24/7 for emergencies). You can find the required role assignments for a NSC using the network_services_read operation under nsc_required_contact_roles.

Once you found out the required role assignment you need to either pick from existing or create the corresponding role assignments and specify their role assignments IDs during the creation of the NSC.

POST /network-services network_services_create
{
  "type": "p2p_vc",
  "product_offering": "<product_offering_id>",
  "managing_account": "<my_account_id>",
  "consuming_account": "<a_side_account_id>",
  "billing_account": "<my_account_id>",
  "joining_member_account": "<b_side_account_id>"
}
Status: 201 Content-Type: application/json Response
{
  "id": "ffffffff-aaaa-1111-0000-000000000000",
  "type": "p2p_vc",
  "state": "requested",
  "status": [
    {
      "severity": 2,
      "tag": "a_side_nsc_required",
      "message": "Please configure the A-Side",
      "attrs": {},
      "timestamp": "2019-08-24T14:15:22Z"
    },
    {
      "severity": 2,
      "tag": "b_side_nsc_required",
      "message": "Please configure the B-Side",
      "attrs": {},
      "timestamp": "2019-08-24T14:15:22Z"
    }
  ],
  "nsc_required_contact_roles": ["<noc_role_id>"],
  "nsc_product_offerings": ["<nsc_product_offering_id>"],
  "joining_member_account": "<joining_account_id>",
  "product_offering": "<product_offering_id>",
  "managing_account": "<my_account_id>",
  "consuming_account": "<a_side_account_id>",
  "billing_account": "<my_account_id>",
}
POST /network-service-configs network_service_configs_create
{
  "type": "p2p_vc",
  "managing_account": "<my_account_id>",
  "billing_account": "<my_account_id>",
  "consuming_account": "<a_side_account_id>",
  "connection": "<connection_id>",
  "network_service": "<network_service_id>",
  "product_offering": "<nsc_product_offering_id>",
  "capacity": null,
  "role_assignments": ["<noc_role_assignment_id>"],
  "vlan_config": {
    "vlan_type": "dot1q",
    "vlan": 23
  }
}

Configuring the B side

In order to configure the B-Side you will need to know the Network Service ID for the private virtual circuit.

Unless you received the ID directly from the inviting party, you can use the network_services_list operation to retrieve the list of already existing network services and filter by type=p2p_vc in order to only list Private Virtual Circuits. Within the result set, choose the appropriate object. Normally, the private virtual circuits identify themselves via the property display_name.

Once the network service has been identified the B-Side Network Service Config can be created following the same instruction as the A-Side, as specified in the above section.

Both NSCs need to be compatible with the NS specifications and only when the three entities’ creation has been performed can they be provisioned.

POST /network-service-configs network_service_configs_create
{
  "type": "p2p_vc",
  "managing_account": "<my_account_id>",
  "billing_account": "<my_account_id>",
  "consuming_account": "<b_side_account_id>",
  "connection": "<connection_id>",
  "network_service": "<network_service_id>",
  "product_offering": "<nsc_product_offering_id>",
  "capacity": null,
  "role_assignments": ["<noc_role_assignment_id>"],
  "vlan_config": {
    "vlan_type": "dot1q",
    "vlan": 23
  }
}

Cloud Circuits (cloud_vc)

In order to configure a cloud circuit, you would first have to consult the product_offerings_list endpoint and filter by type=cloud_vc. Because, there are multiple cloud providers that have different workflows for provisioning, this documentation separates two workflows

  1. Provider First Workflow
  2. Exchange First Workflow

Each Product Offering will tell you which workflow to use. For example, provisioning an AWS Direct Connect circuit implies the exchange first workflow while a Microsoft Azure Express Route circuit implies the provider first workflow. The property service_provider_workflow defines how you wouuld have provision.

Provider first workflow

This workflow assumes that relevant product parameters are configured within the cloud service provider before the IX-API is consulted. E.g: for Azure, you would first create a service key in the Azure portal or Azure API which implies a bandwidth and service location.

After this service has been created, you would need to select a compatible product offering from the product offerings endpoint. A compatible product offering has the same product parameters as the ones specified with the cloud provider system.

Some exchanges provide filtering by cloud_key. Using this filter, the product_offerings_list endpoint returns compatible product offerings for those implied product parameters: GET /product-offerings?cloud_key=<azure_service_key>

The Product Offering object contains further information about the services which can be consumed within the cloud providers network. For example, the provider_vlans property explains if the circuit combines multiple VLANs behind it. (see Azure Express Route Peerings)

In this case, the cloud_vlan property used in the network_service_configs_create operation contains information about the on-ramp side (the exchange connection to the cloud provider). For example, a null value would group all existing peerings and transport them over the circuit unchanged while a specific value (referring to a specific peering) would strip those tags before it transmits them over the circuit.

The diversity property of the product offering object refers to the amount of on-ramp connections, i.e. a value of 1 means there is no built-in redundancy when creating a network services from this product offering, while a value of 2 means there are two paths from the exchange network to the cloud service provider. In the case of Microsoft Azure, the diversity value is always 2 which means you would have to either select the primary or the secondary path in the NSC creation.

The path to the cloud provider is selected by providing the handover property when creating the network service using network_services_create.

You need to select from those product offerings and then use the cloud_key in the request to create the network service.

After that, you need to go ahead and create actual point to point configurations by creating network service configs of type cloud_vc which point to that network service using the network_service_configs_create operation. Exchanges may accept unique combinations of the handover and cloud_vlan value pairs creating a total of diversity times possible cloud_vlan value combinations.

We list here the steps to obtain all the required properties.

  • The type for the NSC must match the type of the network service which in this case is cloud_vc.
  • The product_offering ID from the previously selected product offering response.
  • The network_service created earlier.

You will also need Account IDs (managing_account, consuming_account, billing_account). If you are creating the service for yourself they will all match. Otherwise the consuming_account will be your sub-customer account ID and the billing_account could either be your or your sub-customer account ID depending on the billing policy of the exchange.

Next you will need to specify on which connection the service will reside. On how to obtain a connection ID please refer to Connection . The connection needs to be in the same handover_metro_area_network specified in the product offering.

When creating an NSC will also require a vlan config. Please see the Service VLAN section on how to specify it.

Specific services require specific contacts to be assigned to specific roles in that service context. Effectively being responsible for certain aspects of the service lifecycle (E.g: NOC contact supposedly reachable 24/7 for emergencies). You can find the required role assignments for a NSC using network_services_read on the selected Network Service in the nsc_required_contact_roles property.

Once you found out the required role assignment you need to either pick from existing or create the corresponding role assignments and specify their role assignments IDs during the creation of the NSC.

POST /network-services network_service_create
{
  "type": "cloud_vc",
  "product_offering": "<product_offering_id>",
  "managing_account": "<my_account_id>",
  "consuming_account": "<my_account_id>",
  "billing_account": "<my_account_id>",
  "cloud_key": "<azure_service_key>"
}
Status: 201 Content-Type: application/json Response
{
  "id": "ffffffff-ffff-1111-0000-000000000000",
  "type": "cloud_vc",
  "state": "requested",
  "status": [],
  "nsc_required_contact_roles": ["<noc_role_id>"],
  "cloud_key": "<azure_service_key>",
  "product_offering": "<product_offering_id>",
  "managing_account": "<my_account_id>",
  "consuming_account": "<my_account_id>",
  "billing_account": "<my_account_id>",
  "diversity": 2,
  "provider_ref": null
}
POST /network-service-configs network_service_configs_create
{
  "type": "cloud_vc",
  "handover": 1,
  "cloud_vlan": null,
  "managing_account": "<my_account_id>",
  "billing_account": "<my_account_id>",
  "consuming_account": "<my_account_id>",
  "connection": "<connection_a_id>",
  "network_service": "<network_service_id>",
  "product_offering": "<product_offering_id>",
  "capacity": null,
  "role_assignments": ["<noc_role_assignment_id>"],
  "vlan_config": {
    "vlan_type": "dot1q",
    "vlan": 23
  }
}
POST /network-service-configs network_service_configs_create
{
  "type": "cloud_vc",
  "handover": 2,
  "cloud_vlan": null,
  "managing_account": "<my_account_id>",
  "billing_account": "<my_account_id>",
  "consuming_account": "<my_account_id>",
  "connection": "<connection_b_id>",
  "network_service": "<network_service_id>",
  "product_offering": "<product_offering_id>",
  "capacity": null,
  "role_assignments": ["<noc_role_assignment_id>"],
  "vlan_config": {
    "vlan_type": "dot1q",
    "vlan": 23
  }
}

Exchange first workflow

This workflow does not require relevant product parameters to be configured within the cloud service provider before the IX-API is used to create a Cloud Service, for example, for AWS, you just need to have the AWS Account ID.

After you have the credential that identifies you at the Cloud Service Provider, you would need to select a product offering from the same cloud provider in the product offerings endpoint.

After you select the suitable product offering you can create the cloud connect service following the same steps listed in the Provider First Workflow after the Product Offering is selected.

This property is retrieved from the Cloud Service Provider console and the table here provides details of where to retrieve from:

  • Alibaba: Alibaba Cloud Account ID

    Example: 9876543210123456

  • Amazon Web Services: AWS Account ID

    Example: 123456789876

  • Google: Partner Paring Key

    This is obtained by first creating a VLAN attachment for a Partner Interconnect, ensuring to select the correct location.

    Example: d8412846-c12b-3364-cd67-1471187ce9c9/europe-west3/2

  • Microsoft Azure: ExpressRoute Service Key

    This is obtained by first creating an ExpressRoute Circuit, ensuring to select Interxion as the connectivity provider and the correct region.

    Example: dc79e015-f15c-4681-9c7b-6d16b2973997

  • Oracle: FastConnect Virtual Circuit OCID

    This is obtained by first creating a Virtual Circuit via a FastConnect Partner (Task 4) , ensuring to select Interxion as the FastConnect Partner and the correct location.

    Example: ocid1.virtualcircuit.oc1.iad.aaaaaaaakskl9riko5fbhw822tnjo7c4un1b2...


Route Server Sessions

Some network services require you to set up a session with a route server. Route Servers are considered network features and you will have to create a network feature config for each feature marked as required.

Network Features

Network features are additional functionalities to network services. Currently, there is only a single type of network features, which is route_server. Those route server network features only make sense in the context of peering (i.e. Public Peering or MAPS ).

You can find all existing network features with the network_features_list operation.

Network features have flags which represent configuration options. For example, an exchange may choose to enable the client to configure RPKI filtering on the BGP session. In this case, the network feature returns a flag called RPKI with an appropriate description. Some of those flags are always enabled. As such, their mandatory property is set to true which means they may never be disabled. The purpose of those mandatory flags is purely for documentation.

GET /network-features network_features_list
Status: 200 Content-Type: application/json Response
[
  {
    "type": "route_server",
    "id": "string",
    "name": "string",
    "required": true,
    "nfc_required_contact_roles": [
      "role:noc", "role:implementation"
    ],
    "flags": [
      {
        "name": "RPKI-HARD-FILTER",
        "description": "RPKI reject invalid filtering is available",
        "mandatory": true
      }
    ],
    "network_service": "string",
    "asn": 0,
    "fqdn": "rs1.example.ix",
    "looking_glass_url": "https://lg.example.ix/rs1",
    "address_families": [
      "af_inet"
    ],
    "session_mode": "public",
    "available_bgp_session_types": [
      "passive"
    ],
    "ip_v4": "192.42.23.1",
    "ip_v6": "2001:23:42::1"
  }
]

Network Feature Configs

Network features describe route server instances while network feature configs describe sessions on those instances. In order to create a route-server session, you would first need to have a fully provisioned network service config which means it is in state production (or in an error state if the NFC is required for that NSC). It is safe to assume that this network service config contains ip addresses that can be used in the peering context and that corresponding network service refers to a list of network features. You can create the NFC with network_feature_configs_create.

There can be one BGP session between each pair of NSC IP addresses and network features. You have to choose the IP address from the list of IPs of the NSC and specify it as part of the NFC creation.

POST /network-feature-configs network_feature_configs_create
{
  "type": "route_server",
  "managing_account": "<my_account_id>",
  "billing_account": "<my_account_id>",
  "consuming_account": "<customer_account_id>",
  "role_assignments": [
    "c-impl:123",
    "c-noc:331"
  ],
  "network_feature": "<ns_id>",
  "network_service_config": "<nsc_id>",
  "flags": [
    {
      "name": "RPKI-HARD-FILTER",
      "enabled": true
    }
  ],
  "asn": 4200000023,
  "password": "bgp-session-test-23",
  "as_set_v4": "MOON-AS@RIPE",
  "as_set_v6": "MOON-AS@RIPE",
  "max_prefix_v4": 5000,
  "max_prefix_v6": 5000,
  "insert_ixp_asn": true,
  "session_mode": "public",
  "bgp_session_type": "passive",
  "ip": "<ip_address_id>"
}

Service Cancellation

Network services as well as network service configs can be terminated. While those objects are often bound to service contracts, they may have certain cancellation policies. There is a dedicated endpoint for network services as well as network service configs which can be queried to answer the questions:

  1. When can the service technically be decommissioned
  2. When does my obligation to pay for it ends

For network service configs you can retrieve the cancellation policy using the network_service_config_cancellation_policy_read and for network services the network_service_cancellation_policy_read operation.

You may provide a request parameter for the earliest decommissioning date: GET /network-service-configs/<id>/cancellation-policy?decommission_at=YYYY-MM-DD. The response then contains a decommission_at property which can be passed in the request body to the deletion of network services and network service configs.

GET /network-services/<id>/cancellation-policy network_service_cancellation_policy_read
Status: 200 Content-Type: application/json Response
{
  "decommission_at": "2019-08-24",
  "charged_until": "2019-08-31"
}

To request the cancellation, use network_services_destroy for Network Services and for Network Service Configs use network_service_configs_destroy

If you omit the decommission_at request parameter, the earliest possible date will be assumed.

For all Network Service Configs associated with a Network Service which is about to be decommissioned, the deletion cascades.

Furthermore, the deletion of Network Service Configs cascades to Network Feature Configs and Member Joining Rules.

GET /network-services/<id>/cancellation-policy network_service_config_destroy
{
  "decommission_at": "2019-08-24"
}
Status: 200 Content-Type: application/json Response
{
  "id": "<id>",
  "type": "exchange_lan",
  "state": "decommission_requested",
  "status": [],
  "current_billing_start_date": "2010-01-01",
  "decommission_at": "2019-08-24",
  "charged_until": "2019-08-31",
  ...
}