Build powerful integrations with a complete B2B ERP platform. 81 endpoints across 13 modules, from invoicing to AI-powered analytics.
Everything you need to authenticate and make your first API call.
Use WordPress Application Passwords or an API key in the X-SE-ERP-Key header. Keys support read-only or read-write scopes.
All endpoints are under the WordPress REST API namespace. Replace the domain with your KARVO ERP instance URL.
Default: 60 requests per minute per API key (configurable). Monitor usage via response headers.
Full REST API reference organized by module. Click any module to expand.
Full CRUD on invoice records with line items, search, and filtering
Customer management with health scores and linked invoices
Product catalog with enriched metadata, SKU aliases, and categories
4-tier pricing waterfall, rules engine, and B2B negotiations
Shipment lifecycle, tracking, and status progression
Backorder tracking, fulfillment, and customer notifications
Commercial cleaning contract management and service logging
Return and claim management for damaged or incorrect shipments
Aging reports, payment recording, and credit notes
Quebec payroll engine: employees, timesheets, pay runs, CPA-005, and tax slips
Conversational text-to-SQL analytics with persistent conversations
Revenue statistics and demand forecasting
Multi-warehouse stock management and inter-warehouse transfers
Subscribe to events with HMAC-SHA256 signature verification
Safety Data Sheets and hazardous material classification
Tenant provisioning, isolation, and usage metering
Health checks, versioning, and connectivity tests
Get started in seconds with your preferred language.
# List invoices for a customer curl "https://app.karvoerp.com/wp-json/se-erp/v2/invoices?customer_code=ACME01" \ -H "X-SE-ERP-Key: se_your_api_key_here" # Create a new invoice with line items curl -X POST "https://app.karvoerp.com/wp-json/se-erp/v2/invoices" \ -H "X-SE-ERP-Key: se_your_api_key_here" \ -H "Content-Type: application/json" \ -d '{ "invoice_no": "INV-2026-0042", "customer_code": "ACME01", "customer_name": "Acme Distribution Inc.", "subtotal": 1250.00, "tps": 62.50, "tvq": 124.69, "total": 1437.19, "lines": [ {"sku": "CLN-5000", "description": "Cleaner 5L", "qty": 50, "unit_price": 25.00, "line_total": 1250.00} ] }' # Advance a shipment to the next status curl -X POST "https://app.karvoerp.com/wp-json/se-erp/v2/shipments/1234/advance" \ -H "X-SE-ERP-Key: se_your_api_key_here"
import requests BASE = "https://app.karvoerp.com/wp-json/se-erp/v2" HEADERS = {"X-SE-ERP-Key": "se_your_api_key_here"} # List recent invoices for a customer resp = requests.get( f"{BASE}/invoices", headers=HEADERS, params={"customer_code": "ACME01", "per_page": 10} ) data = resp.json() print(f"Found {data['total']} invoices") # Get pricing for a SKU with customer-specific waterfall price = requests.get( f"{BASE}/pricing/CLN-5000", headers=HEADERS, params={"customer_code": "ACME01"} ).json() print(f"Price: ${price['price']} (source: {price['source']})") # AI Chat: ask a business question in natural language ai = requests.post( f"{BASE}/ai/conversations/1/message", headers={**HEADERS, "Content-Type": "application/json"}, json={"message": "Top 5 customers by revenue this quarter"} ).json() print(ai["answer"])
const BASE = "https://app.karvoerp.com/wp-json/se-erp/v2"; const API_KEY = "se_your_api_key_here"; const karvo = async (path, opts = {}) => { const res = await fetch(`${BASE}${path}`, { ...opts, headers: { "X-SE-ERP-Key": API_KEY, "Content-Type": "application/json", ...opts.headers, }, }); return res.json(); }; // List invoices const invoices = await karvo("/invoices?customer_code=ACME01"); console.log(`Found ${invoices.total} invoices`); // Create a shipment const shipment = await karvo("/shipments", { method: "POST", body: JSON.stringify({ invoice_no: "INV-2026-0042", customer_code: "ACME01", method: "delivery_run", }), }); console.log(`Shipment #${shipment.id} created`); // Check revenue analytics const revenue = await karvo("/analytics/revenue?months=6"); console.log(revenue);
All responses are JSON. Paginated endpoints return a standard envelope.
| Field | Type | Description |
|---|---|---|
| data | array | Array of resource objects |
| total | integer | Total matching records |
| page | integer | Current page number |
| per_page | integer | Items per page (default 25, max 100) |
| total_pages | integer | Total pages available |
| Status | Meaning | Description |
|---|---|---|
| 200 | OK | Request succeeded |
| 201 | Created | Resource created successfully |
| 401 | Unauthorized | Invalid or missing API key |
| 403 | Forbidden | Insufficient scope or resource access denied |
| 404 | Not Found | Resource does not exist |
| 422 | Unprocessable | Validation error (missing or invalid fields) |
| 429 | Too Many | Rate limit exceeded, retry after reset |