Record an operational evidence review
Platform operators in the designated internal operations workspace only. Records an attestation, never a live action or production verification.
curl --request POST \
--url https://api.sempera.org/v1/operational-reviews \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"issue": "<string>",
"resource": "<string>",
"evidence_date": "2023-12-25",
"owner": "<string>",
"source_sha": "<string>",
"deployment_sha": "<string>",
"ci_run": "<string>",
"evidence_ref": "<string>",
"acceptance_ref": "<string>"
}
'import requests
url = "https://api.sempera.org/v1/operational-reviews"
payload = {
"issue": "<string>",
"resource": "<string>",
"evidence_date": "2023-12-25",
"owner": "<string>",
"source_sha": "<string>",
"deployment_sha": "<string>",
"ci_run": "<string>",
"evidence_ref": "<string>",
"acceptance_ref": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
issue: '<string>',
resource: '<string>',
evidence_date: '2023-12-25',
owner: '<string>',
source_sha: '<string>',
deployment_sha: '<string>',
ci_run: '<string>',
evidence_ref: '<string>',
acceptance_ref: '<string>'
})
};
fetch('https://api.sempera.org/v1/operational-reviews', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"issue": "<string>",
"kind": "provider",
"resource": "<string>",
"evidence_date": "2023-12-25",
"state": "planned",
"owner": "<string>",
"next_action": "read-production",
"blocker": "none",
"source_sha": "<string>",
"deployment_sha": "<string>",
"ci_run": "<string>",
"evidence_ref": "<string>",
"acceptance_ref": "<string>",
"outcome": "pass",
"reviewed_at": "2023-11-07T05:31:56Z",
"due_date": "2023-12-25",
"overdue": true,
"attestation_only": true,
"receipt_id": "<string>"
}{
"error": {
"code": "AGENT_ENV_UNPINNED",
"message": "<string>",
"request_id": "<string>",
"field": "<string>",
"scope": "<string>",
"reason": "<string>"
}
}{
"error": {
"code": "AGENT_ENV_UNPINNED",
"message": "<string>",
"request_id": "<string>",
"field": "<string>",
"scope": "<string>",
"reason": "<string>"
}
}{
"error": {
"code": "AGENT_ENV_UNPINNED",
"message": "<string>",
"request_id": "<string>",
"field": "<string>",
"scope": "<string>",
"reason": "<string>"
}
}{
"error": {
"code": "AGENT_ENV_UNPINNED",
"message": "<string>",
"request_id": "<string>",
"field": "<string>",
"scope": "<string>",
"reason": "<string>"
}
}{
"error": {
"code": "AGENT_ENV_UNPINNED",
"message": "<string>",
"request_id": "<string>",
"field": "<string>",
"scope": "<string>",
"reason": "<string>"
}
}{
"error": {
"code": "AGENT_ENV_UNPINNED",
"message": "<string>",
"request_id": "<string>",
"field": "<string>",
"scope": "<string>",
"reason": "<string>"
}
}{
"error": {
"code": "AGENT_ENV_UNPINNED",
"message": "<string>",
"request_id": "<string>",
"field": "<string>",
"scope": "<string>",
"reason": "<string>"
}
}Authorizations
A workspace API key, sent as Authorization: Bearer sempera_sk_... Each operation names the one scope it needs. Scopes, key kinds and roles are in the Authentication guide.
Body
^SEM-[1-9][0-9]{0,6}$provider, weekly, monthly, credential Plain handle, or an existing non-secret credential registry name.
80Non-future UTC date.
planned, source-built, merged, deployed, production-verified ^[a-z][a-z0-9-]{1,31}$read-production, read-provider, reconcile-linear, reconcile-cogs, owner-review, rotate-credential, review-scope, offboard-access, recovery-drill, verify-delivery, review-next-window none, production-proof, account-access, owner-decision, finance, legal, delivery, acceptance ^[0-9a-f]{40}$^[0-9a-f]{40}$^[1-9][0-9]{0,19}$400Canonical issue URL matching issue. Built states need source_sha and evidence_ref; deployed states also need deployment_sha. Production-verified requires matching SHAs, ci_run and outcome=pass.
400pass, fail, unknown Response
Recorded and read back
^SEM-[1-9][0-9]{0,6}$provider, weekly, monthly, credential Plain handle, or an existing non-secret credential registry name.
80Non-future UTC date.
planned, source-built, merged, deployed, production-verified ^[a-z][a-z0-9-]{1,31}$read-production, read-provider, reconcile-linear, reconcile-cogs, owner-review, rotate-credential, review-scope, offboard-access, recovery-drill, verify-delivery, review-next-window none, production-proof, account-access, owner-decision, finance, legal, delivery, acceptance ^[0-9a-f]{40}$^[0-9a-f]{40}$^[1-9][0-9]{0,19}$400Canonical issue URL matching issue. Built states need source_sha and evidence_ref; deployed states also need deployment_sha. Production-verified requires matching SHAs, ci_run and outcome=pass.
400pass, fail, unknown curl --request POST \
--url https://api.sempera.org/v1/operational-reviews \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"issue": "<string>",
"resource": "<string>",
"evidence_date": "2023-12-25",
"owner": "<string>",
"source_sha": "<string>",
"deployment_sha": "<string>",
"ci_run": "<string>",
"evidence_ref": "<string>",
"acceptance_ref": "<string>"
}
'import requests
url = "https://api.sempera.org/v1/operational-reviews"
payload = {
"issue": "<string>",
"resource": "<string>",
"evidence_date": "2023-12-25",
"owner": "<string>",
"source_sha": "<string>",
"deployment_sha": "<string>",
"ci_run": "<string>",
"evidence_ref": "<string>",
"acceptance_ref": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
issue: '<string>',
resource: '<string>',
evidence_date: '2023-12-25',
owner: '<string>',
source_sha: '<string>',
deployment_sha: '<string>',
ci_run: '<string>',
evidence_ref: '<string>',
acceptance_ref: '<string>'
})
};
fetch('https://api.sempera.org/v1/operational-reviews', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"issue": "<string>",
"kind": "provider",
"resource": "<string>",
"evidence_date": "2023-12-25",
"state": "planned",
"owner": "<string>",
"next_action": "read-production",
"blocker": "none",
"source_sha": "<string>",
"deployment_sha": "<string>",
"ci_run": "<string>",
"evidence_ref": "<string>",
"acceptance_ref": "<string>",
"outcome": "pass",
"reviewed_at": "2023-11-07T05:31:56Z",
"due_date": "2023-12-25",
"overdue": true,
"attestation_only": true,
"receipt_id": "<string>"
}{
"error": {
"code": "AGENT_ENV_UNPINNED",
"message": "<string>",
"request_id": "<string>",
"field": "<string>",
"scope": "<string>",
"reason": "<string>"
}
}{
"error": {
"code": "AGENT_ENV_UNPINNED",
"message": "<string>",
"request_id": "<string>",
"field": "<string>",
"scope": "<string>",
"reason": "<string>"
}
}{
"error": {
"code": "AGENT_ENV_UNPINNED",
"message": "<string>",
"request_id": "<string>",
"field": "<string>",
"scope": "<string>",
"reason": "<string>"
}
}{
"error": {
"code": "AGENT_ENV_UNPINNED",
"message": "<string>",
"request_id": "<string>",
"field": "<string>",
"scope": "<string>",
"reason": "<string>"
}
}{
"error": {
"code": "AGENT_ENV_UNPINNED",
"message": "<string>",
"request_id": "<string>",
"field": "<string>",
"scope": "<string>",
"reason": "<string>"
}
}{
"error": {
"code": "AGENT_ENV_UNPINNED",
"message": "<string>",
"request_id": "<string>",
"field": "<string>",
"scope": "<string>",
"reason": "<string>"
}
}{
"error": {
"code": "AGENT_ENV_UNPINNED",
"message": "<string>",
"request_id": "<string>",
"field": "<string>",
"scope": "<string>",
"reason": "<string>"
}
}