{
  "openapi": "3.0.3",
  "info": {
    "title": "SupaWave Data API",
    "version": "2026-03-28",
    "description": "JWT-protected JSON-RPC contract for the live Jakarta Data/Robot API. /robot/dataapi/rpc is canonical and /robot/dataapi remains a compatible alias."
  },
  "servers": [
    {
      "url": "/"
    }
  ],
  "paths": {
    "/robot/dataapi/rpc": {
      "post": {
        "summary": "Canonical Data API JSON-RPC endpoint",
        "description": "Primary JSON-RPC transport for the Data API.",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/DataApiSingleRequest"
                  },
                  {
                    "$ref": "#/components/schemas/DataApiBatchRequest"
                  }
                ]
              },
              "examples": {
                "createWavelet": {
                  "summary": "Create a new wave",
                  "value": [
                    {
                      "id": "op-1",
                      "method": "robot.createWavelet",
                      "params": {
                        "waveletData": {
                          "waveId": "example.com!TBD_wave_1",
                          "waveletId": "example.com!conv+root",
                          "rootBlipId": "TBD_blip_1",
                          "participants": [
                            "alice@example.com",
                            "bob@example.com"
                          ]
                        },
                        "message": "created from the Data API"
                      }
                    }
                  ]
                },
                "appendBlip": {
                  "summary": "Append a root-thread blip",
                  "value": [
                    {
                      "id": "op-1",
                      "method": "wavelet.appendBlip",
                      "params": {
                        "waveId": "example.com!w+abc123",
                        "waveletId": "example.com!conv+root",
                        "blipData": {
                          "blipId": "TBD_blip_2",
                          "content": "\nHello from the API"
                        }
                      }
                    }
                  ]
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "A JSON array in request order containing success and/or per-operation error items.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JsonRpcResponseBatch"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON request body."
          },
          "401": {
            "description": "Missing or invalid bearer token."
          }
        },
        "x-jsonrpc-transport": true,
        "x-canonical-path": "/robot/dataapi/rpc",
        "x-wave-supported-methods": [
          "robot.notify",
          "robot.notifyCapabilitiesHash",
          "robot.createWavelet",
          "robot.fetchWave",
          "wavelet.appendBlip",
          "wavelet.addParticipant",
          "wavelet.removeParticipant",
          "wavelet.setTitle",
          "blip.createChild",
          "blip.continueThread",
          "blip.delete",
          "document.modify",
          "document.appendMarkup",
          "document.appendInlineBlip",
          "document.insertInlineBlip",
          "document.insertInlineBlipAfterElement",
          "robot.search",
          "robot.fetchProfiles",
          "robot.folderAction",
          "robot.exportSnapshot",
          "robot.exportDeltas",
          "robot.exportAttachment",
          "robot.importDeltas",
          "robot.importAttachment"
        ],
        "x-wave-operation-schemas": {
          "robot.notify": {
            "request": "RobotNotifyRequest",
            "response": "RobotNotifyResponse"
          },
          "robot.notifyCapabilitiesHash": {
            "request": "RobotNotifyCapabilitiesHashRequest",
            "response": "RobotNotifyCapabilitiesHashResponse"
          },
          "robot.createWavelet": {
            "request": "RobotCreateWaveletRequest",
            "response": "RobotCreateWaveletResponse"
          },
          "robot.fetchWave": {
            "request": "RobotFetchWaveRequest",
            "response": "RobotFetchWaveResponse"
          },
          "wavelet.appendBlip": {
            "request": "WaveletAppendBlipRequest",
            "response": "WaveletAppendBlipResponse"
          },
          "wavelet.addParticipant": {
            "request": "WaveletAddParticipantRequest",
            "response": "WaveletAddParticipantResponse"
          },
          "wavelet.removeParticipant": {
            "request": "WaveletRemoveParticipantRequest",
            "response": "WaveletRemoveParticipantResponse"
          },
          "wavelet.setTitle": {
            "request": "WaveletSetTitleRequest",
            "response": "WaveletSetTitleResponse"
          },
          "blip.createChild": {
            "request": "BlipCreateChildRequest",
            "response": "BlipCreateChildResponse"
          },
          "blip.continueThread": {
            "request": "BlipContinueThreadRequest",
            "response": "BlipContinueThreadResponse"
          },
          "blip.delete": {
            "request": "BlipDeleteRequest",
            "response": "BlipDeleteResponse"
          },
          "document.modify": {
            "request": "DocumentModifyRequest",
            "response": "DocumentModifyResponse"
          },
          "document.appendMarkup": {
            "request": "DocumentAppendMarkupRequest",
            "response": "DocumentAppendMarkupResponse"
          },
          "document.appendInlineBlip": {
            "request": "DocumentAppendInlineBlipRequest",
            "response": "DocumentAppendInlineBlipResponse"
          },
          "document.insertInlineBlip": {
            "request": "DocumentInsertInlineBlipRequest",
            "response": "DocumentInsertInlineBlipResponse"
          },
          "document.insertInlineBlipAfterElement": {
            "request": "DocumentInsertInlineBlipAfterElementRequest",
            "response": "DocumentInsertInlineBlipAfterElementResponse"
          },
          "robot.search": {
            "request": "RobotSearchRequest",
            "response": "RobotSearchResponse"
          },
          "robot.fetchProfiles": {
            "request": "RobotFetchProfilesRequest",
            "response": "RobotFetchProfilesResponse"
          },
          "robot.folderAction": {
            "request": "RobotFolderActionRequest",
            "response": "RobotFolderActionResponse"
          },
          "robot.exportSnapshot": {
            "request": "RobotExportSnapshotRequest",
            "response": "RobotExportSnapshotResponse"
          },
          "robot.exportDeltas": {
            "request": "RobotExportDeltasRequest",
            "response": "RobotExportDeltasResponse"
          },
          "robot.exportAttachment": {
            "request": "RobotExportAttachmentRequest",
            "response": "RobotExportAttachmentResponse"
          },
          "robot.importDeltas": {
            "request": "RobotImportDeltasRequest",
            "response": "RobotImportDeltasResponse"
          },
          "robot.importAttachment": {
            "request": "RobotImportAttachmentRequest",
            "response": "RobotImportAttachmentResponse"
          }
        }
      }
    },
    "/robot/dataapi": {
      "post": {
        "summary": "Backward-compatible alias",
        "description": "Live alias for the canonical Data API JSON-RPC transport.",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/DataApiSingleRequest"
                  },
                  {
                    "$ref": "#/components/schemas/DataApiBatchRequest"
                  }
                ]
              },
              "examples": {
                "createWavelet": {
                  "summary": "Create a new wave",
                  "value": [
                    {
                      "id": "op-1",
                      "method": "robot.createWavelet",
                      "params": {
                        "waveletData": {
                          "waveId": "example.com!TBD_wave_1",
                          "waveletId": "example.com!conv+root",
                          "rootBlipId": "TBD_blip_1",
                          "participants": [
                            "alice@example.com",
                            "bob@example.com"
                          ]
                        },
                        "message": "created from the Data API"
                      }
                    }
                  ]
                },
                "appendBlip": {
                  "summary": "Append a root-thread blip",
                  "value": [
                    {
                      "id": "op-1",
                      "method": "wavelet.appendBlip",
                      "params": {
                        "waveId": "example.com!w+abc123",
                        "waveletId": "example.com!conv+root",
                        "blipData": {
                          "blipId": "TBD_blip_2",
                          "content": "\nHello from the API"
                        }
                      }
                    }
                  ]
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "A JSON array in request order containing success and/or per-operation error items.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JsonRpcResponseBatch"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON request body."
          },
          "401": {
            "description": "Missing or invalid bearer token."
          }
        },
        "x-jsonrpc-transport": true,
        "x-canonical-path": "/robot/dataapi/rpc",
        "x-wave-supported-methods": [
          "robot.notify",
          "robot.notifyCapabilitiesHash",
          "robot.createWavelet",
          "robot.fetchWave",
          "wavelet.appendBlip",
          "wavelet.addParticipant",
          "wavelet.removeParticipant",
          "wavelet.setTitle",
          "blip.createChild",
          "blip.continueThread",
          "blip.delete",
          "document.modify",
          "document.appendMarkup",
          "document.appendInlineBlip",
          "document.insertInlineBlip",
          "document.insertInlineBlipAfterElement",
          "robot.search",
          "robot.fetchProfiles",
          "robot.folderAction",
          "robot.exportSnapshot",
          "robot.exportDeltas",
          "robot.exportAttachment",
          "robot.importDeltas",
          "robot.importAttachment"
        ],
        "x-wave-operation-schemas": {
          "robot.notify": {
            "request": "RobotNotifyRequest",
            "response": "RobotNotifyResponse"
          },
          "robot.notifyCapabilitiesHash": {
            "request": "RobotNotifyCapabilitiesHashRequest",
            "response": "RobotNotifyCapabilitiesHashResponse"
          },
          "robot.createWavelet": {
            "request": "RobotCreateWaveletRequest",
            "response": "RobotCreateWaveletResponse"
          },
          "robot.fetchWave": {
            "request": "RobotFetchWaveRequest",
            "response": "RobotFetchWaveResponse"
          },
          "wavelet.appendBlip": {
            "request": "WaveletAppendBlipRequest",
            "response": "WaveletAppendBlipResponse"
          },
          "wavelet.addParticipant": {
            "request": "WaveletAddParticipantRequest",
            "response": "WaveletAddParticipantResponse"
          },
          "wavelet.removeParticipant": {
            "request": "WaveletRemoveParticipantRequest",
            "response": "WaveletRemoveParticipantResponse"
          },
          "wavelet.setTitle": {
            "request": "WaveletSetTitleRequest",
            "response": "WaveletSetTitleResponse"
          },
          "blip.createChild": {
            "request": "BlipCreateChildRequest",
            "response": "BlipCreateChildResponse"
          },
          "blip.continueThread": {
            "request": "BlipContinueThreadRequest",
            "response": "BlipContinueThreadResponse"
          },
          "blip.delete": {
            "request": "BlipDeleteRequest",
            "response": "BlipDeleteResponse"
          },
          "document.modify": {
            "request": "DocumentModifyRequest",
            "response": "DocumentModifyResponse"
          },
          "document.appendMarkup": {
            "request": "DocumentAppendMarkupRequest",
            "response": "DocumentAppendMarkupResponse"
          },
          "document.appendInlineBlip": {
            "request": "DocumentAppendInlineBlipRequest",
            "response": "DocumentAppendInlineBlipResponse"
          },
          "document.insertInlineBlip": {
            "request": "DocumentInsertInlineBlipRequest",
            "response": "DocumentInsertInlineBlipResponse"
          },
          "document.insertInlineBlipAfterElement": {
            "request": "DocumentInsertInlineBlipAfterElementRequest",
            "response": "DocumentInsertInlineBlipAfterElementResponse"
          },
          "robot.search": {
            "request": "RobotSearchRequest",
            "response": "RobotSearchResponse"
          },
          "robot.fetchProfiles": {
            "request": "RobotFetchProfilesRequest",
            "response": "RobotFetchProfilesResponse"
          },
          "robot.folderAction": {
            "request": "RobotFolderActionRequest",
            "response": "RobotFolderActionResponse"
          },
          "robot.exportSnapshot": {
            "request": "RobotExportSnapshotRequest",
            "response": "RobotExportSnapshotResponse"
          },
          "robot.exportDeltas": {
            "request": "RobotExportDeltasRequest",
            "response": "RobotExportDeltasResponse"
          },
          "robot.exportAttachment": {
            "request": "RobotExportAttachmentRequest",
            "response": "RobotExportAttachmentResponse"
          },
          "robot.importDeltas": {
            "request": "RobotImportDeltasRequest",
            "response": "RobotImportDeltasResponse"
          },
          "robot.importAttachment": {
            "request": "RobotImportAttachmentRequest",
            "response": "RobotImportAttachmentResponse"
          }
        }
      }
    },
    "/robot/dataapi/token": {
      "get": {
        "summary": "Render token UI",
        "description": "Shows the browser/session token page for logged-in users or redirects to /auth/signin?r=/robot/dataapi/token.",
        "responses": {
          "200": {
            "description": "HTML token UI",
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "302": {
            "description": "Redirect to sign-in for unauthenticated callers."
          }
        }
      },
      "post": {
        "summary": "Issue a Data API or Robot JWT",
        "description": "Issue a JWT token for Data API or Robot API access. Use token_type=robot for Robot API tokens. Supports browser-session issuance and robot client_credentials issuance. Prefer expiry=3600 or another short-lived value, refresh after HTTP 401, and remember that tokenVersion changes revoke older JWTs immediately.",
        "requestBody": {
          "required": true,
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/RobotDataApiTokenRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Access token response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccessTokenResponse"
                }
              }
            }
          },
          "400": {
            "description": "Token request validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TokenErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthenticated browser caller",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TokenErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/robots": {
      "get": {
        "summary": "List owned robots",
        "description": "Returns all robots owned by the authenticated user, including token expiry and masked secret.",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Array of robot objects",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RobotList"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token."
          }
        }
      },
      "post": {
        "summary": "Register a new robot",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RobotRegistration"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Robot registered. Response includes the consumer secret (only returned once).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RobotRotateResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation error (missing username, invalid address, etc.)"
          },
          "401": {
            "description": "Missing or invalid bearer token."
          }
        }
      }
    },
    "/api/robots/{id}": {
      "get": {
        "summary": "Get robot details",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Robot participant ID (e.g. my-bot@example.com) or just the username part"
          }
        ],
        "responses": {
          "200": {
            "description": "Robot details",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RobotDetailed"
                }
              }
            }
          },
          "404": {
            "description": "Robot not found or not owned by caller."
          },
          "401": {
            "description": "Missing or invalid bearer token."
          }
        }
      },
      "delete": {
        "summary": "Soft delete robot",
        "description": "Pauses the robot and clears its callback URL, making it fully inoperable. The account record is retained.",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Robot participant ID (e.g. my-bot@example.com) or just the username part"
          }
        ],
        "responses": {
          "200": {
            "description": "Robot deleted (paused + callback URL cleared)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RobotDeleteResponse"
                }
              }
            }
          },
          "404": {
            "description": "Robot not found or not owned by caller."
          },
          "401": {
            "description": "Missing or invalid bearer token."
          }
        }
      }
    },
    "/api/robots/{id}/url": {
      "put": {
        "summary": "Update callback URL",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Robot participant ID (e.g. my-bot@example.com) or just the username part"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "url"
                ],
                "properties": {
                  "url": {
                    "type": "string",
                    "format": "uri"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated robot",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RobotDetailed"
                }
              }
            }
          },
          "400": {
            "description": "url missing or empty"
          },
          "401": {
            "description": "Missing or invalid bearer token."
          },
          "404": {
            "description": "Robot not found or not owned by caller."
          }
        }
      }
    },
    "/api/robots/{id}/description": {
      "put": {
        "summary": "Update description",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Robot participant ID (e.g. my-bot@example.com) or just the username part"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "description": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated robot",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RobotDetailed"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token."
          },
          "404": {
            "description": "Robot not found or not owned by caller."
          }
        }
      }
    },
    "/api/robots/{id}/rotate": {
      "post": {
        "summary": "Rotate consumer secret",
        "description": "Generates a new consumer secret. The new secret is returned once in this response and masked on subsequent reads.",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Robot participant ID (e.g. my-bot@example.com) or just the username part"
          }
        ],
        "responses": {
          "200": {
            "description": "New secret returned",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RobotRotateResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token."
          },
          "404": {
            "description": "Robot not found or not owned by caller."
          }
        }
      }
    },
    "/api/robots/{id}/verify": {
      "post": {
        "summary": "Test bot (fetch capabilities)",
        "description": "Fetches the capabilities.xml from the robot callback URL to confirm it is reachable.",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Robot participant ID (e.g. my-bot@example.com) or just the username part"
          }
        ],
        "responses": {
          "200": {
            "description": "Robot verified",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RobotDetailed"
                }
              }
            }
          },
          "400": {
            "description": "No callback URL set."
          },
          "401": {
            "description": "Missing or invalid bearer token."
          },
          "502": {
            "description": "Capability fetch failed."
          }
        }
      }
    },
    "/api/robots/{id}/paused": {
      "put": {
        "summary": "Pause or unpause robot",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Robot participant ID (e.g. my-bot@example.com) or just the username part"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "paused"
                ],
                "properties": {
                  "paused": {
                    "type": "string",
                    "enum": [
                      "true",
                      "false"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated robot",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RobotDetailed"
                }
              }
            }
          },
          "400": {
            "description": "Invalid paused value."
          },
          "401": {
            "description": "Missing or invalid bearer token."
          },
          "404": {
            "description": "Robot not found or not owned by caller."
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT",
        "description": "JWT type=data-api-access, audience=data-api"
      }
    },
    "schemas": {
      "DataApiSingleRequest": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/RobotNotifyRequest"
          },
          {
            "$ref": "#/components/schemas/RobotNotifyCapabilitiesHashRequest"
          },
          {
            "$ref": "#/components/schemas/RobotCreateWaveletRequest"
          },
          {
            "$ref": "#/components/schemas/RobotFetchWaveRequest"
          },
          {
            "$ref": "#/components/schemas/WaveletAppendBlipRequest"
          },
          {
            "$ref": "#/components/schemas/WaveletAddParticipantRequest"
          },
          {
            "$ref": "#/components/schemas/WaveletRemoveParticipantRequest"
          },
          {
            "$ref": "#/components/schemas/WaveletSetTitleRequest"
          },
          {
            "$ref": "#/components/schemas/BlipCreateChildRequest"
          },
          {
            "$ref": "#/components/schemas/BlipContinueThreadRequest"
          },
          {
            "$ref": "#/components/schemas/BlipDeleteRequest"
          },
          {
            "$ref": "#/components/schemas/DocumentModifyRequest"
          },
          {
            "$ref": "#/components/schemas/DocumentAppendMarkupRequest"
          },
          {
            "$ref": "#/components/schemas/DocumentAppendInlineBlipRequest"
          },
          {
            "$ref": "#/components/schemas/DocumentInsertInlineBlipRequest"
          },
          {
            "$ref": "#/components/schemas/DocumentInsertInlineBlipAfterElementRequest"
          },
          {
            "$ref": "#/components/schemas/RobotSearchRequest"
          },
          {
            "$ref": "#/components/schemas/RobotFetchProfilesRequest"
          },
          {
            "$ref": "#/components/schemas/RobotFolderActionRequest"
          },
          {
            "$ref": "#/components/schemas/RobotExportSnapshotRequest"
          },
          {
            "$ref": "#/components/schemas/RobotExportDeltasRequest"
          },
          {
            "$ref": "#/components/schemas/RobotExportAttachmentRequest"
          },
          {
            "$ref": "#/components/schemas/RobotImportDeltasRequest"
          },
          {
            "$ref": "#/components/schemas/RobotImportAttachmentRequest"
          }
        ]
      },
      "DataApiBatchRequest": {
        "type": "array",
        "items": {
          "oneOf": [
            {
              "$ref": "#/components/schemas/RobotNotifyRequest"
            },
            {
              "$ref": "#/components/schemas/RobotNotifyCapabilitiesHashRequest"
            },
            {
              "$ref": "#/components/schemas/RobotCreateWaveletRequest"
            },
            {
              "$ref": "#/components/schemas/RobotFetchWaveRequest"
            },
            {
              "$ref": "#/components/schemas/WaveletAppendBlipRequest"
            },
            {
              "$ref": "#/components/schemas/WaveletAddParticipantRequest"
            },
            {
              "$ref": "#/components/schemas/WaveletRemoveParticipantRequest"
            },
            {
              "$ref": "#/components/schemas/WaveletSetTitleRequest"
            },
            {
              "$ref": "#/components/schemas/BlipCreateChildRequest"
            },
            {
              "$ref": "#/components/schemas/BlipContinueThreadRequest"
            },
            {
              "$ref": "#/components/schemas/BlipDeleteRequest"
            },
            {
              "$ref": "#/components/schemas/DocumentModifyRequest"
            },
            {
              "$ref": "#/components/schemas/DocumentAppendMarkupRequest"
            },
            {
              "$ref": "#/components/schemas/DocumentAppendInlineBlipRequest"
            },
            {
              "$ref": "#/components/schemas/DocumentInsertInlineBlipRequest"
            },
            {
              "$ref": "#/components/schemas/DocumentInsertInlineBlipAfterElementRequest"
            },
            {
              "$ref": "#/components/schemas/RobotSearchRequest"
            },
            {
              "$ref": "#/components/schemas/RobotFetchProfilesRequest"
            },
            {
              "$ref": "#/components/schemas/RobotFolderActionRequest"
            },
            {
              "$ref": "#/components/schemas/RobotExportSnapshotRequest"
            },
            {
              "$ref": "#/components/schemas/RobotExportDeltasRequest"
            },
            {
              "$ref": "#/components/schemas/RobotExportAttachmentRequest"
            },
            {
              "$ref": "#/components/schemas/RobotImportDeltasRequest"
            },
            {
              "$ref": "#/components/schemas/RobotImportAttachmentRequest"
            }
          ]
        }
      },
      "JsonRpcResponseBatch": {
        "type": "array",
        "items": {
          "oneOf": [
            {
              "$ref": "#/components/schemas/JsonRpcSuccessItem"
            },
            {
              "$ref": "#/components/schemas/JsonRpcErrorItem"
            }
          ]
        }
      },
      "JsonRpcSuccessItem": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "data": {
            "type": "object"
          }
        }
      },
      "JsonRpcErrorItem": {
        "type": "object",
        "required": [
          "id",
          "error"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "error": {
            "type": "object",
            "properties": {
              "message": {
                "type": "string"
              }
            }
          }
        }
      },
      "AccessTokenResponse": {
        "type": "object",
        "required": [
          "access_token",
          "token_type",
          "expires_in"
        ],
        "properties": {
          "access_token": {
            "type": "string"
          },
          "token_type": {
            "type": "string",
            "example": "bearer"
          },
          "expires_in": {
            "type": "integer",
            "format": "int64",
            "example": 3600
          }
        }
      },
      "TokenErrorResponse": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "string"
          },
          "error_description": {
            "type": "string"
          }
        }
      },
      "RobotDataApiTokenRequest": {
        "type": "object",
        "required": [
          "grant_type",
          "client_id",
          "client_secret"
        ],
        "properties": {
          "grant_type": {
            "type": "string",
            "enum": [
              "client_credentials"
            ]
          },
          "client_id": {
            "type": "string"
          },
          "client_secret": {
            "type": "string"
          },
          "expiry": {
            "type": "integer",
            "format": "int64",
            "example": 3600
          },
          "token_type": {
            "type": "string",
            "enum": [
              "data_api",
              "robot"
            ],
            "default": "data_api",
            "description": "Token type: data_api for /robot/dataapi, robot for /robot/rpc"
          }
        }
      },
      "Robot": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "paused"
            ]
          },
          "description": {
            "type": "string"
          },
          "callbackUrl": {
            "type": "string"
          },
          "verified": {
            "type": "boolean"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "RobotDetailed": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "paused"
            ]
          },
          "description": {
            "type": "string"
          },
          "callbackUrl": {
            "type": "string"
          },
          "verified": {
            "type": "boolean"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "tokenExpirySeconds": {
            "type": "integer",
            "format": "int64"
          },
          "maskedSecret": {
            "type": "string"
          }
        }
      },
      "RobotRegistration": {
        "type": "object",
        "required": [
          "username"
        ],
        "properties": {
          "username": {
            "type": "string",
            "description": "Robot username (without @domain)"
          },
          "description": {
            "type": "string"
          },
          "callbackUrl": {
            "type": "string",
            "format": "uri"
          },
          "tokenExpiry": {
            "type": "integer",
            "format": "int64",
            "description": "Token TTL in seconds (0 = no expiry)",
            "example": 3600
          }
        }
      },
      "RobotList": {
        "type": "array",
        "items": {
          "$ref": "#/components/schemas/RobotDetailed"
        }
      },
      "RobotDeleteResponse": {
        "type": "object",
        "properties": {
          "deleted": {
            "type": "boolean"
          },
          "paused": {
            "type": "boolean"
          },
          "id": {
            "type": "string"
          }
        }
      },
      "RobotRotateResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "secret": {
            "type": "string",
            "description": "New consumer secret — only returned once"
          },
          "maskedSecret": {
            "type": "string"
          },
          "status": {
            "type": "string"
          }
        }
      },
      "RobotNotifyRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "robot.notify"
            ],
            "example": "robot.notify"
          },
          "params": {
            "type": "object",
            "properties": {
              "protocolVersion": {
                "type": "string",
                "example": "0.22"
              },
              "capabilitiesHash": {
                "type": "string",
                "example": "sha256:optional"
              }
            },
            "required": [
              "protocolVersion"
            ]
          }
        },
        "description": "Negotiates protocol version and optionally communicates a capabilities hash.",
        "x-jsonrpc-method": "robot.notify",
        "x-wave-operation-group": "Protocol and internal",
        "x-primary-example": {
          "id": "op-1",
          "method": "robot.notify",
          "params": {
            "protocolVersion": "0.22",
            "capabilitiesHash": "sha256:optional"
          }
        }
      },
      "RobotNotifyResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {}
          }
        },
        "description": "Negotiates protocol version and optionally communicates a capabilities hash.",
        "x-jsonrpc-method": "robot.notify",
        "x-wave-operation-group": "Protocol and internal",
        "x-primary-example": {
          "id": "op-1",
          "data": {}
        }
      },
      "RobotNotifyCapabilitiesHashRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "robot.notifyCapabilitiesHash"
            ],
            "example": "robot.notifyCapabilitiesHash"
          },
          "params": {
            "type": "object",
            "properties": {
              "capabilitiesHash": {
                "type": "string",
                "example": "sha256:robot-capabilities"
              }
            },
            "required": [
              "capabilitiesHash"
            ]
          }
        },
        "description": "Legacy no-op notification entry kept for compatibility with older clients.",
        "x-jsonrpc-method": "robot.notifyCapabilitiesHash",
        "x-wave-operation-group": "Protocol and internal",
        "x-primary-example": {
          "id": "op-1",
          "method": "robot.notifyCapabilitiesHash",
          "params": {
            "capabilitiesHash": "sha256:robot-capabilities"
          }
        }
      },
      "RobotNotifyCapabilitiesHashResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {}
          }
        },
        "description": "Legacy no-op notification entry kept for compatibility with older clients.",
        "x-jsonrpc-method": "robot.notifyCapabilitiesHash",
        "x-wave-operation-group": "Protocol and internal",
        "x-primary-example": {
          "id": "op-1",
          "data": {}
        }
      },
      "RobotCreateWaveletRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "robot.createWavelet"
            ],
            "example": "robot.createWavelet"
          },
          "params": {
            "type": "object",
            "properties": {
              "waveletData": {
                "type": "object",
                "properties": {
                  "waveId": {
                    "type": "string",
                    "example": "example.com!TBD_wave_1"
                  },
                  "waveletId": {
                    "type": "string",
                    "example": "example.com!conv+root"
                  },
                  "rootBlipId": {
                    "type": "string",
                    "example": "TBD_blip_1"
                  },
                  "participants": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": "alice@example.com"
                    }
                  }
                }
              },
              "message": {
                "type": "string",
                "example": "created from the Data API"
              }
            },
            "required": [
              "waveletData"
            ]
          }
        },
        "description": "Creates a new conversational wave and returns the real wave, wavelet, and root blip IDs.",
        "x-jsonrpc-method": "robot.createWavelet",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "method": "robot.createWavelet",
          "params": {
            "waveletData": {
              "waveId": "example.com!TBD_wave_1",
              "waveletId": "example.com!conv+root",
              "rootBlipId": "TBD_blip_1",
              "participants": [
                "alice@example.com",
                "bob@example.com"
              ]
            },
            "message": "created from the Data API"
          }
        }
      },
      "RobotCreateWaveletResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {
              "blipId": {
                "type": "string",
                "example": "b+root"
              },
              "message": {
                "type": "string",
                "example": "created from the Data API"
              },
              "waveId": {
                "type": "string",
                "example": "example.com!w+abc123"
              },
              "waveletId": {
                "type": "string",
                "example": "example.com!conv+root"
              }
            }
          }
        },
        "description": "Creates a new conversational wave and returns the real wave, wavelet, and root blip IDs.",
        "x-jsonrpc-method": "robot.createWavelet",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "data": {
            "blipId": "b+root",
            "message": "created from the Data API",
            "waveId": "example.com!w+abc123",
            "waveletId": "example.com!conv+root"
          }
        }
      },
      "RobotFetchWaveRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "robot.fetchWave"
            ],
            "example": "robot.fetchWave"
          },
          "params": {
            "type": "object",
            "properties": {
              "waveId": {
                "type": "string",
                "example": "example.com!w+abc123"
              },
              "waveletId": {
                "type": "string",
                "example": "example.com!conv+root"
              },
              "returnWaveletIds": {
                "type": "boolean",
                "example": false
              },
              "message": {
                "type": "string",
                "example": "optional fetch tag"
              }
            },
            "required": [
              "waveId"
            ]
          }
        },
        "description": "Fetches wave state for a specific wavelet or returns visible wavelet IDs when returnWaveletIds=true.",
        "x-jsonrpc-method": "robot.fetchWave",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "method": "robot.fetchWave",
          "params": {
            "waveId": "example.com!w+abc123",
            "waveletId": "example.com!conv+root",
            "returnWaveletIds": false,
            "message": "optional fetch tag"
          }
        }
      },
      "RobotFetchWaveResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {
              "robotAddress": {
                "type": "string",
                "example": "helper-bot@example.com"
              },
              "rpcServerUrl": {
                "type": "string",
                "example": "https://wave.example.com/robot/dataapi/rpc"
              },
              "blipId": {
                "type": "string",
                "example": "b+root"
              },
              "message": {
                "type": "string",
                "example": "optional fetch tag"
              },
              "waveletData": {
                "type": "object",
                "properties": {
                  "waveId": {
                    "type": "string",
                    "example": "example.com!w+abc123"
                  },
                  "waveletId": {
                    "type": "string",
                    "example": "example.com!conv+root"
                  },
                  "rootBlipId": {
                    "type": "string",
                    "example": "b+root"
                  },
                  "title": {
                    "type": "string",
                    "example": "Project kickoff"
                  }
                }
              },
              "blips": {
                "type": "object",
                "properties": {
                  "b+root": {
                    "type": "object",
                    "properties": {
                      "blipId": {
                        "type": "string",
                        "example": "b+root"
                      },
                      "content": {
                        "type": "string",
                        "example": "\nWelcome to the wave"
                      },
                      "contributors": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "example": "alice@example.com"
                        }
                      }
                    }
                  }
                }
              },
              "threads": {
                "type": "object",
                "properties": {
                  "thread+root": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "example": "thread+root"
                      },
                      "blipIds": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "example": "b+root"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "description": "Fetches wave state for a specific wavelet or returns visible wavelet IDs when returnWaveletIds=true.",
        "x-jsonrpc-method": "robot.fetchWave",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "data": {
            "robotAddress": "helper-bot@example.com",
            "rpcServerUrl": "https://wave.example.com/robot/dataapi/rpc",
            "blipId": "b+root",
            "message": "optional fetch tag",
            "waveletData": {
              "waveId": "example.com!w+abc123",
              "waveletId": "example.com!conv+root",
              "rootBlipId": "b+root",
              "title": "Project kickoff"
            },
            "blips": {
              "b+root": {
                "blipId": "b+root",
                "content": "\nWelcome to the wave",
                "contributors": [
                  "alice@example.com"
                ]
              }
            },
            "threads": {
              "thread+root": {
                "id": "thread+root",
                "blipIds": [
                  "b+root"
                ]
              }
            }
          }
        }
      },
      "WaveletAppendBlipRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "wavelet.appendBlip"
            ],
            "example": "wavelet.appendBlip"
          },
          "params": {
            "type": "object",
            "properties": {
              "waveId": {
                "type": "string",
                "example": "example.com!w+abc123"
              },
              "waveletId": {
                "type": "string",
                "example": "example.com!conv+root"
              },
              "blipData": {
                "type": "object",
                "properties": {
                  "blipId": {
                    "type": "string",
                    "example": "TBD_blip_2"
                  },
                  "content": {
                    "type": "string",
                    "example": "\nHello from the API"
                  }
                }
              }
            },
            "required": [
              "waveId",
              "waveletId",
              "blipData"
            ]
          }
        },
        "description": "Appends a new blip to the root thread of the target conversation.",
        "x-jsonrpc-method": "wavelet.appendBlip",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "method": "wavelet.appendBlip",
          "params": {
            "waveId": "example.com!w+abc123",
            "waveletId": "example.com!conv+root",
            "blipData": {
              "blipId": "TBD_blip_2",
              "content": "\nHello from the API"
            }
          }
        }
      },
      "WaveletAppendBlipResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {
              "blipId": {
                "type": "string",
                "example": "b+root"
              },
              "newBlipId": {
                "type": "string",
                "example": "b+new"
              }
            }
          }
        },
        "description": "Appends a new blip to the root thread of the target conversation.",
        "x-jsonrpc-method": "wavelet.appendBlip",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "data": {
            "blipId": "b+root",
            "newBlipId": "b+new"
          }
        }
      },
      "WaveletAddParticipantRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "wavelet.addParticipant"
            ],
            "example": "wavelet.addParticipant"
          },
          "params": {
            "type": "object",
            "properties": {
              "waveId": {
                "type": "string",
                "example": "example.com!w+abc123"
              },
              "waveletId": {
                "type": "string",
                "example": "example.com!conv+root"
              },
              "participantId": {
                "type": "string",
                "example": "bob@example.com"
              }
            },
            "required": [
              "waveId",
              "waveletId",
              "participantId"
            ]
          }
        },
        "description": "Adds a participant to the target wavelet.",
        "x-jsonrpc-method": "wavelet.addParticipant",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "method": "wavelet.addParticipant",
          "params": {
            "waveId": "example.com!w+abc123",
            "waveletId": "example.com!conv+root",
            "participantId": "bob@example.com"
          }
        }
      },
      "WaveletAddParticipantResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {
              "blipId": {
                "type": "string",
                "example": "b+root"
              },
              "participantsAdded": {
                "type": "array",
                "items": {
                  "type": "string",
                  "example": "bob@example.com"
                }
              },
              "participantsRemoved": {
                "type": "array",
                "items": {
                  "type": "string",
                  "example": ""
                }
              }
            }
          }
        },
        "description": "Adds a participant to the target wavelet.",
        "x-jsonrpc-method": "wavelet.addParticipant",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "data": {
            "blipId": "b+root",
            "participantsAdded": [
              "bob@example.com"
            ],
            "participantsRemoved": []
          }
        }
      },
      "WaveletRemoveParticipantRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "wavelet.removeParticipant"
            ],
            "example": "wavelet.removeParticipant"
          },
          "params": {
            "type": "object",
            "properties": {
              "waveId": {
                "type": "string",
                "example": "example.com!w+abc123"
              },
              "waveletId": {
                "type": "string",
                "example": "example.com!conv+root"
              },
              "participantId": {
                "type": "string",
                "example": "bob@example.com"
              }
            },
            "required": [
              "waveId",
              "waveletId",
              "participantId"
            ]
          }
        },
        "description": "Removes a participant from the target wavelet.",
        "x-jsonrpc-method": "wavelet.removeParticipant",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "method": "wavelet.removeParticipant",
          "params": {
            "waveId": "example.com!w+abc123",
            "waveletId": "example.com!conv+root",
            "participantId": "bob@example.com"
          }
        }
      },
      "WaveletRemoveParticipantResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {
              "blipId": {
                "type": "string",
                "example": "b+root"
              },
              "participantsAdded": {
                "type": "array",
                "items": {
                  "type": "string",
                  "example": ""
                }
              },
              "participantsRemoved": {
                "type": "array",
                "items": {
                  "type": "string",
                  "example": "bob@example.com"
                }
              }
            }
          }
        },
        "description": "Removes a participant from the target wavelet.",
        "x-jsonrpc-method": "wavelet.removeParticipant",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "data": {
            "blipId": "b+root",
            "participantsAdded": [],
            "participantsRemoved": [
              "bob@example.com"
            ]
          }
        }
      },
      "WaveletSetTitleRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "wavelet.setTitle"
            ],
            "example": "wavelet.setTitle"
          },
          "params": {
            "type": "object",
            "properties": {
              "waveId": {
                "type": "string",
                "example": "example.com!w+abc123"
              },
              "waveletId": {
                "type": "string",
                "example": "example.com!conv+root"
              },
              "waveletTitle": {
                "type": "string",
                "example": "Project kickoff"
              }
            },
            "required": [
              "waveId",
              "waveletId",
              "waveletTitle"
            ]
          }
        },
        "description": "Sets the visible title of the target wavelet.",
        "x-jsonrpc-method": "wavelet.setTitle",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "method": "wavelet.setTitle",
          "params": {
            "waveId": "example.com!w+abc123",
            "waveletId": "example.com!conv+root",
            "waveletTitle": "Project kickoff"
          }
        }
      },
      "WaveletSetTitleResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {}
          }
        },
        "description": "Sets the visible title of the target wavelet.",
        "x-jsonrpc-method": "wavelet.setTitle",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "data": {}
        }
      },
      "BlipCreateChildRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "blip.createChild"
            ],
            "example": "blip.createChild"
          },
          "params": {
            "type": "object",
            "properties": {
              "waveId": {
                "type": "string",
                "example": "example.com!w+abc123"
              },
              "waveletId": {
                "type": "string",
                "example": "example.com!conv+root"
              },
              "blipId": {
                "type": "string",
                "example": "b+parent"
              },
              "blipData": {
                "type": "object",
                "properties": {
                  "blipId": {
                    "type": "string",
                    "example": "TBD_child_1"
                  },
                  "content": {
                    "type": "string",
                    "example": "\nChild reply"
                  }
                }
              }
            },
            "required": [
              "waveId",
              "waveletId",
              "blipId",
              "blipData"
            ]
          }
        },
        "description": "Creates a reply-thread child blip under the specified parent blip.",
        "x-jsonrpc-method": "blip.createChild",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "method": "blip.createChild",
          "params": {
            "waveId": "example.com!w+abc123",
            "waveletId": "example.com!conv+root",
            "blipId": "b+parent",
            "blipData": {
              "blipId": "TBD_child_1",
              "content": "\nChild reply"
            }
          }
        }
      },
      "BlipCreateChildResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {
              "blipId": {
                "type": "string",
                "example": "b+root"
              },
              "newBlipId": {
                "type": "string",
                "example": "b+child"
              }
            }
          }
        },
        "description": "Creates a reply-thread child blip under the specified parent blip.",
        "x-jsonrpc-method": "blip.createChild",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "data": {
            "blipId": "b+root",
            "newBlipId": "b+child"
          }
        }
      },
      "BlipContinueThreadRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "blip.continueThread"
            ],
            "example": "blip.continueThread"
          },
          "params": {
            "type": "object",
            "properties": {
              "waveId": {
                "type": "string",
                "example": "example.com!w+abc123"
              },
              "waveletId": {
                "type": "string",
                "example": "example.com!conv+root"
              },
              "blipId": {
                "type": "string",
                "example": "b+parent"
              },
              "blipData": {
                "type": "object",
                "properties": {
                  "blipId": {
                    "type": "string",
                    "example": "TBD_thread_1"
                  },
                  "content": {
                    "type": "string",
                    "example": "\nThread continuation"
                  }
                }
              }
            },
            "required": [
              "waveId",
              "waveletId",
              "blipId",
              "blipData"
            ]
          }
        },
        "description": "Appends a new blip to the end of the current thread for the specified blip.",
        "x-jsonrpc-method": "blip.continueThread",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "method": "blip.continueThread",
          "params": {
            "waveId": "example.com!w+abc123",
            "waveletId": "example.com!conv+root",
            "blipId": "b+parent",
            "blipData": {
              "blipId": "TBD_thread_1",
              "content": "\nThread continuation"
            }
          }
        }
      },
      "BlipContinueThreadResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {
              "blipId": {
                "type": "string",
                "example": "b+root"
              },
              "newBlipId": {
                "type": "string",
                "example": "b+thread"
              }
            }
          }
        },
        "description": "Appends a new blip to the end of the current thread for the specified blip.",
        "x-jsonrpc-method": "blip.continueThread",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "data": {
            "blipId": "b+root",
            "newBlipId": "b+thread"
          }
        }
      },
      "BlipDeleteRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "blip.delete"
            ],
            "example": "blip.delete"
          },
          "params": {
            "type": "object",
            "properties": {
              "waveId": {
                "type": "string",
                "example": "example.com!w+abc123"
              },
              "waveletId": {
                "type": "string",
                "example": "example.com!conv+root"
              },
              "blipId": {
                "type": "string",
                "example": "b+old"
              }
            },
            "required": [
              "waveId",
              "waveletId",
              "blipId"
            ]
          }
        },
        "description": "Deletes the specified blip.",
        "x-jsonrpc-method": "blip.delete",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "method": "blip.delete",
          "params": {
            "waveId": "example.com!w+abc123",
            "waveletId": "example.com!conv+root",
            "blipId": "b+old"
          }
        }
      },
      "BlipDeleteResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {}
          }
        },
        "description": "Deletes the specified blip.",
        "x-jsonrpc-method": "blip.delete",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "data": {}
        }
      },
      "DocumentModifyRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "document.modify"
            ],
            "example": "document.modify"
          },
          "params": {
            "type": "object",
            "properties": {
              "waveId": {
                "type": "string",
                "example": "example.com!w+abc123"
              },
              "waveletId": {
                "type": "string",
                "example": "example.com!conv+root"
              },
              "blipId": {
                "type": "string",
                "example": "b+root"
              },
              "modifyAction": {
                "type": "object",
                "properties": {
                  "modifyHow": {
                    "type": "string",
                    "example": "REPLACE"
                  },
                  "values": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": "Updated text"
                    }
                  },
                  "annotationKey": {
                    "type": "string",
                    "example": ""
                  },
                  "elements": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": ""
                    }
                  },
                  "bundledAnnotations": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": ""
                    }
                  },
                  "useMarkup": {
                    "type": "boolean",
                    "example": false
                  }
                }
              },
              "range": {
                "type": "object",
                "properties": {
                  "start": {
                    "type": "integer",
                    "example": 1
                  },
                  "end": {
                    "type": "integer",
                    "example": 8
                  }
                }
              }
            },
            "required": [
              "waveId",
              "waveletId",
              "blipId",
              "modifyAction"
            ]
          }
        },
        "description": "Applies a DocumentModifyAction to the target blip content.",
        "x-jsonrpc-method": "document.modify",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "method": "document.modify",
          "params": {
            "waveId": "example.com!w+abc123",
            "waveletId": "example.com!conv+root",
            "blipId": "b+root",
            "modifyAction": {
              "modifyHow": "REPLACE",
              "values": [
                "Updated text"
              ],
              "annotationKey": "",
              "elements": [],
              "bundledAnnotations": [],
              "useMarkup": false
            },
            "range": {
              "start": 1,
              "end": 8
            }
          }
        }
      },
      "DocumentModifyResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {}
          }
        },
        "description": "Applies a DocumentModifyAction to the target blip content.",
        "x-jsonrpc-method": "document.modify",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "data": {}
        }
      },
      "DocumentAppendMarkupRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "document.appendMarkup"
            ],
            "example": "document.appendMarkup"
          },
          "params": {
            "type": "object",
            "properties": {
              "waveId": {
                "type": "string",
                "example": "example.com!w+abc123"
              },
              "waveletId": {
                "type": "string",
                "example": "example.com!conv+root"
              },
              "blipId": {
                "type": "string",
                "example": "b+root"
              },
              "content": {
                "type": "string",
                "example": "<p><b>Marked up text</b></p>"
              }
            },
            "required": [
              "waveId",
              "waveletId",
              "blipId",
              "content"
            ]
          }
        },
        "description": "Appends markup to the specified blip.",
        "x-jsonrpc-method": "document.appendMarkup",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "method": "document.appendMarkup",
          "params": {
            "waveId": "example.com!w+abc123",
            "waveletId": "example.com!conv+root",
            "blipId": "b+root",
            "content": "<p><b>Marked up text</b></p>"
          }
        }
      },
      "DocumentAppendMarkupResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {}
          }
        },
        "description": "Appends markup to the specified blip.",
        "x-jsonrpc-method": "document.appendMarkup",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "data": {}
        }
      },
      "DocumentAppendInlineBlipRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "document.appendInlineBlip"
            ],
            "example": "document.appendInlineBlip"
          },
          "params": {
            "type": "object",
            "properties": {
              "waveId": {
                "type": "string",
                "example": "example.com!w+abc123"
              },
              "waveletId": {
                "type": "string",
                "example": "example.com!conv+root"
              },
              "blipId": {
                "type": "string",
                "example": "b+root"
              },
              "blipData": {
                "type": "object",
                "properties": {
                  "blipId": {
                    "type": "string",
                    "example": "TBD_inline_1"
                  },
                  "content": {
                    "type": "string",
                    "example": "\nInline details"
                  }
                }
              }
            },
            "required": [
              "waveId",
              "waveletId",
              "blipId",
              "blipData"
            ]
          }
        },
        "description": "Appends a new inline blip on a new line within the specified parent blip.",
        "x-jsonrpc-method": "document.appendInlineBlip",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "method": "document.appendInlineBlip",
          "params": {
            "waveId": "example.com!w+abc123",
            "waveletId": "example.com!conv+root",
            "blipId": "b+root",
            "blipData": {
              "blipId": "TBD_inline_1",
              "content": "\nInline details"
            }
          }
        }
      },
      "DocumentAppendInlineBlipResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {
              "blipId": {
                "type": "string",
                "example": "b+root"
              },
              "newBlipId": {
                "type": "string",
                "example": "b+inline"
              }
            }
          }
        },
        "description": "Appends a new inline blip on a new line within the specified parent blip.",
        "x-jsonrpc-method": "document.appendInlineBlip",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "data": {
            "blipId": "b+root",
            "newBlipId": "b+inline"
          }
        }
      },
      "DocumentInsertInlineBlipRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "document.insertInlineBlip"
            ],
            "example": "document.insertInlineBlip"
          },
          "params": {
            "type": "object",
            "properties": {
              "waveId": {
                "type": "string",
                "example": "example.com!w+abc123"
              },
              "waveletId": {
                "type": "string",
                "example": "example.com!conv+root"
              },
              "blipId": {
                "type": "string",
                "example": "b+root"
              },
              "index": {
                "type": "integer",
                "example": 12
              },
              "blipData": {
                "type": "object",
                "properties": {
                  "blipId": {
                    "type": "string",
                    "example": "TBD_inline_2"
                  },
                  "content": {
                    "type": "string",
                    "example": "\nInline details"
                  }
                }
              }
            },
            "required": [
              "waveId",
              "waveletId",
              "blipId",
              "index",
              "blipData"
            ]
          }
        },
        "description": "Inserts an inline blip at the provided API text index.",
        "x-jsonrpc-method": "document.insertInlineBlip",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "method": "document.insertInlineBlip",
          "params": {
            "waveId": "example.com!w+abc123",
            "waveletId": "example.com!conv+root",
            "blipId": "b+root",
            "index": 12,
            "blipData": {
              "blipId": "TBD_inline_2",
              "content": "\nInline details"
            }
          }
        }
      },
      "DocumentInsertInlineBlipResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {
              "blipId": {
                "type": "string",
                "example": "b+root"
              },
              "newBlipId": {
                "type": "string",
                "example": "b+inline"
              }
            }
          }
        },
        "description": "Inserts an inline blip at the provided API text index.",
        "x-jsonrpc-method": "document.insertInlineBlip",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "data": {
            "blipId": "b+root",
            "newBlipId": "b+inline"
          }
        }
      },
      "DocumentInsertInlineBlipAfterElementRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "document.insertInlineBlipAfterElement"
            ],
            "example": "document.insertInlineBlipAfterElement"
          },
          "params": {
            "type": "object",
            "properties": {
              "waveId": {
                "type": "string",
                "example": "example.com!w+abc123"
              },
              "waveletId": {
                "type": "string",
                "example": "example.com!conv+root"
              },
              "blipId": {
                "type": "string",
                "example": "b+root"
              },
              "element": {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "example": "IMAGE"
                  },
                  "properties": {
                    "type": "object",
                    "properties": {
                      "url": {
                        "type": "string",
                        "example": "https://example.test/image.png"
                      }
                    }
                  }
                }
              },
              "blipData": {
                "type": "object",
                "properties": {
                  "blipId": {
                    "type": "string",
                    "example": "TBD_inline_3"
                  },
                  "content": {
                    "type": "string",
                    "example": "\nElement follow-up"
                  }
                }
              }
            },
            "required": [
              "waveId",
              "waveletId",
              "blipId",
              "element",
              "blipData"
            ]
          }
        },
        "description": "Inserts an inline blip immediately after the specified element.",
        "x-jsonrpc-method": "document.insertInlineBlipAfterElement",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "method": "document.insertInlineBlipAfterElement",
          "params": {
            "waveId": "example.com!w+abc123",
            "waveletId": "example.com!conv+root",
            "blipId": "b+root",
            "element": {
              "type": "IMAGE",
              "properties": {
                "url": "https://example.test/image.png"
              }
            },
            "blipData": {
              "blipId": "TBD_inline_3",
              "content": "\nElement follow-up"
            }
          }
        }
      },
      "DocumentInsertInlineBlipAfterElementResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {
              "blipId": {
                "type": "string",
                "example": "b+root"
              },
              "newBlipId": {
                "type": "string",
                "example": "b+inline"
              }
            }
          }
        },
        "description": "Inserts an inline blip immediately after the specified element.",
        "x-jsonrpc-method": "document.insertInlineBlipAfterElement",
        "x-wave-operation-group": "Wave and conversation",
        "x-primary-example": {
          "id": "op-1",
          "data": {
            "blipId": "b+root",
            "newBlipId": "b+inline"
          }
        }
      },
      "RobotSearchRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "robot.search"
            ],
            "example": "robot.search"
          },
          "params": {
            "type": "object",
            "properties": {
              "query": {
                "type": "string",
                "example": "in:inbox"
              },
              "index": {
                "type": "integer",
                "example": 0
              },
              "numResults": {
                "type": "integer",
                "example": 10
              }
            },
            "required": [
              "query"
            ]
          }
        },
        "description": "Executes a wave search for the authenticated participant.",
        "x-jsonrpc-method": "robot.search",
        "x-wave-operation-group": "Search, profile, and folders",
        "x-primary-example": {
          "id": "op-1",
          "method": "robot.search",
          "params": {
            "query": "in:inbox",
            "index": 0,
            "numResults": 10
          }
        }
      },
      "RobotSearchResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {
              "searchResults": {
                "type": "object",
                "properties": {
                  "query": {
                    "type": "string",
                    "example": "in:inbox"
                  },
                  "digests": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "title": {
                          "type": "string",
                          "example": "Project kickoff"
                        },
                        "waveId": {
                          "type": "string",
                          "example": "wave://example.com/w+abc123"
                        },
                        "snippet": {
                          "type": "string",
                          "example": "Welcome to the wave"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "description": "Executes a wave search for the authenticated participant.",
        "x-jsonrpc-method": "robot.search",
        "x-wave-operation-group": "Search, profile, and folders",
        "x-primary-example": {
          "id": "op-1",
          "data": {
            "searchResults": {
              "query": "in:inbox",
              "digests": [
                {
                  "title": "Project kickoff",
                  "waveId": "wave://example.com/w+abc123",
                  "snippet": "Welcome to the wave"
                }
              ]
            }
          }
        }
      },
      "RobotFetchProfilesRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "robot.fetchProfiles"
            ],
            "example": "robot.fetchProfiles"
          },
          "params": {
            "type": "object",
            "properties": {
              "fetchProfilesRequest": {
                "type": "object",
                "properties": {
                  "participantIds": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "example": "alice@example.com"
                    }
                  },
                  "language": {
                    "type": "string",
                    "example": "en"
                  }
                }
              }
            },
            "required": [
              "fetchProfilesRequest"
            ]
          }
        },
        "description": "Fetches participant profile records for one or more addresses.",
        "x-jsonrpc-method": "robot.fetchProfiles",
        "x-wave-operation-group": "Search, profile, and folders",
        "x-primary-example": {
          "id": "op-1",
          "method": "robot.fetchProfiles",
          "params": {
            "fetchProfilesRequest": {
              "participantIds": [
                "alice@example.com",
                "bob@example.com"
              ],
              "language": "en"
            }
          }
        }
      },
      "RobotFetchProfilesResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {
              "fetchProfilesResult": {
                "type": "object",
                "properties": {
                  "profiles": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "address": {
                          "type": "string",
                          "example": "alice@example.com"
                        },
                        "name": {
                          "type": "string",
                          "example": "Alice Example"
                        },
                        "imageUrl": {
                          "type": "string",
                          "example": "/static/images/unknown.jpg"
                        },
                        "profileUrl": {
                          "type": "string",
                          "example": ""
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "description": "Fetches participant profile records for one or more addresses.",
        "x-jsonrpc-method": "robot.fetchProfiles",
        "x-wave-operation-group": "Search, profile, and folders",
        "x-primary-example": {
          "id": "op-1",
          "data": {
            "fetchProfilesResult": {
              "profiles": [
                {
                  "address": "alice@example.com",
                  "name": "Alice Example",
                  "imageUrl": "/static/images/unknown.jpg",
                  "profileUrl": ""
                }
              ]
            }
          }
        }
      },
      "RobotFolderActionRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "robot.folderAction"
            ],
            "example": "robot.folderAction"
          },
          "params": {
            "type": "object",
            "properties": {
              "waveId": {
                "type": "string",
                "example": "example.com!w+abc123"
              },
              "waveletId": {
                "type": "string",
                "example": "example.com!conv+root"
              },
              "modifyHow": {
                "type": "string",
                "example": "markAsRead"
              },
              "blipId": {
                "type": "string",
                "example": "b+root"
              }
            },
            "required": [
              "waveId",
              "waveletId",
              "modifyHow"
            ]
          }
        },
        "description": "Marks the wave or a specific blip as read or unread for the current user.",
        "x-jsonrpc-method": "robot.folderAction",
        "x-wave-operation-group": "Search, profile, and folders",
        "x-primary-example": {
          "id": "op-1",
          "method": "robot.folderAction",
          "params": {
            "waveId": "example.com!w+abc123",
            "waveletId": "example.com!conv+root",
            "modifyHow": "markAsRead",
            "blipId": "b+root"
          }
        }
      },
      "RobotFolderActionResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {}
          }
        },
        "description": "Marks the wave or a specific blip as read or unread for the current user.",
        "x-jsonrpc-method": "robot.folderAction",
        "x-wave-operation-group": "Search, profile, and folders",
        "x-primary-example": {
          "id": "op-1",
          "data": {}
        }
      },
      "RobotExportSnapshotRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "robot.exportSnapshot"
            ],
            "example": "robot.exportSnapshot"
          },
          "params": {
            "type": "object",
            "properties": {
              "waveId": {
                "type": "string",
                "example": "example.com!w+abc123"
              },
              "waveletId": {
                "type": "string",
                "example": "example.com!conv+root"
              }
            },
            "required": [
              "waveId",
              "waveletId"
            ]
          }
        },
        "description": "Exports a committed wavelet snapshot as raw JSON.",
        "x-jsonrpc-method": "robot.exportSnapshot",
        "x-wave-operation-group": "Export and import",
        "x-primary-example": {
          "id": "op-1",
          "method": "robot.exportSnapshot",
          "params": {
            "waveId": "example.com!w+abc123",
            "waveletId": "example.com!conv+root"
          }
        }
      },
      "RobotExportSnapshotResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {
              "rawSnapshot": {
                "type": "string",
                "example": "{\"waveletId\":\"example.com!conv+root\",\"version\":42}"
              }
            }
          }
        },
        "description": "Exports a committed wavelet snapshot as raw JSON.",
        "x-jsonrpc-method": "robot.exportSnapshot",
        "x-wave-operation-group": "Export and import",
        "x-primary-example": {
          "id": "op-1",
          "data": {
            "rawSnapshot": "{\"waveletId\":\"example.com!conv+root\",\"version\":42}"
          }
        }
      },
      "RobotExportDeltasRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "robot.exportDeltas"
            ],
            "example": "robot.exportDeltas"
          },
          "params": {
            "type": "object",
            "properties": {
              "waveId": {
                "type": "string",
                "example": "example.com!w+abc123"
              },
              "waveletId": {
                "type": "string",
                "example": "example.com!conv+root"
              },
              "fromVersion": {
                "type": "string",
                "example": "BASE64_HASHED_VERSION_START"
              },
              "toVersion": {
                "type": "string",
                "example": "BASE64_HASHED_VERSION_END"
              }
            },
            "required": [
              "waveId",
              "waveletId",
              "fromVersion",
              "toVersion"
            ]
          }
        },
        "description": "Exports serialized deltas plus the target hashed version.",
        "x-jsonrpc-method": "robot.exportDeltas",
        "x-wave-operation-group": "Export and import",
        "x-primary-example": {
          "id": "op-1",
          "method": "robot.exportDeltas",
          "params": {
            "waveId": "example.com!w+abc123",
            "waveletId": "example.com!conv+root",
            "fromVersion": "BASE64_HASHED_VERSION_START",
            "toVersion": "BASE64_HASHED_VERSION_END"
          }
        }
      },
      "RobotExportDeltasResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {
              "rawDeltas": {
                "type": "array",
                "items": {
                  "type": "string",
                  "example": "BASE64_DELTA_BYTES"
                }
              },
              "targetVersion": {
                "type": "string",
                "example": "BASE64_HASHED_VERSION_TARGET"
              }
            }
          }
        },
        "description": "Exports serialized deltas plus the target hashed version.",
        "x-jsonrpc-method": "robot.exportDeltas",
        "x-wave-operation-group": "Export and import",
        "x-primary-example": {
          "id": "op-1",
          "data": {
            "rawDeltas": [
              "BASE64_DELTA_BYTES"
            ],
            "targetVersion": "BASE64_HASHED_VERSION_TARGET"
          }
        }
      },
      "RobotExportAttachmentRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "robot.exportAttachment"
            ],
            "example": "robot.exportAttachment"
          },
          "params": {
            "type": "object",
            "properties": {
              "attachmentId": {
                "type": "string",
                "example": "att+123"
              }
            },
            "required": [
              "attachmentId"
            ]
          }
        },
        "description": "Exports attachment bytes together with the stored file metadata.",
        "x-jsonrpc-method": "robot.exportAttachment",
        "x-wave-operation-group": "Export and import",
        "x-primary-example": {
          "id": "op-1",
          "method": "robot.exportAttachment",
          "params": {
            "attachmentId": "att+123"
          }
        }
      },
      "RobotExportAttachmentResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {
              "attachmentData": {
                "type": "object",
                "properties": {
                  "fileName": {
                    "type": "string",
                    "example": "design.pdf"
                  },
                  "creator": {
                    "type": "string",
                    "example": "alice@example.com"
                  },
                  "data": {
                    "type": "string",
                    "example": "BASE64_ATTACHMENT_BYTES"
                  }
                }
              }
            }
          }
        },
        "description": "Exports attachment bytes together with the stored file metadata.",
        "x-jsonrpc-method": "robot.exportAttachment",
        "x-wave-operation-group": "Export and import",
        "x-primary-example": {
          "id": "op-1",
          "data": {
            "attachmentData": {
              "fileName": "design.pdf",
              "creator": "alice@example.com",
              "data": "BASE64_ATTACHMENT_BYTES"
            }
          }
        }
      },
      "RobotImportDeltasRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "robot.importDeltas"
            ],
            "example": "robot.importDeltas"
          },
          "params": {
            "type": "object",
            "properties": {
              "waveId": {
                "type": "string",
                "example": "example.com!w+abc123"
              },
              "waveletId": {
                "type": "string",
                "example": "example.com!conv+root"
              },
              "rawDeltas": {
                "type": "array",
                "items": {
                  "type": "string",
                  "example": "BASE64_DELTA_BYTES"
                }
              }
            },
            "required": [
              "waveId",
              "waveletId",
              "rawDeltas"
            ]
          }
        },
        "description": "Imports serialized deltas into the target wavelet and reports the first imported version.",
        "x-jsonrpc-method": "robot.importDeltas",
        "x-wave-operation-group": "Export and import",
        "x-primary-example": {
          "id": "op-1",
          "method": "robot.importDeltas",
          "params": {
            "waveId": "example.com!w+abc123",
            "waveletId": "example.com!conv+root",
            "rawDeltas": [
              "BASE64_DELTA_BYTES"
            ]
          }
        }
      },
      "RobotImportDeltasResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {
              "importedFromVersion": {
                "type": "integer",
                "example": 42
              }
            }
          }
        },
        "description": "Imports serialized deltas into the target wavelet and reports the first imported version.",
        "x-jsonrpc-method": "robot.importDeltas",
        "x-wave-operation-group": "Export and import",
        "x-primary-example": {
          "id": "op-1",
          "data": {
            "importedFromVersion": 42
          }
        }
      },
      "RobotImportAttachmentRequest": {
        "type": "object",
        "required": [
          "id",
          "method",
          "params"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "method": {
            "type": "string",
            "enum": [
              "robot.importAttachment"
            ],
            "example": "robot.importAttachment"
          },
          "params": {
            "type": "object",
            "properties": {
              "waveId": {
                "type": "string",
                "example": "example.com!w+abc123"
              },
              "waveletId": {
                "type": "string",
                "example": "example.com!conv+root"
              },
              "attachmentId": {
                "type": "string",
                "example": "att+123"
              },
              "attachmentData": {
                "type": "object",
                "properties": {
                  "fileName": {
                    "type": "string",
                    "example": "design.pdf"
                  },
                  "creator": {
                    "type": "string",
                    "example": "alice@example.com"
                  },
                  "data": {
                    "type": "string",
                    "example": "BASE64_ATTACHMENT_BYTES"
                  }
                }
              }
            },
            "required": [
              "waveId",
              "waveletId",
              "attachmentId",
              "attachmentData"
            ]
          }
        },
        "description": "Stores attachment bytes in the target wavelet context.",
        "x-jsonrpc-method": "robot.importAttachment",
        "x-wave-operation-group": "Export and import",
        "x-primary-example": {
          "id": "op-1",
          "method": "robot.importAttachment",
          "params": {
            "waveId": "example.com!w+abc123",
            "waveletId": "example.com!conv+root",
            "attachmentId": "att+123",
            "attachmentData": {
              "fileName": "design.pdf",
              "creator": "alice@example.com",
              "data": "BASE64_ATTACHMENT_BYTES"
            }
          }
        }
      },
      "RobotImportAttachmentResponse": {
        "type": "object",
        "required": [
          "id",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "op-1"
          },
          "data": {
            "type": "object",
            "properties": {}
          }
        },
        "description": "Stores attachment bytes in the target wavelet context.",
        "x-jsonrpc-method": "robot.importAttachment",
        "x-wave-operation-group": "Export and import",
        "x-primary-example": {
          "id": "op-1",
          "data": {}
        }
      }
    }
  }
}