Step 1a: Create Source Environment
POST {{apiPath}}/environments
Create the source environment using a POST {{apiPath}}/environments request. It’s important to note that this is your source PingOne environment, that will act as the OIDC IdP. Users here will be able to complete authentication flows in the destination environment.
-
In the request body, the
name,region, andtypeattributes are required. -
The value of the
nameattribute must be unique within the organization.
The response returns an environment ID that you’ll use in the next steps.
Body
raw ( application/json )
{
"name": "Source_Environment_{{$timestamp}}",
"description": "New source environment",
"type": "SANDBOX",
"region": "NA",
"billOfMaterials": {
"products": [
{
"type": "PING_ONE_BASE",
"description": "New source environment product description",
"console": {
"href": "https://example.com"
}
}
]
},
"license": {
"id": "{{licenseID}}"
}
}
Example Request
-
cURL
-
C#
-
Go
-
HTTP
-
Java
-
jQuery
-
NodeJS
-
Python
-
PHP
-
Ruby
-
Swift
curl --location --globoff '{{apiPath}}/environments' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{accessToken}}' \
--data '{
"name": "Source_Environment_{{$timestamp}}",
"description": "New source environment",
"type": "SANDBOX",
"region": "NA",
"billOfMaterials": {
"products": [
{
"type": "PING_ONE_BASE",
"description": "New source environment product description",
"console": {
"href": "https://example.com"
}
}
]
},
"license": {
"id": "{{licenseID}}"
}
}'
var options = new RestClientOptions("{{apiPath}}/environments")
{
MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("", Method.Post);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer {{accessToken}}");
var body = @"{" + "\n" +
@" ""name"": ""Source_Environment_{{$timestamp}}""," + "\n" +
@" ""description"": ""New source environment""," + "\n" +
@" ""type"": ""SANDBOX""," + "\n" +
@" ""region"": ""NA""," + "\n" +
@" ""billOfMaterials"": {" + "\n" +
@" ""products"": [" + "\n" +
@" {" + "\n" +
@" ""type"": ""PING_ONE_BASE""," + "\n" +
@" ""description"": ""New source environment product description""," + "\n" +
@" ""console"": {" + "\n" +
@" ""href"": ""https://example.com""" + "\n" +
@" }" + "\n" +
@" }" + "\n" +
@" ]" + "\n" +
@" }," + "\n" +
@" ""license"": {" + "\n" +
@" ""id"": ""{{licenseID}}""" + "\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"
method := "POST"
payload := strings.NewReader(`{
"name": "Source_Environment_{{$timestamp}}",
"description": "New source environment",
"type": "SANDBOX",
"region": "NA",
"billOfMaterials": {
"products": [
{
"type": "PING_ONE_BASE",
"description": "New source environment product description",
"console": {
"href": "https://example.com"
}
}
]
},
"license": {
"id": "{{licenseID}}"
}
}`)
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))
}
POST /environments HTTP/1.1
Host: {{apiPath}}
Content-Type: application/json
Authorization: Bearer {{accessToken}}
{
"name": "Source_Environment_{{$timestamp}}",
"description": "New source environment",
"type": "SANDBOX",
"region": "NA",
"billOfMaterials": {
"products": [
{
"type": "PING_ONE_BASE",
"description": "New source environment product description",
"console": {
"href": "https://example.com"
}
}
]
},
"license": {
"id": "{{licenseID}}"
}
}
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n \"name\": \"Source_Environment_{{$timestamp}}\",\n \"description\": \"New source environment\",\n \"type\": \"SANDBOX\",\n \"region\": \"NA\",\n \"billOfMaterials\": {\n \"products\": [\n {\n \"type\": \"PING_ONE_BASE\",\n \"description\": \"New source environment product description\",\n \"console\": {\n \"href\": \"https://example.com\"\n }\n }\n ]\n },\n \"license\": {\n \"id\": \"{{licenseID}}\"\n }\n}");
Request request = new Request.Builder()
.url("{{apiPath}}/environments")
.method("POST", body)
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", "Bearer {{accessToken}}")
.build();
Response response = client.newCall(request).execute();
var settings = {
"url": "{{apiPath}}/environments",
"method": "POST",
"timeout": 0,
"headers": {
"Content-Type": "application/json",
"Authorization": "Bearer {{accessToken}}"
},
"data": JSON.stringify({
"name": "Source_Environment_{{$timestamp}}",
"description": "New source environment",
"type": "SANDBOX",
"region": "NA",
"billOfMaterials": {
"products": [
{
"type": "PING_ONE_BASE",
"description": "New source environment product description",
"console": {
"href": "https://example.com"
}
}
]
},
"license": {
"id": "{{licenseID}}"
}
}),
};
$.ajax(settings).done(function (response) {
console.log(response);
});
var request = require('request');
var options = {
'method': 'POST',
'url': '{{apiPath}}/environments',
'headers': {
'Content-Type': 'application/json',
'Authorization': 'Bearer {{accessToken}}'
},
body: JSON.stringify({
"name": "Source_Environment_{{$timestamp}}",
"description": "New source environment",
"type": "SANDBOX",
"region": "NA",
"billOfMaterials": {
"products": [
{
"type": "PING_ONE_BASE",
"description": "New source environment product description",
"console": {
"href": "https://example.com"
}
}
]
},
"license": {
"id": "{{licenseID}}"
}
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{{apiPath}}/environments"
payload = json.dumps({
"name": "Source_Environment_{{$timestamp}}",
"description": "New source environment",
"type": "SANDBOX",
"region": "NA",
"billOfMaterials": {
"products": [
{
"type": "PING_ONE_BASE",
"description": "New source environment product description",
"console": {
"href": "https://example.com"
}
}
]
},
"license": {
"id": "{{licenseID}}"
}
})
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer {{accessToken}}'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('{{apiPath}}/environments');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
'follow_redirects' => TRUE
));
$request->setHeader(array(
'Content-Type' => 'application/json',
'Authorization' => 'Bearer {{accessToken}}'
));
$request->setBody('{\n "name": "Source_Environment_{{$timestamp}}",\n "description": "New source environment",\n "type": "SANDBOX",\n "region": "NA",\n "billOfMaterials": {\n "products": [\n {\n "type": "PING_ONE_BASE",\n "description": "New source environment product description",\n "console": {\n "href": "https://example.com"\n }\n }\n ]\n },\n "license": {\n "id": "{{licenseID}}"\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")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer {{accessToken}}"
request.body = JSON.dump({
"name": "Source_Environment_{{\$timestamp}}",
"description": "New source environment",
"type": "SANDBOX",
"region": "NA",
"billOfMaterials": {
"products": [
{
"type": "PING_ONE_BASE",
"description": "New source environment product description",
"console": {
"href": "https://example.com"
}
}
]
},
"license": {
"id": "{{licenseID}}"
}
})
response = http.request(request)
puts response.read_body
let parameters = "{\n \"name\": \"Source_Environment_{{$timestamp}}\",\n \"description\": \"New source environment\",\n \"type\": \"SANDBOX\",\n \"region\": \"NA\",\n \"billOfMaterials\": {\n \"products\": [\n {\n \"type\": \"PING_ONE_BASE\",\n \"description\": \"New source environment product description\",\n \"console\": {\n \"href\": \"https://example.com\"\n }\n }\n ]\n },\n \"license\": {\n \"id\": \"{{licenseID}}\"\n }\n}"
let postData = parameters.data(using: .utf8)
var request = URLRequest(url: URL(string: "{{apiPath}}/environments")!,timeoutInterval: Double.infinity)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("Bearer {{accessToken}}", forHTTPHeaderField: "Authorization")
request.httpMethod = "POST"
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
201 Created
{
"_links": {
"self": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
},
"organization": {
"href": "https://api.pingone.com/v1/organizations/bed432e6-676a-4ebe-b5a5-6b3b54e46bda"
},
"license": {
"href": "https://api.pingone.com/v1/organizations/bed432e6-676a-4ebe-b5a5-6b3b54e46bda/licenses/a474e215-7a17-40a3-b968-410f38661ee5"
},
"populations": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/populations"
},
"users": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/users"
},
"applications": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/applications"
},
"activities": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/activities"
},
"branding": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/branding"
},
"resources": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/resources"
},
"passwordPolicies": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/passwordPolicies"
},
"userActivities": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/userActivities"
},
"signOnPolicies": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/signOnPolicies"
},
"keys": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/keys"
},
"templates": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/templates"
},
"notificationsSettings": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/notificationsSettings"
},
"schemas": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/schemas"
},
"gateways": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/gateways"
},
"capabilities": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/capabilities"
},
"activeIdentityCounts": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/activeIdentityCounts"
},
"propagation/plans": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/propagation/plans"
},
"propagation/stores": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/propagation/stores"
},
"propagation/revisions/id:latest": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/propagation/revisions/id:latest"
},
"billOfMaterials": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/billOfMaterials"
}
},
"id": "abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6",
"name": "Source_Environment_1714770485",
"description": "New source environment",
"organization": {
"id": "bed432e6-676a-4ebe-b5a5-6b3b54e46bda"
},
"type": "SANDBOX",
"region": "NA",
"createdAt": "2024-05-03T21:08:05.480Z",
"updatedAt": "2024-05-03T21:08:05.480Z",
"license": {
"id": "a474e215-7a17-40a3-b968-410f38661ee5"
},
"billOfMaterials": {
"products": [
{
"id": "fb5ca5aa-ee4f-42f9-af36-b4b0194a11e0",
"type": "PING_ONE_BASE",
"description": "New source environment product description",
"console": {
"href": "https://example.com"
}
}
],
"createdAt": "2024-05-03T21:08:05.492Z",
"updatedAt": "2024-05-03T21:08:05.492Z"
}
}