Approve or deny an access request
Approves or denies someone else’s access request. Requires member:manage. Only an interactive browser session can decide: an organization API token (Bearer elch_…) is refused with 403, however many permissions it holds, because approving an access request is a person’s decision. The session must also pass step-up reauthentication in the app; without a valid X-Step-Up-Token the call answers 428 step_up_required, and error.details names the action and resource to prove. A decision is recorded once and never re-opened, so the person recording it re-proves they are still the person holding the session. Refuses with 409 when the request has already left pending.
An admin may not decide their own request: 403, whichever decision they send and however many permissions they hold. Self-approval of a restriction request would be a self-grant, and the record would read as approved by a second person when it was not. The requesting admin keeps can_withdraw on that row instead.
Approving a restriction-reason request with resolution: "grant" (the default) lifts that restriction for the requester alone, either a whole connector or one tool on the connector a tool request names in connector_slug, by writing an access grant (who, what, approved by, when, and optionally an expiry). The requester’s own member-level rules are edited (and a block rule the approval empties is removed); where their role’s rules stand in the way, the grant is what lifts them. Role rules themselves are never edited or copied, so every other role rule, including one added later, keeps binding the requester. A tool on a connector blocked whole cannot be carved out and is not lifted. resolution: "policy" instead records the decision without writing a grant, for when the admin is fixing the underlying role or connector rule directly through the restriction APIs. If the requester has a personal rule that would need editing to open the target, an approval that lists remove_member_rules (the ids of the personal rules the caller confirms editing) must list exactly the conflicting ids, or the call answers 409 member_rule_conflict naming them in error.details.member_rule_conflicts. Omitting remove_member_rules skips that check and edits the personal rules without confirmation, for clients that predate the field. expires_at (ISO, in the future, at most about 10 years out; any UTC offset is accepted and stored as UTC) sets when a grant expires; omit it or send null for no expiry. will_lift_restriction on the admin view previews whether approving will change anything. For a fork blocked through its original (in the requester’s role or in their own rules), approving opens that fork for that person only and lifts_inherited_restriction says so: the original stays restricted for them, the grant is audited with lifted_inherited_restriction: true, and revoking it re-blocks the fork. Every other approval (a permission-reason request, or a tool request with no connector_slug) records a decision only; widening access there is a separate act through PATCH /member/{userId} or the restriction APIs.
Request
- Base URL: https://api.elaichi.ai
- URL: https://api.elaichi.ai/access-request/{id}/resolve
- Auth: HTTP bearer
Path parameters
Access request id (areq_…).
Headers
Target organization (org_…). Required for cookie/session auth on org-scoped routes; optional for API tokens, which carry their organization, and rejected when it names a different one.
Request body
Response
Resolved (admin view, can_resolve: false)
Changes
No recorded changes to this operation across all 1 revision of this API.