Visual Fashion Search

This page describes API of the Visual Fashion Search service which takes a real-life photo, detects (fashion & apparel) products on this photo and finds visually similar images in the collection.

The API follows the general rules of Ximilar API as described in Section First steps.

API is a set of HTTP REST services accepting JSON-formatted documents using POST and returning JSON documents. This service run at the URL:

https://api.ximilar.com/visual-search/v2/<method>

Please, see page API Calls and Credits for exact prices for individual API calls. The Visual Fashion Search is a most complex service we provide. Each API call typically consists of detection, tagging, feature extraction and similarity search and thus the calls cost more credits than our simple services.

See it in action ...

  • We are transparent company with public pricing, taxonomy and demo.
  • You can test your fashion images on our test collection on Ximilar Fashion Demo for free!
  • Our visual search system is based on latest advancements in AI/ML/Deep Learning.
  • It is super fast and easily extensible with your custom tags, metadata or image recognition models! Filtering included!
  • Our python client library is available on gitlab and pypi

Contact us before using this service

In order to get access to the Visual Fashion Search services, please register at https://app.ximilar.com and then contact us at tech@ximilar.com to make the service accessible for your Ximilar account. You will need to have also Professional pricing plan.

Screenshot

Overview of API Methods

You always work with your "collection" of images, which is specified in the collection-id header of each API call. Your collection(s) must be first created by Ximilar administrators. All of your requests requires authentication token.

All API methods use POST, require a JSON record (JSON map) in the body of the request, and return answer as another JSON record.

List of methods

There are also methods for management of the records already inserted into the system that are very similar to those described in Ximilar Search API: Ximilar Search API:

  • /v2/get - method to insert new product photo into your collection,
  • /v2/update - method to search the most similar products given a real-life image
  • /v2/delete - method to detect product objects on the photo
  • /v2/allIDs - method for getting all items from your collection
Showing/Extracting bounding box of/from the image

You minght want to display bounding boxes of the detected objects in your application. The boundinx box has 4 coordinatest [xmin, ymin, xmax, ymax]. The first two values define left-upper corner and last two right-down corner. Here is an example of small python snippet with opencv library which will help you:

import cv2

# get bounding box of first record and first object of the record
bbox = result['records'][0]['_objects'][0]['bound_box']

# read the same image in opencv
image = cv2.imread('photo.jpg', 0)

just_box = image[int(bbox[1]) : int(bbox[3]), int(bbox[0]) : int(bbox[2])]
image_with_box = cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (255,0,0), 2)

cv2.imwrite('just_box.jpg', just_box)
cv2.imwrite('image_with_box.jpg', image_with_box)

Using your custom recognition models in visual search?

Ximilar Custom Image Recognition allows you to train image categorization or tagging models. With Ximilar Flows you can connect these models to powerful complex vision systems with hierarchy. During the insert process to your collection or during the search/query you can call your trained models with Flows. This will add more knowledge/meta information to your product images. This is great if you want to recognize some special tags which are not included in our Fashion Tagging taxonomy. It is working by specifing custom_flow field in your request. There are several requirements for the flow which must be satisfied in order to run it successfully. Just write us and we will discuss the usage with you.

Detailed Descriptions of API Methods

Taxonomy:

Visual Search service is our most complex service and is using another services as image recognition, custom object detection, fashion tagging ... For more detailed description of our taxonomy see Fashion Tagging service.

Just send the GET request on:

https://api.ximilar.com/tagging/fashion/v2/top_categories

curl --request GET \
  --url https://api.ximilar.com/tagging/fashion/v2/top_categories \
  --header 'content-type: application/json'

CLICK TO SHOW JSON RESULT

{
  "Clothing": [
    "Clothing/Baby Clothes",
    "Clothing/Dresses",
    "Clothing/Jackets and Coats",
    "Clothing/Overalls and Dungarees"
    ...
  ],
  ...
}

/v2/product/insert

You call this insert method to fill the visual fashion search index with your data. Unlike the standard /v2/insert, this method first detects objects on the image, cuts the rectangular area with the object out of the image, extracts visual descriptor from the area, assigns some tags and only then inserts the image into the index. The inserted records can also contain additional meta data for consequent filtering when calling search method.

