openapi: 3.2.0
info:
version: 1.0.0
title: High-Level Design FTTx Start engineering job API
description: "The High-Level Design FTTx API supports Fiber to the Home (FTTH) engineering jobs. It allows you to calculate the required work and cost for Fiber rollout in a provided region.\n\nRun the endpoints in this order:\n\n1. **POST /startJobS3** to retrieve a signed URL for Amazon S3 bucket. Send this URL using the following endpoint.\n2. **PUT /s3url_uploads/{jsonFileNameAndExtension}** to upload the job.\n3. **GET /jobStatus/{jobId}** to retrieve the status of the job.\n4. **GET / jobResultS3/{jobId}** to retrieve a signed URL for the Amazon Simple Storage Service (Amazon S3) bucket. Send this URL using the following endpoint.\n5. **GET /Output/{jsonFileNameAndExtension}** to retrieve the results of the engineering job.\n\n ### Key highlights\n\n - **Security:** HTTPS, OAuth, Rate limit\n - **Versioning:** Supports version-less API, version tight. If no version\n is provided (in header) it defaults to latest version. \n\n [Source view](https://app.swaggerhub.com/apis/kpn/high-level_design_ftth)
\n [Documentation view](https://app.swaggerhub.com/apis-docs/kpn/high-level_design_ftth)\n \n ---\n \n [KPN Developer](https://developer.kpn.com/)
\n [Getting Started](https://developer.kpn.com/getting-started)\n \n"
servers:
- url: https://api-prd.kpn.com/network/kpn/ftth-engineering/
variables: {}
security:
- oauth2: []
tags:
- name: Start engineering job
paths:
/startJobS3:
post:
tags:
- Start engineering job
summary: Request a signed URL to start an FTTx engineering job.
description: Submits a new engineering job identifier. The response is a signed URL for the Amazon Simple Storage Service (Amazon S3) bucket. The input data for the engineering job needs to be uploaded to the received the signed URL location. See **/s3url_uploads** endpoint.
parameters:
- in: header
name: jsonFileName
required: true
schema:
$ref: '#/components/schemas/jsonFileNameSchema'
description: The **jobId** of the engineering job that you want to run. This will be used as identifier (and filename) for the Amazon Simple Storage Service (Amazon S3) bucket where you need to submit the input data for the engineering job.
responses:
200:
description: The result of the startJobS3 is a signed URL for the Amazon Simple Storage Service (Amazon S3) bucket. The input data for the engineering job needs to be uploaded to the received signed URL location.
content:
application/json:
schema:
$ref: '#/components/schemas/signedInputUrl'
400:
$ref: '#/components/responses/bad_request'
401:
$ref: '#/components/responses/unauthorized'
403:
$ref: '#/components/responses/forbidden'
404:
$ref: '#/components/responses/not_found'
429:
$ref: '#/components/responses/too_many'
500:
$ref: '#/components/responses/server_error'
502:
$ref: '#/components/responses/gateway_error'
503:
$ref: '#/components/responses/service_unavailable'
/s3url_uploads/{jsonFileNameAndExtension}:
put:
tags:
- Start engineering job
summary: Submit the input for the engineering job.
description: Uploads the data of the new engineering job for calculation. Use the signed URL received from **/startJobS3** for this. In the request body you need to specify an area for engineering. When the input has been submitted, this is detected and the calculation will start.
servers:
- url: https://ftth-engineering-prod.s3.amazonaws.com
description: This API call is done towards an Amazon Simple Storage Service (Amazon S3) bucket instead of the API store server.
parameters:
- in: path
name: jsonFileNameAndExtension
required: true
description: 'The **jobId** of the engineering job you defined in **/startJobS3** or **/jobResultS3** with added .json extension.
Pattern: `^.+\.(json)$`
Example: `FTTx_AdamNorth_Input_Dec2020.json`
'
schema:
$ref: '#/components/schemas/jsonFileNameAndExtensionSchema'
- in: query
name: X-Amz-Algorithm
required: true
description: 'Identifies the version of AWS Signature and the algorithm used to calculate the signature. Use the value provided as part of the signed URL response of **/startJobS3** or **/jobResultS3**. Example: `AWS4-HMAC-SHA256`'
schema:
$ref: '#/components/schemas/amzAlgorithm'
- in: query
name: X-Amz-Credential
required: true
description: 'This parameter provides scope (AWS region and service) for which the signature is valid. Use the value provided as part of the signed URL response of **/startJobS3** or **/jobResultS3**. Example: `AAAAAA%2F20201201%2Feu-west-1%2Fs3%2Faws4_request`'
schema:
$ref: '#/components/schemas/amzCredential'
- in: query
name: X-Amz-Date
required: true
description: "The date when the signedUrl was generated. Use the value provided as part of the signed URL response of **/startJobS3** or **/jobResultS3**. \n Example: `20201201T120000Z`\n"
schema:
$ref: '#/components/schemas/amzDate'
- in: query
name: X-Amz-Expires
required: true
description: "Provides the time period, in seconds, for which the generated presigned URL is valid. Use the value provided as part of the signed URL response of **/startJobS3** or **/jobResultS3**. \n Example: `3600`\n"
schema:
$ref: '#/components/schemas/amzExpires'
- in: query
name: X-Amz-SignedHeaders
required: true
description: "Lists the headers used to calculate the signature. Use the value provided as part of the signed URL response of **/startJobS3** or **/jobResultS**. \n Example: `host`\n"
schema:
$ref: '#/components/schemas/amzSignedHeaders'
- in: query
name: X-Amz-Security-Token
required: true
description: 'Additional credential parameter. Use the value provided as part of the signed URL response of **/startJobS3** or **/jobResultS3**.
Example: `AAAAAAAAAAluX2VjEA0aCWV1LXdlc3QtMSJIMEYCIQDKnFBi14jhVzfJHKod%2FCpwTIFkAj3kttgcdNRSngk49gIhAK6DboCvbtAmjlWDG5pBgzaFV1lXC0yFZWelULkpV%2FNVKuUBCNb%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEQABoMNjUyNDM0MTA2NTI4Igwfybzhyrjg3aq7hbMquQHE00Xe9PiL%2BS%2BSlhrzrpOKg2y%2F5qfjbR2BrGcPpxta3EiBwUpvmXR%2F%2BqkQBG7BuJifYKaDkdnOS%2B3OzxkV2WRHnKnlNwann1vCLTS9AWGdNRFLE72iJ2s%2BT3lwQp%2BR6bGMjcfqEDm84MR3gINTpSp84y9bt9hoxtxfXzF8SfGv5LVoN45K8Rf%2B%2BqF7%2BwF03JWV50Klauq4hneHRiyWsUgQY6pFMN14xj83Jn5fxKJi0L7qh%2BWBfMnDCTCW1%2Fv%2FBTrfAbwZuNzIkBmhmHsmDO9hS2dLEfqpH9GpPUl8YLY3vfjATqpjnz241WrrBdyTawUFbiTEbcKx05dUwbkUdLRP2i9CZVLAl%2Bqk0J6VYmIEhhU2RS54oHCZzinEVzsdo%2BS5eXRQ9BiAD8OCH2gP3a7bXDx9HOBxSdbGMv5mXMeP1wsdjC7e%2FkVsQlEtBTNgc62EiloUbQlPiQyb1OQEMMGZd%2BV5N%2FxdNq%2For1UraAbvxAAzGHUqQff4rmZCEDbO5uv2kwWDR1boarpQeEG8Q3j%2BxSNde%2FG%2BUjg425uIAAAAAAAAAA`
'
schema:
$ref: '#/components/schemas/amzSecurityToken'
- in: query
name: X-Amz-Signature
required: true
description: "The signature to authenticate your request. Use the value provided as part of the signed URL response of **/startJobS3** or **/jobResultS3**.\n \nExample: `aaaaaaaaaa09c013193ffd301019b60308a092c972b22fdfcb8424bbbbbbbbbb`\n"
schema:
$ref: '#/components/schemas/amzSignature'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/Job'
responses:
200:
description: Successful input data submission.
components:
schemas:
amzSecurityToken:
type: string
example: AAAAAAAAAAluX2VjEA0aCWV1LXdlc3QtMSJIMEYCIQDKnFBi14jhVzfJHKod%2FCpwTIFkAj3kttgcdNRSngk49gIhAK6DboCvbtAmjlWDG5pBgzaFV1lXC0yFZWelULkpV%2FNVKuUBCNb%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEQABoMNjUyNDM0MTA2NTI4Igwfybzhyrjg3aq7hbMquQHE00Xe9PiL%2BS%2BSlhrzrpOKg2y%2F5qfjbR2BrGcPpxta3EiBwUpvmXR%2F%2BqkQBG7BuJifYKaDkdnOS%2B3OzxkV2WRHnKnlNwann1vCLTS9AWGdNRFLE72iJ2s%2BT3lwQp%2BR6bGMjcfqEDm84MR3gINTpSp84y9bt9hoxtxfXzF8SfGv5LVoN45K8Rf%2B%2BqF7%2BwF03JWV50Klauq4hneHRiyWsUgQY6pFMN14xj83Jn5fxKJi0L7qh%2BWBfMnDCTCW1%2Fv%2FBTrfAbwZuNzIkBmhmHsmDO9hS2dLEfqpH9GpPUl8YLY3vfjATqpjnz241WrrBdyTawUFbiTEbcKx05dUwbkUdLRP2i9CZVLAl%2Bqk0J6VYmIEhhU2RS54oHCZzinEVzsdo%2BS5eXRQ9BiAD8OCH2gP3a7bXDx9HOBxSdbGMv5mXMeP1wsdjC7e%2FkVsQlEtBTNgc62EiloUbQlPiQyb1OQEMMGZd%2BV5N%2FxdNq%2For1UraAbvxAAzGHUqQff4rmZCEDbO5uv2kwWDR1boarpQeEG8Q3j%2BxSNde%2FG%2BUjg425uIAAAAAAAAAA
description: Additional credential parameter. Use the value provided as part of the signed URL response of /startJobS3 or /jobResultS3.
error:
type: object
properties:
transactionId:
type: string
description: transaction id of the the request
title: Transaction ID
status:
type: string
description: Status
title: Status
name:
type: string
description: Error name
title: Error name
message:
type: string
description: Error message
title: Error message
info:
type: string
description: Additional information about error
title: Info
amzSignedHeaders:
type: string
example: host
description: Lists the headers used to calculate the signature. Use the value provided as part of the signed URL response of /startJobS3 or /jobResultS3.
Job:
type: object
description: The input data to be used for the engineering job, most importantly the addresses of the region for which to perform the engineering job. amongst.
properties:
jobId:
type: string
format: uuid
description: The unique UUID for this job.
cable7x14Costs:
type: number
format: double
description: 7x14 is a duct which contains 7 subducts in which a 96fold fibercable could be blown. A 7x14 duct is deployed between the Point Of Presence (PoP) - the central office - the splitter cabinet (OAP).
cable2x14Costs:
type: number
format: double
description: 2x14 is a duct which contains 2 subducts in which a 96fold fibercable could be blown. A 2x14 duct is deployed between the splitter cabinet (OAP) and a Distribution Point.
cableDacCosts:
type: number
format: double
description: DAC stands for Direct Access Cable, this is the cable deployed from the households to a Distribution Point. This is a Direct Buried cable.
hasCosts:
type: number
format: double
description: Tuinboring or Huisaansluiting (HAS) is the lead-in from the public pavement to the household. By using an airdriven drilling, there is no need to dig in the garden.
dpCosts:
type: number
format: double
description: DP, the distribution Point. In the distribution point a number of households are aggregated (normally around 45 households). In the DP the fibers of the DAC are welted to the 96fold cable.
cable96vCosts:
type: number
format: double
description: Blowing of 96fold fiber cable. From the PoP a 96fold cable is blown to the splitters cabinet (OAP) through the 7x14 duct, and from the OAP, a 96fold fiber cable is blown to 2 DP's in cascade (2x 48 fibers).
bisCosts:
type: number
format: double
description: Cost of digging the trench
miniPopCosts:
type: number
format: double
description: Cost of a small Point of Presence
cityPopCosts:
type: number
format: double
description: Cost of a Point of Presence 6,6m2
floorTiles:
type: number
format: double
description: Percentage of the ground that contains floor klinkers.
klinkers:
type: number
format: double
description: Percentage of the ground that contains floor tiles.
pavement:
type: number
format: double
description: Percentage of the ground that contains floor pavement.
green:
type: number
format: double
description: Percentage of the ground that contains floor green - grass.
asphalt:
type: number
format: double
description: Percentage of the ground that contains floor asphalt.
treeDrilling:
type: number
format: double
description: Percentage of the total amount of drilling that has trees blocking.
sand:
type: number
format: double
description: Percentage of sand in the ground of the selected area of households.
peat:
type: number
format: double
description: Percentage of peat in the ground of the selected area of households.
clay:
type: number
format: double
description: Percentage of clay in the ground of the selected area of households.
loss:
type: number
format: double
description: Percentage of loss in the ground of the selected area of households.
projectSpecificCosts:
description: Costs that can be added to project specific cases.
type: number
format: double
feesAndDegeneration:
type: number
format: double
description: Fees and Degeneration per household that should be payed to the municipality.
backhaulCost:
type: number
format: double
description: Standard costs per household to connect it towards the backhaul and the core network.
contractor:
type: string
description: Choose a contractor to determine cost levels.
depthPosition:
type: string
description: Choose a depthPosition to determine cost, can be 30 cm, 40/45 cm, 50 cm, 60 cm.
areaPopCosts:
type: number
format: double
description: Cost of a Point of Presence 15m2.
maxDpConnections:
type: number
format: double
description: The maximal number of households that could be connected in the distribution point.
networkType:
$ref: '#/components/schemas/NetworkType'
popLocation:
$ref: '#/components/schemas/Coordinate'
addresses:
type: array
items:
$ref: '#/components/schemas/address'
description: The addresses to include in the engineering process.
signedInputUrl:
type: object
properties:
signedUrl:
type: string
format: uri
example: https://ftth-engineering-prod.s3.amazonaws.com/s3url_uploads/FTTx_AdamNorth_Input_Dec2020.json?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AAAAAA%2F20201201%2Feu-west-1%2Fs3%2Faws4_request&X-Amz-Date=20201201T120000Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Security-Token=AAAAAAAAAAluX2VjEA0aCWV1LXdlc3QtMSJIMEYCIQDKnFBi14jhVzfJHKod%2FCpwTIFkAj3kttgcdNRSngk49gIhAK6DboCvbtAmjlWDG5pBgzaFV1lXC0yFZWelULkpV%2FNVKuUBCNb%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEQABoMNjUyNDM0MTA2NTI4Igwfybzhyrjg3aq7hbMquQHE00Xe9PiL%2BS%2BSlhrzrpOKg2y%2F5qfjbR2BrGcPpxta3EiBwUpvmXR%2F%2BqkQBG7BuJifYKaDkdnOS%2B3OzxkV2WRHnKnlNwann1vCLTS9AWGdNRFLE72iJ2s%2BT3lwQp%2BR6bGMjcfqEDm84MR3gINTpSp84y9bt9hoxtxfXzF8SfGv5LVoN45K8Rf%2B%2BqF7%2BwF03JWV50Klauq4hneHRiyWsUgQY6pFMN14xj83Jn5fxKJi0L7qh%2BWBfMnDCTCW1%2Fv%2FBTrfAbwZuNzIkBmhmHsmDO9hS2dLEfqpH9GpPUl8YLY3vfjATqpjnz241WrrBdyTawUFbiTEbcKx05dUwbkUdLRP2i9CZVLAl%2Bqk0J6VYmIEhhU2RS54oHCZzinEVzsdo%2BS5eXRQ9BiAD8OCH2gP3a7bXDx9HOBxSdbGMv5mXMeP1wsdjC7e%2FkVsQlEtBTNgc62EiloUbQlPiQyb1OQEMMGZd%2BV5N%2FxdNq%2For1UraAbvxAAzGHUqQff4rmZCEDbO5uv2kwWDR1boarpQeEG8Q3j%2BxSNde%2FG%2BUjg425uIAAAAAAAAAA&X-Amz-Signature=aaaaaaaaaa09c013193ffd301019b60308a092c972b22fdfcb8424bbbbbbbbbb
address:
type: object
properties:
zipcode:
type: string
description: The postal code.
street:
type: string
description: The name of the street.
housenumber:
type: integer
description: The number of the property.
extension:
type: string
description: 'The extension of the house number, for example: `a-c`.
'
x:
type: number
format: double
description: x coordinates.
y:
type: number
format: double
description: x coordinates.
city:
type: string
description: The name of the city or town.
bagGeometryIdentificatie:
type: string
description: 'Can be a Pand (non-residential/non-office building) or an addressable object (Pand or Ligplaats) with an Addresses and Buildings key register (BAG) id. It represents a contour.
'
usagegoals:
type: array
items:
type: string
example: bijvoorbeeld "woonfunctie" of "logiesfunctie"
amzSignature:
type: string
example: aaaaaaaaaa09c013193ffd301019b60308a092c972b22fdfcb8424bbbbbbbbbb
description: The signature to authenticate your request. Use the value provided as part of the signed URL response of /startJobS3 or /jobResultS3.
amzCredential:
type: string
example: AAAAAA%2F20201201%2Feu-west-1%2Fs3%2Faws4_request
description: This parameter provides scope (AWS region and service) for which the signature is valid. Use the value provided as part of the signed URL response of /startJobS3 or /jobResultS3.
jsonFileNameSchema:
type: string
example: FTTx_AdamNorth_Input_Dec2020
amzDate:
type: string
example: 20201201T120000Z
description: The date when the signedUrl was generated. Use the value provided as part of the signed URL response of /startJobS3 or /jobResultS3.
NetworkType:
type: string
description: P2P or PON to indicate what the FTTH model should do.
enum:
- P2P
- PON
amzExpires:
type: string
example: '3600'
description: Provides the time period, in seconds, for which the generated presigned URL is valid. Use the value provided as part of the signed URL response of /startJobS3 or /jobResultS3.
jsonFileNameAndExtensionSchema:
type: string
pattern: ^.+\.(json)$
example: FTTx_AdamNorth_Input_Dec2020.json
description: "The `jobId` of the engineering job you defined in /startJobS3 or /jobResultS3 with added .json extension. \n"
amzAlgorithm:
type: string
example: AWS4-HMAC-SHA256
description: Identifies the version of AWS Signature and the algorithm used to calculate the signature. Use the value provided as part of the signed URL response of `/startJobS3` or `/jobResultS3`.
Coordinate:
type: object
description: Location of a point on a two-dimensional plane.
properties:
x:
type: number
format: double
description: x coordinates. National triangle coordinates (RD coordinates) in meters.
y:
type: number
format: double
description: y coordinates. National triangle coordinates (RD coordinates) in meters.
responses:
bad_request:
description: Bad request
content:
application/json:
schema:
$ref: '#/components/schemas/error'
unauthorized:
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/error'
gateway_error:
description: gateway_error
content:
application/json:
schema:
$ref: '#/components/schemas/error'
not_found:
description: not found
content:
application/json:
schema:
$ref: '#/components/schemas/error'
too_many:
description: too many requests
content:
application/json:
schema:
$ref: '#/components/schemas/error'
service_unavailable:
description: service unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/error'
forbidden:
description: forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/error'
server_error:
description: server error
content:
application/json:
schema:
$ref: '#/components/schemas/error'
securitySchemes:
oauth2:
type: oauth2
flows:
clientCredentials:
tokenUrl: https://api-prd.kpn.com/oauth/client_credential/accesstoken?grant_type=client_credentials
scopes: {}
externalDocs:
description: HTTP response headers
url: https://developer.kpn.com/documentation-response-headers