Mancha (Reservations)
Universal reservations & scheduling. Restaurants, clinics, donation centers, vet visits — one booking primitive with domain-flexible terminology.
URL: mancha.redbroomsoftware.comStatus: LIVE Tier: T2 (narrow surface)
What you can integrate
- Availability queries — open time slots for a venue on a date, sized to a party
- Reservation create / lookup / cancel — the full booking primitive
- Multi-domain reuse — restaurants, blood donation (Continua), vet clinics (Cosmos Pet) all use the same API with terminology that maps to their vertical
- Metering hooks — per-reservation events flow into Constanza for billing
Authentication
http
Authorization: Bearer <api_key>
Content-Type: application/jsonAPI keys are scoped per partner app. For B2C consumer flows (Continua blood-donor portal, Cosmos Pet scheduler), use the ecosystem partner key issued to the host app — Mancha does not expose a direct consumer OAuth surface.
Endpoints
| Method | Path |
|---|---|
| POST | /api/ai/demand-forecast |
| POST | /api/ai/no-show-risk |
| POST | /api/ai/pricing |
| GET | /api/analytics |
| GET | /api/availability/:restaurantId |
| GET | /api/billing |
| POST | /api/ecosystem/bookings |
| GET, PATCH | /api/ecosystem/bookings/:id |
| POST | /api/ecosystem/upsell-track |
| GET, POST | /api/ecosystem/webhooks |
49 total — 14 admin/cron/internal (hidden) — +25 more primary endpoints not shown. Source: src/routes/api/**/+server.{ts,js} in the mancha/apps/web repo.
Events emitted
| Event | Receivers | Description |
|---|---|---|
ai.usage | colectiva | AI token usage report for metering |
app.tenant_id_assigned | (none declared) | An app has bound its local tenant identifier to a canonical RBS org for the first time (or backfilled an existing binding). NOT routed via the standard webhook bus — producer calls CPR POST /api/v1/internal/tenant-mapping/upsert directly with X-RBS-Auth: App HMAC. Receiver list is empty because no app-side handler exists; the consumer is the Control Plane (ecosystem.redbroomsoftware.com). Topic 25 Phase 3 substrate — populates app_tenant_mappings junction. Senders list will grow as each app's producer wires (caracol first per S381 Phase 1 Session 3). |
customer.identified | camino | A customer was identified during a transaction in Mancha (restaurant POS) — Camino creates or updates the CRM contact record with the transaction context for relationship tracking. |
order.completed | colectiva, constanza | An e-commerce order has been completed (paid + fulfilled) |
reservation.arrived | caracol, hoja | A reservation party arrived at the restaurant — Caracol POS updates the table status from waiting to arrived, La Hoja POS mirrors the reservation timeline. |
reservation.cancelled | caracol | A reservation was cancelled in Mancha — Caracol POS removes from the waitlist/queue and releases the table. |
reservation.completed | caracol, colectiva, hoja | A restaurant reservation was completed (the party finished dining) — Colectiva records for revenue analytics, Caracol POS releases the table, La Hoja POS mirrors the timeline. |
reservation.created | caracol, colectiva, hoja | A restaurant reservation has been created |
reservation.seated | caracol, hoja | A reservation party was seated at the restaurant — Caracol POS starts the table timer, La Hoja POS mirrors the seating event. |
reservation.updated | caracol, hoja | Reservation details changed in Mancha (time/party size/contact) — Caracol POS and La Hoja POS update their mirrors. |
schedule.cancelled | rito | A deal scheduling appointment was cancelled in Mancha — Rito removes or marks the schedule record as cancelled. |
schedule.completed | rito | A deal scheduling appointment was completed in Mancha — Rito marks the schedule as completed and may trigger next-step actions in the deal pipeline. |
schedule.created | rito | A new deal scheduling appointment was created in Mancha — Rito registers it on the deal record for pipeline tracking. |
schedule.updated | rito | A deal scheduling appointment was updated in Mancha — Rito syncs the changed time or attendee details. |
Events consumed
| Event | Senders | Description |
|---|---|---|
cfdi.cancelled | constanza | A CFDI invoice has been cancelled |
cfdi.stamped | constanza | A CFDI invoice has been stamped by the SAT via Constanza — receiver apps attach the UUID to their local invoice record and update status. |
employee.missing_data | constanza | Constanza detected an employee with missing fiscal data (RFC/CURP/etc.) — routed back to the source app that created the employee so the missing fields can be completed. |
invoice.compliance_issue | constanza | Constanza detected an invoice compliance issue (missing/invalid RFC, duplicate, format error) — routed back to the source app for review. |
payment.chargeback_resolved | colectiva | A MercadoPago chargeback reached a terminal state. Colectiva emits this when verdict.terminal && outcome ∈ {lost, won, coverage}. Constanza uses it to post a counter-póliza and (on lost + originalCfdiUuid present) cancel the original CFDI. Canonical contract is whatever colectiva/src/lib/services/ecosystem-webhook.service.js notifyPaymentChargebackResolved emits. |
payment.completed | colectiva | A payment transaction was fully completed in Colectiva — source apps confirm the payment for delivery orders, subscriptions, or escrow. Used by baul to confirm delivery payment, mancha for reservation payment, constanza for accounting, and cosmos-pet for vet clinic subscription payments. |
payment.expired | colectiva | A pending payment expired without being completed — Colectiva notifies the originating app to cancel the pending reservation or order. cosmos-pet uses it to mark vet-clinic subscription payments as expired. |
payment.failed | colectiva | A payment attempt failed in Colectiva — notifies source apps (baul, mancha) to surface the failure to the user and offer retry. |
payment.refunded | colectiva, comal | A payment was refunded by Colectiva — voluntary refund initiated by a tenant app or by Colectiva ops, OR an involuntary MP-platform-side refund. Receivers branch on paymentReferenceType. For voluntary refunds with proration, isPartial=true and proration block carries period bounds. paymentLayer is the primary routing discriminator; receivers MUST check it before paymentReferenceType. |
payment.status_changed | colectiva | [auto-derived] payment.status_changed event |
subscription.activated | camino, colectiva | A subscription plan has been activated for a tenant — all apps that gate features behind the subscription tier update their local tier state. |
subscription.cancelled | camino, colectiva | A subscription has been cancelled — all apps that gate features behind the subscription tier update their local tier state to free/cancelled. |
subscription.renewed | camino, colectiva | A subscription was successfully renewed for a new billing period — receiver apps update the subscription period end date and resume any paused features. |
Webhook signature
Standard ecosystem HMAC-SHA256 over the raw body with a 5-minute timestamp window. See Webhooks.
Domain mapping
| Mancha term | Restaurant | Blood donation | Vet clinic |
|---|---|---|---|
| Restaurant | Restaurant | Donation center | Clinic |
| Table | Table | Donation station | Exam room |
| Shift | Service window | Operating hours | Clinic hours |
| Party size | Guests | Always 1 | Pets + owner |
| Reservation | Booking | Appointment | Appointment |
Gotchas
- The resource is always called
restaurantIdon the wire, regardless of vertical — don't rename it in your adapter layer; keep the ecosystem vocabulary aligned with the SDK types. - Cancellations emit
booking.cancelledwith the reason field; don't confuse "no-show" (venue side) with "cancel" (consumer side) — they are different events in flight, even if both hit the same endpoint.