Shop.app API endpoint
Lists products from a Shop.app merchant, by shop `handle`. `limit` defaults to 30 (max 60), `sort_by` is `MOST_SALES` (default), `PRICE_LOW_TO_HIGH`, `PRICE_HIGH_TO_LOW` or `RELEVANCE`, and `in_stock` defaults to true. Each card has its id, title, price, original price, image and URL. An invalid `sort_by` is rejected.
/shop-app/shops/{handle}/productsReturns public product cards from a Shop.app merchant profile.
Path parameters:
handle: required. Shop.app shop handle. Example: marcnolan.Query parameters:
limit: optional integer. Maximum products to return. Default: 30; maximum: 60.sort_by: optional enum. Allowed values: MOST_SALES, PRICE_LOW_TO_HIGH, PRICE_HIGH_TO_LOW, RELEVANCE. Default: MOST_SALES.in_stock: optional boolean. Request in-stock products. Default: true.Notable response behavior:
sort_by values return invalid-param errors before upstream IO.| Field | Filled in, of 30 checked | Values in the sample |
|---|---|---|
| id | 30 | |
| variant_id | 30 | |
| title | 30 | “Aiden Black Leather Combat Boots” and 29 other values |
| url | 30 | shop.app |
| shop_id | 30 | |
| shop_name | 30 | Marc Nolan in all 30 |
| price | 30 | 91 to 228, median 215 |
| currency | 30 | SGD in all 30 |
| image | 30 | cdn.shopify.com |
| image_alt | 30 | “Aiden Black Leather Combat Boots” and 29 other values |
| position | 30 | 1 to 30, median 15 |
| original_price | 11 | 189 to 228, median 195 |
| on_sale | 10 | true in 10 of 10 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| handle (path) | string | Yes | Shop handle | marcnolan | |
| limit | integer | No | 30 and supports up to 60 | Maximum products, defaults to 30 and supports up to 60 | 30 |
| sort_by | string | No | Sort mode Allowed values: MOST_SALES, PRICE_LOW_TO_HIGH, PRICE_HIGH_TO_LOW, RELEVANCE. | MOST_SALES | |
| in_stock | boolean | No | Request in-stock products | true | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/shop-app/shops/marcnolan/products?limit=10&sort_by=MOST_SALES&in_stock=true" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"shop_handle": "marcnolan",
"sort_by": "MOST_SALES",
"products": [
{
"id": "4796042281039",
"title": "Aiden Black Leather Combat Boots",
"position": 1
}
]
}
}Request schema
No body schema
Response schema
#/definitions/shopapp.shopProductsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | shopapp.ShopProductsResponse | No | ||||
| data.collection | object | No | Collection the products were filtered by. | |||
| data.collection.id | string | No | 292518002767 | Shop.app collection ID. | ||
| data.collection.slug | string | No | mens-dress-shoes | URL slug of the collection. | ||
| data.collection.title | string | No | Mens Dress Shoes | Collection title, for example `Mens Dress Shoes`. | ||
| data.collection.url | string | No | Shop.app page URL of the collection. | |||
| data.collection_id | string | No | 292518002767 | ID of the collection the products were filtered by. | ||
| data.limit | integer | No | 30 | Maximum number of products requested. | ||
| data.next_cursor | string | No | Cursor Shop.app returns for the next page of products. | |||
| data.products | array | No | Products of the shop. | |||
| data.products[].currency | string | No | USD | Currency code of `price` and `original_price`. | ||
| data.products[].group_query | string | No | kids' athletic sneakers | Search query of the product group this item belongs to. | ||
| data.products[].group_title | string | No | kids' athletic sneakers | Title of the product group this item belongs to. | ||
| data.products[].id | string | No | 8075903107261 | Shop.app product ID. | ||
| data.products[].image | string | No | https://cdn.shopify.com/s/files/1/1145/5784/files/example.jpg | URL of the product's first image. | ||
| data.products[].image_alt | string | No | Black sneaker side view | Alt text of the product's first image. | ||
| data.products[].on_sale | boolean | No | `true` when the original price is higher than the current price. | |||
| data.products[].original_price | number | No | 120 | Price before the discount, in `currency`. | ||
| data.products[].position | integer | No | 1 | Position of the product in the results, starting at 1. | ||
| data.products[].price | number | No | 100 | Current price of the product, in `currency`. | ||
| data.products[].shop_id | string | No | 62696 | Shop.app ID of the shop selling the product. | ||
| data.products[].shop_name | string | No | BILLY Footwear | Name of the shop selling the product. | ||
| data.products[].title | string | No | Black/Black/Gum BILLY Sport Inclusion DZ1 | Product title as shown on the Shop.app card. | ||
| data.products[].url | string | No | https://billyfootwear.com/products/black-black-gum-billy-sport-inclusion-dz1-zipper-shoes?utm_source=shop_app | Link to the product page. | ||
| data.products[].variant_id | string | No | 46242960965821 | ID of the product variant shown on the card. | ||
| data.shop_handle | string | No | marcnolan | Shop.app handle of the shop. | ||
| data.sort_by | string | No | MOST_SALES | Sort order applied: `MOST_SALES`, `PRICE_LOW_TO_HIGH`, `PRICE_HIGH_TO_LOW` or `RELEVANCE`. | ||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/shop-app/shops/marcnolan/products?limit=10&sort_by=MOST_SALES&in_stock=true" \
-H "x-api-key: $CRAWLORA_API_KEY"