Base URL

The base URL used for all API operations is: https://app.couriermanager.eu/cscourier/API/<operation>
A shipment can have one of the following statuses: draft - it can still be edited by the client. It is not ready for pick-up, and normally a label cannot yet be printed. uncollected - it is ready and waiting for pickup active - being delivered notified - at least one delivery attempt was made, unsuccessfully delivered - the expedition has been delivered successfully returned - the expedition has been returned for some reason canceled - the expedition has been canceled before pickup exception - anything else Some accounts can be configured for local language status names. For example Romanian companies may use Romanian language status names: initial, neridicat, in_curs, avizat, livrat, returnat, anulat, exceptie. A shipment can simultaneusly have both a status and a code. Codes are used for many different purposes, from operational (entering a hub, being sorted), or as explanations for a status (status is returned, and the code is the reason for the return), errors, or anything else. Request format All parameters are sent as application/x-www-form-urlencoded — the same encoding browsers use for HTML forms. Do not send JSON request bodies. Both GET and POST are accepted. Most operations require an api_key parameter (or api_key HTTP header). GET — parameters in the query string: https://app.couriermanager.eu/cscourier/API/get_status?api_key=YOUR_KEY&awbno=1234567890 POST — parameters in the form body (Content-Type: application/x-www-form-urlencoded): curl -X POST https://app.couriermanager.eu/cscourier/API/get_status \ -d "api_key=YOUR_KEY" \ -d "awbno=1234567890" Response format Standard response is a JSON object with the following fields: status - done | failed data - actual response, depending on the operation error - if status is failed, an error code. not present otherwise. message - human readable comment, for both success and failure. The API can be tested using the following address: https://app.couriermanager.eu/cscourier/test_api.html

add_service
Parameters:
	- awbno
	- service: service id (see list_services?type=extra)

Adds an extra service to a shipment.

Notes:
	- Readonly services (is_readonly=1) cannot be set with a client API key
	- Client API keys can only add services when AWB is in draft (initial) status
	- After franchisor processing, the AWB moves to uncollected status and services cannot be added by clients
cancel
Parameters:
	- awbno

Cancels the shipment (sets status to cancelled/anulat).

Permissions:
	- Requires 'cancel' permission on awbs, OR
	- Requires 'cancel_uncollected' permission on awbs (only for AWBs in uncollected/neridicat status)

Returns "ok" or {status:done} on success, "forbidden" if permission denied.
change_status
Parameters:
	- awbno
	- status: uncollected (neridicat), in_transit (in_curs), delivered (livrat), returned (returnat), cancelled (anulat)

Changes the status of a shipment.

Status flow: draft (initial) -> uncollected (neridicat) -> in_transit (in_curs) -> delivered/returned/cancelled

AWB must be in draft, uncollected, or in_transit status to change.

Permissions:
	- Client keys: can set uncollected, cancelled (requires cancel or cancel_uncollected permission)
	- Client keys: can set in_transit only with client_can_set_status_active permission
	- Courier keys: can set delivered, returned, cancelled
create_fulfillment_order
Create a fulfillment order.

Parameters:
create_return
Parameters:
	- awbno - number of the original shipment to return
	- type: address_pickup | dropoff_location | dropoff_any
	- from_address, from_city, from_county, from_zipcode, from_country - (optional pickup address; if missing and type is address_pickup, the original shipment destination address will be used)
	- from_delivery_location -  a delivery location id, as returned by list_delivery_locations

Where type:
	address_pickup means the courier will pick up the return parcel from an address;
	dropoff_point means the package will be dropped off at a particular location (locker, office, pudo)
	dropoff_any means the package will be dropped off at any office.

Creates a late return shipment for that shipment number.
create_shipment
The following fields can be added:

"type", "service_type", "retur", "retur_type", "ramburs", "ramburs_type", "insurance", "weight", "content", "comments", "cnt", "content", "customer_reference", "fragile", "width", "height", "length",
from_name, from_contact, from_str, from_nr, from_bl, from_sc, from_et, from_ap, from_interfon, from_sector, from_city, from_county, from_zipcode, from_country, from_phone, from_email,
to_name, to_contact", to_str, to_nr, to_bl, to_sc, to_et, to_ap, to_interfon, to_sector, to_city, to_county, to_country, to_zipcode, to_phone, to_email, to_extra, to_cui, to_regcom

