RCAN v1.3 · §21 Preview

How the RRF and RCAN Work Together

Two independent standards designed to compose. Use either alone or both together for globally identifiable, cryptographically verifiable robot identity.

Two Different Things, Designed to Compose

RRF

The Registry

  • Assigns permanent RRNs
  • Any robot can register
  • No software required
  • Neutral, independent governance
RCAN

The Protocol

  • Defines how robots identify, sign, and prove behavior
  • Any language or runtime
  • Ed25519 message signing
  • Hierarchical URIs (RURIs)
  • Current spec: v1.3

Used together: a robot becomes globally identifiable via its RRN and cryptographically verifiable via its RCAN keys. Anyone can look up the robot, resolve its RURI, and verify that its signed messages are authentic.

The Identifier Relationship

RRN
RRN-00000001

Opaque, permanent, registry-assigned. Stable across renames, re-deployments, ownership transfers.

RURI
rcan://rcan.dev/continuonai/opencastor-rpi5/bob

Hierarchical, protocol-level address. Human-readable. Scoped to an organization and model.

Link

A registered robot can associate its RURI with its RRN. The registry stores the mapping.

Lookup
GET /api/v1/resolve?ruri=rcan://...

Returns the RRN if the RURI is registered.

Ownership Proof Flow

The challenge/sign/verify handshake from RCAN §21. A robot proves it holds the private key for its RURI without transmitting that key.

1
Request a challenge
POST /api/v1/challenge
{ "ruri": "rcan://rcan.dev/myorg/mybot/unit1" }
2
Registry returns a 32-byte nonce
{ "nonce": "a3f8...", "expires_at": "2026-03-12T00:05:00Z" }
3
Robot signs nonce with Ed25519 key
# Same key used for RCAN message signing
signature = ed25519_sign(private_key, nonce)
4
Submit proof
POST /api/v1/verify
{ "ruri": "...", "nonce": "...", "signature": "...", "public_key": "..." }
5
Registry verifies → robot promoted to "verified" tier
{ "status": "verified", "rrn": "RRN-00000005", "verified_at": "2026-03-12T00:00:42Z" }

Using rcan-py

from rcan import RCANClient, MessageSigner

signer = MessageSigner(private_key_path="~/.rcan/key.pem")
client = RCANClient(ruri="rcan://rcan.dev/myorg/mybot/unit1")

# Register with the Robot Registry Foundation
result = client.registry_register(
    registry_url="https://robotregistryfoundation.org/api/v1",
    metadata={"name": "My Robot", "manufacturer": "MyOrg"}
)
print(result.rrn)  # "RRN-000XXXXX"

rcan-py handles the full challenge/verify handshake automatically

Choose Your Path

📋

Without RCAN

Submit the form, get an RRN. No software to install, no keys to manage. Works for any robot — commercial, research, homebrew.

Verification tier: community — suitable for most use cases. The robot is registered and globally identifiable.

Register now →
🔐

With RCAN

If your robot runs RCAN, prove ownership cryptographically and automatically upgrade to verified or manufacturer tier.

The registry stores your public key. Anyone can verify your robot's signed messages without contacting you directly.

Get RCAN →