AppStore API endpoint
Returns the curated editorial shelves for one device category page (e.g. "Entertainment Apps for Vision"). `category_id` is a numeric, device-specific editorial page ID — not a static enum — discovered from an `appstore_editorial` response for the SAME `device`, in its "Browse by Category" shelf items' `destination_id` field. `device` enum: `iphone`, `ipad`, `mac`, `vision`, `watch`, `tv`.
/appstore/editorial/categoryMCP tool: appstore_editorial_category
Returns the curated editorial shelves for a category-scoped App Store page,
e.g. "Entertainment Apps for Vision". Category pages are reached by a
numeric editorial page ID that is device-specific and not a static/
predictable enum — discover it by calling appstore_editorial for the SAME
device first and reading destination_id off the "Browse by Category"
shelf's items.
Query parameters:
device: required. Apple device catalog. Allowed values: iphone,
ipad, mac, vision, watch, tv.category_id: required. Numeric App Store editorial page ID, digits only
(e.g. 6503709728). Not portable across devices — the same ID resolves
only for the device it was discovered under and returns 404 for any
other device.country: optional. Two-letter storefront country code.lang: optional. Result language tag.Response shape is identical to appstore_editorial's (section is set to
"category").
Example response (device=vision&category_id=6503709728):
{
"code": 200,
"msg": "OK",
"data": {
"device": "vision",
"section": "category",
"title": "Entertainment Apps",
"seo_title": "Entertainment Apps for Vision - App Store",
"shelves": [
{
"id": "shelf_eds.<id>",
"title": "The Best Entertainment Apps",
"content_type": "largeBrick",
"items": [
{
"kind": "Lockup",
"id": 389801252,
"title": "Amazon Prime Video",
"subtitle": "Originals, movies, TV, sports",
"developer_name": "AMZN Mobile LLC",
"url": "https://apps.apple.com/us/app/amazon-prime-video/id545519333"
}
]
}
]
}
}
| Field | Filled in, of 8 checked | Values in the sample |
|---|---|---|
| id | 7 | |
| content_type | 8 | “heroCarousel” and 4 other values |
| items | 8 | median 8 entries |
| title | 6 | median 27 characters |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| device | string | Yes | Apple device catalog Allowed values: iphone, ipad, mac, vision, watch, tv. | iphone | |
| category_id | string | Yes | Numeric App Store editorial page ID, discovered from appstore_editorial (same device) | 6503709728 | |
| country | string | No | Two-letter storefront country code | us | |
| lang | string | No | Result language tag | en-us | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/appstore/editorial/category?device=iphone&category_id=6503709728&country=us&lang=en" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"device": "vision",
"section": "category",
"title": "Entertainment Apps",
"seo_title": "Entertainment Apps for Vision - App Store",
"shelves": [
{
"id": "shelf_eds.<id>",
"title": "The Best Entertainment Apps",
"content_type": "largeBrick",
"items": [
{
"kind": "Lockup",
"id": 389801252,
"title": "Amazon Prime Video",
"subtitle": "Originals, movies, TV, sports",
"developer_name": "AMZN Mobile LLC",
"url": "https://apps.apple.com/us/app/amazon-prime-video/id545519333"
}
]
}
]
}
}Request schema
No body schema
Response schema
#/definitions/appstore.editorialResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | appstore.EditorialPage | No | ||||
| data.device | string | No | Apple device catalog of the page: `iphone`, `ipad`, `mac`, `vision`, `watch` or `tv`. | |||
| data.page_id | string | No | Apple's ID for the editorial page. | |||
| data.section | string | No | main | arcade | category | |||
| data.seo_title | string | No | Page title used for search results and browser tabs. | |||
| data.shelves | array | No | Content shelves on the page, in display order. | |||
| data.shelves[].content_type | string | No | Layout style Apple uses to show the shelf, for example `smallLockup`. | |||
| data.shelves[].id | string | No | Apple's ID for the shelf. | |||
| data.shelves[].items | array | No | Items shown in the shelf. | |||
| data.shelves[].items[].age_rating | string | No | Age rating shown on the item, for example `4+`. | |||
| data.shelves[].items[].bundle_id | string | No | Bundle ID of the app, when the item is a single app. | |||
| data.shelves[].items[].destination_id | string | No | DestinationID is the item's clickAction.destination.id. For a "Browse by Category" shelf item this is the target category's editorial page ID — pass it as EditorialCategoryOption.CategoryID for the SAME device. Live-verified this is NOT unique to category links, though: a regular single-app item (e.g. Lockup) carries its own ID here too (a self-referential page link, duplicating ID/AdamID) — so callers looking for a category ID should scope to the shelf titled "Browse by Category" rather than taking the first non-empty DestinationID from any shelf. | |||
| data.shelves[].items[].developer_name | string | No | Name of the developer shown on the item. | |||
| data.shelves[].items[].icon_url | string | No | template URL with unresolved size tokens | |||
| data.shelves[].items[].id | integer | No | App Store numeric track ID, when this item is a single app (same ID space as App.ID) | |||
| data.shelves[].items[].kind | string | No | raw Apple "$kind" | |||
| data.shelves[].items[].rating | number | No | Average rating shown on the item. | |||
| data.shelves[].items[].rating_count | integer | No | Number of ratings shown on the item. | |||
| data.shelves[].items[].subtitle | string | No | Subtitle shown on the item. | |||
| data.shelves[].items[].title | string | No | Title shown on the item. | |||
| data.shelves[].items[].url | string | No | the item's own apps.apple.com page, when it links to one | |||
| data.shelves[].title | string | No | absent for hero/quick-links shelves | |||
| data.title | string | No | Title of the editorial page. | |||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Missing or invalid parameters | #/definitions/app.Response |
| 404 | Category page not found | #/definitions/app.Response |
| 429 | Rate limit exceeded | #/definitions/app.Response |
| 500 | Internal server error | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/appstore/editorial/category?device=iphone&category_id=6503709728&country=us&lang=en" \
-H "x-api-key: $CRAWLORA_API_KEY"