> ## Documentation Index
> Fetch the complete documentation index at: https://dev.marginnote.com.cn/llms.txt
> Use this file to discover all available pages before exploring further.

# 查询留白与焦点存储身份

> 只读诊断：读某张本地题卡的来源候选、本地合并留白与焦点存储身份。

留白与焦点互斥，不能写在同一份请求里。要限制层用 `layerIds`：不传查全部层，
传一个空串查默认层，传空数组或超过 32 个会被拒。

该接口不创建、不认领、不折叠，响应里没有未保存的画布，记录数也不等于笔划数。




## OpenAPI

````yaml /openapi/plugin-api.yaml post /writing/content
openapi: 3.1.0
info:
  title: 场景插件 API
  summary: 场景插件在网页面板里可以调用的接口。
  description: >
    场景插件的面板是一个网页。页面里向 `/bridge/v1` 发请求，就能读写 MarginNote 里的数据。

    请求由 MarginNote 处理，与外部命令行工具共用同一套处理代码。外部工具要带令牌，面板不必带。

    面板页面从 `mnpanel://panel/index.html` 加载，因此 `fetch('/bridge/v1' + path)`
    属于同源请求。


    面板调用受这些条件约束：


    - 请求不带令牌，本文件也不声明安全方案。

    - 页面能调用哪些接口，取决于两份名单。模板里的 `plugins` 名单和沉浸态决定面板能不能建好，
      网页面板白名单决定页面能调哪些接口。不在白名单里的请求返回 `403`，
      错误码为 `IN_PROCESS_NOT_ALLOWED`。
    - `GET /capabilities` 里的 `requiresMax` 只约束外部 Agent。面板的请求在 MarginNote 进程内处理，
      不受令牌、订阅状态与跨设备批准的限制，能否调用只看该路径是否在白名单内。
    - 写操作里的 `addon`，MarginNote 会改写为当前面板所属插件的 id；`confirm` 由 MarginNote 补上。
      页面填的值不会生效。

    用 `mn.api(path, opts)` 读取数据。该方法始终将 Response Body 按 JSON 解析，相当于

    `fetch('/bridge/v1' + path, opts).then(r => r.json())`。


    响应的内容不是 JSON 的接口，改用 `fetch`：


    - `GET /guide` 返回 Markdown 正文。

    - `GET /notes/{noteid}/render` 返回卡片长图或 PDF。

    - `GET /documents/{bookmd5}/pages/{index}/content/{contentId}` 返回图片。

    - `GET /bundles/{bundleId}/files` 带 `?path=` 时返回该文件的原始字节。


    调用失败时 Promise 不会进入 reject。MarginNote 把错误对象

    `{"error":{"code":"…","message":"…"}}` 当作 Response Body 返回，因此结果落在 resolve 里。

    判断调用结果看响应里是否带 `error`，写操作另看响应里的 `persisted`。


    接口清单、各项上限与 Request Body 结构随 MarginNote 的版本变化，运行时以 `GET /capabilities` 与

    `GET /guide` 返回的内容为准。
  version: '0.91'
servers: []
security: []
tags:
  - name: 能力与状态
    description: 读取 MarginNote 的能力、版本与当前上下文。调用其他接口之前先读这组。
  - name: 卡片与摘录
    description: 卡片的读取与写入、摘录的创建、批注、标签、元数据与留白。
  - name: 手写会话
    description: 手写层、作答纸、练习准备清单与会话记录的读取与提交。
  - name: 学习集与卡组
    description: 学习集结构、脑图树、子脑图、色板、快照与复习卡组。
  - name: 文档与页面
    description: 文档目录、页文本、页内注释面、摘录清单与同步诊断。
  - name: 导出与 Anki
    description: 文档导出计划、导出文件、Anki 导出能力、作业与产物。
  - name: 查找
    description: 跨库搜索、文件夹列表与学习集列表。
  - name: 界面与模板
    description: 读取当前界面状态与沉浸模板。
  - name: 插件辅助
    description: 面板辅助脚本、已配对设备与本机 helper 信息。
  - name: 任务包与同步诊断
    description: 拆书任务包与旧 CloudKit 同步诊断。
