voidly

For builders

Bring outside services into your app.

Give people and agents one path to choose a service, approve its input and price, pay the provider directly, and recover the original result if the connection drops. Your app keeps the customer experience.

Start with the current access limits.

Storefront publishing is available with a Voidly account. Paid checkout is limited to configured services and eligible accounts. Publishing a storefront does not activate a seller or approve spending.

Outside apps need an admitted app connection and a program approved by its owner. Sessions 1.4.2 uses that app’s credential and RSA key; the owner’s account token stays out of the runner. The customer supplies their own payment signer.

Automatic payments are optional. Browser wallets can ask for each payment. Payment and delivery are separate states; a payment does not guarantee a satisfactory result.

Optional automation. Your customer stays in control.

  1. Approve a finite batch. Open the owner approval flow from your app with 1–32 exact inputs, one service, the payer, a spending cap and an expiry. The owner opts in once for that list; new inputs or wider limits need new permission.
  2. Connect the customer’s runner. Use Node 24.15 or later on a trusted Linux or macOS customer host. Keep the admitted app credential and RSA key private, and use one persistent private directory and journal per program. The separate customer-controlled EIP-1193 signer authorizes each exact payment.
  3. Run or recover. Pass one approved input to the SDK at a time. If its outcome is uncertain, recover the same input and original job. Reopening the same journal does not authorize a replacement payment.

A ready permission does not mean a runner is connected or a payment happened. Your app must connect the actual customer runner before showing execution as available. The SDK’s local status reports budget use; it is not a remote connectivity check.

Manual payments remain available. Unattended use requires a signer the customer has independently configured for it. Robinhood, WalletConnect and other browser wallets may still ask for each signature. Never send a wallet key or recovery phrase to Voidly.

Minimal runner integration · Sessions 1.4.2

Install @voidly/session@1.4.2. The values below come from your actual approved program, admitted app credentials and customer signer. Keep them on the trusted host.

import {
  createCustomerHostedProgramJobs,
  parseOwnerAppProgram,
} from '@voidly/session/customer-hosted';

const jobs = createCustomerHostedProgramJobs({
  directory: applicationPrivatePersistentDirectory,
  program: parseOwnerAppProgram(actualApprovedProgramFromVoidly),
  credential: {
    builderKey: admittedApplicationCredential,
    keyId: admittedApplicationKeyId,
    privateKey: applicationRsaPrivateKeyObject,
  },
  lifetime: currentApplicationAuthority, // { isCurrent, signal }
  provider: customerConfiguredSigner,
});

const outcome = await jobs.run({ selectedText: oneApprovedExactInput });
// A preflight refusal may have no original to recover.
if (outcome.kind !== 'refused') {
  const recovery = await jobs.recover(approvedInputSha256);
}

A submitted payment is still unconfirmed. Read settlement and delivery separately. After app access expires or is revoked, the owner recovers existing jobs through their Voidly account. Production use still requires qualified owner approval, app credentials, signer and endpoints.

One job. The same identity through recovery.

  1. Read the service. Use its published description, then check current account-specific readiness.
  2. Review the scope. Show the provider, exact input, recipient, price, budget and expiry before approval.
  3. Keep the original job. Persist its operation ID before submitting. After an uncertain response, recover that ID.
  4. Read payment and result separately. A submitted request is not a confirmed payment or a delivered result.

Keep account credentials, signer setup and approval controls in the trusted app. Expose only the approved job and recovery operations to the agent. Voidpay does not hold customer funds or use escrow.

Public credit railWithheld
ReferenceProtocol surface
Start herePublic safety cardExplore

Legacy credit protocol reference

This section covers Voidpay’s legacy agent-credit protocol. Its internal credits are not money, backed, redeemable, or convertible. This credit rail has no deposits, withdrawals, bridges, or real-value settlement.

Before you build: every legacy credit route under api.voidly.ai/v1/pay/* returns HTTP 410 PAY_RUNTIME_WITHHELD to public callers during security review. The credit flows below are a protocol reference, not a reachable sandbox.

The separate Sessions rail has four exact HTTPS POST exceptions on api.voidly.ai, with no query string or fragment:

  • /v1/pay/session/redeem
  • /v1/pay/session/deliver
  • /v1/pay/session/recover
  • /v1/pay/session/reattest

These routes retain their own authorization and readiness checks. Their exceptions do not reopen the credit rail or establish customer payment readiness.

Legacy credit warning: do not send funds to a legacy credit address or contract. An on-chain transfer will not create credits and may leave the asset stranded.

What the protocol covers

  • Ed25519-signed envelopes
  • Replay and nonce handling
  • Zero-value internal transfers
  • HTTP 402 challenge handling
  • Receipts and idempotency
  • Emergency freeze behavior

Start from machine-readable status

No documentation or SDK example should imply a fundable wallet, stablecoin backing, redemption, anonymous payment, trustlessness, or exploit-proof operation. Report contradictions to security@voidly.ai.