PingOne Platform APIs

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 regexValidation property with its value returned by the request. It also shows an enumeratedValue property (for demonstration purposes) that is commented out because the service does not support both of these properties in the same POST request.

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