IKEA Availability API

Everything about Availability

OpenAPI Specification

ikea-availability-api-openapi.yml Raw ↑
openapi: 3.1.1
info:
  title: IKEA After Purchase Ordering Availability API
  summary: Unofficial IKEA API for After Purchase Ordering (APO) of spare parts
  description: 'This is an **unofficial** OpenAPI specification for the IKEA After Purchase Ordering (APO) API.


    ## FAQ


    **Q: Why is this API called After Purchase Ordering?**


    **A:** The URL(s) used have `apo` in the name. We are also dealing with after purchase replacement parts.

    A common term for this is After Purchase Ordering (APO).


    ## Swagger UI


    This API can be tested using swagger-ui at [./swagger-ui.html](swagger-ui.html) as long as the

    CORS header `Access-Control-Allow-Origin` are configured as `*`.

    At the moment of writing this is only the case for the [IKEA Search API](../search/index.html).


    ## Other APIs


    * [IKEA Product Catalog API](../product-catalog/index.html)

    * [IKEA Search API](../search/index.html)

    * [IKEA Sales Item API](../sales-item/index.html)

    * [IKEA After Purchase Ordering API](../after-purchase-ordering/index.html)


    ## ⚠️ Disclaimer


    * This project is based on publicly available information and analysis of network requests.

    * It is not affiliated with, endorsed by, or supported by IKEA.

    * Endpoints, schemas, and behaviors may change at any time and may not reflect official or supported APIs.

    * Use this specification at your own risk.


    ### See also


    This section lists resources used during the creation of these APIs to exent and check validity of the API.

    These are not in any special order but useful as references.


    * [OpenAPI Spec for api.salesitem.ingka.com](https://github.com/shrabdut123/cart-multi-agent/blob/a10dc96ac7a1fd98701afebe2cde585e6d9a6a08/service_coordinator_agent/salesitem_api.yaml#L13) - Very verbose OpenAPI Spec with detailed resources referring to inside IKEA knowledge.

    * [DavisChappins/ikeaStockChecker](https://github.com/DavisChappins/ikeaStockChecker/blob/45fa92f26ac2b37d03c37eb34e0c618c4a8477e8/ikea_stock_scanner.py#L11) - Use of `api.salesitem.ingka.com` endpoint.

    * [Mirzaei81/ikeaScraper](https://github.com/Mirzaei81/ikeaScraper/blob/cdeef5c9fb76660b18a8e569d7213828ffe5f9d2/app.py#L74) - Use of `api.salesitem.ingka.com` endpoint.

    * [Ephigenia/ikea-availability-checker/postman/schemas/ikea-ingka-api.yaml](https://github.com/Ephigenia/ikea-availability-checker/blob/c7fe2f9bc8306c01783f8d22329d34ed76a582c9/postman/schemas/ikea-ingka-api.yaml) - This contains resources related to the `api.salesitem.ingka.com` (Sales Item API)

    * [vrslev/ikea-api-client/src/ikea_api/endpoints/search.py](https://github.com/vrslev/ikea-api-client/blob/ce70c8d743302a465931bdb6a9f7b0bc5c1d882f/src/ikea_api/endpoints/search.py#L14C1-L14C117) - Use of the Search API and some other endpoints.

    '
  version: 0.1.0
  license:
    name: MIT License
    url: https://opensource.org/licenses/MIT
  contact:
    name: Unofficial IKEA OpenAPI Maintainer
    url: https://github.com/idelsink/ikea-openapi
servers:
- url: https://api.prod.apo.ingka.com
  description: Production (Cloudflare)
- url: https://origin-api.prod.apo.ingka.com
  description: Production (Google Frontend)
- url: https://api.test.apo.ingka.com
  description: Testing (Cloudflare)
- url: https://origin-api.test.apo.ingka.com
  description: Testing (Google Frontend)
tags:
- name: Availability
  description: Everything about Availability
paths:
  /availabilities/{classUnitType}/{classUnitCode}:
    get:
      summary: IKEA Get Product Availability with Child Items
      description: Returns availability information including child items and packages
      operationId: getProductAvailability
      tags:
      - Availability
      security:
      - X-Client-ID: []
      parameters:
      - $ref: '#/components/parameters/classUnitType'
      - $ref: '#/components/parameters/classUnitCode'
      - $ref: '#/components/parameters/itemNos'
      - $ref: '#/components/parameters/expand'
      responses:
        '200':
          description: Response with availability and errors
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AvailabilityEnvelope'
              examples:
                GetProductAvailability200Example:
                  summary: Default getProductAvailability 200 response
                  value:
                    availabilities:
                    - availableForCashCarry: true
                      availableForClickCollect: false
                      buyingOption:
                        clickCollect:
                          range:
                            inRange: true
                      childAvailabilities: []
                      classUnitKey:
                        classUnitCode: example
                        classUnitType: example
                      itemKey:
                        itemNo: example
                        itemType: example
                    salesLocations:
                    - childItems:
                      - itemKey: example
                        salesLocations: example
                      classUnitKey:
                        classUnitCode: example
                        classUnitType: example
                      itemKey:
                        itemNo: example
                        itemType: example
                    errors:
                    - code: 404
                      details: &id001
                        classUnitCode: DE
                        classUnitType: RU
                        itemNo: s59047406
                      message: Not found
                    timestamp: '2025-09-10T14:23:33.956Z'
                    traceId: '4119683959736817039'
                  x-microcks-default: true
        '422':
          description: Unprocessable Content
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AvailabilityError'
              examples:
                GetProductAvailability422Example:
                  summary: Default getProductAvailability 422 response
                  value:
                    code: 404
                    details: *id001
                    message: Not found
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
components:
  schemas:
    expandOption:
      type: string
      description: "On the returned data, expand:\n  * `ChildItems` - Child items, e.g. multiple packages that are part of the parent package\n  * `Restocks` - Restock items\n  * `StoresList` - List of stores\n  * `SalesLocations` - Sale locations\n  * `DeliveryPrice` - Deliver Price\n  * `CollectPrice` - Collect Price\n  * `DisplayLocations` - Display locations\n  * `DeliveryTime` - Delivery time\n  * `FoodAvailabilities` - Food availability\n"
      enum:
      - ChildItems
      - Restocks
      - StoresList
      - SalesLocations
      - DeliveryPrice
      - CollectPrice
      - DisplayLocations
      - DeliveryTime
      - FoodAvailabilities
      example: ChildItems
    AvailabilityError:
      type: object
      required:
      - code
      - message
      description: Error object describing the reason of failure
      properties:
        code:
          type: integer
          description: "Error Codes:\n  * `404` - Not found\n  * `405` - ClassUnitCode doesn't exist\n  * `602` - itemNos in query is required\n  * `604` - itemNos.`n` in query should be at least 8 chars long. Where `n` is the positional indicator for the parameter.\n  * `606` - expand.`n` in query should be one of [ChildItems Restocks StoresList SalesLocations DeliveryPrice CollectPrice DisplayLocations DeliveryTime FoodAvailabilities]. Where `n` is the positional indicator for the parameter.\n"
          example: 404
        details:
          type: object
          description: Additional error details. These change depending on the context of the query.
          example:
            classUnitCode: DE
            classUnitType: RU
            itemNo: s59047406
        message:
          type: string
          description: Error message indicating the failure
          example: Not found
    ClassUnitKey:
      type: object
      description: 'Class Unit Key gives context when invoking the AvailabilityClassifications API.

        '
      properties:
        classUnitCode:
          type: string
          minLength: 2
          maxLength: 5
          description: '`classUnitCode` is the unique identifier of a Class Unit when

            combined with a `classUnitType`.


            A valid `classUnitCode` always has a pattern like `^([A-Z]|[0-9]){2,5}$`.


            This can either be a:


            * **Retail Unit** - Retail Unit must be combined with a valid `classUnitCode`. For example, `SE` for Sweden or `DE` for Germany. A list of valid Class Units can be found [in CBD](https://iwww.cbdview.ikea.com/) (requires VPN or internal network).

            * **Store ID** - The 3-digit store ID. E.g. `066`.

            '
          examples:
          - GB
          - DE
          - '066'
        classUnitType:
          type: string
          description: "Class Unit Type:\n  * `RU` - Retail Unit - Retail Unit must be combined with a valid `classUnitCode`. For example, `SE` for Sweden or `DE` for Germany. A list of valid Retail Units can be found [in CBD](https://iwww.cbdview.ikea.com/) (requires VPN or internal network).\n  * `STO` - Store - The store availability for a given store\n"
          enum:
          - RU
          - STO
          example: RU
    AvailabilityEnvelope:
      type: object
      description: Availability envelope containing availabilities, sales Sales Locations and errors.
      required:
      - availabilities
      - timestamp
      - traceId
      properties:
        availabilities:
          type: array
          description: List of product availabilities
          items:
            $ref: '#/components/schemas/Availability'
        salesLocations:
          type: array
          items:
            $ref: '#/components/schemas/SalesLocation'
        errors:
          type: array
          description: List of errors
          items:
            $ref: '#/components/schemas/AvailabilityError'
        timestamp:
          type: string
          description: ISO 8601 formatted timestamp with timezone
          format: date-time
          example: '2025-09-10T14:23:33.956Z'
        traceId:
          type: string
          description: Unique trace identifier for debugging and log correlation
          example: '4119683959736817039'
    SalesLocation:
      type: object
      description: null
      properties:
        childItems:
          type: array
          items:
            type: object
            properties:
              itemKey:
                $ref: '#/components/schemas/ItemKey'
              salesLocations:
                type: array
                items:
                  type: object
                  example:
                    aisleAndBin:
                      aisle: '06'
                      bin: '01'
                    division: SELF_SERVE
                    id: '060100'
                    recommendationRank: 1
                    type: AISLE_AND_BIN
        classUnitKey:
          $ref: '#/components/schemas/ClassUnitKey'
        itemKey:
          $ref: '#/components/schemas/ItemKey'
    ItemKey:
      type: object
      description: Item key (Product ID and Item type)
      properties:
        itemNo:
          $ref: '#/components/schemas/productId'
        itemType:
          $ref: '#/components/schemas/itemType'
    itemType:
      type: string
      description: 'Item type code

        '
      enum:
      - ART
      - SPR
      example: SPR
    Availability:
      type: object
      description: Availability of a Product
      properties:
        availableForCashCarry:
          type: boolean
          example: true
        availableForClickCollect:
          type: boolean
          example: false
        buyingOption:
          type: object
          example:
            clickCollect:
              range:
                inRange: true
        childAvailabilities:
          type: array
          items:
            $ref: '#/components/schemas/Availability'
          example: []
        classUnitKey:
          $ref: '#/components/schemas/ClassUnitKey'
        itemKey:
          $ref: '#/components/schemas/ItemKey'
    productId:
      type: string
      description: Product identifier
      example: 00263850
  parameters:
    itemNos:
      name: itemNos
      in: query
      required: true
      style: form
      explode: false
      description: Product identifier(s)
      example:
      - 00263850
      schema:
        type: array
        items:
          $ref: '#/components/schemas/productId'
        minItems: 1
    classUnitCode:
      name: classUnitCode
      in: path
      required: true
      description: '`classUnitCode` is the unique identifier of a Class Unit when

        combined with a `classUnitType`.


        A valid `classUnitCode` always has a pattern like `^([A-Z]|[0-9]){2,5}$`. Note that the Selling Range APIs are case insensitive when it comes to the `classUnitCode` path parameter and lower case is always internally converted to upper case.


        This can either be a:


        * **Retail Unit** - Retail Unit must be combined with a valid `classUnitCode`. For example, `SE` for Sweden or `DE` for Germany. A list of valid Class Units can be found [in CBD](https://iwww.cbdview.ikea.com/) (requires VPN or internal network).

        * **Store ID** - The 3-digit store ID. E.g. `066`.

        '
      schema:
        type: string
        minLength: 2
        maxLength: 5
      examples:
        lowerCaseGb:
          summary: Lower Case GB
          value: gb
        upperCaseGb:
          summary: Upper Case GB
          value: GB
        lowerCaseDe:
          summary: Lower Case DE
          value: de
        upperCaseDe:
          summary: Upper Case DE
          value: DE
        storeBerlin:
          summary: Store ID for Berlin
          value: '066'
    classUnitType:
      name: classUnitType
      in: path
      required: true
      description: "`classUnitType` must be a Retail Unit (`ru`). Or Store (`sto`). It is used together with\n`classUnitCode` to give context when invoking the AvailabilityClassifications API.\n\nUnit Type:\n  * `ru` - Retail Unit - Retail Unit must be combined with a valid `classUnitCode`. For example, `SE` for Sweden or `DE` for Germany. A list of valid Retail Units can be found [in CBD](https://iwww.cbdview.ikea.com/) (requires VPN or internal network).\n  * `sto` - Store - The store availability for a given store\n"
      schema:
        type: string
        enum:
        - ru
        - sto
        example: ru
      example: ru
    expand:
      name: expand
      in: query
      required: false
      style: form
      explode: false
      description: 'List of expandOption(s), see expandOption for values.

        '
      example:
      - ChildItems
      - SalesLocations
      schema:
        type: array
        items:
          $ref: '#/components/schemas/expandOption'
        minItems: 0