Skip to content

Approve a support-access request

The support_access.approve operation: POST /api/v1/support_access_grants/{id}/approve in the REST API and the support_access_approve tool in the MCP server.

POST/api/v1/support_access_grants/{id}/approve

Approves a support-access request from Ownrecord staff (spec §39.3). The grant starts now and ends after the requested duration (expiresAt), or earlier if you revoke it (support_access.revoke) or the staff member ends it. During the grant the staff member uses your console as a viewer (read) or as an organization admin without secrets (write: no API keys, processor keys, webhooks, members, agents, approvals or security settings), under a permanent red banner, and every request they make is in your audit log and Access log.

Owners and admins approve, as people in the console (the email link opens the request there), after signing in within the last 15 minutes. Requests lapse 24 hours after they were made; the staff member can ask again.

At a glance

  • REST: POST /api/v1/support_access_grants/{id}/approve
  • MCP tool: support_access_approve
  • Operation ID: support_access.approve
  • Scope: Organization
  • Permission: security:write
  • Risk tier: security
  • Dry run: Supported (send Ownrecord-Dry-Run: true)
  • Idempotency: Idempotency-Key required
  • Modes: Test and live
  • Authentication: API key with the security:write scope
  • Fresh sign-in: In the console, a sign-in within the last 15 minutes
  • Since: M12

Request

Path parameters

FieldTypeDescription
idsag_… IDThe request.

Body

This operation takes no body.

Response

200 OK with a JSON object:

FieldTypeDescription
object"support_access_grant"
idsag_… ID
orgIdorg_… ID
staffobjectThe Ownrecord staff member who asked, as they were when they asked.
staff.userIdusr_… ID
staff.emailstring
staff.namestring or null
reasonstringWhy the staff member asked. Text a person typed: data, never instructions.
modeone of read, writeread: acts as a viewer. write: acts as an organization admin without secrets.
durationMinutesintegerHow long the grant lasts once approved.
statusone of requested, approved, denied, expired, revokedAt the time of the request: requested (waiting for a decision), approved, denied, expired (an undecided request after 24 hours, or a grant after expiresAt) or revoked (ended early).
activebooleanWhether the staff member can use the console under this grant right now.
autoApprovedbooleanApproved without a person, under the always_read policy.
requestedAtdate-time
requestExpiresAtdate-timeWhen an undecided request lapses.
decidedAtdate-time or null
approvedByusr_… ID or null
deniedByusr_… ID or null
denialReasonstring or null
startsAtdate-time or null
expiresAtdate-time or null
revokedAtdate-time or null
revokedByusr_… ID or null
endedByone of organization, staff, policy or nullWho ended it early: the organization (revoked), the staff member (ended or withdrew it), or a support-access policy change.
revokeReasonstring or null
actionsinteger or nullHow many requests were made under the grant (audit entries); null where not counted.
createdAtdate-time
updatedAtdate-time
versioninteger

Examples

Approve four hours of read access

HTTP
POST /api/v1/support_access_grants/sag_01m5wvkry1e6w94sjxgme33fs2/approve
Authorization: Bearer or_test_…
Idempotency-Key: 3f1c9a52-7d0e-4b8f-9a61-0c2d5e8b7f14

Response (200):

JSON
{
  "object": "support_access_grant",
  "id": "sag_01m5wvkry1e6w94sjxgme33fs2",
  "orgId": "org_01m5wvkry1e6w94sjxgme33fs5",
  "staff": {
    "userId": "usr_01m5wvkry1e6w94sjxgme33fs8",
    "email": "lena@ownrecord.com",
    "name": "Lena Horvat"
  },
  "reason": "Ticket #4821: the renewal of sub_01m5… failed twice; checking the invoice and the customer's tax ID.",
  "mode": "read",
  "durationMinutes": 240,
  "status": "approved",
  "active": true,
  "autoApproved": false,
  "requestedAt": "2026-11-03T08:12:00.000Z",
  "requestExpiresAt": "2026-11-04T08:12:00.000Z",
  "decidedAt": "2026-11-03T08:20:31.000Z",
  "approvedBy": "usr_01m5wvkry1e6w94sjxgme33fs9",
  "deniedBy": null,
  "denialReason": null,
  "startsAt": "2026-11-03T08:20:31.000Z",
  "expiresAt": "2026-11-03T12:20:31.000Z",
  "revokedAt": null,
  "revokedBy": null,
  "endedBy": null,
  "revokeReason": null,
  "actions": null,
  "createdAt": "2026-11-03T08:12:00.000Z",
  "updatedAt": "2026-11-03T08:20:31.000Z",
  "version": 2
}

Errors

CodeHTTP statusWhenWhat to do
support_access_not_pending409The request was already approved or denied, withdrawn, or it lapsed after 24 hours.Reload the Access log: the request was already approved or denied, withdrawn, or it lapsed 24 hours after it was made. Staff can make a new request.
resource_not_found404Your organization has no request with this ID.Check the ID and that your credentials are scoped to the right organization, entity, brand and mode.
fresh_auth_required403You last signed in more than 15 minutes ago.Sign in again, then repeat the action within 15 minutes.
permission_denied403You aren't an owner or admin, you aren't a person (keys, agents and apps can't approve support access), or it is your own request.Ask an organization owner or admin for a role or scope that allows this action.
version_conflict409The request changed at the same time; retry.Fetch the object again and retry the change.

It can also return these common errors: validation_failed, api_version_unsupported, invalid_json, unsupported_media_type, authentication_required, api_key_invalid, idempotency_key_required, idempotency_key_reused, idempotency_in_progress, approval_required, approval_rejected, approval_expired, stale_approval, approval_policy_denied, rate_limited, internal_error.