PingOne Platform APIs

Update Bill of Materials

 

PUT {{apiPath}}/environments/{{envID}}/billOfMaterials

The PUT {{apiPath}}/environments/{{envID}}/billOfMaterials endpoint updates the Bill of Materials (BOM) for the specified environment. PingOne platform licensed features in BOM must be included in the environment’s license.

Prerequisites

Request Model

For property descriptions, refer to Bill of materials data model.

Property Type Required?

console.href

String

Optional

deployment.id

String

Optional

products[]

Array

Required

products[0].description

String

Required

products[0].id

String

Required

products[0].type

String

Required

products[0].bookmarks[]

Array

Optional

products[0].bookmarks[0].name

String

Optional

products[0].bookmarks[0].href

String

Optional

softwareLicense.id

String

Optional

solutionType

String

Optional

Headers

Authorization      Bearer {{accessToken}}

Content-Type      application/json

Body

raw ( application/json )

{
  "products": [
    {
      "type": "PING_DIRECTORY",
      "description": "PingOne Directory",
      "bookmarks": [
          {
            "name": "PingDirectory admin documentation",
            "href": "https://docs.pingidentity.com/bundle/pingdirectory-83/page/tyt1564011416169.html"
          },
          {
            "name": "PingDirectory API reference",
            "href": "https://apidocs.pingidentity.com/pingdirectory/directory/v1/api/guide/"
          }
      ]
    },
    {
      "type": "PING_ONE_MFA",
      "description": "PingOne MFA",
      "bookmarks": [
          {
            "name": "PingOne MFA admin documentation",
            "href": "https://docs.pingidentity.com/bundle/pingoneMFA/page/sur1595922082774.html"
          },
          {
            "name": "PingOne API reference",
            "href": "https://apidocs.pingidentity.com/pingone/platform/v1/api/"
          }
      ]
    },
    {
      "type": "PING_ONE_PROVISIONING",
      "description": "PingOne Provisioning"
    },
    {
      "type": "PING_ONE_RISK",
      "description": "PingOne Risk",
      "bookmarks": [
          {
            "name": "PingOne Risk admin documentation",
            "href": "https://docs.pingidentity.com/bundle/pingoneRisk/page/ytr1603474916048.html"
          },
          {
            "name": "PingOne API reference",
            "href": "https://apidocs.pingidentity.com/pingone/platform/v1/api/"
          }
      ]
    }
  ]
}

Example Request

  • cURL

  • C#

  • Go

  • HTTP

  • Java

  • jQuery

  • NodeJS

  • Python

  • PHP

  • Ruby

  • Swift

