Proof of Genesis Backups
Proof of Genesis is GEN’s asset backup and provenance layer. It lets you manually back up assets from the assets page, or enable automatic backup for selected asset events. The default automatic set is downloaded and published videos/images once the paid feature is enabled; generated and uploaded assets remain supported event sources.
Mental model
Section titled “Mental model”Proof of Genesis stores a durable GEN record for each backup and uploads the asset bytes to Walrus. Each successful backup records the source hash, Walrus blob metadata, verification status, and billing metadata.
The asset page should support both:
- Manual backup: user chooses an image or video asset and backs it up on demand.
- Auto backup: agent-level settings choose which asset sources are backed up automatically.
Supported asset sources:
generated— generated inside GENuploaded— uploaded into the asset librarydownloaded— downloaded/exported from a vidsheetpublished— published to a connected social account
Supported asset types:
videoimage
Privacy model
Section titled “Privacy model”Walrus blobs are public by default. Blob IDs are not secrets. For public assets, GEN may upload raw bytes to Walrus. For private assets, GEN must encrypt before upload; otherwise anyone with the blob ID could fetch the asset from a Walrus aggregator.
The API records visibility on every proof row:
public— raw upload is allowed.private— must be encrypted before upload. Raw private backup requests are rejected before billing or Walrus work.
Recommended private proof metadata:
- original asset SHA-256 stored privately in GEN
- encrypted blob SHA-256 stored in the proof row
- Walrus blob ID/object/storage metadata
- encryption scheme and key policy version
Configure auto-backup settings
Section titled “Configure auto-backup settings”Auto-backup settings live on Agent Core:
curl -X PATCH "https://agent-core.gen.pro/v1/agents/$AGENT_ID/core" \ -H "X-API-Key: $GEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "proof_of_genesis_enabled": true, "proof_of_genesis_auto_backup_sources": ["downloaded", "published"], "proof_of_genesis_auto_backup_asset_types": ["video", "image"] }'Fields:
| Field | Type | Description |
|---|---|---|
proof_of_genesis_enabled | boolean | Master switch for automatic Proof of Genesis backup. |
proof_of_genesis_auto_backup_sources | array | Any of generated, uploaded, downloaded, published. Defaults to downloaded and published; empty means no automatic backup. |
proof_of_genesis_auto_backup_asset_types | array | Any of video, image. |
List backups
Section titled “List backups”GET /v1/agents/{agent_id}/proof-of-genesis/backupsReturns active backup rows newest first. Removed rows are hidden by default.
curl "https://agent-core.gen.pro/v1/agents/$AGENT_ID/proof-of-genesis/backups" \ -H "X-API-Key: $GEN_API_KEY"To include removed rows for audit:
curl "https://agent-core.gen.pro/v1/agents/$AGENT_ID/proof-of-genesis/backups?include_removed=true" \ -H "X-API-Key: $GEN_API_KEY"Create a manual backup
Section titled “Create a manual backup”POST /v1/agents/{agent_id}/proof-of-genesis/backupsUse this when the user manually chooses an asset from the assets page. The same endpoint can also be called by vidsheet workflows after an automatic source event.
curl -X POST "https://agent-core.gen.pro/v1/agents/$AGENT_ID/proof-of-genesis/backups" \ -H "X-API-Key: $GEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "asset_url": "https://assets.gen.pro/path/to/final.mp4", "asset_type": "video", "visibility": "public", "encrypted": false, "source_event": "manual", "content_type": "video/mp4", "idempotency_key": "content-resource-4821-v1", "metadata": { "content_resource_id": 4821, "vidsheet_id": "vs_123", "row_id": "row_456" } }'Request fields:
| Field | Type | Required | Description |
|---|---|---|---|
asset_url | string | yes | Publicly fetchable GEN asset URL to back up. video_url is accepted as a legacy alias. |
asset_type | enum | no | video or image. Defaults to video. |
visibility | enum | no | private or public. Defaults to private. Private requests must send encrypted: true and encryption_scheme. |
encrypted | boolean | no | Whether the bytes at asset_url are already encrypted before Walrus upload. Required for private backups. |
encryption_scheme | string | conditional | Required when visibility is private, e.g. seal/v1. |
encryption_key_id | string | no | Optional key policy/version identifier for private proof metadata. |
owner_sui_address | string | no | Customer Sui wallet address that should own the Walrus object. Server-triggered auto-backup can resolve this from the user’s Dynamic Sui wallet. |
source_event | enum | no | manual, generated, uploaded, downloaded, or published. Defaults to manual. |
content_type | string | no | MIME type if already known. |
idempotency_key | string | recommended | Stable key for retries. Use the asset/content-resource id plus version. |
metadata | object | no | Caller metadata such as content resource id, vidsheet id, row id, project id, or publish id. |
Success response:
{ "id": 101, "agent_id": "agent_123", "status": "synced", "source_event": "manual", "source_url": "https://assets.gen.pro/path/to/final.mp4", "asset_type": "video", "visibility": "public", "encrypted": false, "encryption_scheme": null, "encryption_key_id": null, "owner_sui_address": "0x0e2f1e8a66445cfecff32e1e3ea3f8632c89aef4808e49acf318247850498f38", "custody_mode": "customer_wallet", "walrus_object_recipient_address": "0x0e2f1e8a66445cfecff32e1e3ea3f8632c89aef4808e49acf318247850498f38", "content_sha256": "5ab58f4c35444f46c7df3788c49edd5fed2c97a57326ad2f32e4f45ace643842", "size_bytes": 4556, "content_type": "video/mp4", "walrus_blob_id": "PqwnXdU4n3cHGsbShjuPm9aGldSHCuXoovhi42IY-X8", "walrus_blob_object_id": "0x9afe196fbd99a3928875e7991...", "walrus_storage_id": "0xe2b5917464b74191f59d0bb1...", "walrus_end_epoch": 420, "walrus_encoded_length_bytes": 66034000, "verification_status": "verified", "billing_operation": "backup_to_blockchain", "billing_charge_id": 42, "billing_outboxed": false}Remove a backup from GEN
Section titled “Remove a backup from GEN”DELETE /v1/agents/{agent_id}/proof-of-genesis/backups/{backup_id}This hides the proof row from the default assets-page list by setting removed_at. It does not guarantee deletion from Walrus or Sui. If the blob was stored permanently, treat the proof as immutable public infrastructure.
curl -X DELETE "https://agent-core.gen.pro/v1/agents/$AGENT_ID/proof-of-genesis/backups/$BACKUP_ID" \ -H "X-API-Key: $GEN_API_KEY"Billing
Section titled “Billing”Proof of Genesis uses the Rails credit ledger operation backup_to_blockchain.
Execution flow:
- Agent Core checks pricing and available credits before upload.
- If the agent has insufficient credits, backup fails before Walrus work.
- If
owner_sui_addressis present, Agent Core passes it to the Walrus publisher so the created Walrus object is transferred to the customer wallet. - On successful Walrus upload and readback verification, Agent Core charges operation
backup_to_blockchainfor the measured GB-month units. - If Rails is temporarily unavailable after success, the charge can be outboxed for retry.
Backups are monthly by default. Agent Core stores new blobs for two Walrus epochs, approximately 28 days, records expires_at, and sets renewal_due_at three days before expiry. Customer-wallet backups are marked owner_signature_required for renewal because the customer owns the Walrus object; GEN-custody backups can be renewed by the GEN publisher wallet after credits are checked.
Error behavior
Section titled “Error behavior”| Status | Meaning |
|---|---|
402 | Insufficient credits or final charge rejected. |
422 | Private asset was not encrypted before upload. |
503 | Proof of Genesis disabled or pricing not configured. |
502 | Funding lookup, source download, Walrus upload, or readback verification failed. |
Automatic backup from vidsheets
Section titled “Automatic backup from vidsheets”Vidsheet and assets-page workflows should call POST /proof-of-genesis/backups when both of these are true:
proof_of_genesis_enabledis true.- The event source and asset type are selected in the agent settings.
Recommended event mapping:
| Vidsheet/assets event | source_event | asset_type |
|---|---|---|
| final render completed | published | video |
| image generated or uploaded | generated or uploaded | image |
| user downloads an export | downloaded | video |
| social publish succeeds | published | video |
Use a stable idempotency_key so retries do not double upload or double bill.
Server-side automatic backup resolves the customer’s Dynamic Sui wallet through Agent Core when owner_sui_address is not provided.