Changelog

API changelog

Within v2 every change is additive: pin a revision with the Fleetfully-Version header if you like; every revision gets the current shape.

2026-12-15

Status-file shipments in the shipper API

  • Added: GET /shipper/shipments also lists the shipments your status feeds name for carriers not on the platform, merged newest first with your carriers' orders: `source: "external"`, id `ext_…`, the carrier as the files name it (`carrier.id` is `ext:<key>`), your reference as `trackingNumber`, a status-file `status` (ExternalStatus), the latest ETA as `expectedBy`, plus `lastEventAt` and `lastPlace`. One the files name that is already a linked carrier's order is listed once, as that order.
  • Added: Every shipment carries `source` — `carrier` or `external` (Shipment is now a union on it). GET /shipper/shipments takes `source=carrier|external`, `carrierId=ext:<key>`, and status-file statuses in `status`.
  • Added: GET /shipper/shipments/ext_… answers an ExternalShipmentDetail: the list fields plus the status files' updates, newest first. Once it matched a linked carrier's order, the answer is that order.
  • Added: The `shipment.updated` webhook fires for each new status-file update of an external shipment: `trigger` `status_file.<status>`, `shipment` its ExternalShipmentDetail.
  • Changed: If your integration reads only carriers' orders, pass `source=carrier` (or skip items whose `source` is `external`); webhook receivers can switch on `shipment.source`.

2026-12-08

The shipper API

  • Added: Shipper keys (`ffs_live_…` / `ffs_test_…`, scope `shipper:read`), made in the shipper console → Developers: read-only, a shipper org's shipments across every carrier that accepted its link.
  • Added: GET /shipper/shipments (cursor paging; `carrierId`, `status` — one or several, comma-separated — `createdSince` and `createdBefore`), GET /shipper/shipments/{id} (milestones, arrival window, last scan, exceptions, proof on file) and GET /shipper/me.
  • Added: The `shipment.updated` webhook (ShipmentWebhookPayload) for a shipper's endpoints: one signed POST per status event of a shipment the shipper can see; nothing for a paused or ended link.

2026-12-01

Faster order creation

  • Changed: POST /orders answers as soon as the order is created, with its tracking number. Placing it — address pins, the price and the carrier's auto-dispatch — finishes in the background, usually within a second or two: until then `submission.status` is `processing` (it was `accepted` straight away before), then `accepted`. Follow it with GET /submissions/{id} or GET /orders/{trackingNumber}; the webhooks are unchanged.
  • Changed: If placing can't finish, the order waits for the carrier in its review queue: the submission is `accepted` with an `intake.place_failed` issue saying why.

2026-11-24

Batches

  • Added: POST /batches: up to 5,000 order lines for one customer in one request — JSON `lines`, or a CSV / XLSX `file` (multipart/form-data, at most 25 MB) read with the customer's saved order-feed mapping. Answered 202 at once; the lines become orders in the background. A line that doesn't match goes to the carrier's review queue with its reason; the rest go ahead.
  • Added: GET /batches/{id} (status and counts: accepted, needs review, duplicate, pending) and GET /batches/{id}/lines (each line's outcome, status now, tracking number and reasons; cursor paging, outcome filter).
  • Added: The `batch.completed` webhook event (BatchWebhookPayload): the batch's id, your reference, the customer and its counts.
  • Added: Batch limits: an hourly line budget per key (50,000 live, 1,000 test), at most 10 open batches per key (429 with Retry-After), and a body cap that follows the line cap.
  • Changed: A customer whose batches are announced combined (the default) gets one batch.completed instead of an order.created per order made from a batch; every later order event is still sent per order.

2026-11-17

Collect on delivery

  • Added: POST /orders takes `cod: { amountDueCents, currency? }` — the amount the driver collects at the door.
  • Added: Order carries `cod: { amountDueCents, currency }` (null when there is nothing to collect).

2026-11-12

A sandbox webhook inbox and a Postman collection

  • Added: POST /inbox and GET /inbox (test keys only): a URL on our side to point a sandbox webhook at, and its deliveries with whether each signature verified — see webhooks arrive before you host an endpoint.
  • Added: GET /postman.json: a Postman collection generated from the OpenAPI document.
  • Added: Requests from the developer portal's try-it console (the Fleetfully-Try-It header) are refused unless the key is a test key.

2026-11-01

Public API v2

  • Added: Orders: POST /orders through the carrier's intake checks, GET /orders (cursor paging, updatedSince), GET /orders/{trackingNumber} with /tracking and /history, GET /submissions/{id}.
  • Added: Webhooks: GET / POST /webhooks, DELETE /webhooks/{id}; signed WebhookPayload deliveries with retries.
  • Added: Live and test keys, scopes, the sandbox with simulated drivers, Idempotency-Key on every write, rate-limit headers, and the dated Fleetfully-Version header.