curl --location --globoff --request PUT '{{apiPath}}/environments/{{envID}}/billOfMaterials' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{accessToken}}' \
--data '{
  "products": [
    {
      "type": "PING_DIRECTORY",
      "description": "PingOne Directory",
      "bookmarks": [
          {
            "name": "PingDirectory admin documentation",
            "href": "https://docs.pingidentity.com/bundle/pingdirectory-83/page/tyt1564011416169.html"
          },
          {
            "name": "PingDirectory API reference",
            "href": "https://apidocs.pingidentity.com/pingdirectory/directory/v1/api/guide/"
          }
      ]
    },
    {
      "type": "PING_ONE_MFA",
      "description": "PingOne MFA",
      "bookmarks": [
          {
            "name": "PingOne MFA admin documentation",
            "href": "https://docs.pingidentity.com/bundle/pingoneMFA/page/sur1595922082774.html"
          },
          {
            "name": "PingOne API reference",
            "href": "https://apidocs.pingidentity.com/pingone/platform/v1/api/"
          }
      ]
    },
    {
      "type": "PING_ONE_PROVISIONING",
      "description": "PingOne Provisioning"
    },
    {
      "type": "PING_ONE_RISK",
      "description": "PingOne Risk",
      "bookmarks": [
          {
            "name": "PingOne Risk admin documentation",
            "href": "https://docs.pingidentity.com/bundle/pingoneRisk/page/ytr1603474916048.html"
          },
          {
            "name": "PingOne API reference",
            "href": "https://apidocs.pingidentity.com/pingone/platform/v1/api/"
          }
      ]
    }
  ]
}'
var options = new RestClientOptions("{{apiPath}}/environments/{{envID}}/billOfMaterials")
{
  MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("", Method.Put);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer {{accessToken}}");
var body = @"{" + "\n" +
@"  ""products"": [" + "\n" +
@"    {" + "\n" +
@"      ""type"": ""PING_DIRECTORY""," + "\n" +
@"      ""description"": ""PingOne Directory""," + "\n" +
@"      ""bookmarks"": [" + "\n" +
@"          {" + "\n" +
@"            ""name"": ""PingDirectory admin documentation""," + "\n" +
@"            ""href"": ""https://docs.pingidentity.com/bundle/pingdirectory-83/page/tyt1564011416169.html""" + "\n" +
@"          }," + "\n" +
@"          {" + "\n" +
@"            ""name"": ""PingDirectory API reference""," + "\n" +
@"            ""href"": ""https://apidocs.pingidentity.com/pingdirectory/directory/v1/api/guide/""" + "\n" +
@"          }" + "\n" +
@"      ]" + "\n" +
@"    }," + "\n" +
@"    {" + "\n" +
@"      ""type"": ""PING_ONE_MFA""," + "\n" +
@"      ""description"": ""PingOne MFA""," + "\n" +
@"      ""bookmarks"": [" + "\n" +
@"          {" + "\n" +
@"            ""name"": ""PingOne MFA admin documentation""," + "\n" +
@"            ""href"": ""https://docs.pingidentity.com/bundle/pingoneMFA/page/sur1595922082774.html""" + "\n" +
@"          }," + "\n" +
@"          {" + "\n" +
@"            ""name"": ""PingOne API reference""," + "\n" +
@"            ""href"": ""https://apidocs.pingidentity.com/pingone/platform/v1/api/""" + "\n" +
@"          }" + "\n" +
@"      ]" + "\n" +
@"    }," + "\n" +
@"    {" + "\n" +
@"      ""type"": ""PING_ONE_PROVISIONING""," + "\n" +
@"      ""description"": ""PingOne Provisioning""" + "\n" +
@"    }," + "\n" +
@"    {" + "\n" +
@"      ""type"": ""PING_ONE_RISK""," + "\n" +
@"      ""description"": ""PingOne Risk""," + "\n" +
@"      ""bookmarks"": [" + "\n" +
@"          {" + "\n" +
@"            ""name"": ""PingOne Risk admin documentation""," + "\n" +
@"            ""href"": ""https://docs.pingidentity.com/bundle/pingoneRisk/page/ytr1603474916048.html""" + "\n" +
@"          }," + "\n" +
@"          {" + "\n" +
@"            ""name"": ""PingOne API reference""," + "\n" +
@"            ""href"": ""https://apidocs.pingidentity.com/pingone/platform/v1/api/""" + "\n" +
@"          }" + "\n" +
@"      ]" + "\n" +
@"    }" + "\n" +
@"  ]" + "\n" +
@"}";
request.AddStringBody(body, DataFormat.Json);
RestResponse response = await client.ExecuteAsync(request);
Console.WriteLine(response.Content);
package main

import (
  "fmt"
  "strings"
  "net/http"
  "io"
)

func main() {

  url := "{{apiPath}}/environments/{{envID}}/billOfMaterials"
  method := "PUT"

  payload := strings.NewReader(`{
  "products": [
    {
      "type": "PING_DIRECTORY",
      "description": "PingOne Directory",
      "bookmarks": [
          {
            "name": "PingDirectory admin documentation",
            "href": "https://docs.pingidentity.com/bundle/pingdirectory-83/page/tyt1564011416169.html"
          },
          {
            "name": "PingDirectory API reference",
            "href": "https://apidocs.pingidentity.com/pingdirectory/directory/v1/api/guide/"
          }
      ]
    },
    {
      "type": "PING_ONE_MFA",
      "description": "PingOne MFA",
      "bookmarks": [
          {
            "name": "PingOne MFA admin documentation",
            "href": "https://docs.pingidentity.com/bundle/pingoneMFA/page/sur1595922082774.html"
          },
          {
            "name": "PingOne API reference",
            "href": "https://apidocs.pingidentity.com/pingone/platform/v1/api/"
          }
      ]
    },
    {
      "type": "PING_ONE_PROVISIONING",
      "description": "PingOne Provisioning"
    },
    {
      "type": "PING_ONE_RISK",
      "description": "PingOne Risk",
      "bookmarks": [
          {
            "name": "PingOne Risk admin documentation",
            "href": "https://docs.pingidentity.com/bundle/pingoneRisk/page/ytr1603474916048.html"
          },
          {
            "name": "PingOne API reference",
            "href": "https://apidocs.pingidentity.com/pingone/platform/v1/api/"
          }
      ]
    }
  ]
}`)

  client := &http.Client {
  }
  req, err := http.NewRequest(method, url, payload)

  if err != nil {
    fmt.Println(err)
    return
  }
  req.Header.Add("Content-Type", "application/json")
  req.Header.Add("Authorization", "Bearer {{accessToken}}")

  res, err := client.Do(req)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer res.Body.Close()

  body, err := io.ReadAll(res.Body)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(body))
}
PUT /environments/{{envID}}/billOfMaterials HTTP/1.1
Host: {{apiPath}}
Content-Type: application/json
Authorization: Bearer {{accessToken}}

