Obol · Agentic Access

Obol Agentic Access

x-agentic-access generated

Obol exposes 71 API operations that an AI agent could call, of which 18 are state-changing ‘acting’ operations. This is a recommended x-agentic-access execution contract — the scope, audience, consequence tier, short-lived token constraints, and escalation each action should carry before it is handed to an autonomous agent.

By consequence: 53 read and 18 safety-critical.

18 operations are classed safety-critical and should require human-in-the-loop approval at runtime.

Contracts are classified heuristically from the provider’s OpenAPI and refresh on every APIs.io network build; audience is bound per deployment. The model follows Curity’s Access Intelligence (apidays Munich 2026). Browse every provider’s agent contracts at agentic-access.apis.io.

CompanyCryptoEthereumStakingDistributed ValidatorsBlockchain InfrastructureWeb3
Operations: 71 Acting: 18 Human-in-the-loop: 18 Method: generated

By consequence

read 53 safety-critical 18

Highest-consequence actions

The physical and safety-critical operations an agent could invoke — the ones that most warrant scoped tokens, tight TTLs, and escalation. Full per-operation contracts are in the source below.

MethodPathConsequenceHuman-in-loop
POST /deposit_data/partial_deposits/{lockHash}/{share_index} safety-critical required
POST /exp/partial_exits/{lockHash} safety-critical required
POST /fee_recipient/partial/{lockHash}/{shareIdx} safety-critical required
POST /fee_recipient/{lockHash} safety-critical required
POST /lock safety-critical required
POST /lock/verify safety-critical required
POST /positions/{network}/{address} safety-critical required
POST /v1/definition safety-critical required
PUT /v1/definition/{configHash} safety-critical required
POST /v1/deposit_data/partial_deposits/{lockHash}/{share_index} safety-critical required
POST /v1/exp/partial_exits/{lockHash} safety-critical required
POST /v1/fee_recipient/partial/{lockHash}/{shareIdx} safety-critical required
POST /v1/fee_recipient/{lockHash} safety-critical required
POST /v1/lock safety-critical required
POST /v1/lock/verify safety-critical required
POST /v1/positions/{network}/{address} safety-critical required
POST /v1/termsAndConditions safety-critical required
POST /v1/test safety-critical required

Source

Agentic Access

Raw ↑
generated: '2026-07-20'
method: generated
source: openapi/obol-openapi-original.json
description: Recommended x-agentic-access execution contracts, classified heuristically from
  the OpenAPI. A governance starting point for exposing this API to AI agents — review and bind
  audience per deployment. See research/curity/agentic-governance/.
summary:
  operations: 71
  by_action_class:
    connected: 53
    acting: 18
  by_consequence:
    read: 53
    safety-critical: 18
  human_in_the_loop_required: 18
operations:
- path: /
  method: get
  operationId: AppController_redirect
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/_health
  method: get
  operationId: HealthController_check_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /metrics
  method: get
  operationId: MetricsController_metrics
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/definition/{configHash}
  method: get
  operationId: DefinitionController_getClusterDefinition_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/definition/{configHash}
  method: put
  operationId: DefinitionController_updateClusterDefinition_v1
  x-agentic-access:
    action-class: acting
    consequence: safety-critical
    subject: required
    audience: null
    token:
      max-ttl: 120
      exchange: true
      purpose-required: true
      proof-of-possession: true
    escalation:
      human-in-the-loop: required
    audit: required
- path: /v1/definition/operator
  method: get
  operationId: DefinitionController_getClusterDefinitionWithOperator[0]_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/definition/operator/{address}
  method: get
  operationId: DefinitionController_getClusterDefinitionWithOperator[1]_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/definition
  method: post
  operationId: DefinitionController_postClusterDefinition_v1
  x-agentic-access:
    action-class: acting
    consequence: safety-critical
    subject: required
    audience: null
    token:
      max-ttl: 120
      exchange: true
      purpose-required: true
      proof-of-possession: true
    escalation:
      human-in-the-loop: required
    audit: required
