PingOne Platform APIs

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, and type attributes are required.

  • The value of the name attribute must be unique within the organization.

The response returns an environment ID that you’ll use in the next steps.

Headers

Authorization      Bearer {{accessToken}}

Content-Type      application/json

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"
    }
}