Products and checkout

If you want the shortest route from zero to one working integration, start with Developer quickstart first and then come back here for the fuller checkout API. If you are integrating Hilt into your own product, this is the core public runtime surface:
  • products
  • hosted checkout
  • identity handoff
  • payment broadcast
  • payment confirmation
  • payment status

Copy-paste checkout flow

If you only need the high-level sequence, it is:
  1. create one product
  2. read the buyer-facing checkout payload
  3. start the buyer session and keep the payment_id
  4. poll only while the buyer is still waiting
  5. switch the longer-running work to Hilt webhooks

Common questions

What is the shortest Hilt checkout integration?

Create or read a product, start a hosted checkout session for its slug, keep the returned payment_id, then poll payment status only while the buyer is still in the live checkout flow.

Should my backend build the payment ledger itself?

No. Your backend should keep Hilt ids for correlation, but Hilt should remain the source of truth for payment settlement state, receipt proof, membership status, and support history.

When should I use webhooks instead of polling?

Use polling during the buyer’s active checkout session. Use webhooks for longer-running automation after checkout, including membership activation, receipt creation, support routing, and failed delivery recovery.

The basic model

  1. a merchant publishes a template in the dashboard
  2. your backend reads or manages that same object as a product
  3. the buyer opens the hosted checkout
  4. the buyer pays, and recurring products use the native subscription path when the workspace is enabled for it
  5. Hilt confirms the payment and updates the merchant trail

Auth model

Use:
  • X-Hilt-Key for server-side backend or bot integrations
  • Authorization: Bearer JWT_TOKEN for session-assisted merchant tools
  • no auth for the public buyer payload and buyer session start

Supported product routes

These are the main merchant-managed routes:

Product route guidance

Create a product

Use POST /v1/products when your backend needs to create the same kind of offer a merchant could otherwise launch from the dashboard.
Representative response:

Product request fields

Membership fields worth setting deliberately

For recurring or gated access products, these are the fields that most affect the buyer flow:

Renewal mode guidance

Use the renewal mode that matches the commercial promise:
  • ONE_OFF for single payments with no renewal schedule
  • AUTOMATIC for native Solana subscription products

Read products for a workspace

Representative response:

Update a product

Use PATCH /v1/products/{product_id} when the merchant changes the offer rather than creating a second one.

Archive a product

Supported public checkout routes

These are the main public buyer-flow routes:

Read the public checkout payload

Representative response:
Use this when you want to inspect the buyer-facing product data Hilt will render in hosted checkout.

Checkout payload fields that matter most

Start a buyer checkout session

Representative response:
This returns the canonical payment_id your integration should keep all the way through confirmation and post-payment lookups.

Connect response fields

Resolve a handoff token in checkout

If the buyer arrives with a signed handoff token, the checkout can resolve it before payment:
This is the route that turns a buyer-specific link into a locked identity at checkout. Use a handoff link when your bot or backend already knows who the buyer is before checkout starts.
Representative response:
The handoff token is the cleanest way to avoid asking buyers to type a Telegram or Discord identity manually.

Hosted checkout versus custom wallet orchestration

If you use the standard hosted checkout, the typical public flow is:
  1. GET /v1/products/p/{slug}
  2. POST /v1/products/p/{slug}/connect
  3. Hilt-hosted buyer wallet flow
  4. GET /v1/payments/{payment_id}
If you are running a more custom wallet surface, you may also call:
Those routes are for integrations that need to carry a signed transaction or explicit confirmation step through their own app flow. Most teams do not need them on day one.

Confirm a payment

Representative response:

Confirm response fields

Read payment status

Treat these states as the important ones:
  • PENDING_SIGNATURE
  • PENDING_CONFIRMATION
  • CONFIRMED
  • FAILED
In practice, most integrations should treat CONFIRMED and FAILED as terminal and everything else as transitional. Expired sessions typically surface as 410 during the session flow or as FAILED with an expiry-style failure reason. For production automation, native webhooks should now be the main backend integration path. Reading GET /v1/payments/{payment_id} remains useful during a live buyer session or for debugging.

What to persist from checkout

Persist at least:
  • product_id
  • slug
  • payment_id
  • tx_signature once it exists
  • your own buyer reference if you already know it
That gives you a clean way to reconcile what your app knows with what Hilt later confirms.

Good integration patterns

Use this pattern when you want the cleanest production integration:
  1. create or update the product from your backend when needed
  2. use the hosted checkout slug as the buyer entry point
  3. generate a handoff link if the buyer identity is already known
  4. keep the payment_id
  5. switch your backend automation to Hilt webhooks
  6. poll GET /v1/payments/{payment_id} only while the buyer is actively waiting if you need live progress
  7. read memberships, receipts, and renewal state after confirmation
That keeps your backend logic small and lets Hilt stay the source of truth for the payment trail.

What not to build

Do not build your own parallel truth from:
  • wallet screenshots
  • uncorrelated transaction lookups
  • assumptions about behavior outside the documented Hilt API
The supported checkout flow is:
  • hosted checkout
  • Hilt payment status
  • Hilt memberships
  • Hilt receipts