Skip to content

Hosted Checkout

A hosted stablecoin checkout under your brand

Offer a branded payment page with network and asset selection, QR payment details, live status, and a verified completion state.

A hosted stablecoin checkout under your brand

Complete payment flow

A production checkout without a payment frontend build

Paymos provides network and asset selection, payment details, QR rendering, transaction detection, confirmation status, and the final payment state. Create an invoice and redirect the customer to its payment URL.

Clear payment steps

Keep every payment decision on one page

The page reads on every device, copies on every wallet, settles on every supported network — without your customer leaving the flow once.

The tokens customers already hold

Customer pays in the stablecoin already in their wallet. No conversion step, no detour to buy crypto first.

QR code on the page

Customers on desktop scan the QR with their phone wallet. No copy-paste between devices.

Live payment status

Each transfer appears with its hash and an explorer link the moment the network shows it. One already detected when the countdown ends still settles — the clock closes the choice of asset, not a payment in flight.

Direct wallet launch on mobile

On a phone the page button opens Trust Wallet, MetaMask, Tonkeeper or Phantom with the payment already filled in. The OKX button copies the address and opens the app after it.

Every device

One payment page across screen sizes

Desktop customers scan a QR code; mobile customers open a compatible wallet from the page. The layout adapts to phones, tablets, and desktop screens.

One payment page across screen sizes
Charge in fiat. Settle in stablecoin. Render in the customer's language

International checkout

Charge in fiat. Settle in stablecoin. Render in the customer's language

Price invoices in 46 fiat currencies — USD, EUR, GBP, JPY, AUD, BRL and more. The customer sees the amount in their local currency alongside the exact stablecoin amount they send. Multilingual checkout for every market you sell into.

Your brand, your checkout

Brand controls. Live preview

Set the logo, accent, text colours, and checkout style in the dashboard. Every project has an independent brand profile and a live preview.

Brand controls. Live preview

Get started

Integrate with one invoice flow

Create an invoice, redirect to its payment URL, and fulfil the order after the signed webhook. The same REST flow works with any backend.

Read docs
import { Paymos, externalOrderId } from '@paymos/sdk';

const paymos = new Paymos({
  apiKey: process.env.PAYMOS_API_KEY,
  apiSecret: process.env.PAYMOS_API_SECRET,
});

const invoice = await paymos.invoices.create({
  projectId: 'prj_xxxxxxxxxxxx',
  amount: '100.00',
  currency: 'USD',
  externalOrderId: externalOrderId('order'),
  clientId: 'customer-456',
});

console.log(invoice.invoiceId, invoice.paymentUrl);
import os

from paymos import Paymos

paymos = Paymos(
    api_key=os.environ["PAYMOS_API_KEY"],
    api_secret=os.environ["PAYMOS_API_SECRET"],
)
invoice = paymos.invoices.create(
    project_id="prj_xxxxxxxxxxxx",
    amount="100.00",
    currency="USD",
    external_order_id="order-123",
    client_id="customer-456",
)

print(invoice["invoice_id"], invoice["payment_url"])
<?php
use Paymos\Client;
use Paymos\ClientConfig;
use Paymos\IdempotencyKey;

$paymos = new Client(new ClientConfig(
    getenv('PAYMOS_API_KEY'),
    getenv('PAYMOS_API_SECRET')
));
$invoice = $paymos->invoices()->create(array(
    'project_id' => 'prj_xxxxxxxxxxxx',
    'amount' => '100.00',
    'currency' => 'USD',
    'external_order_id' => IdempotencyKey::externalOrderId('order'),
    'client_id' => 'customer-456',
));

echo $invoice['invoice_id'] . ' ' . $invoice['payment_url'];
package main

import (
	"context"
	"fmt"
	"os"

	paymos "github.com/Paymos-labs/go-sdk/v2"
)

func main() {
	client, err := paymos.NewClient(os.Getenv("PAYMOS_API_KEY"), os.Getenv("PAYMOS_API_SECRET"))
	if err != nil {
		panic(err)
	}
	invoice, err := client.Invoices.Create(context.Background(), paymos.CreateInvoiceParams{
		ProjectID:       "prj_xxxxxxxxxxxx",
		Amount:          "100.00",
		Currency:        "USD",
		ExternalOrderID: "order-123",
		ClientID:        stringPointer("customer-456"),
	})
	if err != nil {
		panic(err)
	}
	fmt.Println(invoice.InvoiceID, invoice.PaymentURL)
}

func stringPointer(value string) *string { return &value }
using Paymos;

using var paymos = new PaymosClient(
    Environment.GetEnvironmentVariable("PAYMOS_API_KEY")!,
    Environment.GetEnvironmentVariable("PAYMOS_API_SECRET")!);

