curl --request GET \
--url https://api.leen.dev/v1/grc/controls \
--header 'X-API-KEY: <api-key>' \
--header 'X-CONNECTION-ID: <api-key>'import requests
url = "https://api.leen.dev/v1/grc/controls"
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/grc/controls', 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/grc/controls",
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/grc/controls"
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/grc/controls")
.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/grc/controls")
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_objective": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"status": "NEW",
"vendor_attributes": {
"id": "<string>",
"vendor": "<string>",
"data": {}
},
"category": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"description": "<string>",
"entity": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"type": "<string>",
"vendor_attributes": {
"id": "<string>",
"vendor": "<string>",
"data": {}
},
"created_at": "2023-11-07T05:31:56Z",
"description": "<string>",
"updated_at": "2023-11-07T05:31:56Z"
},
"template_id": "<string>",
"type": "<string>",
"updated_at": "2023-11-07T05:31:56Z"
}
],
"next_cursor": "<string>",
"previous_cursor": "<string>"
}{
"detail": "<string>"
}List GRC Controls
List all GRC controls for a given connection.
curl --request GET \
--url https://api.leen.dev/v1/grc/controls \
--header 'X-API-KEY: <api-key>' \
--header 'X-CONNECTION-ID: <api-key>'import requests
url = "https://api.leen.dev/v1/grc/controls"
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/grc/controls', 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/grc/controls",
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/grc/controls"
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/grc/controls")
.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/grc/controls")
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_objective": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"status": "NEW",
"vendor_attributes": {
"id": "<string>",
"vendor": "<string>",
"data": {}
},
"category": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"description": "<string>",
"entity": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"type": "<string>",
"vendor_attributes": {
"id": "<string>",
"vendor": "<string>",
"data": {}
},
"created_at": "2023-11-07T05:31:56Z",
"description": "<string>",
"updated_at": "2023-11-07T05:31:56Z"
},
"template_id": "<string>",
"type": "<string>",
"updated_at": "2023-11-07T05:31:56Z"
}
],
"next_cursor": "<string>",
"previous_cursor": "<string>"
}{
"detail": "<string>"
}Query Parameters
Sort by a field, written as field, field:asc or field:desc. Which fields can be sorted on differs per endpoint.
^name$|^name\:asc$|^name\:desc$|^type$|^type\:asc$|^type\:desc$|^category$|^category\:asc$|^category\:desc$|^status$|^status\:asc$|^status\:desc$|^updated_at$|^updated_at\:asc$|^updated_at\:desc$|^created_at$|^created_at\:asc$|^created_at\:desc$Only records whose updated_at is at or after this time. Leen bumps updated_at whenever any field on a record changes, so this is the filter for an incremental sync: it returns records that are new and records that changed, and nothing that has stood still. 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 <= 500Filter controls by name with partial matching
Filter controls by type (comma-separated values supported)
Filter controls by category (comma-separated values supported)
Filter controls by status (comma-separated values supported)
Filter controls by associated entity ID
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.