Przykłady
Fragmenty kodu zakładają klienta requiply z Szybkiego startu: z kluczem publicznym w przykładach dla sklepu internetowego i z kluczem tajnym w przykładach dla serwera. Identyfikatory takie jak cameraKitId oznaczają UUID odczytane z katalogu.
Sklep internetowy: katalog na wybrane daty
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`);
}
Aby wyświetlić tylko pozycje, w których co najmniej jeden egzemplarz jest wolny przez cały okres, użyj availability.items() z tymi samymi datami.
Sklep internetowy: tylko prawidłowe godziny wydania
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
Sklep internetowy: formularz zapytania o rezerwację
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');
}
Sklep internetowy: dodawanie towarów na sprzedaż
Działa tylko wtedy, gdy organizacja sprzedaje klientom.
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;
}
}
Serwer: synchronizacja nowych rezerwacji
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);
Serwer: znalezienie lub utworzenie klienta
const { client, created } = await requiply.clients.create({
name: 'Alex',
email: 'alex@example.com',
});
console.log(created ? 'New client' : 'Existing client', client.id);
clients.create() zwraca istniejącego klienta, gdy adres e-mail lub telefon jest już zapisany, więc można go bezpiecznie wywoływać przed każdą rezerwacją.
Anulowanie wolnej wyceny
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);
}
Obsługa limitów żądań
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());
Odczyty i wyceny możesz ponawiać bez ograniczeń. Nie opakowuj w ten sposób bookings.create() ani sales.create(). Zobacz Ponawianie żądań.
Przykłady do uruchomienia w przeglądarce
W projekcie StackBlitz lub podobnym projekcie w przeglądarce:
- Korzystaj z opublikowanej wersji
@requiply/api-sdki przypnij ją. - Używaj tylko klucza publicznego z organizacji demonstracyjnej i zadbaj, aby łatwo było go wymienić.
- Twórz rezerwacje tylko jako zapytania z
asRequest: true. - Nigdy nie dołączaj metod wymagających klucza tajnego ani prawdziwych danych klientów.