---
title: List project change requests
slug: feature-experimentation/api/list-project-change-requests
docTags: 
createdAt: 2026-10-13T18:16:15.508Z
---

{
  "id": "uIq3mtN5ufj4_Q08u1J2A",
  "type": "api-oas-v2",
  "data": {
    "method": "GET",
    "url": "http://localhost:3002//projects/{project_id}/change_requests",
    "servers": [
      {
        "url": "http://localhost:3002//projects/{project_id}/change_requests",
        "description": "Local server"
      },
      {
        "url": "https://api.app.optimizely.com/flags-scheduling/projects/{project_id}/change_requests",
        "description": "Production server"
      }
    ],
    "name": "List project change requests",
    "description": "List change requests across all flags in a project\n",
    "contentType": "application/json",
    "request": {
      "pathParameters": [
        {
          "kind": "required",
          "name": "project_id",
          "type": "integer",
          "description": ""
        }
      ],
      "headerParameters": [
        {
          "name": "accept",
          "type": "string",
          "kind": "optional",
          "description": "Generated from available response content types",
          "enum": [
            "application/json"
          ],
          "default": "application/json"
        }
      ],
      "queryParameters": [
        {
          "kind": "optional",
          "name": "per_page",
          "type": "integer<int64>",
          "description": "The max number of items to include per page or results.",
          "format": "int64"
        },
        {
          "kind": "optional",
          "name": "page",
          "type": "integer<int64>",
          "description": "<p>Bypass page_token to jump to specific page</p>",
          "format": "int64"
        },
        {
          "kind": "optional",
          "name": "approval_status",
          "type": "string",
          "description": "",
          "enum": [
            "pending",
            "accepted",
            "rejected",
            "withdrawn",
            "all"
          ]
        },
        {
          "kind": "optional",
          "name": "archived",
          "type": "boolean",
          "description": "",
          "default": false
        },
        {
          "kind": "optional",
          "name": "sort",
          "type": "string",
          "description": "<p>Sort by field</p><div></div>. Allowed fields: created_at, updated_at, entity_key, status, scheduled_time.<p></p>",
          "default": "created_at:desc",
          "enum": [
            "created_at:asc",
            "created_at:desc",
            "updated_at:asc",
            "updated_at:desc",
            "entity_key:asc",
            "entity_key:desc",
            "status:asc",
            "status:desc",
            "scheduled_time:asc",
            "scheduled_time:desc"
          ]
        },
        {
          "kind": "optional",
          "name": "environment",
          "type": "string",
          "description": ""
        },
        {
          "kind": "optional",
          "name": "flag_key",
          "type": "string",
          "description": ""
        },
        {
          "kind": "optional",
          "name": "scheduled",
          "type": "boolean",
          "description": "<p>Filter by scheduled status. true = only scheduled change requests, false = only immediate change requests. Omit to return both.</p>"
        },
        {
          "kind": "optional",
          "name": "applies_to",
          "type": "string",
          "description": "Filter change requests to those whose actions target this rule key. Omit to return change requests for all rules."
        },
        {
          "kind": "optional",
          "name": "gated",
          "type": "boolean",
          "description": "<p>Filter by whether approval is required. true = only gated (approval-required) change requests, false = only non-gated. Omit to return both.</p>"
        },
        {
          "kind": "optional",
          "name": "job_status",
          "type": "string",
          "description": "<p>Filter by schedule job status (e.g. 'pending' for not-yet-executed scheduled change requests). Omit to return change requests regardless of job status.</p>",
          "enum": [
            "pending",
            "in_queue",
            "failed_to_queue",
            "canceled",
            "completed",
            "failed",
            "partially_failed"
          ]
        },
        {
          "kind": "optional",
          "name": "query",
          "type": "string",
          "description": "Search input to filter change requests by flag key or submitter email.",
          "maxLength": 255
        },
        {
          "kind": "optional",
          "name": "scheduled_from",
          "type": "string<date-time>",
          "example": "2023-04-15T20:14:00+00:00",
          "description": "<p>Specify a UTC timestamp and get the change requests scheduled on or after it (inclusive lower bound on the schedule time).</p>",
          "format": "date-time"
        },
        {
          "kind": "optional",
          "name": "scheduled_till",
          "type": "string<date-time>",
          "example": "2023-04-15T20:14:00+00:00",
          "description": "<p>Specify a UTC timestamp and get the change requests scheduled on or before it (inclusive upper bound on the schedule time).</p>",
          "format": "date-time"
        }
      ],
      "bodyDataParameters": [],
      "formDataParameters": [],
      "oAuthParameters": [
        {
          "id": "BearerAuth",
          "name": "BearerAuth",
          "kind": "optional",
          "type": "http",
          "description": "<p>To get a personal token, see <a href=\"https://docs.developers.optimizely.com/web/docs/personal-token\" target=\"_blank\">https://docs.developers.optimizely.com/web/docs/personal-token</a></p>",
          "scheme": "bearer"
        }
      ],
      "cookieParameters": []
    },
    "responses": [
      {
        "statusCode": "200",
        "description": "Successful retrieval of a page of change requests.",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "object",
            "description": "",
            "customType": "PaginatedChangeRequestResponse",
            "schema": [
              {
                "name": "items",
                "kind": "required",
                "type": "array",
                "description": "List of change requests.",
                "modelRef": "#/components/schemas/ChangeRequest",
                "customType": "ChangeRequest[]",
                "schema": [
                  {
                    "name": "id",
                    "kind": "required",
                    "type": "integer",
                    "description": "The change request ID."
                  },
                  {
                    "name": "project_id",
                    "kind": "required",
                    "type": "integer",
                    "description": "The project ID."
                  },
                  {
                    "name": "entity_key",
                    "kind": "required",
                    "type": "string",
                    "description": "<p>The key of the entity (e.g. flag key).</p>"
                  },
                  {
                    "name": "entity_id",
                    "kind": "optional",
                    "type": "integer",
                    "description": "<p>The ID of the entity (e.g. flag ID).</p>"
                  },
                  {
                    "name": "entity_type",
                    "kind": "required",
                    "type": "string",
                    "description": "The entity type."
                  },
                  {
                    "name": "environment",
                    "kind": "required",
                    "type": "string",
                    "description": "The environment key."
                  },
                  {
                    "name": "environment_id",
                    "kind": "optional",
                    "type": "integer",
                    "description": "The environment ID."
                  },
                  {
                    "name": "job_status",
                    "kind": "required",
                    "type": "string",
                    "description": "The status of the scheduled job."
                  },
                  {
                    "name": "created_by",
                    "kind": "required",
                    "type": "string",
                    "description": "The user who created the change request."
                  },
                  {
                    "name": "updated_by",
                    "kind": "required",
                    "type": "string",
                    "description": "The user who last updated the change request."
                  },
                  {
                    "name": "created_at",
                    "kind": "required",
                    "type": "string<date-time>",
                    "description": "Timestamp when the change request was created.",
                    "format": "date-time"
                  },
                  {
                    "name": "updated_at",
                    "kind": "optional",
                    "type": "string<date-time>",
                    "description": "Timestamp when the change request was last updated.",
                    "format": "date-time"
                  },
                  {
                    "name": "archived",
                    "kind": "required",
                    "type": "boolean",
                    "description": "Whether the change request is archived."
                  },
                  {
                    "name": "revision",
                    "kind": "required",
                    "type": "integer",
                    "description": "The revision number."
                  },
                  {
                    "name": "approval_required",
                    "kind": "required",
                    "type": "boolean",
                    "description": "Whether approval is required for this change request."
                  },
                  {
                    "name": "current_approval_state_id",
                    "kind": "optional",
                    "type": "integer",
                    "description": "The current approval state ID."
                  },
                  {
                    "name": "approval_status",
                    "kind": "optional",
                    "type": "string<pending | accepted | rejected | withdrawn>",
                    "description": "The current approval status.",
                    "enum": [
                      "pending",
                      "accepted",
                      "rejected",
                      "withdrawn"
                    ]
                  },
                  {
                    "name": "policy_id",
                    "kind": "optional",
                    "type": "integer",
                    "description": "The ID of the approval policy that governs this change request."
                  },
                  {
                    "name": "policy_name",
                    "kind": "optional",
                    "type": "string",
                    "description": "The name of the approval policy that governs this change request."
                  },
                  {
                    "name": "is_current_user_approver",
                    "kind": "optional",
                    "type": "boolean",
                    "nullable": true,
                    "description": "<p>Whether the current user is an approver for this change request. true if the user can approve, false if not, null when the status is not pending or the approver cannot be resolved.</p>"
                  },
                  {
                    "name": "reason",
                    "kind": "optional",
                    "type": "string",
                    "description": "The reason from the initial submission."
                  },
                  {
                    "name": "operations",
                    "kind": "required",
                    "type": "array",
                    "description": "List of JSON Patch operations.",
                    "modelRef": "#/components/schemas/JsonPatchOperation",
                    "customType": "JsonPatchOperation[]",
                    "schema": [
                      {
                        "name": "op",
                        "kind": "required",
                        "type": "string<replace | add | remove>",
                        "description": "The JSON Patch operation type.",
                        "enum": [
                          "replace",
                          "add",
                          "remove"
                        ]
                      },
                      {
                        "name": "path",
                        "kind": "required",
                        "type": "string",
                        "description": "<p>JSON Pointer (RFC 6901) targeting a location within the document.</p>"
                      },
                      {
                        "name": "value",
                        "kind": "optional",
                        "type": "object",
                        "nullable": true,
                        "description": "<p>New value; required for 'replace' and 'add' ops.</p>",
                        "complexType": "oneOf",
                        "complexItems": [],
                        "schema": []
                      }
                    ]
                  },
                  {
                    "name": "status_history",
                    "kind": "optional",
                    "type": "array",
                    "description": "History of status changes.",
                    "modelRef": "#/components/schemas/ChangeRequestStatusHistory",
                    "customType": "ChangeRequestStatusHistory[]",
                    "schema": [
                      {
                        "name": "id",
                        "kind": "required",
                        "type": "integer",
                        "description": "The unique identifier for the status history entry."
                      },
                      {
                        "name": "status",
                        "kind": "required",
                        "type": "string<pending | accepted | rejected | withdrawn>",
                        "description": "The status of the change request at this point.",
                        "enum": [
                          "pending",
                          "accepted",
                          "rejected",
                          "withdrawn"
                        ]
                      },
                      {
                        "name": "email",
                        "kind": "required",
                        "type": "string",
                        "description": "The email of the user who set this status."
                      },
                      {
                        "name": "reason",
                        "kind": "optional",
                        "type": "string",
                        "description": "The reason for the status change."
                      },
                      {
                        "name": "approved_via_team_id",
                        "kind": "optional",
                        "type": "integer",
                        "description": "<p>The team ID through which the user approved (if team-based).</p>"
                      },
                      {
                        "name": "approved_via_team_name",
                        "kind": "optional",
                        "type": "string",
                        "description": "<p>The team name through which the user approved (if team-based).</p>"
                      },
                      {
                        "name": "created_at",
                        "kind": "required",
                        "type": "string<date-time>",
                        "description": "Timestamp when this status was set.",
                        "format": "date-time"
                      }
                    ]
                  },
                  {
                    "name": "schedule",
                    "kind": "optional",
                    "type": "object",
                    "nullable": true,
                    "description": "<p>The scheduled execution time. Null for immediate change requests; present when the change request is scheduled.</p>",
                    "complexType": "allOf",
                    "complexItems": [
                      {
                        "name": "ScheduleTimeResponse",
                        "description": "",
                        "modelRef": "#/components/schemas/ScheduleTimeResponse",
                        "schema": [
                          {
                            "name": "date",
                            "kind": "optional",
                            "type": "string<date>",
                            "description": "<p>The schedule will run at this date. Expected format: yyyy-mm-dd.</p>",
                            "example": "2025-02-18",
                            "format": "date"
                          },
                          {
                            "name": "time",
                            "kind": "optional",
                            "type": "string",
                            "description": "<p>The schedule will run at this time. Expected format: hh</p><div></div> (24 hour).<p></p>",
                            "example": "23:59",
                            "pattern": "^([01]?[0-9]|2[0-3]):([0-5][0-9])$"
                          },
                          {
                            "name": "time_zone",
                            "kind": "optional",
                            "type": "string",
                            "description": "The timezone information for the scheduled time.",
                            "example": "UTC"
                          },
                          {
                            "name": "utc_time",
                            "kind": "optional",
                            "type": "string<date-time>",
                            "description": "The utc timestamp when the scheduled job will be executed.",
                            "example": "2025-02-18T23:59:59+00:00",
                            "format": "date-time"
                          }
                        ]
                      }
                    ],
                    "schema": []
                  }
                ]
              },
              {
                "name": "count",
                "kind": "required",
                "type": "integer",
                "description": "Number of items in the current page."
              },
              {
                "name": "page",
                "kind": "required",
                "type": "integer",
                "description": "Current page number."
              },
              {
                "name": "total_count",
                "kind": "required",
                "type": "integer",
                "description": "Total number of change requests."
              },
              {
                "name": "total_pages",
                "kind": "required",
                "type": "integer",
                "description": "Total number of pages."
              },
              {
                "name": "first_url",
                "kind": "optional",
                "type": "string",
                "description": "URL for the first page."
              },
              {
                "name": "last_url",
                "kind": "optional",
                "type": "string",
                "description": "URL for the last page."
              },
              {
                "name": "prev_url",
                "kind": "optional",
                "type": "string",
                "description": "URL for the previous page."
              },
              {
                "name": "next_url",
                "kind": "optional",
                "type": "string",
                "description": "URL for the next page."
              }
            ],
            "modelRef": "#/components/schemas/PaginatedChangeRequestResponse",
            "isExpanded": true
          }
        ]
      },
      {
        "statusCode": "401",
        "description": "Not Authenticated",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "object",
            "example": "{\"details\":\"Not authenticated\",\"status\":401}",
            "description": "",
            "customType": "ErrorResponse",
            "schema": [
              {
                "name": "details",
                "kind": "required",
                "type": "string",
                "description": "Details of Error."
              },
              {
                "name": "status",
                "kind": "required",
                "type": "integer",
                "description": "Status code of the response.",
                "example": 400
              }
            ],
            "modelRef": "#/components/schemas/ErrorResponse",
            "isExpanded": true
          }
        ]
      },
      {
        "statusCode": "403",
        "description": "Forbidden",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "object",
            "example": "{\"details\":\"Forbidden\",\"status\":403}",
            "description": "",
            "customType": "ErrorResponse",
            "schema": [
              {
                "name": "details",
                "kind": "required",
                "type": "string",
                "description": "Details of Error."
              },
              {
                "name": "status",
                "kind": "required",
                "type": "integer",
                "description": "Status code of the response.",
                "example": 400
              }
            ],
            "modelRef": "#/components/schemas/ErrorResponse",
            "isExpanded": true
          }
        ]
      }
    ],
    "hasXCodeSamples": false,
    "examples": {
      "languages": [
        {
          "id": "HPntYPSvWn52SMqpxuazy",
          "language": "curl",
          "label": "cURL",
          "code": "curl --request GET \\\n     --url 'http://localhost:3002//projects/{project_id}/change_requests?archived=boolean&sort=created_at%3Adesc' \\\n     --header 'accept: application/json'"
        },
        {
          "id": "RNZ9rGbQaDzsZE3m-EDZ6",
          "language": "javascript",
          "label": "javascript",
          "code": "var myHeaders = new Headers();\nmyHeaders.append(\"accept\", \"application/json\");\nmyHeaders.append(\"content-type\", \"application/json\");\n\nvar requestOptions = {\n   method: 'GET',\n   headers: myHeaders,\n   redirect: 'follow'\n};\n\nfetch(\"http://localhost:3002//projects/{project_id}/change_requests?archived=boolean&sort=created_at:desc\", requestOptions)\n   .then(response => response.text())\n   .then(result => console.log(result))\n   .catch(error => console.log('error', error));"
        },
        {
          "id": "l000TMlPoRt4NX6DjxOYJ",
          "language": "ruby",
          "label": "Ruby",
          "code": "require \"uri\"\nrequire \"json\"\nrequire \"net/http\"\n\nurl = URI(\"http://localhost:3002//projects/{project_id}/change_requests?archived=boolean&sort=created_at:desc\")\n\nhttp = Net::HTTP.new(url.host, url.port);\nrequest = Net::HTTP::Get.new(url)\nrequest[\"accept\"] = \"application/json\"\nrequest[\"content-type\"] = \"application/json\"\n\nresponse = http.request(request)\nputs response.read_body\n"
        },
        {
          "id": "wjxhA2UGdDkbwMIPhXMwZ",
          "language": "python",
          "label": "Python",
          "code": "import requests\nimport json\n\nurl = \"http://localhost:3002//projects/{project_id}/change_requests?archived=boolean&sort=created_at:desc\"\n\npayload = {}\nheaders = {\n   'accept': 'application/json',\n   'content-type': 'application/json'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data=payload)\n\nprint(response.text)\n"
        }
      ],
      "selectedLanguageId": "HPntYPSvWn52SMqpxuazy"
    },
    "results": {
      "languages": [
        {
          "id": "tUBob488Ir5kHlh6mW6cQ",
          "language": "200",
          "code": "// Successful retrieval of a page of change requests.\n{\n  \"items\": [\n    {\n      \"id\": 0,\n      \"project_id\": 0,\n      \"entity_key\": \"\",\n      \"entity_id\": 0,\n      \"entity_type\": \"\",\n      \"environment\": \"\",\n      \"environment_id\": 0,\n      \"job_status\": \"\",\n      \"created_by\": \"\",\n      \"updated_by\": \"\",\n      \"created_at\": \"\",\n      \"updated_at\": \"\",\n      \"archived\": false,\n      \"revision\": 0,\n      \"approval_required\": false,\n      \"current_approval_state_id\": 0,\n      \"approval_status\": \"\",\n      \"policy_id\": 0,\n      \"policy_name\": \"\",\n      \"is_current_user_approver\": false,\n      \"reason\": \"\",\n      \"operations\": [\n        {\n          \"op\": \"\",\n          \"path\": \"\",\n          \"value\": {}\n        }\n      ],\n      \"status_history\": [\n        {\n          \"id\": 0,\n          \"status\": \"\",\n          \"email\": \"\",\n          \"reason\": \"\",\n          \"approved_via_team_id\": 0,\n          \"approved_via_team_name\": \"\",\n          \"created_at\": \"\"\n        }\n      ],\n      \"schedule\": {}\n    }\n  ],\n  \"count\": 0,\n  \"page\": 0,\n  \"total_count\": 0,\n  \"total_pages\": 0,\n  \"first_url\": \"\",\n  \"last_url\": \"\",\n  \"prev_url\": \"\",\n  \"next_url\": \"\"\n}"
        },
        {
          "id": "SuUNNP5C2UeJqdSN3w0Aq",
          "language": "401",
          "code": "// Not Authenticated\n{\n  \"details\": \"\",\n  \"status\": 400\n}"
        },
        {
          "id": "MfekB70G2yCXXJROWbtfl",
          "language": "403",
          "code": "// Forbidden\n{\n  \"details\": \"\",\n  \"status\": 400\n}"
        }
      ],
      "selectedLanguageId": "tUBob488Ir5kHlh6mW6cQ"
    }
  },
  "children": [
    {
      "text": ""
    }
  ]
}