---
title: "Ask one of your Macs to lend a folder, a browser window, its screen or its apps and files [write]"
method: POST
path: "/desktop/machines/{id}/reach-requests"
---

# Ask one of your Macs to lend a folder, a browser window, its screen or its apps and files \[write\]

`POST /desktop/machines/{id}/reach-requests`

## Request

- Base URL: `https://api.agentsky.dev/v1`
- URL: `https://api.agentsky.dev/v1/desktop/machines/{id}/reach-requests`
- Auth: HTTP bearer

The person's own key only (a workspace key answers 403). The ask reaches the Mac app on its next poll; the person answers there — the folder picker (they choose the folder; Cancel refuses) or Allow / Deny for the browser, the screen and `host` (the Mac app's local chats, call notes, uploads, saves to Downloads and local git; once granted its reads answer at once and each change asks the person again). An agent can ask; only the person grants. The optional workspace query fixes the reach's destination without changing the Mac's registration. The caller must still belong to that workspace; a workspace-scoped key cannot choose another. Caller and membership are checked again before granting and serving the reach. Answers 202 with the request and the capability URL the mount will carry; poll `GET /desktop/reach-requests/{id}` for the answer. Refused at once with 409: machine_offline (the app is not polling), reach_unsupported (the app is too old, or cannot lend that kind), screen_reach_off, screen_permissions_missing (only the person can grant Screen Recording and Accessibility in System Settings), reach_request_open (one ask per Mac at a time).

## Path parameters

- `id` string, required

## Query parameters

- `workspace` string

## Request body

- DesktopReachRequestCreate
  - `kind` 'folder' | 'browser' | 'screen' | 'host', required
  - `reason` string, required: Why, in one sentence; shown to the person on the Mac, quoted as the agent's words

## Response `202`

Asked

- DesktopReachRequestCreated
  - `reach_request` DesktopReachRequest, required
    - `id` string, required: drr_…
    - `machine_id` string, required
    - `kind` 'folder' | 'browser' | 'screen' | 'host', required
    - `reason` string, required
    - `status` 'pending' | 'asking' | 'granted' | 'denied' | 'unavailable' | 'expired', required: pending: waiting for the Mac's next poll; asking: the person is being asked; granted: the mount below is live
    - `mount` DesktopListedMount, required
      - `id` string, required: dmt_…
      - `kind` 'folder' | 'browser' | 'screen' | 'host', required
      - `label` string, required
      - `root` string: The folder's absolute path on the Mac (folders only)
      - `created_at` string, date-time, required
    - `error` object, nullable, required
      - `code` 'reach_denied' | 'screen_reach_off' | 'screen_permissions_missing' | 'reach_unavailable' | 'reach_timeout', required
      - `message` string, required
    - `created_at` string, date-time, required
    - `deadline_at` string, date-time, required: When an unanswered ask expires: a minute for the Mac to pick it up, then 150 seconds for the person
  - `mcp_url` string, required: https://mac-<token>.agentsky.dev/mcp — shown once, stored hashed. Answers nothing until the person grants the ask; then attach it as a url MCP server (POST /sessions mcp_servers, MCP start_session sources, or PATCH /sessions/{id} mcp_servers)

## Other responses

- `default`: Error — { error: { code, message, request_id } }

## Changes

- **2026-11-02** `e5e8f0229a99`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/agentsky/apis/agentsky-developer-api/changes/desktop/machines/:id/reach-requests/post.md)

---

[API](https://skmtc.dev/agentsky/apis/agentsky-developer-api.md) - [All operations](https://skmtc.dev/agentsky/apis/agentsky-developer-api/llms.txt) - [OpenAPI document](https://skmtc.dev/agentsky/apis/agentsky-developer-api/revisions/0d435187cd55?raw)
