Check
GET /v1/carriers/{id} → manifest for a carrier’s behavior (§8).
1. The manifest object
2. Preview the day
POST /v1/manifests would submit with the same parameters: one entry in batches[] per manifest that would be created, plus what would be blocked or excluded and why. End-of-day screens are built on this: show the count, fix the blockers, then close.
This sequence shows a full end-of-day close with a carrier that processes manifests asynchronously.
3. Create (close out) a manifest
Eligible shipments are those that are
purchased, belong to connection, have not been voided or void-requested, are not in another pending or submitted manifest, and match ship_date, address and group.
Rules:
- With an explicit list, every shipment must be eligible. Otherwise the call returns
400withdetails[]per shipment, and nothing is submitted. - An empty selection returns
400 invalid_request_error/manifest_empty. - The response is
200with amanifest,202if it ispending, or alistof manifests whensplit: autoproduced several. - A manifest is irreversible through the API. Implementers whose carrier supports reopening MAY expose
POST /v1/manifests/{id}/cancelunder capabilitymanifests.cancel.
4. Scope and close groups
Carriers disagree about what a manifest closes. The carrier catalog states it asmanifest.scope, which lists one or more of:
Close groups. Merchants often need to close part of the day: one dock, one wave, one client of a 3PL. A shipment can carry
handover.close_group, a string set at create or purchase that defaults to null. POST /v1/manifests with group closes only that group. For carriers with group scope, the implementer maps handover.close_group onto the carrier’s own grouping at label time, creating carrier groups as needed. That is why the field must be set before purchase for those carriers. Changing it afterwards returns 409 state_error.
5. Asynchronous submission and partial results
This state diagram shows a manifest’s
status, and what each outcome does to its shipments.
- Implementers MUST poll or subscribe to carriers that process asynchronously, and move the manifest out of
pendingwithin the carrier’s published processing time. Manifests stillpendingafter 24 hours move tofailedwithcode: "carrier_timeout", and their shipments are released. - When documents arrive after the status changes (Asendia document locations, for example),
documentsfill in later, andmanifest.updatedfires.
6. Effect on shipments
- An included shipment’s
handover.manifestfield is set, and its status becomesmanifestedonsubmitted. POST /v1/shipments/{id}/voidon a shipment in apendingmanifest returns409 state_error/manifest_in_progress. On amanifestedshipment it returns409 state_error/already_manifested, unless the carrier declaresmanifest.void_after: true.- Shipments purchased after a
close_allfor the same scope and date belong to the next manifest. Implementers MUST NOT silently date them into a closed day. Where the carrier requires it, they are re-dated to the next business day, and aship_date_rolledmessage is added.
7. Automatic end of day
7.1 Scheduled auto-close (run by the implementer)
Configured per connection inconnection.config.end_of_day (chapter 09 §2):
time (in the connection’s time zone), the implementer runs the equivalent of POST /v1/manifests for the day with trigger: "schedule", and emits the usual events. If there is nothing to close, it does nothing and emits no event.
7.2 Reminders
Ifremind_before_minutes is set, or the carrier’s manifest.required is true, the implementer emits manifest.due that many minutes before time or the carrier cutoff, whichever is earlier, while eligible shipments remain unmanifested. The event’s data.object is a manifest_preview.
7.3 Carrier auto-close (run by the carrier)
Some carriers close open shipments themselves at a cutoff. When the implementer detects this, through a carrier push, a status poll, or the carrier’s daily manifest endpoint, it MUST record amanifest with trigger: "carrier_auto", mark the shipments manifested, and emit manifest.submitted. Otherwise the client still thinks those shipments are open and voidable.
This sequence shows one day on a connection with the end_of_day config from §7.1 (time: "17:30", remind_before_minutes: 60). Each step runs only if its condition holds.
8. Carrier manifest descriptor
GET /v1/carriers/{id} includes:
manifests, manifests.close_all, manifests.async, manifests.reprint, manifests.cancel, manifests.carrier_auto_close.
9. Manifests and pickups
The handover is one physical event, but many carriers expose it as two APIs. Some, like Canada Post, take a pickup flag on the transmit call itself.pickup: { book: true, window, contact }on create books the pickup after a successful submit and links both ways (manifest.pickup,pickup.manifest, and each shipment’shandover). Where the carrier books the pickup within the manifest call, the implementer creates thepickupobject from the response.- If the connection’s config has
manifest_required: true,POST /v1/pickupswith shipments that are not manifested returns409 state_error/manifest_required.
10. Retrieve, list, update, reprint
reprint re-fetches documents from the carrier (capability manifests.reprint, for example FedEx Ground’s close-report reprint by date), or re-renders a stored copy. It never resubmits.
Expandable: shipments, connection, pickup.
11. Events
manifest.created, manifest.updated, manifest.submitted, manifest.partially_submitted, manifest.failed, manifest.due. Each manifested shipment also emits shipment.manifested.