swagger: '2.0' info: description: >- Welcome to the Prisync API (proudly version 2.0) documentation. Prisync API is a RESTful API which enables programmatically controlling actions on your Prisync account. **For example**: You can simply integrate your competitor prices from Prisync into your e-commerce software, such as Magento, Opencart or CSCart. --- You can instantly sign up on [prisync.com](https://prisync.com) and get your API credentials. The Prisync API is an application programming interface allowing you to access: * your products, * competitor prices, * competitor URLs, * *SmartPrice*s (See our page explaining Dynamic Pricing Engine and SmartPrice) * and all the other resources within the Prisync cloud with simple, beautiful and easy-to-understand programmatic way via friendly HTTP requests. We worked hard to get most intuitive and most powerful endpoints, to allow you get the data easily or do whatever actions you want. The Prisync V2.0 API aims to provide you all the functions which you are already using on the Prisync Dashboard, be accessible programmatically so that you can automate your complex flows. In this document, we first talk about the general overview about the design, then go into details of endpoints. Each endpoint has clear examples in several programming languages for your convenience. ## Requests HTTP requests can be made with tons of tools, each modern programming language has its own HTTP functions and libraries. Luckily, we are living in a world supporting hyperconnectivity. All the requests should be made with HTTPS to make sure that your data is encrypted. The Prisync API will handle each request in a meaningful manner, depending on the action required. | Method | Usage | | ------ | -------- | | GET | For simple retrieval of information about your account, products, URLs, or any other data, you should use the GET method.

API will respond you with a JSON object. Using the returned information, you can form additional requests. All the GET requests are made read-only, which means making a GET requests cannot change the state of any information stored on Prisync. | | POST | When you want to create an object and store in on the Prisync, you should choose POST method. The POST request includes all of the attributes necessary to create a new object. | ## HTTP Statuses When you make a request to the API, you will get a response including the data you want with standard HTTP statuses, including error codes. In case of an unusual event, such as a record cannot be created because of it already exists, the status code will have an error code. Besides that, the body of the request will contain additional information about the event to provide you the most conventional way to fix the flow. To make it clear, status codes are usually in between 2XX-5XX range. | Status Code | Meaning | | ----------- | ------- | | 2XX | Request is handled successfully, there is no errors. Yay!| | 4XX | There is an issue and we need your attention. A request may return 400 if a required parameter is missing or 404 if the requested record does not exists on earth or if the requested url is wrong. Authorization problems and malformed requests lay in this category as well.| | 5XX | There is a problem on the server-side. It would indicate that we are having an issue or get an unexpected requests. You can always repeat the request.| ## Responses For each successfull and unsuccessfull request, a JSON-formatted response body will be sent back. If you make a request for a single object, say, for a Product, the resource root will be a single object containing the data you requested. If you request a collection, say, a group of Products, response body will contain a collection. ## Rate Limit The number of requests that can be made through the API is currently limited to 2,500 per hour per API token. ## Parameters You should set apikey and apitoken as HTTP request headers on all requests. Your API key is your Prisync login email. You can obtain your apitoken on your Prisync dashboard->account. Most of HTTP GET requests need querystring parameters. Most of HTTP POST requests need POST body parameters. For almost all API requests, we provide examples calls with cURL command. With a single copy and paste, you can always try making a request and see the results. version: 2.0.0 title: Welcome to Prisync API Documentation termsOfService: 'http://swagger.io/terms/' x-logo: url: 'https://app.prisync.com/img/prisync-logo.png' backgroundColor: '#2B3545' securityDefinitions: apikey: type: apiKey in: header name: apikey description: Your e-mail address that you use to login prisync.com. apitoken: type: apiKey in: header name: apitoken description: >- Your API token where you can find in Settings page of your Prisync account. host: prisync.com basePath: /api/v2 produces: - application/json tags: - name: Product description: " A product presenting one of the things that you sell.

Products are the physical goods, digital goods, digital downloads or services which have a unique product page in your e-commerce infrastructure.

Different products have different attributes and several e-commerce CMS'es such as Magento or Shopify uses different labels for the same attributes.

We use the most common attributes to provide to lessen the hassle and make room for the price tracking and dynamic pricing.

Product Attributes

Name: Name of the Product. 'iPhone 8', 'MyBook Laptop core i7 16GB' or 'Sennheiser Wired Headphone Hd 429 (Black)' are examples of a Product name. Naming your Products is up to your business requirements.
Brand: (See Brand)
Category: (See Category)
Product Code: A custom code attribute allowing you matching your database records with the API results. Some companies use SKU's (Stock Keeping Unit), EAN's (International Article Number), GTIN's (Global Trade Item Number), (or ISBN, UPC etc.) as a Product code, as well as the others use custom codes.
Cost: If you provide the cost of a product (the price that you pay to obtain the item from your supplier or the production cost if you produce that item) Prisync will provide you the dynamic pricing features. (See our blog post explaining Dynamic Pricing Engine / SmartPrice features for details. " - name: URL description: " A URL pointing your or one of your competitors product page. Prisync successfully tracks all kinds of product pages from all types of websites so that you should precisely add the product detail page of your own website or your competitor's websites.

Example:
https://www.amazon.com/Hamlet-Folger-Library-Shakespeare-William/dp/074347712X
This is a typical product page, including the name of the product, the image of the product and price/stock information. This is the correct type of URL that should be added.

A Common Mistake:
https://www.amazon.com/Drama-Literature-Fiction-Books/b/?&node=2159
This is NOT a product page, instead, this is a category listing page. This page includes several different products in a single page and Prisync CANNOT guess which product that you want to track. The API allows adding category listing URLs but Prisync will NOT track them.

Another Common Mistake:
https://www.amazon.com
This mistake is actually very similar to the previous one. This URL is NOT a product page URL as well. Amazon sells more than 400 million URLs (2017) and probably you wouldn't want to track all of them. Instead of adding the naked domain name (such as amazon.com, bestbuy.com, amazon.co.uk etc.) you should add the specific URL pointing the product page. You can technically add these type of URLs but Prisync will NOT track them. " - name: Brand description: " The name of the manufacturer or the supplier of one (or several) Products.

Brand names are totally customizable, which means Prisync does not provide you a static Brand list. Instead, you can define your own Brands.

Brands are defined via /add/product endpoint. If the Brand you provided in your add product request already exists in your account, we only add your Product to the given Brand. If the Brand doesn't exists in your account, the API will create that Brand on behalf of you automatically.

So that, there is no need to make extra Brand create requests. " - name: Category description: " A group name including similar Products.

Category names are totally customizable, which means Prisync does not provide you a static Category list. Instead, you can define your own Categories.

Categories are defined via /add/product endpoint. If the Category you provided in your add product request already exists in your account, we only add your Product to the given Category. If the Category doesn't exists in your account, the API will create that Category on behalf of you automatically.

So that, there is no need to make extra Category create requests. " - name: account description: " We provide a brief info about your account via this endpoint. Basically, this endpoint returns your Prisync plan type, number of products that your plan includes and your account status.

" paths: /account: get: summary: Returns account info description: " This endpoint returns your account details.
" operationId: getAccountDetails security: - apikey: [] - apitoken: [] tags: - account x-code-samples: - lang: cURL source: |- curl -X GET https://prisync.com/api/v2/account/ -H 'apikey: Your API_KEY' -H 'apitoken: Your API_TOKEN' - lang: PHP source: |- $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://prisync.com/api/v2/account"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $headers = array(); $headers[] = "apikey: Your API_KEY"; $headers[] = "apitoken: Your API_TOKEN"; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $response = curl_exec($ch); $err = curl_error($ch); curl_close($ch); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } responses: '200': description: An object contains your account details. schema: $ref: '#/definitions/AccountResult' '401': description: Requested account not authorized to access to API. schema: $ref: '#/definitions/Error' '/list/product/startFrom/{startFrom}': get: summary: List all products in your account description: >- This endpoint returns information about the products that have been added to Prisync via web UI or the API. The result is paginated. Each page contains up to 100 products. operationId: listProducts security: - apikey: [] - apitoken: [] parameters: - name: startFrom in: path type: number format: integer description: >- Offset for pagination. It can take 0 and exact multiples of 100 as a value.

**P.S.**: Actually, startFrom is an optional parameter. When not provided, this method returns the first page only. So that, calling without startFrom is equivalent to startFrom/0. required: true tags: - Product x-code-samples: - lang: cURL source: |- curl -X GET https://prisync.com/api/v2/list/product/startFrom/0 -H 'apikey: Your API_KEY' -H 'apitoken: Your API_TOKEN' - lang: PHP source: |- $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://prisync.com/api/v2/list/product/startFrom/0", CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => array( "apikey: Your API_KEY", "apitoken: Your API_TOKEN", ), )); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } responses: '200': description: "An object contains an array of products and next page link." schema: $ref: '#/definitions/ListProduct' '404': description: Requested product list not found. schema: $ref: '#/definitions/Error' '/list/product/summary/startFrom/{startFrom}': get: summary: List all products in your account with price information description: >- This endpoint returns information about the products including price information that have been added to Prisync via web UI or the API. The result is paginated. Each page contains up to 100 products. operationId: listProductsWithPrice security: - apikey: [] - apitoken: [] parameters: - name: summary in: path type: string description: >- A keyword to obtain all price information related to the product. required: true - name: startFrom in: path type: number format: integer description: >- Offset for pagination. It can take 0 and exact multiples of 100 as a value.

**P.S.**: Actually, startFrom is an optional parameter. When not provided, this method returns the first page only. So that, calling without startFrom is equivalent to startFrom/0. required: true tags: - Product x-code-samples: - lang: cURL source: |- curl -X GET https://prisync.com/api/v2/list/product/summary/startFrom/0 -H 'apikey: Your API_KEY' -H 'apitoken: Your API_TOKEN' - lang: PHP source: |- $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://prisync.com/api/v2/list/product/summary/startFrom/0", CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => array( "apikey: Your API_KEY", "apitoken: Your API_TOKEN", ), )); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } responses: '200': description: "An object contains an array of products with price summary information and next page link." schema: $ref: '#/definitions/ListProductWithSummary' '404': description: Requested product list not found. schema: $ref: '#/definitions/Error' '/list/smartprice/startFrom/{startFrom}': get: summary: List SmartPrices for all products in your account description: >- This endpoint returns product id, product code, barcode and SmartPrice information about the products that have been added to Prisync via web UI or the API. The result is paginated. Each page contains up to 100 products. operationId: listProductsWithSmartPrice security: - apikey: [] - apitoken: [] parameters: - name: startFrom in: path type: number format: integer description: >- Offset for pagination. It can take 0 and exact multiples of 100 as a value.

**P.S.**: Actually, startFrom is an optional parameter. When not provided, this method returns the first page only. So that, calling without startFrom is equivalent to startFrom/0. required: true tags: - Product x-code-samples: - lang: cURL source: |- curl -X GET https://prisync.com/api/v2/list/smartprice/startFrom/0 -H 'apikey: Your API_KEY' -H 'apitoken: Your API_TOKEN' - lang: PHP source: |- $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://prisync.com/api/v2/list/smartprice/startFrom/0", CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => array( "apikey: Your API_KEY", "apitoken: Your API_TOKEN", ), )); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } responses: '200': description: "An object contains an array of products with product id and SmartPrice information and next page link." schema: $ref: '#/definitions/ListSmartPrice' '404': description: Requested SmartPrice list not found. schema: $ref: '#/definitions/Error' '/list/brand/startFrom/{startFrom}': get: summary: List all brands in the store description: >- This endpoint returns list of your brands. The response is paginated and it can show 100 brands at a time. operationId: listBrands security: - apikey: [] - apitoken: [] parameters: - name: startFrom in: path description: >- Offset for pagination. It can take 0 and exact multiples of 100 as a value.

**P.S.**: Actually, startFrom is an optional parameter. When not provided, this method returns the first page only. So that, calling without startFrom is equivalent to startFrom/0. required: true type: number format: integer tags: - Brand x-code-samples: - lang: cURL source: |- curl -X GET https://prisync.com/api/v2/list/brand/startFrom/0 -H 'apikey: Your API_KEY' -H 'apitoken: Your API_TOKEN' - lang: PHP source: |- $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://prisync.com/api/v2/list/brand/startFrom/0", CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => array( "apikey: Your API_KEY", "apitoken: Your API_TOKEN", ), )); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } responses: '200': description: "An object contains an array of brands and next page link." schema: $ref: '#/definitions/ListBrand' '404': description: Requested brand list not found. schema: $ref: '#/definitions/Error' '/list/category/startFrom/{startFrom}': get: summary: List all categories in the store description: >- This endpoint returns list of your categories. The response is paginated and it can show 100 categories at a time. operationId: listCategories security: - apikey: [] - apitoken: [] parameters: - name: startFrom in: path description: >- Offset for pagination. It can take 0 and exact multiples of 100 as a value.

**P.S.**: Actually, startFrom is an optional parameter. When not provided, this method returns the first page only. So that, calling without startFrom is equivalent to startFrom/0. required: true type: number format: integer tags: - Category x-code-samples: - lang: cURL source: |- curl -X GET https://prisync.com/api/v2/list/category/startFrom/0 -H 'apikey: Your API_KEY' -H 'apitoken: Your API_TOKEN' - lang: PHP source: |- $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://prisync.com/api/v2/list/category/startFrom/0", CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => array( "apikey: Your API_KEY", "apitoken: Your API_TOKEN", ), )); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } responses: '200': description: "An object contains an array of categories and next page link." schema: $ref: '#/definitions/ListCategory' '404': description: Requested category list not found. schema: $ref: '#/definitions/Error' '/get/product/id/{id}': get: summary: Get a particular product description: " This endpoint returns product info with given id. " operationId: getProductByID security: - apikey: [] - apitoken: [] parameters: - name: id in: path description: Unique id of the product required: true type: number format: integer tags: - Product x-code-samples: - lang: cURL source: |- curl -X GET https://prisync.com/api/v2/get/product/id/1 -H 'apikey: Your API_KEY' -H 'apitoken: Your API_TOKEN' - lang: PHP source: |- $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://prisync.com/api/v2/get/product/id/1", CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => array( "apikey: Your API_KEY", "apitoken: Your API_TOKEN", ), )); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } responses: '200': description: A product object contains attached URL ids. schema: $ref: '#/definitions/SingleProduct' '404': description: Requested product not found. schema: $ref: '#/definitions/Error' '/get/brand/id/{id}': get: summary: Get a specific brand description: " This endpoint returns brand info with given id.
" operationId: getBrandByID security: - apikey: [] - apitoken: [] parameters: - name: id in: path description: Unique id of the brand required: true type: number format: integer tags: - Brand x-code-samples: - lang: cURL source: |- curl -X GET https://prisync.com/api/v2/get/brand/id/1 -H 'apikey: Your API_KEY' -H 'apitoken: Your API_TOKEN' - lang: PHP source: |- $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://prisync.com/api/v2/get/brand/id/1", CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => array( "apikey: Your API_KEY", "apitoken: Your API_TOKEN", ), )); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } responses: '200': description: A brand object contains unique id and name. schema: $ref: '#/definitions/Brand' '404': description: Requested brand not found. schema: $ref: '#/definitions/Error' '/get/category/id/{id}': get: summary: Get a specific category description: "This endpoint returns category info with given id.
" operationId: getCategoryByID security: - apikey: [] - apitoken: [] parameters: - name: id in: path description: Unique id of the category required: true type: number format: integer tags: - Category x-code-samples: - lang: cURL source: |- curl -X GET https://prisync.com/api/v2/get/category/id/1 -H 'apikey: Your API_KEY' -H 'apitoken: Your API_TOKEN' - lang: PHP source: |- $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://prisync.com/api/v2/get/category/id/1", CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => array( "apikey: Your API_KEY", "apitoken: Your API_TOKEN", ), )); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } responses: '200': description: A category object contains unique id and name. schema: $ref: '#/definitions/Category' '404': description: Requested category not found. schema: $ref: '#/definitions/Error' '/get/url/id/{id}': get: summary: Get a specific URL description: " This endpoint returns URL info with given id.

