Skip to content
Developers

The Zulu API.

One documented REST API behind every module — for your team's integrations and your AI agent alike. Token auth, an OpenAPI spec you can ingest whole, and an MCP server and CLI for AI tools.

Base URL
https://dashboard.getzulu.io/api/v1
Auth
Authorization: Bearer zulu_{key}
Rate limit
60 requests / min per key (configurable)
Format
JSON · OpenAPI 3 · MCP · CLI
dashboard.getzulu.io / api / v1
# Base: https://dashboard.getzulu.io/api/v1

# 1 · Create an account (public, no auth) — declare the modules to enable
POST /account/signup
{ "fields": { "email": "you@co.nz", "name_first": "Sam", "company": "Co", "modules": ["opt_client"] } }
→ 201  { "data": { "api_key": "zulu_••••", "username": "co" } }

# 2 · Activate with the 6-digit code emailed to the owner
POST /account/verify
{ "fields": { "email": "you@co.nz", "code": "482913" } }
→ 200  { "data": { "activated": true } }

# 3 · Authenticate and add your first client
POST /client
Authorization: Bearer zulu_••••
{ "company": "Acme Pumps Ltd", "email": "ops@acmepumps.co.nz", "phone": "+64 9 555 0182" }
→ 201  { "data": { "token": "9f2a…", "company": "Acme Pumps Ltd" } }
The API at a glance

Every resource, one map.

A high-level view of what the API does today — generated from the live spec, so it never drifts. Every endpoint needs your API key except signup, verify and status. Want the full request/response detail? It's all in the OpenAPI spec — and your key arrives the moment you sign up. Prefer tools over raw HTTP? The native MCP server (@getzulu/mcp) and CLI (@getzulu/cli) are on npm and cover the full API, reads and writes.

Public

1
  • GET /API Status

Account

3
  • GET /account/modulesList valid module keys (public; richer with a system key)
  • POST /account/signupSign up a new account (public)
  • POST /account/verifyVerify and activate an account (public)

CRM

10
  • GET /clientList clients
  • POST /clientCreate client
  • GET /client/{token}Get single client
  • PUT /client/{token}Update client
  • POST /client/{token}/addressAdd an address to a client
  • PUT /client/{token}/address/{address_token}Update a client address
  • DELETE /client/{token}/address/{address_token}Delete a client address
  • POST /client/{token}/contactAdd a contact to a client
  • PUT /client/{token}/contact/{contact_token}Update a client contact
  • DELETE /client/{token}/contact/{contact_token}Delete a client contact

Files

1
  • POST /fileUpload file

Forms

4
  • GET /formList forms
  • GET /form/{identifier}Get form detail
  • GET /form_submissionList form submissions
  • GET /form_submission/{token}Get submission detail

Inventory

2
  • GET /inventory/stock/{product}Get product stock with location breakdown
  • POST /inventory/stock/adjustmentMake a stock adjustment

Invoices

7
  • GET /invoiceList invoices
  • POST /invoiceCreate invoice
  • GET /invoice/{token}Get invoice detail
  • PUT /invoice/{token}Update invoice
  • POST /invoice/{token}/lineAdd invoice line
  • PUT /invoice/{token}/line/{line_id}Update invoice line
  • DELETE /invoice/{token}/line/{line_id}Delete invoice line

Job Cards

4
  • GET /jobcardList job cards
  • POST /jobcardCreate job card
  • GET /jobcard/{token}Get job card detail
  • PUT /jobcard/{token}Update job card

Notes

3
  • GET /note/{object}/{token}List notes for an entity
  • POST /note/{object}/{token}Create a note
  • PUT /note/{object}/{token}/{note_token}Update a note

Opportunities

5
  • GET /opportunityList opportunities
  • POST /opportunityCreate opportunity
  • GET /opportunity/stageList pipeline stages
  • GET /opportunity/{token}Get opportunity detail
  • POST /opportunity/{token}/stageMove opportunity to another stage

Posts

4
  • GET /post/{type}List posts by type
  • GET /post/{type}/{identifier}Get single post
  • POST /postCreate new post
  • PUT /post/{id}Update existing post