{
  "products": [
    {
      "type": "PING_DIRECTORY",
      "description": "PingOne Directory",
      "bookmarks": [
          {
            "name": "PingDirectory admin documentation",
            "href": "https://docs.pingidentity.com/bundle/pingdirectory-83/page/tyt1564011416169.html"
          },
          {
            "name": "PingDirectory API reference",
            "href": "https://apidocs.pingidentity.com/pingdirectory/directory/v1/api/guide/"
          }
      ]
    },
    {
      "type": "PING_ONE_MFA",
      "description": "PingOne MFA",
      "bookmarks": [
          {
            "name": "PingOne MFA admin documentation",
            "href": "https://docs.pingidentity.com/bundle/pingoneMFA/page/sur1595922082774.html"
          },
          {
            "name": "PingOne API reference",
            "href": "https://apidocs.pingidentity.com/pingone/platform/v1/api/"
          }
      ]
    },
    {
      "type": "PING_ONE_PROVISIONING",
      "description": "PingOne Provisioning"
    },
    {
      "type": "PING_ONE_RISK",
      "description": "PingOne Risk",
      "bookmarks": [
          {
            "name": "PingOne Risk admin documentation",
            "href": "https://docs.pingidentity.com/bundle/pingoneRisk/page/ytr1603474916048.html"
          },
          {
            "name": "PingOne API reference",
            "href": "https://apidocs.pingidentity.com/pingone/platform/v1/api/"
          }
      ]
    }
  ]
}
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n  \"products\": [\n    {\n      \"type\": \"PING_DIRECTORY\",\n      \"description\": \"PingOne Directory\",\n      \"bookmarks\": [\n          {\n            \"name\": \"PingDirectory admin documentation\",\n            \"href\": \"https://docs.pingidentity.com/bundle/pingdirectory-83/page/tyt1564011416169.html\"\n          },\n          {\n            \"name\": \"PingDirectory API reference\",\n            \"href\": \"https://apidocs.pingidentity.com/pingdirectory/directory/v1/api/guide/\"\n          }\n      ]\n    },\n    {\n      \"type\": \"PING_ONE_MFA\",\n      \"description\": \"PingOne MFA\",\n      \"bookmarks\": [\n          {\n            \"name\": \"PingOne MFA admin documentation\",\n            \"href\": \"https://docs.pingidentity.com/bundle/pingoneMFA/page/sur1595922082774.html\"\n          },\n          {\n            \"name\": \"PingOne API reference\",\n            \"href\": \"https://apidocs.pingidentity.com/pingone/platform/v1/api/\"\n          }\n      ]\n    },\n    {\n      \"type\": \"PING_ONE_PROVISIONING\",\n      \"description\": \"PingOne Provisioning\"\n    },\n    {\n      \"type\": \"PING_ONE_RISK\",\n      \"description\": \"PingOne Risk\",\n      \"bookmarks\": [\n          {\n            \"name\": \"PingOne Risk admin documentation\",\n            \"href\": \"https://docs.pingidentity.com/bundle/pingoneRisk/page/ytr1603474916048.html\"\n          },\n          {\n            \"name\": \"PingOne API reference\",\n            \"href\": \"https://apidocs.pingidentity.com/pingone/platform/v1/api/\"\n          }\n      ]\n    }\n  ]\n}");
Request request = new Request.Builder()
  .url("{{apiPath}}/environments/{{envID}}/billOfMaterials")
  .method("PUT", body)
  .addHeader("Content-Type", "application/json")
  .addHeader("Authorization", "Bearer {{accessToken}}")
  .build();