Parameters:​

  • records: A list of product photos to be inserted into the collection; each record
    • must contain either of ​_url, _base64
    • must contain _id field, which is unique id image in your collection
    • must containt product_id, which is unique id of your product, multiple records/images can contain same product id
    • all the records (batch) in one request must have same product_id
    • each record can contain Top Category and Category (must be same across batch) field which defines the main-category and sub-category of the product on the photo; for some images, it's not clear what object is the main (e.g. a model with a t-shirt and pants) and thus it's recommended to send over this information about Top category and Category (if known). For example: t-shirt "Top Category": "Clothing" and "Category": "Clothing/Upper". If system is not able to detect any "Clothing" on some of your records then these records will be skipped.
    • if you don't send Top Category and Category fields in records, then system will try to guess the most dominant item category on records
    • you can also include any meta data in your records and in search method use filtering on them
    • if you know the location (bounding box) of the object, than you can include it in the records (see response), the object must contain bounding box with coordinates
    • if you know gender (men, women, children) or any tag from taxonomy you can include it into list of _tags_custom
    • if you want to add any other/custom tag from your db then add it to the _tags_custom
    • If you want to skip processing of your records with fashion tagging during the insert then include filled Top Category, Category and empty list _tags_simple
CLICK TO SHOW REQUEST

$ curl --request POST \
    --url https://api.ximilar.com/visual-search/v2/product/insert \
    --header 'authorization: Token __API_TOKEN__' \
    --header 'collection-id: __COLLECTION_ID__' \
    --header 'content-type: application/json' \
    --data '{
    "fields_to_return": [ "_id", "_url", "product_id" ],
    "records": [
      {
        "_url": "__URL_IMAGE_PATH__",
        "_id": "__IMAGE_ID_1__",
        "product_id: "__PRODUCT_ID__",
        "Top Category": "Clothing",
        "Category": "Clothing/Upper
      },
      {
        "_url": "__URL_IMAGE_PATH__",
        "_id": "__IMAGE_ID_2__",
        "product_id: "__PRODUCT_ID__",
        "Top Category": "Clothing",
        "Category": "Clothing/Upper
      }
    ]
  }'
from ximilar.client.visual import VisualSearchClient

client = VisualSearchClient(token='__API_TOKEN__', collection='__COLLECTION_ID__')

result = client.insert([{
  "_url": "__URL_PATH_TO_IMAGE__",
  "_id": "__IMAGE_ID_1__",
  "product_id": "__PRODUCT_ID__",
  "Top Category": "Clothing",
  "Category": "Clothing/Upper"
}])

The response is very similar as the one of method /v2/insert. The returned records contain also the detected objects with their tags and also parameter "_obj_type" with possible values: "clothing", "footwear", "watch".

/v2/product/search

This is main method of the visual fashion search for finding most similar items from the picture. If more than 1 object is detected then search will return similar items for most dominant item (with largest area) on picture.

Pick object and search ...

  • If you want to get similarity results for different object, then send only this object in your _objects field. You can do this on two requests, first response will return detected _objects and second request is made with one desired object. You can also create object by self. This is great option if you have mobile application and you want to let user draw the object with finger ...
  • If you want to search only in specified category, then set Top Category or/and Category in record
  • If you want to search by gender (men, women, children) then specify one of them in _tags_custom field (list)
  • If you want to search by any other tag (for example from your database) then specify them in _tags_custom field (list)
  • If you want to skip processing of your records with fashion tagging then include filled Top Category, Category and empty list _tags_simple

Parameters:

  • records - a list that should contain only ONE real-life photo to find similar products for
    • You can work with _tags_custom, _tags_simple, Top Category and Category fields in similar way as in insert method.
    • You can specify _objects with one object to search on this item
  • k with default value 10
  • from with default value 0
  • fields_to_return additional fields to be returned for each records in the answer. By default only these fields are returned: [ _id, _url, _file, _objects ]
  • filter - additional filter to be applied during the search (besides collection and type of detected object); default value: null

See this Product & Product Similarity for details on the search params.

CLICK TO SHOW REQUEST

$ curl --request POST \
    --url https://api.ximilar.com/visual-search/v2/product/search \
    --header 'authorization: Token __API_TOKEN__' \
    --header 'collection-id: __COLLECTION_ID__' \
    --header 'content-type: application/json' \
    --data '{
    "fields_to_return": [ "_id", "_url", "product_id" ],
    "records": [
        {
            "_url": "https://www.ximilar.com/fashion_examples/3.jpg"
        }
    ]
  }'
