DocMake
The PDF DocMake makes from the Bill of Lading template

The first page of the document DocMake makes from the sample values on this page.

Logistics

Bill of Lading

A bill of lading does three jobs on one page. It receipts the cargo the carrier has taken, it evidences the contract of carriage, and in its negotiable form it is the document of title that has to be surrendered before the cargo is released. That third job explains why the count of originals issued is printed on every one of them, and why banks handle the paper so carefully under a documentary credit.

The face follows a fixed grid. Shipper, consignee (or the order wording when the document is negotiable) and notify party fill the top left, the carrier's booking and document numbers the top right, then pre-carriage, vessel and voyage, port of loading, port of discharge and place of delivery. The cargo block repeats per container or per lot with marks and numbers, container and seal, the number and kind of packages, the goods description, gross weight and volume. Freight is marked prepaid or collect, and place of issue, date and number of originals close it out.

Carriers issue on their own stationery, so a template like this earns its keep on the drafts, the house documents and the internal copies that circulate before the carrier's system produces the final. Keeping the cargo rows in a repeating list means a multi-container booking renders in one pass instead of being pasted together by hand.

Blanks to fill

bl_number Bill of lading number
booking_number Booking number
place_of_issue Place of issue
date_of_issue Date of issue
shipper_name Shipper
shipper_address Shipper address
consignee_name Consignee
consignee_address Consignee address
notify_party Notify party
carrier_name Carrier
pre_carriage_by Pre carriage by
vessel_name Vessel
voyage_number Voyage number
place_of_receipt Place of receipt
port_of_loading Port of loading
port_of_discharge Port of discharge
place_of_delivery Place of delivery
total_packages Total packages in words
total_gross_weight Total gross weight
total_volume Total volume
carrier_remarks Carrier remarks
freight_terms Freight and charges
number_of_originals Number of original bills issued
signed_for_carrier_by Signed for the carrier by
cargo[] One per item, so a row is added for every item in the list

The data behind the preview

This is the exact JSON that produced the document above. Change the values, POST them to the API, and you get your version back as DOCX or PDF. Lists grow and shrink with your data; the layout adapts.

  1. 01 Sign up free and duplicate this template into your workspace.
  2. 02 Adjust the wording and branding in the visual editor.
  3. 03 Fill it in the app, share it as a form link, or call the API.
sample-data.json
{
  "bl_number": "DTRA2608114",
  "booking_number": "BK-2026-55841",
  "shipper_name": "Northwind Instruments SRL",
  "shipper_address": "Str. Fabricii 118, 400632 Cluj-Napoca, Romania",
  "consignee_name": "To the order of Bay State Commercial Bank",
  "consignee_address": "120 Federal Street, Boston, MA 02110, United States",
  "notify_party": "Kestrel Analytics Inc., 14 Industrial Way, Wilmington, MA 01887, United States, import desk, +1 781 555 0142",
  "carrier_name": "Danube Line Shipping SA",
  "pre_carriage_by": "Road haulage, Cluj-Napoca to Constanta",
  "vessel_name": "MV Danube Trader",
  "voyage_number": "214E",
  "place_of_receipt": "Cluj-Napoca, Romania",
  "port_of_loading": "Constanta, Romania",
  "port_of_discharge": "New York, NY, United States",
  "place_of_delivery": "Wilmington, MA, United States",
  "cargo": [
    {
      "container_number": "MSCU 481 2263",
      "seal_number": "RO0094771",
      "marks_and_numbers": "KESTREL / CI-2026-0418",
      "packages": "5 cartons on 1 pallet",
      "description_of_goods": "Laboratory conductivity instruments and accessories, freight of all kinds",
      "gross_weight": "51.8 kg",
      "volume": "0.286 cbm"
    },
    {
      "container_number": "MSCU 481 2263",
      "seal_number": "RO0094771",
      "marks_and_numbers": "NWI / SPARES / SP-2026-0092",
      "packages": "2 cartons",
      "description_of_goods": "Spare electrode assemblies, boxed",
      "gross_weight": "11.4 kg",
      "volume": "0.062 cbm"
    }
  ],
  "total_packages": "Seven (7) cartons only",
  "total_gross_weight": "63.2 kg",
  "carrier_remarks": "One carton of spares scuffed on the top corner at the terminal gate. Contents checked by the shipper and found intact.",
  "freight_terms": "Freight prepaid at Constanta",
  "number_of_originals": "Three (3)",
  "place_of_issue": "Constanta, Romania",
  "date_of_issue": "August 19, 2026",
  "signed_for_carrier_by": "Danube Line Shipping SA, as carrier, by Adrian Costache, agent",
  "total_volume": "0.348 cbm"
}

