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

Status updates live as the network confirms the payment. No page refresh, no email back-and-forth.

Direct wallet launch on mobile

Customers on phone open Trust Wallet, MetaMask, Coinbase Wallet, OKX Wallet directly from the page button.

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 40+ fiat currencies — USD, EUR, GBP, JPY, AUD, BRL and more. The customer sees the amount in their local currency plus the stablecoin equivalent that will arrive in their wallet. 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, tablet, or counter PC becomes a crypto terminal. Enter the amount, show the QR, customer scans and pays.

Open Terminal POS

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 (40+ 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
  • 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

Standard processing: 1.0% per paid invoice

Rates from 0.3% are available on request. Paymos charges no withdrawal fee; the merchant pays a subsidized blockchain network fee.

See pricing

Start taking stablecoin payments today