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
# 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" } }
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
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 upAuthorization: Bearer zulu_5f3c… Content-Type: application/json
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."
# Install + authenticate once npm install -g @getzulu/cli getzulu setup # prompts for your API token # Read — raw JSON out, pipes into jq getzulu tenant info getzulu client list --limit 5 --search acme getzulu client list --limit 50 | jq '.data.clients[].company' # Write — flags for simple fields, JSON for nested data getzulu note create --object client --token <client-token> --title "Called re: quote" getzulu invoice line_add --token <invoice-token> --product <product-token> --quantity 2 getzulu list # every command — writes marked ✎
Build on the Zulu API.
API access is in every plan — no per-agent or per-call pricing. Start free, no credit card.