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.

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.

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.

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 docsimport { 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 CheckoutSend a payment link
No-code share URL from the dashboard. Paste anywhere — email, SMS, Telegram, support chat, invoice PDF.
Open Payment LinksPay 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 WidgetPhone-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 POSWhat'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