GoatLabels GoatLabels
Metered access vs flat access.

A ShipEngine alternative with unlimited API calls


The only meter left is postage.

The choice is metering versus flat access. ShipEngine bills API usage and grows around connected carrier accounts. GoatLabels' REST API is free to call without limits, signs its webhooks, and buys labels from the same prepaid wallet as the dashboard — four carriers included, no carrier accounts to connect.

Four carriers on the panel, zero accounts to connect

USPS, UPS, FedEx, and DHL are quoted on every shipment from our own carrier relationships — no applications, credentials, or carrier invoices on your side.

UPSFedExDHLUSPS one call
Three calls to a label Create, rate, buy.
Unlimited calls Quote as often as you like.
Signed webhooks Verify, log, replay.

Labels debit a wallet, not a usage invoice

Card, Apple Pay, Google Pay, ACH, or crypto fund the same prepaid balance behind the API and the dashboard.

VisaMastercardAmerican ExpressApple PayGoogle PayBitcoinEthereumTether (USDT)
One balance API and UI share it.
No usage line Postage is the whole bill.
Adjustments pushed As their own events.

What counts as a billable event on ShipEngine

ShipEngine prices access the way infrastructure vendors do: usage is the product, so usage is what gets metered. The decode that matters before you integrate is which of your calls the meter can see. A production label integration does far more than buy labels — it quotes at checkout, re-quotes when an address is corrected, validates destinations, polls or receives tracking, and retries everything that times out. Under a metered model, each of those behaviours is a line your plan has an opinion about, and the integration you write starts bending around the meter: you cache rates you would rather re-fetch, batch validations you would rather run inline, and think twice about a health check that costs money.

The second axis is carrier access. ShipEngine grows around carrier accounts you connect — your UPS number, your FedEx credentials — which is a genuine strength at contract-holding scale and a week of paperwork below it. Whether bringing your own carrier accounts beats a shared four-carrier panel is a whole argument of its own, and it is owned by the EasyPost comparison and the carrier-accounts page rather than re-run here.

ShipEngine plan structure — verified against ShipEngine's published pricing and docs on 2026-08-15. As of that date, ShipEngine's published plans meter usage with allowances and paid tiers, and define which operations count against them; the tier names, allowance sizes, and per-unit prices are deliberately not printed here because ShipEngine has repackaged its plans before and will again. Read the current definitions on ShipEngine's own pricing page before you model an integration's cost — including what its meter counts, which is the part that moves most. Re-check cadence: every 6 months, by the named review owner recorded with this page.

Unlimited calls, wallet-funded labels: how billing actually works here

The GoatLabels model deletes the meter instead of discounting it. Every API call is free, at any volume, on every plan: create shipments, list rates, validate addresses, read tracking, manage webhooks, and hammer your staging environment without a line item appearing anywhere. The one thing that moves money is a label purchase, and it moves money in the most literal way available — the all-in carrier rate you were quoted is debited from a prepaid wallet, the same wallet the dashboard uses, funded by card, Apple Pay, Google Pay, ACH, or crypto. Your shipping forecast becomes shipments times carrier rate, with no second term for the platform.

That structure changes how you write the integration. Quote-heavy patterns — cart estimates, background re-pricing, a re-quote on every address edit — stop being budget decisions. Retries are safe twice over: free at the request layer, and guarded by real idempotency keys at the purchase layer, so a timed-out buy that runs again returns the original label instead of buying a second one. The wider comparison of metered versus free API surfaces is worked through on the free shipping API page and EasyPost vs a free shipping API; this page's claim is narrower and checkable in an afternoon: nothing you can call at api.goatlabels.io has a price on it except the label.

Webhooks: signatures and the adjustment event

Webhooks are where label APIs quietly differ most, because they are the part you only evaluate after you have integrated. Every GoatLabels delivery is signed: an X-GoatLabels-Signature header carries a timestamp and an HMAC-SHA256 of the payload computed with your endpoint's secret, so your server verifies the sender instead of trusting it. Every delivery attempt — including each retry — writes its own row to a delivery log you can read back over the API, and any delivery can be replayed against your endpoint, which turns the debugging session every webhook consumer eventually has from guesswork into a diff.

