À ce stade :
Schema Prisma ≈ 110 modèles Architecture Hexagonale NestJS DDD CQRS RBAC Multi-Tenant Enterprise Security Internationalisation IA
sont désormais définis.
La prochaine étape consiste à construire la :
Source de vérité contractuelle
du système :
openapi.yaml
qui permettra ensuite de générer automatiquement :
Swagger DTO NestJS Validation Zod SDK TypeScript Client React Query Mocks Tests contractuels Documentation API
Vu la taille du projet :
100+ modèles 1000+ endpoints
nous allons procéder par domaines.
Core & Security
/auth /users /roles /permissions /sessions /mfa /security
Owners
/owners /owner-documents /owner-bank-accounts
Properties
/properties /property-media /property-features /property-rates /property-availability
Customers
/customers /customer-documents /customer-notes
Reservations
/reservations /reservation-guests /reservation-pricing /reservation-events
Contracts
/contracts /contract-templates /signatures
Finance
/payments /refunds /invoices /accounting
CRM
/leads /opportunities /pipelines /tasks /activities
Messaging
/notifications /conversations /messages /emails /sms
Marketing
/campaigns /segments /marketing-events
Governance
/audit /workflows /feature-flags
OTA
/channels /distributions /channel-reservations /syncs
Revenue
/pricing-rules /dynamic-prices /revenue-forecasts
Compliance
/consents /risks /incidents /compliance-audits
Internationalisation
/countries /currencies /languages /translations
IA
/ai/conversations /ai/messages /knowledge /recommendations
Pour démarrer la génération réelle du backend :
OpenAPI Domain 1
doit être produit en premier.
Core Security API
Auth Users Roles Permissions Sessions MFA
Premier fichier :
openapi-core-security.yaml
contenant :
components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT
GET /users
200: description: Users list content: application/json: schema: $ref: '#/components/schemas/UserListResponse'
Définir le premier contrat API officiel de la plateforme.
Ce document couvre :
Auth Users Roles Permissions Sessions Refresh Tokens MFA Pagination Filtering Sorting Error Handling
Compatible :
OpenAPI 3.1 NestJS Swagger OpenAPI Generator Zod React Query
apps/api/openapi/openapi-core-security.yaml
openapi: 3.1.0 info: title: Rental Platform API version: 1.0.0 description: Enterprise Rental Platform servers: - url: https://api.company.com/v1 description: Production - url: https://staging-api.company.com/v1 description: Staging tags: - name: Authentication - name: Users - name: Roles - name: Permissions - name: Sessions - name: MFA
components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT
Uuid: type: string format: uuid
Timestamp: type: string format: date-time
PaginationMeta: type: object properties: page: type: integer pageSize: type: integer total: type: integer totalPages: type: integer
ApiError: type: object required: - code - message properties: code: type: string message: type: string details: type: object
ValidationError: allOf: - $ref: '#/components/schemas/ApiError' - type: object properties: fields: type: array items: type: object properties: field: type: string message: type: string
RegisterRequest: type: object required: - email - password - firstName - lastName properties: email: type: string format: email password: type: string minLength: 8 firstName: type: string lastName: type: string
LoginRequest: type: object required: - email - password properties: email: type: string format: email password: type: string
TokenResponse: type: object properties: accessToken: type: string refreshToken: type: string expiresIn: type: integer tokenType: type: string example: Bearer
/auth/register: post: tags: - Authentication summary: Register user requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RegisterRequest' responses: '201': description: User created '400': description: Validation error
/auth/login: post: tags: - Authentication summary: Login requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/LoginRequest' responses: '200': description: Authentication success content: application/json: schema: $ref: '#/components/schemas/TokenResponse'
/auth/refresh: post: tags: - Authentication summary: Refresh token
/auth/logout: post: security: - bearerAuth: [] tags: - Authentication summary: Logout
User: type: object properties: id: $ref: '#/components/schemas/Uuid' email: type: string firstName: type: string lastName: type: string active: type: boolean createdAt: $ref: '#/components/schemas/Timestamp'
UserListResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/User' meta: $ref: '#/components/schemas/PaginationMeta'
/users: get: security: - bearerAuth: [] tags: - Users summary: List users parameters: - name: page in: query schema: type: integer - name: pageSize in: query schema: type: integer - name: search in: query schema: type: string - name: sort in: query schema: type: string responses: '200': description: User list content: application/json: schema: $ref: '#/components/schemas/UserListResponse'
/users/{id}: get: security: - bearerAuth: [] tags: - Users parameters: - name: id in: path required: true schema: format: uuid type: string responses: '200': description: User
/users: post: security: - bearerAuth: [] tags: - Users summary: Create user
/users/{id}: patch: security: - bearerAuth: [] tags: - Users
/users/{id}: delete: security: - bearerAuth: [] tags: - Users
Role: type: object properties: id: type: string code: type: string name: type: string
GET /roles
POST /roles
GET /roles/{id}
PATCH /roles/{id}
DELETE /roles/{id}
Permission: type: object properties: id: type: string code: type: string name: type: string
GET /permissions
GET /permissions/{id}
POST /users/{id}/roles
DELETE /users/{id}/roles/{roleId}
Session: type: object properties: id: type: string ipAddress: type: string userAgent: type: string lastActivityAt: type: string format: date-time
GET /sessions
DELETE /sessions/{id}
POST /mfa/enable
POST /mfa/verify
POST /mfa/disable
200 OK 201 Created 204 No Content 400 Bad Request 401 Unauthorized 403 Forbidden 404 Not Found 409 Conflict 422 Validation Error 429 Too Many Requests 500 Internal Server Error
X-Tenant-Id: required: true
X-Correlation-Id: required: false
Phase 3-A.1 fournit :
≈ 25 endpoints ≈ 15 schemas ≈ 6 tags ≈ 3 security flows
Définir le premier domaine métier principal de la plateforme :
Owners Properties Property Media Property Features Property Availability Property Rates
Ce domaine couvre :
Sprint 3 Catalogue Immobilier
et constitue le socle métier de :
Réservations Contrats Paiements OTA Revenue Management
tags: - name: Owners - name: OwnerDocuments - name: OwnerBankAccounts - name: Properties - name: PropertyMedia - name: PropertyFeatures - name: PropertyAvailability - name: PropertyRates
Owner: type: object properties: id: type: string format: uuid ownerNumber: type: string firstName: type: string lastName: type: string email: type: string format: email phone: type: string active: type: boolean createdAt: type: string format: date-time
CreateOwnerRequest: type: object required: - firstName - lastName - email properties: firstName: type: string lastName: type: string email: type: string format: email phone: type: string
GET /owners POST /owners
GET /owners/{id}
PATCH /owners/{id}
DELETE /owners/{id}
GET /owners ?page=1 &pageSize=20 &search=dupont &active=true &sort=lastName
GET /owners/{id}/documents
POST /owners/{id}/documents
DELETE /owners/{id}/documents/{documentId}
multipart/form-data
IDENTITY TAX INSURANCE MANDATE CONTRACT
BankAccount: type: object properties: id: type: string iban: type: string bic: type: string accountHolder: type: string
GET /owners/{id}/bank-accounts
POST /owners/{id}/bank-accounts
PATCH /owners/{id}/bank-accounts/{accountId}
DELETE /owners/{id}/bank-accounts/{accountId}
Property: type: object properties: id: type: string format: uuid code: type: string title: type: string slug: type: string propertyType: type: string status: type: string published: type: boolean maxGuests: type: integer bedrooms: type: integer bathrooms: type: integer surface: type: number createdAt: type: string format: date-time
CreatePropertyRequest: type: object required: - title - propertyType properties: title: type: string description: type: string propertyType: type: string maxGuests: type: integer bedrooms: type: integer bathrooms: type: integer
GET /properties POST /properties
GET /properties/{id}
PATCH /properties/{id}
DELETE /properties/{id}
POST /properties/{id}/publish
POST /properties/{id}/unpublish
GET /properties ?search=villa ?propertyType=HOUSE ?published=true ?ownerId=xxx ?page=1 &pageSize=20
GET /properties/{id}/address
PUT /properties/{id}/address
GET /properties/{id}/owners
POST /properties/{id}/owners
DELETE /properties/{id}/owners/{ownerId}
PropertyMedia: type: object properties: id: type: string fileUrl: type: string title: type: string position: type: integer isCover: type: boolean
GET /properties/{id}/media
POST /properties/{id}/media
PATCH /properties/{id}/media/{mediaId}
DELETE /properties/{id}/media/{mediaId}
multipart/form-data
PropertyFeature: type: object properties: id: type: string code: type: string label: type: string
POOL WIFI AIR_CONDITIONING PARKING SEA_VIEW JACUZZI
GET /property-features
GET /properties/{id}/features
POST /properties/{id}/features
DELETE /properties/{id}/features/{featureId}
Availability: type: object properties: id: type: string startDate: type: string format: date endDate: type: string format: date available: type: boolean
GET /properties/{id}/availability
POST /properties/{id}/availability
PATCH /availability/{id}
DELETE /availability/{id}
GET /properties/{id}/availability
?from=2026-07-01
&to=2026-07-31
PropertyRate: type: object properties: id: type: string startDate: type: string format: date endDate: type: string format: date nightlyRate: type: number minimumStay: type: integer
GET /properties/{id}/rates
POST /properties/{id}/rates
PATCH /property-rates/{id}
DELETE /property-rates/{id}
GET /catalog/properties
destination checkIn checkOut guests priceMin priceMax bedrooms features
PropertySearchResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/Property' meta: $ref: '#/components/schemas/PaginationMeta'
owners.read owners.create owners.update owners.delete
properties.read properties.create properties.update properties.publish properties.delete
Cette phase ajoute :
≈ 42 endpoints ≈ 12 schémas OpenAPI ≈ 8 tags Swagger
Après Phase 3-A.2 :
≈ 67 endpoints ≈ 30 schémas ≈ 14 tags
Définir le cœur transactionnel de la plateforme :
Customers Reservations Reservation Guests Reservation Pricing Reservation Events Reservation Status History
Cette phase couvre :
Sprint 4 Réservation & Calendrier
et constitue la base de :
Contrats Paiements OTA Revenue Management CRM
tags: - name: Customers - name: CustomerDocuments - name: CustomerNotes - name: Reservations - name: ReservationGuests - name: ReservationPricing - name: ReservationEvents - name: ReservationCalendar
Customer: type: object properties: id: type: string format: uuid customerNumber: type: string firstName: type: string lastName: type: string email: type: string format: email phone: type: string nationality: type: string active: type: boolean createdAt: type: string format: date-time
CreateCustomerRequest: type: object required: - firstName - lastName - email properties: firstName: type: string lastName: type: string email: type: string format: email phone: type: string nationality: type: string
GET /customers POST /customers
GET /customers/{id}
PATCH /customers/{id}
DELETE /customers/{id}
GET /customers ?search=smith ?email=test@email.com ?page=1 &pageSize=20
GET /customers/{id}/documents
POST /customers/{id}/documents
DELETE /customers/{id}/documents/{documentId}
GET /customers/{id}/notes
POST /customers/{id}/notes
PATCH /customer-notes/{id}
DELETE /customer-notes/{id}
Reservation: type: object properties: id: type: string format: uuid reference: type: string propertyId: type: string format: uuid customerId: type: string format: uuid status: $ref: '#/components/schemas/ReservationStatus' checkInDate: type: string format: date checkOutDate: type: string format: date nights: type: integer adults: type: integer children: type: integer totalGuests: type: integer createdAt: type: string format: date-time
ReservationStatus: type: string enum: - DRAFT - PENDING - OPTION - CONFIRMED - CONTRACT_SENT - CONTRACT_SIGNED - PARTIALLY_PAID - PAID - CHECKED_IN - CHECKED_OUT - COMPLETED - CANCELLED - REFUNDED
CreateReservationRequest: type: object required: - propertyId - checkInDate - checkOutDate - adults properties: propertyId: type: string format: uuid customerId: type: string format: uuid checkInDate: type: string format: date checkOutDate: type: string format: date adults: type: integer children: type: integer customerNotes: type: string
GET /reservations POST /reservations
GET /reservations/{id}
PATCH /reservations/{id}
DELETE /reservations/{id}
GET /reservations ?status=CONFIRMED ?propertyId=xxx ?customerId=xxx ?from=2026-07-01 ?to=2026-07-31
POST /reservations/{id}/confirm
POST /reservations/{id}/cancel
POST /reservations/{id}/check-in
POST /reservations/{id}/check-out
POST /reservations/check-availability
AvailabilityCheckRequest: type: object properties: propertyId: type: string checkInDate: type: string format: date checkOutDate: type: string format: date
AvailabilityCheckResponse: type: object properties: available: type: boolean conflicts: type: array items: type: string
ReservationGuest: type: object properties: id: type: string firstName: type: string lastName: type: string nationality: type: string birthDate: type: string format: date isPrimary: type: boolean
GET /reservations/{id}/guests
POST /reservations/{id}/guests
PATCH /reservation-guests/{id}
DELETE /reservation-guests/{id}
ReservationPricing: type: object properties: nightlyAmount: type: number cleaningFee: type: number touristTax: type: number extrasAmount: type: number discountAmount: type: number totalAmount: type: number currencyCode: type: string
GET /reservations/{id}/pricing
POST /reservations/{id}/pricing/recalculate
ReservationEvent: type: object properties: id: type: string eventType: type: string payload: type: object createdAt: type: string format: date-time
GET /reservations/{id}/events
GET /reservations/{id}/history
ReservationStatusHistory: type: object properties: previousStatus: type: string newStatus: type: string changedAt: type: string format: date-time changedBy: type: string
GET /properties/{id}/calendar
from to
CalendarDay: type: object properties: date: type: string available: type: boolean reservationId: type: string
GET /catalog/search
destination checkInDate checkOutDate adults children priceMin priceMax features
CatalogSearchResponse: type: object properties: properties: type: array total: type: integer
customers.read customers.create customers.update customers.delete
reservations.read reservations.create reservations.update reservations.cancel reservations.checkin reservations.checkout
Cette phase ajoute :
≈ 52 endpoints ≈ 18 schémas ≈ 8 tags Swagger
Après Phase 3-A.3 :
≈ 120 endpoints ≈ 48 schémas ≈ 22 tags
Définir le domaine financier et contractuel de la plateforme.
Cette phase couvre :
Sprint 5 Contrats & Signature Électronique Sprint 6 Paiements & Facturation
Elle permet :
Réservation ↓ Contrat ↓ Signature ↓ Paiement ↓ Facture ↓ Comptabilité
tags: - name: Contracts - name: ContractTemplates - name: ContractSignatures - name: Payments - name: Refunds - name: Invoices - name: Accounting
Contract: type: object properties: id: type: string format: uuid contractNumber: type: string reservationId: type: string format: uuid status: $ref: '#/components/schemas/ContractStatus' generatedAt: type: string format: date-time signedAt: type: string format: date-time pdfUrl: type: string
ContractStatus: type: string enum: - DRAFT - GENERATED - SENT - VIEWED - SIGNED - CANCELLED
GET /contracts POST /contracts
GET /contracts/{id}
PATCH /contracts/{id}
DELETE /contracts/{id}
GET /reservations/{id}/contracts
POST /contracts/generate
GenerateContractRequest: type: object required: - reservationId - templateId properties: reservationId: type: string templateId: type: string
GenerateContractResponse: type: object properties: contractId: type: string pdfUrl: type: string
GET /contracts/{id}/pdf
POST /contracts/{id}/regenerate
ContractTemplate: type: object properties: id: type: string code: type: string name: type: string active: type: boolean
GET /contract-templates
POST /contract-templates
GET /contract-templates/{id}
PATCH /contract-templates/{id}
DELETE /contract-templates/{id}
ContractSignature: type: object properties: id: type: string signerName: type: string signerEmail: type: string signedAt: type: string format: date-time status: type: string
POST /contracts/{id}/send-signature
GET /contracts/{id}/signatures
POST /contracts/{id}/remind-signature
POST /contracts/{id}/cancel-signature
Payment: type: object properties: id: type: string format: uuid paymentReference: type: string reservationId: type: string amount: type: number currencyCode: type: string status: $ref: '#/components/schemas/PaymentStatus' paidAt: type: string format: date-time
PaymentStatus: type: string enum: - PENDING - AUTHORIZED - PAID - FAILED - CANCELLED - REFUNDED
GET /payments POST /payments
GET /payments/{id}
PATCH /payments/{id}
GET /reservations/{id}/payments
POST /payments/checkout-session
CheckoutSessionRequest: type: object properties: reservationId: type: string amount: type: number
CheckoutSessionResponse: type: object properties: sessionId: type: string checkoutUrl: type: string
POST /payments/webhooks/stripe
POST /payments/webhooks/paypal
GET /payments/{id}/transactions
Refund: type: object properties: id: type: string amount: type: number refundedAt: type: string format: date-time reason: type: string
GET /refunds
POST /refunds
GET /refunds/{id}
POST /payments/{id}/refund
Invoice: type: object properties: id: type: string invoiceNumber: type: string amountExclTax: type: number taxAmount: type: number amountInclTax: type: number status: $ref: '#/components/schemas/InvoiceStatus' issueDate: type: string format: date
InvoiceStatus: type: string enum: - DRAFT - ISSUED - PAID - PARTIALLY_PAID - CANCELLED
GET /invoices POST /invoices
GET /invoices/{id}
PATCH /invoices/{id}
GET /reservations/{id}/invoices
GET /invoices/{id}/pdf
POST /invoices/{id}/send
AccountingEntry: type: object properties: id: type: string entryDate: type: string format: date accountCode: type: string label: type: string debit: type: number credit: type: number
GET /accounting/entries
GET /accounting/entries/{id}
GET /accounting/export
from to format
CSV XLSX FEC
Reservation ↓ Generate Contract ↓ Send Signature ↓ Signed
Reservation ↓ Checkout Session ↓ Payment ↓ Invoice
Payment ↓ Refund ↓ Accounting Entry
contracts.read contracts.create contracts.update contracts.send contracts.sign
payments.read payments.create payments.refund
invoices.read invoices.create invoices.send
Cette phase ajoute :
≈ 65 endpoints ≈ 22 schémas ≈ 7 tags Swagger
Après Phase 3-A.4 :
≈ 185 endpoints ≈ 70 schémas ≈ 29 tags
Mettre en place le CRM intégré de la plateforme.
Cette phase couvre :
Sprint 8 CRM & Relation Client
Le CRM est directement connecté aux :
Customers Reservations Contracts Payments Marketing Automation
afin de disposer d'une vision 360° du client.
tags: - name: Leads - name: LeadSources - name: Pipelines - name: PipelineStages - name: Opportunities - name: Activities - name: Tasks - name: CustomerNotes - name: Tags - name: Segments
Lead: type: object properties: id: type: string format: uuid leadNumber: type: string firstName: type: string lastName: type: string email: type: string phone: type: string source: type: string score: type: integer status: $ref: '#/components/schemas/LeadStatus' assignedUserId: type: string createdAt: type: string format: date-time
LeadStatus: type: string enum: - NEW - QUALIFIED - CONTACTED - PROPOSAL_SENT - NEGOTIATION - WON - LOST
GET /leads
POST /leads
GET /leads/{id}
PATCH /leads/{id}
DELETE /leads/{id}
GET /leads ?status=NEW ?assignedUserId=xxx ?source=WEBSITE ?scoreMin=50
LeadSource: type: object properties: id: type: string code: type: string name: type: string active: type: boolean
GET /lead-sources
POST /lead-sources
PATCH /lead-sources/{id}
DELETE /lead-sources/{id}
WEBSITE GOOGLE FACEBOOK INSTAGRAM BOOKING AIRBNB REFERRAL PHONE
Pipeline: type: object properties: id: type: string format: uuid code: type: string name: type: string active: type: boolean createdAt: type: string format: date-time
GET /pipelines
POST /pipelines
GET /pipelines/{id}
PATCH /pipelines/{id}
DELETE /pipelines/{id}
PipelineStage: type: object properties: id: type: string pipelineId: type: string code: type: string name: type: string position: type: integer probability: type: integer
NEW QUALIFICATION CONTACT VISIT PROPOSAL NEGOTIATION WON LOST
GET /pipelines/{id}/stages
POST /pipelines/{id}/stages
PATCH /pipeline-stages/{id}
DELETE /pipeline-stages/{id}
Opportunity: type: object properties: id: type: string format: uuid leadId: type: string pipelineId: type: string stageId: type: string title: type: string estimatedValue: type: number probability: type: integer expectedCloseDate: type: string format: date status: $ref: '#/components/schemas/OpportunityStatus'
OpportunityStatus: type: string enum: - OPEN - WON - LOST - CANCELLED
GET /opportunities
POST /opportunities
GET /opportunities/{id}
PATCH /opportunities/{id}
DELETE /opportunities/{id}
POST /opportunities/{id}/move
MoveOpportunityRequest: type: object properties: stageId: type: string
Activity: type: object properties: id: type: string activityType: type: string subject: type: string description: type: string dueDate: type: string format: date-time completed: type: boolean
CALL EMAIL VISIT MEETING VIDEO_CALL FOLLOW_UP
GET /activities
POST /activities
GET /activities/{id}
PATCH /activities/{id}
DELETE /activities/{id}
POST /activities/{id}/assign
Task: type: object properties: id: type: string title: type: string description: type: string priority: $ref: '#/components/schemas/TaskPriority' status: $ref: '#/components/schemas/TaskStatus' dueDate: type: string format: date-time assignedUserId: type: string
TaskPriority: type: string enum: - LOW - MEDIUM - HIGH - URGENT
TaskStatus: type: string enum: - TODO - IN_PROGRESS - DONE - CANCELLED
GET /tasks
POST /tasks
GET /tasks/{id}
PATCH /tasks/{id}
DELETE /tasks/{id}
Create Task ↓ Assign User ↓ Execute ↓ Done
CustomerNote: type: object properties: id: type: string customerId: type: string content: type: string visibility: type: string createdAt: type: string format: date-time
PRIVATE TEAM PUBLIC
GET /customers/{id}/notes
POST /customers/{id}/notes
PATCH /customer-notes/{id}
DELETE /customer-notes/{id}
Tag: type: object properties: id: type: string code: type: string label: type: string color: type: string
GET /tags
POST /tags
PATCH /tags/{id}
DELETE /tags/{id}
VIP HOT_LEAD OWNER RETURNING_CUSTOMER HIGH_VALUE
Segment: type: object properties: id: type: string code: type: string name: type: string rules: type: object active: type: boolean
GET /segments
POST /segments
GET /segments/{id}
PATCH /segments/{id}
DELETE /segments/{id}
CLIENTS_FIDELES CLIENTS_INACTIFS PROPRIETAIRES_ACTIFS PROSPECTS_CHAUDS ANNIVERSAIRES
Leads créés Leads qualifiés Opportunités ouvertes CA potentiel Tâches ouvertes Activités réalisées Taux de conversion
GET /crm/dashboard
POST /leads/{id}/convert
Lead ↓ Customer ↓ Opportunity ↓ Reservation
POST /leads/{id}/auto-assign
POST /leads/{id}/calculate-score
POST /tasks/{id}/remind
leads.read leads.create leads.update leads.delete leads.convert
crm.read crm.manage crm.assign crm.export
tasks.read tasks.create tasks.update tasks.complete
Cette phase ajoute :
≈ 72 endpoints ≈ 25 schémas ≈ 10 tags Swagger
Après Phase 3-A.5 :
≈ 257 endpoints ≈ 95 schémas ≈ 39 tags
Construire le centre de communication unifié de la plateforme.
Cette phase couvre :
Sprint 9 Messagerie & Notifications
Elle permettra :
Messagerie interne Emails transactionnels SMS transactionnels Notifications temps réel Templates Campagnes Marketing Centre de communication
tags: - name: Conversations - name: Messages - name: Notifications - name: Emails - name: SMS - name: Templates - name: Campaigns
Conversation: type: object properties: id: type: string format: uuid subject: type: string conversationType: $ref: '#/components/schemas/ConversationType' status: $ref: '#/components/schemas/ConversationStatus' createdAt: type: string format: date-time
ConversationType: type: string enum: - INTERNAL - CUSTOMER - OWNER - RESERVATION - SUPPORT
ConversationStatus: type: string enum: - OPEN - PENDING - CLOSED - ARCHIVED
GET /conversations
POST /conversations
GET /conversations/{id}
PATCH /conversations/{id}
DELETE /conversations/{id}
GET /conversations/{id}/participants
POST /conversations/{id}/participants
DELETE /conversations/{id}/participants/{userId}
Message: type: object properties: id: type: string conversationId: type: string senderId: type: string content: type: string attachments: type: array createdAt: type: string format: date-time
GET /conversations/{id}/messages
POST /conversations/{id}/messages
GET /messages/{id}
PATCH /messages/{id}
DELETE /messages/{id}
POST /messages/{id}/attachments
Notification: type: object properties: id: type: string userId: type: string type: $ref: '#/components/schemas/NotificationType' title: type: string message: type: string read: type: boolean createdAt: type: string format: date-time
NotificationType: type: string enum: - INFO - SUCCESS - WARNING - ERROR - SYSTEM
GET /notifications
GET /notifications/{id}
PATCH /notifications/{id}/read
PATCH /notifications/read-all
DELETE /notifications/{id}
/ws/notifications
notification.created message.received reservation.created payment.received contract.signed
Email: type: object properties: id: type: string to: type: string subject: type: string status: $ref: '#/components/schemas/EmailStatus' sentAt: type: string format: date-time
EmailStatus: type: string enum: - DRAFT - QUEUED - SENT - DELIVERED - OPENED - CLICKED - BOUNCED - FAILED
GET /emails
GET /emails/{id}
POST /emails/send
POST /emails/test
POST /emails/send
SendEmailRequest: type: object properties: to: type: string templateCode: type: string variables: type: object
Sms: type: object properties: id: type: string phoneNumber: type: string message: type: string status: $ref: '#/components/schemas/SmsStatus' sentAt: type: string format: date-time
SmsStatus: type: string enum: - QUEUED - SENT - DELIVERED - FAILED
GET /sms
GET /sms/{id}
POST /sms/send
POST /sms/test
Template: type: object properties: id: type: string code: type: string name: type: string channel: type: string subject: type: string active: type: boolean
GET /templates
POST /templates
GET /templates/{id}
PATCH /templates/{id}
DELETE /templates/{id}
EMAIL SMS PUSH IN_APP
RESERVATION_CONFIRMED PAYMENT_RECEIVED CONTRACT_SIGNED CHECKIN_REMINDER OWNER_MONTHLY_REPORT
Campaign: type: object properties: id: type: string code: type: string name: type: string campaignType: type: string status: type: string scheduledAt: type: string format: date-time
GET /campaigns
POST /campaigns
GET /campaigns/{id}
PATCH /campaigns/{id}
DELETE /campaigns/{id}
GET /campaigns/{id}/recipients
POST /campaigns/{id}/recipients
POST /campaigns/{id}/schedule
POST /campaigns/{id}/start
POST /campaigns/{id}/pause
POST /campaigns/{id}/cancel
GET /campaigns/{id}/statistics
CampaignStatistics: type: object properties: recipients: type: integer sent: type: integer opened: type: integer clicked: type: integer unsubscribed: type: integer
GET /communication/inbox
Messages Emails SMS Notifications
Messages envoyés Emails délivrés Taux ouverture Taux clic SMS délivrés Notifications lues
GET /communication/dashboard
SMTP SendGrid Mailgun Amazon SES
Twilio OVH SMS MessageBird
Firebase OneSignal
messages.read messages.create messages.delete
notifications.read notifications.manage
campaigns.read campaigns.create campaigns.execute campaigns.delete
Cette phase ajoute :
≈ 84 endpoints ≈ 28 schémas ≈ 7 tags Swagger
Après Phase 3-A.6 :
≈ 341 endpoints ≈ 123 schémas ≈ 46 tags
Construire la couche d'automatisation intelligente de la plateforme.
Cette phase couvre :
Sprint 13 IA & Automatisation
Elle permet :
Segmentation Marketing Automation Scénarios métiers Déclencheurs Recommandations IA Assistant IA Knowledge Base Recherche sémantique
tags: - name: MarketingSegments - name: MarketingEvents - name: AutomationRules - name: AutomationScenarios - name: AutomationExecutions - name: Recommendations - name: AI - name: KnowledgeBase
MarketingSegment: type: object properties: id: type: string format: uuid code: type: string name: type: string description: type: string active: type: boolean rules: type: object
GET /marketing-segments
POST /marketing-segments
GET /marketing-segments/{id}
PATCH /marketing-segments/{id}
DELETE /marketing-segments/{id}
POST /marketing-segments/{id}/preview
SegmentPreview: type: object properties: customerCount: type: integer leadCount: type: integer
MarketingEvent: type: object properties: id: type: string eventType: type: string customerId: type: string occurredAt: type: string format: date-time payload: type: object
GET /marketing-events
GET /marketing-events/{id}
eventType customerId from to
EMAIL_OPEN EMAIL_CLICK PAGE_VISIT FORM_SUBMIT RESERVATION_CREATED PAYMENT_COMPLETED
AutomationRule: type: object properties: id: type: string code: type: string name: type: string triggerEvent: type: string active: type: boolean
GET /automation-rules
POST /automation-rules
GET /automation-rules/{id}
PATCH /automation-rules/{id}
DELETE /automation-rules/{id}
POST /automation-rules/{id}/enable
POST /automation-rules/{id}/disable
AutomationScenario: type: object properties: id: type: string code: type: string name: type: string triggerType: type: string active: type: boolean
GET /automation-scenarios
POST /automation-scenarios
GET /automation-scenarios/{id}
PATCH /automation-scenarios/{id}
DELETE /automation-scenarios/{id}
POST /automation-scenarios/{id}/simulate
POST /automation-scenarios/{id}/execute
ReservationConfirmed ↓ GenerateContract ↓ SendEmail ↓ CreateTask ↓ NotifyOwner
AutomationExecution: type: object properties: id: type: string status: type: string entityType: type: string entityId: type: string startedAt: type: string format: date-time completedAt: type: string format: date-time
GET /automation-executions
GET /automation-executions/{id}
POST /automation-executions/{id}/retry
Recommendation: type: object properties: id: type: string recommendationType: type: string title: type: string description: type: string confidenceScore: type: number accepted: type: boolean
GET /recommendations
GET /recommendations/{id}
POST /recommendations/{id}/accept
POST /recommendations/{id}/reject
PRICE_OPTIMIZATION CUSTOMER_RETENTION LEAD_CONVERSION REVENUE_FORECAST PROPERTY_IMPROVEMENT RISK_ALERT
AiConversation: type: object properties: id: type: string title: type: string model: type: string createdAt: type: string format: date-time
GET /ai/conversations
POST /ai/conversations
GET /ai/conversations/{id}
DELETE /ai/conversations/{id}
GET /ai/conversations/{id}/messages
POST /ai/conversations/{id}/messages
AiMessageRequest: type: object properties: content: type: string
AiMessageResponse: type: object properties: content: type: string sources: type: array
Quels sont les biens les moins rentables ? ---------------- Quels clients présentent un risque ? ---------------- Prévois les revenus des 90 prochains jours
KnowledgeDocument: type: object properties: id: type: string title: type: string sourceType: type: string indexed: type: boolean
GET /knowledge/documents
POST /knowledge/documents
GET /knowledge/documents/{id}
DELETE /knowledge/documents/{id}
POST /knowledge/documents/upload
POST /knowledge/documents/{id}/index
POST /knowledge/search
KnowledgeSearchRequest: type: object properties: query: type: string limit: type: integer
KnowledgeSearchResponse: type: object properties: documents: type: array chunks: type: array
GET /ai/dashboard
Conversations Documents indexés Automatisations exécutées Recommandations générées Taux acceptation Temps gagné
lead.created lead.converted campaign.started campaign.completed
recommendation.created assistant.question assistant.answer
automation.started automation.completed automation.failed
ai.read ai.chat ai.manage
automation.read automation.execute automation.manage
knowledge.read knowledge.create knowledge.index knowledge.delete
Cette phase ajoute :
≈ 92 endpoints ≈ 30 schémas ≈ 8 tags Swagger
Après Phase 3-A.7 :
≈ 433 endpoints ≈ 153 schémas ≈ 54 tags
Construire la couche transverse de gouvernance, administration et conformité.
Cette phase couvre :
Sprint 10 Reporting Sprint 11 Administration Sprint 19 Gouvernance & Conformité
Elle permet :
Audit complet Historisation Feature Flags Workflows Administration Paramétrage plateforme Conformité Supervision
tags: - name: AuditLogs - name: EntityHistory - name: FeatureFlags - name: Workflows - name: WorkflowInstances - name: WorkflowExecutions - name: Administration - name: SystemSettings
AuditLog: type: object properties: id: type: string format: uuid entityType: type: string entityId: type: string action: type: string userId: type: string ipAddress: type: string correlationId: type: string createdAt: type: string format: date-time
GET /audit-logs
GET /audit-logs/{id}
GET /audit-logs ?entityType=Reservation ?entityId=xxx ?userId=xxx ?action=UPDATE ?from=2026-01-01 ?to=2026-01-31
GET /audit-logs/export
CSV XLSX JSON
EntityHistory: type: object properties: id: type: string entityType: type: string entityId: type: string version: type: integer snapshot: type: object createdAt: type: string format: date-time
GET /entity-history
GET /entity-history/{id}
GET /entity-history/{entityType}/{entityId}
POST /entity-history/{id}/restore
FeatureFlag: type: object properties: id: type: string code: type: string name: type: string enabled: type: boolean configuration: type: object
GET /feature-flags
POST /feature-flags
GET /feature-flags/{id}
PATCH /feature-flags/{id}
DELETE /feature-flags/{id}
POST /feature-flags/{id}/enable
POST /feature-flags/{id}/disable
AI_ASSISTANT ADVANCED_REPORTING OTA_V2 REVENUE_MANAGEMENT OWNER_PORTAL_V2
Workflow: type: object properties: id: type: string code: type: string name: type: string entityType: type: string active: type: boolean
GET /workflows
POST /workflows
GET /workflows/{id}
PATCH /workflows/{id}
DELETE /workflows/{id}
WorkflowStep: type: object properties: id: type: string workflowId: type: string code: type: string name: type: string position: type: integer approverRole: type: string
GET /workflows/{id}/steps
POST /workflows/{id}/steps
PATCH /workflow-steps/{id}
DELETE /workflow-steps/{id}
Reservation Approval ↓ Manager Approval ↓ Contract Generation ↓ Payment Validation ↓ Completed
WorkflowInstance: type: object properties: id: type: string workflowId: type: string entityType: type: string entityId: type: string status: type: string
GET /workflow-instances
GET /workflow-instances/{id}
POST /workflow-instances/start
POST /workflow-instances/{id}/approve
POST /workflow-instances/{id}/reject
POST /workflow-instances/{id}/cancel
WorkflowExecution: type: object properties: id: type: string workflowInstanceId: type: string workflowStepId: type: string status: type: string executedAt: type: string format: date-time
GET /workflow-executions
GET /workflow-executions/{id}
GET /admin/tenants
POST /admin/tenants
GET /admin/tenants/{id}
PATCH /admin/tenants/{id}
POST /admin/tenants/{id}/activate
POST /admin/tenants/{id}/suspend
GET /admin/agencies
POST /admin/agencies
GET /admin/agencies/{id}
PATCH /admin/agencies/{id}
DELETE /admin/agencies/{id}
SystemSetting: type: object properties: code: type: string value: type: string category: type: string
GET /system-settings
GET /system-settings/{code}
PUT /system-settings/{code}
SECURITY PAYMENTS EMAIL SMS OTA BOOKING INVOICING
GET /admin/jobs
GET /admin/jobs/{id}
POST /admin/jobs/{id}/retry
POST /admin/jobs/{id}/cancel
GET /admin/health
HealthResponse: type: object properties: database: type: string redis: type: string storage: type: string queue: type: string status: type: string
GET /admin/metrics GET /admin/version GET /admin/build
GET /governance/dashboard
Audit Logs Feature Flags Workflows actifs Incidents sécurité Conformité Risques ouverts
POST /governance/privacy/export
POST /governance/privacy/delete
GET /governance/consents
audit.read audit.export
admin.read admin.manage admin.settings
workflow.read workflow.manage workflow.execute
governance.read governance.manage
Cette phase ajoute :
≈ 86 endpoints ≈ 26 schémas ≈ 8 tags Swagger
Après Phase 3-A.8 :
≈ 519 endpoints ≈ 179 schémas ≈ 62 tags
Construire la couche de distribution multicanal de la plateforme.
Cette phase couvre :
Sprint 12 OTA & Distribution Sprint 14 API & Partenaires Sprint 18 Channel Manager Enterprise
Cette couche permet :
Publication OTA Synchronisation calendriers Synchronisation tarifs Synchronisation réservations Gestion erreurs OTA Connecteurs partenaires
tags: - name: Channels - name: ChannelConnections - name: PropertyDistribution - name: ChannelReservations - name: Synchronization - name: SyncErrors - name: Partners
Channel: type: object properties: id: type: string format: uuid code: type: string name: type: string channelType: type: string active: type: boolean
GET /channels
GET /channels/{id}
AIRBNB BOOKING VRBO ABRITEL EXPEDIA DIRECT
ChannelConnection: type: object properties: id: type: string channelId: type: string connectionName: type: string accountIdentifier: type: string active: type: boolean lastSyncAt: type: string format: date-time
GET /channel-connections
POST /channel-connections
GET /channel-connections/{id}
PATCH /channel-connections/{id}
DELETE /channel-connections/{id}
POST /channel-connections/{id}/test
POST /channel-connections/{id}/enable
POST /channel-connections/{id}/disable
PropertyDistribution: type: object properties: id: type: string propertyId: type: string channelId: type: string published: type: boolean publicationStatus: type: string externalPropertyId: type: string
GET /property-distributions
POST /property-distributions
GET /property-distributions/{id}
PATCH /property-distributions/{id}
DELETE /property-distributions/{id}
POST /property-distributions/{id}/publish
POST /property-distributions/{id}/unpublish
POST /property-distributions/{id}/sync
POST /properties/{id}/publish-to-channel
PublishPropertyRequest: type: object properties: channelConnectionId: type: string
ChannelReservation: type: object properties: id: type: string reservationId: type: string externalReservationId: type: string externalStatus: type: string importedAt: type: string format: date-time
GET /channel-reservations
GET /channel-reservations/{id}
POST /channel-reservations/import
POST /channel-reservations/{id}/reconcile
SyncExecution: type: object properties: id: type: string syncType: type: string status: type: string startedAt: type: string format: date-time completedAt: type: string format: date-time processedCount: type: integer successCount: type: integer errorCount: type: integer
GET /synchronizations
GET /synchronizations/{id}
POST /synchronizations/start
POST /synchronizations/full
POST /synchronizations/calendar
POST /synchronizations/rates
POST /synchronizations/reservations
PROPERTY_EXPORT AVAILABILITY_EXPORT RATE_EXPORT RESERVATION_IMPORT FULL_SYNC
SyncError: type: object properties: id: type: string errorCode: type: string errorMessage: type: string entityType: type: string entityId: type: string occurredAt: type: string format: date-time
GET /sync-errors
GET /sync-errors/{id}
POST /sync-errors/{id}/retry
POST /sync-errors/{id}/ignore
GET /channels/{channelId}/calendar
propertyId from to
GET /channels/{channelId}/rates
POST /channels/{channelId}/rates/push
GET /ota/dashboard
Biens publiés OTA connectés Synchronisations Erreurs OTA Réservations importées Temps moyen synchronisation
Partner: type: object properties: id: type: string code: type: string name: type: string active: type: boolean
GET /partners
POST /partners
GET /partners/{id}
PATCH /partners/{id}
DELETE /partners/{id}
GET /partners/{id}/api-keys
POST /partners/{id}/api-keys
DELETE /partners/{id}/api-keys/{keyId}
GET /partners/{id}/webhooks
POST /partners/{id}/webhooks
PATCH /partners/{id}/webhooks/{webhookId}
DELETE /partners/{id}/webhooks/{webhookId}
GET /marketplace/connectors
Airbnb Booking Stripe Twilio Mailgun DocuSign Zapier
POST /webhooks/ota/reservation-created POST /webhooks/ota/reservation-updated POST /webhooks/ota/reservation-cancelled
POST /webhooks/ota/calendar-updated
POST /webhooks/ota/rate-updated
ota.read ota.manage ota.sync ota.publish
partners.read partners.manage partners.api
Cette phase ajoute :
≈ 76 endpoints ≈ 24 schémas ≈ 7 tags Swagger
Après Phase 3-A.9 :
≈ 595 endpoints ≈ 203 schémas ≈ 69 tags
Construire la couche décisionnelle avancée de la plateforme.
Cette phase couvre :
Sprint 10 Reporting & Business Intelligence Sprint 13 Prévisions IA Sprint 17 Revenue Management Sprint 20 Enterprise Analytics
Elle permet :
Tarification dynamique Yield Management Prévisions Simulations Benchmark concurrence KPI avancés Pilotage financier
tags: - name: PricingRules - name: DynamicPrices - name: RevenueForecasts - name: RevenueSimulations - name: CompetitorSnapshots - name: MarketDemand - name: Dashboards - name: Analytics
PricingRule: type: object properties: id: type: string format: uuid code: type: string name: type: string priority: type: integer active: type: boolean conditions: type: object actions: type: object
GET /pricing-rules
POST /pricing-rules
GET /pricing-rules/{id}
PATCH /pricing-rules/{id}
DELETE /pricing-rules/{id}
POST /pricing-rules/{id}/enable
POST /pricing-rules/{id}/disable
POST /pricing-rules/{id}/simulate
Occupation > 80% ↓ +15% ---------------- Weekend ↓ +10% ---------------- Haute saison ↓ +25%
DynamicPrice: type: object properties: id: type: string propertyId: type: string pricingDate: type: string format: date basePrice: type: number adjustedPrice: type: number demandFactor: type: number competitorFactor: type: number
GET /dynamic-prices
GET /dynamic-prices/{id}
POST /dynamic-prices/calculate
POST /dynamic-prices/recalculate
GET /dynamic-prices ?propertyId=xxx ?from=2026-07-01 ?to=2026-07-31
RevenueForecast: type: object properties: id: type: string propertyId: type: string forecastPeriodStart: type: string format: date forecastPeriodEnd: type: string format: date expectedRevenue: type: number expectedOccupancy: type: number confidenceLevel: type: number
GET /revenue-forecasts
GET /revenue-forecasts/{id}
POST /revenue-forecasts/generate
7 jours 30 jours 90 jours 180 jours 365 jours
RevenueSimulation: type: object properties: id: type: string name: type: string projectedRevenue: type: number projectedOccupancy: type: number
GET /revenue-simulations
POST /revenue-simulations
GET /revenue-simulations/{id}
DELETE /revenue-simulations/{id}
POST /revenue-simulations/{id}/run
POST /revenue-simulations/compare
Prix +10% ↓ Occupation -3% ↓ CA +6%
CompetitorSnapshot: type: object properties: id: type: string propertyId: type: string competitorName: type: string nightlyRate: type: number occupancy: type: number snapshotDate: type: string format: date
GET /competitor-snapshots
GET /competitor-snapshots/{id}
POST /competitor-snapshots/import
GET /competitor-snapshots/benchmark
CompetitorBenchmark: type: object properties: marketAverage: type: number propertyAverage: type: number variance: type: number
MarketDemand: type: object properties: id: type: string regionCode: type: string demandIndex: type: number occupancyIndex: type: number averageDailyRate: type: number demandDate: type: string format: date
GET /market-demand
GET /market-demand/{id}
GET /market-demand/trends
GET /market-demand/forecast
GET /revenue/dashboard
RevPAR ADR Occupancy Rate Revenue Forecast Accuracy Average Stay Cancellation Rate
RevenueDashboard: type: object properties: revenue: type: number occupancyRate: type: number averageDailyRate: type: number revPar: type: number
GET /analytics/properties/{id}
Occupation Revenus Tarif moyen Réservations Annulations
GET /analytics/owners/{id}
Revenus Biens Occupation Commissions Paiements
GET /analytics/reservations
from to propertyId ownerId
GET /analytics/financial
Revenue Facturation Paiements Remboursements Commissions
GET /analytics/forecast
ForecastAnalytics: type: object properties: next30Days: type: number next90Days: type: number next365Days: type: number
GET /analytics/export
CSV XLSX PDF JSON
dashboard from to format
GET /revenue/recommendations
PRICE_INCREASE PRICE_DECREASE PROMOTION MINIMUM_STAY AVAILABILITY_OPTIMIZATION
POST /revenue/recommendations/{id}/accept
POST /revenue/recommendations/{id}/reject
GET /executive/dashboard
CA Total CA Prévisionnel Taux Occupation Top Biens Top Agences Top Propriétaires Taux Conversion
revenue.read revenue.manage revenue.forecast revenue.simulate
analytics.read analytics.export
reporting.read reporting.executive
Cette phase ajoute :
≈ 82 endpoints ≈ 32 schémas ≈ 8 tags Swagger
Après Phase 3-A.10 :
≈ 677 endpoints ≈ 235 schémas ≈ 77 tags
Construire la couche Enterprise Security de la plateforme.
Cette phase couvre :
Sprint 19 Gouvernance & Conformité Enterprise Security RGPD ISO 27001 SOC2 OWASP ASVS
Elle permet :
MFA SSO Consentements RGPD Gestion des risques Classification des données Politiques de sécurité Incidents Audits
tags: - name: MFA - name: Identity - name: Sessions - name: Consents - name: Privacy - name: Risks - name: SecurityIncidents - name: ComplianceAudits - name: DataClassification - name: RetentionPolicies - name: SecurityPolicies
MfaConfiguration: type: object properties: enabled: type: boolean method: $ref: '#/components/schemas/MfaMethod' backupCodesRemaining: type: integer
MfaMethod: type: string enum: - TOTP - EMAIL - SMS
GET /security/mfa POST /security/mfa/enable POST /security/mfa/verify POST /security/mfa/disable POST /security/mfa/regenerate-backup-codes
GET /security/mfa/qrcode
IdentityProvider: type: object properties: id: type: string providerType: type: string name: type: string enabled: type: boolean
SAML OIDC AZURE_AD OKTA AUTH0 KEYCLOAK
GET /identity/providers
POST /identity/providers
GET /identity/providers/{id}
PATCH /identity/providers/{id}
DELETE /identity/providers/{id}
POST /identity/saml/configuration POST /identity/saml/test
POST /identity/oidc/configuration POST /identity/oidc/test
ActiveSession: type: object properties: id: type: string ipAddress: type: string country: type: string userAgent: type: string createdAt: type: string format: date-time lastActivityAt: type: string format: date-time
GET /sessions
GET /sessions/{id}
DELETE /sessions/{id}
DELETE /sessions/revoke-all
Consent: type: object properties: id: type: string consentType: type: string granted: type: boolean grantedAt: type: string format: date-time version: type: string
GDPR COOKIES EMAIL_MARKETING SMS_MARKETING PROFILING
GET /consents
POST /consents
GET /consents/{id}
DELETE /consents/{id}
GET /users/{id}/consents
POST /privacy/export
PrivacyExportRequest: type: object properties: format: type: string
ZIP JSON PDF
POST /privacy/erase
POST /privacy/rectify
POST /privacy/restrict-processing
GET /privacy/processing-register
Risk: type: object properties: id: type: string title: type: string probability: type: integer impact: type: integer score: type: integer level: $ref: '#/components/schemas/RiskLevel'
RiskLevel: type: string enum: - LOW - MEDIUM - HIGH - CRITICAL
GET /risk-management/risks
POST /risk-management/risks
GET /risk-management/risks/{id}
PATCH /risk-management/risks/{id}
DELETE /risk-management/risks/{id}
POST /risk-management/risks/{id}/evaluate
POST /risk-management/risks/{id}/mitigate
SecurityIncident: type: object properties: id: type: string title: type: string severity: type: string status: type: string detectedAt: type: string format: date-time
GET /security-incidents
POST /security-incidents
GET /security-incidents/{id}
PATCH /security-incidents/{id}
Detected ↓ Qualified ↓ Investigating ↓ Resolved ↓ Closed
POST /security-incidents/detect
ComplianceAudit: type: object properties: id: type: string auditType: type: string status: type: string executedAt: type: string format: date-time
GDPR ISO27001 SOC2 NIS2 OWASP
GET /compliance-audits
POST /compliance-audits
GET /compliance-audits/{id}
PATCH /compliance-audits/{id}
GET /compliance-audits/{id}/report
DataClassification: type: object properties: id: type: string entityType: type: string classification: $ref: '#/components/schemas/DataSensitivity'
DataSensitivity: type: string enum: - PUBLIC - INTERNAL - CONFIDENTIAL - RESTRICTED
GET /data-classification
POST /data-classification
PATCH /data-classification/{id}
RetentionPolicy: type: object properties: id: type: string entityType: type: string retentionPeriodDays: type: integer archiveEnabled: type: boolean
GET /retention-policies
POST /retention-policies
PATCH /retention-policies/{id}
DELETE /retention-policies/{id}
AuditLogs 3650 jours Contracts 3650 jours Consents 1825 jours Sessions 365 jours Notifications 90 jours
SecurityPolicy: type: object properties: id: type: string code: type: string configuration: type: object
GET /security/policies PUT /security/policies
Password Policy Session Duration MFA Required Allowed Countries API Rate Limits
GET /security/dashboard
MFA Enabled Users Active Sessions Open Risks Security Incidents Compliance Score Audit Success Rate
GET /security/monitoring
Impossible Travel Privilege Escalation Mass Export Brute Force Suspicious Login
security.read security.manage security.audit
compliance.read compliance.manage compliance.audit
privacy.read privacy.export privacy.erase
Cette phase ajoute :
≈ 94 endpoints ≈ 35 schémas ≈ 11 tags Swagger
Après Phase 3-A.11 :
≈ 771 endpoints ≈ 270 schémas ≈ 88 tags
Finaliser le contrat API Enterprise 4.0.
Cette phase couvre :
Sprint 15 Multi-sites & Réseau Sprint 20 Internationalisation Release Enterprise 4.0
Elle permet :
Multi-langues Multi-devises Multi-fuseaux horaires Multi-régions Multi-sites Marque blanche Réseaux d'agences Licences Enterprise
tags: - name: Countries - name: Currencies - name: Languages - name: Timezones - name: CurrencyRates - name: Translations - name: Regions - name: Sites - name: WhiteLabel - name: EnterpriseLicenses
Country: type: object properties: id: type: string format: uuid isoCode: type: string name: type: string currencyCode: type: string languageCode: type: string timezone: type: string
GET /countries
GET /countries/{id}
Currency: type: object properties: code: type: string name: type: string symbol: type: string decimals: type: integer
GET /currencies
GET /currencies/{code}
EUR USD GBP CHF CAD AED
CurrencyRate: type: object properties: id: type: string baseCurrency: type: string targetCurrency: type: string exchangeRate: type: number effectiveDate: type: string format: date
GET /currency-rates POST /currency-rates/synchronize
POST /currencies/convert
CurrencyConversionRequest: type: object properties: amount: type: number sourceCurrency: type: string targetCurrency: type: string
Language: type: object properties: code: type: string name: type: string locale: type: string active: type: boolean
GET /languages
GET /languages/{code}
PATCH /languages/{code}
fr-FR en-US en-GB es-ES it-IT de-DE nl-NL
Timezone: type: object properties: code: type: string offset: type: string label: type: string
GET /timezones
GET /timezones/{code}
Translation: type: object properties: id: type: string locale: type: string namespace: type: string translationKey: type: string translationValue: type: string
GET /translations
POST /translations
PATCH /translations/{id}
DELETE /translations/{id}
POST /translations/import
GET /translations/export
Region: type: object properties: id: type: string code: type: string name: type: string defaultCurrency: type: string defaultLanguage: type: string
GET /regions
POST /regions
GET /regions/{id}
PATCH /regions/{id}
DELETE /regions/{id}
EUROPE NORTH_AMERICA MIDDLE_EAST ASIA_PACIFIC
Site: type: object properties: id: type: string code: type: string name: type: string domain: type: string active: type: boolean defaultLanguage: type: string
GET /sites
POST /sites
GET /sites/{id}
PATCH /sites/{id}
DELETE /sites/{id}
POST /sites/{id}/domains
DELETE /sites/{id}/domains/{domainId}
WhiteLabelConfiguration: type: object properties: id: type: string logoUrl: type: string faviconUrl: type: string primaryColor: type: string secondaryColor: type: string
GET /white-label PUT /white-label
Theme Logo Emails Domaines SEO
GET /agency-network POST /agency-network/join POST /agency-network/share-property
Réservations inter-agences Catalogue mutualisé Reporting mutualisé
EnterpriseLicense: type: object properties: id: type: string licenseKey: type: string licenseType: type: string validUntil: type: string format: date maxUsers: type: integer maxProperties: type: integer
GET /enterprise-licenses
POST /enterprise-licenses
GET /enterprise-licenses/{id}
PATCH /enterprise-licenses/{id}
POST /enterprise-licenses/validate
GET /regions/deployments
EU-West US-East US-West Middle-East Asia-Pacific
GET /localization/settings
LocalizationSettings: type: object properties: defaultLanguage: type: string defaultCurrency: type: string defaultTimezone: type: string
GET /enterprise/dashboard
Sites actifs Pays actifs Langues actives Régions actives Licences Agences connectées
i18n.read i18n.manage
sites.read sites.manage
enterprise.read enterprise.manage enterprise.license
Cette phase ajoute :
≈ 88 endpoints ≈ 28 schémas ≈ 10 tags Swagger
Après Phase 3-A.12 :
≈ 859 endpoints ≈ 298 schémas ≈ 98 tags Swagger ≈ 110 domaines métier ≈ 1 contrat API Enterprise complet
Le contrat fonctionnel couvre désormais :
✓ Auth ✓ Users ✓ RBAC ✓ Owners ✓ Properties ✓ Customers ✓ Reservations ✓ Contracts ✓ Signatures ✓ Payments ✓ Invoices ✓ CRM ✓ Messaging ✓ Marketing ✓ Automation ✓ AI ✓ Knowledge Base ✓ Governance ✓ Administration ✓ OTA ✓ Channel Manager ✓ Revenue Management ✓ Analytics ✓ Security ✓ Compliance ✓ Internationalisation ✓ Multi-sites ✓ Enterprise
Le travail de conception est désormais terminé.
Le prochain livrable devrait être :
Génération du code exécutable
4-A Prisma Schema final consolidé 4-B DTO NestJS générés 4-C SDK TypeScript généré 4-D Structure NestJS complète 4-E Structure NextJS complète 4-F Docker Compose 4-G GitHub Actions 4-H Helm Charts 4-I Terraform Infrastructure 4-J Monorepo final
À partir de ce point, on quitte la phase d'architecture pour entrer dans la phase d'industrialisation et de génération automatique du code source.