API Overview
Logistall exposes a small, read-only REST API (/api/v1/*) for integrating shipment, customer, and invoice data into other systems, alongside outbound webhooks for near-real-time shipment status changes. This section documents both, plus the public (unauthenticated) tracking-link endpoint.
If you’re looking for the in-app pages this API is generated from — Shipments, Customers, Invoices, Keys — see the User Guide instead. This section is for developers integrating programmatically.
Base URL
Section titled “Base URL”The API is served from a single production hostname — there is no per-company subdomain. The tenant is identified solely by the API key you present, not by the host you connect to:
https://tenant.logistall.cloud/apiAll endpoints below are relative to this base — for example, GET /v1/shipments means GET https://tenant.logistall.cloud/api/v1/shipments.
Read-only, v1
Section titled “Read-only, v1”The public API is currently read-only: every /v1/* endpoint is a GET. There is no way to create, update, or delete records through this API — all writes happen through the Logistall web app. There is only one version, v1, and no versioning scheme has been established yet beyond that prefix.
Authentication
Section titled “Authentication”Every /v1/* endpoint requires an API key. See Authentication for how to create a key and present it on requests.
Response format
Section titled “Response format”All responses are JSON. Object keys are camelCase, regardless of the underlying database column names (e.g. the database’s shipment_number column is returned as shipmentNumber).
List endpoints return a plain JSON array — there is no wrapper object and no total count.
Pagination
Section titled “Pagination”List endpoints accept two query parameters:
| Parameter | Default | Max | Notes |
|---|---|---|---|
limit |
50 |
200 |
Values above 200 are clamped to 200. Non-numeric or values below 1 fall back to the default. |
offset |
0 |
— | Values below 0 are clamped to 0. |
There is no cursor-based pagination — use offset and re-fetch. Results are ordered newest-first (by creation date) unless otherwise noted on the endpoint.
Errors
Section titled “Errors”Errors are always a JSON object with a single error string:
{ "error": "Invalid API key" }Common status codes:
| Status | Meaning |
|---|---|
401 |
Missing, malformed, or invalid API key. |
404 |
The requested record doesn’t exist (or doesn’t belong to the tenant your key resolves to). |
500 |
An unexpected server or database error. |
Rate limits
Section titled “Rate limits”There is currently no per-key rate limit enforced on /v1/* endpoints. The only rate limiting in the platform today applies to the login/password-reset endpoints used by the web app itself, not to the API-key-authenticated routes documented here. This may change — a rate limit could be introduced on /v1/* in the future — so don’t build an integration that assumes unlimited request volume, but there is no documented number to design against today.
Endpoints at a glance
Section titled “Endpoints at a glance”| Method | Path | Description |
|---|---|---|
GET |
/v1/shipments |
List shipments |
GET |
/v1/shipments/:id |
Get one shipment, with its tracking timeline |
GET |
/v1/customers |
List customers |
GET |
/v1/invoices |
List invoices |
Plus:
- Webhooks — subscribe to
shipment.status_changedevents instead of polling. - Public tracking — the unauthenticated link customers use to check a shipment’s status.