The event most generic comparisons never list is shipment.adjustment.created. When a carrier re-rates a shipment after the fact — a re-weigh, a dimension correction — the adjustment is recorded as its own object, exposed at /v1/adjustments, and pushed to you with the wallet delta attached, so your reconciliation job hears about the correction the moment it exists instead of finding it in a month-end statement. One accuracy note belongs next to that: if an adjustment exceeds the wallet balance, the card on file is charged for the difference. How carriers detect, bill, and let you dispute these corrections is its own page; what this page owns is the fact that your code can subscribe to them.

POST /v1/webhooks
{ "url": "https://example.com/hooks/shipping",
  "events": ["shipment.adjustment.created", "shipment.delivered"] }

# each delivery arrives signed:
X-GoatLabels-Signature: t=1755216000,v1=hmac-sha256(secret, "t.body")

# and adjustments are readable as records, not statement lines:
GET /v1/adjustments
{ "object": "list", "data": [ { "shipment_id": "...",
  "reason": "carrier_reweigh", "wallet_delta": "-1.42" } ] }

Dated sample. Shapes match the OpenAPI 3.1 spec served at /docs, checked 2026-08-15 — the spec is the contract; this block is an illustration of it, not a substitute for it.

Where ShipEngine's carrier breadth wins

The honest concession, in full: ShipEngine's carrier catalogue is far wider than four. If your routing guide includes regional parcel carriers, international postal operators, or LTL freight, GoatLabels cannot quote those lanes — USPS, UPS, FedEx, and DHL are the honest and complete list here. And if your company already holds negotiated contracts that beat any shared panel, an API built to drive your own accounts is the right architecture, and paying its meter is rational. Teams at that scale should stay, and this page will not pretend otherwise.

The team this page is for looks different: the big four cover their lanes, no negotiated contracts exist to bring, and the meter is pure friction — a cost on every quote their integration would prefer to make freely. For that team the evaluation is mechanical rather than rhetorical. Point a copy of your rating step at the API, log both responses for a week, and compare two things: the all-in numbers, and the absence of a usage line on this side of the ledger. The account, the key, and every call in that test are free, so the evaluation costs exactly the labels you choose to buy during it.

The order path your integration does not cover

Three calls to a label. Plus a path for the orders that skip them.

A production integration handles the orders that arrive as data. Every shipping operation also has the ones that do not — the support replacement, the DM, the reship a warehouse lead buys from a phone. Both paths end in the same place here: the same shipment objects, the same prepaid wallet, the same signed webhooks. Your code never grows a free-text parser, and your ledger never forks between what the API bought and what a person did.

1
Order in, over the API or beside it
One shipment object either way
support_inbox

customer never got #8421 — reship to the same address today

Shopify
Synced order — the objects your code already reads
TikTok Shop
Synced order — same wallet, same webhooks
What a shipment carries
Rates
Four carriers in one array
Idempotency
A retry returns the original label
Wallet
The debit, not a usage invoice
Adjustments
Their own records and their own event
Paste the order or drop a screenshot

Quoting, re-quoting, validating, and retrying are free at any volume, so the integration can do what the order flow actually needs instead of what a meter makes affordable.

2 Billy AI

The free-text path, handled outside your code.

Billy AI
  • Turns a pasted order, a screenshot, or a spoken address into the same shipment object
  • Validates the destination before any balance moves
  • Lands in the same queue your integration reads over /v1/shipments
  • Included on every plan, so the fallback path is never a billing surprise
Parsed. Validated. Rated.
3
One label, one wallet debit
Bought by your script or by a human
Debited from the prepaid wallet
Card, Apple Pay, Google Pay, or ACH bank transfer
carrier rate
USPS
Label purchased, no usage line
Corrections arrive later as their own events
carrier rate

The forecast is shipments times carrier rate, with no second term for the platform. If a carrier re-rates a parcel afterwards, shipment.adjustment.created pushes the correction with the wallet delta attached rather than burying it in a statement.

The channels you would otherwise write connectors for

Storefronts synced, none of it your code.

Shopify, Etsy, WooCommerce, TikTok Shop, Amazon, eBay and the rest sync orders into the same To Ship queue your integration reads, and tracking pushes back to the channel on print — so the marketplace plumbing most teams end up maintaining is not code you own or debug. Paste an Instagram or Facebook DM and Billy produces the same shipment object; that path is not a second API.