Tip:

When you want to get all URLs belonging to a particular product, first you should make a request for getting the details of the product (See get product.). That request will return an array of URL id's in the response. Using those URL id's, you can get exact URL (the actual address) using this endpoint. " operationId: getURLByID security: - apikey: [] - apitoken: [] parameters: - name: id in: path description: Unique id of the URL required: true type: number format: integer tags: - URL x-code-samples: - lang: cURL source: |- curl -X GET https://prisync.com/api/v2/get/url/id/1 -H 'apikey: Your API_KEY' -H 'apitoken: Your API_TOKEN' - lang: PHP source: |- $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://prisync.com/api/v2/get/url/id/1", CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => array( "apikey: Your API_KEY", "apitoken: Your API_TOKEN", ), )); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } responses: '200': description: A URL object contains unique id and url. schema: $ref: '#/definitions/Url' '404': description: Requested URL not found. schema: $ref: '#/definitions/Error' /add/product: post: summary: Add a new product description: >- This end point can be used on adding a new product to your Prisync account. operationId: addProduct security: - apikey: [] - apitoken: [] consumes: - multipart/form-data parameters: - name: name in: formData description: Product name required: true type: string example: iPhone 13 - name: brand in: formData description: Brand name required: true type: string example: Apple - name: category in: formData description: Category name required: true type: string example: Mobile Phones - name: product_code in: formData description: Product code required: false type: string example: AP12-PRO - name: barcode in: formData description: Barcode required: false type: string example: 194252022191 - name: cost in: formData description: Product cost required: false type: string example: '859' - name: additional_cost in: formData description: Additional cost required: false type: string example: '40' - name: tags in: formData description: Product tags required: false type: string example: Tag1, tag2, tag name4, tag_name3 tags: - Product x-code-samples: - lang: cURL source: |- curl -X POST https://prisync.com/api/v2/add/product/ -H 'apikey: Your API_KEY' -H 'apitoken: Your API_TOKEN' -H 'content-type: multipart/form-data' -F 'name=Test Product' -F 'brand=Test Brand' -F 'category=Test Category' -F 'product_code=TST001' -F 'barcode=194252022191' -F 'cost=100' -F 'additional_cost=40' -F 'tags=Tag1, tag2, tag name4, tag_name3' - lang: PHP source: >- $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://prisync.com/api/v2/add/product/"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); $data = array(); $data["name"] = "Test Product"; $data["brand"] = "Test Brand"; $data["category"] = "Test Category"; $data["product_code"] = "TST001"; $data["barcode"] = "194252022191"; $data["cost"] = "100"; $data["additional_cost"] = "40"; $data["tags"] = "Tag1, tag2, tag name4, tag_name3"; $headers = array(); $headers[] = "apikey: Your API_KEY"; $headers[] = "apitoken: Your API_TOKEN"; $headers[] = "Content-Type: multipart/form-data"; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $response = curl_exec($ch); $err = curl_error($ch); curl_close($ch); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } responses: '200': description: >- A successful response object contains unique id of the new product and result status. schema: $ref: '#/definitions/SuccessResult' '400': description: Missing or incorrect parameter. schema: $ref: '#/definitions/Error' '404': description: Requested object not found. schema: $ref: '#/definitions/Error' '405': description: This method is not allowed. schema: $ref: '#/definitions/Error' '422': description: This object already exists. schema: $ref: '#/definitions/Error' /add/url: post: summary: Add a new URL to given product description: " Add a URL to a particular product. You can add your own URL or a competitor's URL to one of your products.

