Ejemplos
Los fragmentos dan por hecho un cliente requiply como el del inicio rápido: una clave publicable para los ejemplos de tienda online y una clave secreta para los ejemplos de servidor. Los ID como cameraKitId representan UUID que lees del catálogo.
Tienda online: catálogo para las fechas elegidas
const { items, nextCursor } = await requiply.inventory.list({
startDate: '2026-07-01T10:00:00+03:00',
endDate: '2026-07-03T18:00:00+03:00',
limit: 50,
});
for (const item of items) {
console.log(item.name, item.basePrice, item.currency, `${item.availableQuantity} free`);
}
Para listar solo lo que tiene al menos una unidad libre durante todo el periodo, usa availability.items() con las mismas fechas.
Tienda online: ofrecer solo horas de recogida válidas
const { workingHours, timezone } = await requiply.org.info();
function isOpen(day: string, time: string) {
const hours = workingHours.find((entry) => entry.day === day);
return !!hours?.isWorkingDay && time >= hours.startTime && time <= hours.endTime;
}
isOpen('saturday', '10:00'); // compare in the organization's timezone
Tienda online: formulario de solicitud de reserva
const result = await requiply.bookings.create({
startDate: '2026-07-01T10:00:00',
endDate: '2026-07-03T18:00:00',
items: [{ groupId: cameraKitId, quantity: 1 }],
deliveryType: 'pickup',
asRequest: true,
client: { name: 'Olena', email: 'olena@example.com', phone: '+380951234567' },
});
if (result.success) {
showThankYou(`Request #${result.reservationOrgId} received`);
} else if (result.reason === 'minimum_duration' && result.minimumDuration) {
const { earliestReturn, timeZone } = result.minimumDuration;
showError(`The earliest return is ${earliestReturn} (${timeZone})`);
} else {
showError(result.message ?? 'These dates cannot be booked');
}
Tienda online: añadir productos en venta
Solo funciona mientras la organización vende a los clientes.
import { RequiplyError, type PublicV1SaleItem } from '@requiply/api-sdk';
let goods: PublicV1SaleItem[] = [];
try {
({ items: goods } = await requiply.saleItems.list());
} catch (error) {
if (!(error instanceof RequiplyError && error.reason === 'selling_disabled')) throw error;
}
try {
const quote = await requiply.pricing.quote({
startDate: '2026-07-01T10:00:00',
endDate: '2026-07-03T18:00:00',
items: [{ groupId: cameraKitId, quantity: 1 }],
saleLines: [{ saleItemId: memoryCardId, quantity: 2 }],
});
console.log(quote.saleSubtotal, quote.total);
} catch (error) {
if (error instanceof RequiplyError && error.reason === 'out_of_stock') {
console.log('Only', error.data?.availableQuantity, 'left');
} else {
throw error;
}
}
Servidor: sincronizar las reservas nuevas
let cursor: string | undefined;
do {
const page = await requiply.bookings.list({
createdFrom: lastSyncAt,
limit: 200,
cursor,
});
for (const booking of page.bookings) {
await upsertBooking(booking);
}
cursor = page.nextCursor ?? undefined;
} while (cursor);
Servidor: buscar o crear un cliente
const { client, created } = await requiply.clients.create({
name: 'Alex',
email: 'alex@example.com',
});
console.log(created ? 'New client' : 'Existing client', client.id);
clients.create() devuelve el cliente existente cuando el email o el teléfono ya están registrados, así que puedes llamarlo sin problema antes de cada reserva.
Cancelar un presupuesto lento
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 5_000);
try {
const quote = await requiply.pricing.quote(
{
startDate: '2026-07-01T10:00:00',
endDate: '2026-07-03T18:00:00',
items: [{ groupId: cameraKitId, quantity: 1 }],
},
{ signal: controller.signal },
);
console.log(quote.total);
} finally {
clearTimeout(timeout);
}
Gestionar el límite de peticiones
import { RequiplyError } from '@requiply/api-sdk';
async function withRetry<T>(call: () => Promise<T>): Promise<T> {
try {
return await call();
} catch (error) {
if (error instanceof RequiplyError && error.status === 429) {
const seconds = error.retryAfter ?? 5;
await new Promise((resolve) => setTimeout(resolve, seconds * 1000));
return call();
}
throw error;
}
}
const report = await withRetry(() => requiply.reports.pipeline());
Reintenta las lecturas y los presupuestos sin problema. No envuelvas así bookings.create() ni sales.create(); consulta Reintentos.
Ejemplos ejecutables en el navegador
Para un proyecto de StackBlitz o similar en el navegador:
- Usa como dependencia una versión publicada de
@requiply/api-sdky fíjala. - Usa solo una clave publicable de una organización de demostración, y que sea fácil de sustituir.
- Crea las reservas solo como solicitudes con
asRequest: true. - No incluyas nunca métodos que necesiten clave secreta ni datos reales de clientes.