Public API
Mount Emporium exposes a small set of public, read-only JSON endpoints designed for AI answer engines, SEO tools, and third-party integrators. All endpoints are cross-origin (Access-Control-Allow-Origin: *), respect ETag / If-None-Match with 304 Not Modified, and return no PII.
Base URL
https://www.mountemporium.comOpenAPI specification
A full OpenAPI 3.1 document describing every endpoint below — parameters, schemas, headers, and error responses — is available as static JSON. Point Swagger UI, Redoc, Postman, Insomnia, or your codegen at:
https://www.mountemporium.com/api/public/seo/openapi.jsonCommon response headers
Content-Type: application/json; charset=utf-8Cache-Control: public, max-age=1800, s-maxage=3600ETag: "<hash>"— echo inIf-None-Matchnext call to get a 304Last-Modified: <RFC 1123 date>Access-Control-Allow-Origin: *
Endpoints
/api/public/seo/index.jsonTry it →Discovery manifest listing every public SEO/AEO endpoint. Start here to enumerate what's available.
Request
curl -sS \
-H "Accept: application/json" \
-H "If-None-Match: \"<etag-from-previous-response>\"" \
"https://www.mountemporium.com/api/public/seo/index.json"Response — 200 OK, application/json
{
"site": "https://www.mountemporium.com",
"generated_at": "2026-07-20T12:00:00.000Z",
"endpoints": [
{
"id": "structured-data",
"url": "https://www.mountemporium.com/api/public/seo/structured-data.json",
"description": "schema.org @graph for the whole site",
"params": ["kind"]
},
{
"id": "sitemap",
"url": "https://www.mountemporium.com/api/public/seo/sitemap.json",
"description": "Machine-readable sitemap with lastmod + priority",
"params": ["kind"]
},
{
"id": "entities",
"url": "https://www.mountemporium.com/api/public/seo/entities.json",
"description": "AEO entity export (articles, FAQs, breadcrumbs)",
"params": ["kind"]
},
{
"id": "crawler-config",
"url": "https://www.mountemporium.com/api/public/seo/crawler-config.json",
"description": "robots + sitemaps + llms.txt hubs as JSON",
"params": []
}
],
"xml_feeds": {
"sitemap": "https://www.mountemporium.com/sitemap.xml",
"robots": "https://www.mountemporium.com/robots.txt",
"llms": "https://www.mountemporium.com/llms.txt"
}
}/api/public/seo/structured-data.jsonTry it →Aggregated schema.org @graph for the entire site — Organization, WebSite, page ItemList, and per-article/product JSON-LD.
Query parameters
| Name | Values | Default | Notes |
|---|---|---|---|
kind | all | organization | website | pages | articles | products | all | Filter which node types are returned. |
Request
curl -sS \
-H "Accept: application/json" \
-H "If-None-Match: \"<etag-from-previous-response>\"" \
"https://www.mountemporium.com/api/public/seo/structured-data.json?kind=articles"Response — 200 OK, application/json
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://www.mountemporium.com/#organization",
"name": "Mount Emporium",
"url": "https://www.mountemporium.com",
"logo": "https://www.mountemporium.com/logo.png",
"sameAs": [
"https://www.instagram.com/mountemporium",
"https://www.linkedin.com/company/mountemporium"
]
},
{
"@type": "Article",
"@id": "https://www.mountemporium.com/blog/rto-playbook#article",
"headline": "The RTO Playbook for Indian dropshippers",
"datePublished": "2026-05-14",
"author": { "@type": "Organization", "name": "Mount Emporium" },
"image": "https://www.mountemporium.com/blog/rto-playbook/cover.jpg"
}
]
}/api/public/seo/sitemap.jsonTry it →Machine-readable sitemap: URLs with lastmod, priority, changefreq, page summaries, breadcrumb trails, and images.
Query parameters
| Name | Values | Default | Notes |
|---|---|---|---|
kind | all | pages | products | articles | faqs | breadcrumbs | all | — |
Request
curl -sS \
-H "Accept: application/json" \
-H "If-None-Match: \"<etag-from-previous-response>\"" \
"https://www.mountemporium.com/api/public/seo/sitemap.json?kind=products"Response — 200 OK, application/json
{
"site": "https://www.mountemporium.com",
"generated_at": "2026-07-20T12:00:00.000Z",
"count": 240,
"entries": [
{
"kind": "product",
"url": "https://www.mountemporium.com/shop/neck-fan-portable",
"path": "/shop/neck-fan-portable",
"lastmod": "2026-07-18",
"changefreq": "weekly",
"priority": "0.8",
"title": "Neck Fan (Portable)",
"summary": "Rechargeable neck-hanging fan with 3 speeds.",
"images": [
"https://www.mountemporium.com/cdn/products/neck-fan-1.jpg"
],
"breadcrumbs": [
{ "name": "Home", "url": "https://www.mountemporium.com/" },
{ "name": "Shop", "url": "https://www.mountemporium.com/shop" },
{ "name": "Neck Fan (Portable)", "url": "https://www.mountemporium.com/shop/neck-fan-portable" }
]
}
],
"xml": "https://www.mountemporium.com/sitemap.xml"
}/api/public/seo/entities.jsonTry it →AEO-focused entity export — long-form knowledge articles, FAQ hubs, and pages carrying breadcrumb trails for AI answer engines.
Query parameters
| Name | Values | Default | Notes |
|---|---|---|---|
kind | all | articles | faqs | breadcrumbs | all | — |
Request
curl -sS \
-H "Accept: application/json" \
-H "If-None-Match: \"<etag-from-previous-response>\"" \
"https://www.mountemporium.com/api/public/seo/entities.json?kind=faqs"Response — 200 OK, application/json
{
"site": "https://www.mountemporium.com",
"generated_at": "2026-07-20T12:00:00.000Z",
"entities": [
{
"kind": "faq",
"url": "https://www.mountemporium.com/faq#wallet-minimum",
"question": "What is the minimum wallet balance to place an order?",
"answer": "You need at least ₹100 operating balance to place a new order. Minimum recharge per transaction is ₹500.",
"hub": "https://www.mountemporium.com/faq"
},
{
"kind": "article",
"url": "https://www.mountemporium.com/kb/how-rto-settlement-works",
"title": "How RTO settlement works",
"excerpt": "QC-approved RTOs reverse the product cost (not packaging) back to your wallet.",
"updated_at": "2026-07-10"
}
]
}/api/public/seo/crawler-config.jsonTry it →Effective robots.txt rules, sitemap URLs, and llms.txt content hubs exposed as structured JSON — useful for AI crawlers that prefer JSON to text.
Request
curl -sS \
-H "Accept: application/json" \
-H "If-None-Match: \"<etag-from-previous-response>\"" \
"https://www.mountemporium.com/api/public/seo/crawler-config.json"Response — 200 OK, application/json
{
"site": "https://www.mountemporium.com",
"robots": {
"rules": [
{ "user_agent": "*", "allow": ["/"], "disallow": ["/admin", "/app", "/auth", "/cart", "/checkout"] },
{ "user_agent": "GPTBot", "allow": ["/"] },
{ "user_agent": "PerplexityBot", "allow": ["/"] }
],
"sitemaps": [
"https://www.mountemporium.com/sitemap.xml"
]
},
"llms_txt": {
"url": "https://www.mountemporium.com/llms.txt",
"hubs": [
{ "name": "Docs", "url": "https://www.mountemporium.com/docs" },
{ "name": "Knowledge Base", "url": "https://www.mountemporium.com/kb" },
{ "name": "FAQ", "url": "https://www.mountemporium.com/faq" },
{ "name": "Blog", "url": "https://www.mountemporium.com/blog" },
{ "name": "Case Studies", "url": "https://www.mountemporium.com/case-studies" }
]
}
}Truncated for brevity; the live response reflects the current admin-editable rules.
Conditional requests (304 flow)
Cache the ETag from a successful 200 response, then send it back on the next request via If-None-Match. When nothing has changed you get an empty 304 Not Modified — cheap for both sides.
# First call — cache the ETag
curl -sD - "https://www.mountemporium.com/api/public/seo/sitemap.json" | grep -i etag
# ETag: "d41d8cd98f00b204e9800998ecf8427e"
# Follow-up call with If-None-Match
curl -sI \
-H 'If-None-Match: "d41d8cd98f00b204e9800998ecf8427e"' \
"https://www.mountemporium.com/api/public/seo/sitemap.json"
# HTTP/2 304Error responses
| Status | Meaning |
|---|---|
304 | Not modified — your cached copy is still valid. |
400 | Invalid kind query value. |
500 | Upstream error building the payload. Safe to retry. |
XML feeds
https://www.mountemporium.com/sitemap.xml— sitemap indexhttps://www.mountemporium.com/robots.txt— crawl ruleshttps://www.mountemporium.com/llms.txt— AI-crawler brief