from ximilar.client.visual import VisualSearchClient

client = VisualSearchClient(token='__API_TOKEN__', collection='__COLLECTION_ID__')

result = client.search([{"_url": "__URL_PATH_TO_IMAGE__"}])

CLICK TO SHOW RESPONSE

{
  "answer_count": 7,
  "answer_distances": [
    0.21916418,
    0.2711737,
    0.3014072,
    0.30433413,
    0.3111067,
    0.31272313,
    0.32774344
  ],
  "answer_records": [
    {
      "_id": "647070",
      "_url": "https://images.ximilar.com/fashion/Clothing/Clothes/exp7w0bqfhzcny84/exp7w0bqfhzcny84_1.jpg",
      "product_id": "exp7w0bqfhzcny84"
    },
    {
      "_id": "710849",
      "_url": "https://images.ximilar.com/fashion/Clothing/Clothes/kxbq084yrdlat3h9/kxbq084yrdlat3h9_1.jpg",
      "product_id": "kxbq084yrdlat3h9"
    },
    {
      "_id": "365583",
      "_url": "https://images.ximilar.com/fashion/Clothing/Clothes/Evening dresses/bcurpeay8jh9i1td/bcurpeay8jh9i1td_1.jpg",
      "product_id": "bcurpeay8jh9i1td"
    },
    {
      "_id": "76873",
      "_url": "https://images.ximilar.com/fashion/Clothing/Clothes/zsj8rdmg2bx7cf4o/zsj8rdmg2bx7cf4o_1.jpg",
      "product_id": "zsj8rdmg2bx7cf4o"
    },
    {
      "_id": "617197",
      "_url": "https://images.ximilar.com/fashion/Clothing/Clothes/Evening dresses/e9wz8gjkbmdnptr5/e9wz8gjkbmdnptr5_1.jpg",
      "product_id": "e9wz8gjkbmdnptr5"
    },
    {
      "_id": "536599",
      "_url": "https://images.ximilar.com/fashion/Clothing/Clothes/yt8kncupz1s0qwbo/yt8kncupz1s0qwbo_1.jpg",
      "product_id": "yt8kncupz1s0qwbo"
    },
    {
      "_id": "1269617",
      "_url": "https://images.ximilar.com/fashion/Clothing/Jeans/repq5vcwflaobhn0/repq5vcwflaobhn0_1.jpg",
      "product_id": "repq5vcwflaobhn0"
    }
  ],
  "fields_to_return": [
    "_id"
  ],
  "k": 7,
  "records": [
    {
      "Category": "Clothing/Dresses",
      "Top Category": "Clothing",
      "_height": 1215,
      "_id": "b617b5be-26ef-4373-bf32-86d243a64454",
      "_objects": [
        {
          "Category": "Clothing/Dresses",
          "Top Category": "Clothing",
          "_tags": {
            "Category": [
              {
                "id": "5d8022d5-db81-4957-a7d3-216911e771ed",
                "name": "Clothing/Dresses",
                "prob": 0.95977
              }
            ],
            "Color": [
              {
                "id": "8d196ce6-a4f2-4c7f-9fd8-155d3d443ed0",
                "name": "black",
                "prob": 0.99998
              }
            ],
            "Cut": [
              {
                "id": "ca9fbf7a-8958-4f61-88b7-bff1a79788ed",
                "name": "shoulder straps",
                "prob": 0.81979
              }
            ],
            "Gender": [
              {
                "id": "66685452-fd7f-4db3-a6c6-f00edac0348c",
                "name": "women",
                "prob": 0.98189
              }
            ],
            "Length": [
              {
                "id": "c510bc6d-bbd2-43e0-a908-ab324d6639c4",
                "name": "mini",
                "prob": 0.61075
              }
            ],
            "Neckline": [
              {
                "id": "ee81d7fb-3e52-4e26-997c-94a6fcf6615e",
                "name": "v-neck",
                "prob": 0.47993
              },
              {
                "id": "27755591-d8de-4832-bdc7-531ad5be9297",
                "name": "low cut",
                "prob": 0.44727
              }
            ],
            "Pattern & Material": [
              {
                "id": "5065ee09-6fa1-48f3-834f-eced387f46a8",
                "name": "plain",
                "prob": 0.5773
              }
            ],
            "Sleeves": [
              {
                "id": "d2bfd6a2-75c1-47b8-a590-3a50fea86424",
                "name": "sleeveless",
                "prob": 0.82627
              }
            ],
            "Style": [
              {
                "id": "dca973b6-9718-4bf6-963a-a3618f2b536a",
                "name": "casual",
                "prob": 0.45188
              },
              {
                "id": "50a3736d-de54-4b94-9db9-798cbf7fb2e0",
                "name": "elegant",
                "prob": 0.32913
              }
            ],
            "Subcategory": [
              {
                "id": "e9bd213d-7af2-4285-af37-212f4e9aeef4",
                "name": "sheath dresses",
                "prob": 0.77134
              }
            ],
            "Top Category": [
              {
                "id": "13052be8-2cc7-48e4-a782-a00d658f997c",
                "name": "Clothing",
                "prob": 1.0
              }
            ],
            "View": [
              {
                "id": "fe4b3dc0-80de-4b7e-a47f-7f87afc5b705",
                "name": "front",
                "prob": 0.93595
              }
            ]
          },
          "_tags_simple": [
            "Clothing/Dresses",
            "black",
            "mini",
            "sheath dresses",
            "plain",
            "shoulder straps",
            "sleeveless",
            "front",
            "Clothing",
            "women"
          ],
          "bound_box": [
            336,
            484,
            521,
            960
          ],
          "name": "Clothing",
          "prob": 0.9141664505004883
        },
        {
          "bound_box": [
            458,
            718,
            546,
            823
          ],
          "name": "Bags",
          "prob": 0.8158316612243652
        },
        {
          "bound_box": [
            346,
            1010,
            429,
            1115
          ],
          "name": "Footwear",
          "prob": 0.68309485912323
        },
        {
          "bound_box": [
            468,
            1067,
            527,
            1191
          ],
          "name": "Footwear",
          "prob": 0.7120382189750671
        }
      ],
      "_status": {
        "code": 200,
        "request_id": "eecb985b-5ba6-45e5-9c0b-eddcc564433f",
        "text": "OK"
      },
      "_url": "https://www.ximilar.com/fashion_examples/3.jpg",
      "_width": 810
    }
  ],
  "statistics": {
    "processing time": 1.7492084503173828,
  },
  "status": {
    "code": 200,
    "proc_id": "5ec1b004-ae9a-4da8-a150-cb36f5705d04",
    "request_id": "eecb985b-5ba6-45e5-9c0b-eddcc564433f",
    "text": "OK"
  }
}

