Skip to content

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.

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 GEN
  • uploaded — uploaded into the asset library
  • downloaded — downloaded/exported from a vidsheet
  • published — published to a connected social account

Supported asset types:

  • video
  • image

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

Auto-backup settings live on Agent Core:

Terminal window
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:

FieldTypeDescription
proof_of_genesis_enabledbooleanMaster switch for automatic Proof of Genesis backup.
proof_of_genesis_auto_backup_sourcesarrayAny of generated, uploaded, downloaded, published. Defaults to downloaded and published; empty means no automatic backup.
proof_of_genesis_auto_backup_asset_typesarrayAny of video, image.
GET /v1/agents/{agent_id}/proof-of-genesis/backups

Returns active backup rows newest first. Removed rows are hidden by default.

Terminal window
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:

Terminal window
curl "https://agent-core.gen.pro/v1/agents/$AGENT_ID/proof-of-genesis/backups?include_removed=true" \
-H "X-API-Key: $GEN_API_KEY"
POST /v1/agents/{agent_id}/proof-of-genesis/backups

Use 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.

Terminal window
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:

FieldTypeRequiredDescription
asset_urlstringyesPublicly fetchable GEN asset URL to back up. video_url is accepted as a legacy alias.
asset_typeenumnovideo or image. Defaults to video.
visibilityenumnoprivate or public. Defaults to private. Private requests must send encrypted: true and encryption_scheme.
encryptedbooleannoWhether the bytes at asset_url are already encrypted before Walrus upload. Required for private backups.
encryption_schemestringconditionalRequired when visibility is private, e.g. seal/v1.
encryption_key_idstringnoOptional key policy/version identifier for private proof metadata.
owner_sui_addressstringnoCustomer Sui wallet address that should own the Walrus object. Server-triggered auto-backup can resolve this from the user’s Dynamic Sui wallet.
source_eventenumnomanual, generated, uploaded, downloaded, or published. Defaults to manual.
content_typestringnoMIME type if already known.
idempotency_keystringrecommendedStable key for retries. Use the asset/content-resource id plus version.
metadataobjectnoCaller 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
}
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.

Terminal window
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"

Proof of Genesis uses the Rails credit ledger operation backup_to_blockchain.

Execution flow:

  1. Agent Core checks pricing and available credits before upload.
  2. If the agent has insufficient credits, backup fails before Walrus work.
  3. If owner_sui_address is present, Agent Core passes it to the Walrus publisher so the created Walrus object is transferred to the customer wallet.
  4. On successful Walrus upload and readback verification, Agent Core charges operation backup_to_blockchain for the measured GB-month units.
  5. 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.

StatusMeaning
402Insufficient credits or final charge rejected.
422Private asset was not encrypted before upload.
503Proof of Genesis disabled or pricing not configured.
502Funding lookup, source download, Walrus upload, or readback verification failed.

Vidsheet and assets-page workflows should call POST /proof-of-genesis/backups when both of these are true:

  1. proof_of_genesis_enabled is true.
  2. The event source and asset type are selected in the agent settings.

Recommended event mapping:

Vidsheet/assets eventsource_eventasset_type
final render completedpublishedvideo
image generated or uploadedgenerated or uploadedimage
user downloads an exportdownloadedvideo
social publish succeedspublishedvideo

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.