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