var invoice = await paymos.Invoices.CreateAsync(new CreateInvoiceRequest(
    ProjectId: "prj_xxxxxxxxxxxx",
    Amount: "100.00",
    Currency: "USD",
    ExternalOrderId: "order-123",
    ClientId: "customer-456"));

Console.WriteLine($"{invoice.InvoiceId} {invoice.PaymentUrl}");
import io.paymos.CreateInvoiceRequest;
import io.paymos.Invoice;
import io.paymos.PaymosClient;

PaymosClient paymos = new PaymosClient(
    System.getenv("PAYMOS_API_KEY"),
    System.getenv("PAYMOS_API_SECRET"));

Invoice invoice = paymos.invoices.create(
    CreateInvoiceRequest.builder()
        .projectId("prj_xxxxxxxxxxxx")
        .amount("100.00")
        .currency("USD")
        .externalOrderId("order-123")
        .clientId("customer-456")
        .build());

System.out.println(invoice.invoiceId() + " " + invoice.paymentUrl());
require 'paymos'

paymos = Paymos::Client.new(
  api_key: ENV.fetch('PAYMOS_API_KEY'),
  api_secret: ENV.fetch('PAYMOS_API_SECRET')
)
invoice = paymos.invoices.create(
  project_id: 'prj_xxxxxxxxxxxx',
  amount: '100.00',
  currency: 'USD',
  external_order_id: 'order-123',
  client_id: 'customer-456'
)

puts "#{invoice.invoice_id} #{invoice.payment_url}"
use paymos::{CreateInvoiceRequest, PaymosClient};

let paymos = PaymosClient::new(
    std::env::var("PAYMOS_API_KEY")?,
    std::env::var("PAYMOS_API_SECRET")?,
)?;
let invoice = paymos
    .invoices()
    .create(&CreateInvoiceRequest {
        project_id: "prj_xxxxxxxxxxxx".to_owned(),
        amount: "100.00".to_owned(),
        currency: "USD".to_owned(),
        external_order_id: "order-123".to_owned(),
        network: None,
        allow_multiple_payments: None,
        customer_fee_percent: None,
        client_id: Some("customer-456".to_owned()),
    })
    .await?;

println!("{} {}", invoice.invoice_id, invoice.payment_url);

Direct onboarding path

Create a project, issue its API credentials, and validate the first invoice in the test environment before enabling real payments.

Works with any backend

REST + webhooks — fits any stack. Node, Python, PHP, Go, Ruby, Java, .NET, anything that speaks HTTP.

Pick your path

Other ways to take a payment

Same Paymos backend. Pick the surface that fits how your customers already buy — or run several at once.

Embed on your site

The same checkout opens inside your domain — no new tab, no new URL. Stays on your brand from cart to confirmation.

Open Embedded Checkout

Send a payment link

No-code share URL from the dashboard. Paste anywhere — email, SMS, Telegram, support chat, invoice PDF.

Open Payment Links

Pay button widget

Add a Pay button to any page for donations, tips, and pay-what-you-want pricing. Customer picks the amount.

Open Pay Button Widget

Phone-as-terminal POS

Any phone or tablet becomes a crypto terminal. Enter the amount, show the QR, customer scans and pays.

Open Terminal POS

Telegram checkout

A Telegram-bot project's payment link opens a chat, not a page. Customer picks asset and network there — no Paymos account needed.

Open Telegram Checkout

Permanent deposit address

An address on every supported network, under your own customer id. No amount, no expiry — whatever they send lands on your balance.

Open Payment Channels

What's included

Hosted Checkout capabilities

Payment surface

  • Mobile-first responsive page
  • QR code + tap to copy address
  • Logo + accent colour per project
  • Multilingual checkout

Pricing modes

  • Fiat-priced (46 currencies)
  • Crypto-priced (single token)
  • Network-locked picker
  • Exchange rate locks at token pick

Supported assets

  • USDT, USDC, USD1, DAI, XAUT
  • Tron, Ethereum, BSC, Polygon, Arbitrum, Optimism
  • Base, TON, Avalanche, Solana, NEAR, Plasma, Sui
  • Settles to your Paymos balance, withdraw on demand

Developer experience

  • One REST endpoint to create
  • Idempotent via external_order_id
  • Signed webhook delivery with retries
  • Test mode + sandbox environment

Pricing

Every account opens at 1.0% per paid invoice

Enterprise is 0.3%, on request. Paymos takes no commission on a withdrawal — what a payout costs is the network fee for the route, quoted before you approve it and smaller than the transfer itself costs.

See pricing

Your payment page is already built