Implementation contract
API surface
Authentication is an RWA.io session cookie. Wallet signatures are needed only where the owner appends to the on-chain ledger.
| Method | Path | Purpose |
|---|---|---|
| POST | /v1/assets | Create the durable identity, edition 1 and the genesis event |
| GET | /v1/assets | List assets (public fields only) |
| GET | /v1/assets/:id | Asset, current edition, chain integrity and anchor state |
| GET | /v1/assets/:id/timeline | Full attributable history plus the integrity verdict |
| POST | /v1/assets/:id/events | Append a typed event — custom types allowed (owner) |
| GET/POST | /v1/assets/:id/versions | Immutable content snapshots |
| GET/POST | /v1/assets/:id/contributors | Roster and role assignment |
| GET/POST | /v1/assets/:id/contributions | The appendix; submit with an account, no wallet |
| POST | /v1/contributions/:id/decision | Owner accepts (merges) or declines (appendix) |
| POST | /v1/assets/:id/invites | Invite a cited org, reviewer or contributor |
| POST | /v1/invites/accept | Accept an invitation |
| GET/POST | /v1/assets/:id/editions | List editions; prepare the next anchor |
| POST | /v1/events/:id/anchor | Anchor one individual event on demand |
| POST | /v1/anchors/:id/confirm | Verify the transaction and record the anchor |
| POST | /v1/assets/:id/fork | Verified project fork; the parent is never mutated |
| POST | /v1/assets/:id/publish-dns | Sign the manifest and issue the TXT record to add |
| POST | /v1/assets/:id/verify-dns | Resolve the record now and record what was observed |
| GET | /v1/manifests/:hostname | Resolve the current signed manifest |
| POST | /v1/signals | Record a consented signal for export |
| POST | /v1/uploads/sign | Signed upload URL into the private documents bucket |
Verifying history yourself
Each event hash is keccak256 over these seven fields joined by U+001F, in order:
assetId | seq | eventType | actor | occurredAt | contentHash | priorEventHash
contentHash = keccak256(canonical JSON: keys sorted at every depth, no whitespace)
occurredAt = ISO-8601 UTC, millisecond precision
genesis prior = 0x00…00
editionHash = keccak256(versionContentHash | lastEventHash)
= the bytes32 appended to DataStorage.updateDynamicDataRead the on-chain array with DataStorage.getDynamicDataStorage(token) and compare entry i against the recomputed edition hash. Reordering or editing any event breaks the chain.