Data plane
Managed cloud leases receive a temporary direct SSH endpoint. Operator-owned infrastructure uses revocable gateway grants over outbound mTLS tunnels.
Prism Network / Developer reference
Prism matches digest-pinned container workloads with bonded NVIDIA capacity, holds the maximum cost in USDG, starts billing only after runtime admission, and resolves the lease through an onchain settlement record.
System model
The public web application is the identity boundary. It verifies Privy access tokens, establishes an HTTP-only same-origin session, rate-limits requests, and signs service-to-service identity assertions. Browsers never receive orchestration signing keys, settlement keys, device keys, or provider credentials.
Managed cloud leases receive a temporary direct SSH endpoint. Operator-owned infrastructure uses revocable gateway grants over outbound mTLS tunnels.
PostgreSQL is the system of record for accounts, quotes, provider instances, lease transitions, settlement transactions, and proof publication.
Robinhood Chain contracts enforce escrow limits, active-lease bounds, dispute timing, provider payment, platform fees, and refunds.
The contracts carrying leases today are owned directly by the Governance Safe, so a configuration change takes effect as soon as both signers agree. A second set is deployed that routes routine changes through a 48-hour timelock and leaves pausing, bond freezes and dispute resolution outside it. Migration details will be published before those contracts start carrying leases.
Renter integration
Publish a Linux/amd64 OCI image to a public registry and address it by its complete immutable sha256 digest.
Create a disposable Ed25519 key. Submit only the single-line public key; the private key must never leave the renter machine.
Use the console to create a Privy-backed Prism session and connect the wallet that will fund escrow.
Request a five-minute quote, approve the exact maximum USDG amount, and call createLease with the quote-derived reference.
Confirm the finalized funding transaction, poll the lease until active, retrieve access, and connect over SSH. The SDK pins the host key for the life of the lease and reports what that pin is worth: a key the node published under its own device key, or, for capacity brokered through a third-party cloud, no publishable key at all. Pass requireHostKey to refuse a lease that cannot be pinned.
Identity boundary
Interactive access uses Privy. The browser obtains an access token, posts it to/api/auth/session, and receives a secure, HTTP-only, same-site cookie with a one-hour maximum age. Mutation endpoints require both that session and a same-origin request.
Autonomous agents authenticate with a wallet signature instead of a browser session; see Agent access. Browser cookies and browser identity assertions are not accepted as service credentials.
Web application API
Browser integrations use https://prismnetwork.tech/api/app. Responses are JSON, never cached, and include X-Request-Id. Mutation bodies must be application/json and no larger than 256 KiB.
/api/app/offersPublicList currently schedulable, bonded offers.
/api/app/leases/matchSessionCreate a five-minute quote for an image, runtime, VRAM floor, and optional node.
/api/app/leases/confirmSessionBind a finalized funding event and Ed25519 public key to a quote.
/api/app/leasesSessionList leases owned by the authenticated account.
/api/app/leases/{lease_id}/accessSessionReturn direct SSH or gateway access only after readiness and chain finality.
/api/app/leases/{lease_id}/releaseSessionEnd an active lease early. Access closes and the meter stops; settlement charges the seconds it was open and returns the rest of the deposit.
/api/proofPublicRead the sanitized finalized/refunded public proof feed.
/api/activityPublicRead the renter-anonymous recent network activity feed.
{
"request": {
"image": "docker.io/nvidia/cuda@sha256:<64 lowercase hex chars>",
"duration_seconds": 3600,
"min_vram_mib": 45000,
"preferred_node_id": null
}
}{
"quote_id": "9d417fc0-6f42-4d8b-a44f-9ab3cf1bc41f",
"node_id": "0x<32-byte node id>",
"image": "docker.io/nvidia/cuda@sha256:<digest>",
"duration_seconds": 3600,
"min_vram_mib": 45000,
"rate_per_second": 222,
"maximum_escrow": 799200,
"expires_at": "2026-07-20T18:00:00Z"
}image must be public, whitespace-free, at most 512 characters, and end in a complete @sha256: digest.duration_seconds must be between 1 and 21,600 seconds.min_vram_mib must be a positive integer compatible with an online offer.preferred_node_id is optional; omit it for deterministic best-match selection.Wallet transaction
A quote does not reserve capacity or move funds. The renter wallet sends two sequential transactions: an exact USDG approval followed byLeaseEscrowV1.createLease. The client reference is the Keccak-256 hash of the UTF-8 quote UUID.
const maximum = BigInt(quote.rate_per_second)
* BigInt(quote.duration_seconds);
const clientReference = keccak256(toBytes(quote.quote_id));
await wallet.writeContract({
address: USDG,
abi: erc20Abi,
functionName: "approve",
args: [LEASE_ESCROW, maximum],
});
await wallet.writeContract({
address: LEASE_ESCROW,
abi: escrowAbi,
functionName: "createLease",
args: [quote.node_id, quote.duration_seconds, clientReference],
});Wait for both receipts and reject any reverted status. Then confirm the funding transaction through the application API. Confirmation independently verifies the finalized LeaseFunded event, node, duration, renter wallet, deposit, and quote-derived client reference.
{
"quote_id": "9d417fc0-6f42-4d8b-a44f-9ab3cf1bc41f",
"transaction_hash": "0x<funding transaction hash>",
"ssh_authorized_key": "ssh-ed25519 AAAA... workstation"
}State model
fundedEscrow event confirmed and associated with a five-minute quote.
provisioningCapacity assignment and workspace provisioning are in progress.
readyGPU and access admission checks passed; access start is pending finality.
activeBillable access is available to the authenticated renter.
closingCredentials are revoked and the runtime is being destroyed.
settlement_pendingUsage evidence has produced an onchain settlement proposal.
disputedFinalization is blocked pending Safe-controlled resolution.
finalizedProvider payment, platform fee, and renter refund are complete.
refundedThe lease ended without a provider charge.
failedProvisioning failed before a final onchain transition was recorded.
Transitions are idempotent and persisted before external side effects. Provider instance IDs, chain transaction bytes, nonces, hashes, confirmation blocks, and final-state evidence survive worker restarts. A ten-minute provision timeout is the refund boundary for leases that never reach billable access.
Execution environments
Operators can also serve open-class leases from machines they already own, with the card left on the host driver and an optional workload filling the time between leases. Serving leases from a machine you already own covers the host requirements, the preflight, and the idle workload.
Robinhood Chain mainnet
0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168Compute settlement, 6 decimals0x0A1e0Cc751f77C2C93760FC957CC8E4E779b2bC8Supplier bond asset, 18 decimals0xa7Ca8e43c599b978095c391bd018A35BA6e7B71DSupplier bonds and offers0xfD4228eEEfC49e4b76A0CD40af9fdd546220B2FDLease funding and settlement0xAF1113cE9E65D79daA87005A729Ab9Bc1A9fc60aAdministration, emergency and dispute authorityrpc.mainnet.chain.robinhood.comUsage accounting
Billing begins only after Prism confirms runtime and access readiness onchain. Closing revokes access first, destroys the execution environment, and then assembles bounded usage evidence.
Clamp confirmed runtime to the funded duration and preserve provider or physical-node execution evidence.
Submit an EIP-712 settlement carrying usage seconds, receipt hash, nonce, and deadline.
Hold finalization for the escrow dispute window, currently 5 minutes. A renter can dispute; the governance Safe resolves disputed outcomes.
Pay 90% of the charge to the provider, route the 10% platform fee, and refund unused escrow.
Verify the final chain event and expose a sanitized, canonical receipt in the public proof feed.
Public receipts omit renter/provider wallet addresses, precise geography, image digests, terminal output, files, and private telemetry. Proof establishes a platform-attested usage record paired with a final onchain event; it does not prove faithful workload execution or confidential computing.
Trust and abuse boundaries
Do not publish an exploitable vulnerability in a public issue. Use this repository's GitHub private vulnerability reporting or email security@prismnetwork.tech. Include the affected commit, component, reproduction, impact, and suggested containment. Never include live credentials or renter data.
Production behavior
Provider launches reconcile by a unique lease label. Chain submissions persist signed bytes before broadcast. Workers retry from persisted state and reject conflicting final-state transitions.
Prism publishes an L40S offer only when available capacity satisfies model, VRAM, reliability, and pricing requirements.
Provision failures close or refund rather than starting billing. Destruction is retried before final settlement. Emergency pause blocks new leases without blocking existing refunds.
Use the response request ID to correlate web, control-plane, provider, and chain records. Public proof publication remains decoupled from financial settlement.
Prism expands public capacity after end-to-end production validation covers quoting, funding, provisioning, readiness, teardown, settlement, refunds, provider payment, and proof publication. Failed validations preserve diagnostic evidence and pause new lease funding until the affected service is restored.
Response handling
invalid_requestMalformed path, JSON, duration, image digest, GPU request, or wallet payload.
identity_requiredNo valid Privy-backed Prism session is available.
invalid_origin / risk_holdThe mutation is cross-origin or the account is restricted.
no_match / quote_not_foundNo compatible capacity exists or the quote is absent/expired.
capacity_reservedCompatible capacity exists but is held by another renter's open quote; retry.
network_capacity / identity_replayA concurrency bound or replay guard rejected the operation.
request_too_largeThe application API body exceeds 256 KiB.
unsupported_media_typeA mutation was not submitted as application/json.
rate_limitedThe same-origin API budget was exceeded; honor Retry-After.
service_unavailableA required identity, rate-limit, orchestration, or provider service is unavailable.
429 only after Retry-After.503 responses with exponential backoff and a maximum delay, without changing the request.funding_not_final is expected before the required confirmation threshold and can be polled safely.4xx responses as non-retryable until the request or account state changes.Autonomous integration
Autonomous agents integrate without a browser or Privy. An agent proves control of its funding wallet by signing a short-lived challenge, exchanges the signature for a bearer session, and drives the same renter surface — offer discovery and the lease lifecycle — over the /api/agent endpoints. Escrow, readiness, metering, and settlement are identical to the browser path.
/api/agent/challengePublicIssue a single-use, five-minute challenge for a wallet address.
/api/agent/sessionSignatureExchange a wallet-signed challenge for a one-hour bearer session.
/api/agent/proxy/{path}BearerAuthenticated passthrough to the renter API. Only offer and lease routes are reachable.
import { PrismAgent, DEFAULT_IMAGE } from "@prismnetwork/agent-sdk";
const agent = new PrismAgent({
privateKey: process.env.AGENT_KEY,
escrow: "0xfD4228eEEfC49e4b76A0CD40af9fdd546220B2FD",
});
await agent.authenticate();
const lease = await agent.lease({ image: DEFAULT_IMAGE, durationSeconds: 900, minVramMib: 16000 });
const out = await agent.run(lease, "nvidia-smi");
console.log(out.stdout);
await agent.endLease(lease);Headless leasing for Node. Authenticate, lease a digest-pinned image, run commands over SSH, and release — funded in USDG with native gas on Robinhood Chain.
The same leasing exposed as Model Context Protocol tools, so an MCP client can list GPUs, lease and run a command, and release the lease.
Pay-per-job GPU execution over HTTP 402. Submit a command, pay USDG, and poll for the output; the service leases, runs, and releases on your behalf, refunding a failed job.
The signing wallet is the subject of every request. The agent boundary reaches only renter routes; operator, node, and gateway surfaces are rejected.
Cards, identity documents and credentials sealed under a wallet-derived key that never leaves your machine. Each item names the weakest workspace class it may be released into, and a lease below that floor is refused.
Four packages reach the same renter surface, so the choice is only which runtime you are already in. Every one of them reads offers without a wallet; a key is needed to lease, never to look.
npm i @prismnetwork/agent-sdk · lease, run over SSH, releasepip install prismnetwork · the same lifecycle from a scriptpip install prism-agentkit · an action provider, so a LangGraph agent rents its own GPUclaude mcp add prism -- npx -y @prismnetwork/mcp · eleven tools in any MCP clientRenter-held encryption
A workspace is administered by someone else, so anything that must stay private belongs in the vault instead. Items are sealed under a key derived from a wallet signature on the renter's own machine and never transmitted, which leaves the control plane holding ciphertext and no means of reading it. The browser and the agent SDK run the same client, so one wallet opens one vault from either.
/v1/vault/itemsBearerList sealed items with their version and trust floor. Values are never returned in a listing.
/v1/vault/items/{item_id}BearerCreate an item, or replace one by naming the version being replaced.
/v1/vault/items/{item_id}BearerFetch one sealed item for the caller to decrypt locally.
/v1/vault/items/{item_id}BearerDelete an item and its ciphertext.
/v1/vault/items/{item_id}/releaseBearerAuthorize an item into a lease that meets its trust floor.
/v1/vault/releasesBearerRead which items were released into which leases.
await agent.vault.unlock();
const card = await agent.vault.put(
{ pan: "4111111111111111", exp: "09/29" },
{ label: "billing card" },
);
// Sealed at the default floor, so this is refused on open capacity
// rather than exposing the card to a host that can read it.
await agent.vault.releaseInto(lease, card.item_id, { json: true });previous_version creates and fails on an occupied item, so concurrent writers cannot silently drop one another.confidential, above what the network can serve, so a release into current capacity is refused.