Create Attribute
POST {{apiPath}}/environments/{{envID}}/schemas/{{schemaID}}/attributes
The following sample shows the POST {{apiPath}}/environments/{{envID}}/schemas/{{schemaID}}/attributes operation to add a new custom attribute to a specified schema resource. In the request body, the name property is required. All other properties are optional.
An attribute can support multiple values if the multiValued property is set to true. If the multiValued property is set to false or is null, the User object will contain the attribute value as a single value. If multiValued is set to true, the value in the User object will be an array. When searches are performed on User schema data, a user will match if any value of a multiValued attribute is part of the search criteria.
|
The sample request shows an |
Prerequisites
-
Refer to Schemas for important overview information.
-
Read all available schemas and select a
schemaIDfor the endpoint.
Request Model
Refer to the Schema attributes POST, PUT, PATCH data model for full property descriptions.
| Property | Type | Required? |
|---|---|---|
|
String |
Optional |
|
String |
Optional |
|
Boolean |
Required |
|
Array |
Optional |
|
String |
Required |
|
Boolean |
Optional |
|
String |
Optional |
|
String |
Required |
|
Boolean |
Optional |
|
String |
Required |
|
Object |
Optional |
|
String |
Required |
|
String |
Required |
|
Array |
Optional |
|
Array |
Optional |
|
String |
Required |
|
String |
Required |
|
Array |
Optional |
|
String |
Optional |
|
String |
Optional |
|
Boolean |
Required |
|
String |
Required |
|
Boolean |
Optional |
|
String |
Required |
|
String |
Optional |
|
Boolean |
Required |
|
String |
Optional |
|
Boolean |
Required |
Body
raw ( application/json )
{
"name": "officeStuff{{$timestamp}}",
"displayName": "An optional property that specifies the display name of the attribute.",
"description": "An optional property that specifies the description of the new attribute.",
"schemaType": "CUSTOM",
"type": "STRING",
"unique": false,
"enabled": false,
"multiValued": false,
"regexValidation": {
"pattern": "xs|XS|s|S|m|M|l|L|xl|XL|xxl|XXL",
"requirements": "Must be a T-shirt size from XS to XXL",
"valuesPatternShouldMatch": [
"xs",
"XXL"
],
"valuesPatternShouldNotMatch": [
"xL",
"x"
]
},
"#enumeratedValues": [
{
"value": "CUPS",
"archived": true,
"description": "Cups, Class: Clergy, Faculty: Emotions and love"
},
{
"value": "PENTACLES",
"archived": true,
"description": "Pentacles, Class: Merchants, Faculty: Material body or possessions"
},
{
"value": "SWORDS",
"archived": true,
"description": "Swords, Class: Nobility and military, Faculty: Reason"
},
{
"value": "WANDS",
"archived": true,
"description": "Wands, Class: Artisans, Faculty: Creativity and will"
}
]
}
Example Request
-
cURL
-
C#
-
Go
-
HTTP
-
Java
-
jQuery
-
NodeJS
-
Python
-
PHP
-
Ruby
-
Swift
curl --location --globoff '{{apiPath}}/environments/{{envID}}/schemas/{{schemaID}}/attributes' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{accessToken}}' \
--data '{
"name": "officeStuff{{$timestamp}}",
"displayName": "An optional property that specifies the display name of the attribute.",
"description": "An optional property that specifies the description of the new attribute.",
"schemaType": "CUSTOM",
"type": "STRING",
"unique": false,
"enabled": false,
"multiValued": false,
"regexValidation": {
"pattern": "xs|XS|s|S|m|M|l|L|xl|XL|xxl|XXL",
"requirements": "Must be a T-shirt size from XS to XXL",
"valuesPatternShouldMatch": [
"xs",
"XXL"
],
"valuesPatternShouldNotMatch": [
"xL",
"x"
]
},
"#enumeratedValues": [
{
"value": "CUPS",
"archived": true,
"description": "Cups, Class: Clergy, Faculty: Emotions and love"
},
{
"value": "PENTACLES",
"archived": true,
"description": "Pentacles, Class: Merchants, Faculty: Material body or possessions"
},
{
"value": "SWORDS",
"archived": true,
"description": "Swords, Class: Nobility and military, Faculty: Reason"
},
{
"value": "WANDS",
"archived": true,
"description": "Wands, Class: Artisans, Faculty: Creativity and will"
}
]
}'
var options = new RestClientOptions("{{apiPath}}/environments/{{envID}}/schemas/{{schemaID}}/attributes")
{
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"": ""officeStuff{{$timestamp}}""," + "\n" +
@" ""displayName"": ""An optional property that specifies the display name of the attribute.""," + "\n" +
@" ""description"": ""An optional property that specifies the description of the new attribute.""," + "\n" +
@" ""schemaType"": ""CUSTOM""," + "\n" +
@" ""type"": ""STRING""," + "\n" +
@" ""unique"": false," + "\n" +
@" ""enabled"": false," + "\n" +
@" ""multiValued"": false," + "\n" +
@" ""regexValidation"": {" + "\n" +
@" ""pattern"": ""xs|XS|s|S|m|M|l|L|xl|XL|xxl|XXL""," + "\n" +
@" ""requirements"": ""Must be a T-shirt size from XS to XXL""," + "\n" +
@" ""valuesPatternShouldMatch"": [" + "\n" +
@" ""xs""," + "\n" +
@" ""XXL""" + "\n" +
@" ]," + "\n" +
@" ""valuesPatternShouldNotMatch"": [" + "\n" +
@" ""xL""," + "\n" +
@" ""x""" + "\n" +
@" ]" + "\n" +
@" }," + "\n" +
@" ""#enumeratedValues"": [" + "\n" +
@" {" + "\n" +
@" ""value"": ""CUPS""," + "\n" +
@" ""archived"": true," + "\n" +
@" ""description"": ""Cups, Class: Clergy, Faculty: Emotions and love""" + "\n" +
@" }," + "\n" +
@" {" + "\n" +
@" ""value"": ""PENTACLES""," + "\n" +
@" ""archived"": true," + "\n" +
@" ""description"": ""Pentacles, Class: Merchants, Faculty: Material body or possessions""" + "\n" +
@" }," + "\n" +
@" {" + "\n" +
@" ""value"": ""SWORDS""," + "\n" +
@" ""archived"": true," + "\n" +
@" ""description"": ""Swords, Class: Nobility and military, Faculty: Reason""" + "\n" +
@" }," + "\n" +
@" {" + "\n" +
@" ""value"": ""WANDS""," + "\n" +
@" ""archived"": true," + "\n" +
@" ""description"": ""Wands, Class: Artisans, Faculty: Creativity and will""" + "\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}}/schemas/{{schemaID}}/attributes"
method := "POST"
payload := strings.NewReader(`{
"name": "officeStuff{{$timestamp}}",
"displayName": "An optional property that specifies the display name of the attribute.",
"description": "An optional property that specifies the description of the new attribute.",
"schemaType": "CUSTOM",
"type": "STRING",
"unique": false,
"enabled": false,
"multiValued": false,
"regexValidation": {
"pattern": "xs|XS|s|S|m|M|l|L|xl|XL|xxl|XXL",
"requirements": "Must be a T-shirt size from XS to XXL",
"valuesPatternShouldMatch": [
"xs",
"XXL"
],
"valuesPatternShouldNotMatch": [
"xL",
"x"
]
},
"#enumeratedValues": [
{
"value": "CUPS",
"archived": true,
"description": "Cups, Class: Clergy, Faculty: Emotions and love"
},
{
"value": "PENTACLES",
"archived": true,
"description": "Pentacles, Class: Merchants, Faculty: Material body or possessions"
},
{
"value": "SWORDS",
"archived": true,
"description": "Swords, Class: Nobility and military, Faculty: Reason"
},
{
"value": "WANDS",
"archived": true,
"description": "Wands, Class: Artisans, Faculty: Creativity and will"
}
]
}`)
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/{{envID}}/schemas/{{schemaID}}/attributes HTTP/1.1
Host: {{apiPath}}
Content-Type: application/json
Authorization: Bearer {{accessToken}}
{
"name": "officeStuff{{$timestamp}}",
"displayName": "An optional property that specifies the display name of the attribute.",
"description": "An optional property that specifies the description of the new attribute.",
"schemaType": "CUSTOM",
"type": "STRING",
"unique": false,
"enabled": false,
"multiValued": false,
"regexValidation": {
"pattern": "xs|XS|s|S|m|M|l|L|xl|XL|xxl|XXL",
"requirements": "Must be a T-shirt size from XS to XXL",
"valuesPatternShouldMatch": [
"xs",
"XXL"
],
"valuesPatternShouldNotMatch": [
"xL",
"x"
]
},
"#enumeratedValues": [
{
"value": "CUPS",
"archived": true,
"description": "Cups, Class: Clergy, Faculty: Emotions and love"
},
{
"value": "PENTACLES",
"archived": true,
"description": "Pentacles, Class: Merchants, Faculty: Material body or possessions"
},
{
"value": "SWORDS",
"archived": true,
"description": "Swords, Class: Nobility and military, Faculty: Reason"
},
{
"value": "WANDS",
"archived": true,
"description": "Wands, Class: Artisans, Faculty: Creativity and will"
}
]
}
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n \"name\": \"officeStuff{{$timestamp}}\",\n \"displayName\": \"An optional property that specifies the display name of the attribute.\",\n \"description\": \"An optional property that specifies the description of the new attribute.\",\n \"schemaType\": \"CUSTOM\",\n \"type\": \"STRING\",\n \"unique\": false,\n \"enabled\": false,\n \"multiValued\": false,\n \"regexValidation\": {\n \"pattern\": \"xs|XS|s|S|m|M|l|L|xl|XL|xxl|XXL\",\n \"requirements\": \"Must be a T-shirt size from XS to XXL\",\n \"valuesPatternShouldMatch\": [\n \"xs\",\n \"XXL\"\n ],\n \"valuesPatternShouldNotMatch\": [\n \"xL\",\n \"x\"\n ]\n },\n \"#enumeratedValues\": [\n {\n \"value\": \"CUPS\",\n \"archived\": true,\n \"description\": \"Cups, Class: Clergy, Faculty: Emotions and love\"\n },\n {\n \"value\": \"PENTACLES\",\n \"archived\": true,\n \"description\": \"Pentacles, Class: Merchants, Faculty: Material body or possessions\"\n },\n {\n \"value\": \"SWORDS\",\n \"archived\": true,\n \"description\": \"Swords, Class: Nobility and military, Faculty: Reason\"\n },\n {\n \"value\": \"WANDS\",\n \"archived\": true,\n \"description\": \"Wands, Class: Artisans, Faculty: Creativity and will\"\n }\n ]\n}");
Request request = new Request.Builder()
.url("{{apiPath}}/environments/{{envID}}/schemas/{{schemaID}}/attributes")
.method("POST", body)
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", "Bearer {{accessToken}}")
.build();
Response response = client.newCall(request).execute();
var settings = {
"url": "{{apiPath}}/environments/{{envID}}/schemas/{{schemaID}}/attributes",
"method": "POST",
"timeout": 0,
"headers": {
"Content-Type": "application/json",
"Authorization": "Bearer {{accessToken}}"
},
"data": JSON.stringify({
"name": "officeStuff{{$timestamp}}",
"displayName": "An optional property that specifies the display name of the attribute.",
"description": "An optional property that specifies the description of the new attribute.",
"schemaType": "CUSTOM",
"type": "STRING",
"unique": false,
"enabled": false,
"multiValued": false,
"regexValidation": {
"pattern": "xs|XS|s|S|m|M|l|L|xl|XL|xxl|XXL",
"requirements": "Must be a T-shirt size from XS to XXL",
"valuesPatternShouldMatch": [
"xs",
"XXL"
],
"valuesPatternShouldNotMatch": [
"xL",
"x"
]
},
"#enumeratedValues": [
{
"value": "CUPS",
"archived": true,
"description": "Cups, Class: Clergy, Faculty: Emotions and love"
},
{
"value": "PENTACLES",
"archived": true,
"description": "Pentacles, Class: Merchants, Faculty: Material body or possessions"
},
{
"value": "SWORDS",
"archived": true,
"description": "Swords, Class: Nobility and military, Faculty: Reason"
},
{
"value": "WANDS",
"archived": true,
"description": "Wands, Class: Artisans, Faculty: Creativity and will"
}
]
}),
};
$.ajax(settings).done(function (response) {
console.log(response);
});
var request = require('request');
var options = {
'method': 'POST',
'url': '{{apiPath}}/environments/{{envID}}/schemas/{{schemaID}}/attributes',
'headers': {
'Content-Type': 'application/json',
'Authorization': 'Bearer {{accessToken}}'
},
body: JSON.stringify({
"name": "officeStuff{{$timestamp}}",
"displayName": "An optional property that specifies the display name of the attribute.",
"description": "An optional property that specifies the description of the new attribute.",
"schemaType": "CUSTOM",
"type": "STRING",
"unique": false,
"enabled": false,
"multiValued": false,
"regexValidation": {
"pattern": "xs|XS|s|S|m|M|l|L|xl|XL|xxl|XXL",
"requirements": "Must be a T-shirt size from XS to XXL",
"valuesPatternShouldMatch": [
"xs",
"XXL"
],
"valuesPatternShouldNotMatch": [
"xL",
"x"
]
},
"#enumeratedValues": [
{
"value": "CUPS",
"archived": true,
"description": "Cups, Class: Clergy, Faculty: Emotions and love"
},
{
"value": "PENTACLES",
"archived": true,
"description": "Pentacles, Class: Merchants, Faculty: Material body or possessions"
},
{
"value": "SWORDS",
"archived": true,
"description": "Swords, Class: Nobility and military, Faculty: Reason"
},
{
"value": "WANDS",
"archived": true,
"description": "Wands, Class: Artisans, Faculty: Creativity and will"
}
]
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{{apiPath}}/environments/{{envID}}/schemas/{{schemaID}}/attributes"
payload = json.dumps({
"name": "officeStuff{{$timestamp}}",
"displayName": "An optional property that specifies the display name of the attribute.",
"description": "An optional property that specifies the description of the new attribute.",
"schemaType": "CUSTOM",
"type": "STRING",
"unique": False,
"enabled": False,
"multiValued": False,
"regexValidation": {
"pattern": "xs|XS|s|S|m|M|l|L|xl|XL|xxl|XXL",
"requirements": "Must be a T-shirt size from XS to XXL",
"valuesPatternShouldMatch": [
"xs",
"XXL"
],
"valuesPatternShouldNotMatch": [
"xL",
"x"
]
},
"#enumeratedValues": [
{
"value": "CUPS",
"archived": True,
"description": "Cups, Class: Clergy, Faculty: Emotions and love"
},
{
"value": "PENTACLES",
"archived": True,
"description": "Pentacles, Class: Merchants, Faculty: Material body or possessions"
},
{
"value": "SWORDS",
"archived": True,
"description": "Swords, Class: Nobility and military, Faculty: Reason"
},
{
"value": "WANDS",
"archived": True,
"description": "Wands, Class: Artisans, Faculty: Creativity and will"
}
]
})
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/{{envID}}/schemas/{{schemaID}}/attributes');
$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": "officeStuff{{$timestamp}}",\n "displayName": "An optional property that specifies the display name of the attribute.",\n "description": "An optional property that specifies the description of the new attribute.",\n "schemaType": "CUSTOM",\n "type": "STRING",\n "unique": false,\n "enabled": false,\n "multiValued": false,\n "regexValidation": {\n "pattern": "xs|XS|s|S|m|M|l|L|xl|XL|xxl|XXL",\n "requirements": "Must be a T-shirt size from XS to XXL",\n "valuesPatternShouldMatch": [\n "xs",\n "XXL"\n ],\n "valuesPatternShouldNotMatch": [\n "xL",\n "x"\n ]\n },\n "#enumeratedValues": [\n {\n "value": "CUPS",\n "archived": true,\n "description": "Cups, Class: Clergy, Faculty: Emotions and love"\n },\n {\n "value": "PENTACLES",\n "archived": true,\n "description": "Pentacles, Class: Merchants, Faculty: Material body or possessions"\n },\n {\n "value": "SWORDS",\n "archived": true,\n "description": "Swords, Class: Nobility and military, Faculty: Reason"\n },\n {\n "value": "WANDS",\n "archived": true,\n "description": "Wands, Class: Artisans, Faculty: Creativity and will"\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}}/schemas/{{schemaID}}/attributes")
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": "officeStuff{{\$timestamp}}",
"displayName": "An optional property that specifies the display name of the attribute.",
"description": "An optional property that specifies the description of the new attribute.",
"schemaType": "CUSTOM",
"type": "STRING",
"unique": false,
"enabled": false,
"multiValued": false,
"regexValidation": {
"pattern": "xs|XS|s|S|m|M|l|L|xl|XL|xxl|XXL",
"requirements": "Must be a T-shirt size from XS to XXL",
"valuesPatternShouldMatch": [
"xs",
"XXL"
],
"valuesPatternShouldNotMatch": [
"xL",
"x"
]
},
"\#enumeratedValues": [
{
"value": "CUPS",
"archived": true,
"description": "Cups, Class: Clergy, Faculty: Emotions and love"
},
{
"value": "PENTACLES",
"archived": true,
"description": "Pentacles, Class: Merchants, Faculty: Material body or possessions"
},
{
"value": "SWORDS",
"archived": true,
"description": "Swords, Class: Nobility and military, Faculty: Reason"
},
{
"value": "WANDS",
"archived": true,
"description": "Wands, Class: Artisans, Faculty: Creativity and will"
}
]
})
response = http.request(request)
puts response.read_body
let parameters = "{\n \"name\": \"officeStuff{{$timestamp}}\",\n \"displayName\": \"An optional property that specifies the display name of the attribute.\",\n \"description\": \"An optional property that specifies the description of the new attribute.\",\n \"schemaType\": \"CUSTOM\",\n \"type\": \"STRING\",\n \"unique\": false,\n \"enabled\": false,\n \"multiValued\": false,\n \"regexValidation\": {\n \"pattern\": \"xs|XS|s|S|m|M|l|L|xl|XL|xxl|XXL\",\n \"requirements\": \"Must be a T-shirt size from XS to XXL\",\n \"valuesPatternShouldMatch\": [\n \"xs\",\n \"XXL\"\n ],\n \"valuesPatternShouldNotMatch\": [\n \"xL\",\n \"x\"\n ]\n },\n \"#enumeratedValues\": [\n {\n \"value\": \"CUPS\",\n \"archived\": true,\n \"description\": \"Cups, Class: Clergy, Faculty: Emotions and love\"\n },\n {\n \"value\": \"PENTACLES\",\n \"archived\": true,\n \"description\": \"Pentacles, Class: Merchants, Faculty: Material body or possessions\"\n },\n {\n \"value\": \"SWORDS\",\n \"archived\": true,\n \"description\": \"Swords, Class: Nobility and military, Faculty: Reason\"\n },\n {\n \"value\": \"WANDS\",\n \"archived\": true,\n \"description\": \"Wands, Class: Artisans, Faculty: Creativity and will\"\n }\n ]\n}"
let postData = parameters.data(using: .utf8)
var request = URLRequest(url: URL(string: "{{apiPath}}/environments/{{envID}}/schemas/{{schemaID}}/attributes")!,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/schemas/dbaccb62-4fbb-4922-af88-70e2ea4ed5bf/attributes/8c36d189-2b42-443f-be44-e7cf888ae95c"
},
"environment": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
},
"schema": {
"href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/schemas/dbaccb62-4fbb-4922-af88-70e2ea4ed5bf"
}
},
"id": "8c36d189-2b42-443f-be44-e7cf888ae95c",
"environment": {
"id": "abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
},
"name": "officeStuff1675293786",
"displayName": "An optional property that specifies the display name of the attribute.",
"description": "An optional property that specifies the description of the new attribute.",
"schemaType": "CUSTOM",
"type": "STRING",
"unique": false,
"enabled": false,
"multiValued": false,
"required": false,
"regexValidation": {
"pattern": "xs|XS|s|S|m|M|l|L|xl|XL|xxl|XXL",
"requirements": "Must be a T-shirt size from XS to XXL",
"valuesPatternShouldMatch": [
"xs",
"XXL"
],
"valuesPatternShouldNotMatch": [
"xL",
"x"
]
},
"schema": {
"id": "dbaccb62-4fbb-4922-af88-70e2ea4ed5bf"
}
}