Reservation Codes
Reservation Codes allow you to generate unique payment codes that users can enter in the Paysera app to make payments without clicking links or scanning QR codes.
Phone-based payments, Manual code entry, Customer service, Physical receipts, Voice orders
What are Reservation Codes?
A reservation code is a unique alphanumeric code (e.g., ABC-123-XYZ) that users can manually enter in their Paysera wallet to complete a payment.
Creating Reservation Codes
View Code Generation Examples
Basic Code Generation
POST /rest/v1/payment-code
{
"amount": 2999,
"currency": "EUR",
"description": "Order #1234"
}
Response:
{
"code": "PAY-2024-ABC123",
"amount": 2999,
"currency": "EUR",
"valid_until": 1698761999,
"status": "active"
}
Code with Details
{
"amount": 5000,
"currency": "EUR",
"description": "Hotel Reservation - Room 405",
"valid_for": 3600, // Valid for 1 hour
"reference": "RES-2024-405",
"beneficiary_wallet_id": 11111,
"items": [
{
"title": "Room rental - 2 nights",
"price": 4000,
"quantity": 1
},
{
"title": "City tax",
"price": 1000,
"quantity": 1
}
]
}
Code Formats
Default: PAY-2024-ABC123
- Prefix:
PAY- - Year:
2024- - Unique ID:
ABC123
Custom (shorter for voice): ABC123
Code Lifecycle
Statuses
| Status | Description | Actions Available |
|---|---|---|
active | Valid, can be used | Cancel |
used | Payment made with code | None |
expired | Validity period passed | None |
canceled | Manually canceled | None |
Validity Period
Default: 24 hours
Custom:
{
"valid_for": 1800 // 30 minutes
// OR
"valid_until": 1698761999 // Unix timestamp
}
Check Code Status
GET /rest/v1/payment-code/{code}
Displaying Codes to Users
View Display Methods
On Screen
const code = await generatePaymentCode({
amount: 2999,
description: 'Order #1234'
});
console.log(`
Payment Code: ${code.code}
Amount: ${code.amount / 100} EUR
Valid until: ${new Date(code.valid_until * 1000).toLocaleString()}
Enter this code in Paysera app to pay.
`);
In Receipt
====================================
YOUR PAYMENT CODE
====================================
Code: PAY-2024-ABC123
Amount: 29.99 EUR
Valid: 1 hour
Order: #1234
To pay:
1. Open Paysera app
2. Go to Payments
3. Enter code
4. Confirm payment
====================================
Via Phone/Voice
// Generate short code for voice
const code = await generatePaymentCode({
amount: 1500,
description: 'Phone order',
code_format: 'short'
});
// Read to customer
console.log(`Your payment code is: ${code.code.split('').join(' ')}`);
// "Your payment code is: A B C 1 2 3"
Use Cases
View Real-World Use Cases
Use Case 1: Hotel Check-In
async function generateCheckInPayment(reservation) {
const code = await generatePaymentCode({
amount: reservation.totalAmount,
currency: 'EUR',
description: `Hotel Stay - Room ${reservation.roomNumber}`,
reference: reservation.confirmationNumber,
valid_for: 3600, // 1 hour to check in
items: [
{
title: `Room ${reservation.roomNumber} - ${reservation.nights} nights`,
price: reservation.roomRate * reservation.nights,
quantity: 1
},
{
title: 'City tax',
price: reservation.tax,
quantity: 1
}
]
});
await printReceipt({
guest: reservation.guestName,
room: reservation.roomNumber,
paymentCode: code.code,
amount: code.amount / 100,
validUntil: code.valid_until
});
return code;
}
Use Case 2: Phone Order
async function processPhoneOrder(order, customerPhone) {
const code = await generatePaymentCode({
amount: order.total,
description: `Phone order - ${order.items.length} items`,
reference: order.orderNumber,
code_format: 'short',
valid_for: 1800 // 30 minutes
});
// Send via SMS
await sendSMS({
to: customerPhone,
message: `Your payment code: ${code.code}. Amount: ${order.total/100} EUR. Valid for 30 min.`
});
return code;
}
Use Case 3: Customer Service
async function createServicePayment(issue) {
const code = await generatePaymentCode({
amount: issue.amount,
description: `Support ticket #${issue.ticketNumber}`,
reference: issue.ticketNumber,
valid_for: 86400 // 24 hours
});
console.log(`
Agent: "I've created a payment code for you."
Code: ${code.code}
Amount: ${issue.amount / 100} EUR
Valid: 24 hours
`);
return code;
}
Advanced Topics
Canceling Codes
Cancel unused code:
DELETE /rest/v1/payment-code/{code}
When to cancel: Order canceled, Customer changed mind, Code given by mistake
Example
async function cancelOrder(orderId) {
const order = await getOrder(orderId);
if (order.paymentCode && order.paymentStatus === 'pending') {
await cancelPaymentCode(order.paymentCode);
}
await updateOrder(orderId, { status: 'canceled' });
}
Monitoring Codes
Track Code Usage
class CodeMonitor {
async getCodeStats(period) {
return {
generated: await this.countGenerated(period),
used: await this.countUsed(period),
expired: await this.countExpired(period),
canceled: await this.countCanceled(period),
usageRate: await this.calculateUsageRate(period)
};
}
async calculateUsageRate(period) {
const total = await this.countGenerated(period);
const used = await this.countUsed(period);
return (used / total * 100).toFixed(2);
}
}
Alternatives
QR Codes - For visual payments:
const qrCode = await generatePaymentQR({
amount: 2999,
description: 'Order #1234'
});
Better when: In-person, visual medium available
Direct Links - For digital payments:
const tx = await createTransaction({...});
const paymentUrl = getConfirmationUrl(tx.transaction_key);
Better when: Email, SMS, messaging apps
Advantages & Disadvantages
✅ Advantages
- No internet needed - User can write down code
- Phone-friendly - Easy to communicate
- Simple process - Just enter code
- Works offline - Generate ahead of time
- Physical receipts - Can print
⚠️ Disadvantages
- Manual entry - User must type code
- Can expire - Time-limited
- Requires Paysera app - User must have app
- Less automated - More manual than links/QR
- Typing errors - User might mistype
What's Next?
You've completed all Integration Guides! 🎉
Explore more:
- Authorising Transactions - All acceptance methods
- Callbacks - Handle payment notifications
- Transaction Requests - Request payments from users
Return to:
- Payment Resource - Payment API details (see API Resources in sidebar)
- Transaction Resource - Transaction management (see API Resources in sidebar)
- Samples & Examples - Complete code examples
Need Help?
- Questions? → tech_support@paysera.com
- Transaction Guide → Transaction Resource
- Start Here → Getting Started
Format: PAY-2024-ABC123
Validity: Default 24 hours
Use: Enter in Paysera app
Best for: Phone orders, receipts, voice communication