Product Batches

2
  • GET /product-batchList product batches
  • GET /product-batch/{token}Get product batch detail

Products

16
  • GET /productList products
  • POST /productCreate product
  • GET /product/{token}Get single product
  • PUT /product/{token}Update product
  • PUT /product/{token}/priceUpdate product prices
  • PUT /product/{token}/categoryManage product categories
  • PUT /product/{token}/tagManage product tags
  • GET /product/taxonomyGet product taxonomy
  • POST /categoryCreate category
  • GET /category/{token}Get single category
  • PUT /category/{token}Update category
  • PUT /product/{token}/category/{category_token}Add category to product
  • DELETE /product/{token}/category/{category_token}Remove category from product
  • PUT /product/{token}/tag/{tag_option_token}Add tag to product
  • DELETE /product/{token}/tag/{tag_option_token}Remove tag from product
  • POST /product/{token}/imageUpload product image(s)

Purchase Orders

7
  • GET /porderList purchase orders
  • POST /porderCreate purchase order
  • GET /porder/{token}Get purchase order detail
  • PUT /porder/{token}Update purchase order
  • POST /porder/{token}/lineAdd purchase order line
  • PUT /porder/{token}/line/{line_id}Update purchase order line
  • DELETE /porder/{token}/line/{line_id}Delete purchase order line

Sales Orders

2
  • GET /orderList sales orders
  • GET /order/{token}Get sales order detail

Sales Quotes

2
  • GET /sale-quoteList sales quotes
  • GET /sale-quote/{token}Get sales quote detail

Suppliers

10
  • GET /supplierList suppliers
  • POST /supplierCreate supplier
  • GET /supplier/{token}Get single supplier
  • PUT /supplier/{token}Update supplier
  • POST /supplier/{token}/addressAdd an address to a supplier
  • PUT /supplier/{token}/address/{address_token}Update a supplier address
  • DELETE /supplier/{token}/address/{address_token}Delete a supplier address
  • POST /supplier/{token}/contactAdd a contact to a supplier
  • PUT /supplier/{token}/contact/{contact_token}Update a supplier contact
  • DELETE /supplier/{token}/contact/{contact_token}Delete a supplier contact

Tenant

1
  • GET /tenant_infoGet tenant information

Users

1
  • GET /userList team members
Authentication

One bearer token, scoped per user.

Send your key as a bearer token on every request. Keys are scoped per user and revocable — an AI agent receives one from /account/signup, or you can generate one in your Zulu account settings. Calls are limited to 60 per minute per key (configurable, higher allowances on request); requests over the limit return 429.

How an agent signs up
headers
Authorization: Bearer zulu_5f3c…
Content-Type: application/json
MCP server & CLI

The same API, as native tools.

Two official npm packages wrap the API for you. @getzulu/mcp is a local MCP server that exposes the full API — reads and writes — as tools for Claude Desktop, Claude Code and any MCP client: ask about, and manage, your clients, quotes, orders, invoices, stock or forms in plain language. @getzulu/cli puts the same tools in your terminal as getzulu commands that output raw API JSON. Both are generated from the OpenAPI spec, so they grow with the API. Read tools are annotated readOnlyHint and deletes carry destructiveHint, so clients can confirm before changing data — or set ZULU_READONLY=1 to expose read tools only. Both authenticate with your zulu_ token and run locally, so your token never leaves your machine.

View on npm
# Connect Zulu to Claude Code — one line
claude mcp add getzulu -e ZULU_API_TOKEN=zulu_… -- npx -y @getzulu/mcp

# Claude Desktop → Settings → Developer → Edit Config
{ "mcpServers": { "getzulu": {
    "command": "npx", "args": ["-y", "@getzulu/mcp"],
    "env": { "ZULU_API_TOKEN": "zulu_…" } } } }

# Look-but-never-touch agent? Expose read tools only:
#   add "ZULU_READONLY": "1" to env

# Then ask: "What Zulu account am I connected to?"
#       or: "Add a note to Acme's client record."

Build on the Zulu API.

API access is in every plan — no per-agent or per-call pricing. Start free, no credit card.