API ReferenceGovernance
Review Campaigns
Periodic access reviews -- managers certify their reports' access.
RPCs
| Method | Path |
|---|---|
| CreateReviewCampaign | POST /v1/governance/reviewCampaigns |
| GetReviewCampaign | GET /v1/governance/reviewCampaigns/{id} |
| ListReviewCampaigns | GET /v1/governance/reviewCampaigns |
| ListReviewItems | GET /v1/governance/reviewCampaigns/{id}/items |
| SubmitReview | POST /v1/governance/reviewItems/{id}:submit |
Base URL: https://<Domain id="api"/>
Authentication: Bearer token with governance.review:write.
Workflow
- Campaign created with a scope (filter over permissions) and deadline.
- Items generated -- one per (reviewer, target identity, permission) triple.
- Reviewers submit
approveorrevokeper item. - Revoke actions delete Keto tuples immediately;
approveis a no-op but records attestation. - Campaign reaches
completedstate once every item is resolved or the deadline passes.
Start a campaign
const res = await fetch(
"https://api-id.avnology.net/v1/governance/reviewCampaigns",
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.AVNOLOGY_API_KEY}`,
"Content-Type"
body := strings.NewReader(`{
"name": "Q2 2026 Engineering Access Review",
"scope": {"permission_namespace": "repositories"},
"deadline": "2026-05-15T00:00:00Z",
"reviewer_strategy": "MANAGER"
}`)
req, _ := http.NewRequest
import httpx, os
httpx.post(
"https://api-id.avnology.net/v1/governance/reviewCampaigns",
json={
"name": "Q2 2026 Engineering Access Review",
"scope": {"permission_namespace": "repositories"},
const res = await fetch(
"https://api-id.avnology.net/v1/governance/reviewCampaigns",
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.AVNOLOGY_API_KEY}`,
"Content-Type"
body := strings.NewReader(`{
"name": "Q2 2026 Engineering Access Review",
"scope": {"permission_namespace": "repositories"},
"deadline": "2026-05-15T00:00:00Z",
"reviewer_strategy": "MANAGER"
}`)
req, _ := http.NewRequest
import httpx, os
httpx.post(
"https://api-id.avnology.net/v1/governance/reviewCampaigns",
json={
"name": "Q2 2026 Engineering Access Review",
"scope": {"permission_namespace": "repositories"},
const res = await fetch(
"https://api-id.avnology.net/v1/governance/reviewCampaigns",
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.AVNOLOGY_API_KEY}`,
"Content-Type"
body := strings.NewReader(`{
"name": "Q2 2026 Engineering Access Review",
"scope": {"permission_namespace": "repositories"},
"deadline": "2026-05-15T00:00:00Z",
"reviewer_strategy": "MANAGER"
}`)
req, _ := http.NewRequest
import httpx, os
httpx.post(
"https://api-id.avnology.net/v1/governance/reviewCampaigns",
json={
"name": "Q2 2026 Engineering Access Review",
"scope": {"permission_namespace": "repositories"},
const res = await fetch(
"https://api-id.avnology.net/v1/governance/reviewCampaigns",
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.AVNOLOGY_API_KEY}`,
"Content-Type"
body := strings.NewReader(`{
"name": "Q2 2026 Engineering Access Review",
"scope": {"permission_namespace": "repositories"},
"deadline": "2026-05-15T00:00:00Z",
"reviewer_strategy": "MANAGER"
}`)
req, _ := http.NewRequest
import httpx, os
httpx.post(
"https://api-id.avnology.net/v1/governance/reviewCampaigns",
json={
"name": "Q2 2026 Engineering Access Review",
"scope": {"permission_namespace": "repositories"},
Submit a review item
POST /v1/governance/reviewItems/{id}:submit{ "decision": "REVOKE", "note": "No longer on the backend team" }Valid decision values: APPROVE, REVOKE, MODIFY (reduces scope).