Response response = client.newCall(request).execute();
var settings = {
  "url": "{{apiPath}}/environments/{{envID}}/billOfMaterials",
  "method": "PUT",
  "timeout": 0,
  "headers": {
    "Content-Type": "application/json",
    "Authorization": "Bearer {{accessToken}}"
  },
  "data": JSON.stringify({
    "products": [
      {
        "type": "PING_DIRECTORY",
        "description": "PingOne Directory",
        "bookmarks": [
          {
            "name": "PingDirectory admin documentation",
            "href": "https://docs.pingidentity.com/bundle/pingdirectory-83/page/tyt1564011416169.html"
          },
          {
            "name": "PingDirectory API reference",
            "href": "https://apidocs.pingidentity.com/pingdirectory/directory/v1/api/guide/"
          }
        ]
      },
      {
        "type": "PING_ONE_MFA",
        "description": "PingOne MFA",
        "bookmarks": [
          {
            "name": "PingOne MFA admin documentation",
            "href": "https://docs.pingidentity.com/bundle/pingoneMFA/page/sur1595922082774.html"
          },
          {
            "name": "PingOne API reference",
            "href": "https://apidocs.pingidentity.com/pingone/platform/v1/api/"
          }
        ]
      },
      {
        "type": "PING_ONE_PROVISIONING",
        "description": "PingOne Provisioning"
      },
      {
        "type": "PING_ONE_RISK",
        "description": "PingOne Risk",
        "bookmarks": [
          {
            "name": "PingOne Risk admin documentation",
            "href": "https://docs.pingidentity.com/bundle/pingoneRisk/page/ytr1603474916048.html"
          },
          {
            "name": "PingOne API reference",
            "href": "https://apidocs.pingidentity.com/pingone/platform/v1/api/"
          }
        ]
      }
    ]
  }),
};

$.ajax(settings).done(function (response) {
  console.log(response);
});
var request = require('request');
var options = {
  'method': 'PUT',
  'url': '{{apiPath}}/environments/{{envID}}/billOfMaterials',
  'headers': {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer {{accessToken}}'
  },
  body: JSON.stringify({
    "products": [
      {
        "type": "PING_DIRECTORY",
        "description": "PingOne Directory",
        "bookmarks": [
          {
            "name": "PingDirectory admin documentation",
            "href": "https://docs.pingidentity.com/bundle/pingdirectory-83/page/tyt1564011416169.html"
          },
          {
            "name": "PingDirectory API reference",
            "href": "https://apidocs.pingidentity.com/pingdirectory/directory/v1/api/guide/"
          }
        ]
      },
      {
        "type": "PING_ONE_MFA",
        "description": "PingOne MFA",
        "bookmarks": [
          {
            "name": "PingOne MFA admin documentation",
            "href": "https://docs.pingidentity.com/bundle/pingoneMFA/page/sur1595922082774.html"
          },
          {
            "name": "PingOne API reference",
            "href": "https://apidocs.pingidentity.com/pingone/platform/v1/api/"
          }
        ]
      },
      {
        "type": "PING_ONE_PROVISIONING",
        "description": "PingOne Provisioning"
      },
      {
        "type": "PING_ONE_RISK",
        "description": "PingOne Risk",
        "bookmarks": [
          {
            "name": "PingOne Risk admin documentation",
            "href": "https://docs.pingidentity.com/bundle/pingoneRisk/page/ytr1603474916048.html"
          },
          {
            "name": "PingOne API reference",
            "href": "https://apidocs.pingidentity.com/pingone/platform/v1/api/"
          }
        ]
      }
    ]
  })

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "{{apiPath}}/environments/{{envID}}/billOfMaterials"

payload = json.dumps({
  "products": [
    {
      "type": "PING_DIRECTORY",
      "description": "PingOne Directory",
      "bookmarks": [
        {
          "name": "PingDirectory admin documentation",
          "href": "https://docs.pingidentity.com/bundle/pingdirectory-83/page/tyt1564011416169.html"
        },
        {
          "name": "PingDirectory API reference",
          "href": "https://apidocs.pingidentity.com/pingdirectory/directory/v1/api/guide/"
        }
      ]
    },
    {
      "type": "PING_ONE_MFA",
      "description": "PingOne MFA",
      "bookmarks": [
        {
          "name": "PingOne MFA admin documentation",
          "href": "https://docs.pingidentity.com/bundle/pingoneMFA/page/sur1595922082774.html"
        },
        {
          "name": "PingOne API reference",
          "href": "https://apidocs.pingidentity.com/pingone/platform/v1/api/"
        }
      ]
    },
    {
      "type": "PING_ONE_PROVISIONING",
      "description": "PingOne Provisioning"
    },
    {
      "type": "PING_ONE_RISK",
      "description": "PingOne Risk",
      "bookmarks": [
        {
          "name": "PingOne Risk admin documentation",
          "href": "https://docs.pingidentity.com/bundle/pingoneRisk/page/ytr1603474916048.html"
        },
        {
          "name": "PingOne API reference",
          "href": "https://apidocs.pingidentity.com/pingone/platform/v1/api/"
        }
      ]
    }
  ]
})
headers = {
  'Content-Type': 'application/json',
  'Authorization': 'Bearer {{accessToken}}'
}

response = requests.request("PUT", url, headers=headers, data=payload)

print(response.text)
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('{{apiPath}}/environments/{{envID}}/billOfMaterials');
$request->setMethod(HTTP_Request2::METHOD_PUT);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/json',
  'Authorization' => 'Bearer {{accessToken}}'
));
$request->setBody('{\n  "products": [\n    {\n      "type": "PING_DIRECTORY",\n      "description": "PingOne Directory",\n      "bookmarks": [\n          {\n            "name": "PingDirectory admin documentation",\n            "href": "https://docs.pingidentity.com/bundle/pingdirectory-83/page/tyt1564011416169.html"\n          },\n          {\n            "name": "PingDirectory API reference",\n            "href": "https://apidocs.pingidentity.com/pingdirectory/directory/v1/api/guide/"\n          }\n      ]\n    },\n    {\n      "type": "PING_ONE_MFA",\n      "description": "PingOne MFA",\n      "bookmarks": [\n          {\n            "name": "PingOne MFA admin documentation",\n            "href": "https://docs.pingidentity.com/bundle/pingoneMFA/page/sur1595922082774.html"\n          },\n          {\n            "name": "PingOne API reference",\n            "href": "https://apidocs.pingidentity.com/pingone/platform/v1/api/"\n          }\n      ]\n    },\n    {\n      "type": "PING_ONE_PROVISIONING",\n      "description": "PingOne Provisioning"\n    },\n    {\n      "type": "PING_ONE_RISK",\n      "description": "PingOne Risk",\n      "bookmarks": [\n          {\n            "name": "PingOne Risk admin documentation",\n            "href": "https://docs.pingidentity.com/bundle/pingoneRisk/page/ytr1603474916048.html"\n          },\n          {\n            "name": "PingOne API reference",\n            "href": "https://apidocs.pingidentity.com/pingone/platform/v1/api/"\n          }\n      ]\n    }\n  ]\n}');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}
require "uri"
require "json"
require "net/http"

