---
title: Create property group
slug: cms-saas/api/create-property-group
docTags: 
createdAt: 2026-08-28T15:28:05.479Z
---

{
  "id": "DdUR88PhQHd75DOZETYtf",
  "type": "api-oas-v2",
  "data": {
    "method": "POST",
    "url": "https://api.cms.optimizely.com/v1/propertygroups",
    "servers": [
      {
        "url": "https://api.cms.optimizely.com/v1/propertygroups",
        "description": "Optimizely CMS API"
      }
    ],
    "name": "Create property group",
    "description": "Create a new property group.",
    "contentType": "application/json",
    "request": {
      "pathParameters": [],
      "headerParameters": [
        {
          "name": "accept",
          "type": "string",
          "kind": "optional",
          "description": "Generated from available response content types",
          "enum": [
            "application/json"
          ],
          "default": "application/json"
        },
        {
          "kind": "optional",
          "name": "Prefer",
          "type": "array",
          "example": "[\"return=representation\"]",
          "description": "<p>Indicates client preference for the response content as per IETF RFC7240. Currently only supports 'return=representation' which can be used to indicate a preference to receive a representation of the resource that has been altered in the response.</p>",
          "schema": [],
          "itemType": "string",
          "customType": "string[]"
        }
      ],
      "queryParameters": [],
      "bodyDataParameters": [
        {
          "kind": "required",
          "name": "body",
          "type": "object",
          "description": "The property group that should be created.",
          "customType": "PropertyGroup",
          "schema": [
            {
              "name": "key",
              "kind": "required",
              "type": "string",
              "description": "<p>The unique identifier (key) of the resource.</p>",
              "minLength": 2,
              "maxLength": 255,
              "pattern": "^[A-Za-z][_0-9A-Za-z]+$"
            },
            {
              "name": "displayName",
              "kind": "required",
              "type": "string",
              "description": "The display name of this property group.",
              "minLength": 1,
              "maxLength": 255
            },
            {
              "name": "sortOrder",
              "kind": "optional",
              "type": "integer<int32>",
              "description": "A value that is used when sorting property group instances.",
              "format": "int32"
            }
          ],
          "modelRef": "#/components/schemas/PropertyGroup",
          "isExpanded": true
        }
      ],
      "formDataParameters": [],
      "oAuthParameters": [
        {
          "id": "apiAuth",
          "name": "apiAuth",
          "kind": "optional",
          "type": "oauth2",
          "description": "Use this scheme to generate an access token that can be used to access the API.",
          "oauth2Flows": {
            "clientCredentials": {
              "tokenUrl": "https://api.cms.optimizely.com/oauth/token",
              "scopes": {
                "api:admin": "Grants full administrative access to the API"
              }
            }
          },
          "requiredScopes": [
            "api:admin"
          ]
        }
      ],
      "cookieParameters": []
    },
    "responses": [
      {
        "statusCode": "201",
        "description": "Created",
        "jsonExample": "",
        "isExpanded": true,
        "headers": [
          {
            "kind": "optional",
            "name": "ETag",
            "type": "string",
            "description": "<p>The RFC7232 ETag header field in a response provides the current entity-tag for the resource. An entity-tag is an opaque identifier for different versions of a resource over time, regardless whether multiple versions are valid at the same time.</p>"
          },
          {
            "kind": "optional",
            "name": "Last-Modified",
            "type": "string<http-date>",
            "description": "The date and time at which the resource was last modified.",
            "format": "http-date"
          },
          {
            "kind": "optional",
            "name": "Location",
            "type": "string",
            "description": "<p>Indicates the URL of the newly-created resource.</p>"
          },
          {
            "kind": "optional",
            "name": "Preference-Applied",
            "description": ""
          }
        ],
        "schema": [
          {
            "kind": "optional",
            "type": "object",
            "description": "A property group of a content type.",
            "customType": "PropertyGroup",
            "schema": [
              {
                "name": "key",
                "kind": "required",
                "type": "string",
                "description": "<p>The unique identifier (key) of the resource.</p>",
                "minLength": 2,
                "maxLength": 255,
                "pattern": "^[A-Za-z][_0-9A-Za-z]+$"
              },
              {
                "name": "displayName",
                "kind": "required",
                "type": "string",
                "description": "The display name of this property group.",
                "minLength": 1,
                "maxLength": 255
              },
              {
                "name": "source",
                "kind": "optional",
                "type": "string",
                "readOnly": true,
                "description": "A string that indicates the source of this property group. Can be used to distinguish property groups created by the system from types coming from model classes deployed to the CMS server."
              },
              {
                "name": "sortOrder",
                "kind": "optional",
                "type": "integer<int32>",
                "description": "A value that is used when sorting property group instances.",
                "format": "int32"
              },
              {
                "name": "created",
                "kind": "optional",
                "type": "string<date-time>",
                "readOnly": true,
                "description": "A timestamp indicating when this property group was first created.",
                "format": "date-time"
              },
              {
                "name": "createdBy",
                "kind": "optional",
                "type": "string",
                "readOnly": true,
                "description": "The username of the user that created this property group."
              },
              {
                "name": "lastModified",
                "kind": "optional",
                "type": "string<date-time>",
                "readOnly": true,
                "description": "",
                "format": "date-time"
              },
              {
                "name": "lastModifiedBy",
                "kind": "optional",
                "type": "string",
                "readOnly": true,
                "description": "The username of the user that last modified this property group."
              }
            ],
            "modelRef": "#/components/schemas/PropertyGroup",
            "isExpanded": true
          }
        ]
      },
      {
        "statusCode": "400",
        "description": "Bad Request",
        "jsonExample": "",
        "isExpanded": true
      },
      {
        "statusCode": "401",
        "description": "Unauthorized",
        "jsonExample": "",
        "isExpanded": true
      },
      {
        "statusCode": "403",
        "description": "Forbidden",
        "jsonExample": "",
        "isExpanded": true
      },
      {
        "statusCode": "409",
        "description": "Conflict",
        "jsonExample": "",
        "isExpanded": true
      },
      {
        "statusCode": "429",
        "description": "Too Many Requests",
        "jsonExample": "",
        "isExpanded": true,
        "headers": [
          {
            "kind": "optional",
            "name": "Retry-After",
            "type": "number",
            "description": "Indicates how long the client should wait before making a new request."
          }
        ],
        "schema": [
          {
            "kind": "optional",
            "type": "object",
            "description": "",
            "customType": "ProblemDetails",
            "schema": [
              {
                "name": "type",
                "kind": "optional",
                "type": "string<uri>",
                "nullable": true,
                "description": "A URI reference that identifies the problem type.",
                "format": "uri"
              },
              {
                "name": "title",
                "kind": "optional",
                "type": "string",
                "nullable": true,
                "description": "<p>A short, human-readable summary of the problem type.</p>"
              },
              {
                "name": "status",
                "kind": "optional",
                "type": "integer<int32>",
                "nullable": true,
                "description": "The HTTP status code generated by the origin server for this occurrence of the problem.",
                "format": "int32",
                "minimum": 100,
                "maximum": 599
              },
              {
                "name": "detail",
                "kind": "optional",
                "type": "string",
                "nullable": true,
                "description": "<p>A human-readable explanation specific to this occurrence of the problem.</p>"
              },
              {
                "name": "instance",
                "kind": "optional",
                "type": "string<uri>",
                "nullable": true,
                "description": "A URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced.",
                "format": "uri"
              },
              {
                "name": "code",
                "kind": "optional",
                "type": "string",
                "nullable": true,
                "description": "Error code that identifies the problem type."
              },
              {
                "name": "errors",
                "kind": "optional",
                "type": "array",
                "nullable": true,
                "description": "An array of error details with more detailed information about the problem.",
                "example": "",
                "itemType": "object",
                "customType": "object[]",
                "schema": [
                  {
                    "name": "detail",
                    "kind": "optional",
                    "type": "string",
                    "description": "<p>A granular explanation of one specific error related to a field, header or query parameter.</p>"
                  },
                  {
                    "name": "field",
                    "kind": "optional",
                    "type": "string",
                    "nullable": true,
                    "description": "A string that may provide a hint to which field that was the source of the error.",
                    "example": "properties.header.displayName"
                  }
                ]
              }
            ],
            "modelRef": "#/components/schemas/ProblemDetails",
            "isExpanded": true
          }
        ]
      },
      {
        "statusCode": "500",
        "description": "Internal Server Error",
        "jsonExample": "",
        "isExpanded": true
      }
    ],
    "hasXCodeSamples": false,
    "examples": {
      "languages": [
        {
          "id": "buKxHhpHIpUfWh7eoXyJT",
          "language": "curl",
          "label": "cURL",
          "code": "curl --request POST \\\n     --url https://api.cms.optimizely.com/v1/propertygroups \\\n     --header 'accept: application/json' \\\n     --header 'content-type: application/json' \\\n     --data '{\n     \"key\": \"\",\n     \"displayName\": \"\"\n     }'"
        },
        {
          "id": "NY6Ahq498QPOQ2GBDtzsW",
          "language": "javascript",
          "label": "javascript",
          "code": "var myHeaders = new Headers();\nmyHeaders.append(\"accept\", \"application/json\");\nmyHeaders.append(\"content-type\", \"application/json\");\n\nvar raw = JSON.stringify({\n   \"key\": \"\",\n   \"displayName\": \"\"\n});\n\nvar requestOptions = {\n   method: 'POST',\n   headers: myHeaders,\n   body: raw,\n   redirect: 'follow'\n};\n\nfetch(\"https://api.cms.optimizely.com/v1/propertygroups\", requestOptions)\n   .then(response => response.text())\n   .then(result => console.log(result))\n   .catch(error => console.log('error', error));"
        },
        {
          "id": "q9ma0iM5h1PwjjaGmCQJK",
          "language": "ruby",
          "label": "Ruby",
          "code": "require \"uri\"\nrequire \"json\"\nrequire \"net/http\"\n\nurl = URI(\"https://api.cms.optimizely.com/v1/propertygroups\")\n\nhttps = Net::HTTP.new(url.host, url.port)\nhttps.use_ssl = true\n\nrequest = Net::HTTP::Post.new(url)\nrequest[\"accept\"] = \"application/json\"\nrequest[\"content-type\"] = \"application/json\"\nrequest.body = JSON.dump({\n   \"key\": \"\",\n   \"displayName\": \"\"\n})\n\nresponse = https.request(request)\nputs response.read_body\n"
        },
        {
          "id": "kKgt7j8w1yHjlCMfcyb0Z",
          "language": "python",
          "label": "Python",
          "code": "import requests\nimport json\n\nurl = \"https://api.cms.optimizely.com/v1/propertygroups\"\n\npayload = json.dumps({\n   \"key\": \"\",\n   \"displayName\": \"\"\n})\nheaders = {\n   'accept': 'application/json',\n   'content-type': 'application/json'\n}\n\nresponse = requests.request(\"POST\", url, headers=headers, data=payload)\n\nprint(response.text)\n"
        }
      ],
      "selectedLanguageId": "buKxHhpHIpUfWh7eoXyJT"
    },
    "results": {
      "languages": [
        {
          "id": "response-0-201",
          "language": "201",
          "code": "// Created\n{\n  \"key\": \"\",\n  \"displayName\": \"\",\n  \"source\": \"\",\n  \"sortOrder\": \"\",\n  \"created\": \"\",\n  \"createdBy\": \"\",\n  \"lastModified\": \"\",\n  \"lastModifiedBy\": \"\"\n}"
        },
        {
          "id": "response-1-400",
          "language": "400",
          "code": "// Bad Request\n"
        },
        {
          "id": "response-2-401",
          "language": "401",
          "code": "// Unauthorized\n"
        },
        {
          "id": "response-3-403",
          "language": "403",
          "code": "// Forbidden\n"
        },
        {
          "id": "response-4-409",
          "language": "409",
          "code": "// Conflict\n"
        },
        {
          "id": "response-5-429",
          "language": "429",
          "code": "// Too Many Requests\n{\n  \"type\": \"\",\n  \"title\": \"\",\n  \"status\": \"\",\n  \"detail\": \"\",\n  \"instance\": \"\",\n  \"code\": \"\",\n  \"errors\": [\n    {\n      \"detail\": \"\",\n      \"field\": \"properties.header.displayName\"\n    }\n  ]\n}"
        },
        {
          "id": "response-6-500",
          "language": "500",
          "code": "// Internal Server Error\n"
        }
      ],
      "selectedLanguageId": "response-0-201"
    }
  },
  "children": [
    {
      "text": ""
    }
  ]
}