type: envelope | package
service_type: obtain from courier company (eg: regular, express). you can also use the list_services API mentioned below, with type=main
retur: 0 | 1  -  Package swap
cnt: number of parcels/envelopes
retur_type: colet | document
ramburs: <CoD amount>
ramburs_type: cont | cash | instrumente_plata  -  CoD type, with values meaning account, cash or check.
weight: <weight in kg>
length,height,width: sizes in cm
insurance: insured value
payer: who is paying the cost of transport for this shipment. Allowed values are:
- client (default value), if the payment will be made by the contracted client, usually on a monthly invoice
- sender|expeditor, if the payment is made in cash by the sender
- recipient | destinatar, if the payment is made in cash by the recipient.

from_... fields are used for the sender address, to_... fields for the recipient address

...name: name, company name if applicable
...contact: contact within company
...address: street address
...city: city
...county: province
...country: country
...phone: phone number
...zipcode: zipcode


to_extra: any extra information regarding recipient address
use_default_from_address: if "true", it will use the default expedition address in the system instead of the fields above.
to_delivery_location: the id of the delivery location, as sent by the list_delivery_locations API
from_type: injection | dropoff | last_mile | <empty>. If missing, general settings will be used. Can be used to specify exceptions - for example if most shipments are injected, it can be set to "last_mile" to signal that a courier should go pick it up.
There are no mandatory fields except api_key, but you should be aware that expeditions lacking relevant information most likely can't be delivered.

Expeditions with the "cnt" set to values over 1 will be automatically converted to groups. You will receive in the response the number of the first package in the group (like "XXX"), and the rest are created as such:
1st package: XXX
2nd package: XXX/2
3rd package: XXX/3
And so on.

When creating a group (with cnt>1), you can optionally add weight and size fields for each parcel in the group, by adding fields as such:
weight, length, height, width - for the first parcel
weight2, length2, height2, width2 - for the second parcel
weight3, length3, height3, width3 - for the third parcel
And so on.

pickup_requested: if true, the courier will pick up the parcel from the sender's address; if false, the courier will not pickup the parcel. If absent, the default setting will apply.

Any number of extra services (like "Delivery Saturday") can be specified, each by adding a parameter like service_<service id> with the value true. For example if Delivery Saturday has the id 57, you would have: service_57=true
Do not use "1" as synonym for "true" - it is a common cause of problems.

The full list of services can be obtained through the API using the URL:

API/list_services?api_key=<api key>&type=[main|extra]


Return value

The data field contains a map with the created expedition. Expedition number is in the "no" field.

The status for the created expedition will be uncollected by default (neridicat for Romanian accounts). It can be changed from the Settings menu (Initial_api_status).


awb_event_handler is an optional webhook. If present, it will receive notifications on status and code changes.
Fields in the json:
	no - awb number
	franchisor_no - franchisor number
	customer_reference - customer reference, as given when the shipment was created

	type - type of event, currently 'status' or 'code'
	status - shipment code status
	code - shipment code
	code_name - shipment code name
If more information is desired, you may make a get_history call for the same shipment upon receiving a webhook event.

