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_accountshipment_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.

cURLRubyPythonPHPNodeJavaC#
Copy
Copied
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": false
        }'
Copy
Copied
manifest = Shippo::Manifest.create(
    :carrier_account => "b741b99f95e841639b54272834bc478c",
    :shipment_date => "2014-05-16T23:59:59Z",
    :transactions => ["64bba01845ef40d29374032599f22588", "c169aa586a844cc49da00d0272b590e1"]
)
Copy
Copied
manifest = shippo.Manifest.create(
    carrier_account = "b741b99f95e841639b54272834bc478c",
    shipment_date = "2014-05-16T23:59:59Z",
    transactions = ["64bba01845ef40d29374032599f22588", "c169aa586a844cc49da00d0272b590e1"]
)
Copy
Copied
$manifest = Shippo_Manifest::create(
    array(
        'carrier_account'=> 'b741b99f95e841639b54272834bc478c',
        'shipment_date'=> '2014-05-16T23:59:59Z',
        'transactions'=> array('64bba01845ef40d29374032599f22588', 'c169aa586a844cc49da00d0272b590e1')
));
Copy
Copied
shippo.manifest.create({
    "carrier_account": "b741b99f95e841639b54272834bc478c",
    "shipment_date": "2014-05-16T23:59:59Z",
    "transactions": [
        "64bba01845ef40d29374032599f22588",
        "c169aa586a844cc49da00d0272b590e1"
    ]
}, function(err, manifest) {
    // asynchronously called
});
Copy
Copied
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);
Copy
Copied
resource.CreateManifest( new Hashtable(){
    { "carrier_account", "b741b99f95e841639b54272834bc478c"},
    { "shipment_date", "2014-05-16T23:59:59Z"},
    { "transactions", new String[] { "64bba01845ef40d29374032599f22588", "c169aa586a844cc49da00d0272b590e1" }},
});

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.

Copy
Copied
"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.

Copy
Copied
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.

Copy
Copied
"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.

Copy
Copied
"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.

Copy
Copied
{
    "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.

  1. Create your manifest
  2. Wait for 3 seconds
  3. Retrieve manifest status
  4. If "status": "SUCCESS" , stop polling. If "status": "QUEUED" wait 10 seconds
  5. Retrieve manifest status
  6. If "status": "SUCCESS" , stop polling. If "status": "QUEUED" wait 30 seconds
  7. Retrieve manifest status
  8. If "status": "SUCCESS" , stop polling. If "status": "QUEUED" wait 1 minute
  9. Retrieve manifest status
  10. If "status": "SUCCESS" , stop polling. If "status": "QUEUED" wait 5 minutes
  11. And so on until "status": "SUCCESS"

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.