> ## Documentation Index
> Fetch the complete documentation index at: https://docs.parmanasystems.com/llms.txt
> Use this file to discover all available pages before exploring further.

# parmana.api.approver_api

Parmana Approver API.

Approvers managed without a deploy: list the keys trusted to sign
approvals, propose adding or revoking one, and approve or reject a proposal
with a signed step up authorization. Every call needs an API key that
belongs to a verified human.

## ApproverApi Objects

```python theme={null}
class ApproverApi()
```

Approver API.

#### list

```python theme={null}
def list() -> list[ApprovalIssuer]
```

Every approver key the server trusts or trusted, revoked ones marked.

Maps to GET /approval-issuers.

#### propose\_add

```python theme={null}
def propose_add(*, approver_id: str, key_id: str, public_key_pem: str,
                reason: str) -> ApprovalIssuerChange
```

Propose trusting a new approver key.

Maps to POST /approval-issuers/changes with action "add".
`public_key_pem` is the .public.pem file
scripts/generate-approver-key.ts writes. Nothing changes until a
different person approves it.

#### propose\_revoke

```python theme={null}
def propose_revoke(*, approver_id: str, key_id: str,
                   reason: str) -> ApprovalIssuerChange
```

Propose revoking an approver key added through approver changes.

Maps to POST /approval-issuers/changes with action "revoke". Once
approved, every approval the key ever signed is refused.

#### list\_changes

```python theme={null}
def list_changes(
        status: str | None = None) -> builtins.list[ApprovalIssuerChange]
```

List approver changes, newest first.

Maps to GET /approval-issuers/changes.

## Parameters

status:
"PENDING\_APPROVAL", "APPROVED" or "REJECTED". Omit for all.

#### approve\_change

```python theme={null}
def approve_change(
        change_id: str,
        step_up_authorization: dict[str, Any]) -> ApprovalIssuerChange
```

Approve and apply an approver change.

Maps to POST /approval-issuers/changes/\{id}/approve. The caller must
not be the proposer and must have a registered step up key. Make
`step_up_authorization` with
`parmana.crypto.sign_policy_change_step_up()`, `change_id` as
`pending_policy_change_id`, and action "approve".

#### reject\_change

```python theme={null}
def reject_change(
        change_id: str, rejection_reason: str,
        step_up_authorization: dict[str, Any]) -> ApprovalIssuerChange
```

Reject an approver change.

Maps to POST /approval-issuers/changes/\{id}/reject. Same caller rules
as `approve_change()`; sign with action "reject".
