Create a Shipping Label

ShipEngine allows users to manage almost every facet possible for shipping. In this example, we'll show you how easy it is to generate a label

Step 1: Get Your Request Ready

For our example, we're going to request a label using USPS with the builtin provider that's included in your account (for free).

POST /v1/labels

At a minimum, you need four pieces of information to create a shipping label.

  1. A carrier service code (e.g. usps_priority_mail).
  2. Any address that you're shipping from
  3. Any address that you're shipping to
  4. The weight of the package you're sending

Open up a terminal window and use cURL and get a label:

POST /v1/labels HTTP/1.1
Content-Type: application/json

  "shipment": {
    "service_code": "usps_priority_mail",
    "ship_to": {
      "name": "Amanda Miller",
      "phone": "555-555-5555",
      "address_line1": "525 S Winchester Blvd",
      "city_locality": "San Jose",
      "state_province": "CA",
      "postal_code": "95128",
      "country_code": "US",
      "address_residential_indicator": "yes"
    "ship_from": {
      "name": "John Doe",
      "phone": "111-111-1111",
      "company_name": "Example Corp.",
      "address_line1": "4009 Marathon Blvd",
      "address_line2": "Suite 300",
      "city_locality": "Austin",
      "state_province": "TX",
      "postal_code": "78756",
      "country_code": "US",
      "address_residential_indicator": "no"
    "packages": [
        "weight": {
          "value": 20,
          "unit": "ounce"

You'll be greeted with a JSON payload with all sorts of data about your label, including the cost, tracking number, and a link to download the label.


Need a return label?

Return labels can be easily created by setting is_return_label to true. See this page for more details.

  "label_id": "se-202887313",
  "status": "completed",
  "shipment_id": "se-202887313",
  "ship_date": "2019-07-26T05:00:00.000Z",
  "created_at": "2019-07-26T22:10:50.286Z",
  "shipment_cost": {
    "currency": "USD",
    "amount": 6.86
  "insurance_cost": {
    "currency": "USD",
    "amount": 0.0
  "tracking_number": "9405511899560441854156",
  "is_return_label": false,
  "is_international": false,
  "batch_id": "",
  "carrier_id": "se-123890",
  "service_code": "usps_priority_mail",
  "package_code": "package",
  "voided": false,
  "label_format": "pdf",
  "label_layout": "4x6",
  "trackable": false,
  "carrier_code": "stamps_com",
  "tracking_status": "unknown",
  "label_download": {
    "pdf": "",
    "png": "",
    "zpl": "",
    "href": ""
  "form_download": null,
  "insurance_claim": null,
  "packages": [
      "package_code": "package",
      "weight": {
        "value": 1.00,
        "unit": "ounce"
      "dimensions": {
        "unit": "inch",
        "length": 0.0,
        "width": 0.0,
        "height": 0.0
      "insured_value": {
        "currency": "usd",
        "amount": 0.00
      "tracking_number": null,
      "label_messages": {
        "reference1": null,
        "reference2": null,
        "reference3": null

Step 2: Download it!

The label_download object in the response contains URLs to download the label in various formats. See Label Formats & Sizes for more details. For now, we'll just download the label in PDF format, like this:

curl -O -X GET


You can download a label in one step

In the example above, two API requests were necessary: one to create the label, and another to download the .pdf file. You can accomplish both steps in a single request by setting label_download_type: "inline". See Download a Label for more details.