.dev
REST API

Delivery

Carrier integrations (12 carriers), the generic parcel bridge, inbound tracking webhooks, Ecotrack sync, and shipping prices.

Feeef ships COD orders through carrier integrations — one config per carrier under store.integrations.{carrier} (see Integrations for the config API). Once a carrier is configured, you can quote fees, create shipments from orders, print labels, and receive status updates pushed back by the carrier.

All merchant operations require a Bearer token unless marked Public. Inbound carrier webhook receivers are public by design — the carrier calls them, authenticated by store id + payload semantics.

Carrier catalog

Key ({carrier})CarrierCredentials in config
yalidineYalidine / Guepexid, token, agent (yalidine or guepex)
ecotrackEcotrack (multi-brand)baseUrl, token
zrexpressZR ExpressZR/Procolis token pair
procolisProcoliskey, token
noestNoest Expressguid, token
maystroDeliveryMaystro DeliveryAPI token
zimouZimou ExpressapiKey
mdmExpressMDM ExpressAPI key (see token exchange below)
ecomanagerEcoManagerbaseUrl, token
codpilotCOD PilotAPI credentials
feeefDeliveryFeeef Delivery (white-label partner)provisioned via enable
orderdzOrderDZ (order forwarding)API credentials

Carriers are credential-required integrations: subscribing never stubs a config — write credentials first, then set active: true.

Generic carrier bridge

The bridge exposes one canonical surface over eight carriers (ecotrack, yalidine, zrexpress, mdmExpress, feeefDelivery, maystroDelivery, noest, procolis), so you don't need per-carrier request shapes. Aliases maystro, zr, and mdm are accepted for {carrierCode}.

MethodPathDescriptionAuth
POST/v1/stores/{storeId}/integrations/{carrierCode}/parcels/sendCreate a shipment from a ParcelCreate bodyBearer
POST/v1/stores/{storeId}/integrations/{carrierCode}/parcels/sendManyBulk — body { "parcels": [...] }Bearer
POST/v1/stores/{storeId}/orders/{orderId}/carriers/{carrierCode}/sendBuild the parcel from the order, merge optional body patch, sendBearer
POST/v1/stores/{storeId}/orders/{orderId}/carriers/{carrierCode}/unsendCancel/remove the carrier shipment — body { "tracking": "…" }Bearer
POST/v1/stores/{storeId}/orders/{orderId}/carriers/{carrierCode}/deleteAlias of unsendBearer

A ParcelCreate needs at minimum reference, items[], and total (the COD amount; legacy codAmount is normalized). Useful optional fields: contact (firstName, phones[]), address (street, cityCode, stateCode), shippingType (home | pickup | store), freeShipping, pickupId (stop-desk id), fromStock, package (weight/dimensions), and carrier-specific extensions.

Send an order to a carrier

# From an existing order (parcel is derived from the order, body patches it)
curl -X POST "https://api.feeef.org/v1/stores/{storeId}/orders/{orderId}/carriers/yalidine/send" \
  -H "Authorization: Bearer $FEEEF_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "shippingType": "pickup", "pickupId": "163" }'

# Or standalone from a ParcelCreate
curl -X POST "https://api.feeef.org/v1/stores/{storeId}/integrations/ecotrack/parcels/send" \
  -H "Authorization: Bearer $FEEEF_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "reference": "ORD-1042",
    "total": 4500,
    "items": [{ "name": "Montre X", "quantity": 1 }],
    "contact": { "firstName": "Amine", "phones": ["0550000000"] },
    "address": { "street": "Cité 20 Août", "stateCode": "16", "cityCode": "1601", "country": "DZ" }
  }'

Common per-carrier operations

Carrier-native routes live under /v1/stores/{storeId}/integrations/{carrier}/…. Not every carrier implements every operation — the accordions below list exact support.