/v2/product/detect

You can use this method to detect all product objects on your real-life photo.

Parameters:

  • records: A list of one real-life photo to detect product object on
    • must contain either of _url or _base64 field
CLICK TO SHOW REQUEST

curl https://api.ximilar.com/visual-search/v2/product/detect 
  -H "Content-Type: application/json" 
  -H "Authorization: Token ___API_TOKEN__" 
  -H "collection-id: COLLECTION_ID"
  -d '{
    "records": [{"_url": "http://url.to/real_life/photo.jpg"}]
  }
from ximilar.client.visual import VisualSearchClient

client = VisualSearchClient(token='__API_TOKEN__', collection='__COLLECTION_ID__')

result = client.detect([{"_url": "__URL_PATH_TO_IMAGE__"}])

CLICK TO SHOW JSON RESULT

Objects are present in the `_objects` field in a record. Every object contains `name`, probability `prob`, `bound_box`. Additional information like `Category` and `Top Category`/`name` of most dominant object is included.

{
  "records": [
    {
      "id": "test_1",
      "product_id": "1223516010",
      "_id": "1223516010_3",
      "_url": "https://vize.ai/mall_acceptance//05.jpg",
      "_status": {
        "code": 200,
        "text": "OK",
        "request_id": "91a46a1c-8b20-4e54-b6ea-857d294e788a"
      },
      "_width": 600,
      "_height": 800,
      "_objects": [
        {
          "name": "Clothing",
          "bound_box": [
            95,
            135,
            537,
            708
          ],
          "prob": 0.9430508613586426,
          "Top Category": "Clothing",
          "Category": "Clothing/Upper"
        },
        {
          "name": "Jewellery",
          "bound_box": [
            111,
            553,
            168,
            601
          ],
          "prob": 0.740037202835083
        }
      ]
    }
  ],
  "statistics": {
    "processing time": 1.1638612747192383
  },
  "status": {
    "code": 200,
    "text": "OK",
    "request_id": "91a46a1c-8b20-4e54-b6ea-857d294e788a",
    "proc_id": "f83fd82a-17e4-4deb-953a-3f658be011dc"
  }
}

