SHOPIFY SHIPPING API

Karl's shipping API for ERP and WMS

A REST API on the Enterprise plan: read orders, compare live rates and create labels programmatically, straight from your ERP or WMS. dry_run fully validates an order without buying real postage; the idempotency key prevents duplicate labels on retries.

What Karl's API handles for your system

  1. Dry run before every label (dry_run)

    With dry_run your system fully validates an order (address, package dimensions, customs data) without buying real postage and without creating a label. You catch errors before you commit, instead of voiding faulty labels afterwards.

  2. Idempotency key against duplicate labels

    Every label call carries an idempotency key. If a retry runs after a timeout, you get the same result back: no second label, no second charge. A new key deliberately creates a new label; one key is bound to exactly one order.

  3. Read orders, compare rates, create labels

    Fetch open orders, compare live rates across all connected carriers including the smart-routing recommendation, and create labels programmatically, over REST/JSON with a bearer token. The label is filed in Shopify fulfilment automatically, and tracking goes to the customer.

  4. Shipment status by tracking, documented via openapi.json

    A single call with the tracking number returns a normalised status and the estimated delivery date, ideal for marking orders as “in transit” or “delivered” in your WMS. The full interface is available machine-readable as openapi.json.

What Karl's API can do

API capability Karl
REST/JSON API with bearer-token authentication Yes
dry_run: fully validate an order without buying real postage Yes
Idempotency key: no duplicate label on retries Yes
List orders and read them individually Yes
Compare live rates across all connected carriers: incl. smart-routing recommendation Yes
Volumetric weight shown per rate option Yes
Create labels programmatically: filed in Shopify fulfilment automatically Yes
Silent print via the Print Companion, or print the label PDF (base64) yourself Yes
Shipment status + estimated delivery date by tracking number Yes
Read and set the default package via the API Yes
Machine-readable openapi.json for client generation Yes

The shipping API is an Enterprise feature and requires a Shopify store connected to Karl.

Common questions about Karl's API

What does Karl's API require?

The API is an Enterprise feature and requires a Shopify store connected to Karl. It reads your Shopify orders and writes fulfilment including tracking back. It extends your store, it doesn't replace it. You create the API key in Karl under Settings → API access.

How do I authenticate?

Every request carries the header “Authorization: Bearer <API key>”. The key (karl_live_…) is shown in plain text exactly once when you create it: Karl only stores a hash. The key belongs on your server only, never in the frontend or in public code.

What exactly does dry_run do?

dry_run fully validates an order, including address, package dimensions and required customs data, without buying real postage and without creating a label. That lets your system check the shipment up front and catch errors before any cost is incurred.

How does the idempotency key prevent duplicate labels?

The label endpoint requires an idempotency key per attempt. If you resend the same key after a timeout, you get the result of the first attempt back: no second label, no second charge. A new key deliberately creates a new label; one key is bound to exactly one order.

Can I print programmatically?

Yes. With print: companion Karl adds the label to the print queue and the Print Companion on the shipping PC prints it without a dialog. Without the companion you use print: none and receive the label as a PDF (base64) to print yourself.

Is there a machine-readable interface description?

Yes. The complete API is available as openapi.json, so you can generate clients and types straight from the specification instead of hand-writing them.

Discover more

Start Karl with no monthly fee

Karl is available on the Shopify App Store: Start has no monthly fee, you only pay per label (domestic shipping). Every plan starts with a trial: 14 days free, including label creation. The carrier still bills you directly.

Install from the Shopify App Store →