generated: '2026-08-16' method: generated source: openapi/frayt-match-estimates-openapi.yml, openapi/frayt-matches-openapi.yml, openapi/frayt-oauth-openapi.yml 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/. x-apievangelist-review: reviewed: '2026-08-16' by: enrichment pipeline (human-readable curation note, classifications left unmodified) note: >- The heuristic classifier raised every write operation on this API to consequence "safety-critical" because the FRAYT vocabulary is dense with dispatch/delivery keywords. Two of those are over-classified against what the operations actually do, and an implementer should downgrade them before use: (1) POST /api/v2.2/matches/estimate only PRICES a delivery — it books nothing, charges nothing and dispatches nobody, so it is effectively a read; (2) POST /api/v2.2/oauth/token is a credential exchange, not a physical action. The genuinely consequential operations are POST /api/v2.2/matches and PATCH /api/v2.2/matches/estimate/{id} (both dispatch a real driver), DELETE /api/v2.2/matches/{id} (irreversible, up to 50% cancellation charge per FRAYT's EULA), and PATCH /api/v2.2/matches/{match_id}/stops/{stop_id} (a monetary tip change). Those four are correctly flagged. Note also that FRAYT supports no idempotency key, which raises the real risk of every write here: a retry is a duplicate dispatch. See conventions/frayt-conventions.yml. summary: operations: 8 by_action_class: acting: 7 connected: 1 by_consequence: safety-critical: 7 read: 1 human_in_the_loop_required: 7 operations: - path: /api/v2.2/matches/estimate method: post operationId: FraytElixirWeb.API.V2x2.MatchEstimateController.create 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: /api/v2.2/matches/estimate/{id} method: patch operationId: FraytElixirWeb.API.V2x2.MatchEstimateController.update 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: /api/v2.2/matches method: post operationId: FraytElixirWeb.API.V2x2.MatchController.create 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: /api/v2.2/matches/{id} method: delete operationId: FraytElixirWeb.API.V2x2.MatchController.delete 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: /api/v2.2/matches/{id} method: get operationId: FraytElixirWeb.API.V2x2.MatchController.show x-agentic-access: action-class: connected consequence: read subject: optional token: max-ttl: 3600 audit: none - path: /api/v2.2/matches/{id} method: patch operationId: FraytElixirWeb.API.V2x2.MatchController.update 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: /api/v2.2/matches/{match_id}/stops/{stop_id} method: patch operationId: FraytElixirWeb.API.V2x2.MatchStopController.update 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: /api/v2.2/oauth/token method: post operationId: FraytElixirWeb.API.OauthController.authenticate 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