Payouts
Providers earn 95% of inference revenue (5% platform fee). Earnings are the same regardless of whether the buyer paid with a card or via MPP.
Payout Schedule
| Type | Speed | Fee |
|---|---|---|
| Stripe automatic (daily) | ~3–4 business days | Free |
| Stripe instant | Within 30 minutes, 24/7 | Free (platform absorbs the 1% Stripe fee) |
| Tempo wallet | Batched every 15 minutes | Free (platform absorbs ~$0.001/tx) |
Tempo payouts settle on-chain in USDC. Minimum payout: $0.10. Below-threshold earnings carry forward to the next settlement cycle.
Onboarding
Providers must set up at least one payout method before serving requests. Three options:
Passkey signup (zero-step)
Sign up with a passkey and you're immediately payout-ready. The platform derives a Tempo wallet address from your passkey's P-256 public key — no additional setup. Your payoutRail is set to "tempo" automatically.
Stripe Connect (fiat)
Call POST /v1/connect/onboard to start Stripe Express onboarding — identity verification and bank details. Fiat payouts via Stripe's daily automatic schedule.
Tempo wallet (manual)
Call POST /v1/connect/tempo/challenge with your wallet address, sign the challenge message with your wallet key, then call POST /v1/connect/tempo/verify with the signature. USDC payouts every 15 minutes.
Providers can set up both Stripe and Tempo and accept traffic from both buyer types. See Routing for how buyer payment rails affect provider selection.
Passkey-Derived Wallet
Passkey signup captures a P-256 public key. Tempo natively supports P-256 addresses, so the platform derives a wallet address automatically using keccak256(pubKeyX || pubKeyY).
- New passkey signups get an auto-derived wallet — zero steps to become payout-ready.
- Existing passkey users without a Tempo wallet can call
POST /v1/connect/tempo/derive-from-passkeyorPOST /v1/connect/tempo/use-passkeyfor one-click activation. - The passkey wallet is permanent — it can't be removed. A manual wallet can override it as the active payout address.
- Removing a manual wallet via
DELETE /v1/connect/tempofalls back to the passkey wallet automatically.
Switching Rails
Use PATCH /v1/settings/provider/rails to toggle which buyer payment rails your provider accepts:
curl -X PATCH https://api.vram.supply/v1/settings/provider/rails \
-H "Authorization: Bearer <jwt>" \
-H "Content-Type: application/json" \
-d '{"accepts_stripe": true, "accepts_tempo": true}'- At least one rail must remain enabled.
- Enabling Stripe requires completed Connect onboarding. Enabling Tempo requires a verified wallet address.
- Switching does not affect historical earnings — only future routing.
Endpoint Reference
/v1/connect/onboardSessionStart Stripe onboarding.
/v1/connect/statusSessionOnboarding status.
/v1/connect/dashboard-linkSessionExpress Dashboard login.
/v1/connect/balanceSessionProvider balance.
/v1/connect/account-sessionSessionEmbedded component session.
/v1/connect/payoutsSessionPayout history.
/v1/connect/tempo/challengeSessionIssue a signature challenge for Tempo wallet verification.
Parameters
| Name | Type | Req | Description |
|---|---|---|---|
| address | string | Yes | Tempo wallet address (0x...) to verify ownership of. |
Request
{
"address": "0x1234567890abcdef1234567890abcdef12345678"
}Response
{
"message": "vram.supply wallet verification\n\nAddress: 0x1234...\nNonce: abc123...\nTimestamp: 2026-03-20T12:00:00Z",
"nonce": "abc123def456...",
"expires_at": "2026-03-20T12:05:00Z"
}Errors
| 400 | Invalid address format |
/v1/connect/tempo/verifySessionVerify wallet signature and register Tempo wallet as payout address.
Parameters
| Name | Type | Req | Description |
|---|---|---|---|
| address | string | Yes | Wallet address from the challenge. |
| signature | string | Yes | EIP-191 signature of the challenge message (0x...). |
Request
{
"address": "0x1234567890abcdef1234567890abcdef12345678",
"signature": "0xabc..."
}Response
{
"verified": true,
"address": "0x1234567890abcdef1234567890abcdef12345678",
"payout_rail": "tempo"
}Errors
| 400 | Missing fields, no pending challenge, address mismatch, or signature verification failed |
/v1/connect/tempo/derive-from-passkeySessionDerive a Tempo wallet address from your passkey’s P-256 public key. Sets it as active payout address.
Response
{
"verified": true,
"address": "0xabcdef1234567890abcdef1234567890abcdef12",
"payout_rail": "tempo"
}Errors
| 400 | No passkey registered |
| 409 | Passkey wallet already derived |
/v1/connect/tempo/use-passkeySessionSwitch active payout address to the passkey-derived wallet.
Response
{
"address": "0xabcdef1234567890abcdef1234567890abcdef12",
"payout_rail": "tempo"
}Errors
| 400 | No passkey wallet available |
/v1/connect/tempoSessionRemove manually-connected Tempo wallet. Falls back to passkey wallet if one exists, otherwise reverts to Stripe.
Response
{
"payout_rail": "tempo",
"address": "0xabcdef..."
}