EMAG Marketplace API Documentation v3.9.4
EMAG Marketplace API Documentation v3.9.4
2
1. eMAG Marketplace API
eMAG Marketplace API is developed by eMAG for Marketplace partners in order to allow them to use their
own CRMs / ERPs. This document explains the methods for calling the API.
The API can be used in order to:
send products and offers
process orders
1.1. Conventions
To access the API, simply pass your vendor username, code and well computed hash. Please note that user
should be granted API rights in order to access the API.
$hash = sha1(http_build_query($data).sha1('testpassword'));
A Marketplace API call is represented by sending a request to API URL of platform. Every request consists of a
POST to an URL like:
MARKETPLACE_URL/api-3/resource/action
Ex: https://marketplace.emag.ro/api-3/product_offer/save
3
message MARKETPLACE_URL/api-3/message read save count
Below a code example using the resource "vat" and the action "read":
<html>
Running...<br>
<?
$data =
array (
'currentPage' => 1,
'itemsPerPage' => 10
);
$hash = sha1(http_build_query($data) . sha1('password'));
$requestData = array(
'code' => 'usercode',
'username' => 'username',
'data' => $data,
'hash' => $hash);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://mktp-stage.emag.ro/api-3/vat/read');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($requestData));
$result = curl_exec($ch);
print($result);
?>
</html>
The API needs authorization and has an IP level filtering. Before testing, vendors should provide a list of
whitelisted IPs. eMAG Marketplace will only allow API calls only from those IPs.
The POST data consist of 4 mandatory keys as following:
REQUEST
Key Description
data Data to be passed to the API. The following document will describe keys.
hash SHA1 hash of URL encoded data concatenated with SHA1 hash of user password.
4
1.3. Pagination and filters
In order to limit the number of items returned, read actions accept pagination by passing to POST data following
parameters:
PAGINATION
itemsPerPage Set number of items to be displayed in one page. Maximum is set to 1000. 100 itemsPerPage=1000
Also, filters can be included in POST to refine result set. Filters vary depending on the resource called and are
exampled on every resource section.
1.4. Response
When an API call is made, the server MUST reply with a response. The response will ALWAYS be JSON formatted
and the header 'Content-type: application/json' will always be passed.
RESPONSE
Key Description
IMPORTANT: Every API request must have a response and the response must contain the key isError and its
value must be false. For each call that does not have the key and false value, we recommend setting up
alerts, as the call most likely was not interpreted. We also recommend logging all calls and the corresponding
API response for a 30 days period.
Every request must have at most 4000 elements. If the call surpasses this limit the call will have a response
with key isError:true and message: Maximum input vars of 4000 exceeded.
5
2. Sending products and offers
We define a product as a list of elements displayed in in eMAG platform for a product page. These elements
are:
Name
Brand
Part number
Description
Images
Product characteristics (and product families)
Category
Barcodes (optional)
Other attachments (optional)
We define an offer as a list of elements required for an offer to be available for a product. These elements are:
Price
VAT rate
Warranty
Numerical stock or availability info
Handling_time
eMAG Marketplace API allows a vendor to:
Every eMAG product has to be included in a certain category. Vendors cannot create new categories or change
existing ones. Also, a vendor can only post products and offers in its allowed categories list.
Reading categories without parameters will generate a response containing the first 100 categories.
When passing a category id, the API will return the category name and the list of available characteristics and
their corresponding IDs, as well as the available product family_types and their corresponding IDs.
Usually, the corresponding categories for a vendors products are provided by eMAG Marketplace vendor
support team. But you can read the categories and their characteristics through the API also.
The resource is category and the available actions are read and count.
6
CATEGORY read
When sending an offer, you have to send the VAT rate id by sending us a valid VAT id.
The resource is vat and the action is read. The API will return the list of available VAT rates and their corresponding ids.
7
2.3. Sending a new product
Sending a product for the first time requires you to send the entire product documentation and all the offer
data. Please note that creating new products implies human validation, so a new product will not be displayed
in eMAG platform immediately.
The products that are not compliant with eMAG Documentation Standard will not pass the human validation;
in this case you will be notified by our support team. The eMAG Documentation Standard that is available upon
request for each category, and it contains the best practices for documenting a product.
In order to send a new product, the resource is product_offer and the available action is save.
category_id Product category eMAG id. Required. Integer between 1 category _id=506
and 65535.
8
PRODUCT OFFER save and create/update product
name Required. Vendor Family name. Required if family id is not name="Test product"
equal to 0;
9
PRODUCT OFFER save and create/update product
warranty The warranty offered in months. Optional. Default value 0 (no warranty=24
warranty). Integer between 0
and 255.
10
PRODUCT OFFER save and create/update product
0=>{
warehouse_id=1,
id=3}}
stock warehouse_id The id of the warehouse. Required inside stock array. warehouse_id=1
Use warehouse_id=1 for only one Integer.
warehouse.
stock value Offer available quantity. Required inside stock array. value=20
Integer between 0 and 65535.
If present, stock overwrites
availability_id.
handling_time value Handling time, in number of days Required inside handling_time value=0
counted from the day the order array. Integer value between 0
was received. If handling_time = 0 and 255. Default value = 0.
the order will be shipped the same
day it is received.
11
PRODUCT OFFER save and create/update product
value The commission without VAT for a Required. Float with 4 value=12,1234
finalized order of the containing decimals. If type= percentage
offer. the value should be between 0
and 100.
sale_price
recommended_price
stock
handling_time
commission
vat_id
warranty
status
availability
vat_id Vendor offer VAT rate id. Use Required. Integer. Ex: vat _id=1
/vat/read to display possible
values.
12
IMPORTANT:
In order to change a previously sent product image or attachment the url should be different from the
one already sent. We reload the images only if the URL differs.
We recommend as a best practice sending one product in each product_offer call and multi-threading
requests rather than sending multiple at once. Also, we recommend sending the product data only upon
product create/update, as there is no need to resend product unless it changed. Also we recommend
sending the offer data upon changing (no matter the frequency) and at least weekly (even if the offer is
the same) rather using periodical sending (crons, agents). You should program marketing campaigns
using start_date campaign. Also please offer the possibility for an offer to be attached to an existing
eMAG product (using part_number_key).
When adding a product to a family
o The category id of a product and the category id of its family type (family_type_id) must be the
same.
o All characteristics that define a family must be present and must have a valid value
o All characteristics that define a family must have a single value
o If a family is not valid, you will receive a warning response, but the product will be saved/updated
o When moving a product from one family to another you only have to send the product with its
new family type, id and name and make sure you follow the same rules as above
Array(
Array(
"id" => "6050",
"family" => Array(
"id" => 111,
"family_type_id" => 97,
"name" => "test_family "
),
"category_id" => "1315",
"part_number" => "test-part-number",
"name" => "Test name",
"description" => "Test description",
"brand" => "Test brand name",
"images" => Array(
Array(
"display_type" => "1",
"url" => "http://www.image-url.test"
)
),
"url" => "http://www.product-url.test",
"status" => "1",
"sale_price" => "406.4515",
"recommended_price" => "506.4515",
"availability" => Array(
Array(
"warehouse_id" => "1",
"id" => "3"
)
),
13
"handling_time" => Array(
Array(
"warehouse_id" => "1",
"value" => "2"
)
),
"stock" => Array(
Array(
"warehouse_id" => "1",
"value" => "2"
)
),
"commission" => Array(
"type" => "percentage",
"value" => "8"
),
"vat_id" => "1",
"characteristics" => Array(
Array(
"id" => "5213",
"value" => "Characteristic 5213 value"
),
Array(
"id" => "1339",
"value" => "Characteristic 1339 1st value"
),
Array(
"id" => "1339",
"value" => " Characteristic 1339 2nd value"
)
)
)
)
When updating an existing offer for a product, you should send only the offer, without the documentation.
Mandatory when updating a product offer are the following keys:
id
status
sale_price
vat_id
commission
availability_id
handling_time
stock
Please note that although the API permits sending the entire documentation on each offer update (price change,
out-of-stock change, etc.) we do not recommend or encourage such a practice.
If you need to deactivate a valid offer on the website, you should send the offer with the status = 0.
Array(
Array(
"id" => "6050",
"family" => Array(
"id" => 111,
14
"family_type_id" => 97,
"name" => "test_family "
),
"category_id" => "1315",
"part_number" => "test-part-number",
"name" => "Test name",
"description" => "Test description",
"brand" => "Test brand name",
"images" => Array(
Array(
"display_type" => "1",
"url" => "http://www.image-url.test"
)
),
"url" => "http://www.product-url.test",
"status" => "1",
"sale_price" => "406.4543",
"sale_price" => "406.45",
"availability" => Array(
Array(
"warehouse_id" => "1",
"id" => "3"
)
),
"handling_time" => Array(
Array(
"warehouse_id" => "1",
"value" => "2"
)
),
"stock" => Array(
Array(
"warehouse_id" => "1",
"value" => "2"
)
),
"commission" => Array(
"type" => "percentage",
"value" => "8"
),
"vat_id" => "1",
)
)
If the product already exists in eMAG catalog, just add the key part_number_key with products
part_number_key. The part_number_key is the last key found in the URL of an eMAG product. It will ALWAYS
have both numbers and characters. Ex: for product http://www.emag.ro/telefon-mobil-nokia-105-black-105-
black/pd/D5DD9BBBM/ the part_number_key is D5DD9BBBM.
If you send the part_number_key the keys category_id, brand, name, part_number become optional.
15
You can have multiple warehouses the products are shipped from. For defining these warehouses, you have to
contact eMAG Marketplace and we will define the warehouses for you. The resource is warehouse and the
available action is read.
The following fields are available for warehouse:
Key Description5 Constraints
contact The warehouse contact person name Required. String value between 1 and 255
phone_1 The warehouse first phone number Required. String value between 8 and 11 digits (only '+' character is allowed at the
beginning of the string)
phone_2 The warehouse second phone number Optional. String value between 8 and 11 digits (only '+' character is allowed at the
beginning of the string)
locality_id The warehouse's locality_id Required. Integer value between 1 and 4294967295.
Must be a valid locality in the eMAG database.
street The warehouse's street Required. String value between 3 and 255
zipcode The warehouse's zipcode Optional. String value between 1 and 255
3. Processing orders
An order consists of customer details, products and discounts from vouchers. It also has information about
payment method, shipping tax. Also, each order always has a status attached. The available statuses are:
0 - canceled
1 - new
2 - in progress
3 - prepared
4 - finalized
5 returned
The resource is order and the available actions are read, save, count and acknowledge.
16
Key Description Constraints Example
id The number that uniquely identifies an order. Required. Integer value between id=939393
1 and 4294967295.
status The order processing status. The possible values are: Required. Integer value between status=1
0 - cancelled 0 and 5.
1 - new
2 - in progress
3 prepared
4 - finalized
5 - returned
payment_mode_id The order payment method. The possible values are: Required. Integer. payment_mode_id=1
1 - COD (cash on delivery)
2 - bank transfer
3 - online card payment
payment_status The online payment status. Only used for online Required only for online payment payment_status=0
payment methods. The possible values are: methods. Integer.
0 - not paid
1 - paid
details A list with additional order details that are not Optional. List.
standard.
customer A list with the details about the customer, the shipping Optional. List. The field list is detailed
and the billing addresses. below.
products A list of arrays describing the products in the order. List. The field list is detailed
below.
id eMAG internal order product line id. Any update Required. Integer value id=123
on order product lines must use this id. between 1 and 9999999.
id=243409
product_id Vendor internal product id. This is the primary Optional. Integer. product_id=3331
key for identifying a product offer.
17
Key level Key level 2 Description Constraints Example
1
status The status of product of the order. The possible Required. Integer. status=1
values are:
0 - cancelled
1 - active
part_number Manufacturer unique identifier for the product. Optional. String between 1 part_number='682133frs'
and 128 characters.
created The date when the order product line was Optional. Text in YYYY- created='2014-07-24
created. mm-dd HH:ii:ss format. 12:16:50'
modified The date when the order product line was last Optional. Text in YYYY- modified='2014-07-24
modified. mm-dd HH:ii:ss format. 12:18:53'
name The name of the attachment displayed to the Optional. String between 1 name=Your invoice #123
customer (in order history or in email) and 60 characters. /01.01.1970
type The type of document attached to the order Integer. Optional. Default type=1
1=Invoice
force_download Flag used in order to force attachment Integer. Optional. Default force_download=1
download restrictions. If value is 0 and the value 0. Possible values:
attachment URL has not changed, the 0,1
attachment will not be downloaded again.
status The status of product of the order. The possible Required. Integer. status=1
values are:
0 - cancelled
1 - active
18
3.1.2. Customer fields in order details
id The number that uniquely identifies a customer. Optional. Integer value id=1
between 1 and2147483647.
email This is a hash that uniquely identifies the Optional. Text. [email protected]
customers email.
company The name of the company. For physical person it Optional. Text. company=Company name ltd.
has the same value as name.
gender The customer gender. The possible values are: Optional. Text. gender=M
M - male
F female
legal_entity A flag indicating if the customer is physical or Optional. Integer value. legal_entity=1
juridical entity. The possible values are:
0 - private entity;
1 - legal entity.
is_vat_payer A flag indicating it the customer is vat payer. The Optional. Integer value. is_vat_payer=0
possible values are>
0 - the customer is not vat payer;
1 - the customer is vat payer.
19
Key Description Constraints Example
billing_locality_id This field uniquely identifies a locality in the Integer value between 1 billing_locality_id=23
eMAG database. and 4294967295.
It represents the billing locality.
shipping_locality_id This field uniquely identifies a locality in the Integer value between 1 shipping_locality_id=23
eMAG database. and 4294967295.
It represents the shipping locality.
When pushing orders into finalized status, you should also send the invoice PDF file location for the specific
order. The following keys should be sent in attachments array in order to display an invoice in the customers
order details: name, url, type.
When a new order is placed in eMAG Marketplace for the first time, its status is 1 (new) and a GET request with
the order id is automatically made to an URL you provide (call-back URL).
Ex: http://valid_url/path?order_id=123
In the next step, you should read the order passing the id previously mentioned and after successfully saving
the order in your database you should notify us by calling back the API using the route MARKETPLACE _URL/api-
3/order/acknowledge/[orderId]. This stops the order notification system for the mentioned order. Unless
acknowledged, we will notify the new orders for up to 48 hours.
IMPORTANT:
Order acknowledge is the only method of marking the order status as in progress.
Clients may ask for an order to be canceled, this will be done by eMAG only if the order was not
acknowledged by the vendor, thus some of the orders may be read directly with status 0 (canceled).
20
New status
Actual status 1 - new 2 - in progress 3 - prepared 4 - finalized 0 - canceled 5 - returned
1 - new No Yes by ACK only No No No No
2 - in progress No Yes Yes Yes Yes No
3 - prepared No No Yes Yes Yes No
4 - finalized No No Yes in 48h max Yes Yes in 48h max Yes in 30 days max
0 - canceled No Yes Yes Yes No No
5 - returned No No No No No No
IMPORTANT:
We recommend setting up a periodical /order/read (cron, agent) that should identify orders that were
not acknowledged. By default on /order/read we expose the last 100 orders, but you can request up to
1000 or use pagination. Do not forget to test the order status matrix against your internal order
workflow. As a best practice you should either acknowledge the order prior the read or re-read the order
after acknowledging it; an order can be modified by eMAG employees upon the clients request as long
as it is not acknowledged.
You can only edit the order when in status 2 (in progress) or 3 (prepared).
Once an order is finalized, you can change its status back to status 3 (prepared) or 0 (canceled) only in
the first 24 hours since finalization.
Order status finalized will be set automatically when issuing the first AWB for that order. See chapter
Saving AWBs.
The order status returned is set automatically when all the products from the initial invoice are
canceled. The change is permitted only within the maximum return timeframe allowed to the customer.
You can read all your orders though the API, using filters.
The following filters are available when counting orders:
Key Description Constraints
id Only the order with this value. Optional. Integer value between 1
and4294967295.
createdBefore Only the orders created before the specified date. Optional. Text in YYYY-mm-dd HH:ii:ss
Can only be set if createdAfter is present. Maximum 1 month format.
difference.
createdAfter Only the orders created after the specified date. Can only be set if Optional. Text in YYYY-mm-dd HH:ii:ss
createdBefore is present. Maximum 1 month difference. format.
modifiedBefore Only the orders modified before the specified date. Can only be set if Optional. Text in YYYY-mm-dd HH:ii:ss
modifiedAfter is present. Maximum 1 month difference. format.
modifiedAfter Only the orders after before the specified date. Can only be set if Optional. Text in YYYY-mm-dd HH:ii:ss
modifiedBefore is present. Maximum 1 month difference. format.
21
Key Description Constraints
status Only the orders with the specified status. It is a single value or a list of Optional. Integer or list.
values.
payment_mode_ id Only the orders with the specified payment method id. It is a single Optional. Integer or list.
value or a list of values.
itemsPerPage The maximum number of orders to return. Optional. Integer value between 1
and 100.
id Only the order with this value. Optional. Integer value between 1
and4294967295.
createdBefore Only the orders created before the specified date. Can only be set if Optional. Text in YYYY-mm-dd
createdAfter is present. Maximum 1 month difference. HH:ii:ss format.
createdAfter Only the orders created after the specified date. Optional. Text in YYYY-mm-dd
HH:ii:ss format.
modifiedBefore Only the orders modified before the specified date. Can only be set if Optional. Text in YYYY-mm-dd
modifiedAfter is present. Maximum 1 month difference. HH:ii:ss format.
modifiedAfter Only the orders after the specified date. Optional. Text in YYYY-mm-dd
HH:ii:ss format.
status Only the orders with the specified status. It is a single value or a list of values. Optional. Integer or list.
payment_mode_id Only the orders with the specified payment method id. It is a single value or a Optional. Integer or list.
list of values.
You cannot create new orders through the API, you can only read and update them. When updating an order,
the vendor should send ALL the fields initially read.
22
'customer' =>
Array (
'id' => 12556,
'name' => 'Name Surname',
'company' => 'Company name',
'gender' => 'M',
'code' => 128312xxxx212,
'email' => '',
'created' => '2014-07-24 12:17:20',
'modified' => '2014-07-24 12:17:32',
'bank' => '',
'iban' => '',
'fax' => '',
'mkt_id' => 312556,
'phone_1' => '0724xxxx32',
'phone_2' => '',
'phone_3' => '',
'registration_number' => '',
'billing_country' => 'RO',
'billing_suburb' => 'Suburb',
'billing_city' => 'City Name',
'billing_locality_id' => 3,
'billing_street' => 'Street,
'billing_postal_code' => '',
'shipping_country' => 'RO',
'shipping_suburb' => 'Suburb',
'shipping_city' => 'City',
'shipping_locality_id' => 3,
'shipping_street' => 'Street',
'shipping_postal_code' => '',
'is_vat_payer' => 1,
'legal_entity' => 0,
),
'details' =>
Array (
),
'attachments' =>
Array (
),
'products' =>
Array (
0 =>
Array (
'id' => 82407,
'product_id' => 1264,
'part_number' => '68133',
'quantity' => 1,
'sale_price' => '967.6613',
'currency' => 'RON',
'created' => '2014-07-24 12:16:50',
'modified' => '2014-07-24 12:17:32',
'status' => 1,
'attachments' =>
Array (
'name' => 'Title displayed to client',
'url' => 'https://valid-url/invoice.pdf',
'type' => '1',
),
'details' =>
Array (
),
'vat' => '0.2400',
),
),
23
'shipping_tax' => '0.0000',
'vouchers' =>
Array (
"id":"1234",
"modified":"2015-04-23 11:30:09",
"created":"2015-04-23 11:30:09",
"status":"1",
"voucher_id":"387361",
"sale_price_vat":"-1.9355",
"sale_price":"-8.0645",
"voucher_name":"eMAG giftcard",
"vat":"0.24"
),
'proforms' =>
Array (
),
),
)
To remove a product from the order send the status=0 for the product or do not send it at all.
To add a new product to an existing order, add it to the order by sending the product id (mandatory), name,
status and sale price.
IMPORTANT: virtual products such as internal discounts can be inserted in an order, even if they were not
previously sent to eMAG. Adding these products to an order will not make them available for purchase in the
eMAG Marketplace platform.
A finalized order cannot be modified; it can have some of the products returned or fully returned.
In the event an entire order is returned, a call must be made with the corresponding storno invoice that has all
the products and their negative quantities in the order. The order will automatically change status from finalized
(4) to returned (5).
If some of the products are returned, a call must be made with the corresponding storno invoice that has the
returned products and their negative quantities in the order. You can send more than one storno invoice per
order, but only within the maximum return timeframe allowed to the customer.
If storno invoices are sent for all the products and their corresponding quantities in the order the order will
automatically change its status from finalized (4) to returned (5).
24
4. Shipping eMAG Marketplace orders
For electronic deliveries and downloadable goods, please skip this section. Shipping an eMAG Marketplace order
requires the vendor to issue an AWB using eMAG Marketplace API.
The resource is AWB and the available actions are read and save
To save an AWB just call the API with the following parameters:
Key Description Constraints
order_id Identifies the order Required. Integer value between 1 and 4294967295.
insured_value The insured value Optional. Double value between 0 and 999999999
weight The weight of delivery Optional. Double value between 0 and 99999
envelope_number Number of envelopes to be delivered Required. Integer value between 0 and 9999. If
parcel_number is 0, this parameter cannot be 0
parcel_number Number of parcels to be delivered Required. Integer value between 0 and 999. If
envelope_number is 0, this parameter cannot be 0
courier_account_id Unique identifier for vendors courier account. If not Optional. Integer.
provided, a default account will be used.
pickup_and_return If set to 1, sender expects something in return to this Optional. Value can only be 0 or 1.
expedition (documents, buy-back products, etc).
saturday_delivery If set to 1, sender requests the package to be delivered on Optional. Value can only be 0 or 1.
Saturday.
sameday_delivery If set to 1, sender requests the package to be delivered the Optional. Value can only be 0 or 1.
same day.
open_on_receipt If set to 1, the parcel/envelope can be opened on receipt. Optional. Value can only be 0 or 1. Default 1.
25
Key Description Constraints
contact Receiver's contact person name Required. String value between 1 and 255
phone1 S/R first phone number Required. String value between 8 and 11 digits (only '+' character is allowed at the
beginning of the string)
phone2 S/R second phone number Optional. String value between 8 and 11 digits (only '+' character is allowed at the
beginning of the string)
To read an existing AWB PDF simply access the URL below and replace code, username with proper values and
hash value with sha1 value of password:
MARKETPLACE_URL/awb/read_pdf?emag_id=awb_id&code=my_code&username=my_username&hash=a28
bb826824c30ffddd47e9dce41dfb6c39bd655
Optional: You can set the paper format on PDF download link by using the parameter "awb_format=A4" in the
link. The possible values are A4, A5 and A6.
In order to issue an AWB you need to submit the correct locality id. You can also use the id from the order.
The resource is locality and the available actions are read and count.
name All localities with this name String of length between 0 and 60
modified All localities modified after this date Date with the 'Y-m-d H:i:s' format
name All localities with this name String of length between 0 and 60
modified All localities modified after this date Date with the 'Y-m-d H:i:s' format
itemsPerPage The maximum number of localities to return. Optional. Integer value between 1 and 100.
currentPage The page offset. Optional. Integer value between 1 and 65535.
modified Last modification date Date with the 'Y-m-d H:i:s' format
emag_id The AWB's eMAG id. Integer value between 1 and 4294967295.
27