Tip

Let's say you want to add your first product (e.g. MyBook Laptop Core i7 16GB) using the API. First, you should add a product using add product endpoint. Add product endpoint returns the newly created product's id in the response. Now it's time to add your own URL. For the sake of the example, let's assume your website is 'https://mybook.com' and the product page of MyBook Laptop Core i7 16GB is 'https://mybook.com/187728/MyBook-Corei7-16GB'.

At this point, you have a product id and a URL address. Just make a request to add URL endpoint and voilĂ . You've just starting tracking your first product and your first URL.

Now you can add your competitors URLs using the same product id, then Prisync will going to handle the rest, collect the data automatically. " operationId: addURLToGivenProduct security: - apikey: [] - apitoken: [] consumes: - multipart/form-data parameters: - name: product_id in: formData description: Product id which you want to add a URL. required: true type: integer example: '86493' - name: url in: formData description: Url required: true type: string example: 'https://www.amazon.com/apple-iphone-13' tags: - URL x-code-samples: - lang: cURL source: |- curl -X POST https://prisync.com/api/v2/add/url/ -H 'apikey: Your API_KEY' -H 'apitoken: Your API_TOKEN' -F 'product_id=123' -F 'url=http://example.com/product/1' - lang: PHP source: >- $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://prisync.com/api/v2/add/url/"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); $data = array(); $data["product_id"] = "123"; $data["url"] = "http://example.com/product/1"; $headers = array(); $headers[] = "apikey: Your API_KEY"; $headers[] = "apitoken: Your API_TOKEN"; $headers[] = "Content-Type: multipart/form-data"; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $response = curl_exec($ch); $err = curl_error($ch); curl_close($ch); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } responses: '200': description: >- A successful response object contains unique id of the new URL and result status. schema: $ref: '#/definitions/SuccessResult' '400': description: Missing or incorrect parameter. schema: $ref: '#/definitions/Error' '404': description: Requested object not found. schema: $ref: '#/definitions/Error' '405': description: This method is not allowed. schema: $ref: '#/definitions/Error' '422': description: This object already exists. schema: $ref: '#/definitions/Error' /add/batch: post: summary: Create multiple products (bulk add) description: "This endpoint can be used on adding more than one product at a time.

