Get lab
curl --request GET \
--url https://api.cybr.com/api/v2/labs/{labId} \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.cybr.com/api/v2/labs/{labId}"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.cybr.com/api/v2/labs/{labId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.cybr.com/api/v2/labs/{labId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.cybr.com/api/v2/labs/{labId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.cybr.com/api/v2/labs/{labId}")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cybr.com/api/v2/labs/{labId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "lab_id",
"name": "Example lab",
"slug": "example-lab",
"description": "An isolated exercise.",
"provider": "aws",
"timeLimit": 30,
"estimatedLaunchSeconds": 120,
"ctf": true,
"free": true,
"createdAt": "2026-01-01T00:00:00Z",
"updatedAt": "2026-01-01T00:00:00Z",
"bannerUrl": null,
"webTerminal": true,
"guide": null,
"resources": null,
"diagrams": [],
"videos": [],
"writeups": [],
"completed": false
}{
"message": "<string>",
"retryAfter": 123,
"activeCount": 123,
"limit": 123,
"errors": [
"<string>"
]
}{
"message": "<string>",
"retryAfter": 123,
"activeCount": 123,
"limit": 123,
"errors": [
"<string>"
]
}{
"message": "<string>",
"retryAfter": 123,
"activeCount": 123,
"limit": 123,
"errors": [
"<string>"
]
}{
"message": "<string>",
"retryAfter": 123,
"activeCount": 123,
"limit": 123,
"errors": [
"<string>"
]
}{
"message": "<string>",
"retryAfter": 123,
"activeCount": 123,
"limit": 123,
"errors": [
"<string>"
]
}{
"message": "<string>",
"retryAfter": 123,
"activeCount": 123,
"limit": 123,
"errors": [
"<string>"
]
}REST API endpoints
Get lab
Returns public content and optional learner-specific completion. SDK: labs.get(labId, { learnerId }).
Get lab
curl --request GET \
--url https://api.cybr.com/api/v2/labs/{labId} \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.cybr.com/api/v2/labs/{labId}"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.cybr.com/api/v2/labs/{labId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.cybr.com/api/v2/labs/{labId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.cybr.com/api/v2/labs/{labId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.cybr.com/api/v2/labs/{labId}")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cybr.com/api/v2/labs/{labId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "lab_id",
"name": "Example lab",
"slug": "example-lab",
"description": "An isolated exercise.",
"provider": "aws",
"timeLimit": 30,
"estimatedLaunchSeconds": 120,
"ctf": true,
"free": true,
"createdAt": "2026-01-01T00:00:00Z",
"updatedAt": "2026-01-01T00:00:00Z",
"bannerUrl": null,
"webTerminal": true,
"guide": null,
"resources": null,
"diagrams": [],
"videos": [],
"writeups": [],
"completed": false
}{
"message": "<string>",
"retryAfter": 123,
"activeCount": 123,
"limit": 123,
"errors": [
"<string>"
]
}{
"message": "<string>",
"retryAfter": 123,
"activeCount": 123,
"limit": 123,
"errors": [
"<string>"
]
}{
"message": "<string>",
"retryAfter": 123,
"activeCount": 123,
"limit": 123,
"errors": [
"<string>"
]
}{
"message": "<string>",
"retryAfter": 123,
"activeCount": 123,
"limit": 123,
"errors": [
"<string>"
]
}{
"message": "<string>",
"retryAfter": 123,
"activeCount": 123,
"limit": 123,
"errors": [
"<string>"
]
}{
"message": "<string>",
"retryAfter": 123,
"activeCount": 123,
"limit": 123,
"errors": [
"<string>"
]
}SDK:
labs.get(labId, { learnerId }).Authorizations
Path Parameters
Query Parameters
Response
Successful response.
Available options:
aws, azure Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Was this page helpful?