Via AItiles: paste a DM or a screenshot — it becomes the same shipment your code already reads.

Shopify logo Shopify
Etsy logo Etsy
WooCommerce logo WooCommerce
TikTok Shop logo TikTok Shop
Instagram logo Instagram AI Facebook logo Facebook AI
Amazon logo Amazon
eBay logo eBay
Show 15 more Show less
Squarespace logo Squarespace
Wix logo Wix
Walmart logo Walmart
Shopify Plus logo Shopify Plus Soon
Square logo Square
BigCommerce logo BigCommerce
Magento logo Magento
Zapier logo Zapier Soon
NetSuite logo NetSuite Soon
Ecwid logo Ecwid Soon
Temu logo Temu
Shein logo Shein Soon
ChannelAdvisor logo ChannelAdvisor Soon
SkuVault logo SkuVault Soon
Zoho Inventory logo Zoho Inventory Soon
The integration, without the meter

Write the correct integration.
Not the cheapest one.

A metered API teaches you to call it less. An unmetered one lets the code do what the order flow actually needs — quote often, validate everything, retry safely.

One wallet behind
the API and the UI

Labels bought by your integration and labels bought by a human in the dashboard debit the same prepaid balance, funded by card, Apple Pay, Google Pay, ACH, or crypto. Support reprints and warehouse voids never fork your ledger.

Wallet balance
$1,247.36 USD
AI

A fallback for orders
that never hit the API

The DM order, the replacement a support agent ships from a phone — Billy drafts those from a pasted message or screenshot, and they land as the same shipment objects your integration reads. Your code never grows a free-text parser.

Billy LIVE
Where's the package to Maya?
It's in transit via UPS. Expected Friday, Aug 7.
UPS
1Z8923A6B05G4123456
In transit
Austin, TX → Dallas, TX
Ask Billy anything...

No usage line
in the forecast

Shipping cost is shipments times carrier rate — there is no per-call charge, no per-label platform fee, and no tier to outgrow. Pro exists to lower label pricing at volume, which bends the only real cost downward.

Shipment summary
UPS Ground $12.49
Insurance $0.75
Fuel surcharge $0.32
Total $13.56

Four carriers,
one rates array

Every shipment returns USPS, UPS, FedEx, and DHL as live all-in rates in one response — sort it, pick the winner, buy. No carrier accounts to connect, no credentials to rotate, no separate carrier invoices to reconcile afterwards.

Compare rates
UPS UPS $12.48
FedEx FedEx $13.22
DHL DHL $14.10
USPS USPS $11.79
Duties & taxes paid

Webhooks built for
production debugging

HMAC-signed deliveries, a per-attempt delivery log readable over the API, one-call replay, and the shipment.adjustment.created event pushing post-purchase corrections with the wallet delta attached. Polling is optional; verification is not.

POST /v1/shipments
{
"to": { "name": "Maya" },
"from": { "name": "Alex" },
"service": "ups_ground",
"label_format": "pdf"
}
Webhook delivered
GoatLabels mobile shipments queue showing all-in carrier prices
Billy drafting a replacement label from a pasted support message on mobile

Label bought outside the API

Same wallet · same webhook fires

The half your integration cannot reach

The reship someone buys from a phone.

Every API-driven shipping operation still has humans buying labels — a support agent handling a replacement, a warehouse lead reprinting at the bench, a founder on a Sunday. Those labels debit the same prepaid wallet and become the same shipment records, so nothing in your reconciliation ever has to know which of the two bought them.

Paste or snap the order — it becomes the same shipment object /v1/shipments returns.
USPS, UPS, FedEx, and DHL come back as four all-in prices on one screen.
Buying debits the same prepaid balance your API key spends from.
Voids credit straight back to that balance, visible to the same reconciliation job.
One-tap print to a share sheet or a thermal printer over Wi-Fi.
Billy is included, not a paid tier

Ask the shipment record a question out loud.

Not every question about a parcel deserves a query. Ask where a shipment is and Billy reads the latest scan back in plain English, drafts a replacement from a pasted support thread, and quotes four carriers on it — all against the same records your integration writes and reads. Included on every plan, and none of it billed per call. This is the real product, not a render.

goatlabels.io/dashboard/shipments — Billy
Billy reading a shipment's tracking history back over the purchased labels list

