A manifest (also called a close-out, end-of-day, SCAN form, bordereau, or order summary) tells a carrier which labels to expect at a handover. For some carriers it is mandatory, and their parcels are not accepted, or not billed correctly, without one: USPS SCAN forms, Canada Post transmit, Australia Post orders, DHL Parcel DE, and most postal operators. Others close the day implicitly, or have no concept of it at all. Integrations break on end of day in predictable ways, and this chapter is built around them: Check GET /v1/carriers/{id} → manifest for a carrier’s behavior (§8).

1. The manifest object

2. Preview the day

A preview is free, side-effect-free, and makes no carrier call. It returns what 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 400 with details[] per shipment, and nothing is submitted.
  • An empty selection returns 400 invalid_request_error / manifest_empty.
  • The response is 200 with a manifest, 202 if it is pending, or a list of manifests when split: auto produced several.
  • A manifest is irreversible through the API. Implementers whose carrier supports reopening MAY expose POST /v1/manifests/{id}/cancel under capability manifests.cancel.
This flowchart shows how the implementer turns a create request into zero, one, or several manifests.

4. Scope and close groups

Carriers disagree about what a manifest closes. The carrier catalog states it as manifest.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 pending within the carrier’s published processing time. Manifests still pending after 24 hours move to failed with code: "carrier_timeout", and their shipments are released.
  • When documents arrive after the status changes (Asendia document locations, for example), documents fill in later, and manifest.updated fires.

6. Effect on shipments

  • An included shipment’s handover.manifest field is set, and its status becomes manifested on submitted.
  • POST /v1/shipments/{id}/void on a shipment in a pending manifest returns 409 state_error / manifest_in_progress. On a manifested shipment it returns 409 state_error / already_manifested, unless the carrier declares manifest.void_after: true.
  • Shipments purchased after a close_all for 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 a ship_date_rolled message is added.

7. Automatic end of day

7.1 Scheduled auto-close (run by the implementer)

Configured per connection in connection.config.end_of_day (chapter 09 §2):
At 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

If remind_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 a manifest 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:
Capabilities (chapter 11): 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’s handover). Where the carrier books the pickup within the manifest call, the implementer creates the pickup object from the response.
  • If the connection’s config has manifest_required: true, POST /v1/pickups with shipments that are not manifested returns 409 state_error / manifest_required.
This diagram shows how a manifest, its carrier manifests, its documents, its shipments and its pickup relate.

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.