An abandoned cart is a purchase process a customer started on one of your connected channels but never converted into an order. Fenicia adds them automatically so you can analyze them, attempt to recover them, or close them as unrecoverable.
Canonical route vs. legacy alias
The canonical route for this domain is /orders/abandoned-carts/*. There is an alias /abandoned-carts/* (without the /orders prefix) that points to the same lambda for compatibility, but it has been deprecated since June 1, 2026 and every call generates a warning in the server logs. Always use /orders/abandoned-carts/* in new integrations.
This domain's envelope differs from the rest of Orders
Every other Orders endpoint returns paginated lists as { data: [...], meta: { pagination: {...} } }. The abandoned carts listing does not follow that pattern. Its response is double-nested:
That is, pagination is a sibling of data.data, not of data on its own, and there is no meta object. This is a real inconsistency in the API (not a documentation error) — if you write a generic Orders client that assumes the {data, meta:{pagination}} shape, this endpoint will break it. Read it with response.data.data and response.data.pagination.
This domain uses two different text conventions that you must not confuse:
Permissions (API key scopes) are written with a hyphen: abandoned-carts:read, abandoned-carts:sync, abandoned-carts:recover, abandoned-carts:update, abandoned-carts:send-reminder.
Error codes in the catalog are written with an underscore: abandoned_carts:not_found, abandoned_carts:already_recovered, abandoned_carts:already_closed, abandoned_carts:recovery_failed.
They are two independent catalogs (the permissions one lives in PERMISSIONS.ABANDONED_CARTS.*, the errors one in the library's error catalog). This is not a typo on this page — that's literally how they are defined in the API.
This search uses the same double-nested response shape described above: response.data.data is the array, response.data.pagination is the pagination — there is no meta.
Real groups: no_action, with_action, recovered, not_recovered, all
no_action are the open carts with no recovery attempt at all; with_action are the contacted ones; not_recovered sums expired + closed; all is the total. These 5 names don't match the statusGroup you accept as a filter in the listing — they're the fixed grouping of this count endpoint.
Returns the total count of abandoned carts matching the filters. Requires abandoned-carts:read.
statusstring
Filter by cart status.
statusGroupstring
Filter by visual status group.
recoveryStatusstring
Filter by recovery process status.
channelIdstring
Filter by channel.
originstring
Filter by channel origin/type.
startDatestring
ISO start date (inclusive).
endDatestring
ISO end date (inclusive).
200
{ "data": { "count": 87 } }
Tip
Unlike what you might expect from other simple count endpoints, this one accepts the same filters as the listing — use it to show a counter that exactly matches a filtered view, without fetching all the records.
Placeholder endpoint: it doesn't trigger a real sync yet
Unlike POST /orders/sync, this endpoint's handler is a placeholder: it accepts the request and responds 202, but the channel integrations aren't wired to this route yet — it doesn't trigger any real abandoned cart sync on the channel. channelId is optional; if you omit it, the channelId key simply doesn't appear in the response.
You don't send recoveryStatus yourself: the API computes it from your type/status. Only when status is sent or delivered does it become email_sent / sms_sent / whatsapp_sent according to type; in any other case it stays pending. The cart also moves to status: "contacted" as soon as you register the first action.
Use recover/close for transitions with business rules
This endpoint writes the status directly, without the rules applied by POST .../recover (records recoveredAt) or POST .../close. Prefer those dedicated endpoints when the use case matches; use this one only for cases they don't cover (for example, manually marking expired).
No abandoned cart with that ID exists in your tenant.
abandoned_carts:already_recovered
409
The cart has already been marked as recovered.
abandoned_carts:already_closed
409
The cart has already been closed.
abandoned_carts:recovery_failed
500
The recovery action failed (for example, sending the reminder).
validation:invalid_input
400
The body doesn't satisfy the schema — type/status is missing on a recovery action, or status isn't a valid value when updating the status.
validation:invalid_pagination
400
page or limit has a value out of range.
auth:invalid_token
401
The API key is invalid or was revoked.
auth:permission_denied
403
The API key doesn't have the required permission (hyphenated, e.g. abandoned-carts:recover).
Tenant isolation
You can only query and operate abandoned carts belonging to your own tenant. Attempting to access a cart from another tenant returns 404, never cross-tenant information.