Portal
Documentation: all sections

Relay sharing

A Relay is a temporary, revocable share: text and files, sealed at rest, reachable through a single link whose secret is shown once. The sender can revoke it at any moment, and revoking destroys the ciphertext immediately. Recipients need nothing but the link (and the PIN, if one was set); no account, no wallet.

Three properties carry the design:

Quickstart

Share a note for 24 hours, PIN-protected, at most 3 opens:

curl https://api.buildsable.com/v1/relays \
-H "Authorization: Bearer $SABLE_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
  "text": "The rendezvous is at 9.",
  "expires_in_secs": 86400,
  "pin": "4172",
  "max_accesses": 3
}'
{
  "id": "relay_c04b…",
  "status": "active",
  "expires_at": "2026-09-04T17:00:00Z",
  "share_url": "https://buildsable.com/relay/…",
  "allow_download": true,
  "pin_required": true,
  "note": "The link contains the one-time secret; only its hash is stored."
}

The share_url contains the one-time secret and cannot be shown again. Files travel base64-encoded in the create body:

{
  "files": [
    {
      "name": "report.pdf",
      "content_type": "application/pdf",
      "content_b64": "JVBERi0xLjc…"
    }
  ],
  "allow_download": true
}

Endpoints

Owner endpoints are session-authed (Authorization: Bearer sess_…); access endpoints are public, because the recipient holds only the link secret.

MethodPathAuthWhat it does
POST/v1/relaysSessionCreate a relay. Returns the one-time share_url.
GET/v1/relaysSessionList your relays: status, access counts, sizes (metadata only).
POST/v1/relays/{id}/revokeSessionRevoke: destroy the ciphertext immediately.
POST/v1/relay-access/{secret}PublicOpen a relay. Body {pin?}. Returns {pin_required: true} or the content listing.
POST/v1/relay-access/{secret}/objects/{id}PublicFetch one file's content. On view-only relays, only image/* and text/* are served.

A missing, expired, revoked, or capped-out secret returns 404 uniformly.

Content rules

v1 does no malware scanning. Instead the type allowlist is deliberately conservative, and files are stored sealed and never executed:

Anything outside the allowlist is refused at creation.

Limits