Recommendation API¶
Recommendations are retrieved from the Personalization server with RESTful requests that rely on the HTTP GET method. The result can a list of item IDs that can then be used to call the underlying CMS or shop system and postload the necessary information for the rendering process.
For more information about Personalization, see Introduction, Basic integration.
Authentication
For fetching recommendations, authentication is disabled by default, and it must be disabled when you use JSONP for response handling. If authentication is enabled for recommendation requests and you want to change this, contact support@ibexa.co.
GET requests¶
The request for recommendations uses the following pattern:
GET https://reco.perso.ibexa.co/api/v2/[customerid]/[userid]/[scenarioid].[extension]?parameter=value&[attribute=attributekey]
Request parameters¶
For the request to return recommendations, you must provide the following parameters:
Parameter | Description | Value |
---|---|---|
customerid |
A customer ID (for example "00000"), as defined when enabling Personalization. Can be used to identify a website in installations that hosts multiple SiteAccesses. | alphanumeric |
userid |
An ID of the tracked user in the website (for example, an internal customer code, a session code or a cookie for anonymous users. | alphanumeric |
scenarioid |
An ID of the scenario used for providing recommendations, as defined in the Back Office. | alphanumeric |
extension |
A format of the response (either JSON or JSONP). | json or jsonp |
Parameter encoding limitations
All parameters must be URL-encoded (see RFC 3986) and cannot contain a backslash
(%5C
) character.
Customizing the recommendation request¶
You can customize the recommendation request by using additional query string parameters. For example, you can send the following request to the Personalization server:
GET https://reco.perso.ibexa.co/api/v2/00000/john.doe/landing_page.json ?contextitems=123&categorypath=%2FCamera%2FCompact&attribute=title&attribute=deeplink,description&numrecs=8
The request fetches 8 recommendations for user ID john.doe
, who is viewing item 123
and the category /Camera/Compact
, based on the scenario with the identifier landing_page
.
The recommendation response uses the JSON format and should include values of
title
, deeplink
and description
attributes.
You can use the following parameters to customize a request:
Parameter | Example | Description | Value |
---|---|---|---|
numrecs |
20 | Defines a number of recommendations to be delivered. The lower this value, the shorter the response time. The default value is 10. | 1 to 50 |
contextitems |
10,13,14 or "CLICKED" | A comma-separated list of items that the user is viewing on the web page. The list is required by context-based recommendations. All items must be of the same type. The type is defined in the scenario configuration. If history code is used ("CLICKED","CONSUMED", "OWNS", "RATED" or "BASKET"), context items are pulled from the user profile (for example, the most recent clicks or purchases). This parameter is optional. | 1 to 2147483647 (or alphanumeric if enabled) |
outputtypeid |
1 | Required for scenarios that are defined with multiple output item types, otherwise optional. By default it's the first/lowest output type enabled in the scenario config. | numeric |
crosscontenttype |
Used instead of outputtypeid , if set to true, displays recommendations for all output types defined in the scenario. |
boolean | |
jsonpCallback |
"myCallback" | Function or method name (used for JSONP request only). It can be a function ("callme"), or a method ("obj.callme"). The default value is "jsonpCallback". | legal JavaScript function call |
attribute |
"title" or "description" | If you apply this parameter, the engine tries to fetch the value of the attribute. For example, &attribute=title means fetching the title for the item that's delivered in the response, if available. The fetch works if content import has been successful. You can pass multiple attributes: &attribute=title&attribute=description or &attribute=title,description . Use this to pull "pure" client-based recommendations without requesting local customer data. |
string |
categorypath |
/Women/Shirts |
Category path for fetching recommendations. The format is the same as the category path used in event tracking. Add this parameter multiple times to get recommendations from multiple categories. The order of recommendations from different categories is defined by the calculated relevance. The default value is %2F , which stands for an entire website. |
string[/string]* |
usecontextcategorypath |
Used in conjunction with categorypath . If set to true, the category path of given context item(s) is resolved by the Personalization server from the internal store and used as base category path. If more than one category is returned, all categories are used for providing recommendations. Setting this parameter to true increases the response time. If possible, use the categorypath parameter to provide the category to the recommender engine during the request. The default value is false. |
boolean | |
recommendCategory |
Used in conjunction with categorypath . If set to true, the neighboring category linked with the recommended items is delivered in the response as an additional field category . Helps find a suitable template for articles from several categories.For example, take an article about American football. The article is categorized as Sport/Football and America/USA . Depending on the category, the webpage displays a football field or an American flag in the background. If the article is recommended and clicked in the Sport/Cricket category, it must open with the "field" template. If clicked in the America/Canada category, it must open with the "flag" template. The category is returned only if the article is located in several categories and the "closer" category is found. The default value is false. |
boolean | |
usetimeslot |
If set to true, configured time-slots are active. As a result, recommendations are calculated for specific time frames and they have priority over the recommendations from the main model in the hours for which time slots are configured. Time slots must be enabled by and configured Ibexa Team. | true |
Submodel parameters¶
If your recommendation model uses submodels to group content items/products based on an attribute, you can pass the following parameters to request recommendations for a specific group. For more information, see Submodels.
Parameter | Example | Description | Value |
---|---|---|---|
attribute key | &color=red |
Applicable if a submodel with the same name and value is configured. | string |
userattribute |
gender | If defined, the Personalization server tries to find the attribute value for the current user and, if found, "prefers" recommendations that are typically followed by users with the same value of the attribute. The default value is null. | string, csv list |
Multiple submodels in recommendations
If you send a request with two attribute keys, the response contains an intersection of two recommendation sets that originate from submodels calculated for these attributes.
For example, to get recommendations for items of certain type that are limited by submodels based on both a nominal and numeric attribute, you can send the following request:
GET https://reco.perso.ibexa.co/api/v2/00000/john.doe/landing_page.json?numrecs=50&outputtypeid=1&width-range=10:30&color=green
Dynamic attribute submodels
If dynamic attribute submodels are enabled, you only need to add submodel parameters to the request to trigger dynamic submodels in the upcoming model build.
Dynamic attribute submodels must be enabled by Ibexa Team. To start using this functionality, contact support@ibexa.co.
When enabled, to build dynamic attribute submodels, you need to send the request (which includes "ATTRIBUTE_NAME=VALUE"
query parameters) to the scenario with model you want to use submodels for:
GET https://reco.perso.ibexa.co/api/v2/00000/john.doe/{SCENARIO_NAME}?numrecs=50&outputtypeid=1&color=red
Segment parameters¶
If you have configured segments, you can use them in the recommendation model. Pass the following parameter to request recommendations for a specific segment or segment group.
Parameter | Example | Description | Value |
---|---|---|---|
segments |
&segments=7,8,10,11 |
ID from segment group management | string |
For more information, see Segments.
Responses¶
The recommendation request returns information about the currently used context items and an array of recommendation objects in JSON or JSONP format. The result can be integrated into any webpage on the client side by using script code. To track user actions like "clickrecommended" and "rendered", use the links delivered in the response. For more information, see inline comments below.
Previewing recommendations
You can preview the actual responses that come from the Personalization server and how they are rendered in the user interface. For more information, see Previewing scenario results.
For more information about integrating recommendations in the web page, see Best practices.
Response object format¶
A JSON response can look like this:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
|
A JSONP response can look like this (same comments apply):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
|
HTTP response codes¶
The following HTTP response codes are used by the recommendation controller:
HTTP Status Code | Description |
---|---|
200 OK | Request was processed successfully. |
304 Not Modified | Recommendation result wasn't modified since the time specified in the provided If-Modified-Since header. |
400 Bad Request414 Request-URI Too Long | Wrong request formatting. See response body for more information. |
401 Unauthorized | Invalid authentication credentials. |
403 Forbidden | Access denied. |
404 Not Found | The requested element was't found. It could be customer ID (or "mandator ID"), model ID, or scenario ID. |
409 Conflict | The requested combination of models and recommendation parameters can't return recommendations. This could happen, for example, if you request personalized recommendations for a user who has no history. |
500 Internal Server Error | Unspecified error. Contact Ibexa support if this error is recurring. |
In case of errors, the response body contains human-readable error messages. Error messages can change, don't use them for automated processing.
Rendering data
If data import with the Content API was successful, you can also fetch data used for rendering (for example "title", "description" or "deeplink") from the recommendation response.
Cache recommendations¶
The Personalization server's response can be cached. Depending on the recommendation model and context, it can drastically reduce the number of recommendation requests. The recommendation service supports the following HTTP headers to enable cache control on the client side (all date values must follow the "HTTP-date" format as defined by RFC 2616):
Scope | Header | Description | Example |
---|---|---|---|
Request | If-Modified-Since |
Enables returning the 304 Not Modified code if content is unchanged. | If-Modified-Since: Sat, 29 Oct 2013 19:43:31 GMT |
Response | Last-Modified |
The last modification date of the recommendations. | Last-Modified: Tue, 15 Nov 2013 12:45:26 GMT |
Response | Expires |
Gives the date/time after which the response is outdated | Expires: Thu, 01 Dec 2013 16:00:00 GMT |
The last modification timestamp indicates a change that could influence the recommendation response. It depends on an updated recommendation calculation, an update of an item or certain scenario configuration changes.
The expiration timestamp is a best-effort prediction based on the model configuration and provided context. The shortest expiration period is 5 minutes from the request time, the longest is 24 hours.
You don't usually have to calculate the expiration time manually.
Instead, make sure that the Expires
header is used in the configuration
of your caching system and not a static value out of your configuration.
To learn how Personalization server calculates the Expires
header that's provided
to your caching system, see the following table with caching strategy examples:
Model | Context | Expiration time | Description |
---|---|---|---|
Bestselling products (last 7 days) | No context | 24 hours | The model with the 7 days scope is usually built once a day. You can cache its results for 24 hours. It has no context, therefore it can be cached globally for all the users of the site. |
Also bought products (last month) | Current product | 24 hours | The model with the 30 days scope is usually built once a day. The context is always the same, therefore it can be cached for every product, and the same result can be used for all users of the site. |
Also consumed articles (last hour) | Current article | 30 minutes | Models with a short scope are usually built several times a day or even per hour. The expiration time is set to half of the model build frequency. |
Personalized recommendation based on the user's statistic | User's click history | Now | Statistical models aren't updated within minutes, and it's likely that the context changes shortly (a user clicks another product, the click is added to their history). The expiration time shouldn't be much longer than the user's activity on the web page. |