Got a project?

Get in touch
All guides

How to connect The Courier Guy API to your store or system

The Courier Guy’s API is Ship Logic: a REST API that returns JSON and authenticates with a bearer token. You can start testing today on a free sandbox account and switch to a production key from The Courier Guy when you go live. A store needs four calls: rates, create a shipment, get the waybill, and track it.

I have built against this API. Everything below comes from The Courier Guy’s own documentation and plugin pages, as they stood on 19 October 2026.

Do you need the API, or is the plugin enough?

On WooCommerce, start with the plugin. The Courier Guy publishes The Courier Guy Shipping for WooCommerce on WordPress.org, with over 4 000 active installs and an update in September 2026. It adds live quotes at checkout as a shipping method and packs each cart into flyer, medium or large parcel sizes. Every order gets “Send to Courier Guy” and “Print Waybill” actions, and locker delivery arrived in December 2025.

It only works if every product has its dimensions and weight filled in, and if your Courier Guy account has credit.

The API is worth building against when:

  • your store or system is not on WooCommerce
  • your own order flow should book shipments and report tracking, with nobody clicking a button in between

How do you get API access?

  1. Register a free sandbox account at tcg-sandbox.shiplogic.com/register and verify your email.
  2. Log in and create a key under Integrations > API Keys.
  3. Send requests to https://api.shiplogic.com while you test. The documentation shows the production host on every example, so swap it for the sandbox one.
  4. To go live, register a production account with The Courier Guy and create a new key for the live environment. Production requests go to https://api.portal.thecourierguy.co.za.

Every request carries the key in a header:

Authorization: Bearer <your API key>

The older AWS-signed keys were deprecated in 2023. If an old integration still sends X-Amz-Date headers and an access key pair, it is due for an update.

Which calls does an integration need?

Call What it does
POST /rates Quote. Needs the collection address, delivery address and parcels in centimetres and kilograms. Returns the service levels your account can use
POST /shipments Book. Each contact needs an email address or a mobile number. Pass the service_level_code or service_level_id from the quote
GET /shipments/label Waybill. Takes the shipment’s id, not the provider_shipment_id, and returns a link to a PDF that expires after 24 hours
GET /tracking/shipments Track. Takes a tracking_reference and returns the status and every tracking event
POST /shipments/cancel Cancel. All charges are reversed if the parcel has not been collected yet
GET /pickup-points Find lockers. Lockers, counters and other points near a lat and lng, closest first with order_closest=true

A rate request against the sandbox looks like this:

curl -X POST https://api.shiplogic.com/rates \
  -H "Authorization: Bearer $SHIPLOGIC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "collection_address": {
      "type": "business",
      "company": "Your Store",
      "street_address": "1 Example Street",
      "local_area": "Hatfield",
      "city": "Pretoria",
      "zone": "Gauteng",
      "country": "ZA",
      "code": "0083"
    },
    "delivery_address": {
      "type": "residential",
      "street_address": "2 Example Road",
      "local_area": "Gardens",
      "city": "Cape Town",
      "zone": "Western Cape",
      "country": "ZA",
      "code": "8001"
    },
    "parcels": [
      {
        "submitted_length_cm": 30,
        "submitted_width_cm": 20,
        "submitted_height_cm": 10,
        "submitted_weight_kg": 2
      }
    ]
  }'

Can it tell you when a parcel moves?

Yes. Account owners set up webhooks under Settings > Webhook subscriptions, for tracking events, shipment notes, parcel dimension changes and shipment address changes. That is a better way to keep an order’s status current than calling the tracking endpoint on a timer, which the documentation asks you to use only when needed.

The documentation does not describe signed webhooks. Treat an incoming event as a hint: match its tracking reference to a shipment you created, and fetch that shipment from the API before you act on anything that matters, such as emailing a customer that their parcel has arrived.

What trips integrations up?

Quotes expire after five minutes

Book with a stale service_level_id and the API answers “rate has expired”. Quote again just before you create the shipment. The official plugin added exactly that check in 2026.

Addresses need care

Pass lat and lng when you have them, otherwise The Courier Guy geocodes the address as best it can. Set type to residential, business, counter or locker, or it defaults to unknown. A shipment cannot be created without a postal code, and the collection and delivery addresses cannot be the same.

Formats change between request and response

You send "zone": "Gauteng" and "country": "ZA", and webhook payloads come back with "GP" and "South Africa". Normalise both before you compare an address you stored with one you received.

Some errors arrive as plain text

Prefix the path with /v3, as in /v3/shipments, to get every error back as JSON.

The account has to be funded

A prepaid account with a low balance gets “insufficient funds for the account”, and a post-paid one over its limit gets “the credit limit for the account has been reached”.

Lockers have their own rules

A pickup point shipment can carry only one parcel, and cannot have a declared value or opt-in rates such as gift wrapping.

The PDF link expires after 24 hours, so download the file when you book if you need it later.

The rate limit is not published

The API returns 429 Too Many Requests when you pass the limit, but the documentation does not say what the limit is. One more reason to rely on webhooks rather than polling.

Sources

I recheck this page when The Courier Guy changes its API or plugin.

Tell me what’s broken.

A few lines about what you’re trying to build or fix is enough. It lands in my inbox and I reply within the business hour, honestly, including whether I’m the right person. If I’m not, I’ll say so and point you at someone who is.

I reply to every enquiry within one business hour.

Prefer email? support@yourdesign.co.za· (+27) 079 177 1970