paths:
  /writing/content:
    post:
      tags:
        - 手写会话
      summary: 查询留白与焦点存储身份
      description: |
        只读诊断：读某张本地题卡的来源候选、本地合并留白与焦点存储身份。

        留白与焦点互斥，不能写在同一份请求里。要限制层用 `layerIds`：不传查全部层，
        传一个空串查默认层，传空数组或超过 32 个会被拒。

        该接口不创建、不认领、不折叠，响应里没有未保存的画布，记录数也不等于笔划数。
      operationId: postWritingContent
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WritingContentRequest'
            examples:
              blank:
                summary: 查留白
                value:
                  carrier: blank
                  storageTopicId: 77012CA0-48E8-4D29-B5F5-1EEA927AE086
                  physicalBlankId: 7102EB63-0F6B-48C8-917E-5B0F9D5E047C
              focus:
                summary: 查焦点
                value:
                  carrier: focus
                  storageTopicId: 77012CA0-48E8-4D29-B5F5-1EEA927AE086
                  focusNoteId: BCC8D945-7585-425A-9FDF-E24C6503F628
      responses:
        '200':
          description: 存储身份快照。内部字段没有依据，响应结构待补。
          content:
            application/json:
              schema:
                type: object
                properties:
                  schemaVersion:
                    type: integer
                  hasVisibleContent:
                    description: 实测为 null。什么情况下返回非空，尚无依据。
                  layerSettings:
                    type: object
                    properties:
                      liveWindowVerified:
                        type: boolean
                      registeredLayerIds:
                        type: array
                        items: {}
                        description: 实测为空数组，条目结构没有依据。
                      savedOverlayLayerId:
                        type: string
                      savedActiveLayerId:
                        type: string
                      bindTextImageToSketchLayer:
                        type: boolean
                  layerIds:
                    description: 实测为 null。什么情况下返回非空，尚无依据。
                  inventoryState:
                    type: string
                  bridgeApiVersion:
                    type: string
                  recordCounts:
                    type: object
                    properties: {}
                  scope:
                    type: object
                    properties:
                      carrier:
                        type: string
                      focusNoteId:
                        type: string
                      storageTopicId:
                        type: string
                  projectionFingerprint:
                    type: string
                    description: 只供水印核对使用，不是存储版本，也不能作为改写的依据。
                  hostRowCount:
                    type: integer
                  readOnly:
                    type: boolean
                  parts:
                    type: array
                    items: {}
                    description: 实测为空数组，条目结构没有依据。
                  warnings:
                    type: array
                    items:
                      type: string
                  hostNoteIds:
                    type: array
                    items: {}
                    description: 实测为空数组，条目结构没有依据。
                  includesUnsavedCanvas:
                    type: boolean
                  consistency:
                    type: string
                  repairsPerformed:
                    type: boolean
                  ready:
                    type: boolean
                    description: ⚠️为 `false` 时不得视为可写的响应。
              examples:
                measured:
                  summary: 实测于 2026-10-07，App 0.91
                  value:
                    schemaVersion: 1
                    hasVisibleContent: null
                    layerSettings:
                      liveWindowVerified: false
                      registeredLayerIds: []
                      savedOverlayLayerId: ''
                      savedActiveLayerId: ''
                      bindTextImageToSketchLayer: false
                    layerIds: null
                    inventoryState: no-stored-records
                    bridgeApiVersion: '0.91'
                    recordCounts: {}
                    scope:
                      carrier: focus
                      focusNoteId: D3085422-2CB9-4B68-A78D-DEE351CF9C38
                      storageTopicId: 449C1665-E0DD-4A20-9E67-2B0D451F746D
                    projectionFingerprint: >-
                      19a2274c021d9eb50eb0af8d7b0ad7c86a71065b9c8262a786778f3e19b7cb6c
                    hostRowCount: 0
                    readOnly: true
                    parts: []
                    warnings:
                      - >-
                        Inventory counts records, not strokes, visible ink,
                        saved attempts or completed answers.
                      - >-
                        Layer IDs are stored associations, not current
                        visibility; unbound text/images and legacy strokes may
                        remain visible.
                      - >-
                        The projection fingerprint is diagnostic, not a content
                        revision or compare-and-swap token.
                      - >-
                        Direct blank/card body is outside the layer inventory.
                        Media is neither loaded nor downloaded.
                    hostNoteIds: []
                    includesUnsavedCanvas: false
                    consistency: persisted-snapshot
                    repairsPerformed: false
      x-codeSamples:
        - lang: javascript
          label: 查询题卡存储身份
          source: |
            const r = await mn.api('/writing/content', {
              method: 'POST',
              body: {
                carrier: 'blank',
                storageTopicId: topicid,
                physicalBlankId: blankId
              }
            });
            mn.log(r.ready, r.hasVisibleContent);
components:
  schemas:
    WritingContentRequest:
      type: object
      required:
        - carrier
      description: 留白与焦点互斥，不能写在同一份请求里。
      properties:
        carrier:
          type: string
          enum:
            - blank
            - focus
          description: 目标为留白或焦点。
        storageTopicId:
          type: string
          description: 存储所在的学习集。
        physicalBlankId:
          type: string
          description: '`carrier` 为 `blank` 时使用。'
        focusNoteId:
          type: string
          description: '`carrier` 为 `focus` 时使用。'
        layerIds:
          type: array
          maxItems: 32
          items:
            type: string
          description: 要限制的层。不传查全部层，传一个空串查默认层，传空数组或超过 32 个会被拒。

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.