---
title: Read Early Access Features
description: Use the GET {{apiPath}}/v1/environments/{{envID}}/earlyAccessFeatures request to return a list of all the early access features available for the specified environment. This list of early access features is limited to those features supported by your environment, based on:
component: pingone-api
page_id: pingone-api:platform:environments/early-access-features/read-early-access-features
canonical_url: https://developer.pingidentity.com/pingone-api/platform/environments/early-access-features/read-early-access-features.html
section_ids:
  headers: Headers
  example-request: Example Request
  example-response: Example Response
---

# Read Early Access Features

##

```none
GET {{apiPath}}/v1/environments/{{envID}}/earlyAccessFeatures
```

Use the `GET {{apiPath}}/v1/environments/{{envID}}/earlyAccessFeatures` request to return a list of all the early access features available for the specified environment. This list of early access features is limited to those features supported by your environment, based on:

* The licensing for your account.

* The bill of materials for your account.

* Your assigned role for the PingOne environment (Environment Admin role is required).

* Whether the PingOne service or services affected by the early access feature or features is available in the environment.

You'll then use the returned feature list to specify the early access features that you want to opt-in to in the request body for [Update Early Access Features](update-early-access-features.html).

### Headers

Authorization      Bearer {{accessToken}}

##

### Example Request

* cURL

* C#

* Go

* HTTP

* Java

* jQuery

* NodeJS

* Python

* PHP

* Ruby

* Swift

```shell
curl --location --globoff '{{apiPath}}/v1/environments/{{envID}}/earlyAccessFeatures' \
--header 'Authorization: Bearer {{accessToken}}'
```

```csharp
var options = new RestClientOptions("{{apiPath}}/v1/environments/{{envID}}/earlyAccessFeatures")
{
  MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("", Method.Get);
request.AddHeader("Authorization", "Bearer {{accessToken}}");
RestResponse response = await client.ExecuteAsync(request);
Console.WriteLine(response.Content);
```

```golang
package main

import (
  "fmt"
  "net/http"
  "io"
)

func main() {

  url := "{{apiPath}}/v1/environments/{{envID}}/earlyAccessFeatures"
  method := "GET"

  client := &http.Client {
  }
  req, err := http.NewRequest(method, url, nil)

  if err != nil {
    fmt.Println(err)
    return
  }
  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))
}
```

```http
GET /v1/environments/{{envID}}/earlyAccessFeatures HTTP/1.1
Host: {{apiPath}}
Authorization: Bearer {{accessToken}}
```

```java
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = RequestBody.create(mediaType, "");
Request request = new Request.Builder()
  .url("{{apiPath}}/v1/environments/{{envID}}/earlyAccessFeatures")
  .method("GET", body)
  .addHeader("Authorization", "Bearer {{accessToken}}")
  .build();
Response response = client.newCall(request).execute();
```

```javascript
var settings = {
  "url": "{{apiPath}}/v1/environments/{{envID}}/earlyAccessFeatures",
  "method": "GET",
  "timeout": 0,
  "headers": {
    "Authorization": "Bearer {{accessToken}}"
  },
};

$.ajax(settings).done(function (response) {
  console.log(response);
});
```

```javascript
var request = require('request');
var options = {
  'method': 'GET',
  'url': '{{apiPath}}/v1/environments/{{envID}}/earlyAccessFeatures',
  'headers': {
    'Authorization': 'Bearer {{accessToken}}'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
```

```python
import requests

url = "{{apiPath}}/v1/environments/{{envID}}/earlyAccessFeatures"

payload = {}
headers = {
  'Authorization': 'Bearer {{accessToken}}'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
```

```php
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('{{apiPath}}/v1/environments/{{envID}}/earlyAccessFeatures');
$request->setMethod(HTTP_Request2::METHOD_GET);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Authorization' => 'Bearer {{accessToken}}'
));
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();
}
```

```ruby
require "uri"
require "net/http"

url = URI("{{apiPath}}/v1/environments/{{envID}}/earlyAccessFeatures")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Authorization"] = "Bearer {{accessToken}}"

response = http.request(request)
puts response.read_body
```

```swift
var request = URLRequest(url: URL(string: "{{apiPath}}/v1/environments/{{envID}}/earlyAccessFeatures")!,timeoutInterval: Double.infinity)
request.addValue("Bearer {{accessToken}}", forHTTPHeaderField: "Authorization")

request.httpMethod = "GET"

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

```json
{
    "_links": {
        "self": {
            "href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/earlyAccessFeatures"
        }
    },
    "features": [
        {
            "name": "Configuration Management",
            "description": "Configuration management in PingOne allows for the promotion of configuration from one PingOne environment to another.  Both the source and target environment must be opted-into this capability in order to successfully promote. This is only available internally and limited to the APIs. See the beta API documentation for more details. ",
            "segmentKey": "configuration-management",
            "value": true
        },
        {
            "name": "Token Fulfillment from Authentication Context",
            "description": "Token Fulfillment from Authentication Context enables administrators to fulfill access and ID tokens based on the authentication JWT including claims within the authentication JWT by exposing the authentication context in the expression builder of the claims mapping. This feature improves interoperability with OpenID Connect (OIDC) applications by dynamically adapting token claims to match the token issuance requirements of different services.",
            "segmentKey": "token-fulfillment-from-authentication-context",
            "value": false
        }
    ]
}
```
