> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://akamai.ferndocs.com/demo-apis/api/data/custom/get-custom-data/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 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 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() ```