Skip to main content

Endpoints

Every endpoint is served at https://pear.habitat.network/xrpc/{nsid}, and each row links to its full request/response schema in the HTTP reference. Status is relative to the permissioned data proposal:

  • 🟢 behaves as the proposal describes
  • 🟡 deviates from the proposal or ignores some parameters
  • 🔴 not implemented

Space management​

Proposal com.atproto.simplespace.*. All of these take OAuth; Habitat does not implement the proposal's manage scope operations, so authorization is the space's owner relation instead.

EndpointStatusNotes
network.habitat.simplespace.createSpace🟡The authority is assigned by Habitat rather than taken from the caller; did may only name the caller or the caller's org.
network.habitat.simplespace.addMember🟢Owner only. Will include the added user's repos in the space.
network.habitat.simplespace.removeMember🟢Owner only.
network.habitat.simplespace.listMembers🟡cursor is accepted but ignored — one unpaginated page.
network.habitat.simplespace.deleteSpace🟢Owner only; fans out notifySpaceDeleted.
network.habitat.simplespace.getSpace🔴Spaces carry no host-specific config to describe.
network.habitat.simplespace.updateSpace🔴Spaces carry no host-specific config to describe.

Records and blobs​

Proposal com.atproto.space.*. Writes take OAuth and only ever target the caller's own repo; reads additionally accept a space credential.

EndpointStatusNotes
network.habitat.space.putRecord🟡According to the proposal, users will technically be able to put records into any space. It's the space host's responsibility to not propogate repos that don't belong to the space during listRepos. Since Habitat is the repo and space host, we just block writes to repos the user doesn't have access to. validate returns NotSupported — records are not checked against their lexicon.
network.habitat.space.getRecord🟢
network.habitat.space.listRecords🟡limit, cursor, and reverse are accepted but ignored — one unpaginated page.
network.habitat.space.deleteRecord🟢
network.habitat.space.getBlob🟢
com.atproto.space.createRecord🔴Use putRecord.
com.atproto.space.applyWrites🔴There is no batched write; apply each change on its own.
network.habitat.repo.uploadBlobHabitat extension, with no proposal equivalent. Upload a blob here first, then reference the returned blob in a space record.

Sync​

Served by Habitat in both the space host and repo host roles, since it is both for every space it hosts. Callable with OAuth or a space credential.

EndpointStatusNotes
network.habitat.space.listSpaces🟢Lists the spaces the caller holds a permissioned repo in — those it has written at least one record to, most recently written first — matching the proposal. A space the caller can only read is not listed. type/did filters; limit/cursor accepted but ignored.
network.habitat.space.listRepos🟡limit/cursor are accepted but ignored — one unpaginated page.
network.habitat.space.listRepoOps🟢Takes since and limit (default 100). The final page carries the signed commit; it is omitted when Habitat holds no signing key for that repo's owner.
network.habitat.space.getLatestCommit🟢
network.habitat.space.getRepo🟢Returns the CAR with the signed commit and the DRISL index as its two roots.

Notifications​

EndpointStatusNotes
network.habitat.space.registerNotify🟢Space host only, space credential only. Registrations expire after 24 hours and must be renewed.

Credentials​

EndpointStatusNotes
network.habitat.space.getDelegationToken🟡OAuth, 60-second tokens. Signed with Habitat's host key (#habitat).
network.habitat.space.getSpaceCredential🟡Requires a delegation token. Credentials last 1 hour where the proposal defaults to 2, and clientAttestation returns NotSupported.

OAuth scopes​

The proposal's space: scopes aren't implemented yet. Callers have access to all space types.