PingOne Platform APIs

Import Resource

Required permission:

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 sub claim is created separately and its value is set to ${user.id}.

Prerequisites

  • Refer to Resources for important overview information.

Request Model
Property Type Required?

accessTokenValiditySeconds

Integer

Required

applicationPermissionsSettings.claimEnabled

Boolean

Optional

audience

String

Required

clientId

Optional

String

clientSecret

Optional

String

description

String

Optional

name

String

Required

Refer to the Resources data model for full property descriptions.

Headers

Authorization      Bearer {{accessToken}}

Content-Type      application/json

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