/accountYour account identity and billing mode; customers also receive shipping credit and a funding URL.
Requiresbalance:readSHIPCOVE / REST API V1
Request UPS prices, create labels, and follow shipments from your own server. Keep your ShipCove pricing and shipping credit in one place.
01 / ACCESS
Sign in to your active customer account or verified ShipCove owner account, open API access, and create a key for your integration. Read permissions are selected by default. Add labels:write only when the integration should be allowed to purchase real postage, and labels:void only when it should request voids.
Save the key in a server environment variable or secret manager. It is displayed once. Never include it in frontend JavaScript, mobile app bundles, query strings, source control, or support messages. Browser requests with an Origin header are rejected; CORS access is not offered.
curl https://shipcove.net/api/v1/account \
-H "Authorization: Bearer $SHIPCOVE_API_KEY"Keys expire after the selected 30, 90, or 365 days, with 90 days as the default. Up to 5 active keys are available per workspace. Owner keys access the owner’s own shipments, not customer accounts. Create a replacement before expiry, update your server, then revoke the old key.
Customer API keys use your existing shipping credit. Add funds through Credit & billing; Zelle payments become available after ShipCove verifies receipt. A quote does not buy postage. A confirmed label purchase deducts your customer price and creates postage through ShipCove’s UPS connection. Shipping approval, balance checks, and account limits still apply.
Owner API keys: purchases bill your connected UPS account directly, with no customer wallet debit or ShipCove markup. The account endpoint returns accountType: "owner", billingMode: "ups_account", and a null balance. Read permissions are the starting point; enable labels:write only for trusted integrations. Owner keys cannot choose another customer’s identity.
02 / QUOTE
Send the shipment fields directly as JSON to POST /quotes, with Content-Type: application/json. The sample below is fictional: replace its addresses and measurements before requesting a quote.
{
"from": {
"name": "Example Warehouse",
"line1": "123 Example St",
"line2": "",
"city": "Detroit",
"state": "MI",
"zip": "48201",
"phone": "3135550100",
"residential": false
},
"to": {
"name": "Example Recipient",
"line1": "456 Sample Ave",
"line2": "",
"city": "Los Angeles",
"state": "CA",
"zip": "90012",
"phone": "",
"residential": true
},
"pounds": 2,
"ounces": 8,
"length": 12,
"width": 8,
"height": 6,
"reference": "ORDER-1042",
"declaredValueCents": 0,
"signature": "none",
"packaging": "02",
"contentsCategory": "general"
}Weight must be above zero and no more than 150 lb in total. Ounces range from 0 to 15.99. Dimensions use positive whole inches, at most 108 inches per side; length plus girth cannot exceed 165 inches. The sender needs a valid phone number. UPS may adjust charges when actual measurements or delivery details differ.
The response includes id, rates, mode, and expiresAt (Unix milliseconds). Each rate contains a code, name, amount as a decimal string, and currency. Quotes normally expire after 10 minutes. Choose a returned service and use its exact customer price before its returned expiry. The API is for live shipping; quotes do not imply a free testing environment.
declaredValueCents specifies UPS declared value in whole cents, up to 5,000,000. Declared value is carrier liability, not insurance. Signature options are none, signature, or adult, where supported. shipDate uses YYYY-MM-DD, from today through the next 7 days in US Eastern time. Packaging defaults to your own box (02); only use supported UPS packaging and Simple Rate combinations that match your package.
Return labels use returnLabel: true and require contentsDescription. A linked return can include returnOfShipmentId. Restricted or uncertain contents are not accepted through this shipping flow. The OpenAPI specification lists the available fields.
03 / PURCHASE
Use POST /labels with the quote ID, a returned service code, confirmed: true, and maxAmountCents. Your maximum protects the customer from spending more than the amount your integration approved. Do not derive it from a competitor’s price or from the UPS account’s base cost.
curl https://shipcove.net/api/v1/labels \
-X POST \
-H "Authorization: Bearer $SHIPCOVE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1042-package-1" \
--data '{"quoteId":"00000000-0000-4000-8000-000000000000","serviceCode":"03","confirmed":true,"maxAmountCents":1234}'HTTP 201 indicates a newly ready purchase; 200 can return a ready result from a repeated request. HTTP 202 means the saved result is still processing or requires attention. Inspect status, error, and tracking; do not assume every successful HTTP response means a printable label exists.
The shipment id is your recovery reference. Save it alongside your order. Every physical package needs a separate label and tracking number. Create a separate quote and use a unique idempotency key for each new package; printing the same label twice does not purchase more postage.
04 / RECOVERY
Purchases and voids require an Idempotency-Key: 8–128 characters, using letters, numbers, periods, underscores, colons, and hyphens. Keep the same key and identical request body when retrying the same action after a timeout. Reusing a key with different details is rejected.
GET /shipments/{id} when the ID is known. Retry the original POST with the same key and body if needed to recover its result.uncertain or has an unresolved carrier outcome, stop and use ShipCove support. Do not request a replacement quote and buy again automatically.For a void, send {"confirmed":true} to POST /shipments/{id}/void with a separate idempotency key. A void request is not proof of a UPS void. Wait for a confirmed result; used or ineligible labels may not be voidable.
05 / LABELS
GET /labels/{id} returns JSON containing image (base64) and format (the UPS image format). Decode the base64 using that format. This endpoint does not return a PDF or a UPS QR code. For 4×6 or Letter PDFs, use the ShipCove workspace’s print tools.
Do not crop barcodes or remove their quiet zones. Print at actual size and attach one unique label to each package. A download can remain unavailable until required high-value receipts are saved. Retrieve receipt metadata and download each required receipt; above $1,000 declared value, follow the UPS driver handoff and signed-receipt requirements shown in ShipCove.
Tracking reads return the saved snapshot and lastCheckedAt. Use the refresh endpoint to request a newer carrier result. This version does not provide tracking webhooks or proof-of-delivery downloads through the API.
REFERENCE / ROUTES
/accountYour account identity and billing mode; customers also receive shipping credit and a funding URL.
Requiresbalance:read/quotesQuote one package. Returns its ID, available customer prices, and expiry time.
Requiresrates:read/labelsPurchase one label from a quote. Requires confirmation, a maximum price, and an idempotency key.
Requireslabels:write/shipmentsYour shipment history. Use limit (1–100, default 25) and the returned nextCursor.
Requireslabels:read/shipments/{id}The saved label purchase status, tracking number, and available download URL.
Requireslabels:read/labels/{id}Original label image as base64 plus its format. This endpoint does not return a PDF.
Requireslabels:read/labels/{id}/high-value-receiptsRequired high-value receipt status and available receipt download paths.
Requireslabels:read/labels/{id}/high-value-receipts/{index}Download a saved receipt in its original supported format.
Requireslabels:read/shipments/{id}/voidRequest an eligible UPS void. Requires confirmation and an idempotency key.
Requireslabels:void/shipments/{id}/trackingRead the latest saved tracking information and last-checked time.
Requirestracking:read/shipments/{id}/tracking/refreshRequest a carrier tracking refresh, subject to account and carrier limits.
Requirestracking:readList pagination uses nextCursor exactly as returned. Its current format is a creation timestamp and UUID separated by a period. Do not calculate your own cursor.
REFERENCE / OPERATIONS
General limits are 120 requests per key per minute and 240 per workspace per minute. Purchases, quotes, and tracking may have stricter operation or account limits. Honor the Retry-After response header on HTTP 429 and use bounded backoff.
| Status | Your integration should |
|---|---|
| 400 | Correct invalid fields before retrying. |
| 401 | Check whether the key is missing, revoked, or expired. |
| 403 | Check the key’s scopes and the customer’s account permissions. |
| 404 | Check the resource ID and its ownership. |
| 409 | Review the saved state, quote expiry, or conflicting request. |
| 429 | Wait for the indicated retry interval. |
| 5xx / timeout | Recover the original purchase before attempting new postage. |
{
"error": {
"code": "example_error",
"message": "A safe explanation of the failed request.",
"requestId": "request-reference"
},
"requestId": "request-reference"
}Save the X-Request-Id header or JSON requestId when reporting an issue. Never log or send the Authorization header. Label files, customer addresses, and tracking details should be stored with access limited to authorized staff.