Servilleta (servilleta.redbroomsoftware.com)
Gig work and services marketplace — clients post tasks, service providers bid and complete them, with AI-assisted matching, escrow-backed payment, and automated invoicing.
URL: https://servilleta.redbroomsoftware.comStatus: LIVE Tier: T2 (vertical SaaS primitive)
T1 apps are indispensable horizontal primitives. T2 apps are vertical SaaS or single-domain primitives — primitive-like in their domain but not universal dependencies.
What you can integrate
- Task completion events — receive
task.completedwhen a provider finishes and the client confirms a gig; triggers Colectiva escrow release and invoicing - Payment status — consume
payment.status_changedfrom Colectiva to reflect escrow state in your UI or notifications - Subscription lifecycle — feature gating for pro-provider tiers follows the full Camino subscription event set
- AI task matching —
/api/tasks/matchreturns ranked providers for a task description using semantic search - Dispute resolution — a dispute endpoint puts a task on hold and suspends escrow release pending review
Authentication
Authorization: Bearer <api_key>
Content-Type: application/jsonUser identity flows through Camino SSO via /auth/rbs. API keys are issued per account. Consumer-facing task browsing is public; bidding and completion require authentication.
Endpoints
| Method | Path |
|---|---|
| GET, POST | /api/ecosystem/upsell |
| GET, POST | /api/ecosystem/webhooks |
| POST | /api/leads |
| GET | /api/logout |
| GET, PATCH | /api/notifications |
| GET, POST | /api/referrals |
| GET, POST | /api/referrals/founding-badge |
| POST | /api/session |
| GET, POST, DELETE | /api/subscription |
| GET, POST | /api/support |
25 total — 5 admin/cron/internal (hidden) — +10 more primary endpoints not shown. Source: src/routes/api/**/+server.{ts,js} in the servilleta repo.
Events emitted
| Event | Receivers | Description |
|---|---|---|
customer.created | camino, constanza, garita | A new customer/contact/third-party record was created — used for CRM sync, fiscal pre-registration, and cross-app contact linking. |
task.completed | colectiva, camino | A gig task has been completed and accepted by the client on Servilleta — triggers payment release from escrow to tasker wallet |
upsell.task_volume | camino | Servilleta free-tier tasker is at or near their active task limit (3 concurrent) or has reached a completed-task volume milestone (10/25/50). Camino surfaces a Pro Tasker upgrade recommendation. |
Events consumed
| Event | Senders | Description |
|---|---|---|
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.held | (none declared) | A payment was placed in escrow hold by Colectiva — Servilleta records the hold so the task status reflects that escrow is secured before work begins. |
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.released | colectiva | An escrow payment was released from hold by Colectiva — Servilleta marks the task payment as released and triggers tasker payout. |
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.payment_failed | camino, colectiva | A subscription payment attempt failed — receiver apps surface a payment-failed banner to the tenant operator and may restrict feature access. |
subscription.pending_cancellation | camino | A subscription cancellation was scheduled for the end of the current billing period — receiver apps surface a notice that the subscription will end soon. |
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.
OpenAPI
Coming in the OpenAPI generator phase — see /reference/openapi.
SDK
See /sdk/ for @r-bsoftware/ecosystem-sdk helpers.
Gotchas
task.completedis the single outbound event. Escrow release, payout, and invoicing all happen downstream in Colectiva and Constanza — wire those event handlers separately if your integration needs the full financial trail.- Task disputes (
/api/tasks/[id]/dispute) suspend thetask.completedevent from firing until the dispute is resolved. If you are building a billing integration, guard against missing completions by listening forpayment.status_changedas a fallback signal. - The cron jobs (
/api/cron/check-subscriptions,/api/cron/expire-tasks) are internal — do not call them directly.