Skip to main content

Quote Management (Ethernet)

This guide walks you through the steps to generate a synchronous quote for Wholesale Ethernet products using the REST POST method.

Before structuring the specific product payloads for your E-LAN, E-Line, or Ethernet Internet quotes, you must understand the common prerequisites, header requirements, and how to interpret the standardized pricing response.

  While the tutorials use a NAD Key (NadKeySite) for simplicity, the API supports various identifiers including Postcodes and UPRNs. Before building your integration, please review the Key concepts guide. This resource provides a full Site compatibility matrix, along with essential details on pricing, Sandbox testing, and request batching best practices to avoid rate limits.

 Generating a quote is optional. The generated Quote ID cannot be used for product ordering. The prices obtained through the Quote Management API are indicative, not firm prices.

 


Step 1: Complete prerequisites

Before generating any quote, ensure you have the following:

  1. A valid Access Token. See the Authentication docs.
     
  2. Your valid location data:

 


Step 2: Construct the request headers

Every POST request to the quoting endpoint requires standard mandatory HTTP headers:

Mandatory header parameter

Description

Example value

APIGW-Tracking-Header A unique reference you generate to track the transaction end-to-end. The recommended format is a UUID. 96bb97fa-b941-46bb-8c4e-86c616c28a13
Authorization The OAuth access token, prefixed with 'Bearer '. Bearer <token>
Content-Type The only supported format for the request body is JSON. application/json

 


Step 3: Construct the payload

Your payload must always start with the root attributes (like externalId and expectedFulfillmentStartDate), followed by a quoteItem array that acts as the top-level "envelope" for your quote

Inside the envelope, products are assembled using up to three core components:

Layer Component Description and placement
Item 1 Physical access The foundation of the site's service (e.g., EtherwayFibreService).
Item 2 Virtual path Sits as a sibling to the physical access (e.g., EtherflowConnectedService).
Note: In nested E-Line configurations, the virtual path sits as a sibling to the B-End physical access only; the root A-End physical access has no virtual path.
Optional item 3 Customer Premises Equipment (CPE) CPE (e.g., Routers/Firewalls) is nested inside the physical access product array. All CPE requires a bundle string to specify if services like Maintenance or Installation are included.

 

Connectivity logic

How you arrange the quoteItem envelopes depends on your product's connectivity model

Flat structure (E-LAN / Ethernet Internet)

  • Logic: Sites connect to a shared "cloud" or the public internet. Because all sites are effectively the same, there are no A-Ends or B-Ends, and no reference to an existing A-End.
  • Structure: These products use a single, flat quoteItem per site containing the physical access and virtual path as siblings.

 

Nested structure (E-Line Point-to-Point / Hub-and-Spoke)

  • Logic: Based on the notion of an A-End (hub) and a B-End (spoke) connected via a cloud. The A-End physical access acts as the root access product, and the B-Ends are quoted as children. The A-End can be new or pre-existing.
  • Structure: E-Line requires a nested structure. You use a root quoteItem for the A-End's physical access. Underneath that, there is a nested quoteItem array for each B-End, which contains the B-End's physical access and the virtual path connecting it back to the A-End.

(For detailed visual breakdowns of these structures, please refer to the specific product tutorials for E-Line, E-LAN, and Ethernet Internet).

While Gold NAD Keys (starting with 'A') are preferred for accuracy, the API  supports another site subtypes.  See the list of site subtypes in the Site compatibility matrix.

 


Step 4: Send the request

Once your product-specific JSON payload is built, send it in the body of a POST request to the unified endpoint: /tmf-api/quoteManagement/v4/quote.

 

Important quoting rules

  • Item limits: A single quote request can contain up to 100 quote items.
  • No product mixing: You must quote products individually; you cannot mix different parent products within the same quote request.

 


Step 5: Interpret the response

The API operates synchronously and will return a 201 Created status upon success.

