Manifests and SCAN forms
A manifest is a single-page document with a barcode that carriers can scan to accept all packages into transit without the need to scan each item individually, speeding up the package acceptance process. Manifests are close-outs of shipping labels of a certain day. Daily manifests are required by some carriers and are meant to be used for proper billing and acceptance of shipments. You can create Manifests with the Shippo SCAN Form and Manifest API.
Create a new manifest
To create a manifest for your shipments, POST to the Manifest endpoint with an array of the Transaction
object IDs you are looking to create the Manifest for, along with your carrier_account
, shipment_date
, and address_from
(required for USPS).
Each transaction in your manifest must share the same address_from
, shipment_date
, and carrier_account
.
NOTE
The date format you use for shipment_date
must be in the format 2014-01-18T00:35:03.463Z (ISO 8601 date). See the create manifest endpoint for an example.
curl https://api.goshippo.com/manifests/
-H "Authorization: ShippoToken shippo_test_831a7a042784f523b95db65444e6e084b636764b"\
-H "Content-Type: application/json"\
-d '{
"carrier_account": "b741b99f95e841639b54272834bc478c",
"shipment_date": "2014-05-16T23:59:59Z",
"address_from": "28828839a2b04e208ac2aa4945fbca9a",
"transactions": [
"64bba01845ef40d29374032599f22588",
"c169aa586a844cc49da00d0272b590e1"
],
"async": true
}'
manifest = shippo_sdk.manifests.create(
components.ManifestCreateRequest(
carrier_account="b741b99f95e841639b54272834bc478c",
address_from="28828839a2b04e208ac2aa4945fbca9a",
shipment_date="2014-05-16T23:59:59Z",
transactions=["64bba01845ef40d29374032599f22588", "c169aa586a844cc49da00d0272b590e1"]
)
)
$manifest = Shippo_Manifest::create(
array(
'carrier_account'=> 'b741b99f95e841639b54272834bc478c',
'shipment_date'=> '2014-05-16T23:59:59Z',
'transactions'=> array('64bba01845ef40d29374032599f22588', 'c169aa586a844cc49da00d0272b590e1')
));
const manifest = await shippo.manifests.create({
carrierAccount: "b741b99f95e841639b54272834bc478c",
addressFrom: "28828839a2b04e208ac2aa4945fbca9a",
shipmentDate: "2014-05-16T23:59:59Z",
transactions: [
"64bba01845ef40d29374032599f22588",
"c169aa586a844cc49da00d0272b590e1"
]
});
HashMap<String, Object> manifestMap = new HashMap<String, Object>();
manifestMap.put("carrier_account", "b741b99f95e841639b54272834bc478c");
manifestMap.put("shipment_date", "2014-05-16T23:59:59Z");
String[] transactionIds = {"64bba01845ef40d29374032599f22588",
"c169aa586a844cc49da00d0272b590e1"};
manifestMap.put("transactions", transactions);
Manifest.create(manifestMap);
Manifest manifest = await sdk.Manifests.CreateAsync(
new ManifestCreateRequest()
{
CarrierAccount = "b741b99f95e841639b54272834bc478c",
AddressFrom = ManifestCreateRequestAddressFrom.CreateStr("28828839a2b04e208ac2aa4945fbca9a"),
ShipmentDate = "2014-05-16T23:59:59Z",
Transactions = new List<string> {
"64bba01845ef40d29374032599f22588",
"c169aa586a844cc49da00d0272b590e1",
},
}
);
note
The manifest endpoint in the Shippo API supports both methods for specifying the address_from
parameter using an object ID or setting the address parameters directly in the call.
curl https://api.goshippo.com/manifests/
-H "Authorization: ShippoToken shippo_test_831a7a042784f523b95db65444e6e084b636764b"\
-H "Content-Type: application/json"\
-d '{
"carrier_account": "b741b99f95e841639b54272834bc478c",
"shipment_date": "2014-05-16T23:59:59Z",
"address_from": {
"name": "Mr Shippo",
"street1": "765 W Adams St",
"street2": "",
"city": "Chicago",
"state": "IL",
"zip": "60661",
"country": "US",
"phone": "123454656677",
"email": "mrshippo@shippo.com"
},
"transactions": [
"64bba01845ef40d29374032599f22588",
"c169aa586a844cc49da00d0272b590e1"
],
"async": true
}'
Manifesting an asynchronous process. Depending on the number of transactions you have included in your manifest, it may take a couple of minutes to generate a manifest.
While the Shippo API is generating your manifest, the status
attribute in your response will be QUEUED
.
"status": "QUEUED"
You can poll the status of the manifest by retrieving the manifest using the manifest object ID. You can poll the status of the manifest by retrieving the manifest using the manifest object ID. Review the polling logic section for a suggested polling method.
curl https://api.goshippo.com/manifests/0fadebf6f60c4aca95fa01bcc59c79ae \
-H "Authorization: ShippoToken shippo_test_831a7a042784f523b95db65444e6e084b636764b"
If the status
attribute in your response is ERROR
, use our manifest errors list to help you debug your issue.
"status": "ERROR"
If the status
attribute in your response is SUCCESS
, in your response, you will find an array of links to your manifests in the documents
attribute. Depending on how many shipments you've manifested, you may generate multiple files.
"status": "SUCCESS"
Manifests are always generated in PDFs. For the USPS, one manifest (SCAN Form) can contain up to 500 shipment information, so if you've manifested more than 500 shipments you will receive multiple PDFs.
{
"address_from": "28828839a2b04e208ac2aa4945fbca9a",
"carrier_account": "b741b99f95e841639b54272834bc478c",
"documents": [
"https://shippo-delivery.s3.amazonaws.com/0fadebf6f60c4aca95fa01bcc59c79ae.pdf?Signature=tlQU3RECwdHUQJQadwqg5bAzGFQ%3D&Expires=1402803835&AWSAccessKeyId=AKIAJTHP3LLFMYAWALIA"
],
"object_created": "2014-05-16T03:43:52.765Z",
"object_id": "0fadebf6f60c4aca95fa01bcc59c79ae",
"object_owner": "mrhippo@shippo.com",
"object_updated": "2014-05-16T03:43:55.445Z",
"shipment_date": "2014-05-16T23:59:59Z",
"status": "SUCCESS",
"transactions": [
"64bba01845ef40d29374032599f22588",
"c169aa586a844cc49da00d0272b590e1"
]
}
NOTE
You can create more than one manifest for a single location, but you cannot add the same label to more than one manifest.
Manifest polling logic
We recommend adopting a polling logic similar to the following. Depending on your application, you may need to alter the wait times between polling. IN polling requests, we reccomend
- Create your manifest.
- Wait for 3 seconds.
- Retrieve manifest status.
-
If
"status": "SUCCESS"
, stop polling. If"status": "QUEUED"
wait 10 seconds. - Retrieve manifest status.
-
If
"status": "SUCCESS"
, stop polling. If"status": "QUEUED"
wait 30 seconds. - Retrieve manifest status.
-
If
"status": "SUCCESS"
, stop polling. If"status": "QUEUED"
wait 1 minute. - Retrieve manifest status.
-
If
"status": "SUCCESS"
, stop polling. If"status": "QUEUED"
wait 5 minutes. -
And so on until
"status": "SUCCESS"
.
Note
We have verified this polling sequence for a number of carriers including DHL eCommerce. For a best experience, we recommend implementing the entire sequence.
Which carriers require a manifest?
Most carriers, including FedEx, UPS and DHL Express, don't require you to create a manifest. As a certified carrier partner, Shippo automatically manifests packages for you if the carrier supports it. Your labels are pre-scanned and drivers are not required to scan each package individually on pickup.
USPS (optional)
The USPS manifest is also known as "SCAN Form". A SCAN form is a PDF with a single barcode containing information about all your packages, so that the USPS doesn't need to scan each of your packages individually and all tracking codes are updated immediately.
Canada Post (contract customers only)
If you have a Contract Account with Canada Post and are shipping more than 50 shipments a day you need to create a manifests to transmit the shipments for billing.
Customers that ship less than 50 daily can usually skip the manifest requirement, but are encouraged to verify with Canada Post.
Australia Post
All Australia Post customers are required to manifest their shipments on a daily basis.
DHL eCommerce
All DHL eCommerce customers are required to manifest their shipments on a daily basis.
Purolator
Manifest capabilities are available for Purolator. It is not required by Purolator, however encouraged for record-keeping purposes.