You can make a request to this endpoint whenever you want to add more than one product. Instead of writing for loops around /add/product calls, you can wrap your all products into just a single request.

This request is very similar to /add/product, the only difference lays in the parameter structure. Instead of only one product name, brand, category, product_code and price, you need to add an array of those.

A clear example adding two products in a single request is shown on the right hand side of this page. " operationId: importProducts security: - apikey: [] - apitoken: [] consumes: - multipart/form-data parameters: - name: productList in: formData description: " This is a list of products where you need to add each product is an element of the parameter array and each element should contain name, brand, category, product_code and cost fields. (See the example on the right column.)

You can see an example of product from here. " required: true type: array items: type: array items: type: string collectionFormat: multi - name: cancelOnPackageLimitExceeding in: formData description: "We do not accept package limit exceeding requests by default. You can set this parameter to **false** if you want to import first allowed number of products.

**E.g.** Your package limit is 1000 products and you have 850 products already in your panel.

If you try to import 500 new products, it will cause an error (422 - Package limit exceeded) by default.

If this parameter set as **false**, system will import first 150 products. " default: 'true' type: string enum: ['true', 'false'] tags: - Product x-code-samples: - lang: cURL source: |- curl -X POST https://prisync.com/api/v2/add/batch/ -H 'apikey: Your API_KEY' -H 'apitoken: Your API_TOKEN' -H 'content-type: multipart/form-data' -F 'product0[name]=Test Product 1' -F 'product0[brand]=Test Brand' -F 'product0[category]=Test Category' -F 'product0[product_code]=TST001' -F 'product0[barcode]=194252022191' -F 'product0[cost]=100' -F 'product0[additional_cost]=20' -F 'product1[name]=Test Product 2' -F 'product1[brand]=Test Brand 2' -F 'product1[category]=Test Category 2' -F 'product1[product_code]=TST002' -F 'product1[barcode]=194252022192' -F 'product1[cost]=200' -F 'product1[additional_cost]=40' -F 'cancelOnPackageLimitExceeding=false' - lang: PHP source: >- $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://prisync.com/api/v2/add/batch/"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); $product1 = $product2 = $data = array(); $product1["name"] = "Test Product 1"; $product1["brand"] = "Test Brand"; $product1["category"] = "Test Category"; $product1["product_code"] = "TST001"; $product1["barcode"] = "194252022191"; $product1["cost"] = "100"; $product1["additional_cost"] = "20"; $product2["name"] = "Test Product 2"; $product2["brand"] = "Test Brand 2"; $product2["category"] = "Test Category 2"; $product2["product_code"] = "TST002"; $product2["barcode"] = "194252022192"; $product2["cost"] = "200"; $product1["additional_cost"] = "40"; $cancelOnPackageLimitExceeding = "false"; $data['product1'] = $product1; $data['product2'] = $product2; $data['cancelOnPackageLimitExceeding'] = $cancelOnPackageLimitExceeding; $headers = array(); $headers[] = "apikey: Your API_KEY"; $headers[] = "apitoken: Your API_TOKEN"; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); $response = curl_exec($ch); $err = curl_error($ch); curl_close($ch); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } responses: '200': description: A successful response object contains progress result. schema: $ref: '#/definitions/ProgressResult' '400': description: "Missing or incorrect parameter. / Post data is empty, it should not be empty." schema: $ref: '#/definitions/Error' '422': description: "This list already in the process queue. / Package limit exceeded." schema: $ref: '#/definitions/Error' '/edit/brand/id/{id}': post: summary: Change the name of a particular brand description: " This endpoint can be used on editing brand name with given id.
" operationId: editBrandByID security: - apikey: [] - apitoken: [] consumes: - multipart/form-data parameters: - name: id in: path description: Unique id of the brand required: true type: number format: integer example: '8762' - name: name in: formData description: New brand name required: true type: string example: Samsung tags: - Brand x-code-samples: - lang: cURL source: |- curl -X POST https://prisync.com/api/v2/edit/brand/id/123 -H 'apikey: Your API_KEY' -H 'apitoken: Your API_TOKEN' -H 'content-type: multipart/form-data' -F 'name=Test Brand' - lang: PHP source: >- $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://prisync.com/api/v2/edit/brand/id/123"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); $data = array(); $data["name"] = "Test Brand"; $headers = array(); $headers[] = "apikey: Your API_KEY"; $headers[] = "apitoken: Your API_TOKEN"; $headers[] = "Content-Type: multipart/form-data"; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $response = curl_exec($ch); $err = curl_error($ch); curl_close($ch); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } responses: '200': description: >- A successful response object contains unique id of the brand and result status. schema: $ref: '#/definitions/SuccessResult' '400': description: Missing or incorrect parameter. schema: $ref: '#/definitions/Error' '404': description: Requested object not found. schema: $ref: '#/definitions/Error' '405': description: This method is not allowed. schema: $ref: '#/definitions/Error' '/edit/category/id/{id}': post: summary: Change the name of a particular category description: " This endpoint can be used on editing category name with given id.
" operationId: editCategoryByID security: - apikey: [] - apitoken: [] consumes: - multipart/form-data parameters: - name: id in: path description: Unique id of the category required: true type: number format: integer example: '4953' - name: name in: formData description: New category name required: true type: string example: Computers tags: - Category x-code-samples: - lang: cURL source: |- curl -X POST https://prisync.com/api/v2/edit/category/id/123 -H 'apikey: Your API_KEY' -H 'apitoken: Your API_TOKEN' -H 'content-type: multipart/form-data' -F 'name=Test Category' - lang: PHP source: >- $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://prisync.com/api/v2/edit/category/id/123"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); $data = array(); $data["name"] = "Test Category"; $headers = array(); $headers[] = "apikey: Your API_KEY"; $headers[] = "apitoken: Your API_TOKEN"; $headers[] = "Content-Type: multipart/form-data"; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $response = curl_exec($ch); $err = curl_error($ch); curl_close($ch); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } responses: '200': description: >- A successful response object contains unique id of the category and result status. schema: $ref: '#/definitions/SuccessResult' '400': description: Missing or incorrect parameter. schema: $ref: '#/definitions/Error' '404': description: Requested object not found. schema: $ref: '#/definitions/Error' '405': description: This method is not allowed. schema: $ref: '#/definitions/Error' '/edit/product/id/{id}': post: summary: >- Edit Product description: >- This endpoint can be used for changing name, brand, category, product code, barcode or product cost of given product.

