Authentication
All API requests use an API key as a bearer token. Create one in the app under Developer → API keys. Keys are either read-only or read/write.
curl https://savrsoft.com/api/v1/events \ -H "Authorization: Bearer savr_live_your_key_here"
Base URL: https://savrsoft.com/api/v1 · All responses are JSON. Errors return { "error": "…" } with a 4xx/5xx status.
Endpoints
/v1/meYour organization (id, name, currency).
/v1/eventsList events (most recent first). Returns { "data": [...] }.
/v1/events/{id}One event with its dishes.
/v1/events · requires read/writeCreate an event. Body:
{ "name": "Acme holiday party", "event_date": "2026-12-18",
"guests": 120, "price_per_head": 55, "event_type": "corporate" }
/v1/recipes · GET/v1/recipes/{id}List recipes (with allergens & diet flags), or one recipe with ingredients.
/v1/clients · POST/v1/clientsList or create clients. Create body: { "name": "...", "email": "...", "phone": "...", "company": "..." }
/v1/invoices · GET/v1/invoices/{id}List invoices with computed totals, or one invoice with line items.
Webhooks
Register an endpoint under Developer → Webhooks. We POST a JSON payload when events occur:
{
"id": "evt_abc123",
"type": "event.inquiry",
"created_at": "2026-07-17T18:20:00.000Z",
"data": { "id": 42, "name": "Corporate lunch — Dana Ruiz", ... }
}
Event types
| Type | Fires when |
|---|---|
event.created | An event is created |
event.inquiry | A new online catering request arrives |
invoice.sent | An invoice is marked sent |
invoice.paid | An invoice is marked paid |
proposal.approved | A client approves a proposal |
client.created | A client is created |
Verifying signatures
Each delivery includes an x-savrsoft-signature header: the HMAC-SHA256 of the raw request body, keyed with your webhook signing secret. Compute the same and compare:
// Node.js
const crypto = require('crypto');
const sig = crypto.createHmac('sha256', SIGNING_SECRET)
.update(rawBody).digest('hex');
if (sig !== req.headers['x-savrsoft-signature']) reject();
