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.
- 01 Sign up free and duplicate this template into your workspace.
- 02 Adjust the wording and branding in the visual editor.
- 03 Fill it in the app, share it as a form link, or call the API.
{
"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.
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".
More logistics templates
Certificate of Origin
States where the goods were made, with the packages, their tariff headings and a block for the chamber of commerce to stamp.
View template →CMR Consignment Note
The road haulage note used between countries, with the goods, the instructions, and a box each for sender, carrier and consignee.
View template →Delivery Note
The sheet that travels with the goods: what was ordered against what arrived, and a line for anything short or damaged.
View template →