This is a overwriting operation. The product will be updated with the new values that you send within the request.

You can edit one or more (or even all) attribute(s) of a product in a single request. Product id is a read-only value so that it is immutable.

operationId: editProductByID security: - apikey: [] - apitoken: [] consumes: - multipart/form-data parameters: - name: id in: path description: Unique id of the product required: true type: number format: integer example: '201206' - name: name in: formData description: Product name required: false type: string example: Samsung S8 - name: brand in: formData description: Brand name required: false type: string example: Samsung - name: category in: formData description: Category name required: false type: string example: Mobile Phones - name: tags in: formData description: Product tags. Previous tags will be removed and replaced with these. required: false type: string example: Tag1, tag2, tag name4, tag_name3 - name: product_code in: formData description: Product code required: false type: string example: G950F - name: barcode in: formData description: Barcode required: false type: string example: 194252022191 - name: cost in: formData description: Product cost required: false type: string example: '549' - name: additional_cost in: formData description: Additional cost required: false type: string example: '40' tags: - Product x-code-samples: - lang: cURL source: |- curl -X POST https://prisync.com/api/v2/edit/product/id/123 -H 'apikey: Your API_KEY' -H 'apitoken: Your API_TOKEN' -H 'content-type: multipart/form-data' -F 'name=Test Product Edit' -F 'brand=Test Brand' -F 'category=Test Category' -F 'tags=Tag1, tag2, tag name4, tag_name3' -F 'product_code=TST004' -F 'barcode=194252022191' -F 'cost=299' -F 'additional_cost=40' - lang: PHP source: >- $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://prisync.com/api/v2/edit/product/id/123"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); $data = array(); $data["name"] = "Test Product Edit"; $data["brand"] = "Test Brand"; $data["category"] = "Test Category"; $data["tags"] = "Tag1, tag2, tag name4, tag_name3"; $data["product_code"] = "TST004"; $data["cost"] = "299"; $data["additional_cost"] = "40"; $headers = array(); $headers[] = "apikey: Your API_KEY"; $headers[] = "apitoken: Your API_TOKEN"; $headers[] = "Content-Type: multipart/form-data"; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $response = curl_exec($ch); $err = curl_error($ch); curl_close($ch); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } responses: '200': description: >- A successful response object contains unique id of the product and result status. schema: $ref: '#/definitions/SuccessResult' '400': description: Missing or incorrect parameter. schema: $ref: '#/definitions/Error' '404': description: Requested object not found. schema: $ref: '#/definitions/Error' '405': description: This method is not allowed. schema: $ref: '#/definitions/Error' '422': description: This object already exists. schema: $ref: '#/definitions/Error' '/delete/product/id/{id}': post: summary: Delete given product and all of attached URLs description: "This endpoint can be used on delete product with given id.

