# page.corvus.publishOps

> Published by [corvus.page](https://lexicon.garden/identity/did:plc:3qc4cbzcriye72qqqodeda26)

✓ This is the authoritative definition for this NSID.

## Description

HTTP alternative to streaming `page.corvus.backchannelFrame#op` frames over a `page.corvus.subscribeOps` WebSocket. Each entry is a `page.corvus.backchannelFrame#op` and is validated, ingested, and broadcast by the same code the backchannel uses, so the wire shape and semantics are identical. No response body — the server-assigned cursor is observed via `page.corvus.subscribeOps#op` echo, same as the backchannel. Ops are processed in order; the procedure stops at the first validation failure (ops that succeeded before the failure remain ingested — same as sending frames one-by-one over the WS).

## Links

- [View on Lexicon Garden](https://lexicon.garden/lexicon/did:plc:3qc4cbzcriye72qqqodeda26/page.corvus.publishOps)
- [Documentation](https://lexicon.garden/lexicon/did:plc:3qc4cbzcriye72qqqodeda26/page.corvus.publishOps/docs)
- [Examples](https://lexicon.garden/lexicon/did:plc:3qc4cbzcriye72qqqodeda26/page.corvus.publishOps/examples)

## Definitions

### `page.corvus.publishOps`

**Type**: `procedure`

#### Input

**Encoding**: `application/json`

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `ops` | `array` | Yes | Ops to publish. Each is a `page.corvus.backchannelFrame#op` carrying an optional `blockId` and the op itself. |

#### Errors

- **Malformed**: Validation failed for one of the submitted ops (missing `blockId`, mismatched author, malformed `op.id`, etc.). The message identifies the offending op by its index in the `ops` array.

## Raw Schema

```json
{
  "id": "page.corvus.publishOps",
  "defs": {
    "main": {
      "type": "procedure",
      "input": {
        "schema": {
          "type": "object",
          "required": [
            "ops"
          ],
          "properties": {
            "ops": {
              "type": "array",
              "items": {
                "ref": "page.corvus.backchannelFrame#op",
                "type": "ref"
              },
              "description": "Ops to publish. Each is a `page.corvus.backchannelFrame#op` carrying an optional `blockId` and the op itself."
            }
          }
        },
        "encoding": "application/json"
      },
      "errors": [
        {
          "name": "Malformed",
          "description": "Validation failed for one of the submitted ops (missing `blockId`, mismatched author, malformed `op.id`, etc.). The message identifies the offending op by its index in the `ops` array."
        }
      ]
    }
  },
  "$type": "com.atproto.lexicon.schema",
  "lexicon": 1,
  "description": "HTTP alternative to streaming `page.corvus.backchannelFrame#op` frames over a `page.corvus.subscribeOps` WebSocket. Each entry is a `page.corvus.backchannelFrame#op` and is validated, ingested, and broadcast by the same code the backchannel uses, so the wire shape and semantics are identical. No response body — the server-assigned cursor is observed via `page.corvus.subscribeOps#op` echo, same as the backchannel. Ops are processed in order; the procedure stops at the first validation failure (ops that succeeded before the failure remain ingested — same as sending frames one-by-one over the WS)."
}
```