- path: /lock/{lockHash}
  method: get
  operationId: LockController_getClusterLock[0]
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/lock/{lockHash}
  method: get
  operationId: LockController_getClusterLock[1]_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /lock/search/{network}
  method: get
  operationId: LockController_searchClusterLocks[0]
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/lock/search/{network}
  method: get
  operationId: LockController_searchClusterLocks[1]_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /lock/configHash/{configHash}
  method: get
  operationId: LockController_getLockByConfigHash[0]
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/lock/configHash/{configHash}
  method: get
  operationId: LockController_getLockByConfigHash[1]_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /lock/{lockHash}/launchpad
  method: get
  operationId: LockController_redirectToClusterStatus[0]
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/lock/{lockHash}/launchpad
  method: get
  operationId: LockController_redirectToClusterStatus[1]_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /lock/{lockHash}/peer-scores
  method: get
  operationId: LockController_getAveragePeerScores[0]
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/lock/{lockHash}/peer-scores
  method: get
  operationId: LockController_getAveragePeerScores[1]_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /lock/operator
  method: get
  operationId: LockController_getClusterLocksByOperator[0]
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /lock/operator/{address}
  method: get
  operationId: LockController_getClusterLocksByOperator[1]
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/lock/operator
  method: get
  operationId: LockController_getClusterLocksByOperator[2]_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/lock/operator/{address}
  method: get
  operationId: LockController_getClusterLocksByOperator[3]_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /lock/network/{network}
  method: get
  operationId: LockController_getClusterLocksByNetwork[0]
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/lock/network/{network}
  method: get
  operationId: LockController_getClusterLocksByNetwork[1]_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /lock/network/summary/{network}
  method: get
  operationId: LockController_getClusterLockNetworkSummary[0]
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/lock/network/summary/{network}
  method: get
  operationId: LockController_getClusterLockNetworkSummary[1]_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /lock
  method: post
  operationId: LockController_postClusterLock[0]
  x-agentic-access:
    action-class: acting
    consequence: safety-critical
    subject: required
    audience: null
    token:
      max-ttl: 120
      exchange: true
      purpose-required: true
      proof-of-possession: true
    escalation:
      human-in-the-loop: required
    audit: required
- path: /v1/lock
  method: post
  operationId: LockController_postClusterLock[1]_v1
  x-agentic-access:
    action-class: acting
    consequence: safety-critical
    subject: required
    audience: null
    token:
      max-ttl: 120
      exchange: true
      purpose-required: true
      proof-of-possession: true
    escalation:
      human-in-the-loop: required
    audit: required
- path: /lock/verify
  method: post
  operationId: LockController_verifyClusterLock[0]
  x-agentic-access:
    action-class: acting
    consequence: safety-critical
    subject: required
    audience: null
    token:
      max-ttl: 120
      exchange: true
      purpose-required: true
      proof-of-possession: true
    escalation:
      human-in-the-loop: required
    audit: required
- path: /v1/lock/verify
  method: post
  operationId: LockController_verifyClusterLock[1]_v1
  x-agentic-access:
    action-class: acting
    consequence: safety-critical
    subject: required
    audience: null
    token:
      max-ttl: 120
      exchange: true
      purpose-required: true
      proof-of-possession: true
    escalation:
      human-in-the-loop: required
    audit: required
- path: /v1/state/{lockHash}
  method: get
  operationId: StateController_getDistributedValidatorStatesByLockHash_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /exp/exit/status/summary/{lockHash}
  method: get
  operationId: ExitController_getClusterExitStatusSummary[0]
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/exp/exit/status/summary/{lockHash}
  method: get
  operationId: ExitController_getClusterExitStatusSummary[1]_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /exp/exit/status/{lockHash}
  method: get
  operationId: ExitController_getClusterExitStatus[0]
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/exp/exit/status/{lockHash}
  method: get
  operationId: ExitController_getClusterExitStatus[1]_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /exp/exit/{lockHash}/{shareIdx}/{validatorPubkey}
  method: get
  operationId: ExitController_getClusterExit[0]
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/exp/exit/{lockHash}/{shareIdx}/{validatorPubkey}
  method: get
  operationId: ExitController_getClusterExit[1]_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /exp/partial_exits/{lockHash}
  method: post
  operationId: ExitController_postPartialExit[0]
  x-agentic-access:
    action-class: acting
    consequence: safety-critical
    subject: required
    audience: null
    token:
      max-ttl: 120
      exchange: true
      purpose-required: true
      proof-of-possession: true
    escalation:
      human-in-the-loop: required
    audit: required
- path: /v1/exp/partial_exits/{lockHash}
  method: post
  operationId: ExitController_postPartialExit[1]_v1
  x-agentic-access:
    action-class: acting
    consequence: safety-critical
    subject: required
    audience: null
    token:
      max-ttl: 120
      exchange: true
      purpose-required: true
      proof-of-possession: true
    escalation:
      human-in-the-loop: required
    audit: required
- path: /v1/effectiveness/{lockHash}
  method: get
  operationId: EffectivenessController_getClusterLock_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/termsAndConditions
  method: post
  operationId: TermsAndConditionsController_signTermsAndConditions_v1
  x-agentic-access:
    action-class: acting
    consequence: safety-critical
    subject: required
    audience: null
    token:
      max-ttl: 120
      exchange: true
      purpose-required: true
      proof-of-possession: true
    escalation:
      human-in-the-loop: required
    audit: required