Note on indicative pricing: All API-generated pricing and service availability information is indicative and non-binding; firm pricing is only provided at the order stage. Quoted prices may not include additional service-related fees, such as excess construction charges (ECCs).

When parsing the response, capture the following key elements:

1. The Quote ID

Locate the id field in the response; this unique UUID is your Quote ID. Quotes are retained and can be retrieved via a GET request for exactly 1 month from the date of creation.

 

View an example ID snippet

{
   "id": "15582451-1d1e-4049-89dd-797aca356e52",
    ...
}

 

2. Excess Construction Charges (ECCs)

Check the productInformation block for construction insights.

  • Exchange details: Identifies the serving BT exchange.
  • Indicative ECCs: If the tariff states "Unable to calculate ECC", the price is subject to a site survey for civil works (digging).

 

View technical warning snippet

"productInformation": {
   ...
  "indicativeECCs": {
     "circuitDeliveryCategory": "3",
    "tariff": "Unable to calculate ECC",
    "indicativeExtraECCs": "Unable to calculate ECC",
    "fibrePresent": "No",
    "tNodeCapacity": "No"
    },
  ...
}

 

3. Standard pricing array

The API automatically returns pricing for all available contract term options simultaneously in the productPrice array. Typically, you will see pricing for 1-year, 3-year, and 5-year terms.

  • priceType: nonRecurring: Represents the one-off connection fee.
  • priceType: recurring: Represents the ongoing annual rental fee.

 

View pricing response snippet (3-Year Example)

"productPrice": [
   ...
  {
    "name": "3 Year rental",
    "priceType": "recurring",
    "recurringChargePeriod": "year",
    "price": {
      "dutyFreeAmount": { "unit": "GBP", "value": 5431 }
      }
    }
  ...
]

 

4. Option B pricing

Certain products may return secondary pricing structures labelled as Option B. Option B allows customers to select a higher upfront connection charge in exchange for a correspondingly lower monthly rental fee across a specific term period.

 

View an example Option B response snippet

"productPrice": [
...
  {
    "name": "3 Year Option B connection",
    "priceType": "nonRecurring",
    "price": {
      "taxRate": 20,
      "dutyFreeAmount": {
        "unit": "GBP",
       "value": 0
      },
    "taxIncludedAmount": {
       "unit": "GBP",
      "value": 0
      }
    }
  },
   ...
]

 


Common API-specific errors & Troubleshooting

If the request is unsuccessful, the API will return a synchronous error response. For issues specific to this API, the service will return a 4xx status with a specific errorCode, which you can find in the table below.

Code

Reason

Description

How to fix

01 Internal application error The server encountered an internal application error and could not process the request. The server encountered an unexpected condition. Log the APIGW-Tracking-Header and contact support if this persists, as the issue is on the service provider's side.
02 Not Implemented Some functionality may be reserved for future use and although defined in the API specification is not yet implemented. You are attempting to use a feature or parameter defined in the specification that is not yet active in this version of the API.
05 Service unavailable Please try again later. The system is temporarily down for maintenance or overloaded. Wait a few minutes and try again.
08 Gateway Timeout System timed out talking to downstream system.  The API gateway timed out while waiting for the underlying pricing engine. Retry the request; if it persists, it may indicate a temporary backend performance issue.
21
Missing body Request is missing the body. Verify your HTTP method. GET requests should not have a body. If you are using POST to create a quote, ensure your JSON payload is correctly placed in the request body.
22 Invalid body {Message detailing why the body is invalid.} Review the error message in the response for specific field failures. Ensure your JSON structure adheres to the schema and that all mandatory fields for the product type are present and correctly formatted.
25 Missing header: <parameter>  The indicated parameter is missing from the request header. Check your request for the APIGW-Tracking-Header (UUID) and Authorization (Bearer token). These are mandatory for every call. 
26 Invalid header value: <parameter> The indicated parameter in the request header is not recognised.