P.S. Product deletion requires further cleaning so that it may take a few seconds to finish the request." operationId: deleteProductByID security: - apikey: [] - apitoken: [] parameters: - name: id in: path description: Unique id of the product required: true type: number format: integer example: '29765' tags: - Product x-code-samples: - lang: cURL source: |- curl -X POST https://prisync.com/api/v2/delete/product/id/123 -H 'apikey: Your API_KEY' -H 'apitoken: Your API_TOKEN' - lang: PHP source: >- $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://prisync.com/api/v2/delete/product/id/123"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); $headers = array(); $headers[] = "apikey: Your API_KEY"; $headers[] = "apitoken: Your API_TOKEN"; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $response = curl_exec($ch); $err = curl_error($ch); curl_close($ch); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } responses: '200': description: A successful response object contains result status. schema: $ref: '#/definitions/SuccessDeleteResult' '404': description: Requested object not found. schema: $ref: '#/definitions/Error' '405': description: This method is not allowed. schema: $ref: '#/definitions/Error' '/delete/url/id/{id}': post: summary: Delete given URL description: " This endppoint can be used on delete url with given id.

Tip

The web is a dynamic environment. Products go out of stock, even they are not sold anymore. Websites move products to different URLs and old URLs start to respond with 404s. Or else, URL structures change all the time.

You can always delete URLs from your account. To delete a URL, you need its URL id. Just make a get request to the product that URL belongs to (using /get/product/id/{id} endpoint) and obtain the id of the URL.

