Feeef Cloud
Parcels API

Labels

Carrier stickers by default, optional platform templates, single and merged PDF printing.

Single label

GET /parcels/:id/label?source=carrier|platform&size=a6|100x100&lang=ar|fr|en&templateId=lt_…

Returns application/pdf. Default is carrier-native stickers (each courier's own label API). Mixed-carrier bulk prints are merged for you — you never group by courier yourself.

source / project label-settings can force platform branded tickets instead. templateId always forces a platform template. Response header X-Feeef-Cloud-Label-Source tells you which renderer served the bytes (carrier, platform, or cache).

curl "https://apis.cloud.feeef.org/v1/parcels/pcl_8Xw…/label?source=carrier&size=a6&lang=fr" \
  -H "Authorization: Bearer $FEEEF_CLOUD_KEY" \
  -o label.pdf

lang / size only matter for platform-rendered labels. Carrier-native stickers are whatever language/size the courier itself returns.

Merged batch label

POST /parcels/labels

One merged PDF, pages in the order you listed parcelIds — pass up to 200.

curl -X POST "https://apis.cloud.feeef.org/v1/parcels/labels" \
  -H "Authorization: Bearer $FEEEF_CLOUD_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "parcelIds": ["pcl_8Xw…", "pcl_9Ab…"], "source": "platform", "templateId": "lt_7Ks…" }' \
  -o labels.pdf

Mixed carriers in one merge call are fine

You can mix parcels from different carrier accounts in one parcelIds array — the platform fetches each courier's sticker (or renders a platform template) and merges the results into a single PDF. Every parcel must belong to the same tenant.

Label templates (platform tickets)

Courier stickers are the default. When you want branded tickets (logo, sender block, size, locale), create templates and optionally make them the project default.

MethodPathPurpose
GET/label-templatesList templates
POST/label-templatesCreate (setAsDefault: true also flips settings to platform)
GET/label-templates/:idGet one (lt_…)
PATCH/label-templates/:idUpdate / setAsDefault
DELETE/label-templates/:idDelete
GET/label-settings{ defaultMode, defaultTemplateId }
PATCH/label-settingsSet defaultMode: "carrier" | "platform" and/or defaultTemplateId
# Create a branded template and make it the default print mode
curl -X POST "https://apis.cloud.feeef.org/v1/label-templates" \
  -H "Authorization: Bearer $FEEEF_CLOUD_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Shop A6",
    "size": "a6",
    "locale": "fr",
    "senderName": "Ma Boutique",
    "senderPhone": "0550000000",
    "logoUrl": "https://cdn.example.com/logo.png",
    "showLogo": true,
    "setAsDefault": true
  }'

# Switch back to courier stickers as the default
curl -X PATCH "https://apis.cloud.feeef.org/v1/label-settings" \
  -H "Authorization: Bearer $FEEEF_CLOUD_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "defaultMode": "carrier" }'

Resolution order when printing:

  1. templateId forces that platform template; it cannot be combined with source=carrier.
  2. Explicit source selects carrier (strict, no fallback) or platform.
  3. Without an override, project label-settings.defaultMode=platform selects the default template.
  4. Otherwise, carrier-account labelSource=platform selects platform.
  5. Otherwise, use the carrier sticker; carrier failures fall back to the selected platform template.

If no template is selected, platform printing uses the documented base A6/FR layout without hidden template selection.

On this page