Hilt Pay API
Hilt Pay API turns stablecoin payments into receipts, entitlements, credits, memberships, webhooks, and product state. Use it when you need to protect an API endpoint, AI tool, private dataset, paid agent, bot, software feature, research product, or technical community without manually clicking through the Hilt dashboard. The public API namespace is/v1/access.
Public launch scope
Hilt Pay API is Solana USDC first, with x402 as the protected-resource protocol shape for agent/API flows. Current public scope:solana_usdcis the only production-enabled settlement rail.- x402 is the HTTP
402 Payment Requiredprotocol pattern for protected-resource payment requirements. base_usdcandevm_usdcremain future rail work, not a public launch claim.
POST /v1/access/entitlements/check, return HTTP 402 when Hilt says the customer is unpaid, and let Hilt create the Solana USDC payment session and entitlement record.
Future Base and EVM rail work exists behind Hilt production gates. Do not show those rails to buyers until they are returned in payment_session_options.session_creatable_rails[].
USDT is also scaffolded as a future review rail family because it may matter for Asia-heavy merchant demand, but it is not a launch claim. The scaffolded child rails are solana_usdt, erc20_usdt, and tron_usdt; all remain review/research-only with no checkout exposure, no receipt creation, and no entitlement activation.
Rail parity contract
Hilt Pay API uses one production rail parity contract. Rail mechanics can differ, but the Hilt outcome must be identical:payment/session -> proof -> settlement/finality -> receipt -> entitlement -> webhook -> analytics/support/audit -> reconciliation
Every live rail must satisfy the same institutional lifecycle:
- create a session or payment requirement
- normalize proof into a canonical Hilt shape
- derive a replay-safe fingerprint
- verify payment through the rail-specific verifier or facilitator
- prove settlement or finality
- create or map a receipt
- activate entitlement only after bound receipt/proof evidence
- emit webhooks
- retain support and audit evidence
- support reconciliation, alerts, and kill switch drills
x402 is the HTTP 402 Payment Required protocol for agent/API payments. In Hilt Pay API, an x402 payment requirement includes the settlement network, token, merchant recipient, amount, and resource in paymentRequirements.accepts[]. At public launch, x402 requirements settle over solana_usdc; Base or allowlisted EVM settlement requires a later production rail release.
Hilt Pay API is designed to stay zero-custody on every settlement rail. Buyer funds must never route through a Hilt escrow wallet. For Base/EVM-style buyer checkout, the preferred fee model is buyer-one-sign: the buyer pays the merchant wallet directly, Hilt verifies that settlement, and Hilt collects its infrastructure fee from the merchant’s scoped, revocable allowance after the buyer payment is verified. Split buyer transfers remain an advanced fallback for batch-capable wallets, but they are not the default buyer experience.
Dynamic checkout must render only payment_session_options.session_creatable_rails[]. Product allowed_rails is policy, not buyer-visible checkout. A rail can be configured and allowed but still hidden because a payout wallet, verification, production gate, registered/gated adapter, or kill switch is missing.
Production rail control lives in Hilt platform settings, not scattered .env files. Rail status, provider policy, webhook policy, token policy, finality policy, allowlisted chains, and secret references are managed centrally so agent-created integrations inherit the same reviewed controls as dashboard-created integrations.
Every live agent or checkout payment session also writes a Hilt-authored payment requirement record. That requirement binds owner, access product, backing Hilt product, pending entitlement, rail, amount, recipient, fee policy, expiry, and protocol payload before the buyer or agent submits proof. Live non-Solana proofs must bind back to this requirement before receipt mapping or entitlement activation can proceed.
Payment proof and safety model
Every payment rail must follow the same safety path before Hilt grants access:- record an owner-scoped payment proof fingerprint
- reject duplicate or replayed proof fingerprints
- record verification attempts, including failed attempts
- record settlement evidence and finality state
- map verified settlement to a Hilt receipt/proof record
- evaluate entitlement activation eligibility
| Rail | Proof model | Proof validation contract | Live verification | Settlement/finality | Receipt mapping | Live entitlement activation |
|---|---|---|---|---|---|---|
solana_usdc | Yes | hilt_solana_usdc_payment_v1 | Current Hilt checkout/payment state | Current Hilt payment state | Current receipt/member bridge | Current verified rail |
x402 | Yes | x402_payment_signature_v1 | HTTP 402 protocol requirement plus facilitator /verify candidate; public launch settlement is Solana USDC only | Live-candidate /settle evidence exists, not public-live | Gated receipt creation/mapping rehearsal only | Blocked unless explicit live-apply gates are enabled |
base_usdc | Yes | erc20_transfer_v1 constrained to Base eip155:8453 and native Base USDC | Future rail candidate only | Requires provider health, block freshness, finality, and reorg policy | Gated receipt creation/mapping rehearsal only | Blocked unless explicit live-apply gates are enabled |
evm_usdc | Yes | erc20_transfer_v1 on explicitly allowlisted eip155 chains only | Future rail candidate only | Requires chain allowlist, provider health, provider quorum, block freshness, finality, and reorg policy | Gated receipt creation/mapping rehearsal only | Blocked unless explicit live-apply gates are enabled |
solana_usdt | Scaffold | solana_token_transfer_v1 | Review-required | Blocked | Blocked | Blocked |
erc20_usdt | Scaffold | erc20_transfer_v1 | Review-required | Blocked | Blocked | Blocked |
tron_usdt | Scaffold | tron_transfer_v1 | Research/review-required | Blocked | Blocked | Blocked |
- proof fingerprint recorded
- verification attempt recorded
- settlement evidence recorded when verification and finality pass
- receipt mapping checked, or gated receipt creation run during controlled rehearsal
- entitlement activation checked and blocked unless the explicit live-apply gate, rail allowlist, registry production state, and tuple-binding checks all pass
Hilt Pay vs Hilt Pay API
| Area | Hilt Pay | Hilt Pay API |
|---|---|---|
| Primary job | Hosted checkout and merchant workspace | Developer and agent infrastructure for paid access |
| Buyer flow | Current Hilt checkout | Rail-native payment sessions |
| Developer object | Product, payment, receipt, membership | App, access product, payment session, entitlement |
| Main access path | Merchant dashboard/member records | POST /v1/access/entitlements/check |
| Best for | Merchants selling with the Hilt workspace | Developers protecting APIs, AI endpoints, tools, datasets, and private products |
What is live now
Represented in the public Hilt Pay API:- rail-native apps, products, sessions, entitlements, receipt links, and webhook payload context
solana_usdcas the current verified rail through existing Hilt checkout and settlement primitives- scoped permissions:
access:read,access:write,access:webhooks - idempotency keys on write endpoints
- owner-scoped entitlement checks by product, external customer, wallet, or email
- payment-session creation for active
solana_usdcHilt Pay API products - sandbox payment sessions with deterministic sandbox proof confirmation
- webhook endpoint creation through the existing Hilt webhook system
- deterministic rail capability and kill-switch errors
- staff-only inspection, narrow repair, reconciliation, and metric-spec primitives for controlled operations
| Rail | V0 status | Sandbox | Live | Public claim |
|---|---|---|---|---|
solana_usdc | production_available | Yes | Yes | Current registered/gated adapter through existing Hilt Pay checkout and settlement state |
x402 | sandbox_available | Yes | Gated off by production capability | HTTP 402 protocol shape for agent/API flows; public launch settlement is Solana USDC only |
base_usdc | private_alpha_target | No | Gated off by production capability | Future rail candidate; no live receipt or entitlement activation claim |
evm_usdc | private_alpha_target | No | Gated off by production capability | Future rail candidate with explicit allowlisted-chain posture; no broad EVM acceptance |
usdt | review_required | No | No | Conditional/review rail because issuer, network, compliance, support, and dispute risks differ |
solana_usdt | review_required | No | No | Future USDT scaffold; no checkout, receipt, or entitlement activation |
erc20_usdt | review_required | No | No | Future USDT scaffold with chain/contract allowlist requirements |
tron_usdt | review_required | No | No | Research scaffold; TRON requires separate provider, finality, support, and compliance model |
Protect an AI API endpoint in 20 minutes
This is the core developer path: your endpoint asks Hilt whether the customer has access, returns HTTP402 when unpaid, and retries after Hilt confirms payment and activates the entitlement.
1. Create a scoped server key
Create or request a server-side API key with the narrowest permissions:| Permission | Use |
|---|---|
access:read | list rails and check entitlements |
access:write | create apps, products, and payment sessions |
access:webhooks | create webhook endpoints |
2. Create an app, configure rails, and create a product
Create an app boundary:solana_usdc first:
x402, base_usdc, or evm_usdc during gated setup, but they remain hidden from buyer checkout until Hilt enables production verification, replay protection, receipt mapping, entitlement activation, monitoring, and support controls for that rail.
For Base/EVM rails with Hilt fees, configure the merchant-side fee collection permission as part of rail setup. The intended production posture is:
- buyer signs one transfer to the merchant;
- Hilt verifies the buyer payment;
- Hilt collects its fee from the merchant’s scoped allowance after verified settlement.
fee_collection.status is active.
Create an access product backed by existing Hilt product and payment infrastructure:
status: "paused" while wiring the integration. Active live products require explicit live_mode_confirmed: true. allowed_rails is the product policy, not the checkout menu. Agents and buyers must only show rails returned in payment_session_options.session_creatable_rails[]; future rails that are allowed but not live stay hidden with blocker reason codes.
Check setup readiness:
solana_usdc to be the only live session-creatable rail unless Hilt explicitly enables another production rail for your account.
3. Protect the endpoint
4. Return a payment requirement for denied users
Before creating a session, readGET /v1/access/products/available-rails and render only payment_session_options.session_creatable_rails[] to the buyer or calling agent. At public launch, the live settlement rail is solana_usdc.
has_access: true.
For x402, Base, or allowlisted EVM settlement, the same conceptual flow is used only after those gates are production-enabled. Until then, they must not be shown as live checkout or access options.
5. Retry after verified payment
After Hilt confirms payment and receipt/member state, call the entitlement check again:6. Run the local demo
The repository includes a FastAPI demo:HILT_PAY_API_SETTLEMENT_RAIL=base_usdc, then submit proof fields that match the returned requirement:
/ai/pro; it now returns the paid response.
Entitlement check API
| Field | Required | Notes |
|---|---|---|
product_id or external_product_id | Yes | Product is owner-scoped before lookup |
rail | Optional | Defaults to the product rail; include it for deterministic rail checks |
external_customer_id | One identity required | Best server-side customer key |
wallet | One identity required | Wallet lookup path |
email | One identity required | Email lookup path |
customer_reference | Optional | Compatibility alias for external customer id |
has_accessstatusproduct_idaccess_product_idexternal_product_idrail_idrailexternal_customer_idwalletemailactive_fromexpires_atreceipt_idreceiptreasonlast_payment_idsource
| Reason | Meaning |
|---|---|
active_entitlement | Active Hilt Pay API entitlement |
active_membership | Existing Hilt membership grants access |
payment_pending | A session exists but confirmed access does not |
entitlement_expired | Access window ended |
entitlement_revoked | Access was revoked |
no_entitlement_for_rail | Requested rail does not match product/entitlement rail |
no_entitlement | No matching active record |
Setup readiness API
Agents can inspect setup state without dashboard clicks:- app readiness
- product readiness
- effective rail availability and blockers
- active webhook coverage
- deterministic
blockers[] - exact
next_actions[]with API endpoints
rail.
Abbreviated readiness response:
available_rails[]: rails the merchant has allowed, configured, and passed platform gates for the selected modeblocked_rails[]: rails hidden from checkout because a payout wallet, product allowlist, verification, kill switch, or platform gate is missingpayment_session_options.session_creatable_rails[]: rails that can actually create a live Hilt Pay API payment session in this deployment
payment_session_options.session_creatable_rails[]. Do not render allowed_rails[], available_rails[], or blocked_rails[] directly as buyer choices. Blocked rails stay hidden from checkout and remain available to operators and agents as reason-coded setup context.
When creating a product, allowed_rails may be an explicit list or "all" / "all_enabled" for the full known rail set. This still does not expose review rails to buyers. Hilt expands the policy, then filters it through merchant payout settings, production gates, registered/gated adapters, and kill switches before returning session_creatable_rails[].
If more than one session-creatable rail exists, payment_session_options.rail_required is true and the caller must pass rail to POST /v1/access/payment-sessions. If a rail is configured but no registered adapter can create a gated session for it yet, payment_session_options.session_blocked_rails[] marks it with payment_session_adapter_not_implemented.
Abbreviated rail availability response:
PUT /v1/access/rail-settings/x402, PUT /v1/access/rail-settings/base_usdc, PUT /v1/access/rail-settings/evm_usdc, PUT /v1/access/rail-settings/solana_usdt, PUT /v1/access/rail-settings/erc20_usdt, and PUT /v1/access/rail-settings/tron_usdt may store payout settings as pending_review, but they still remain blocked from buyer checkout unless Hilt has explicitly enabled those production rail capabilities. The expected safe result is a reason-coded blocked rail in payment_session_options.session_blocked_rails[], not a buyer-visible checkout option.
Base/EVM rail settings also expose fee_collection. Use fee_collection_mode: "merchant_allowance_pull" for buyer-one-sign checkout. The merchant must grant a scoped, revocable fee collector allowance, and Hilt must verify that permission before the rail becomes session-creatable for fee-bearing products. fee_collection_mode: "buyer_split_transfer" is an advanced fallback for wallets that can present batch calls cleanly; it should not be the default human checkout experience.
Common setup blockers
| Code | Meaning | Safe action |
|---|---|---|
payout_address_required | The product allows a rail but no merchant payout wallet/address is configured for that rail. | Configure the rail with PUT /v1/access/rail-settings/{rail_id}. Do not create live sessions until readiness is green. |
backing_product_wallet_mismatch | The Solana rail setting payout address differs from the legacy backing Hilt Pay product wallet. | Stop live session creation for that product, reconcile the intended wallet, and rotate/sync the backing product wallet through support/admin controls. |
webhook_events_missing | Active webhooks do not subscribe to all recommended lifecycle events. | Register a webhook covering payment, receipt, activation, and expiry events. |
rail_kill_switched | Hilt has disabled a rail through an operational kill switch. | Do not retry as live. Wait for Hilt to clear the incident or use another effective rail returned by readiness. |
rail_required | More than one live rail is effective for the product. | Pass rail explicitly to POST /v1/access/payment-sessions. |
rail_session_adapter_not_implemented | The rail is configured, but this deployment cannot create live payment sessions for it yet. | Do not show the rail in buyer checkout. Use payment_session_options.session_creatable_rails[] until the adapter is live. |
merchant_fee_collection_not_active | A Base/EVM fee-bearing product is configured, but merchant-side Hilt fee collection is not active. | Complete and verify the merchant allowance/collector setup before creating buyer sessions. |
merchant_fee_collection_not_instant | A Base/EVM fee-bearing product is configured for deferred merchant billing, which is not allowed for buyer-one-sign payment sessions. | Switch the rail setting to merchant_allowance_pull and complete the fee collector approval. |
fee_collector_address_required | A Base/EVM buyer-one-sign fee model is selected, but no Hilt fee collector address is configured. | Add the reviewed Hilt fee collector contract/address to the rail setting. |
no_available_rails | No product-allowed, merchant-configured, platform-enabled live rail is effective. | Inspect blocked_rails[] and fix the first blocker before creating sessions. |
no_session_creatable_rails | Rail settings are effective, but none can create a live payment session in this deployment. | Do not create a session. Ask Hilt support or use a session-creatable rail. |
Billing and rail verification controls
Hilt Pay API has internal/admin billing sync stubs for first-party plan entitlement state:- Stripe sync can write a Stripe-backed plan entitlement.
- Hilt Pay API on-chain sync can record an already verified on-chain source.
- Both paths are admin-only, idempotent, and replace the current row transactionally.
- Owner-approved Stripe Checkout for Hilt Pay API subscriptions is exposed separately at
POST /v1/access/billing/checkout/stripeand uses admin-configured Price IDs. - Admin sync paths do not create Stripe subscriptions, create Hilt Pay API payment sessions, charge customers, or enable automatic recurring on-chain billing.
pending_review to verified or rejected, but unsupported rails cannot be verified for live use until platform production gates pass.
Live rail verification and Hilt treasury wallet changes require a two-person approval flow in controlled operations:
- first admin creates an approval request
- a different admin approves or rejects it
- rail verification can be applied only after the second approval
- Hilt treasury wallet approval is recorded only; the V0 stub does not change a live treasury wallet or enable live plan payments
- approval queue
age_secondsandoldest_pending_age_seconds - pending rail review
pending_review_age_seconds - stale billing entitlement
warnings[]andstale_warning_count
POST /v1/admin/access/billing/stripe-webhookaccepts the raw Stripe webhook body, verifiesStripe-Signatureserver-side, records replay state by Stripe event id, dead-letters deterministic sync failures, and feeds the billing entitlement writer.- The older manual
POST /v1/admin/access/billing/stripe-webhook-syncstub is disabled for launch safety. Operators should use the signed webhook intake, recorded event replay, or Stripe API reconciliation instead.
customer.subscription.created, customer.subscription.updated, and customer.subscription.deleted. Unsupported event types are recorded as ignored so Stripe is not retried for irrelevant deliveries. Missing owner metadata such as hilt_owner_id is dead-lettered for support review instead of silently granting access.
Support can inspect and recover Stripe webhook state:
GET /v1/admin/access/billing/stripe-webhook-eventsGET /v1/admin/access/billing/stripe-webhook-events/{stripe_event_id}POST /v1/admin/access/billing/stripe-webhook-events/{stripe_event_id}/replayPOST /v1/admin/access/billing/stripe-webhook-events/recover-stale
GET /v1/admin/access/rails/production-readinessGET /v1/admin/access/rails/proof-contractsGET /v1/admin/access/rail-proofsGET /v1/admin/access/rail-proofs/{proof_id}GET /v1/admin/access/rail-proofs/{proof_id}/verification-attemptsGET /v1/admin/access/rail-proofs/{proof_id}/settlement-evidenceGET /v1/admin/access/rail-proofs/{proof_id}/dry-run-apply
confirm_no_live_payment=true. Direct replay is restricted to dead_letter events. Stale recovery can reprocess old received or processing events after an age threshold, and should normally be run first with dry_run=true.
Stale billing entitlement reconciliation is admin-triggered:
POST /v1/admin/access/billing/entitlements/reconcile-stale
active/past_due billing entitlement rows whose current period is missing or no longer current. Apply mode requires dry_run=false and confirm_expire_stale_billing=true. Past-due rows are support state only and do not grant live Hilt Pay API access. The reconciliation does not create Stripe subscriptions, create Hilt Pay API payment sessions, charge cards, or initiate on-chain payments.
Stripe API reconciliation is comparison-first:
POST /v1/admin/access/billing/stripe-api/reconcile
dry_run=false and confirm_no_live_payment=true; it syncs billing entitlement state only and still does not create subscriptions, charge cards, or initiate on-chain payments.
Operators can use the API-backed CLI:
HILT_PAY_API_STALE_BILLING_APPLY=1 and HILT_PAY_API_CONFIRM_EXPIRE_STALE_BILLING=1.
Hilt treasury wallet changes have a recorded-only writer:
- request a two-person approval with action
hilt_treasury_wallet_change - have a different admin approve it
- call
POST /v1/admin/access/treasury-wallets/record-changewithconfirm_no_live_plan_checkout=true
GET /v1/admin/access/observability/spec.
The alert set now includes rail-specific failure classes:
- proof verification failures by rail
- settlement failure, dispute, or reorg-risk evidence
- x402 facilitator verify/settle failures
- unhealthy EVM provider evidence
053 through 061 rehearsal only:
Payment session API
Idempotency-Key.
Request:
payment_session.idpayment_session.statuspayment_session.rail_idpayment_session.payment_protocol, when the session uses a protocol such as x402payment_session.settlement_rail_id, when the protocol wraps an underlying settlement railpayment_session.checkout_urlpayment_session.payment_requirementfor proof-based railspayment_session.adapterpending_entitlementrailpayment_session_options
payment_requirement:
x402returnspayment_protocol: "x402"pluspaymentRequirements.accepts[]withnetwork,asset,payTo,maxAmountRequired,resource, andproof_type: "x402_payment_signature_v1". The response also includes the launch settlement path, such assettlement_rail_id: "solana_usdc".solana_usdcis the public launch settlement rail. It can back hosted checkout, wallet-transfer proof paths, and x402 protected-resource requirements when the merchant has a verified Solana USDC payout wallet.base_usdcandevm_usdcare future/gated settlement rails. Their ERC-20 transfer requirement contracts exist for rehearsal and review, but they are not public launch rails until provider governance, receipt mapping, activation, and alert gates pass.
rail: "x402" compatibility shape is still accepted during V0, but agents should send payment_protocol and settlement_rail explicitly. Hilt builds the x402 requirement from the settlement rail’s verified payout address and token/network policy. Use settlement_rail: "solana_usdc" for public launch x402 requirements. Base and EVM x402 settlement stay gated/future until their rail gates are completed.
Agents should submit completed rail proofs to:
payment_session_id from the server-created session response, and Hilt compares the proof against the stored payment requirement before recording it. Sandbox/candidate proofs may be recorded with livemode: false, but they are not accepted payments. The endpoint does not grant access by itself. Verification, settlement/finality, receipt mapping, and entitlement activation remain separate rail-gated stages.
For x402 proofs, the proof payload must include the PAYMENT-SIGNATURE value plus the exact requirement fields Hilt returned: payment_requirements_hash, network, asset, pay_to, max_amount_required, and resource. Hilt stores a proof-to-requirement binding with the proof, including the payment session, pending entitlement, protocol, settlement rail, requirement hash, payment_requirements_hash, and resource. The facilitator /verify and /settle candidate path must match that same stored proof and requirement binding before Hilt records verified evidence. For Base settlement, those fields must match Base eip155:8453, native Base USDC, the merchant payout address, and the exact required amount. A Base transaction hash alone is not enough to satisfy x402; it must be tied back to the HTTP 402 payment requirement.
Only settlement rails with production_enabled: true, merchant-approved rail settings, a payout wallet, and a registered payment-session adapter can create live payment sessions. The launch runtime is Solana USDC first. x402 is modeled as a protected-resource payment protocol over eligible settlement paths, starting with solana_usdc. Public x402 receipt mapping and live entitlement activation remain blocked until the x402 production evidence gates pass. base_usdc and evm_usdc have live-shaped adapters, but remain hidden from buyer checkout until their full production gates pass.
A rail adapter is not just a label. Before a rail can appear in payment_session_options.session_creatable_rails[], Hilt must register an adapter contract with:
- session strategy
- session creation implementation
- settlement/finality verification status
- replay-protection policy
- receipt mapping status
- entitlement activation evidence
- support/audit evidence payload
sandbox_enabled: true but production_enabled: false, such as x402, may be shown in local/developer-demo flows but cannot activate live entitlements. Rails that are configured by a merchant but fail production capability, payout, verification, or kill-switch checks return reason-coded blockers and must not be shown in buyer checkout.
x402 has an agent-readable adapter contract and a live-shaped payment requirement adapter in V0, but public production settlement and access activation remain blocked:
session_strategy: "direct_http_402"payment_protocol: "x402"settlement_rail_id: "derived_from_payment_requirements"at contract level, then concretesolana_usdcin the public launch session response;base_usdcandevm_usdcremain gated/future settlement valuessettlement_verification_status: "sandbox_shape_only"- receipt creation/mapping is available only through staff-gated non-Solana receipt creation rehearsal or approved production rail launch
- controlled facilitator verify/settle candidate exists behind service/operator boundaries only
- live payment-header replay protection and proof-to-requirement binding now exist in the service boundary, but production facilitator/provider evidence and launch drills remain public-launch gates
- no live entitlement activation from x402 evidence
base_usdc and evm_usdc also expose adapter contracts and live-shaped payment requirement adapters:
base_usdcusessession_strategy: "wallet_transfer_proof"and requires Base chain id, USDC token contract, merchant recipient, amount, transaction hash/log uniqueness, healthy provider evidence, finality, and reorg handling before live use.evm_usdcusessession_strategy: "wallet_transfer_proof_allowlisted_chain"and requires explicit chain allowlists, provider policy, ERC-20 transfer parsing, transaction hash plus log-index uniqueness, healthy provider evidence, finality/reorg policy, and per-chain kill switches before live use.- For non-custodial fee collection, Base/EVM payment requirements expose
required_transfers[],gross_amount_minor_units,merchant_amount_minor_units,hilt_fee_minor_units,fee_collection, andwallet_batching. In the default merchant-allowance model,required_transfers[]contains only the buyer-to-merchant transfer andbuyer_signature_requirementissingle_transfer_to_merchant. fee_collection.model: "merchant_allowance_pull"means the merchant has configured a scoped Hilt fee collector permission. Hilt may collect only its fee from the merchant-side allowance after the buyer payment is verified. The buyer does not sign the Hilt fee leg, and Hilt does not custody buyer or merchant funds.- Split buyer transfers remain available only when explicitly configured as
fee_collection_mode: "buyer_split_transfer". In that fallback mode,wallet_batching.wallet_send_callscan include an EIP-5792-stylewallet_sendCallsrequest template with one ERC-20transfercall to the merchant payout wallet and one ERC-20transfercall to the Hilt fee wallet. Hilt still treats those as direct non-custodial transfers, not escrow or custody. - both return
implemented: truebecause the session requirement adapter exists, butcreatable: falseuntil production capability, merchant settings, payout wallet, and kill-switch gates pass. - neither rail should be shown as a buyer checkout option from live
payment_session_options.session_creatable_rails[]until its production rail gate passes.
Alchemy EVM webhook intake
For Base/EVM rails, Alchemy custom webhooks should be treated as a wake-up signal, not as proof of payment by themselves. Use a custom webhook for ERC-20Transfer logs and point it at:
HILT_PAY_API_ALCHEMY_WEBHOOK_SIGNING_KEY and verify the X-Alchemy-Signature header against the raw request body. The endpoint normalizes Alchemy GraphQL webhook payloads into transfer-log candidates, but it does not accept a payment, create a receipt, activate an entitlement, or enable a rail. Hilt must still fetch the transaction receipt, match it against the stored payment requirement, verify finality, then map receipt and access state through the rail-gated flow.
Sandbox contract
Hilt Pay API V0 includes an API-level sandbox contract for agents and developers. It is not live money, not settlement, and not a receipt. Create a sandbox payment session:sandbox_session.idsandbox_session.status: "pending"sandbox_session.proof_type: "hilt_pay_api_sandbox_v1"sandbox_session.proofpending_entitlement.status: "pending"livemode: falsesandbox_only: truerailpayment_session_adapter
| Code | Meaning |
|---|---|
sandbox_key_required | The caller is using a live API key instead of a sandbox key/dashboard session |
sandbox_mode_confirmation_required | confirm_sandbox_mode: true was not supplied |
rail_disabled | The requested rail does not have sandbox_enabled: true or is kill-switched |
customer_identity_required | No external customer id, wallet, or email was supplied |
sandbox_session_not_found | The session does not exist for this owner |
invalid_sandbox_proof | The proof hash does not match the session |
sandbox_proof_expired | The proof expired before confirmation |
Support and reconciliation
Hilt Pay API V0 has staff-only support primitives under/v1/admin/access. They are intentionally narrow and excluded from the public API schema.
Support can:
- list and inspect Hilt Pay API entitlements
- inspect related Hilt product, payment, membership, sandbox session, webhook delivery, and recent audit context
- mark pending or failed entitlements as
failed - revoke active or pending entitlements
- sync a non-sandbox pending entitlement from an existing active Hilt membership
- run dry-run or scoped reconciliation for pending non-sandbox entitlements
- read the controlled observability metric spec
- create receipts
- confirm unverified payments
- enable disabled rails
- move money
- promote sandbox entitlements into live membership state
- payment or membership is active but the Hilt Pay API entitlement is still pending
- receipt rail link exists but no entitlement is linked
- Hilt Pay API webhook deliveries are dead-lettered after activation
access_reconciliation_runs. Use dry-run first; non-dry-run repair only activates from verified active membership state.
Webhook setup
Rail availability
Rail is a first-class field in Hilt Pay API from V0:- payment sessions carry
rail/rail_id - entitlement records carry
rail_id - receipt links carry rail context
- webhook payloads include rail context for Hilt Pay API-backed products
- SDK, Postman, docs, and the demo keep rail explicit
production_enabled gates live payment sessions. sandbox_enabled only means a developer-demo or local test shape exists. It does not mean Hilt will grant live access from that rail.
Agent setup guide
Agent bootstrap V1 lets an AI agent or developer tool start from the API instead of waiting for a dashboard-created key.setup_token, a one-time sandbox API key, and an owner approval URL. The sandbox key can create apps, products, webhooks, sandbox sessions, sandbox proofs, and entitlement checks. It cannot create live money movement.
- Bootstrap a sandbox setup intent with
POST /v1/access/agent-bootstrap, or use an owner-created key when the merchant has already approved the agent. - Create an app with
POST /v1/access/apps. - Configure merchant rail settings with
PUT /v1/access/rail-settings/{rail_id}for the payout rails the merchant wants Hilt to evaluate. - Create a product with
POST /v1/access/products, settingdefault_railandallowed_rails. - Check
GET /v1/access/setup/readinessand complete the returnednext_actions[]. - Inspect
GET /v1/access/products/available-railsand render onlypayment_session_options.session_creatable_rails[]in checkout. - Create a session with
POST /v1/access/payment-sessions; includerailwheneverpayment_session_options.rail_requiredistrue. - Check access with
POST /v1/access/entitlements/checkbefore serving paid work.
- use server-side scoped credentials only
- include
Idempotency-Keyon every write - create paused products by default unless the merchant explicitly confirms live mode
- keep
allowed_rails,default_rail, and selectedrailexplicit in product, session, entitlement, webhook, and support state - hide blocked rails from buyer checkout while preserving blocker codes in logs and operator UI
- deny protected work unless
has_access: true - test the denied path, pending path, active path, sandbox rail path, disabled rail path, rail-required path, and webhook signature path
- store Hilt ids and external ids in the app database
- embed Hilt keys in client code
- treat a sandbox bootstrap key as a live key
- trust client-supplied owner, merchant, product, or entitlement ids without Hilt validation
- grant access from a pending payment session
- treat
allowed_rails[]as buyer-visible checkout rails - treat
base_usdc,evm_usdc,usdt,solana_usdt,erc20_usdt, ortron_usdtas live rails withoutproduction_enabled: true - make live product changes without explicit merchant confirmation
Production-readiness notes
Hilt Pay API is live for the Solana USDC launch scope. Broader enterprise and additional-rail production readiness still requires:- repeated staging migration rehearsal and rollback/runbook sign-off
- database-backed integration tests for idempotency races, live apply, billing evidence, revocation, audit, and rollback on disposable/staging-shaped targets
- production gate and kill-switch admin controls for each rail
- admin/support UI and playbook sign-off for pending entitlements, reconciliation, and webhook dead letters
- KMS/encrypted webhook secret storage or documented risk acceptance
- production metrics and alerts wired for entitlement latency, pending entitlement age, webhook dead letters, disabled rail attempts, idempotency conflicts, owner-isolation failures, rail proof failures, settlement/reorg risk, x402 facilitator failures, and EVM provider health
- legal/compliance review of public positioning
Pricing and packaging assumptions
Hilt Pay can stay simple for merchants using the workspace. Hilt Pay API has separate developer/agent pricing from Hilt Pay Workspace:| Hilt Pay API tier | Monthly | Yearly | Launch settlement fee |
|---|---|---|---|
| Sandbox | $0 | $0 | No live money |
| Starter | $79 | $790 | 1.00% Solana USDC |
| Growth | $349 | $3,490 | 0.70% Solana USDC |
| Scale | $1,250 | $12,500 | 0.45% Solana USDC |
| Enterprise | Custom | Custom | Custom |
x402 is the payment protocol for agent/API flows over the solana_usdc settlement path.
The Stripe subscription Price IDs for Hilt Pay API are runtime settings in admin:
stripe_price_hilt_pay_api_starter_monthlystripe_price_hilt_pay_api_starter_yearlystripe_price_hilt_pay_api_growth_monthlystripe_price_hilt_pay_api_growth_yearlystripe_price_hilt_pay_api_scale_monthlystripe_price_hilt_pay_api_scale_yearly
hilt_product=hilt_pay_api, hilt_owner_id, hilt_pay_api_plan, and hilt_interval metadata so the signed Hilt Pay API Stripe webhook can sync billing entitlement state back into Hilt.
Commercial and usage defaults are also runtime settings in admin:
hilt_pay_api_plan_sandbox_confighilt_pay_api_plan_starter_confighilt_pay_api_plan_growth_confighilt_pay_api_plan_scale_confighilt_pay_api_plan_enterprise_config
- access apps
- access products
- entitlement check volume
- webhook delivery volume
- audit/support retention
- enabled rail adapters and sandbox/gated capability controls
- rail-specific verification, finality, gas, facilitator, support, and dispute cost differences

