Node.js SDK for MONCRENEAU
The official Node.js SDK to integrate MONCRENEAU into your Express, NestJS, or standard Node.js applications.
Installation
npm install moncreneau
# or
yarn add moncreneau
# or
pnpm add moncreneau
Configuration
ES6 Import
import { MoncreneauClient } from 'moncreneau';
const client = new MoncreneauClient('YOUR_API_KEY');
CommonJS Require
const { MoncreneauClient } = require('moncreneau');
const client = new MoncreneauClient('YOUR_API_KEY');
With Environment Variables
import { MoncreneauClient } from 'moncreneau';
const client = new MoncreneauClient(process.env.MONCRENEAU_API_KEY);
.env file:
MONCRENEAU_API_KEY=YOUR_API_KEY
MONCRENEAU_BASE_URL=https://mc-prd.duckdns.org/api/v1
Usage Examples
List Departments
import { MoncreneauClient } from 'moncreneau';
const client = new MoncreneauClient('YOUR_API_KEY');
async function listDepartments() {
try {
const departments = await client.departments.list();
departments.forEach(dept => {
console.log(`ID: ${dept.id} - ${dept.name} (${dept.address})`);
});
} catch (error) {
console.error('Error:', error.message);
}
}
listDepartments();
Create an Appointment
import { MoncreneauClient } from 'moncreneau';
const client = new MoncreneauClient('YOUR_API_KEY');
async function createAppointment() {
try {
const appointment = await client.appointments.create({
departmentId: 5,
dateTime: '2026-02-15T10:00:00',
name: 'Amadou Diallo'
});
console.log('✅ Appointment created!');
console.log('ID:', appointment.id);
console.log('QR Code:', appointment.qrCode);
console.log('Status:', appointment.status);
} catch (error) {
if (error.code === 'INSUFFICIENT_CREDITS') {
console.error('❌ Insufficient credits:', error.message);
} else {
console.error('❌ Error:', error.message);
}
}
}
createAppointment();
Check Availability
import { MoncreneauClient } from 'moncreneau';
const client = new MoncreneauClient('YOUR_API_KEY');
async function checkAvailability() {
try {
const availability = await client.departments.checkAvailability(
5,
'2026-02-15T10:00:00'
);
if (availability.available) {
console.log('✅ Slot available!');
console.log('Remaining slots:', availability.remainingSlots);
} else {
console.log('❌ Slot unavailable');
console.log('Reason:', availability.unavailabilityReason);
}
} catch (error) {
console.error('Error:', error.message);
}
}
checkAvailability();
Cancel an Appointment
import { MoncreneauClient } from 'moncreneau';
const client = new MoncreneauClient('YOUR_API_KEY');
async function cancelAppointment(appointmentId) {
try {
const cancelled = await client.appointments.cancel(appointmentId);
console.log('✅ Appointment cancelled');
console.log('Status:', cancelled.status);
console.log('1 credit refunded');
} catch (error) {
console.error('❌ Error:', error.message);
}
}
cancelAppointment(123);
Express Integration
import express from 'express';
import { MoncreneauClient } from 'moncreneau';
const app = express();
app.use(express.json());
const client = new MoncreneauClient(process.env.MONCRENEAU_API_KEY);
// Endpoint to create an appointment
app.post('/appointments', async (req, res) => {
try {
const { departmentId, dateTime, name } = req.body;
const appointment = await client.appointments.create({
departmentId,
dateTime,
name
});
res.status(201).json(appointment);
} catch (error) {
if (error.code === 'INSUFFICIENT_CREDITS') {
return res.status(402).json({ error: error.message });
}
res.status(500).json({ error: error.message });
}
});
// Endpoint to check availability
app.get('/departments/:id/availability', async (req, res) => {
try {
const { id } = req.params;
const { dateTime } = req.query;
const availability = await client.departments.checkAvailability(
parseInt(id),
dateTime
);
res.json(availability);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});
Error Handling
The SDK uses typed errors:
import {
MoncreneauClient,
InsufficientCreditsError,
ValidationError,
NotFoundError,
UnauthorizedError
} from 'moncreneau';
const client = new MoncreneauClient('YOUR_API_KEY');
try {
const appointment = await client.appointments.create(data);
} catch (error) {
if (error instanceof InsufficientCreditsError) {
// Not enough credits
console.error('Insufficient credits:', error.message);
} else if (error instanceof ValidationError) {
// Validation failed
console.error('Validation:', error.errors);
} else if (error instanceof NotFoundError) {
// Resource not found
console.error('Not found:', error.message);
} else if (error instanceof UnauthorizedError) {
// Invalid API Key
console.error('Invalid API Key');
} else {
// Generic error
console.error('Error:', error.message);
}
}
Advanced Configuration
Timeout and Retry
import { MoncreneauClient } from 'moncreneau';
const client = new MoncreneauClient({
apiKey: 'YOUR_API_KEY',
baseUrl: 'https://mc-prd.duckdns.org/api/v1',
timeout: 30000, // 30 seconds
maxRetries: 3,
retryDelay: 1000 // 1 second
});
Webhooks
Verify webhook signatures:
import { MoncreneauClient } from 'moncreneau';
const client = new MoncreneauClient('YOUR_API_KEY');
app.post('/webhooks/moncreneau', (req, res) => {
const signature = req.headers['x-moncreneau-signature'];
const payload = JSON.stringify(req.body);
const isValid = client.webhooks.verifySignature(
payload,
signature,
process.env.WEBHOOK_SECRET
);
if (!isValid) {
return res.status(401).send('Invalid signature');
}
// Process the event
const event = req.body;
console.log('Event:', event.type, event.data);
res.json({ received: true });
});
TypeScript Support
The SDK is fully typed:
import {
MoncreneauClient,
Department,
Appointment,
CreateAppointmentRequest,
SlotAvailability
} from 'moncreneau';
const client = new MoncreneauClient('YOUR_API_KEY');
async function example(): Promise<void> {
const departments: Department[] = await client.departments.list();
const request: CreateAppointmentRequest = {
departmentId: 5,
dateTime: '2026-02-15T10:00:00',
name: 'Amadou Diallo'
};
const appointment: Appointment = await client.appointments.create(request);
}
Resources
The MONCRENEAU Node.js SDK is available on npm. For integration examples, see the Examples section.