/v2/get

Description: finds and returns given list of records (identified by _id) from the index.

Endpoint url ...

Use visual-search prefix in endpoint instead of similarity/photos.

Example:

$ curl 'https://api.ximilar.com/similarity/photos/v2/get' -i -X POST \
    -H 'Content-Type: application/json;charset=UTF-8' \
    -H 'collection-id: mycoll_id' \
    -H 'Authorization: Token 1af538baa90-----XXX-----baf83ff24' \
    -d '{
  "fields_to_return" : [ "*" ],
  "records" : [ {
    "_id" : "1"
  }, {
    "_id" : "2"
  }, {
    "_id" : "3"
  } ]
}'
{
  "fields_to_return" : [ "*" ],
  "records" : [ {
    "_id" : "1"
  }, {
    "_id" : "2"
  }, {
    "_id" : "3"
  } ]
}
$ echo '{
  "fields_to_return" : [ "*" ],
  "records" : [ {
    "_id" : "1"
  }, {
    "_id" : "2"
  }, {
    "_id" : "3"
  } ]
}' | http POST 'https://api.ximilar.com/similarity/photos/v2/get' \
    'Content-Type:application/json;charset=UTF-8' \
    'collection-id:mycoll_id' \
    'Authorization:Token 1af538baa90-----XXX-----baf83ff24'

Request description:

Path Type Required Description
records Array Yes Records to be returned, identified by their _id
fields_to_return Array No Fields to be returned in every record, defaults to ["*"]

Example response:

{
  "status" : {
    "code" : 213,
    "text" : "some of the records not found"
  },
  "statistics" : {
    "OperationTime" : 9
  },
  "answer_records" : [ {
    "_url" : "http://mydomain.com/img.png",
    "_id" : "1"
  }, {
    "_file" : "/path/to/img.png",
    "_id" : "2"
  } ],
  "skipped_records" : [ {
    "_id" : "3",
    "_reason" : {
      "status" : {
        "code" : 404,
        "text" : "records not found"
      }
    }
  } ],
  "answer_count" : 2
}

Response description:

Path Type Description
answer_records Array Records found
skipped_records Array Records that couldn't be returned
answer_count Number Number of records found

Possible status values:

  • "status": {"code": 205, "text": "records found"} -- all records found and returned
  • "status": {"code": 206, "text": "some of the records not found"} -- some of the records are returned, the rest has not been found
  • "status": {"code": 404, "text": "records not found"} -- none of the requested records were found and empty answer is returned

/v2/update

Endpoint url ...

Use visual-search prefix in endpoint instead of similarity/photos.

Description: updates attributes of the given list of records (identified by _id) stored in the index. This method can only update additional attributes used for filtering (including tags), but NOT the image (use delete and re-insert if you want to change the image).

Example:

$ curl 'https://api.ximilar.com/similarity/photos/v2/update' -i -X POST \
    -H 'Content-Type: application/json;charset=UTF-8' \
    -H 'collection-id: mycoll_id' \
    -H 'Authorization: Token 1af538baa90-----XXX-----baf83ff24' \
    -d '{
  "fields_to_return" : [ "*" ],
  "records" : [ {
    "_id" : "1",
    "day" : "monday"
  }, {
    "_id" : "2",
    "day" : "tuesday"
  }, {
    "_id" : "3",
    "day" : "wednesday"
  } ]
}'
{
  "fields_to_return" : [ "*" ],
  "records" : [ {
    "_id" : "1",
    "day" : "monday"
  }, {
    "_id" : "2",
    "day" : "tuesday"
  }, {
    "_id" : "3",
    "day" : "wednesday"
  } ]
}
$ echo '{
  "fields_to_return" : [ "*" ],
  "records" : [ {
    "_id" : "1",
    "day" : "monday"
  }, {
    "_id" : "2",
    "day" : "tuesday"
  }, {
    "_id" : "3",
    "day" : "wednesday"
  } ]
}' | http POST 'https://api.ximilar.com/similarity/photos/v2/update' \
    'Content-Type:application/json;charset=UTF-8' \
    'collection-id:mycoll_id' \
    'Authorization:Token 1af538baa90-----XXX-----baf83ff24'

