# Ecolet → Apaczka endpoint map

Every Ecolet endpoint, what replaces it, and what to watch out for. The table
is ordered roughly by how heavily each endpoint is used in practice, so
working top-down gets you to a shipping integration fastest.

All Apaczka routes are `POST` with a **trailing slash** and the signed
envelope described in [Request signing (HMAC)](/legacy/hmac-signing). Payload
shapes: [API v2 reference](/reference/v2-legacy).

## Covered — a direct replacement exists

| Ecolet | Apaczka API v2 | Notes |
| --- | --- | --- |
| `POST v1/oauth/token` | — (no equivalent by design) | No tokens. Sign each request instead — see [Authentication](/guides/authentication). |
| `POST v2/add-parcel/reload-form`<br/>`POST v1/add-parcel/reload-form` | `service_structure/` + `order_valuation/` + `pickup_hours/` | Ecolet's one call is split in three: the dictionary of services and options, the price for a concrete payload, and the available pickup windows. See [Choosing a service from the offer](/guides/choosing-a-service). |
| `GET v1/order/get-statuses-for-many-orders` | `tracking/{waybill}/` | **One waybill per call** — the array form is gone. Loop with a cache, or switch to [push tracking webhooks](/guides/tracking#push-tracking-webhooks) and stop polling. |
| `GET v1/order/{id}` | `order/{order_id}/` | Full order detail including price (in minor units). |
| `DELETE v1/order/{id}` | `cancel_order/{order_id}/` | Separate endpoint, not a verb. Only until the carrier takes the parcel over; a cancelled order also stops serving its documents, so download them first. |
| `GET v1/services` | `service_structure/` | Numeric `service_id`s instead of slugs — you need a mapping table. Returns options and additional services too. Cache it; refresh daily. |
| `POST v1/map-points/ro` | `points/{type}/` | Keyed by point type / carrier rather than by locality, and there is no `destination` (`sender`/`receiver`) filter — see [gaps](/migration/ecolet-gaps#parcel-point-lookup). The chosen point goes into `foreign_address_id` on the address, with pickup type `SELF` ([Pickup types](/guides/pickups)). |
| `GET /api/v1/order/{id}/download-waybill` | `waybill/{order_id}/` | Returns **base64 in JSON**, not a binary stream: `base64_decode()` before writing the PDF. |
| `POST v2/add-parcel/send-order`<br/>`POST v1/add-parcel/send-order` | `order_send/` | **Synchronous** — returns the order id, waybill number and tracking URL immediately. Not idempotent; see [Order lifecycle](/guides/order-lifecycle#3-create-the-order--order_send). |
| `GET v1/order` | `orders/` | Paginated list, max 25 per page. |

## Partly covered — behaviour differs

| Ecolet | Apaczka API v2 | What to do |
| --- | --- | --- |
| `GET v1/order-to-send/{id}` | — | The order basket / validation step has no counterpart because creation is synchronous. Validate on your side, then call `order_send/` and handle the error envelope. Optionally price the final payload with `order_valuation/` first. |
| `DELETE v1/order-to-send/destroy` | — | Nothing to destroy — a draft that was never sent does not exist on the Apaczka side. Keep drafts locally. |
| `GET v1/me` | `me/` | Exists, but it is **feature-flag-gated** — not enabled on every account, and it does not return Ecolet's credit limit / unpaid-invoice view. Check with your Alsendo contact before you depend on it; see [gaps](/migration/ecolet-gaps#account-and-credit-information). |

## Not covered — no equivalent

These need a decision on your side before you start. Each one is worked
through on the [Gaps and workarounds](/migration/ecolet-gaps) page.

| Ecolet | Replacement strategy |
| --- | --- |
| `GET v1/locations/ro/localities/{code}` | [Own locality dictionary](/migration/ecolet-gaps#locations-api) |
| `GET v1/locations/{id}/streets/{street}` | [Own street data](/migration/ecolet-gaps#locations-api) |
| `GET /api/v1/locations/{id}/search-street-postal-codes/{street}` | [Own street / postal-code data](/migration/ecolet-gaps#locations-api) |
| `GET /api/v1/locations/ro/counties` | Static list — `county` maps to `state_code` |
| `GET /api/v1/locations/countries` | Static ISO 3166-1 alpha-2 list |
| `GET v1/address-book` | [Keep the address book in your own system](/migration/ecolet-gaps#address-book) |

## Endpoints you gain

Apaczka exposes a few things Ecolet did not, worth knowing before you
re-implement them yourself:

| Apaczka API v2 | What it does |
| --- | --- |
| `pickup_hours/` | Available courier pickup windows for a service and postal code. |
| `pickup/{order_id}/` · `batch_pickup/` | Order a courier pickup for orders that already exist — see [Pickup types](/guides/pickups). |
| `dispatch_code/` · `turn_in/` | Drop-off code and a turn-in confirmation for a batch handed to one courier. |
| Push tracking webhooks | Signed status notifications to your URL, instead of polling — see [Tracking](/guides/tracking). |

## Additional services

Ecolet's named services map onto numeric option ids from
`service_structure`. Treat the ids below as a **starting point to verify
against your own account**, not as constants — the available options differ
per carrier and per service.

| Ecolet service | Apaczka | Status |
| --- | --- | --- |
| `saturday_delivery` | option `19` | Confirmed equivalent |
| `sms_notify` | option `31` | Confirmed equivalent |
| `rod` (return of documents) | option `11` | Equivalent exists, but there is no `rod_code`; the option is skipped when the return contains no payment instruments |
| `open_package` | exists in the dictionary | Verify against your service before relying on it |
| `rop` (return of pallets), `swap`, `epod` | none identified | No equivalent confirmed — decide per service whether to drop the feature or block the order |

:::caution[Read the ids, don't hardcode them]

Always resolve option ids from `service_structure/` for the service you are
about to use, and fail loudly when an option your order needs is absent from
the dictionary. Hardcoding the numbers above will silently ship parcels
without the service the customer paid for.

:::

---

**See also:** [Overview](/migration/ecolet-overview) ·
[Gaps and workarounds](/migration/ecolet-gaps) ·
[API v2 reference](/reference/v2-legacy)