Now you can use /delete/url endpoint to delete the URL. Don't forget to provide the URL id that you've just obtained. " operationId: deleteURLByID security: - apikey: [] - apitoken: [] parameters: - name: id in: path description: Unique id of the URL required: true type: number format: integer example: '785764' tags: - URL x-code-samples: - lang: cURL source: |- curl -X POST https://prisync.com/api/v2/delete/url/id/123 -H 'apikey: Your API_KEY' -H 'apitoken: Your API_TOKEN' - lang: PHP source: >- $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://prisync.com/api/v2/delete/url/id/123"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); $headers = array(); $headers[] = "apikey: Your API_KEY"; $headers[] = "apitoken: Your API_TOKEN"; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $response = curl_exec($ch); $err = curl_error($ch); curl_close($ch); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } responses: '200': description: A successful response object contains result status. schema: $ref: '#/definitions/SuccessDeleteResult' '404': description: Requested object not found. schema: $ref: '#/definitions/Error' '405': description: This method is not allowed. schema: $ref: '#/definitions/Error' /progress/batchImport: get: summary: Get status of a batch import description: 'This endpoint returns progress status of batch import product.
/add/batch request works asynchronously which means it returns success immediately, then it adds all the products into a buffer queue, and finally it saves products into Prisync database. You can query this endpoint to get current status of your bulk add. ' operationId: importProgress security: - apikey: [] - apitoken: [] tags: - Product x-code-samples: - lang: cURL source: |- curl -X GET https://prisync.com/api/v2/progress/batchImport -H 'apikey: Your API_KEY' -H 'apitoken: Your API_TOKEN' - lang: PHP source: >- $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://prisync.com/api/v2/progress/batchImport"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $headers = array(); $headers[] = "apikey: Your API_KEY"; $headers[] = "apitoken: Your API_TOKEN"; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $response = curl_exec($ch); $err = curl_error($ch); curl_close($ch); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } responses: '200': description: A successful response object contains result status. schema: $ref: '#/definitions/ProgressResult' '500': description: A general error occurred. schema: $ref: '#/definitions/Error' definitions: ListProduct: type: object properties: results: type: array description: A list of Product objects. items: $ref: '#/definitions/Product' nextURL: type: string description: " For a paginated result, returns the link of the next page so that you can iterate over pages without calculating the number of pages in the result. Returns null if there is no next page. " ListProductWithSummary: type: object properties: results: type: array description: A list of Product objects with price summary information. items: $ref: '#/definitions/ProductWithSummary' nextURL: type: string description: " For a paginated result, returns the link of the next page so that you can iterate over pages without calculating the number of pages in the result. Returns null if there is no next page. " ListSmartPrice: type: object properties: results: type: array description: A list of Product objects with product id and SmartPrice information. items: $ref: '#/definitions/SmartPrice' nextURL: type: string description: " For a paginated result, returns the link of the next page so that you can iterate over pages without calculating the number of pages in the result. Returns null if there is no next page. " ListBrand: type: object properties: results: type: array description: An array of brand objects. items: $ref: '#/definitions/Brand' nextURL: type: string description: Next page request link. ListCategory: type: object properties: results: type: array description: An array of category objects. items: $ref: '#/definitions/Category' nextURL: type: string description: Next page request link. Product: type: object required: - id - name - brand - category properties: id: type: number format: integer description: Unique identifier representing a specific product. example: '435' name: type: string description: Name of product. example: Product Test XQ1899 category: $ref: '#/definitions/Category' brand: $ref: '#/definitions/Brand' product_code: type: string description: Unique product code. example: XQ1899 barcode: type: string description: Barcode of product. example: 194252022191 cost: type: string description: Product cost. example: '499' additional_cost: type: string description: Additional cost. example: '40' tags: type: string description: Product tags. example: 'Tag1, tag2, tag name4, tag_name3' my_position: type: string description: 'My Position' example: 'cheapest' ProductWithSummary: type: object required: - id - name - brand - category properties: id: type: number format: integer description: Unique identifier representing a specific product. example: '435' name: type: string description: Name of product. example: Product Test XQ1899 category: $ref: '#/definitions/Category' brand: $ref: '#/definitions/Brand' product_code: type: string description: Unique product code. example: XQ1899 barcode: type: string description: Barcode of product. example: 194252022191 cost: type: string description: Product cost. example: '499' additional_cost: type: string description: Additional cost. example: '40' tags: type: string description: Product tags. example: 'Tag1, tag2, tag name4, tag_name3' summary: $ref: '#/definitions/Summary' my_position: type: string description: 'My Position' example: 'cheapest' my_position_total_price: type: string description: 'My Position Total Price' example: 'cheapest' SmartPrice: type: object properties: product_id: type: number format: integer description: Unique identifier representing a specific product. example: '135' product_code: type: string description: Unique product code. example: XQ1899 barcode: type: string description: Barcode of product. example: 194252022191 smart_price: type: string description: >- SmartPrice. For more information please visit [our blog post.](https://prisync.com/blog/smart-pricing/) example: '1,299.90' my_position: type: string description: 'My Position' example: 'cheapest' Brand: type: object required: - id - name properties: id: type: number format: integer description: Unique identifier representing a specific brand. example: '9868' name: type: string description: Name of brand. example: Apple Category: type: object required: - id - name properties: id: type: number format: integer description: Unique identifier representing a specific category. example: '2536' name: type: string description: Name of category. example: Mobile Phones Summary: type: object properties: competitor_1: type: object description: Fully qualified domain name of the competitor_1 URL. (e.g. "amazon.com" or "bestbuy.com") properties: price: type: string description: Competitor price for the product. total_price: type: string description: Competitor total price for the product. stock: type: string description: Stock information.(true => in stock, false => no stock.) competitor_2: type: object description: Fully qualified domain name of the competitor_2 URL. (e.g. "amazon.com" or "bestbuy.com") properties: price: type: string description: Competitor price for the product. total_price: type: string description: Competitor total price for the product. stock: type: string description: Stock information.(true => in stock, false => no stock.) competitor_N: type: object description: Fully qualified domain name of the competitor_N URL. (e.g. "amazon.com" or "bestbuy.com") properties: price: type: string description: Competitor price for the product. total_price: type: string description: Competitor total price for the product. stock: type: string description: Stock information.(true => in stock, false => no stock.) example: amazon.com: price: '766.00' total_price: '786.00' stock: true bestbuy.com: price: '786.00' total_price: '799.00' stock: true SingleProduct: type: object required: - id - name - brand - category properties: id: type: number format: integer description: Unique identifier representing a specific product. example: '24612' name: description: Name of the product. type: string example: Samsung S8 category: $ref: '#/definitions/Category' brand: $ref: '#/definitions/Brand' product_code: type: string description: Unique product code. example: XQ1899 barcode: type: string description: Barcode of product. example: 194252022191 cost: type: string description: Product cost. example: '499' additional_cost: type: string description: Additional cost. example: '40' tags: type: string description: Product tags. example: 'Tag1, tag2, tag name4, tag_name3' external_ref: type: integer description: 'External reference id for products imported from 3rd party apps. Ignore it safely if you are developing for your own CMSs integration. You can always prefer using product_code attribute of Product object.' example: '75643231' smart_price: type: string description: >- SmartPrice. For more information please visit [our blog post.](https://prisync.com/blog/smart-pricing/) example: '799' my_position: type: string description: 'My Position' example: 'cheapest' urls: type: array items: type: integer example: - '3467' - '47387' Url: type: object required: - id - url properties: id: type: number format: integer description: Unique identifier representing a specific URL. example: '54674' url: type: string description: URL of url. example: 'http://www.amazon.com/samsung-s8' price: type: number format: float description: Competitor price for the product. example: '769.99' in_stock: type: integer description: Stock information. (1 => in stock, 0 => no stock.) example: '1' last_check: type: string description: The last datetime that Prisync retrieved this competitor. (Format => YYYY-MM-DD HH:MM:SS) example: '2017-10-21 11:22:21' change_day: type: number format: float description: Daily price change percent of this competitor for the product. example: '0.02' currency: type: string description: Currency of competitor website. example: 'USD' last_changed: type: string description: Datetime indicating the last price change date. (Format => DD/MM/YYYY) example: '21/10/2017' old_price: type: number format: float description: Last known price before the detected price change. example: '754.75' SuccessResult: type: object required: - id - result properties: id: type: number format: integer description: Unique identifier of the last added object. example: '23623' result: type: boolean description: " Returns boolean true when operation is successfull. Returns false otherwise. " example: true SuccessDeleteResult: type: object required: - result properties: result: type: boolean description: " Returns boolean true when operation is successfull. Returns false otherwise. " example: true Error: type: object required: - error - errorCode properties: error: type: string description: Error message pointing the root cause of the error. errorCode: type: string description: Error code. ProgressResult: type: object properties: message: type: string description: Message of the progress result. example: Completed. status: type: string description: "Current status of the progress. It may be in_progress or finished." example: finished total: type: string description: Total count of product list. example: '100' processed: type: string description: Count of processed items in the queue. example: '100' errors: type: array description: An array of errors if exists. items: type: string example: ['Line 1: Duplicate Product in request. Product Name: Test Product 1', 'Line 4: Duplicate Product in database. Product Name: Test Product 2'] AccountResult: type: object required: - api_enabled - package - product_limit - company_status - remaining_trial_days - competitor_monitoring_style properties: package: type: string description: " The API is only available in Premium and Professional plans. This endpoint returns a single character: 'M' or 'L', representing 'Premium' and 'Platinum' plans.


