curl --request GET \
--url https://api.leen.dev/v1/cspm/compliance \
--header 'X-API-KEY: <api-key>' \
--header 'X-CONNECTION-ID: <api-key>'import requests
url = "https://api.leen.dev/v1/cspm/compliance"
headers = {
"X-API-KEY": "<api-key>",
"X-CONNECTION-ID": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'X-API-KEY': '<api-key>', 'X-CONNECTION-ID': '<api-key>'}
};
fetch('https://api.leen.dev/v1/cspm/compliance', 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.leen.dev/v1/cspm/compliance",
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>",
"X-CONNECTION-ID: <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.leen.dev/v1/cspm/compliance"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-KEY", "<api-key>")
req.Header.Add("X-CONNECTION-ID", "<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.leen.dev/v1/cspm/compliance")
.header("X-API-KEY", "<api-key>")
.header("X-CONNECTION-ID", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.leen.dev/v1/cspm/compliance")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-KEY"] = '<api-key>'
request["X-CONNECTION-ID"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"items": [
{
"control": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"is_enabled": true,
"requirements": [
"<string>"
],
"standard": "<string>",
"status": "<string>",
"status_changed_at": "2023-11-07T05:31:56Z",
"vendor": "<string>",
"vendor_id": "<string>",
"vendor_status": "<string>",
"findings": [
{
"description": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"remediation": "<string>",
"severity": "<string>",
"start_time": "2023-11-07T05:31:56Z",
"status": "<string>",
"status_changed_at": "2023-11-07T05:31:56Z",
"title": "<string>",
"vendor_id": "<string>",
"vendor_severity": "<string>",
"vendor_status": "<string>",
"resource_id": "<string>",
"resource_name": "<string>",
"resource_region": "<string>",
"resource_type": "<string>"
}
],
"vendor_data": {}
}
],
"next_cursor": "<string>",
"previous_cursor": "<string>"
}{
"code": "<string>",
"detail": [
{}
],
"message": "<string>",
"type": "<string>"
}List Compliance Data with Conditional Findings
Retrieve compliance frameworks and their controls, each with the findings that determine whether the control passes.
curl --request GET \
--url https://api.leen.dev/v1/cspm/compliance \
--header 'X-API-KEY: <api-key>' \
--header 'X-CONNECTION-ID: <api-key>'import requests
url = "https://api.leen.dev/v1/cspm/compliance"
headers = {
"X-API-KEY": "<api-key>",
"X-CONNECTION-ID": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'X-API-KEY': '<api-key>', 'X-CONNECTION-ID': '<api-key>'}
};
fetch('https://api.leen.dev/v1/cspm/compliance', 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.leen.dev/v1/cspm/compliance",
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>",
"X-CONNECTION-ID: <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.leen.dev/v1/cspm/compliance"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-KEY", "<api-key>")
req.Header.Add("X-CONNECTION-ID", "<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.leen.dev/v1/cspm/compliance")
.header("X-API-KEY", "<api-key>")
.header("X-CONNECTION-ID", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.leen.dev/v1/cspm/compliance")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-KEY"] = '<api-key>'
request["X-CONNECTION-ID"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"items": [
{
"control": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"is_enabled": true,
"requirements": [
"<string>"
],
"standard": "<string>",
"status": "<string>",
"status_changed_at": "2023-11-07T05:31:56Z",
"vendor": "<string>",
"vendor_id": "<string>",
"vendor_status": "<string>",
"findings": [
{
"description": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"remediation": "<string>",
"severity": "<string>",
"start_time": "2023-11-07T05:31:56Z",
"status": "<string>",
"status_changed_at": "2023-11-07T05:31:56Z",
"title": "<string>",
"vendor_id": "<string>",
"vendor_severity": "<string>",
"vendor_status": "<string>",
"resource_id": "<string>",
"resource_name": "<string>",
"resource_region": "<string>",
"resource_type": "<string>"
}
],
"vendor_data": {}
}
],
"next_cursor": "<string>",
"previous_cursor": "<string>"
}{
"code": "<string>",
"detail": [
{}
],
"message": "<string>",
"type": "<string>"
}Query Parameters
Only controls whose updated_at is at or after this time. Leen bumps updated_at whenever any field changes, so this is the incremental-sync filter. Example: 2021-01-01T00:00:00+00:00.
"2021-01-01T00:00:00+00:00"
Opaque position of the next page, taken from the previous response. Ignore its contents; it encodes where the walk had reached.
How many records to return per page. The walk is the same either way; a larger page means fewer round trips and more memory per response.
1 <= x <= 500Include findings data (only for FAIL status compliances)
Filter by one or more compliance status. Valid values: PASS, FAIL, NOT_APPLICABLE, DELETED
"PASS, FAIL"
Filter by one or more standard (partial match, case insensitive)
"AWS Best Practices, CIS"
Response
Successful Response
The records on this page.
Show child attributes
Show child attributes
Opaque position of the next page. Pass it back as cursor to continue; null when this is the last page.
Opaque position of the previous page, for walking backwards. Null on the first page.