Basket initiation
When a merchant has catalogue polling integrated and the in-app catalogue display capability enabled, users can browse the merchant's products directly in the OpenApp app. Once the user has selected products, OpenApp initiates the basket in the merchant system before the normal checkout flow continues.
Request
OpenApp executes a HTTP POST to the endpoint configured in the control panel:
POST <initiate-url>
The request body contains the products the user added in the app - each product carries the id and ean from the catalogue, plus the quantity and prices OpenApp knows at that point. If the user is known to the merchant (for example, the user is logged in to the merchant's own app), the optional loggedUser field carries the merchant's stable user identifier.
- Request
- Schema
{
"basket": {
"products": [
{
"ean": "12312",
"id": "id123",
"quantity": 2,
"unitPrice": 7000,
"linePrice": 14000
}
]
}
}
basketobjectRequiredThe shopping basket
Show child parametersHide child parameters2
productsarray of BaseProductRequiredThe basket products
Show child parametersHide child parameters6
eanstringOptionalThe ean (or other barcode on the product). Specifying this allows the user to search in his order history by scanning the barcode to do a re-purchase.
maxLength: 36
idstringRequiredThe unique ID of the product.
maxLength: 48
quantityintegerRequiredThe number of items in the purchase.
minimum: 0
unitPriceintegerRequiredThe price of a single product. Price is expressed as the number (integer) of 1/100s of the price.
linePriceintegerRequiredThe price of the products. Price is expressed as the number (integer) of 1/100s of the price.
policiesarray of objectsOptionalThe list of policies applied to the product.
maxItems: 1
Show child parametersHide child parameters2
typeenumRequiredPossible values: AGE
criteriaobjectRequiredShow child parametersHide child parameters1
minAgenumberRequiredloggedUserstringOptionalThe id of the user in the merchant store (if known)
Raw JSON Schema
{
"additionalProperties": false,
"type": "object",
"properties": {
"basket": {
"$ref": "#/definitions/OpenPayInitiatedBasket",
"description": "The shopping basket",
"title": "basket"
}
},
"required": [
"basket"
],
"definitions": {
"OpenPayInitiatedBasket": {
"title": "OpenPayInitiatedBasket",
"type": "object",
"properties": {
"products": {
"description": "The basket products",
"type": "array",
"items": {
"$ref": "#/definitions/BaseProduct"
},
"title": "products"
},
"loggedUser": {
"description": "The id of the user in the merchant store (if known)",
"type": "string",
"title": "loggedUser"
}
},
"required": [
"products"
]
},
"BaseProduct": {
"title": "BaseProduct",
"type": "object",
"properties": {
"ean": {
"description": "The ean (or other barcode on the product). Specifying this allows the user to search in his order history by scanning the barcode to do a re-purchase.",
"maxLength": 36,
"type": "string",
"title": "ean"
},
"id": {
"description": "The unique ID of the product.",
"maxLength": 48,
"type": "string",
"title": "id"
},
"quantity": {
"description": "The number of items in the purchase.",
"minimum": 0,
"type": "integer",
"title": "quantity"
},
"unitPrice": {
"description": "The price of a single product. Price is expressed as the number (integer) of 1/100s of the price.",
"type": "integer",
"title": "unitPrice"
},
"linePrice": {
"description": "The price of the products. Price is expressed as the number (integer) of 1/100s of the price.",
"type": "integer",
"title": "linePrice"
},
"policies": {
"description": "The list of policies applied to the product.",
"maxItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"AGE"
],
"title": "type"
},
"criteria": {
"$ref": "#/definitions/AgeCriteria",
"title": "criteria"
}
},
"required": [
"criteria",
"type"
]
},
"title": "policies"
}
},
"required": [
"id",
"linePrice",
"quantity",
"unitPrice"
]
},
"AgeCriteria": {
"title": "AgeCriteria",
"type": "object",
"properties": {
"minAge": {
"type": "number",
"title": "minAge"
}
},
"required": [
"minAge"
]
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
}
Response
The merchant validates the requested products against current stock and prices, then responds with the authoritative basket in the standard OpenPayBasket format - the same format returned by basket retrieval and basket recalculate. If a product cannot be accommodated (for example, out of stock or quantity exceeding available stock), the merchant returns it with the appropriate error code rather than omitting it, so OpenApp can inform the user.
- Response
- Schema
{
"id": "basket-id",
"expiresAt": "2022-03-23T21:00:00Z",
"price": {
"currency": "PLN",
"discounts": [
{
"code": "discount-code-text",
"value": 1000
}
],
"basketValue": 13000
},
"deliveryOptions": [
{
"key": "INPOST_APM",
"cost": 0
},
{
"key": "DPD_COURIER",
"cost": 1000,
"timing": "next business day"
}
],
"products": [
{
"ean": "12312",
"id": "id123",
"name": "Superb product",
"images": [
"http://cdn.merchant.com/static/products/id123/1",
"http://cdn.merchant.com/static/products/id123/2"
],
"quantity": 2,
"unitPrice": 7000,
"linePrice": 14000,
"originalUnitPrice": 7000,
"originalLinePrice": 14000,
"policies": [
{
"type": "AGE",
"criteria": {
"minAge": 18
}
}
]
}
],
"loggedUser": "user-id-from-webshop"
}
idstringRequiredThe unique ID of the basket.
maxLength: 36
requestIdstringOptionalThe ID of the basket request as generated by OpenApp. Mandatory in case of an asynchronous connection through a queue in order to correlate the placed order with the response.
maxLength: 36
expiresAtstringRequiredThe moment until which the basket is valid. This can be used to indicate a basket needs to be ordered before a specific time in order to guarantee availability.
format: date-time
oaOrderIdstringOptionalThe OpenApp order ID (if known).
priceobjectRequiredShow child parametersHide child parameters3
currencystringRequiredbasketValueintegerRequiredThe price of the basket. Price is expressed as the number (integer) of 1/100s of the price.
minimum: 0
discountsarray of BasketPriceDiscountRequiredApplied discounts
Show child parametersHide child parameters3
codestringRequiredThe discount code.
maxLength: 36
valueintegerRequiredThe value of the discount. Value is expressed as the number (integer) of 1/100s of the currency.
minimum: 0
errorenumOptionalThe error code of the discount
Possible values: EXPIREDINVALIDNOT_APPLICABLEUSED
deliveryOptionsarray of BasketDeliveryOptionRequiredShow child parametersHide child parameters3
keyenumRequiredPossible values: DHL_COURIERDHL_PICKUPDPD_COURIERDPD_PICKUPELECTRONICFEDEX_COURIERGEIS_COURIERGLS_COURIERINPOST_APMINPOST_COURIERINSTORE_PICKUPORLEN_APMPOCZTA_POLSKA_APMPOCZTEX_COURIERUPS_COURIER
costintegerRequiredThe price of the delivery. Price is expressed as the number (integer) of 1/100s of the price.
timingstringOptionalThe estimation of the delivery time, i.e. 'next business day' or 'July 18th'.
maxLength: 40
productsarray of BasketProductRequiredShow child parametersHide child parameters11
namestringRequiredThe product name.
imagesarray of stringRequiredThe URLs of the product image
originalUnitPriceintegerRequiredThe original (before discount) price of a single product. Price is expressed as the number (integer) of 1/100s of the price.
originalLinePriceintegerRequiredThe original (before discount) price of the products. Price is expressed as the number (integer) of 1/100s of the price.
errorenumOptionalError code when the product request can not be accomodated in a recalculate request.
Possible values: OUT_OF_STOCKQUANTITY_TOO_BIG
eanstringOptionalThe ean (or other barcode on the product). Specifying this allows the user to search in his order history by scanning the barcode to do a re-purchase.
maxLength: 36
idstringRequiredThe unique ID of the product.
maxLength: 36
quantityintegerRequiredThe number of items in the purchase.
minimum: 0
unitPriceintegerRequiredThe price of a single product. Price is expressed as the number (integer) of 1/100s of the price.
linePriceintegerRequiredThe price of the products. Price is expressed as the number (integer) of 1/100s of the price.
policiesarray of ProductPolicyOptionalThe list of policies applied to the product.
maxItems: 1
Show child parametersHide child parameters2
typeenumRequiredPossible values: AGE
criteriaobjectRequiredShow child parametersHide child parameters1
minAgeintegerRequiredminimum: 0
invoiceAddressMandatorybooleanOptionalWhether an invoice address is mandatory
loggedUserstringOptionalThe unique ID of the user.
maxLength: 255
Raw JSON Schema
{
"description": "Basket returned on retrieval or recalculation",
"additionalProperties": false,
"type": "object",
"properties": {
"id": {
"description": "The unique ID of the basket.",
"maxLength": 36,
"type": "string",
"title": "id"
},
"requestId": {
"description": "The ID of the basket request as generated by OpenApp. Mandatory in case of an asynchronous connection through a queue in order to correlate the placed order with the response.",
"maxLength": 36,
"type": "string",
"title": "requestId"
},
"expiresAt": {
"description": "The moment until which the basket is valid. This can be used to indicate a basket needs to be ordered before a specific time in order to guarantee availability.",
"format": "date-time",
"type": "string",
"title": "expiresAt"
},
"oaOrderId": {
"description": "The OpenApp order ID (if known).",
"type": "string",
"title": "oaOrderId"
},
"price": {
"$ref": "#/definitions/BasketPrice",
"title": "price"
},
"deliveryOptions": {
"type": "array",
"items": {
"$ref": "#/definitions/BasketDeliveryOption"
},
"title": "deliveryOptions"
},
"products": {
"type": "array",
"items": {
"$ref": "#/definitions/BasketProduct"
},
"title": "products"
},
"invoiceAddressMandatory": {
"description": "Whether an invoice address is mandatory",
"type": "boolean",
"title": "invoiceAddressMandatory"
},
"loggedUser": {
"description": "The unique ID of the user.",
"maxLength": 255,
"type": "string",
"title": "loggedUser"
}
},
"required": [
"deliveryOptions",
"expiresAt",
"id",
"price",
"products"
],
"definitions": {
"BasketPrice": {
"title": "BasketPrice",
"type": "object",
"properties": {
"currency": {
"type": "string",
"title": "currency"
},
"basketValue": {
"description": "The price of the basket. Price is expressed as the number (integer) of 1/100s of the price.",
"minimum": 0,
"type": "integer",
"title": "basketValue"
},
"discounts": {
"description": "Applied discounts",
"type": "array",
"items": {
"$ref": "#/definitions/BasketPriceDiscount"
},
"title": "discounts"
}
},
"required": [
"basketValue",
"currency",
"discounts"
]
},
"BasketPriceDiscount": {
"title": "BasketPriceDiscount",
"type": "object",
"properties": {
"code": {
"description": "The discount code.",
"maxLength": 36,
"type": "string",
"title": "code"
},
"value": {
"description": "The value of the discount. Value is expressed as the number (integer) of 1/100s of the currency.",
"minimum": 0,
"type": "integer",
"title": "value"
},
"error": {
"description": "The error code of the discount",
"enum": [
"EXPIRED",
"INVALID",
"NOT_APPLICABLE",
"USED"
],
"type": "string",
"title": "error"
}
},
"required": [
"code",
"value"
]
},
"BasketDeliveryOption": {
"title": "BasketDeliveryOption",
"type": "object",
"properties": {
"key": {
"$ref": "#/definitions/MerchantDeliveryOptions",
"title": "key"
},
"cost": {
"description": "The price of the delivery. Price is expressed as the number (integer) of 1/100s of the price.",
"type": "integer",
"title": "cost"
},
"timing": {
"description": "The estimation of the delivery time, i.e. 'next business day' or 'July 18th'.",
"maxLength": 40,
"type": "string",
"title": "timing"
}
},
"required": [
"cost",
"key"
]
},
"MerchantDeliveryOptions": {
"title": "MerchantDeliveryOptions",
"enum": [
"DHL_COURIER",
"DHL_PICKUP",
"DPD_COURIER",
"DPD_PICKUP",
"ELECTRONIC",
"FEDEX_COURIER",
"GEIS_COURIER",
"GLS_COURIER",
"INPOST_APM",
"INPOST_COURIER",
"INSTORE_PICKUP",
"ORLEN_APM",
"POCZTA_POLSKA_APM",
"POCZTEX_COURIER",
"UPS_COURIER"
],
"type": "string"
},
"BasketProduct": {
"title": "BasketProduct",
"type": "object",
"properties": {
"name": {
"description": "The product name.",
"type": "string",
"title": "name"
},
"images": {
"description": "The URLs of the product image",
"type": "array",
"items": {
"type": "string"
},
"title": "images"
},
"originalUnitPrice": {
"description": "The original (before discount) price of a single product. Price is expressed as the number (integer) of 1/100s of the price.",
"type": "integer",
"title": "originalUnitPrice"
},
"originalLinePrice": {
"description": "The original (before discount) price of the products. Price is expressed as the number (integer) of 1/100s of the price.",
"type": "integer",
"title": "originalLinePrice"
},
"error": {
"description": "Error code when the product request can not be accomodated in a recalculate request.",
"enum": [
"OUT_OF_STOCK",
"QUANTITY_TOO_BIG"
],
"type": "string",
"title": "error"
},
"ean": {
"description": "The ean (or other barcode on the product). Specifying this allows the user to search in his order history by scanning the barcode to do a re-purchase.",
"maxLength": 36,
"type": "string",
"title": "ean"
},
"id": {
"description": "The unique ID of the product.",
"maxLength": 36,
"type": "string",
"title": "id"
},
"quantity": {
"description": "The number of items in the purchase.",
"minimum": 0,
"type": "integer",
"title": "quantity"
},
"unitPrice": {
"description": "The price of a single product. Price is expressed as the number (integer) of 1/100s of the price.",
"type": "integer",
"title": "unitPrice"
},
"linePrice": {
"description": "The price of the products. Price is expressed as the number (integer) of 1/100s of the price.",
"type": "integer",
"title": "linePrice"
},
"policies": {
"description": "The list of policies applied to the product.",
"maxItems": 1,
"type": "array",
"items": {
"$ref": "#/definitions/ProductPolicy"
},
"title": "policies"
}
},
"required": [
"id",
"images",
"linePrice",
"name",
"originalLinePrice",
"originalUnitPrice",
"quantity",
"unitPrice"
]
},
"ProductPolicy": {
"title": "ProductPolicy",
"type": "object",
"properties": {
"type": {
"$ref": "#/definitions/ProductPolicyType",
"title": "type"
},
"criteria": {
"$ref": "#/definitions/AgeCriteria",
"title": "criteria"
}
},
"required": [
"criteria",
"type"
]
},
"ProductPolicyType": {
"title": "ProductPolicyType",
"enum": [
"AGE"
],
"type": "string"
},
"AgeCriteria": {
"title": "AgeCriteria",
"type": "object",
"properties": {
"minAge": {
"type": "integer",
"minimum": 0,
"title": "minAge"
}
},
"required": [
"minAge"
]
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
}