url = URI("{{apiPath}}/environments/{{envID}}/billOfMaterials")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Put.new(url)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer {{accessToken}}"
request.body = JSON.dump({
  "products": [
    {
      "type": "PING_DIRECTORY",
      "description": "PingOne Directory",
      "bookmarks": [
        {
          "name": "PingDirectory admin documentation",
          "href": "https://docs.pingidentity.com/bundle/pingdirectory-83/page/tyt1564011416169.html"
        },
        {
          "name": "PingDirectory API reference",
          "href": "https://apidocs.pingidentity.com/pingdirectory/directory/v1/api/guide/"
        }
      ]
    },
    {
      "type": "PING_ONE_MFA",
      "description": "PingOne MFA",
      "bookmarks": [
        {
          "name": "PingOne MFA admin documentation",
          "href": "https://docs.pingidentity.com/bundle/pingoneMFA/page/sur1595922082774.html"
        },
        {
          "name": "PingOne API reference",
          "href": "https://apidocs.pingidentity.com/pingone/platform/v1/api/"
        }
      ]
    },
    {
      "type": "PING_ONE_PROVISIONING",
      "description": "PingOne Provisioning"
    },
    {
      "type": "PING_ONE_RISK",
      "description": "PingOne Risk",
      "bookmarks": [
        {
          "name": "PingOne Risk admin documentation",
          "href": "https://docs.pingidentity.com/bundle/pingoneRisk/page/ytr1603474916048.html"
        },
        {
          "name": "PingOne API reference",
          "href": "https://apidocs.pingidentity.com/pingone/platform/v1/api/"
        }
      ]
    }
  ]
})