Listening

"What happened to shipment 8421?"

Latest event

Adjustment posted · wallet delta recorded

Speaks plain English · reads shipment records back · drafts labels from a pasted thread · included on every plan, never a pricier tier.

One rates array

Four carriers come back in one response.

Under a metered model you learn to cache rates you would rather re-fetch. Here every shipment returns USPS, UPS, FedEx, and DHL as live all-in numbers in a single response you can call as often as your checkout wants — sort the array, pick the winner, buy it. The number you sorted on is the number that debits the wallet.

US → DE 2.6 lbs 12×8×4 in
USPS

USPS

Priority Mail Intl

10–15 days

$7.40

$1.90 of duties and taxes prepaid, inside the same quoted total

all-in · the quoted total is the wallet debit

The one your sort picked
FedEx

FedEx

Intl Connect Plus

3–5 days

$8.90

$2.20 of duties and taxes prepaid, inside the same quoted total

all-in · the quoted total is the wallet debit

DHL

DHL

Express Worldwide

1–2 days

$9.80

$2.50 of duties and taxes prepaid, inside the same quoted total

all-in · the quoted total is the wallet debit

Re-rates arrive as adjustment events, not statement lines Void → credit straight back to the same wallet Multi-currency display
Public API v1

Three calls to a label, none of them billed.

REST and JSON with one Bearer header. Create the shipment, read four carriers from the rates array, buy the winner from the wallet — and let signed webhooks carry tracking and adjustments back instead of polling for them.

Create, rate-shop, and buy — three calls, no SDK required
Unlimited calls on every plan: quotes, validations, and retries are all free
Real idempotency keys — a retried purchase returns the original label
Signed webhooks with a delivery log and replay, including shipment.adjustment.created
Read the API docs Get a free API key $0 per call, on every plan
curl https://api.goatlabels.io/api/v1/shipments
POST /api/v1/shipments
Authorization: Bearer sk_live_…
Idempotency-Key: ord_8421

{
  "to": { "name": "Joyce", "city": "Berlin", "country": "DE" },
  "parcel": { "weight": 2.6, "weight_unit": "lb" },
  "service": "fedex_intl_priority"
}
Pricing a forecast can actually be written from

Unlimited calls on both plans. No usage tier to outgrow.

A metered API turns cost modelling into a guess about which of your calls the meter counts. Here the model has one term: shipments times carrier rate. Free covers 50 shipments a month with unlimited API calls behind it, and Pro is a flat plan that lowers per-label pricing at volume — bending the only real cost downward rather than adding a second one beside it.

Pro

Most popular
$40 / month
Unlimited shipments — the calls were already unlimited
Cheaper label pricing that scales down as your volume grows
Billy AI on Telegram — for the orders that never reach your integration
API access still free and unlimited

Volume pricing

illustrative
less volume more volume

more volume → lower per-label rates

Free

$0 / forever

A free key, unlimited calls, and a staging environment nobody has to budget for.

50 shipments a month, no monthly minimum to print
Unlimited API calls — quotes, validations, tracking reads, and retries
USPS, UPS, FedEx, and DHL in every rates array, no carrier accounts to connect
Signed webhooks with a per-attempt delivery log and one-call replay
Wallet funded by card, Apple Pay, Google Pay, or ACH bank transfer

Billy is not an upsell

The assistant that drafts a shipment from a pasted support thread runs unlimited in the web app on Free, writing the same objects your code reads. Pro adds Billy on Telegram.

Web — every plan Telegram — Pro

API free on every plan

GET /api/v1/shipments

200 OK · plan: free

Unlimited calls on Free — still unlimited on Pro.

We'll beat your current rates

Bring your invoice — on Pro we work with you to beat the rates you're getting from

ShippoPirateShipShipStation
No contracts No per-call charge No per-label platform fee
USPS UPS FedEx DHL

Labels are quoted live from USPS, UPS, FedEx, and DHL as one all-in number and debited from the prepaid wallet at exactly that amount. ShipEngine's plans are ShipEngine's to set and repackage — the dated block above says only that they meter usage, and their pricing page is the source of truth. Full pricing details

Which teams the meter actually taxes

A meter charges most for calling the API properly.

A usage price does not fall evenly across integrations. These are the four shapes where quoting freely is the difference between a correct implementation and a cheap one.