Generate this document via the API

One template plus changing data is the whole point. The list of blanks above is the contract, and every new set of values comes back in the same layout: fill it in the app, hand someone a form link, or POST the JSON and get the file straight back.

The request below carries this page's own values, so it runs as soon as the template exists in your workspace. Swap the values for yours and the response is your document.

make-bill-of-lading.sh
curl -X POST https://app.docmake.io/api/v1/render \
  -H "Authorization: Bearer $DOCMAKE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  --output bill-of-lading.pdf \
  --data-binary @- <<'JSON'
{
  "template_id": "tmpl_your_template_id",
  "format": "pdf",
  "data": {
    "bl_number": "DTRA2608114",
    "booking_number": "BK-2026-55841",
    "shipper_name": "Northwind Instruments SRL",
    "shipper_address": "Str. Fabricii 118, 400632 Cluj-Napoca, Romania",
    "consignee_name": "To the order of Bay State Commercial Bank",
    "consignee_address": "120 Federal Street, Boston, MA 02110, United States",
    "notify_party": "Kestrel Analytics Inc., 14 Industrial Way, Wilmington, MA 01887, United States, import desk, +1 781 555 0142",
    "carrier_name": "Danube Line Shipping SA",
    "pre_carriage_by": "Road haulage, Cluj-Napoca to Constanta",
    "vessel_name": "MV Danube Trader",
    "voyage_number": "214E",
    "place_of_receipt": "Cluj-Napoca, Romania",
    "port_of_loading": "Constanta, Romania",
    "port_of_discharge": "New York, NY, United States",
    "place_of_delivery": "Wilmington, MA, United States",
    "cargo": [
      {
        "container_number": "MSCU 481 2263",
        "seal_number": "RO0094771",
        "marks_and_numbers": "KESTREL / CI-2026-0418",
        "packages": "5 cartons on 1 pallet",
        "description_of_goods": "Laboratory conductivity instruments and accessories, freight of all kinds",
        "gross_weight": "51.8 kg",
        "volume": "0.286 cbm"
      },
      {
        "container_number": "MSCU 481 2263",
        "seal_number": "RO0094771",
        "marks_and_numbers": "NWI / SPARES / SP-2026-0092",
        "packages": "2 cartons",
        "description_of_goods": "Spare electrode assemblies, boxed",
        "gross_weight": "11.4 kg",
        "volume": "0.062 cbm"
      }
    ],
    "total_packages": "Seven (7) cartons only",
    "total_gross_weight": "63.2 kg",
    "carrier_remarks": "One carton of spares scuffed on the top corner at the terminal gate. Contents checked by the shipper and found intact.",
    "freight_terms": "Freight prepaid at Constanta",
    "number_of_originals": "Three (3)",
    "place_of_issue": "Constanta, Romania",
    "date_of_issue": "August 19, 2026",
    "signed_for_carrier_by": "Danube Line Shipping SA, as carrier, by Adrian Costache, agent",
    "total_volume": "0.348 cbm"
  }
}
JSON

tmpl_your_template_id is a stand-in: build this template in the visual editor and copy the id it shows, or create one with POST /api/v1/templates. Keys, formats, strict mode and batches are in the API reference.

Or let an AI assistant do it

The DocMake MCP server lets Claude and other assistants make this document the same way. Install it once:

claude mcp add docmake \
  --env DOCMAKE_API_KEY=dm_your_api_key \
  -- npx -y @docmake/mcp@latest

Then ask for the document in plain words:

Make a PDF from my Bill of Lading template with bill of lading number "DTRA2608114" and booking number "BK-2026-55841".

How the MCP server works →

More logistics templates