SalesPro Hub exposes a versioned REST API for server-to-server integrations with ERP, accounting, CRM, warehouse and automation systems. The public integration surface covers submitted orders, inventory, customer identities and Zapier REST-hook subscriptions.
The mobile application's private synchronisation API is not part of this public contract.
Base URL
https://portal.salesrepsoftware.co.za/api/v1All requests use HTTPS and JSON. Send an Accept: application/json header.
Requests with a body must also send Content-Type: application/json.
Authentication
Use a scoped API key in either header:
X-API-Key: sk_your_api_keyAuthorization: Bearer sk_your_api_keyKeys are tenant-scoped, revocable and shown only once when created. See API authentication for permission and rotation guidance.
Orders
| Method | Endpoint | Scope | Purpose |
|---|---|---|---|
GET | /orders | orders:read | List submitted orders with filters and incremental cursors |
GET | /orders/{orderNumber} | orders:read | Retrieve one order and its line items |
POST | /orders/{orderNumber}/acknowledge | orders:write | Store the receiving system's reference idempotently |
PUT | /orders/{orderNumber}/status | orders:write | Return a valid fulfilment status |
Drafts are not exposed. The recommended hand-off is:
poll unacknowledged orders → create in ERP → acknowledge → return statusSee the Sales order REST API for filters, payloads, status transitions and retry behaviour.
Inventory
| Method | Endpoint | Scope | Purpose |
|---|---|---|---|
GET | /inventory | inventory:read | List product stock and available quantities |
GET | /inventory/movements | inventory:read | Audit stock movements |
GET | /inventory/{sku} | inventory:read | Retrieve stock for one SKU |
PUT | /inventory/{sku} | inventory:write | Set an absolute quantity with an optional idempotency reference |
POST | /inventory/bulk | inventory:write | Set quantities for up to 500 SKUs |
Choose one owner for physical stock before launch. If an ERP owns on-hand quantity, do not also apply the same delivery deduction in both systems.
See the Inventory sync API for quantity semantics, reservation shortfalls and reconciliation guidance.
CRM Customers
| Method | Endpoint | Scope | Purpose |
|---|---|---|---|
GET | /customers | customers:read | List active records, changes and deletion tombstones |
GET | /customers/{externalSystem}/{externalId} | customers:read | Retrieve a customer by stable source identity |
PUT | /customers/{externalSystem}/{externalId} | customers:write | Idempotently create, update or reactivate a customer |
DELETE | /customers/{externalSystem}/{externalId} | customers:write | Deactivate while retaining the source identity |
The external system and immutable external ID form the integration key. Names and email addresses are not used as merge keys.
See the CRM customer sync API for cursor and conflict policy.
Zapier REST Hooks
| Method | Endpoint | Scope | Purpose |
|---|---|---|---|
POST | /zapier/subscribe | zapier:write | Subscribe a validated Zapier catch-hook URL |
DELETE | /zapier/subscribe/{subscription} | zapier:write | Remove a tenant-owned subscription |
GET | /zapier/subscriptions | zapier:read | List active subscriptions |
GET | /zapier/sample | zapier:read | Fetch sample data for a supported event |
This is a developer REST-hook integration, not a public one-click Zapier marketplace application. See the Zapier integration guide.
Pagination and Incremental Sync
List endpoints use page-based pagination. Order and customer endpoints also return a timestamp-and-ID cursor:
{
"next_cursor": {
"updated_since": "2026-07-23T10:00:00.000000Z",
"updated_since_id": 412
}
}Persist and replay both values. The ID tie-breaker prevents skipped records when multiple rows share the same update timestamp.
Idempotency
- Order acknowledgements can be safely retried with the same external reference.
- Customer upserts use the stable
(external_system, external_id)identity. - Inventory updates accept a reference per SKU. Replaying the same reference and quantity is safe; reusing it for a different quantity returns a conflict.
- Webhook and Zapier deliveries include stable delivery IDs for consumer-side deduplication.
Rate Limits
Every external endpoint is limited to 60 requests per minute per route group. The Professional plan also has a 5,000-request daily tenant quota; Enterprise has no practical daily plan quota.
Successful responses include:
X-RateLimit-Limit: 5000
X-RateLimit-Remaining: 4872A daily-quota response uses HTTP 429 and includes Retry-After. Prefer bulk
inventory updates, incremental cursors and webhooks over high-frequency full
polling.
Errors
The API uses conventional HTTP status codes:
| Status | Meaning |
|---|---|
401 | Missing, invalid, disabled or expired API key |
402 | Organisation subscription is not active |
403 | Inactive organisation, unavailable feature or insufficient scope |
404 | Resource does not exist within the authenticated tenant |
409 | Idempotency reference conflicts with an earlier request |
422 | Request validation or state transition failed |
429 | Per-minute throttle or daily plan quota exceeded |
See Errors and troubleshooting for failure recovery procedures.
OpenAPI Description
The machine-readable OpenAPI 3.1 description is available at:
https://salesrepsoftware.co.za/developers/openapi.jsonTreat the reference documentation and OpenAPI description as the public
integration contract for API version v1.