Skip to content

Sync and blob fetch

Stable

Generated from capsule-server/openapi.json, the OpenAPI 3.2 document capsule-server emits and mise run openapi-check-kynos keeps current. To change a description on this page, change the annotation on the handler or model it comes from and regenerate — this file is build output. The auth model, error contract, and conventions common to every endpoint are on the REST API overview.

Fetch a ciphertext blob by its content address, ranged.

Opaque octets: the server holds no key and this route never learns what it is serving. Any authenticated account may fetch any live address — see [crate::serve] for why that is a capability model rather than a hole, and for the 403 the contract describes and nothing implements.

The one answer that is account-scoped is the transient 409: it reports the caller’s own in-flight upload and nobody else’s (S-C40).

Authentication: required — bearer.

ParameterInTypeDescription
If-Modified-SinceheaderstringThe date the client’s copy carries, per RFC 9110 section 13.1.3.
If-None-MatchheaderstringThe entity tag the client already holds, per RFC 9110 section 13.1.2.
If-RangeheaderstringThe entity tag the client’s partial copy came from, per RFC 9110 section 13.1.5. The Range is honoured only if it matches this representation under the strong comparison; otherwise the whole representation is sent.
RangeheaderstringThe part of the representation to transfer, per RFC 9110 section 14.2. A field this operation cannot apply is ignored and the whole representation is sent. Example: bytes=0-1023.
hashpathstringRequired. The blob’s ciphertext content address, lowercase hex.
StatusBodyDescription
200string
application/octet-stream
the whole representation. Headers: Accept-Ranges, ETag, Last-Modified.
206string
application/octet-stream
the part the request asked for. Headers: Accept-Ranges, Content-Range, ETag, Last-Modified.
304the client’s copy is current. Headers: ETag, Last-Modified.
400CodedProblem
application/problem+json
Bad Request.
401CodedProblem
application/problem+json
Unauthorized. Headers: WWW-Authenticate.
403CodedProblem
application/problem+json
Forbidden.
404CodedProblem
application/problem+json
Not found.
409CodedProblem
application/problem+json
Upload in progress.
410CodedProblem
application/problem+json
Gone.
413the request body exceeds the configured limit.
500CodedProblem
application/problem+json
Internal server error.

Returns the changes in the caller’s library after cursor.

Read-only and idempotent: two calls with the same cursor return the same page, because the cursor names a position rather than consuming one. That is what makes a lost response harmless and a retry free.

Authentication: required — bearer.

ParameterInTypeDescription
cursorquerystring | nullThe opaque cursor a previous page returned. Absent means “from the beginning”.
page_sizequeryinteger | nullHow many entries to return. Clamped into the range this server serves. u32 and not usize: Kynos refuses to describe a platform-width integer, and it is right to — a schema whose bounds depend on the server’s pointer size is a schema no client can rely on.
StatusBodyDescription
200SyncPageResponse
application/json
OK.
400CodedProblem
application/problem+json
Bad Request.
401CodedProblem
application/problem+json
Unauthorized. Headers: WWW-Authenticate.
403CodedProblem
application/problem+json
Forbidden.
413the request body exceeds the configured limit.
500CodedProblem
application/problem+json
Internal server error.

The models these endpoints carry. A field whose type names another model links to it when this page documents that model, which it does when some path from an operation reaches it within 4 references. A model only ever reached deeper than that is named without being expanded.

An RFC 9457 problem detail.

FieldTypeDescription
typestringRequired.
titlestring
statusintegerRequired.
detailstring
instancestring
codestringRequired. The stable error.* catalog code. The client localizes this; detail stays English. Present on every problem this server renders.

One blob an asset holds.

FieldTypeDescription
roleWireBlobRoleRequired. The blob’s role in the bundle.
hashstringRequired. Its ciphertext content address, lowercase hex.
sizeintegerRequired. Its size in bytes, so a client can budget a fetch before issuing one.

One change in a library.

FieldTypeDescription
asset_idstringRequired. The asset that changed.
album_idstringRequired. The album it belongs to. The client keeps its anti-rewind high-water mark per album.
protocol_versionstringRequired. The album’s pinned protocol date. A client refuses an entry above its own maximum rather than applying it partially.
sync_seqintegerRequired. The entry’s position. Strictly increasing within a page, and therefore within any album the page touches.
changeWireChangeKindRequired. What this is to the client that asked.
manifest_cborstring | nullThe signed manifest, base64 of the provenance blob’s exact bytes (S-C30). Absent on a tombstone, and absent — with a loud server-side log — when the index names a provenance blob the store cannot produce.
metadata_blobstring | nullThe encrypted metadata blob’s content address.
blobsSyncBlobRef[]Required. The asset’s original and derivative blobs.
original_heldbooleanRequired. Whether the original has landed. false is the derived awaiting-original state.
changed_atstringRequired. When the change happened, RFC 3339.

A page of the feed.

FieldTypeDescription
entriesSyncEntry[]Required. The changes, in sync_seq order.
next_cursorstringRequired. The cursor that resumes after the last entry. Always present, including on an empty page, where it re-mints the position the client arrived with. A client therefore never has to decide whether to keep its old cursor.
has_morebooleanRequired. Whether the server holds changes beyond this page. Answered from the owner’s high-water mark rather than by fetching one more entry, so a caught-up client is told so without paying for a page it will not receive.

A blob’s role in its asset bundle, as the wire spells it.

A wire type of its own rather than a serde derive on [BlobRole]: the state ports’ records deliberately derive no serde traits, so that a record cannot be smuggled through a store built for another. The mapping is one match in one direction.

One of: original, derivative, metadata, provenance, backup.

What an entry is, relative to the client that asked for it.

One of: created, updated, deleted.