Erply Linked Products API

Manage substitute and cross-sell products

Operations 6

POST /v1/product/linked-products Link 2 products for cross-sell or substitute purposes
POST /v1/product/linked-products/bulk Create product links in bulk
POST /v1/product/linked-products/bulk/get Read all products linked products and the link types
DELETE /v1/product/linked-products/{ids} Delete links between 2 products
PUT /v1/product/linked-products/{id} Update a link between 2 products
GET /v1/product/{productID}/linked-products Read all product's linked products and the link types

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/erply-linked-products-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

erply-linked-products-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  description: "\n\n## Overview\n\n\n\nThis application offers an API for managing assignments and tasks.\n\n\n\nGraphQL endpoint for the same API is [also available](/graph)\n\n\n\n<details><summary>Authentication</summary>\n\n\n\n> \n\n> Authenticate using your Erply credentials and get a sessionKey. This sessionKey and your Erply clientCode must be provided in the HTTP headers of every request. You do not have to authenticate against this API - valid Erply sessionKey-s from other sources are also acceptable. To authenticate using this API, use the `POST /api/v1/auth` endpoint.\n\n>\n\n</details>\n\n"
  title: assignments Assortment Linked Products API
  contact: {}
  version: 2.36.5
tags:
- description: Manage substitute and cross-sell products
  name: Linked Products
paths:
  /v1/product/linked-products:
    post:
      security:
      - sk: []
      - cc: []
      - jwt: []
      description: Each product can have zero or more substitute products (items that the cashier could offer as alternatives if the original is out of stock) and zero or more cross-sell products (items that are often sold along the main item).
      tags:
      - Linked Products
      summary: Link 2 products for cross-sell or substitute purposes
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.Response'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.MessageResponse'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.MessageResponse'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/linkedproductmodels.CreateRequest'
        description: link ID and type of the link `cross-sell | substitute`
        required: true
  /v1/product/linked-products/bulk:
    post:
      security:
      - sk: []
      - cc: []
      - jwt: []
      description: each request contains the created resource data
      tags:
      - Linked Products
      summary: Create product links in bulk
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.BulkResponseWithResults'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/linkedproductmodels.BulkCreateRequest'
        description: bulk create request
        required: true
  /v1/product/linked-products/bulk/get:
    post:
      security:
      - sk: []
      - cc: []
      - jwt: []
      description: 'Each product can have zero or more substitute products (items that the cashier could offer as alternatives if the original is out of stock) and zero or more cross-sell products (items that are often sold along the main item).

        link type (values: cross-sell or substitute)'
      tags:
      - Linked Products
      summary: Read all products linked products and the link types
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/products.BulkReadResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.MessageResponse'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.MessageResponse'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/products.BulkReadRequest'
        description: request
        required: true
  /v1/product/linked-products/{ids}:
    delete:
      security:
      - sk: []
      - cc: []
      - jwt: []
      description: 'Each product can have zero or more substitute products

        (items that the cashier could offer as alternatives if the original is out of stock)

        and zero or more cross-sell products (items that are often sold along the main item).'
      tags:
      - Linked Products
      summary: Delete links between 2 products
      parameters:
      - description: up to 100 semicolon delimited link IDs
        name: ids
        in: path
        required: true
        schema:
          type: string
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.Response'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.MessageResponse'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.MessageResponse'
  /v1/product/linked-products/{id}:
    put:
      security:
      - sk: []
      - cc: []
      - jwt: []
      description: Each product can have zero or more substitute products (items that the cashier could offer as alternatives if the original is out of stock) and zero or more cross-sell products (items that are often sold along the main item).
      tags:
      - Linked Products
      summary: Update a link between 2 products
      parameters:
      - description: link ID
        name: id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.Response'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.MessageResponse'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.MessageResponse'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/linkedproductmodels.UpdateRequest'
        description: update request
        required: true
  /v1/product/{productID}/linked-products:
    get:
      security:
      - sk: []
      - cc: []
      - jwt: []
      description: Each product can have zero or more substitute products (items that the cashier could offer as alternatives if the original is out of stock) and zero or more cross-sell products (items that are often sold along the main item).
      tags:
      - Linked Products
      summary: Read all product's linked products and the link types
      parameters:
      - description: skip n records
        name: skip
        in: query
        schema:
          type: integer
      - description: 'items to take, default: 20, max: 100000'
        name: take
        in: query
        schema:
          type: integer
      - description: product ID
        name: productID
        in: path
        required: true
        schema:
          type: integer
      - description: 'link type (values: `cross-sell` or `substitute`)'
        name: type
        in: query
        required: true
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/linkedproductmodels.Response'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.MessageResponse'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.MessageResponse'
components:
  schemas:
    linkedproductmodels.BulkCreateRequest:
      type: object
      properties:
        requests:
          type: array
          items:
            $ref: '#/components/schemas/linkedproductmodels.CreateRequest'
    linkedproductmodels.UpdateRequest:
      type: object
      properties:
        linked_product_id:
          type: integer
        product_id:
          type: integer
    products.BulkReadRequestItem:
      type: object
      properties:
        linkType:
          type: string
          example: cross-sell
        productID:
          type: integer
          example: 1
        skip:
          type: integer
        take:
          type: integer
          example: 20
    linkedproductmodels.Response:
      type: object
      properties:
        added:
          description: Unix timestamp
          type: integer
          example: 1595230999
        addedby:
          description: username
          type: string
          example: k@erp.xyz
        changed:
          description: Unix timestamp
          type: integer
          example: 1595230999
        changedby:
          description: username
          type: string
          example: k@erp.xyz
        id:
          description: object ID
          type: integer
          example: 1234
        linked_product_id:
          type: integer
        product_id:
          type: integer
        type:
          description: Link type can be cross-sell or substitute
          type: string
          example: cross-sell
    responses.Response:
      type: object
      properties:
        id:
          type: integer
          example: 73
    products.BulkReadRequest:
      type: object
      properties:
        requests:
          type: array
          items:
            $ref: '#/components/schemas/products.BulkReadRequestItem'
    responses.MessageResponse:
      type: object
      properties:
        message:
          type: string
          example: some message
    linkedproductmodels.CreateRequest:
      type: object
      properties:
        linked_product_id:
          type: integer
        product_id:
          type: integer
        type:
          description: Link type can be cross-sell or substitute
          type: string
          example: cross-sell
    responses.BulkResult:
      type: object
      properties:
        message:
          type: string
          example: some message
        resourceId:
          description: identifier of the REST-ful response
          type: integer
          example: 2
        resultId:
          description: identifier of the result item
          type: integer
          example: 2
    responses.BulkResponseWithResults:
      type: object
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/responses.BulkResult'
    products.BulkReadResponse:
      type: object
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/products.BulkReadResponseItem'
    products.BulkReadResponseItem:
      type: object
      properties:
        error:
          type: string
        productID:
          type: integer
        results:
          type: array
          items:
            $ref: '#/components/schemas/linkedproductmodels.Response'
  securitySchemes:
    AccessToken:
      type: apiKey
      name: accessToken
      in: header
    ErplyClientCode:
      type: apiKey
      name: clientCode
      in: header
    ErplyJWT:
      type: apiKey
      name: jwt
      in: header
    ErplySession:
      type: apiKey
      name: sessionKey
      in: header
    RequestKey:
      type: apiKey
      name: requestKey
      in: header