Request description:

Path Type Required Description
records Array Yes Records to be updated, identified by their _id
fields_to_return Array No Fields to be returned in every record, defaults to ["*"]

Example response:

{
  "status" : {
    "code" : 213,
    "text" : "some of the records not found"
  },
  "statistics" : {
    "OperationTime" : 1
  },
  "answer_records" : [ {
    "another-field" : "another-value",
    "_id" : "1",
    "day" : "monday"
  }, {
    "day" : "tuesday",
    "_id" : "2"
  } ],
  "skipped_records" : [ {
    "_id" : "3",
    "_reason" : {
      "status" : {
        "code" : 404,
        "text" : "records not found"
      }
    }
  } ],
  "answer_count" : 2
}

Response description:

Path Type Description
answer_records Array Updated records
skipped_records Array Records that couldn't be updated
answer_count Number Number of records updated

Possible status values (the same as /v2/get operation):

  • "status": {"code": 205, "text": "records found"} -- all records found and returned
  • "status": {"code": 206, "text": "some of the records not found"} -- some of the records are returned, the rest has not been found
  • "status": {"code": 404, "text": "records not found"} -- none of the requested records were found and empty answer is returned

/v2/delete

Endpoint url ...

Use visual-search prefix in endpoint instead of similarity/photos.

Description: deletes given list of records (identified by _id) from the index

Example:

$ curl 'https://api.ximilar.com/similarity/photos/v2/delete' -i -X POST \
    -H 'Content-Type: application/json;charset=UTF-8' \
    -H 'collection-id: mycoll_id' \
    -H 'Authorization: Token 1af538baa90-----XXX-----baf83ff24' \
    -d '{
  "records" : [ {
    "_id" : "1"
  }, {
    "_id" : "2"
  }, {
    "_id" : "3"
  } ]
}'
{
  "records" : [ {
    "_id" : "1"
  }, {
    "_id" : "2"
  }, {
    "_id" : "3"
  } ]
}
$ echo '{
  "records" : [ {
    "_id" : "1"
  }, {
    "_id" : "2"
  }, {
    "_id" : "3"
  } ]
}' | http POST 'https://api.ximilar.com/similarity/photos/v2/delete' \
    'Content-Type:application/json;charset=UTF-8' \
    'collection-id:mycoll_id' \
    'Authorization:Token 1af538baa90-----XXX-----baf83ff24'

Request description:

Path Type Required Description
records Array Yes Records to be deleted by their _id

Example response:

{
  "status" : {
    "code" : 213,
    "text" : "some of the records not found"
  },
  "statistics" : {
    "OperationTime" : 3
  },
  "answer_records" : [ {
    "_id" : "1"
  }, {
    "_id" : "2"
  } ],
  "skipped_records" : [ {
    "_id" : "3",
    "_reason" : {
      "status" : {
        "code" : 404,
        "text" : "records not found"
      }
    }
  } ],
  "answer_count" : 2
}

Response description:

Path Type Description
answer_records Array Successfully deleted records
skipped_records Array Records that couldn't be deleted
answer_count Number Number of deleted records

Possible status values:

  • "status": {"code": 220, "text": "records deleted"} -- all records deleted
  • "status": {"code": 206, "text": "some of the records not found"} -- some of the records were not deleted. Answer field answer_records contains list of records actually deleted and "skipped_records contains the list of records not found.
  • "status": {"code": 404, "text": "records not found"} -- none of the requested records were found and deleted

/v2/allIDs

Description: gets all IDs of records stored in the collection.

Example:

$ curl 'https://api.ximilar.com/visual-search/v2/allIDs' -i -X POST \
    -H 'Content-Type: application/json;charset=UTF-8' \
    -H 'collection-id: mycoll_id' \
    -H 'Authorization: Token 1af538baa90-----XXX-----baf83ff24' \
    -d '{}'

Example response:

{
  "status" : {
    "code" : 200,
    "text" : "OK"
  },
  "statistics" : {
    "OperationTime" : 3
  },
  "answer_records" : [ {
    "_id" : "1"
  }, {
    "_id" : "2"
  } ],
  "answer_count" : 2
}