import requests
url = "https://platform.ankra.app/api/v1/org/decisions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://platform.ankra.app/api/v1/org/decisions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));curl --request GET \
--url https://platform.ankra.app/api/v1/org/decisions \
--header 'Authorization: Bearer <token>'{
"proposals": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"area": "security",
"kind": "<string>",
"subject": {},
"summary": "<string>",
"plan": {},
"plan_hash": "<string>",
"evidence": {},
"status": "proposed",
"source": "<string>",
"created_by": "<string>",
"decided_by": "<string>",
"decided_at": "2023-11-07T05:31:56Z",
"approved_at": "2023-11-07T05:31:56Z",
"decision_note": "<string>",
"operation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"receipt": {
"steps": [
{
"name": "<string>",
"outcome": "dispatched",
"detail": "<string>",
"evidence": {}
}
],
"claimed_at": "2023-11-07T05:31:56Z",
"executed_by": "<string>",
"dispatched_at": "2023-11-07T05:31:56Z",
"operation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"completed_at": "2023-11-07T05:31:56Z",
"execution_status": "<string>",
"verification_hours_off": {}
},
"dedupe_key": "<string>",
"executable": true,
"expected_monthly_cents": 123,
"baseline_monthly_cents": 123,
"baseline_window": {
"from": "2023-11-07T05:31:56Z",
"to": "2023-11-07T05:31:56Z"
},
"measured_monthly_cents": 123,
"measured_at": "2023-11-07T05:31:56Z",
"measurement_status": "not_applicable",
"verify_until": "2023-11-07T05:31:56Z",
"subject_cluster_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"verification_status": "not_applicable",
"verification_days": [
{
"day": 123,
"from": "2023-11-07T05:31:56Z",
"to": "2023-11-07T05:31:56Z",
"state": "clear",
"cpu_p95_share": 123,
"memory_p95_share": 123,
"nodes": 123,
"reporting": 123,
"hottest_node": "<string>",
"reason": "<string>",
"hours_unknown": 123,
"hours_off": 123,
"tripped_hour": 123,
"signal": "cpu_saturation"
}
],
"rollback_of": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"parent_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"run_after": "2023-11-07T05:31:56Z",
"approval_blocked": "<string>",
"can_decide": true,
"can_run": true
}
],
"truncated": true,
"unsettled_proposal_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}{
"detail": "Cluster not found"
}{
"detail": "Cluster not found"
}{
"detail": "Cluster not found"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "Cluster not found"
}List the organisation's decision proposals
The organisation’s Security and Cost proposals inside the caller’s reach, newest first, narrowed by ?area= (security, cost) and ?status= (proposed, approved, set_aside, running, succeeded, failed, superseded); ?limit= caps the page (default 200, at most 500), and truncated says whether the cap cut it. Running proposals are settled against their platform operation before they are answered, and a cost approval whose change has not started within seven days of it, held or not, is returned to proposed (event approval_expired); a ladder between its waves counts from the wave it last verified. The reach (ADR 0022): a proposal is scoped through the project of the cluster its plan acts on (a waste_cleanup through its cloud waste finding’s own project and cluster); a token pinned to a project and a member limited to projects reach their own project only; a caller whose clusters are narrowed by clusters.read (always a member limited to projects, anyone else where RBAC is enforced) reaches those clusters only; and a proposal anchored on no cluster of the organisation - a security proposal, or one whose plan and subject name different clusters - is reached only by a caller who reaches the whole organisation. Every other route answers a proposal outside the reach with 404, as if the organisation did not hold it. Bearer-PAT twin of the browser route of the same name under /org; the console’s session cookie is not accepted here and the browser route answers a token with a login redirect.
import requests
url = "https://platform.ankra.app/api/v1/org/decisions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://platform.ankra.app/api/v1/org/decisions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));curl --request GET \
--url https://platform.ankra.app/api/v1/org/decisions \
--header 'Authorization: Bearer <token>'{
"proposals": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"area": "security",
"kind": "<string>",
"subject": {},
"summary": "<string>",
"plan": {},
"plan_hash": "<string>",
"evidence": {},
"status": "proposed",
"source": "<string>",
"created_by": "<string>",
"decided_by": "<string>",
"decided_at": "2023-11-07T05:31:56Z",
"approved_at": "2023-11-07T05:31:56Z",
"decision_note": "<string>",
"operation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"receipt": {
"steps": [
{
"name": "<string>",
"outcome": "dispatched",
"detail": "<string>",
"evidence": {}
}
],
"claimed_at": "2023-11-07T05:31:56Z",
"executed_by": "<string>",
"dispatched_at": "2023-11-07T05:31:56Z",
"operation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"completed_at": "2023-11-07T05:31:56Z",
"execution_status": "<string>",
"verification_hours_off": {}
},
"dedupe_key": "<string>",
"executable": true,
"expected_monthly_cents": 123,
"baseline_monthly_cents": 123,
"baseline_window": {
"from": "2023-11-07T05:31:56Z",
"to": "2023-11-07T05:31:56Z"
},
"measured_monthly_cents": 123,
"measured_at": "2023-11-07T05:31:56Z",
"measurement_status": "not_applicable",
"verify_until": "2023-11-07T05:31:56Z",
"subject_cluster_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"verification_status": "not_applicable",
"verification_days": [
{
"day": 123,
"from": "2023-11-07T05:31:56Z",
"to": "2023-11-07T05:31:56Z",
"state": "clear",
"cpu_p95_share": 123,
"memory_p95_share": 123,
"nodes": 123,
"reporting": 123,
"hottest_node": "<string>",
"reason": "<string>",
"hours_unknown": 123,
"hours_off": 123,
"tripped_hour": 123,
"signal": "cpu_saturation"
}
],
"rollback_of": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"parent_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"run_after": "2023-11-07T05:31:56Z",
"approval_blocked": "<string>",
"can_decide": true,
"can_run": true
}
],
"truncated": true,
"unsettled_proposal_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}{
"detail": "Cluster not found"
}{
"detail": "Cluster not found"
}{
"detail": "Cluster not found"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "Cluster not found"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
PAT organisation override.
Response
Successful response
Show child attributes
Show child attributes
Whether the ?limit= cap (default 200, at most 500) cut this page: true when the ledger held at least one more proposal matching ?area= and ?status= beyond the proposals answered, false when the proposals answered are every one matching them. Running proposals that settled out of the requested ?status= on this read are dropped from the page after the cap is applied, so a truncated page can hold fewer proposals than the cap. A client that finds the field absent is talking to an older platform and cannot tell a complete page from a cut one.
Running proposals this read could not settle against their platform operation: the execution could not be read, or its row is not visible (not yet, or pruned on retention). They are served as they stand; treat them as "could not check", not as "still running".