miso.ai Product / Content APIs API

Miso's Product / Content APIs let you upload, read, and delete Product / Content records that represent your site's catalog. ### Product / Content records Miso analyzes your Product / Content records to provide personalized search and recommendations that connect users with products or content on your site or application. Much of Miso's search and personalization capability relies on understanding your catalog in-depth and drawing correlations between your catalog and your users' consumption or purchasing behaviors. In other words, Miso discovers that, with high correlation, users who are interested in certain product attributes would also be interested in other products with similar or related attributes. (For simplicity, we will often overload the word "products" to mean items for purchase if you are an eCommerce business, and content to consume if you are a content marketplace.) To fully optimize your search and recommendations, it is important to provide Miso with Product / Content records that are complete and accurate. We define a set of common attributes that capture the basics of most eCommerce and content media products, such as `title`, `description`, `categories`, `tags`, `material`, `authors`, etc. If your products' characteristics cannot be fully captured by these fields, we recommend that you specify `custom_attributes`. For Miso, the more complete the product information is, the better its personalized search and recommendations become.

OpenAPI Specification

misoai-product-content-apis-api-openapi.yml Raw ↑
openapi: 3.0.2
info:
  title: Miso Ask APIs Product / Content APIs API
  description: '

    # Overview

    Miso’s approach to personalization is to train machine learning Engines on three core data sets:


    1. Your site’s log of historical and real-time interactions,

    2. Your catalog of products and content, and

    3. Your users. Miso provides the output of its Engines to you, so you can build search and recommendation

    experiences that are personalized down to the individual level (n=1 personalization).


    To see how Miso works and explore the power of its Engines, we recommend following

    [this tutorial](https://docs.askmiso.com/) to get

    started with our Playground data. Integrating your site or application with Miso happens in three basic steps:


    1. Upload your data

    2. Train your Engines

    3. Build search and recommendation experiences with the output of your Engines.



    Miso provides two main integration points. The first is your [Dojo Dashboard](https://dojo.askmiso.com/),

    which is used to set up your Engines with the conversions you want to optimize and your training schedule.

    Dojo is also a great way to get familiar with Miso by manually uploading data and exploring the output of

    Miso’s Engines. In Dojo’s Sandboxes, you can tweak your Engine settings and see visual examples of Miso’s search

    and recommendations running on your live data.


    The second integration point is Miso’s API, which lets you automatically manage your data in Miso and build

    experiences that leverage the output of Miso’s personalization Engines.



    Miso’s API is composed of two major groups of REST API endpoints: Data APIs and Engine APIs.


    ### Data APIs

    Data APIs collect input to Miso''s personalization Engines. These APIs all support high-throughput

    data ingestion through bulk insert, and satisfy GDPR and CCPA compliance by letting users delete their data

    from Miso. Subcategories of Data APIs are:


    * [Interaction APIs](#tag/Interaction-APIs), for managing your Interaction records. By uploading historical and real-time Interaction

    records, you tell Miso how users are engaging with the products and content on your site, and in turn, Miso’s

    Engines learn how to optimize your conversion funnels.

    * [Product / Content APIs](#tag/Product-Content-APIs), for managing your Product / Content records. These records provide a deep semantic

    understanding of your catalog and keep Miso up to date about your offerings so it can make smart and timely

    suggestions. The `product_id` is how Miso links Product / Content records to your Interaction records.

    * [User APIs](#tag/User-APIs), for managing your User records. These records tell Miso about your site’s users and visitors,

    so Miso can build an understanding of user segmentation and behavior in relation to products and content.

    The `user_id` is how Miso links User records to your Interaction records.


    As a rule of thumb, we recommend batching up data to avoid timeout risks. For the Product / Content and User

    Upload APIs, we recommend limiting each API upload call to about 100 records at a time. For the Interaction

    Upload API, we recommend limiting your calls to around 10,000 records at a time.


    ### Engine APIs

    Engine APIs provide the output of Miso''s personalization Engines. We designed these APIs with a focus on low

    latency and high availability. Most of these APIs'' 95th percentile response time is under 75ms,

    and the services are replicated to at least three separate instances for high availability.

    The types of Engine APIs are:


    * [Search APIs](#tag/Search-APIs), for getting Miso’s personalized search results for a user, with search-as-you-type and

    autocompletion.

    * [Recommendation APIs](#tag/Recommendation-APIs), for retrieving Miso’s recommendations that match users with

    the products, categories, and product attributes that are likely to drive conversions.


    # Authentication

    [View your API Keys in your Dojo Dashboard.](https://dojo.askmiso.com/docs/api-browser)


    There are three environments in Miso:

    * **Playground**, a read-only tutorial environment with sample data.

    * **Development**, for staging, QA, and experimentation.

    * **Production**, where you run your live integration with Miso.


    Access a Miso environment by passing in the corresponding API key in your API calls. There is one publishable

    key and one secret key per environment.


    API Key can passed with query parameter `api_key`, or using the `X-API-KEY` header.

    '
  version: 1.1.4
servers:
- url: https://api.askmiso.com
tags:
- name: Product / Content APIs
  description: '

    Miso''s Product / Content APIs let you upload, read, and delete Product / Content records that represent your site''s

    catalog.


    ### Product / Content records

    Miso analyzes your Product / Content records to provide personalized search and recommendations that connect users

    with products or content on your site or application.


    Much of Miso''s search and personalization capability relies on understanding your catalog in-depth and drawing

    correlations between your catalog and your users'' consumption or purchasing behaviors. In other words, Miso

    discovers that, with high correlation, users who are interested in certain product attributes would also be

    interested in other products with similar or related attributes. (For simplicity, we will often overload the word

    "products" to mean items for purchase if you are an eCommerce business, and content to consume if you are a content

    marketplace.)


    To fully optimize your search and recommendations, it is important to provide Miso with Product / Content records

    that are complete and accurate. We define a set of common attributes that capture the basics of most eCommerce and

    content media products, such as `title`, `description`, `categories`, `tags`, `material`, `authors`, etc.


    If your products'' characteristics cannot be fully captured by these fields, we recommend that you specify

    `custom_attributes`. For Miso, the more complete the product information is, the better its personalized search

    and recommendations become.


    '
paths:
  /v1/products:
    post:
      tags:
      - Product / Content APIs
      summary: Product / Content Upload API
      description: "Bulk API to insert Product records. This API endpoint accepts POST requests with JSON data\ncontaining a list of Product / Content records wrapped in a dictionary:\n```\nPOST /v1/products\n\n{\"data\": [product_1, product_2, product_3]}\n```\n\nEach product is uniquely identified by its `product_id`. If a record with the same `product_id`\nalready exists in the dataset, the existing one will be **replaced** by the insertion (no\npartial update is allowed at this time). We recommend limiting your calls to around 100\nrecords at a time to avoid memory issues or timeout risks.\n\n### Schema validation\nThis API validates the inserted records against the API schema; any schema error will cause\nthe whole request to fail (`status_code=422`), and none of the records will be inserted. You\nshould check the `response.errors` field to see if there are any errors. For example,\nthe response below means there are no errors (`status_code=200`):\n\n```json\n{\n  \"message\": \"success\",\n  \"data\": {\n    \"task_id\": \"{task_id}\"\n  }\n}\n```\n\nA common source of errors when uploading Product records is that the custom attributes' data\ntypes are not consistent with the data types of the existing records. In such cases,\nyou can check the individual error message in the `data` array. For example, if there is an\nerror regarding the second record you tried to insert, the response might look like:\n\n```json\n{\n  \"errors\": true, // there are errors. please check!\n  \"data\": [\n    \"data.0.custom_attributes.designer is invalid. Its data type is not consistent with other records\",\n    \"data.0.product_id is invalid. The attribute expected to be of type 'string', but 'array' is given.\",\n    \"data.0.created_at is invalid. The attribute should match 'date-time' format.\"\n  ]\n}\n```\n\n### Internationalization (I18N)\nMiso has the built-in support for majority of Western European languages, including `English`, `French`, `German`,\n`Spanish`, `Italian`, `Dutch`, `Russian`, and `Ukrainian`, as well as, major Asian languages, including `Mandarin`\n (both Simplified and Traditional), `Japanese`, and `Korean`.\n\nIn Dojo, you can choose the *Primary Language* for your product catalog (default is English).\nHowever, you can also have more than one language in your product catalog that is\nbeyond your primary languages using the `i18n_$LN` fields (replace `$LN` with the [two-letter language code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) of your choice),\nand let Miso apply the language-specific preprocessing for you, such as tokenization, stemming, elision\nremoval, folding, decompounding, and traditional to simplified Chinese conversion.\n\nFor example, you may have a product called \"Arizona, Green Tea with Ginseng & Honey\" in your catalog, and you also\nsell it in your Spanish, French, and Chinese sites, and want your customers to be able to search for this product\nin their native languages.\n\nIn this case, your product records will like the following sample record, where English is the primary language of\nthe record, and `i18n_es`, `i18n_fr`, `i18n_zh` fields contain product details in their corresponding languages.\n```javascript\n{\n    \"product_id\": \"arizona-ginseng-honey\",\n    // the primary language is English\n    \"title\": \"Arizona, Green Tea with Ginseng & Honey\",\n    // ... other product details in English\n    \"i18n_es\": {\n       \"title\": \"AriZona, Té verde con ginseng y miel\"\n        // ... other product details in Spanish\n    },\n    \"i18n_fr\": {\n       \"title\": \"AriZona - Thé Vert Aromatisé au Miel\"\n        // ... other product details in French\n    },\n    \"i18n_zh\": {\n       \"title\": \"美國ARIZONA亞歷桑納 - 蜂蜜人蔘綠茶\"\n        // ... other product details in Chinese\n    }\n }\n```\nIn this way, your customer can find this product with any of the following search queries\nwithout additional configuration:\n* `arizona green tea`\n* `arizona te verde`\n* `arizona the vert`\n* `arizona 綠茶`\n\nThe similar concept applies to Autocomplete as well. You can specify a `language` parameter\nin the requests to Autocomplete API, and the autocomplete results for the specific language\nwill be returned."
      operationId: content_write_api_v1_products_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProductBulkIn'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreateResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              example:
                'message:': Request timeout.
        '401':
          description: Unauthorized
          content:
            application/json:
              example:
                message: invalid api key.
        '403':
          description: Forbidden
          content:
            application/json:
              example:
                message: Request is denied due to bot blocking. Please only access this API from a real browser or use Secret API Key instead.
        '422':
          description: Unprocessable Entity
          content:
            application/json:
              example:
                errors: true
                message: None of the records are inserted, because at least one of them contain schema errors. Please see `data` field for details.
                data:
                - data.0.product_id is invalid. The attribute expected to be of type 'string', but 'array' is given.
                - data.0.created_at is invalid. The attribute should match 'date-time' format.
        '500':
          description: Internal Server Error
          content:
            application/json:
              example:
                message: Something went wrong. Please contact miso product team.
      security:
      - Secret API Key: []
  /v1/products/{product_id}:
    get:
      tags:
      - Product / Content APIs
      summary: Product / Content Read API
      description: "This API endpoint retrieves the details of a specific product / content using its `product_id`.\nTo fetch the product / content information, make a GET request to the following URL:\n\n**Notice**: Make sure the product_id is an urlencode string.\n\n```\nGET /v1/products/{product_id}\n```\n\nReplace `{product_id}` with the unique identifier of the product / content you wish to fetch.\n\n## Response Format\n\nThe API will return the product / content details in a JSON object if the given `product_id`\nis valid and exists in the system. The JSON object will include fields like `title`,\n`description`, `price`, `images`, and any internationalization fields (`i18n_$LN`).\n\n### Example Response\n\nHere's an example of a successful API response for a product / content with the `product_id`\n\"arizona-ginseng-honey\":\n\n```json\n{\n  \"product_id\": \"arizona-ginseng-honey\",\n  \"title\": \"Arizona, Green Tea with Ginseng & Honey\",\n  \"description\": \"A refreshing and delicious blend of green tea with ginseng and honey.\",\n  \"price\": 1.99,\n  \"i18n_es\": {\n    \"title\": \"AriZona, Té verde con ginseng y miel\"\n    // ... other product details in Spanish\n  },\n  \"i18n_fr\": {\n    \"title\": \"AriZona - Thé Vert Aromatisé au Miel\"\n    // ... other product details in French\n  },\n  \"i18n_zh\": {\n    \"title\": \"美國ARIZONA亞歷桑納 - 蜂蜜人蔘綠茶\"\n    // ... other product details in Chinese\n  }\n}\n```\n\nIf the provided `product_id` is invalid or does not exist in the system, the API will return\nan error response with a `status_code=404`.\n\n### Example Error Response\n```json\n{\n  \"message\": \"not found\"\n}\n```"
      operationId: content_read_api_v1_products__product_id__get
      parameters:
      - required: true
        schema:
          title: Product Id
          maxLength: 512
          type: string
        name: product_id
        in: path
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductReadOut'
        '401':
          description: Unauthorized
          content:
            application/json:
              example:
                message: invalid api key.
        '404':
          description: Product not Found
          content:
            application/json:
              example:
                message: not found
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '500':
          description: Internal Server Error
          content:
            application/json:
              example:
                message: Something went wrong. Please contact miso product team.
      security:
      - Secret API Key: []
    delete:
      tags:
      - Product / Content APIs
      summary: Product / Content Delete API
      description: "This API endpoint allows you to delete a specific product / content from the system using its\n`product_id`. To remove a product, make a DELETE request to:\n\n**Notice**: Make sure the product_id is an urlencode string.\n\n```\nDELETE /v1/products/{product_id}\n```\n\nReplace `{product_id}` with the unique identifier of the product / content you wish to delete.\n\n## Response Format\n\nThe API will return a JSON object indicating the success or failure of the deletion request.\nIf the deletion is successful, the `status_code` will be `200`, and the `message` field will\nconfirm the successful deletion.\n\n### Example Successful Deletion Response\n\n```json\n{\n  \"message\": \"deleted\",\n  \"data\":  [\n    {\n      \"task_id\": \"{task_id}\"\n    }\n  ]\n}\n```\n\nTo check the exact response body of this task_id, make a GET request to the following endpoint:\n\n```\nGET /v1/products/_status/{task_id}\n```\n\nReplace `{task_id}` with the task_id returned from the response."
      operationId: content_delete_api_v1_products__product_id__delete
      parameters:
      - required: true
        schema:
          title: Product Id
          maxLength: 512
          type: string
        name: product_id
        in: path
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeleteResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              example:
                'message:': Request timeout.
        '401':
          description: Unauthorized
          content:
            application/json:
              example:
                message: invalid api key.
        '403':
          description: Forbidden
          content:
            application/json:
              example:
                message: Request is denied due to bot blocking. Please only access this API from a real browser or use Secret API Key instead.
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '500':
          description: Internal Server Error
          content:
            application/json:
              example:
                message: Something went wrong. Please contact miso product team.
      security:
      - Secret API Key: []
  /v1/products/_ids:
    get:
      tags:
      - Product / Content APIs
      summary: Product / Content ID List API
      description: "This API endpoint allows you to fetch the unique identifiers (product_ids) of all products\nstored in the app. To get a list of product_ids, make a GET request to the following URL:\n\n```\nGET /v1/products/_ids\n```\n\n## Response Format\n\nThe API will return an array of product_ids in a JSON object. The `status_code` will be `200`\nif the request is successful. If any error occurs during the request, the `status_code` will\nnot be `200` and the `message` field will indicate the error.\n\n### Example Successful Response\n\n```json\n{\n  \"message\": \"success\",\n  \"data\": {\n    \"ids\": [\n      \"product_1\",\n      \"product_2\",\n      \"product_3\",\n      // ... more product_ids\n    ]\n  }\n}\n```\n\n### Example Error Response\n\nIf the dataset cannot be found, the API will return a `404` error:\n\n```json\n{\n  \"status_code\": 404,\n  \"message\": \"not found\"\n}\n```\n\nIf another error occurs during the request, the API will return a `500` error\n\n```json\n{\n  \"message\": \"Something went wrong. Please contact miso product team.\"\n}\n```"
      operationId: content_read_ids_api_v1_products__ids_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductListOut'
        '401':
          description: Unauthorized
          content:
            application/json:
              example:
                message: invalid api key.
        '500':
          description: Internal Server Error
          content:
            application/json:
              example:
                message: Something went wrong. Please contact miso product team.
      security:
      - Secret API Key: []
  /v1/products/_delete:
    post:
      tags:
      - Product / Content APIs
      summary: Product / Content Bulk Delete API
      description: "This API endpoint allows you to delete multiple products by providing their product_ids.\n\nTo delete multiple products, make a POST request to the following URL:\n\n```\nPOST /v1/products/_delete\n```\n\nThe request body should contain a JSON object with an array of product_ids:\n\n```json\n{\n  \"data\": {\n    \"product_ids\": [\n      \"product-1\",\n      \"product-2\",\n      // ... more product_ids to delete\n    ]\n  }\n}\n```\n\n## Response Format\n\nThe API will return a JSON object with a `message` and an array of `data`\ncontaining a `task_id` that can be used to get the status of the bulk deletion process.\n\n#### Example Successful Response\n\n```json\n{\n  \"message\": \"deleted\",\n  \"data\": {\n    \"task_id\": \"{task_id}\"\n  }\n}\n```\n\nTo check the exact response body of this task_id, make a GET request to the following endpoint:\n\n```\nGET /v1/products/_status/{task_id}\n```\n\nReplace `{task_id}` with the task_id returned from the response."
      operationId: content_bulk_delete_api_v1_products__delete_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProductBulkDeleteIn'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeleteResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              example:
                'message:': Request timeout.
        '401':
          description: Unauthorized
          content:
            application/json:
              example:
                message: invalid api key.
        '403':
          description: Forbidden
          content:
            application/json:
              example:
                message: Request is denied due to bot blocking. Please only access this API from a real browser or use Secret API Key instead.
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '500':
          description: Internal Server Error
          content:
            application/json:
              example:
                message: Something went wrong. Please contact miso product team.
      security:
      - Secret API Key: []
components:
  schemas:
    ProductListOut:
      title: ProductListOut
      required:
      - message
      - data
      type: object
      properties:
        message:
          title: Message
          type: string
        data:
          $ref: '#/components/schemas/ProductIds'
      additionalProperties: false
    ProductRecord:
      title: ProductRecord
      required:
      - product_id
      type: object
      properties:
        product_id:
          title: Product Id
          maxLength: 512
          minLength: 1
          type: string
          description: "\nThe unique identifier for this product. The Id can be in any format you use in your product \ndatabase (e.g. the product's SKU, UPC, or UUID or serial number). We will use this Id to track how users \ninteract with products and content in the Interactions records you upload to Miso. It is important to keep the Id \nconsistent between two datasets. For products that have multiple variants, you should have a unique \n`product_id` for each variant, and use `product_group_id` to group them together.\n\nFor example, for a T-shirt with SKU `123ABC` that comes in 4 sizes: `S`, `M`, `L`, `XL`, we should create four different \nproducts:\n\n```\n{ \n  \"product_id\": \"123ABC-S\",\n  \"product_group_id\" \"123ABC\"\n}\n{ \n  \"product_id\": \"123ABC-M\",\n  \"product_group_id\" \"123ABC\"\n}\n{ \n  \"product_id\": \"123ABC-L\",\n  \"product_group_id\" \"123ABC\"\n}\n{ \n  \"product_id\": \"123ABC-XL\",\n  \"product_group_id\" \"123ABC\"\n}\n```   \n\n * Constraints\n    * Can't contain `,`\n    * Can't start with `_`\n    * Length <= 512\n"
          example: 123ABC-S-Black
        product_group_id:
          title: Product Group Id
          type: string
          description: "\nThe `product_group_id` is used to prevent the same product (but a different variant) from showing multiple \ntimes in the search or recommendation results. When one product has multiple variants (for example, different \nsizes, colors, or materials), you should assign a unique product_id to each variant, but assign the same \n`product_group_id` to all of them. If `product_group_id` is not given, we default to the value of `product_id`. \n"
          example: 123ABC
        parent_id:
          title: Parent Id
          type: string
          description: "\nThe `parent_id` is used to declare a parent-child relationship between two \"Products\". \nSuch relationships are common in marketplaces and content media sites with user generated contents. \nFor example, an E-commerce marketplace (such as E-bay or Amazon) \nmay have \"Shops\" (as parents) and \"Merchandises\" \n(as children), and a social streaming site, such as YouTube, may have \"Channel\" (as parents) and \"Video\" (as children). In these sites, both entities can be modeled as \"Products\", and can both be returned in Search and Recommendation APIs.\n\nDeclaring the parent-child relationships allows Miso to automatically propagate interactions from one product to the other.\nFor example, when a user \"watch\" a \nVideo, Miso will propagate this signal to the \nChannel which publishes this Video, even if users do not directly interact with the Channel page. Such implicit \ninteractions\nare particularly useful when making recommendations for Channel because it gives Miso much more information \nabout users' interests to different Channels than solely relying on users' direct interactions with the \nthem, which happens less often. \n\n`parent_id` needs to be a non-empty string referring to the `product_id` of the parent product. \nThe parent product can be uploaded in a separate batch, and does not need to exist before its children products.\n\nThe implicit interactions will only exist during Miso's training process, and will not show up in the \nInteraction dataset.\n\n"
          example: Nike_Shop_123
        related_ids:
          title: Related Ids
          type: array
          items:
            type: string
          description: The product_id or product_group_id of other products that are related to this Product
        type:
          title: Type
          type: string
          description: "\nThe `type` of product. This is for sites that have more than one type of product or content that they want their users \nto interact with. If your site has only one type of product, you can leave this field out. \nA classic example is travel sites, which have both *hotel* and *flight* sales. It is also useful for sites that let \nusers interact with products as well as *product bundles*. For example, on YouTube, each video is a product that users \ncan watch, while each channel, containing multiple videos, is also a product that users can subscribe to.\n\nFor model quality, it is preferable to model all these distinct product types in the same data set, so that a user's \ninterests for one type of product can inform their interests in another type of products. The `type` field helps Miso \nmake these distinctions.\n"
          example: clothes
        title:
          title: Title
          type: string
          description: "\nThe title of the product. During a search, Miso will put predictive weight behind the title, \nbecause it is often the main way users identify a product.\n"
          example: Japanese Shiba Inu Dog Eating Miso Soup T-Shirt
        description:
          title: Description
          type: string
          description: "\nThe `description` text of the product. Miso assumes `description` contains longer textual content than other \nstring-based fields. For example, term frequency matters more here than in a field like the title. Miso’s \nsemantic understanding can extract a lot of valuable information from having a product description that is \nplain-spoken and detailed. \n"
          example: This cute Shiba inu dog eating Miso soup is perfect for those who love Japanese culture.
        short_description:
          title: Short Description
          type: string
          description: "\nThe `short_description` text of the product. Miso assumes `short_description` contains a shorter version \nor a summary of the `description` field.\n"
          example: Cute Shiba Inu Dog Eating Miso Soup T-Shirt
        language:
          title: Language
          minLength: 2
          type: string
          description: "\nThe `language` of the product description and content in [two-letter ISO 639-1 code](\nhttps://en.wikipedia.org/wiki/ISO_639-1). For example, English = `en`, Chinese = `zh`. \nMiso will use this field to determine the proper way to index the product description. If this field is not specified, \nwe will determine the language automatically. \n\nWe also use the language field to determine users’ interests in content of different languages. This is particularly \nimportant for content media sites that have different languages of content. \n\n* Constraints:\n    * [Two-letter ISO 639-1 code](https://en.wikipedia.org/wiki/ISO_639-1). \n    For example, English = `en`, Chinese = `zh`.\n"
          example: en
        created_at:
          title: Created At
          anyOf:
          - type: string
            format: date-time
          - type: string
            format: date
          description: "\nThe time when the product was first created or became available on your site as an ISO-8601 date or datetime string.  \n"
        published_at:
          title: Published At
          anyOf:
          - type: string
            format: date-time
          - type: string
            format: date
          description: "\nThe time when the product was published as an ISO-8601 date or datetime string. \n"
        updated_at:
          title: Updated At
          anyOf:
          - type: string
            format: date-time
          - type: string
            format: date
          description: "\nThe time when the product was updated as an ISO-8601 date or datetime string. \n"
        categories:
          title: Categories
          type: array
          items:
            type: array
            items:
              type: string
          description: "\nIn Miso, you describe a product or content category as a hierarchical list of strings from broad to narrow, \ncalled a `category`. (See the `category_page_view` interaction.) \n\nUse the `categories` field of products to specify the hierarchical category or categories that the product \nbelongs to. A product may belong to only a single `category`, or multiple. \n\nFor example, a product could be in both:\n * *Toys & Games > Toys > Dolls, Playsets & Toy Figures > Stuffed Animals*, and\n * *Arts & Entertainment > Hobbies & Creative Arts > Collectibles*. \n\n This field should be a list of a list of strings, where category levels go from broad to narrow, such as: \n\n```\n{\"categories\":\n    [\n        // the first category the product belongs to\n        [\"TOYS & GAMES\", \"TOYS\", \"DOLLS, PLAYSETS & TOY FIGURES\", \"STUFFED ANIMALS\"],\n        // the second category the product belongs to\n        [\"ARTS & ENTERTAINMENT\", \"HOBBIES & CREATIVE ARTS\", \"COLLECTIBLES\"]\n    ]\n}\n```\n\nIf your product taxonomy has only one single level, that is not an issue:\n```\n{\"categories\":\n    [\n        // the first category the product belongs to\n        [\"Toys\"],\n        // the second category the product belongs to\n        [\"Collectibles\"]\n    ]\n}\n```\n\nThe categories are optional, but very important for profiling the products and tracking users' preferences. \n(See also the `category_page_view` interaction)\n"
          example:
          - - Clothing, Shoes & Jewelry
            - Women
            - T-Shirts
          - - Novelty
            - Tops & Tees
            - T-Shirts
        tags:
          title: Tags
          type: array
          items:
            type: string
          description: '

            The tags that have been associated with the product.


            For example:

            ```

            {"tags": ["TAG_1", 

# --- truncated at 32 KB (47 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/misoai/refs/heads/main/openapi/misoai-product-content-apis-api-openapi.yml