Structured Content API
The Structured Content API exposes Experience Workspace structured content as JSON for reading, writing, searching, and publishing. It is available at:
https://sc-api.adobeaem.workers.dev/
Use this API when you need more than a single published document: source CRUD, folder listing, query indexes across many documents, preview/live refresh, and an interactive explorer. For a simple read of one published document from Edge Delivery Services, you can also use the da-sc delivery endpoint described in the structured content administration guide.
Base URL and routes
All paths are rooted at https://sc-api.adobeaem.workers.dev. Tier is one of source, preview, or live.
| Route | Methods | Purpose |
/{preview|live}/{org}/{site}/{path} |
GET |
Fetch a document from Edge Delivery Services HTML and convert it to structured content JSON |
/source/{org}/{site}/ or /source/{org}/{site}/{folder}/ |
GET |
List direct children of a source folder (trailing slash required) |
/source/{org}/{site}/{path}.json |
GET |
Read a source document as JSON (.json suffix required) |
/source/{org}/{site}/{path}.json |
PUT |
Write JSON to source (converted to HTML and stored in DA or helix6 source) |
/source/{org}/{site}/{path}.json |
POST |
Preview and publish the path via the Admin API, then reindex that path in preview and live query.json (authorization required) |
/{preview|live|source}/{org}/{site}/query.json |
GET, POST |
Read or rebuild the query index for that org/site/tier |
/explorer/ |
GET |
Interactive API Explorer UI for browsing, querying, editing, and publishing |
Authentication
When the upstream content or Admin API requires auth, forward one of:
Authorization: Bearer <ims-token>Authorization: token <site-token>
The worker forwards the header as-is. Authenticated responses use Cache-Control: private, no-store. See Authentication setup for a site for obtaining a site token.
Reading preview and live JSON
Preview and live routes fetch the corresponding Edge Delivery Services HTML page and convert it with the structured content HTML→JSON converter.
curl 'https://sc-api.adobeaem.workers.dev/live/<ORG>/<SITE>/coffees/light-roast.json'
curl 'https://sc-api.adobeaem.workers.dev/preview/<ORG>/<SITE>/coffees/light-roast.json'
You may omit the .json suffix on preview/live; the response is always JSON. The document shape matches structured content: metadata (including schemaName) and data.
Source documents
The source tier talks to the content source (Document Authoring / DA, or helix6 via api.aem.live). The worker detects the backend with GET https://admin.hlx.page/ping/{org}/{site}. Override with ?backend=da or ?backend=helix6 when needed.
List a folder
curl 'https://sc-api.adobeaem.workers.dev/source/<ORG>/<SITE>/coffees/' \
-H 'Authorization: token <SITE_TOKEN>'
Read a document
curl 'https://sc-api.adobeaem.workers.dev/source/<ORG>/<SITE>/coffees/light-roast.json' \
-H 'Authorization: token <SITE_TOKEN>'
Successful source reads may include X-SC-Can-Publish: 1 when Admin status reports that the source/edit timestamp is newer than live.
Write a document
curl -X PUT 'https://sc-api.adobeaem.workers.dev/source/<ORG>/<SITE>/coffees/light-roast.json' \
-H 'Authorization: token <SITE_TOKEN>' \
-H 'Content-Type: application/json' \
-d @payload.json
The body must be a structured content document with metadata.schemaName. Empty string fields are preserved in the stored HTML.
Preview and publish
curl -X POST 'https://sc-api.adobeaem.workers.dev/source/<ORG>/<SITE>/coffees/light-roast.json' \
-H 'Authorization: token <SITE_TOKEN>'
This posts to the Admin API preview endpoint, then live (admin.hlx.page for DA, or api.aem.live for helix6). After a successful publish, the worker path-reindexes that document in both the preview and live query indexes.
Query index
Each org/site/tier has a query index stored in R2 at {org}/{site}/{tier}/query.json. The index holds nested structured content documents plus path and lastModified.
Search (GET)
curl 'https://sc-api.adobeaem.workers.dev/live/<ORG>/<SITE>/query.json?q=currency:USD&limit=100'
Response shape:
{
"total": 12,
"offset": 0,
"limit": 100,
"data": [
{
"path": "coffees/light-roast",
"lastModified": "2026-11-06T12:00:00.000Z",
"metadata": { "schemaName": "coffee", "title": "light-roast" },
"data": { "category": "Bagged Coffee", "currency": "USD" }
}
]
}
Query string options:
q— Google-style fulltext. Terms are ANDed. Usefield:valuefor field filters and quotes for phrases.qstarting with{— treated as a GraphQL document (see below).limit/offset— pagination for fulltext (defaultlimit=1000).
On preview and live GET, the worker issues a quick HEAD to the site's Edge Delivery Services /sitemap.json. If the sitemap's Last-Modified is newer than the stored index, the index is rebuilt before the response. When that happens, the response includes X-SC-Query-Refreshed: 1.
GraphQL
When q starts with {, the worker runs GraphQL against the index. Root field:
{
results(q: "currency:USD", limit: 1000) {
total
offset
limit
data {
path
lastModified
metadata
data
}
}
}
metadata and data are JSON scalars (the full nested objects). Filter with the same fulltext q argument used for REST search.
Rebuild (POST)
Full rebuild from inventory (sitemap for preview/live; source tree walk for source):
curl -X POST 'https://sc-api.adobeaem.workers.dev/live/<ORG>/<SITE>/query.json' \
-H 'Authorization: token <SITE_TOKEN>'
Entries whose inventory lastModified is unchanged are reused; others are refetched. The response includes added, deleted, updated, total, and the index.
Path-targeted reindex (patch only the listed paths; other entries are kept):
curl -X POST 'https://sc-api.adobeaem.workers.dev/live/<ORG>/<SITE>/query.json' \
-H 'Authorization: token <SITE_TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "paths": ["coffees/light-roast", "coffees/dark-roast"] }'
If a tier's index was never built, a path-targeted POST creates an index that contains only those paths. Run an empty-body POST once to build the full index from the sitemap or source tree.
API Explorer
Open the interactive explorer:
https://sc-api.adobeaem.workers.dev/explorer/
From there you can pick org/site, switch between source/preview/live, browse paths, run fulltext or GraphQL queries, edit and PUT source JSON, and publish when source is ahead of live.
Related documentation
- Structured content — configure folders, schemas, and the
da-scdelivery endpoint - Schema for structured content — schema rules and examples
- Authoring structured content — form-based editor for authors
- How to use structured content — developer playbook for consuming JSON in blocks