savrsoft

API documentation

A simple REST API to read and write your catering data, plus signed webhooks for real-time events. Create a key under Developer in the app.

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

GET/v1/me

Your organization (id, name, currency).

GET/v1/events

List events (most recent first). Returns { "data": [...] }.

GET/v1/events/{id}

One event with its dishes.

POST/v1/events · requires read/write

Create an event. Body:

{ "name": "Acme holiday party", "event_date": "2026-12-18",
  "guests": 120, "price_per_head": 55, "event_type": "corporate" }
GET/v1/recipes · GET/v1/recipes/{id}

List recipes (with allergens & diet flags), or one recipe with ingredients.

GET/v1/clients · POST/v1/clients

List or create clients. Create body: { "name": "...", "email": "...", "phone": "...", "company": "..." }

GET/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

TypeFires when
event.createdAn event is created
event.inquiryA new online catering request arrives
invoice.sentAn invoice is marked sent
invoice.paidAn invoice is marked paid
proposal.approvedA client approves a proposal
client.createdA 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();
Privacy · Security · Terms · Questions? savrsoft.com · Build catering integrations in minutes.