Import Resource
POST {{apiPath}}/v1/environments/{{envID}}/resources
Use this POST {{apiPath}}/v1/environments/{{envID}}/resources operation to import an external resource to the specified environment resource. You can specify the client ID by including the clientId property in the request body. You can optionally import the client secret as well by including the clientSecret property in the request body.
If a value for the accessTokenValiditySeconds property isn’t specified, it defaults to 3600 seconds. If a value for the audience property isn’t specified, it defaults to the name of the resource.
|
For new or imported custom resources, the |
Prerequisites
-
Refer to Resources for important overview information.
Request Model
| Property | Type | Required? |
|---|---|---|
|
Integer |
Required |
|
Boolean |
Optional |
|
String |
Required |
|
Optional |
String |
|
Optional |
String |
|
String |
Optional |
|
String |
Required |
Refer to the Resources data model for full property descriptions.
Body
raw ( application/json )
{
"name": "Import CustomResource{{$timestamp}}",
"description": "This an import of a custom resource",
"clientId": "{{$timestamp}}_myClientId",
"clientSecret": "myClientSecret",
"audience": "https://api.customresource{{$timestamp}}.com",
"accessTokenValiditySeconds": 7200,
"applicationPermissionsSettings": {
"claimEnabled": true
}
}
Example Request
-
cURL
-
C#
-
Go
-
HTTP
-
Java
-
jQuery
-
NodeJS
-
Python
-
PHP
-
Ruby
-
Swift
curl --location --globoff '{{apiPath}}/v1/environments/{{envID}}/resources' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{accessToken}}' \
--data '{
"name": "Import CustomResource{{$timestamp}}",
"description": "This an import of a custom resource",
"clientId": "{{$timestamp}}_myClientId",
"clientSecret": "myClientSecret",
"audience": "https://api.customresource{{$timestamp}}.com",
"accessTokenValiditySeconds": 7200,
"applicationPermissionsSettings": {
"claimEnabled": true
}
}'
var options = new RestClientOptions("{{apiPath}}/v1/environments/{{envID}}/resources")
{
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"": ""Import CustomResource{{$timestamp}}""," + "\n" +
@" ""description"": ""This an import of a custom resource""," + "\n" +
@" ""clientId"": ""{{$timestamp}}_myClientId""," + "\n" +
@" ""clientSecret"": ""myClientSecret""," + "\n" +
@" ""audience"": ""https://api.customresource{{$timestamp}}.com""," + "\n" +
@" ""accessTokenValiditySeconds"": 7200," + "\n" +
@" ""applicationPermissionsSettings"": {" + "\n" +
@" ""claimEnabled"": true" + "\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}}/v1/environments/{{envID}}/resources"
method := "POST"
payload := strings.NewReader(`{
"name": "Import CustomResource{{$timestamp}}",
"description": "This an import of a custom resource",
"clientId": "{{$timestamp}}_myClientId",
"clientSecret": "myClientSecret",
"audience": "https://api.customresource{{$timestamp}}.com",
"accessTokenValiditySeconds": 7200,
"applicationPermissionsSettings": {
"claimEnabled": true
}
}`)
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 /v1/environments/{{envID}}/resources HTTP/1.1
Host: {{apiPath}}
Content-Type: application/json
Authorization: Bearer {{accessToken}}
{
"name": "Import CustomResource{{$timestamp}}",
"description": "This an import of a custom resource",
"clientId": "{{$timestamp}}_myClientId",
"clientSecret": "myClientSecret",
"audience": "https://api.customresource{{$timestamp}}.com",
"accessTokenValiditySeconds": 7200,
"applicationPermissionsSettings": {
"claimEnabled": true
}
}
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n \"name\": \"Import CustomResource{{$timestamp}}\",\n \"description\": \"This an import of a custom resource\",\n \"clientId\": \"{{$timestamp}}_myClientId\",\n \"clientSecret\": \"myClientSecret\",\n \"audience\": \"https://api.customresource{{$timestamp}}.com\",\n \"accessTokenValiditySeconds\": 7200,\n \"applicationPermissionsSettings\": {\n \"claimEnabled\": true\n }\n}");
Request request = new Request.Builder()
.url("{{apiPath}}/v1/environments/{{envID}}/resources")
.method("POST", body)
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", "Bearer {{accessToken}}")
.build();
Response response = client.newCall(request).execute();
var settings = {
"url": "{{apiPath}}/v1/environments/{{envID}}/resources",
"method": "POST",
"timeout": 0,
"headers": {
"Content-Type": "application/json",
"Authorization": "Bearer {{accessToken}}"
},
"data": JSON.stringify({
"name": "Import CustomResource{{$timestamp}}",
"description": "This an import of a custom resource",
"clientId": "{{$timestamp}}_myClientId",
"clientSecret": "myClientSecret",
"audience": "https://api.customresource{{$timestamp}}.com",
"accessTokenValiditySeconds": 7200,
"applicationPermissionsSettings": {
"claimEnabled": true
}
}),
};
$.ajax(settings).done(function (response) {
console.log(response);
});
var request = require('request');
var options = {
'method': 'POST',
'url': '{{apiPath}}/v1/environments/{{envID}}/resources',
'headers': {
'Content-Type': 'application/json',
'Authorization': 'Bearer {{accessToken}}'
},
body: JSON.stringify({
"name": "Import CustomResource{{$timestamp}}",
"description": "This an import of a custom resource",
"clientId": "{{$timestamp}}_myClientId",
"clientSecret": "myClientSecret",
"audience": "https://api.customresource{{$timestamp}}.com",
"accessTokenValiditySeconds": 7200,
"applicationPermissionsSettings": {
"claimEnabled": true
}
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{{apiPath}}/v1/environments/{{envID}}/resources"
payload = json.dumps({
"name": "Import CustomResource{{$timestamp}}",
"description": "This an import of a custom resource",
"clientId": "{{$timestamp}}_myClientId",
"clientSecret": "myClientSecret",
"audience": "https://api.customresource{{$timestamp}}.com",
"accessTokenValiditySeconds": 7200,
"applicationPermissionsSettings": {
"claimEnabled": True
}
})
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}}/v1/environments/{{envID}}/resources');
$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": "Import CustomResource{{$timestamp}}",\n "description": "This an import of a custom resource",\n "clientId": "{{$timestamp}}_myClientId",\n "clientSecret": "myClientSecret",\n "audience": "https://api.customresource{{$timestamp}}.com",\n "accessTokenValiditySeconds": 7200,\n "applicationPermissionsSettings": {\n "claimEnabled": true\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}}/v1/environments/{{envID}}/resources")
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": "Import CustomResource{{\$timestamp}}",
"description": "This an import of a custom resource",
"clientId": "{{\$timestamp}}_myClientId",
"clientSecret": "myClientSecret",
"audience": "https://api.customresource{{\$timestamp}}.com",
"accessTokenValiditySeconds": 7200,
"applicationPermissionsSettings": {
"claimEnabled": true
}
})
response = http.request(request)
puts response.read_body
let parameters = "{\n \"name\": \"Import CustomResource{{$timestamp}}\",\n \"description\": \"This an import of a custom resource\",\n \"clientId\": \"{{$timestamp}}_myClientId\",\n \"clientSecret\": \"myClientSecret\",\n \"audience\": \"https://api.customresource{{$timestamp}}.com\",\n \"accessTokenValiditySeconds\": 7200,\n \"applicationPermissionsSettings\": {\n \"claimEnabled\": true\n }\n}"
let postData = parameters.data(using: .utf8)
var request = URLRequest(url: URL(string: "{{apiPath}}/v1/environments/{{envID}}/resources")!,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/resources/eb7d88b9-2310-4e12-b05d-05a1cdfae668"
},
"environment": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
},
"scopes": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/resources/eb7d88b9-2310-4e12-b05d-05a1cdfae668/scopes"
},
"attributes": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/resources/eb7d88b9-2310-4e12-b05d-05a1cdfae668/attributes"
},
"secret": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/resources/eb7d88b9-2310-4e12-b05d-05a1cdfae668/secret"
},
"applicationResources": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/resources/eb7d88b9-2310-4e12-b05d-05a1cdfae668/applicationResources"
}
},
"id": "eb7d88b9-2310-4e12-b05d-05a1cdfae668",
"environment": {
"id": "abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
},
"name": "Import CustomResource1770229772",
"type": "CUSTOM",
"audience": "https://api.customresource1770229772.com",
"description": "This an import of a custom resource",
"createdAt": "2026-02-04T18:29:32.286Z",
"updatedAt": "2026-02-04T18:29:32.286Z",
"accessTokenValiditySeconds": 7200,
"introspectEndpointAuthMethod": "CLIENT_SECRET_BASIC",
"applicationPermissionsSettings": {
"claimEnabled": true
},
"clientId": "1770229772_myClientId"
}