Zeng Book
ProductIndustriesIntegrationsPricingResources
Sign inContact salesTry it free
Introduction
  • Overview
  • Quickstart
API reference
  • Authentication
  • Errors
  • Rate limits
  • Pagination
  • Interactive explorer
Resources
  • Organization
  • Leads
  • Clients
  • Projects
  • Quotations
  • Invoices
Integrations
  • Overview
  • Webhooks
  • Public portal
  • Zapier
  • Make / n8n recipes
  • Xero (coming soon)

Introduction

Quickstart

From a fresh signup to a signed webhook delivery in five steps.

1. Create your organisation

Sign up at zengbook.com/signup and complete the onboarding wizard. You'll choose an org slug that becomes part of every in-app URL (for example, zengbook.com/acme-builders).

2. Upgrade to Growth or higher

The REST API and outbound webhooks are gated to the Growth, Business, and Enterprise plans. Upgrade under Settings → Billing.

API requests from a Free or Starter org return 402 INSUFFICIENT_PLAN.

3. Generate an API key

Open Settings → API keys, give the key a label (such as data warehouse import), and click Create key. The full secret is shown once — copy it now. Stored keys are SHA-256 hashed and cannot be recovered.

Keys are prefixed zb_live_ followed by 22 base-62 characters, e.g. zb_live_4xK2pQ7nR9sT1vW3yZ5aBd.

4. Make your first request

Pass the key in the Authorization header. The simplest sanity check is GET /v1/me — it returns your organisation profile.

terminal
curl https://www.zengbook.com/api/v1/me \
  -H "Authorization: Bearer zb_live_4xK2pQ7nR9sT1vW3yZ5aBd"

You should get back:

200 OK
{
  "org": {
    "id": "org_01HX...",
    "name": "Acme Builders Pte Ltd",
    "slug": "acme-builders",
    "currency": "SGD",
    "gstRate": 0.09,
    "planTier": "growth"
  }
}

Every successful response also returns an X-Request-Id header and X-RateLimit-* headers. See rate limits for details.

5. Register a webhook endpoint

To receive Zeng Book events on your own server, open Settings → Webhooks, paste an HTTPS URL, select the events you care about (for example invoice.paid), and save. Zeng Book POSTs a JSON envelope and signs it with HMAC-SHA256.

A minimal verifier in Node:

verify.ts
import crypto from "node:crypto"

export function verify(rawBody: string, header: string, secret: string) {
  const parts = Object.fromEntries(
    header.split(",").map((p) => p.split("=") as [string, string])
  )
  const expected = crypto
    .createHmac("sha256", secret)
    .update(`${parts.t}.${rawBody}`)
    .digest("hex")
  return crypto.timingSafeEqual(
    Buffer.from(expected, "hex"),
    Buffer.from(parts.v1, "hex"),
  )
}
Use the raw request body
The signature is computed over the exact bytes Zeng Book sent. If your framework re-serialises the JSON before you see it, the signature will not match. Read the body as a string or buffer.

Next

Authentication

Key formats, plan gating, key rotation.

Pagination

Walk large lists with cursors.

Webhook events

Full reference for all 16 event types.

Interactive explorer

Try every endpoint from your browser.