Verify the format of your header values. Common culprits include:

  • Authorization: Ensure it starts with Bearer followed exactly by the token (no extra quotes).
  • APIGW-Tracking-Header: Must be a valid UUID string.
29 Bad request Request failed schema validation. Examine the provided array of validation errors in the response body. These errors pinpoint specific schema violations, such as incorrect data types, missing required attributes, or strings exceeding character limits.
32 Invalid quote configuration {Message detailing the configuration error.} Review the detailed message in the response body. This occurs when the data is structurally correct but logically invalid—such as a bandwidth mismatch between access and service, or an incompatible product combination for the selected site.
40
Missing credentials The Authorization parameter is missing. Ensure the Authorization header is present in your request.
41 Invalid credentials The Authorization parameter is not valid. Check that your Authorization header is correctly formatted (prefixed with Bearer ) and that the token belongs to the correct environment (Sandbox vs. Production).
42 Expired credentials Renew the access token using the OAuth API and try again. Your access token has timed out. Generate a new token using the OAuth API and update your request header.
50 Access denied The client application is not authorised to call this resource. Your application is not authorized for this specific resource. Verify that your API product subscription includes the Quote Management API.
51 Forbidden requester

The client application is not authorised to call this version of the pricing tool API.

Access to new versions of the pricing tool API first require functional testing in the test environment before production access is enabled.
You are attempting to access a version of the API that hasn't been certified for your account. Complete functional testing in the Sandbox/Test environment first to unlock Production access.
53
Too many requests
Temporary (1 hour) API block in place due to excessive request rate limiting.
Implement exponential backoff logic in your code and use the limit parameter to fetch data more efficiently.
60 Resource not found.

The requested URI or resource does not exist. 

The client application requested a resource that does not exist or is no longer available. The message will be specific to the resource being requested.
Verify the Quote ID in your request URL. This error occurs if the ID is mistyped or if the quote has been purged (quotes are only stored for 30 days). Check that your filter criteria are correct.
61 Method not allowed The URI does not support the requested method.  Verify your HTTP verb. Ensure you are using GET for retrieval or POST for creation. Check the "Allow" header in the response to see which methods are permitted for that specific endpoint.
68 Unsupported Media Type The format of the posted body is not supported by the endpoint. Ensure your Content-Type header is set to application/json. This error occurs if the server doesn't recognize the format of the data you are sending.
80 Too many requests The client application has made too many requests in a short time; please try again later. You have hit the immediate rate limit. Pause your requests and implement a retry-after strategy. Use filtering and pagination to reduce the total number of calls needed.

For details on common HTTP, OAuth, and OpenID Connect error codes and their solutions, see the Troubleshooting guide.

API Gateway (APIGW) Exceptions

If an error occurs at the API Gateway level (before the request even reaches the underlying quoting system), the API will return specific headers detailing the gateway exception. You should log these headers for troubleshooting:

  • APIGW-Exception: Carries the message of the exception.
  • APIGW-Exception-Code: Carries the specific code of the exception.
  • APIGW-Exception-System: Identifies the system from which the exception originated.

Note: These specific headers will only be sent for APIGW Errors. For details on common HTTP, OAuth, and OpenID Connect error codes and their broader solutions, please consult the core API integration documentation.

 


Next steps

You are ready to build your product-specific JSON payloads.

Choose the tutorial that matches your connectivity requirements:

  • Quoting for dedicated Ethernet (E-Line): Learn how to construct the nested payloads required to connect physical sites together via virtual circuits in point-to-point or hub-and-spoke configurations.
  • Quoting for Ethernet LAN (E-LAN): Discover how to generate a quote for any-to-any connectivity, allowing multiple sites to communicate within a private network mesh.
  • Quoting for Ethernet Internet: Follow the steps to build a quote for this bundled service, which delivers a layer 3 connection directly to the internet.
  • Managing and interpreting quotes: Learn how to retrieve quotes by Id, how list and search quotes, and how to interpret the response headers and quote states.
Back to top