> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://akamai.ferndocs.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://akamai.ferndocs.com/_mcp/server.

# Test custom data schemas and read/write labels

GET http://{hostname}/test-suite/v2/data/custom
Content-Type: application/json

__Bot Manager__ This operation is marked as product-specific, along with a query parameter and some schema members.

Reference: https://akamai.ferndocs.com/demo-apis/api/data/custom/get-custom-data

## Request

### Query parameters

- `isPerProduct` (boolean, optional) — __Beta__, __Bot Manager__ This marks a per-product query parameter. Also mixes in BETA status.
- `statusDefault` (boolean, optional) — Ordinary GA query parameter.
- `accountSwitchKey` (string, optional) — For customers who manage more than one account, this [runs the operation from another account](https://techdocs.akamai.com/developer/docs/manage-many-accounts-with-one-api-client). The Identity and Access Management API provides a [list of available account switch keys](https://techdocs.akamai.com/iam-api/reference/get-client-account-switch-keys).

### Body (application/json)

This endpoint expects an object.

- `customOther` (DataCustomGetRequestBodyContentApplicationJsonSchemaCustomOther, optional) — Prepend arbitrary labels.
- `customStatus` (DataCustomGetRequestBodyContentApplicationJsonSchemaCustomStatus, optional) — Prefixed status indicators.
- `labelOrder` (string, optional) — __Beta__, __Write-once__, __Groucho__, __Chico__, __Harpo__ If you spec _every_ kind of label, in what order do they list? Should be status, R/W-O, then any custom labels.
- `rwo` (DataCustomGetRequestBodyContentApplicationJsonSchemaRwo, optional) — Read-only, Write-only, and custom Write-once syntax.
- `statusBetaTestLevel` (string, optional) — __Beta__ Description should be prefixed by _Beta_ status.
- `statusDeprecatedTestLevel` (string, optional) — __Deprecated__ Description should be prefixed by _Deprecated_ status.
- `statusInternalTestLevel` (string, optional) — __Internal__ Description should be prefixed by _Internal_ status.
- `statusLimitedTestLevel` (string, optional) — __Limited availability__ Description should be prefixed by _Limited availability_ status.

## Response

### 200

Successful response.

- `customOther` (DataCustomGetResponsesContentApplicationJsonSchemaCustomOther, optional) — Prepend arbitrary labels.
- `customStatus` (DataCustomGetResponsesContentApplicationJsonSchemaCustomStatus, optional) — Prefixed status indicators.
- `labelOrder` (string, optional) — __Beta__, __Write-once__, __Groucho__, __Chico__, __Harpo__ If you spec _every_ kind of label, in what order do they list? Should be status, R/W-O, then any custom labels.
- `rwo` (DataCustomGetResponsesContentApplicationJsonSchemaRwo, optional) — Read-only, Write-only, and custom Write-once syntax.
- `statusBetaTestLevel` (string, optional) — __Beta__ Description should be prefixed by _Beta_ status.
- `statusDeprecatedTestLevel` (string, optional) — __Deprecated__ Description should be prefixed by _Deprecated_ status.
- `statusInternalTestLevel` (string, optional) — __Internal__ Description should be prefixed by _Internal_ status.
- `statusLimitedTestLevel` (string, optional) — __Limited availability__ Description should be prefixed by _Limited availability_ status.

## Types

### DataCustomGetRequestBodyContentApplicationJsonSchemaCustomOther

Prepend arbitrary labels.

- `customLabel` (string, optional) — __Bot Manager__ Description should be prefixed by a custom label, in this case a product name.
- `customLabels` (string, optional) — __Bot Manager__, __App & API Protector__ Description should be prefixed by a comma-separated set of custom labels, in this case product names.
- `spec-labels-value-malformed` (string, optional) — __B__, __o__, __t__, __ __, __M__, __a__, __n__, __a__, __g__, __e__, __r__ Throw a warning about malformed syntax, where `labels` should be an array.

### DataCustomGetRequestBodyContentApplicationJsonSchemaCustomStatus

Prefixed status indicators.

- `spec-status-value-unsupported` (string, optional) — Unsupported status value.
- `statusBeta` (string, optional) — __Beta__ Description should be prefixed by _Beta_ status.
- `statusDefault` (string, optional) — An ordinary, unlabeled GA schema.
- `statusDeprecated` (string, optional) — __Deprecated__ Description should be prefixed by _Deprecated_ status.
- `statusInternal` (string, optional) — __Internal__ Description should be prefixed by _Internal_ status.
- `statusLimited` (string, optional) — __Limited availability__ Description should be prefixed by _Limited availability_ status.

### DataCustomGetRequestBodyContentApplicationJsonSchemaRwo

Read-only, Write-only, and custom Write-once syntax.

- `readOnly` (string, optional) — __Read-only__ Description should have a bolded _Read-only_ label. Typical for generated IDs, timestamps, and status indicators. (Does ReadMe suppress it from request schema doc?)
- `spec-wo-value-malformed` (string, optional) — __Write-once__ Throw a warning about malformed syntax, where `write-once` should be a boolean.
- `writeOnce` (string, optional) — __Write-once__ Description should have a bolded _Write-once_ label. Typical when initially assigning group or contract IDs.
- `writeOnly` (string, optional) — __Write-only__ Description should have a bolded _Write-only_ label. Occurs rarely when passing in passwords or other secret data that shouldn't display in subsequent responses. (Does ReadMe suppress it from response schema doc?)

### DataCustomGetResponsesContentApplicationJsonSchemaCustomOther

Prepend arbitrary labels.

- `customLabel` (string, optional) — __Bot Manager__ Description should be prefixed by a custom label, in this case a product name.
- `customLabels` (string, optional) — __Bot Manager__, __App & API Protector__ Description should be prefixed by a comma-separated set of custom labels, in this case product names.
- `spec-labels-value-malformed` (string, optional) — __B__, __o__, __t__, __ __, __M__, __a__, __n__, __a__, __g__, __e__, __r__ Throw a warning about malformed syntax, where `labels` should be an array.

### DataCustomGetResponsesContentApplicationJsonSchemaCustomStatus

Prefixed status indicators.

- `spec-status-value-unsupported` (string, optional) — Unsupported status value.
- `statusBeta` (string, optional) — __Beta__ Description should be prefixed by _Beta_ status.
- `statusDefault` (string, optional) — An ordinary, unlabeled GA schema.
- `statusDeprecated` (string, optional) — __Deprecated__ Description should be prefixed by _Deprecated_ status.
- `statusInternal` (string, optional) — __Internal__ Description should be prefixed by _Internal_ status.
- `statusLimited` (string, optional) — __Limited availability__ Description should be prefixed by _Limited availability_ status.

### DataCustomGetResponsesContentApplicationJsonSchemaRwo

Read-only, Write-only, and custom Write-once syntax.

- `readOnly` (string, optional) — __Read-only__ Description should have a bolded _Read-only_ label. Typical for generated IDs, timestamps, and status indicators. (Does ReadMe suppress it from request schema doc?)
- `spec-wo-value-malformed` (string, optional) — __Write-once__ Throw a warning about malformed syntax, where `write-once` should be a boolean.
- `writeOnce` (string, optional) — __Write-once__ Description should have a bolded _Write-once_ label. Typical when initially assigning group or contract IDs.
- `writeOnly` (string, optional) — __Write-only__ Description should have a bolded _Write-only_ label. Occurs rarely when passing in passwords or other secret data that shouldn't display in subsequent responses. (Does ReadMe suppress it from response schema doc?)

## Examples

**Request**

```json
{
  "customOther": {
    "customLabel": "Bot Manager",
    "customLabels": "Bot Manager, App & API Protector",
    "spec-labels-value-malformed": "Warning: labels should be an array, not a string"
  },
  "customStatus": {
    "spec-status-value-unsupported": "Unsupported status encountered",
    "statusBeta": "Beta feature enabled",
    "statusDefault": "Active",
    "statusDeprecated": "Deprecated feature",
    "statusInternal": "Internal use only",
    "statusLimited": "Limited availability"
  },
  "labelOrder": "statusBeta, writeOnce, Bot Manager, App & API Protector",
  "rwo": {
    "readOnly": "Generated ID: 12345",
    "spec-wo-value-malformed": "Warning: write-once should be boolean",
    "writeOnce": "Initial contract ID assignment",
    "writeOnly": "Sensitive password data"
  },
  "statusBetaTestLevel": "Beta testing phase",
  "statusDeprecatedTestLevel": "Deprecated API version",
  "statusInternalTestLevel": "Internal testing only",
  "statusLimitedTestLevel": "Limited release candidate",
  "statusDefault": true
}
```

**Response**

```json
{
  "customOther": {
    "customLabel": "Bot Manager",
    "customLabels": "Bot Manager, App & API Protector",
    "spec-labels-value-malformed": "Warning: labels should be an array, not a string"
  },
  "customStatus": {
    "spec-status-value-unsupported": "Unsupported status encountered",
    "statusBeta": "Beta feature enabled",
    "statusDefault": "Active",
    "statusDeprecated": "Deprecated feature",
    "statusInternal": "Internal use only",
    "statusLimited": "Limited availability"
  },
  "labelOrder": "statusBeta, writeOnce, Bot Manager, App & API Protector",
  "rwo": {
    "readOnly": "Generated ID: 12345",
    "spec-wo-value-malformed": "Warning: write-once should be boolean",
    "writeOnce": "Initial contract ID assignment"
  },
  "statusBetaTestLevel": "Beta testing phase",
  "statusDeprecatedTestLevel": "Deprecated API version",
  "statusInternalTestLevel": "Internal testing only",
  "statusLimitedTestLevel": "Limited release candidate",
  "statusDefault": "true"
}
```

**SDK Code**

```python
import requests

url = "http://{hostname}/test-suite/v2/data/custom"

payload = {
    "customOther": {
        "customLabel": "Bot Manager",
        "customLabels": "Bot Manager, App & API Protector",
        "spec-labels-value-malformed": "Warning: labels should be an array, not a string"
    },
    "customStatus": {
        "spec-status-value-unsupported": "Unsupported status encountered",
        "statusBeta": "Beta feature enabled",
        "statusDefault": "Active",
        "statusDeprecated": "Deprecated feature",
        "statusInternal": "Internal use only",
        "statusLimited": "Limited availability"
    },
    "labelOrder": "statusBeta, writeOnce, Bot Manager, App & API Protector",
    "rwo": {
        "readOnly": "Generated ID: 12345",
        "spec-wo-value-malformed": "Warning: write-once should be boolean",
        "writeOnce": "Initial contract ID assignment",
        "writeOnly": "Sensitive password data"
    },
    "statusBetaTestLevel": "Beta testing phase",
    "statusDeprecatedTestLevel": "Deprecated API version",
    "statusInternalTestLevel": "Internal testing only",
    "statusLimitedTestLevel": "Limited release candidate",
    "statusDefault": True
}
headers = {"Content-Type": "application/json"}

response = requests.get(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'http://{hostname}/test-suite/v2/data/custom';
const options = {
  method: 'GET',
  headers: {'Content-Type': 'application/json'},
  body: '{"customOther":{"customLabel":"Bot Manager","customLabels":"Bot Manager, App & API Protector","spec-labels-value-malformed":"Warning: labels should be an array, not a string"},"customStatus":{"spec-status-value-unsupported":"Unsupported status encountered","statusBeta":"Beta feature enabled","statusDefault":"Active","statusDeprecated":"Deprecated feature","statusInternal":"Internal use only","statusLimited":"Limited availability"},"labelOrder":"statusBeta, writeOnce, Bot Manager, App & API Protector","rwo":{"readOnly":"Generated ID: 12345","spec-wo-value-malformed":"Warning: write-once should be boolean","writeOnce":"Initial contract ID assignment","writeOnly":"Sensitive password data"},"statusBetaTestLevel":"Beta testing phase","statusDeprecatedTestLevel":"Deprecated API version","statusInternalTestLevel":"Internal testing only","statusLimitedTestLevel":"Limited release candidate","statusDefault":true}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

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

func main() {

	url := "http://{hostname}/test-suite/v2/data/custom"

	payload := strings.NewReader("{\n  \"customOther\": {\n    \"customLabel\": \"Bot Manager\",\n    \"customLabels\": \"Bot Manager, App & API Protector\",\n    \"spec-labels-value-malformed\": \"Warning: labels should be an array, not a string\"\n  },\n  \"customStatus\": {\n    \"spec-status-value-unsupported\": \"Unsupported status encountered\",\n    \"statusBeta\": \"Beta feature enabled\",\n    \"statusDefault\": \"Active\",\n    \"statusDeprecated\": \"Deprecated feature\",\n    \"statusInternal\": \"Internal use only\",\n    \"statusLimited\": \"Limited availability\"\n  },\n  \"labelOrder\": \"statusBeta, writeOnce, Bot Manager, App & API Protector\",\n  \"rwo\": {\n    \"readOnly\": \"Generated ID: 12345\",\n    \"spec-wo-value-malformed\": \"Warning: write-once should be boolean\",\n    \"writeOnce\": \"Initial contract ID assignment\",\n    \"writeOnly\": \"Sensitive password data\"\n  },\n  \"statusBetaTestLevel\": \"Beta testing phase\",\n  \"statusDeprecatedTestLevel\": \"Deprecated API version\",\n  \"statusInternalTestLevel\": \"Internal testing only\",\n  \"statusLimitedTestLevel\": \"Limited release candidate\",\n  \"statusDefault\": true\n}")

	req, _ := http.NewRequest("GET", url, payload)

	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("http://{hostname}/test-suite/v2/data/custom")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Get.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n  \"customOther\": {\n    \"customLabel\": \"Bot Manager\",\n    \"customLabels\": \"Bot Manager, App & API Protector\",\n    \"spec-labels-value-malformed\": \"Warning: labels should be an array, not a string\"\n  },\n  \"customStatus\": {\n    \"spec-status-value-unsupported\": \"Unsupported status encountered\",\n    \"statusBeta\": \"Beta feature enabled\",\n    \"statusDefault\": \"Active\",\n    \"statusDeprecated\": \"Deprecated feature\",\n    \"statusInternal\": \"Internal use only\",\n    \"statusLimited\": \"Limited availability\"\n  },\n  \"labelOrder\": \"statusBeta, writeOnce, Bot Manager, App & API Protector\",\n  \"rwo\": {\n    \"readOnly\": \"Generated ID: 12345\",\n    \"spec-wo-value-malformed\": \"Warning: write-once should be boolean\",\n    \"writeOnce\": \"Initial contract ID assignment\",\n    \"writeOnly\": \"Sensitive password data\"\n  },\n  \"statusBetaTestLevel\": \"Beta testing phase\",\n  \"statusDeprecatedTestLevel\": \"Deprecated API version\",\n  \"statusInternalTestLevel\": \"Internal testing only\",\n  \"statusLimitedTestLevel\": \"Limited release candidate\",\n  \"statusDefault\": true\n}"

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

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("http://{hostname}/test-suite/v2/data/custom")
  .header("Content-Type", "application/json")
  .body("{\n  \"customOther\": {\n    \"customLabel\": \"Bot Manager\",\n    \"customLabels\": \"Bot Manager, App & API Protector\",\n    \"spec-labels-value-malformed\": \"Warning: labels should be an array, not a string\"\n  },\n  \"customStatus\": {\n    \"spec-status-value-unsupported\": \"Unsupported status encountered\",\n    \"statusBeta\": \"Beta feature enabled\",\n    \"statusDefault\": \"Active\",\n    \"statusDeprecated\": \"Deprecated feature\",\n    \"statusInternal\": \"Internal use only\",\n    \"statusLimited\": \"Limited availability\"\n  },\n  \"labelOrder\": \"statusBeta, writeOnce, Bot Manager, App & API Protector\",\n  \"rwo\": {\n    \"readOnly\": \"Generated ID: 12345\",\n    \"spec-wo-value-malformed\": \"Warning: write-once should be boolean\",\n    \"writeOnce\": \"Initial contract ID assignment\",\n    \"writeOnly\": \"Sensitive password data\"\n  },\n  \"statusBetaTestLevel\": \"Beta testing phase\",\n  \"statusDeprecatedTestLevel\": \"Deprecated API version\",\n  \"statusInternalTestLevel\": \"Internal testing only\",\n  \"statusLimitedTestLevel\": \"Limited release candidate\",\n  \"statusDefault\": true\n}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'http://{hostname}/test-suite/v2/data/custom', [
  'body' => '{
  "customOther": {
    "customLabel": "Bot Manager",
    "customLabels": "Bot Manager, App & API Protector",
    "spec-labels-value-malformed": "Warning: labels should be an array, not a string"
  },
  "customStatus": {
    "spec-status-value-unsupported": "Unsupported status encountered",
    "statusBeta": "Beta feature enabled",
    "statusDefault": "Active",
    "statusDeprecated": "Deprecated feature",
    "statusInternal": "Internal use only",
    "statusLimited": "Limited availability"
  },
  "labelOrder": "statusBeta, writeOnce, Bot Manager, App & API Protector",
  "rwo": {
    "readOnly": "Generated ID: 12345",
    "spec-wo-value-malformed": "Warning: write-once should be boolean",
    "writeOnce": "Initial contract ID assignment",
    "writeOnly": "Sensitive password data"
  },
  "statusBetaTestLevel": "Beta testing phase",
  "statusDeprecatedTestLevel": "Deprecated API version",
  "statusInternalTestLevel": "Internal testing only",
  "statusLimitedTestLevel": "Limited release candidate",
  "statusDefault": true
}',
  'headers' => [
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("http://{hostname}/test-suite/v2/data/custom");
var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"customOther\": {\n    \"customLabel\": \"Bot Manager\",\n    \"customLabels\": \"Bot Manager, App & API Protector\",\n    \"spec-labels-value-malformed\": \"Warning: labels should be an array, not a string\"\n  },\n  \"customStatus\": {\n    \"spec-status-value-unsupported\": \"Unsupported status encountered\",\n    \"statusBeta\": \"Beta feature enabled\",\n    \"statusDefault\": \"Active\",\n    \"statusDeprecated\": \"Deprecated feature\",\n    \"statusInternal\": \"Internal use only\",\n    \"statusLimited\": \"Limited availability\"\n  },\n  \"labelOrder\": \"statusBeta, writeOnce, Bot Manager, App & API Protector\",\n  \"rwo\": {\n    \"readOnly\": \"Generated ID: 12345\",\n    \"spec-wo-value-malformed\": \"Warning: write-once should be boolean\",\n    \"writeOnce\": \"Initial contract ID assignment\",\n    \"writeOnly\": \"Sensitive password data\"\n  },\n  \"statusBetaTestLevel\": \"Beta testing phase\",\n  \"statusDeprecatedTestLevel\": \"Deprecated API version\",\n  \"statusInternalTestLevel\": \"Internal testing only\",\n  \"statusLimitedTestLevel\": \"Limited release candidate\",\n  \"statusDefault\": true\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = ["Content-Type": "application/json"]
let parameters = [
  "customOther": [
    "customLabel": "Bot Manager",
    "customLabels": "Bot Manager, App & API Protector",
    "spec-labels-value-malformed": "Warning: labels should be an array, not a string"
  ],
  "customStatus": [
    "spec-status-value-unsupported": "Unsupported status encountered",
    "statusBeta": "Beta feature enabled",
    "statusDefault": "Active",
    "statusDeprecated": "Deprecated feature",
    "statusInternal": "Internal use only",
    "statusLimited": "Limited availability"
  ],
  "labelOrder": "statusBeta, writeOnce, Bot Manager, App & API Protector",
  "rwo": [
    "readOnly": "Generated ID: 12345",
    "spec-wo-value-malformed": "Warning: write-once should be boolean",
    "writeOnce": "Initial contract ID assignment",
    "writeOnly": "Sensitive password data"
  ],
  "statusBetaTestLevel": "Beta testing phase",
  "statusDeprecatedTestLevel": "Deprecated API version",
  "statusInternalTestLevel": "Internal testing only",
  "statusLimitedTestLevel": "Limited release candidate",
  "statusDefault": true
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "http://{hostname}/test-suite/v2/data/custom")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```