PingOne Platform APIs

Update Attribute (Patch)

 

PATCH {{apiPath}}/environments/{{envID}}/schemas/{{schemaID}}/attributes/{{schemaAttrID}}

For schema attribute updates, both PUT and PATCH contracts are supported. The following sample shows the PATCH {{apiPath}}/environments/{{envID}}/schemas/{{schemaID}}/attributes/{{schemaAttrID}} operation to update existing attribute properties. For the PATCH operation, the update operation targets only those attribute property values specified in the request body. Attribute properties omitted from the request body are not updated or removed.

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.

Prerequisites

Request Model

Refer to the Schema attributes POST, PUT, PATCH data model for full property descriptions.

Property Type Required?

description

String

Optional

displayName

String

Optional

enabled

Boolean

Required

enumeratedValues[]

Array

Optional

enumeratedValues[].value

String

Required

enumeratedValues[].archived

Boolean

Optional

enumeratedValues[].description

String

Optional

ldapAttribute

String

Required

multiValued

Boolean

Optional

name

String

Required

regexValidation

Object

Optional

regexValidation.pattern

String

Required

regexValidation.requirements

String

Required

regexValidation.valuesPatternShouldMatch

Array

Optional

regexValidation.valuesPatternShouldNotMatch

Array

Optional

schema.id

String

Required

schemaType

String

Required

subAttributes

Array

Optional

subAttributes.description

String

Optional

subAttributes.displayName

String

Optional

subAttributes.enabled

Boolean

Required

subAttributes.name

String

Required

subAttributes.required

Boolean

Optional

subAttributes.schemaType

String

Required

subAttributes.type

String

Optional

subAttributes.unique

Boolean

Required

type

String

Optional

unique

Boolean

Required

Headers

Authorization      Bearer {{accessToken}}

Content-Type      application/json

Body

raw ( application/json )

{
    "name": "officeLocation",
    "type": "STRING",
    "unique": true,
    "enabled": false
}

Example Request

  • cURL

  • C#

  • Go

  • HTTP

  • Java

  • jQuery

  • NodeJS

  • Python

  • PHP

  • Ruby

  • Swift

curl --location --globoff --request PATCH '{{apiPath}}/environments/{{envID}}/schemas/{{schemaID}}/attributes/{{schemaAttrID}}' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{accessToken}}' \
--data '{
    "name": "officeLocation",
    "type": "STRING",
    "unique": true,
    "enabled": false
}'
var options = new RestClientOptions("{{apiPath}}/environments/{{envID}}/schemas/{{schemaID}}/attributes/{{schemaAttrID}}")
{
  MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("", Method.Patch);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer {{accessToken}}");
var body = @"{" + "\n" +
@"    ""name"": ""officeLocation""," + "\n" +
@"    ""type"": ""STRING""," + "\n" +
@"    ""unique"": true," + "\n" +
@"    ""enabled"": false" + "\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/{{schemaAttrID}}"
  method := "PATCH"

  payload := strings.NewReader(`{
    "name": "officeLocation",
    "type": "STRING",
    "unique": true,
    "enabled": false
}`)

  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))
}
PATCH /environments/{{envID}}/schemas/{{schemaID}}/attributes/{{schemaAttrID}} HTTP/1.1
Host: {{apiPath}}
Content-Type: application/json
Authorization: Bearer {{accessToken}}

{
    "name": "officeLocation",
    "type": "STRING",
    "unique": true,
    "enabled": false
}
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n    \"name\": \"officeLocation\",\n    \"type\": \"STRING\",\n    \"unique\": true,\n    \"enabled\": false\n}");
Request request = new Request.Builder()
  .url("{{apiPath}}/environments/{{envID}}/schemas/{{schemaID}}/attributes/{{schemaAttrID}}")
  .method("PATCH", 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/{{schemaAttrID}}",
  "method": "PATCH",
  "timeout": 0,
  "headers": {
    "Content-Type": "application/json",
    "Authorization": "Bearer {{accessToken}}"
  },
  "data": JSON.stringify({
    "name": "officeLocation",
    "type": "STRING",
    "unique": true,
    "enabled": false
  }),
};

$.ajax(settings).done(function (response) {
  console.log(response);
});
var request = require('request');
var options = {
  'method': 'PATCH',
  'url': '{{apiPath}}/environments/{{envID}}/schemas/{{schemaID}}/attributes/{{schemaAttrID}}',
  'headers': {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer {{accessToken}}'
  },
  body: JSON.stringify({
    "name": "officeLocation",
    "type": "STRING",
    "unique": true,
    "enabled": false
  })

};
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/{{schemaAttrID}}"

payload = json.dumps({
  "name": "officeLocation",
  "type": "STRING",
  "unique": True,
  "enabled": False
})
headers = {
  'Content-Type': 'application/json',
  'Authorization': 'Bearer {{accessToken}}'
}

response = requests.request("PATCH", 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/{{schemaAttrID}}');
$request->setMethod('PATCH');
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/json',
  'Authorization' => 'Bearer {{accessToken}}'
));
$request->setBody('{\n    "name": "officeLocation",\n    "type": "STRING",\n    "unique": true,\n    "enabled": false\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/{{schemaAttrID}}")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Patch.new(url)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer {{accessToken}}"
request.body = JSON.dump({
  "name": "officeLocation",
  "type": "STRING",
  "unique": true,
  "enabled": false
})

response = http.request(request)
puts response.read_body
let parameters = "{\n    \"name\": \"officeLocation\",\n    \"type\": \"STRING\",\n    \"unique\": true,\n    \"enabled\": false\n}"
let postData = parameters.data(using: .utf8)

var request = URLRequest(url: URL(string: "{{apiPath}}/environments/{{envID}}/schemas/{{schemaID}}/attributes/{{schemaAttrID}}")!,timeoutInterval: Double.infinity)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("Bearer {{accessToken}}", forHTTPHeaderField: "Authorization")

request.httpMethod = "PATCH"
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

200 OK

{
    "_links": {
        "self": {
            "href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/schemas/6497b7af-99d1-4217-8a82-057fcc3b7401/attributes/cc1ffe4e-9129-4fb0-8962-23c760c52aff"
        },
        "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/6497b7af-99d1-4217-8a82-057fcc3b7401"
        }
    },
    "id": "cc1ffe4e-9129-4fb0-8962-23c760c52aff",
    "environment": {
        "id": "abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
    },
    "name": "officeLocation",
    "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": true,
    "enabled": false,
    "multiValued": false,
    "required": false,
    "schema": {
        "id": "6497b7af-99d1-4217-8a82-057fcc3b7401"
    }
}