Events are being sent asynchronously, with a delay of max 60s.
Notifications can be sent either as GET or POST requests, by prefixing the URL with [GET] or [POST]. (eg: [POST]https://example.com/webhook)
For GET, the json is encoded and sent in the "content" field. For POST, the json is sent as the request body.
If no prefix is used, the default is GET.
delete_service
Parameters:
	- awbno
	- service: service id (see list_services)

Deletes an extra service from a shipment.
export_expeditions
Parameters:
	- from_date
	- to_date
	- detailed: true| false
	- withPrice, withPriceDetailed: true|false (only when detailed is set to false)

Downloads an excel of shipments.
get_history
Parameters (v1):
	- awbno
	- full: true|false (optional)
Parameters (v2): JSON map in post body, with fields:
	- numbers: list of shipment numbers
	- full: true|false (optional)
V2 API returns a map of responses for each queried numbers: { "no" : <v1 response>, ...}

V1 API returns a json map with the fields "no", "status" and "history", where history is a list of status changes with the fields:  date (unixtime), status and description.
If the parameter full is true and the api key is not a client api key (i.e. is a courier api key), it will add extra raw information from the database - both extra rows and extra fields.

The field event_type can have the following values:
ShipmentCreated
StatusChanged:<status>
CodeChanged:<code>
FranchisorEvent
SortingGate
Transit
NewHub
ScannedHub
OutForDelivery
PickupCourierAllocated
reweight
resize


The recommended flow is to use this together with webhooks for real time updates.
When creating the shipment add a webhook url in the field 'awb_event_handler'. When receiving a notification, you can also make a get_history call for the same shipment to get full information.
get_info
Parameters:
	- awbno
	- include_pictures: true|false (optional, default false) - if true, includes all AWB pictures as base64-encoded data

Returns a JSON map consisting of:

text fields with expedition info ("id", "no", "status", "from_address", "to_address", "from_city", "to_city", "from_country", "to_country", "ramburs", "ramburs_type")
"invoice", which contains a map with invoice info (date as unixtime, series, no, value - invoice value without VAT)
"decont_client", which contains a map with client settlement info: date as unixtime, transaction_no, value
"pictures" (only when include_pictures=true), a list of maps each containing: id, type, code, extension, date (unixtime), base64 (base64-encoded file content)
get_internal_notes
Parameters:
	- awbno: shipment number

Returns all internal notes for a shipment, ordered by date ascending.
Employee-only — not available to client API keys.

Response data:
	- notes: array of {id, note, date, date_formatted, user, username}
	- awb_no: the shipment number
get_pod
Parameters:
	- awbno
	- type: picture|signature (optional)
	- base64: true|false (optional)

Returns a JSON map consisting of:

type is optional and defaults to "picture".
If there is a document of that type, it will download it. If there are several documents of the same type it will download only the most recent one.
Extension of downloaded documents may vary - currently we have jpg and pdf in use.

If base64 is true, it will return a json containing the base64 encoded file.

Note: this dowloads individual images attached to the shipment. To get the full pdf Proof of Delivery form, use print_pod.

get_price
Takes the same parameters as API_createAWB, and returns a map with fields "price" and "zone"
get_shipments
Parameters:
	- from_date: REQUIRED (format: dd-MM-yyyy)
	- to_date: optional (format: dd-MM-yyyy)
	- dateType: optional, which date field to filter on. Values: from_day (default), to_time, pickup_date, to_hub_time, invoice_date, status_date, code_date, courier_date
	- limit: optional, limits number of results
	- order_random: if true, returns results in random order
	- status: optional, filters by status (comma-separated list of status codes)

Returns a JSON list of shipments.
get_stats
Parameters:
	- tracked_var - one of the following: tohub_delivery, tohub_ofd, ofd_delivery, pickup_tohub, created_pickup, pickup_delivery, tohub_delivery_wdays, tohub_ofd_wdays, ofd_delivery_wdays, pickup_tohub_wdays, created_pickup_wdays, pickup_delivery_wdays
	- stats_type - grouping type: general (default), clients, franchisors, codes, hubs, zones, errors
	- standard_day_split: true|false

Filter parameters:
	Date filters:
	- from_date, to_date - date range (format: dd-MM-yyyy)
	- date_type - date field to filter on: from_day (default), to_time, pickup_date, to_hub_time, status_date, code_date, courier_date

	Status filters:
	- status - status to filter

	Client filters:
	- client - client ID to filter
	- department - department ID to filter

	Courier filters:
	- delivery_courier - delivery courier ID
	- pickup_courier - pickup courier ID

	Location filters:
	- from_country - filter by origin country code
	- county - filter by county (from or to)
	- hub - filter by hub

	Shipment type filters:
	- only_cod: true - filter only COD shipments
	- no_returns: true - exclude return shipments
	- only_returns: true - show only return shipments

Returns a json list of stats.
get_status
Returns a JSON map containing the current shipment status.

Alternatively, you can request multiple statuses at the same time using the "awbnos" parameter:

API/get_status?api_key=<apikey>&awbnos=<awbno1>,<awbno2>,<awbno3>...
get_statuses
Parameters:
	- awbnos, a list of comma-separated shipment numbers.

list_addresses
Lists all addresses for a client. It always includes the common public addresses.

Parameters:
	- client: client id, if not used with a client api key
	- onlyCommon: if true, only common addresses are returned
list_cities
Requires a courier api key.
Parameters:
	- country
	- county

Returns a json list of cities, with the fields "name", "province" and "country" for each. If the optional parameter country is present, it will return only the cities in that country. ISO 2 codes are preferred. If the optional parameter county is present, it will return only the cities in that county
list_codes
Returns a json list of codes. The 'code' field is the one used to change a shipment code.
list_delivery_locations
Parameters:
	- country
	- type: locker|office|pudo (optional - if missing returns all delivery locations)

Returns a json list of delivery locations (lockers and offices). To use a delivery location, when creating a shipment send the "id" of that location in the to_delivery_location field.
list_invoices
Parameters:
	- from_date
	- to_date
	- include_shipments: true|false (default false)
	- filterByModified: true|false

Returns a json list of invoices.
The from_date and to_date parameters should be dd-MM-yyyy.
If filterByModified is true, it will filter by last modified date.
list_services
Parameters:
	- type: main|extra

Returns either:
	- type=main: list of main service types (ground, express, etc.) - use in create_shipment's service_type field
	- type=extra: list of extra services that can be added to shipments

Notes:
	- IMPORTANT: When creating shipments, you must use a valid service_type from list_services?type=main
	- Extra services with is_readonly=1 cannot be set with a client API key
list_statuses
Returns a json list of statuses.
me
Returns the current user's profile, role, and full permission map with descriptions.
Use this to build UI that adapts to the user's permissions - hide buttons and menu items
the user cannot access rather than showing them and getting errors.
The permissions map includes human-readable name and description for each right.

Also works as a credential test: if credentials are valid, returns {status:done}.
order_pickup
Parameters:
	- awbno - one of the shipments to be picked up (mandatory - pickup address will be taken from this shipment)
	- weight - total weight of the shipments to be picked up
	- cnt - total number of parcels to be picked up
	- width - max width of the parcels to be picked up
	- length - max length of the parcels to be picked up
	- height - max height of the parcels to be picked up
	- comments - comments for the pickup request
	- date - date of the pickup request, format: dd-MM-yyyy HH:mm:ss (if missing, scheduled for next working day)
	- shipment_numbers - (optional) list of shipment numbers to be picked up

Only awbno is required.

Notes:
	- If the franchisor doesn't support pickup ordering, the error message may be empty
print
Parameters:
	- awbno
	- type: pdf | html | zpl
	- format: a4|a6 (default a6)
	- force_single_print: true|false (default false) - to print just the leader of a group instead of the whole group

Returns the shipment label, as pdf, html or ZPL
resize
Changes the dimensions and weight of a shipment. Can also be used by client API key.

Parameters:
	- awbno: shipment number
	- weight: new shipment weight
	- length: new shipment length
	- width: new shipment width
	- height: new shipment height


Optional parameters:
	- beeVision: true if the request is coming from a BeeVision scanner

Notes:
	- If beeVision is true, the function expects a JSON payload in the POST data
	  containing the dimensions, weight, and barcode information.
	- Depending on system settings, resizing may be applied to the group leader
	  shipment instead of individual shipments in a group.
	- There may be restrictions on decreasing weight below the original value,
	  depending on user permissions and system settings.
reweigh
Changes the weight of a shipment. Can also be used by client API key.

Parameters:
	- awbno: shipment number
	- weight: new shipment weight
	- count: number of shipments for batch reweight
	- no[1..count]: shipment numbers for batch reweight
	- weight[1..count]: new shipment weights for batch reweight

Response format:
	- Single AWB: [{"AWBNO":"new_weight"}] (JSON array, not standard status:done format)
	- Batch: array of AWB:weight pairs
test_connection
	Tests connection and credentials. Returns {status:done, data:{account_name, usercompany_name}} if correct.
update_shipment
Parameters:
    - awbno: Shipment number to update
    - updates: JSON object containing field:value pairs to update

Currently supported fields:
    - cnt: Number of pieces in the shipment

Example:
    updates={"cnt": 3}

Notes:
    - Only specific fields can be updated
    - Changes are validated before being applied
    - Some updates may trigger automatic recalculations