response = http.request(request)
puts response.read_body
let parameters = "{\n  \"products\": [\n    {\n      \"type\": \"PING_DIRECTORY\",\n      \"description\": \"PingOne Directory\",\n      \"bookmarks\": [\n          {\n            \"name\": \"PingDirectory admin documentation\",\n            \"href\": \"https://docs.pingidentity.com/bundle/pingdirectory-83/page/tyt1564011416169.html\"\n          },\n          {\n            \"name\": \"PingDirectory API reference\",\n            \"href\": \"https://apidocs.pingidentity.com/pingdirectory/directory/v1/api/guide/\"\n          }\n      ]\n    },\n    {\n      \"type\": \"PING_ONE_MFA\",\n      \"description\": \"PingOne MFA\",\n      \"bookmarks\": [\n          {\n            \"name\": \"PingOne MFA admin documentation\",\n            \"href\": \"https://docs.pingidentity.com/bundle/pingoneMFA/page/sur1595922082774.html\"\n          },\n          {\n            \"name\": \"PingOne API reference\",\n            \"href\": \"https://apidocs.pingidentity.com/pingone/platform/v1/api/\"\n          }\n      ]\n    },\n    {\n      \"type\": \"PING_ONE_PROVISIONING\",\n      \"description\": \"PingOne Provisioning\"\n    },\n    {\n      \"type\": \"PING_ONE_RISK\",\n      \"description\": \"PingOne Risk\",\n      \"bookmarks\": [\n          {\n            \"name\": \"PingOne Risk admin documentation\",\n            \"href\": \"https://docs.pingidentity.com/bundle/pingoneRisk/page/ytr1603474916048.html\"\n          },\n          {\n            \"name\": \"PingOne API reference\",\n            \"href\": \"https://apidocs.pingidentity.com/pingone/platform/v1/api/\"\n          }\n      ]\n    }\n  ]\n}"
let postData = parameters.data(using: .utf8)

var request = URLRequest(url: URL(string: "{{apiPath}}/environments/{{envID}}/billOfMaterials")!,timeoutInterval: Double.infinity)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("Bearer {{accessToken}}", forHTTPHeaderField: "Authorization")

request.httpMethod = "PUT"
request.httpBody = postData

let task = URLSession.shared.dataTask(with: request) { data, response, error in
  guard let data = data else {
    print(String(describing: error))
    return
  }
  print(String(data: data, encoding: .utf8)!)
}

task.resume()

Example Response

200 OK

{
    "_links": {
        "self": {
            "href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/billOfMaterials"
        },
        "environment": {
            "href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
        }
    },
    "products": [
        {
            "id": "fdcd9ccc-d05d-4229-a33c-5ae2a2f08039",
            "type": "PING_DIRECTORY",
            "description": "PingOne Directory",
            "bookmarks": [
                {
                    "name": "PingDirectory admin documentation",
                    "href": "https://docs.pingidentity.com/bundle/pingdirectory-83/page/tyt1564011416169.html"
                },
                {
                    "name": "PingDirectory API reference",
                    "href": "https://apidocs.pingidentity.com/pingdirectory/directory/v1/api/guide/"
                }
            ]
        },
        {
            "id": "39b8a197-50b2-4979-bf23-7cf0f00fd6d4",
            "type": "PING_ONE_MFA",
            "description": "PingOne MFA",
            "bookmarks": [
                {
                    "name": "PingOne MFA admin documentation",
                    "href": "https://docs.pingidentity.com/bundle/pingoneMFA/page/sur1595922082774.html"
                },
                {
                    "name": "PingOne API reference",
                    "href": "https://apidocs.pingidentity.com/pingone/platform/v1/api/"
                }
            ]
        },
        {
            "id": "a5c08bde-bfb9-48c4-bcb9-3eef991692eb",
            "type": "PING_ONE_PROVISIONING",
            "description": "PingOne Provisioning"
        },
        {
            "id": "db9033eb-7efa-4be5-8952-e0937908398a",
            "type": "PING_ONE_RISK",
            "description": "PingOne Risk",
            "bookmarks": [
                {
                    "name": "PingOne Risk admin documentation",
                    "href": "https://docs.pingidentity.com/bundle/pingoneRisk/page/ytr1603474916048.html"
                },
                {
                    "name": "PingOne API reference",
                    "href": "https://apidocs.pingidentity.com/pingone/platform/v1/api/"
                }
            ]
        }
    ],
    "createdAt": "2021-04-08T21:09:15.856Z",
    "updatedAt": "2021-08-25T21:14:42.944Z"
}