page.corvus.publishOps
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).
Details · procedure
| Kind | procedure |
|---|---|
| Authority | corvus.page |
| Indexed |
Procedure
procedure · POSTInput
application/jsonOps 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.
Similar lexicons
semantic matchLexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.
-
page.corvus.subscribeOps
subscriptionSubscribe to CRDT op streams from a corvus server over a single WebSocket connection. **Connection-scoped, multi-block**: one connection authenticates one DID and may carry subscriptions to many block sets. Subscribes and unsubscribes happen mid-connection via `page.corvus.backchannelFrame#subscribe` / `#unsubscribe` — the upgrade itself takes no parameters and starts with no active subscriptions. **Subscriptions name an explicit block set.** A subscribe frame carries the `blockIds` the client
-
Wire format for messages a client sends server-bound over the same WebSocket opened by `page.corvus.subscribeOps`. Atproto's `subscription` lexicon type is server-push only — every server→client frame is defined under `page.corvus.subscribeOps`. The client→server side of the duplex socket is described here as a separate frame union. Clients dispatch on each message's `$type` discriminator (e.g. `page.corvus.backchannelFrame#op`). **Multi-block.** A single WebSocket connection authenticates one