Storefronts quoting rates at checkout

Cart estimates and address edits

Quote-heavy

Cart estimates, a re-quote on every corrected address, background re-pricing — the calls that make a checkout accurate are exactly the ones a meter teaches you to skip. Unlimited calls means the rating step runs whenever the order changes rather than whenever the budget allows.

4 carriers per response unlimited quotes free retries
goatlabels.io/dashboard/shipments
GoatLabels shipments queue showing labels bought by the API and by hand

Teams reconciling post-purchase corrections

Finance, month end, and re-weighs

A re-weigh discovered at month end is a reconciliation problem. The same re-weigh pushed as an event with the wallet delta attached is a row your job already knows how to handle. Adjustments are records here, exposed at /v1/adjustments and delivered as shipment.adjustment.created.

Corrections as first-class objects

Read them over the API, not off a statement

Support and DM orders bought by hand

The orders your integration never sees

the replacement has to go out today
Same wallet, same shipment object, same webhook

Teams who have been burned by a webhook

Where deliveries get debugged

1

signed delivery log per attempt, readable over the API and replayable

ShipEngine alternative, answered

Is the GoatLabels API metered per call or per label?
Neither in software terms. Calls are unlimited on every plan — quoting, re-quoting, address validation, tracking reads, and webhook management are all free at any volume — and a label costs exactly its all-in carrier rate, debited from the prepaid wallet at purchase. There is no per-request charge, no per-label platform fee, and no monthly API tier. The only meter in the system is postage itself.
Do I connect carrier accounts to either API?
On ShipEngine, carrier accounts are the growth path: it ships with some carrier access and expands by connecting accounts you open and manage yourself. On GoatLabels there are no carrier accounts to connect — USPS, UPS, FedEx, and DHL are quoted from our own panel on every shipment. The full trade-off between bringing your own carrier accounts and using a shared panel is argued end to end on the EasyPost carrier-accounts page, and it applies here unchanged.
How do webhook signatures and events differ between the two?
GoatLabels signs every delivery with an HMAC header your server verifies against your endpoint secret, keeps a per-attempt delivery log you can read over the API, and lets you replay any delivery. The event set covers the full shipment lifecycle plus one event most label APIs do not have: shipment.adjustment.created, which pushes post-purchase carrier billing adjustments to you with the wallet delta attached. Check ShipEngine's own docs for its current webhook surface — theirs is the authority on their side.
When is ShipEngine the better fit?
When you need carrier breadth beyond USPS, UPS, FedEx, and DHL — regional parcel carriers, international posts, freight — or when your company already holds negotiated carrier contracts that beat any shared panel and you want an API to drive them. ShipEngine is built around exactly that, and at that scale its metering is a fair price for the breadth. This page is for the team whose carriers are the big four and whose meter reads like a tax on integrating properly.
What happens if an adjustment arrives when my wallet is empty?
The adjustment is still recorded and the event still fires — and if the debit exceeds the wallet balance, the card on file is charged for the difference. That behaviour is stated plainly here because it is in the Terms: a wallet does not make post-shipment corrections impossible, it makes them visible. How carriers detect and bill those corrections, and how to dispute one, is covered on the carrier billing adjustments page.

ShipEngine is a trademark of its owner and is not affiliated with GoatLabels; its current plans and carrier catalogue live on its own site. More for API teams: GoatLabels vs EasyPost, the Shippo API comparison, and what a free shipping API includes.

Customers, in their own words

Teams who went looking for a usage line.

A video took off and I had 80 TikTok Shop orders by morning. I printed every label from my phone on the bus to the post office.
E

Early customer · TikTok

TikTok Shop seller

TikTok Shop
I run my Etsy shop from the kitchen. The AI reads the order, picks the carrier, the label prints. That's the whole workflow now.
E

Early customer · Etsy

Etsy maker

Etsy
The API is what every shipping API pretends to be. Idempotency that actually works.
S

Sasha R.

Staff engineer, marketplace

API user
The evaluation is a week of logs.

Point your rating step here.
Count the usage lines after.

A free key, unlimited calls, and four carriers in every rates array. Run it beside ShipEngine for a week and let the two ledgers argue it out.

Sign up in seconds. No card required. Unlimited calls on every plan.