For all plans and details, see: Plans and Pricing " example: M required: false product_limit: type: integer description: " The maximum number of products that can be added to your Prisync account. This always returns your package limit if you are subscribed to one of existing plans or returns a custom number (probably more than 5000) if you have a custom plan.
This number does not show the number of products that you actually added into your account. This is just the upper limit.

You cannot add new Products using API (or using the web interface) if the number of products in your account exceeds your product_limit.

" example: 1000 company_status: type: string description: " A string representing your account status.
Values: [in_trial|paid|expired]. The value is usually paid or in_trial, showing that you are already subscribed to one of the plans or you are still in trial period." example: in_trial remaining_trial_days: type: integer description: " If you are still in trial period, this attribute returns the number of days remaining for your trial period. If your trial period is over and you are not subscribed, this request returns -1. " example: 10 api_enabled: type: boolean description: " Always returns boolean true if you have an active subscription plan which includes the API access. Returns boolean false only if you downgrade your account to a plan which does not include the API access. " example: true competitor_monitoring_style: type: string description: " A string representing your account monitoring style.
Values: [channel_based|url_based]. The value informs the panel that the URL information will be automatically added by the system or entered by the user. If the value is channel_based URLs will be automatically added. Otherwise, URLs will be added by the user to the panel. ." example: url_based