- path: /v1/termsAndConditions/{address}
  method: get
  operationId: TermsAndConditionsController_getTermsAndConditionsSigned_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/techne/base/{index}
  method: get
  operationId: TechneController_getBaseCred_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/techne/bronze/{index}
  method: get
  operationId: TechneController_getBronzeCred_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/techne/silver/{index}
  method: get
  operationId: TechneController_getSilverCred_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/techne/gold/{index}
  method: get
  operationId: TechneController_getGoldCred_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/address/techne/{address}
  method: get
  operationId: AddressController_getAddressTechneCredentials_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/address/badges/{address}
  method: get
  operationId: AddressController_getAddressBadgess_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/address/incentives/{network}/{address}
  method: get
  operationId: AddressController_getAddressIncentives_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/address/incentives/historical/{network}/{address}
  method: get
  operationId: AddressController_getHistoricalAddressContributions_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/address/network/{network}
  method: get
  operationId: AddressController_getOperatorsByNetwork_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/address/search/{network}
  method: get
  operationId: AddressController_searchOperators_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/address/migrateable-validators/{network}/{withdrawalAddress}
  method: get
  operationId: AddressController_getMigrateableValidators_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/owr/{network}/{address}
  method: get
  operationId: OWRController_get_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/migrate/{network}
  method: get
  operationId: MigrateController_getValidatorsMigrateStatus_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/test
  method: post
  operationId: TestController_postTestResult_v1
  x-agentic-access:
    action-class: acting
    consequence: safety-critical
    subject: required
    audience: null
    token:
      max-ttl: 120
      exchange: true
      purpose-required: true
      proof-of-possession: true
    escalation:
      human-in-the-loop: required
    audit: required
- path: /v1/test/enr/{enr}
  method: get
  operationId: TestController_getTestResultByEnr_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /deposit_data/{lockHash}/{pubkey}
  method: get
  operationId: DepositController_getDeposits[0]
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/deposit_data/{lockHash}/{pubkey}
  method: get
  operationId: DepositController_getDeposits[1]_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /deposit_data/partial_deposits/{lockHash}/{share_index}
  method: post
  operationId: DepositController_submitPartialDeposits[0]
  x-agentic-access:
    action-class: acting
    consequence: safety-critical
    subject: required
    audience: null
    token:
      max-ttl: 120
      exchange: true
      purpose-required: true
      proof-of-possession: true
    escalation:
      human-in-the-loop: required
    audit: required
- path: /v1/deposit_data/partial_deposits/{lockHash}/{share_index}
  method: post
  operationId: DepositController_submitPartialDeposits[1]_v1
  x-agentic-access:
    action-class: acting
    consequence: safety-critical
    subject: required
    audience: null
    token:
      max-ttl: 120
      exchange: true
      purpose-required: true
      proof-of-possession: true
    escalation:
      human-in-the-loop: required
    audit: required
- path: /fee_recipient/partial/{lockHash}/{shareIdx}
  method: post
  operationId: FeeRecipientController_postPartialFeeRecipients[0]
  x-agentic-access:
    action-class: acting
    consequence: safety-critical
    subject: required
    audience: null
    token:
      max-ttl: 120
      exchange: true
      purpose-required: true
      proof-of-possession: true
    escalation:
      human-in-the-loop: required
    audit: required
- path: /v1/fee_recipient/partial/{lockHash}/{shareIdx}
  method: post
  operationId: FeeRecipientController_postPartialFeeRecipients[1]_v1
  x-agentic-access:
    action-class: acting
    consequence: safety-critical
    subject: required
    audience: null
    token:
      max-ttl: 120
      exchange: true
      purpose-required: true
      proof-of-possession: true
    escalation:
      human-in-the-loop: required
    audit: required
- path: /fee_recipient/{lockHash}
  method: post
  operationId: FeeRecipientController_getPartialFeeRecipients[0]
  x-agentic-access:
    action-class: acting
    consequence: safety-critical
    subject: required
    audience: null
    token:
      max-ttl: 120
      exchange: true
      purpose-required: true
      proof-of-possession: true
    escalation:
      human-in-the-loop: required
    audit: required
- path: /v1/fee_recipient/{lockHash}
  method: post
  operationId: FeeRecipientController_getPartialFeeRecipients[1]_v1
  x-agentic-access:
    action-class: acting
    consequence: safety-critical
    subject: required
    audience: null
    token:
      max-ttl: 120
      exchange: true
      purpose-required: true
      proof-of-possession: true
    escalation:
      human-in-the-loop: required
    audit: required
- path: /tvs/{network}
  method: get
  operationId: TVSController_getTVS[0]
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/tvs/{network}
  method: get
  operationId: TVSController_getTVS[1]_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /positions/{network}/{address}
  method: post
  operationId: PositionsController_getPositions[0]
  x-agentic-access:
    action-class: acting
    consequence: safety-critical
    subject: required
    audience: null
    token:
      max-ttl: 120
      exchange: true
      purpose-required: true
      proof-of-possession: true
    escalation:
      human-in-the-loop: required
    audit: required
- path: /v1/positions/{network}/{address}
  method: post
  operationId: PositionsController_getPositions[1]_v1
  x-agentic-access:
    action-class: acting
    consequence: safety-critical
    subject: required
    audience: null
    token:
      max-ttl: 120
      exchange: true
      purpose-required: true
      proof-of-possession: true
    escalation:
      human-in-the-loop: required
    audit: required
- path: /eth-apr
  method: get
  operationId: EthAprController_getEthApr[0]
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none
- path: /v1/eth-apr
  method: get
  operationId: EthAprController_getEthApr[1]_v1
  x-agentic-access:
    action-class: connected
    consequence: read
    subject: optional
    token:
      max-ttl: 3600
    audit: none