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:

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:

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.