Developers

Lavisho TT API v1

A company-scoped REST API and signed event webhooks for Enterprise workspaces. The machine-readable OpenAPI 3 specification is served at /api/public/v1/openapi.json.

Start 14-day free trial

Authentication

Every request needs a company API key, created under Settings → API & Webhooks. Keys are shown once at creation, stored only as hashes, and can be scoped read-only or read/write, set to expire, and revoked at any time.

curl https://lavishott.cloud/api/public/v1/leads \
  -H "x-api-key: ltt_xxxxxxxx_xxxxxxxxxxxxxxxx"

API access is available on the Enterprise plan. Keys are not user-delegated OAuth tokens; when a company enables strict field-level security, API reads of field-protected objects are disabled until per-user key delegation ships.

Resources

Versioned under /api/public/v1/: leads (alias opportunities), customers, contacts, quotes, products (alias items), tasks, plus read-only lookups for owners, stages, sources, accounts, oems and task-statuses. A public health check lives at /api/public/v1/health.

All resources are scoped to the company that owns the key. Unknown fields are rejected; request bodies are limited to 64 KiB.

Pagination, filtering and ordering

List endpoints accept limit (1–200, default 50), offset, search, order (asc/desc) and resource-specific filters such as stage, assigned_to and lead_id. Responses include a pagination object with limit, offset and total.

GET /api/public/v1/leads?stage=negotiation&limit=50&offset=0&order=desc

Idempotency and writes

POST, PATCH and DELETE accept an Idempotency-Key header (8–128 safe ASCII characters). Retrying with the same key and body returns the original result; the same key with a different body returns 409. Currency defaults to the company base currency.

curl -X POST https://lavishott.cloud/api/public/v1/leads \
  -H "x-api-key: ltt_..." -H "Content-Type: application/json" \
  -H "Idempotency-Key: onboarding-run-2026-10-26-lead-42" \
  -d '{"customer_name":"Padma Trading Co","stage":"new"}'

Errors and rate limits

Errors are JSON {"error": "..."} with status codes: 400 malformed, 401 key problem, 403 scope or plan restriction, 404 not found, 409 duplicate/idempotency conflict, 413 body too large, 422 invalid fields, 429 rate limited, 503 temporarily unavailable.

Each key is limited to 120 requests per UTC minute. Responses carry X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset; when limited, respect Retry-After.

Webhooks

Register endpoints under Settings → API & Webhooks and subscribe to events such as lead.created, lead.updated and lead.stage_changed. Deliveries are signed with HMAC-SHA256 over timestamp.body using your endpoint secret:

// Verify (Node.js)
const expected = createHmac('sha256', secret)
  .update(`${header('x-webhook-timestamp')}.${rawBody}`)
  .digest('hex')
timingSafeEqual(Buffer.from(header('x-webhook-signature')), Buffer.from(expected))

Failed deliveries retry with backoff (1, 5, 15, 60 and 360 minutes, up to 5 attempts) and are visible in the delivery log, where admins can replay a delivery or send a signed test event.

Examples

// JavaScript
const res = await fetch('https://lavishott.cloud/api/public/v1/customers?limit=100', {
  headers: { 'x-api-key': process.env.LTT_API_KEY },
})
const { data, pagination } = await res.json()
# Python
import os, requests
r = requests.get('https://lavishott.cloud/api/public/v1/quotes',
  headers={'x-api-key': os.environ['LTT_API_KEY']}, params={'limit': 100})
r.raise_for_status()
rows = r.json()['data']

Ready to connect your field team to your sales pipeline?

Start your 14-day free trial. No credit card — a real person reviews and activates your workspace, usually within one business day.