MethodPathDescriptionAuth
GET…/{carrier}/fees (some also …/rates)Delivery fee matrix — legacy shape: one row per wilaya, [desk, home]Bearer
POST…/{carrier}/sendSend one order (body usually { "orderId": … } or carrier-specific)Bearer
POST…/{carrier}/sendManyBulk sendBearer
GET…/{carrier}/orders/{tracking}Fetch one parcelBearer
DELETE…/{carrier}/orders/{tracking}Delete/cancel one parcelBearer
POST…/{carrier}/orders/deleteManyBulk delete — body { "trackings": [...] }Bearer
GET…/{carrier}/orders/{tracking}/labelSingle label (PDF/URL)Bearer
POST…/{carrier}/labelsBulk labels — body { "trackings": [...] }Bearer
ANY…/{carrier}/webhookInbound status webhook (carrier → Feeef)Public
GET…/{carrier}/webhook/urlThe URL to register at the carrierBearer
POST…/{carrier}/webhook/setupRegister the webhook at the carrier for youBearer

Inbound carrier webhooks

yalidine, zimou, ecotrack, zrexpress, maystroDelivery, feeefDelivery, and ecomanager accept inbound webhooks. They update the order's deliveryStatus / paymentStatus (and customStatus rules) from carrier events — parcel status changes, payments, deletions. Yalidine additionally answers the CRC subscription challenge (subscribe + crc_token). For ZR Express and Maystro, use webhook/url + webhook/setup to register; EcoManager uses POST …/ecomanager/setup.

Get a carrier fee matrix

curl -H "Authorization: Bearer $FEEEF_TOKEN" \
  "https://api.feeef.org/v1/stores/{storeId}/integrations/ecotrack/fees"

Ecotrack sync

Ecotrack has a server-side sync engine (rate-limited to one run per ~2 hours per store) that pulls parcel statuses and COD cash-in history back into orders, and posts customer payments into Finance when active. A push notification is sent when a run finishes.

MethodPathDescriptionAuth
GET/v1/stores/{storeId}/integrations/ecotrack/sync/statusCooldown state: canSync, lastSyncAt, nextSyncAvailableAtBearer
POST/v1/stores/{storeId}/integrations/ecotrack/syncSync order statuses — optional startDate / endDateBearer
POST/v1/stores/{storeId}/integrations/ecotrack/sync/cashinSync COD payouts only — optional forceAllBearer
POST/v1/actions/syncEcotrackOrdersLegacy one-shot sync actionBearer
POST/v1/actions/createTokenForEcotrackByEmailAndPasswordExchange Ecotrack email/password for an api_token (server-side proxy)Bearer
POST/v1/actions/createMdmExpressApiKeyFromUserLoginSame idea for MDM ExpressBearer

Ecotrack also exposes extra reads: GET …/ecotrack/orders (parcel list), GET …/ecotrack/finance, GET …/ecotrack/statistics, GET …/ecotrack/stock/products, POST …/ecotrack/orders/{tracking}/validate, and POST …/ecotrack/scoring.

Trigger a sync

curl -X POST "https://api.feeef.org/v1/stores/{storeId}/integrations/ecotrack/sync" \
  -H "Authorization: Bearer $FEEEF_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "startDate": "2026-08-01T00:00:00Z" }'

Per-carrier specifics

Dispatcher

Related to fulfillment ops: POST /v1/stores/{storeId}/integrations/dispatcher/dispatch (Bearer) manually assigns orders to confirmers — body { "orderIds": [...], "strategy": "roundRobin" } with strategies random, weightedRandom, roundRobin, priority.

Shipping prices

Structured, geo-aware shipping pricing (per country/state/city, home vs desk) — the successor to the legacy per-store rate arrays. Storefronts read a single price document to compute shipping at checkout; the store references it via shippingPriceId.

MethodPathDescriptionAuth
GET/v1/shipping_prices?store_id={storeId}List price documents for a storeBearer
GET/v1/shipping_prices/{id}One price document (public so storefronts can quote)Public
POST/v1/shipping_pricesCreateBearer
PUT/v1/shipping_prices/{id}UpdateBearer
DELETE/v1/shipping_prices/{id}DeleteBearer

Legacy shipping methods (/v1/shipping_methods resource + POST /v1/shipping_methods/{id}/fork) remain for older stores — wilaya-indexed [desk, home] arrays, same shape as the carrier fees endpoints.

List a store's shipping prices

curl -H "Authorization: Bearer $FEEEF_TOKEN" \
  "https://api.feeef.org/v1/shipping_prices?store_id={storeId}"
  • Integrations — configure carrier credentials, billing/entitlement
  • Webhooks — outbound order and product events (Feeef → your server)
  • API conventions — errors, pagination, batch envelopes

On this page