6

I want to add a product using the REST API in Magento 2.

How can I achieve this?

3

Example script that create downloadable product

<?php
$curl = curl_init();
$URL = "http://magento.dev";

curl_setopt_array($curl, array(
  CURLOPT_URL => $URL . "/rest/V1/integration/admin/token",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\"username\":\"admin\", \"password\":\"123123q\"}",
  CURLOPT_HTTPHEADER => array(
    "accept: application/json",
    "cache-control: no-cache",
    "content-type: application/json",
    "postman-token: 654c3084-0e0a-b3a1-043f-0960e695e520"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
  die();
} else {
  $key = $response;
}


$data = [
    "product"=> [
        "sku"=> "DownloadableProduct_18sdsd5",
        "name"=> "DownloadableProduct_185",
        "attribute_set_id"=> 4,
        "price"=> "1",
        "status"=> 1,
        "visibility"=> 4,
        "type_id"=> "downloadable",
        "extension_attributes"=> [
            "stock_item"=> [
                "manage_stock"=> 1,
                "is_in_stock"=> 1,
                "qty"=> "10"
            ],
            "downloadable_product_samples"=> [[
                "title"=> "sample1185869143",
                "sort_order"=> "0",
                "sample_type"=> "url",
                "sample_url"=> "http://example.com"
            ]],
            "downloadable_product_links"=> [[
                "title"=> "link-1-185862143",
                "sort_order"=> "1",
                "is_shareable"=> 0,
                "price"=> 2.43,
                "number_of_downloads"=> "2",
                "link_type"=> "url",
                "link_url"=> "http://example.com",
                "sample_type"=> "url",
                "sample_url"=> "http://example.com"
            ]]
        ],
        "custom_attributes"=> [[
            "attribute_code"=> "tax_class_id",
            "value"=> 2
        ], [
            "attribute_code"=> "quantity_and_stock_status",
            "value"=> [
                "qty"=> "10",
                "is_in_stock"=> 1
            ]
        ], [
            "attribute_code"=> "is_virtual",
            "value"=> 1
        ], [
            "attribute_code"=> "url_key",
            "value"=> "downloadableproduct-185892143"
        ], [
            "attribute_code"=> "links_title",
            "value"=> "Links title 185862143"
        ], [
            "attribute_code"=> "links_purchased_separately",
            "value"=> 1
        ], [
            "attribute_code"=> "samples_title",
            "value"=> "Samples185692143"
        ], [
            "attribute_code"=> "links_exist",
            "value"=> 1
        ]]
    ]
];


$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => $URL . "/rest/admin/V1/products/",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $data,
  CURLOPT_HTTPHEADER => array(
    "accept: application/json",
    "content-type: application/json",
    "authorization: Bearer " . $key,
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
| improve this answer | |
  • How to set product images? – Rakesh Jesadiya Jan 2 '17 at 12:39
  • @RakeshJesadiya Do you know how to set images? Please guide me. Thank you. – David Duong Aug 24 '19 at 12:19
2

Is this a good approach or have any other better solution please suggest me.

Currently, I am doing this :

Step1. Generate admin token: I am using token for authorization, so create an admin token using this URL Http://{baseurl}/rest/V1/integration/admin/token

Step2. Add product : For adding the product, I am using following URL http://magentogit.com/rest/V1/products/{SKU} , this is magento2 default API using put method. For example:

http://baseurl/rest/V1/products/B201-SKU

 header:
   Content-Type - application/json
    Authorization - Bearer token

 Body:
{
  "product": {
    "sku": "B201-SKU",
    "name": "B202",
    "price": 30.00,
    "status": 1,
    "type_id": "simple",
    "attribute_set_id":4,
    "weight": 1
  }
}
| improve this answer | |
  • how to add multiple products? – prasad maganti Feb 2 '17 at 7:07
  • Let me check and will let you know shortly... – Manish Feb 3 '17 at 5:13
  • @MagePsycho I wrote my own endpoint to add multiple products by creating a custom extension. Sorry I can't paste complete code here. – Manish Nov 16 '17 at 8:44
1

Example script that create downloadable product

<?php
$curl = curl_init();
$URL = "http://magento.dev";

curl_setopt_array($curl, array(
  CURLOPT_URL => $URL . "/rest/V1/integration/admin/token",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => json_encode(["username"=>"admin", "password"=>"123123q"]),
  CURLOPT_HTTPHEADER => array(
    "accept: application/json",
    "cache-control: no-cache",
    "content-type: application/json",
    "postman-token: 654c3084-0e0a-b3a1-043f-0960e695e520"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
  die();
} else {
  $key = $response;
}


$data = [
    "product"=> [
        "sku"=> "DownloadableProduct_18sdsd5",
        "name"=> "DownloadableProduct_185",
        "attribute_set_id"=> 4,
        "price"=> "1",
        "status"=> 1,
        "visibility"=> 4,
        "type_id"=> "downloadable",
        "extension_attributes"=> [
            "stock_item"=> [
                "manage_stock"=> 1,
                "is_in_stock"=> 1,
                "qty"=> "10"
            ],
            "downloadable_product_samples"=> [[
                "title"=> "sample1185869143",
                "sort_order"=> "0",
                "sample_type"=> "url",
                "sample_url"=> "http://example.com"
            ]],
            "downloadable_product_links"=> [[
                "title"=> "link-1-185862143",
                "sort_order"=> "1",
                "is_shareable"=> 0,
                "price"=> 2.43,
                "number_of_downloads"=> "2",
                "link_type"=> "url",
                "link_url"=> "http://example.com",
                "sample_type"=> "url",
                "sample_url"=> "http://example.com"
            ]]
        ],
        "custom_attributes"=> [[
            "attribute_code"=> "tax_class_id",
            "value"=> 2
        ], [
            "attribute_code"=> "quantity_and_stock_status",
            "value"=> [
                "qty"=> "10",
                "is_in_stock"=> 1
            ]
        ], [
            "attribute_code"=> "is_virtual",
            "value"=> 1
        ], [
            "attribute_code"=> "url_key",
            "value"=> "downloadableproduct-185892143"
        ], [
            "attribute_code"=> "links_title",
            "value"=> "Links title 185862143"
        ], [
            "attribute_code"=> "links_purchased_separately",
            "value"=> 1
        ], [
            "attribute_code"=> "samples_title",
            "value"=> "Samples185692143"
        ], [
            "attribute_code"=> "links_exist",
            "value"=> 1
        ]]
    ]
];


$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => $URL . "/rest/admin/V1/products/",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => json_encode($data),
  CURLOPT_HTTPHEADER => array(
    "accept: application/json",
    "content-type: application/json",
    "authorization: Bearer " . $key,
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
| improve this answer | |
  • how to add multiple products? – prasad maganti Feb 2 '17 at 7:11
  • 1
    Magento does not have batch update api. You can implement it by self or run code in loop. – KAndy Feb 2 '17 at 16:09
0

In order to create product in Magento 2. I assume that you use POSTMAN.

Use this endpoint to generate the token : http://mydomain.localhost/rest/V1/integration/admin/token

Then when you have your token, you are ready to use this endpoint : http://mydomain.localhost/V1/products

Here is how a payload looks like :

{
    "product": {
        "sku": "test",
        "name": "test",
        "attribute_set_id": 4, //chose the attribute set wanted
        "price": 50,
        "status": 1,
        "visibility": 1,
        "type_id": "simple",
        "weight": "0.5",
        "extension_attributes": {
            "category_links": [],
            "stock_item": {
                "qty": "1000",
                "is_in_stock": true,
                "use_config_max_sale_qty": true
            }
        },
        "custom_attributes": [
            {
                "attribute_code": "tax_class_id",
                "value": "2"
            }
        ]
    }
}

Now, If you want to add multiple products, you should use this endpoint : http://mydomain.localhost/rest/async/bulk/V1/products

Here is the payload :

[
    {
        "product": {
            "sku": "product-a",
            "name": "product-a",
            "attribute_set_id": 4,
            "price": 3.99,
            "status": 1,
            "visibility": 1,
            "type_id": "simple",
            "weight": "0.5",
            "extension_attributes": {
                "category_links": [],
                "stock_item": {
                    "qty": "1000",
                    "is_in_stock": true,
                    "use_config_max_sale_qty": true
                }
            },
            "custom_attributes": [
                {
                    "attribute_code": "tax_class_id",
                    "value": "2"
                }
            ]
        }
    },
    {
        "product": {
            "sku": "product-b",
            "name": "product-b",
            "attribute_set_id": 4,
            "price": 3.99,
            "status": 1,
            "visibility": 1,
            "type_id": "simple",
            "weight": "0.5",
            "extension_attributes": {
                "category_links": [],
                "stock_item": {
                    "qty": "1000",
                    "is_in_stock": true,
                    "use_config_max_sale_qty": true
                }
            },
            "custom_attributes": [
                {
                    "attribute_code": "tax_class_id",
                    "value": "2"
                }
            ]
        }
    }
]

In order to use the bulk import, you would need to run the queue. bin/magento queue:consumers:start async.operations.all

If you need to do it in code, basically you need to take the right interface, check the data that the interface needs to work and pass the data

Hope it helps.

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.