Pull approved JSON-LD and structured page-rewrite components into AEM or any CMS. Same key, same URL lookup, two products.
https://satelliteai.io/api/externalThe External API is a read/write integration for systems that already have a SatelliteAI account. It does not use OAuth or a Bearer /v1 catalog. Requests are POST JSON to /api/external/... with an API key header.
| API | Endpoints | Purpose |
|---|---|---|
| Schema | /get-schema, /json-schema-from-aem |
Submit and retrieve approved JSON-LD for a page URL |
| Rewrite Extract | /get-rewrite-component, /get-rewrite |
Pull typed rewrite pieces (hero, FAQ, page properties, related) for AEM |
rewrite_found is false, run Page Rewrite in SatelliteAI, then retry. Schema generation is a separate product (/json-schema-from-aem).Every request needs both:
X-Api-Key — issued for your integration (same key as Schema)user_email (or submitter/approver emails on schema submit) — a SatelliteAI user with access to the site that owns the URLX-Api-Key: YOUR_API_KEY Content-Type: application/json
Ask your SatelliteAI admin for a key. Do not put the key in client-side browser code that ships to anonymous visitors.
Missing schema or rewrite is 200 with a found flag set to false. That is an empty read, not a failure. Auth and validation problems use 4xx.
| HTTP | When |
|---|---|
| 401 | Missing X-Api-Key |
| 403 | Invalid API key |
| 400 | Missing fields, bad URL scheme, unknown component, bad include |
| 404 | Unknown email, or the user cannot access the site |
200 + schema_found: false | No schema for that URL |
200 + rewrite_found: false | No rewrite for that URL |
200 + component_found: false | Rewrite exists; that component does not |
| 500 | Server or storage failure |
Retrieve approved production JSON-LD for a page. Optional language filters schema language.
{
"url": "https://www.example.com/page",
"user_email": "author@company.com"
}
{
"status": "success",
"url": "https://www.example.com/page",
"schema_found": true,
"schema_data": {
"result": [
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "Page title",
"description": "Page description"
}
]
},
"schema_status": "approved",
"site_id": 123,
"site_name": "Example Site"
}
{
"status": "success",
"schema_found": false,
"message": "Schema has not been created for this URL. Please click Generate Schema."
}
Queue schema generation for a URL. Submitter and approver emails must exist in SatelliteAI.
{
"url": "https://www.example.com/page",
"submitter_email": "author@company.com",
"approver_email": "manager@company.com",
"source": "aem"
}
One CMS field. component is required. Responses always use the canonical name. Aliases are accepted on input (qa → faq, title → page_properties).
{
"url": "https://www.thermofisher.com/bindingsite/us/en/clinical-applications/monoclonal-gammopathies.html",
"user_email": "author@company.com",
"component": "faq"
}
Optional: rewrite_id pins a specific rewrite. language is echoed only.
{
"status": "success",
"rewrite_found": true,
"component_found": true,
"component": "faq",
"payload": {
"heading": "Frequently Asked Questions About Monoclonal Gammopathies",
"heading_tag": "h2",
"items": [
{
"question": "What are monoclonal gammopathies?",
"answer": "Monoclonal gammopathies are disorders caused by clonal plasma cells that produce abnormal monoclonal immunoglobulins (M-proteins)."
}
],
"placement": "before_related"
},
"derived": false,
"rewrite_status": "draft",
"validation_passed": true
}
{
"payload": {
"h1": "Monoclonal Gammopathies: Types, Diagnosis, and Monitoring",
"aeo_summary": "Monoclonal gammopathies are a group of plasma cell disorders...",
"value_proposition": {
"text": "Monoclonal gammopathies are a group of plasma cell disorders characterized by abnormal production of monoclonal immunoglobulins (M-proteins).",
"word_count": 17
}
},
"derived": true
}
cta is in the catalog but is not guessed. Older rewrites often return this until the page is re-run.
{
"status": "success",
"rewrite_found": true,
"component_found": false,
"component": "cta",
"message": "This rewrite has no cta component.",
"components_present": ["h1", "aeo_summary", "faq", "hero", "page_properties"]
}
Every present component. Use include to skip large payloads (assembled, semantic, polished).
{
"url": "https://www.thermofisher.com/bindingsite/us/en/clinical-applications/monoclonal-gammopathies.html",
"user_email": "author@company.com",
"include": ["hero", "faq", "page_properties", "related_articles"]
}
components_present is the full inventory. components is the requested subset (or everything present if you omit include). Absent names are omitted, not null.
Canonical names are lowercase snake_case. FAQ public shape is always items. title maps to page_properties, not h1. table and comparison_table are different components.
| AEM dialog | Component | JSON path |
|---|---|---|
| Page Properties | page_properties | payload.title, payload.meta_description |
| Hero / Teaser | hero | payload.h1, aeo_summary, value_proposition, cta |
| Hero abstract | aeo_summary | payload.text |
| Page H1 | h1 | payload.text |
| Hero button | cta | payload.label, payload.url |
| Highlights | key_takeaways | payload.items[] |
| On this page | outline | payload.items[] |
| Title + Text | section_leads | payload.items[] |
| FAQ accordion | faq | payload.items[] |
| FAQ JSON-LD | faqpage_schema | FAQPage graph |
| Comparison table | comparison_table | columns, rows |
| Specs table | table | columns, rows |
| How-to | howto | payload.items[] |
| Related / see also | related_articles | payload.items[] |
| Downloads / IFUs | downloads | payload.items[] |
| Reviewed by | attribution | name, credentials, date, text |
| Entity | entity | payload.entity |
Also in the catalog: value_proposition, key_topics, statistics, callout, definition, benefits, clinical_applications, howto_schema, assembled, semantic, polished.
related_articles keeps every link. downloads is the file subset. The same PDF can appear in both. derived: true means the field was built from other rewrite content (typical for hero, outline, and page_properties on existing rewrites).
| Field | Meaning |
|---|---|
rewrite_found | A rewrite exists for this URL and this user can see it |
component_found | That rewrite has a payload for the requested name |
rewrite_status | Almost always draft. That still means the job finished |
derived | Built from other fields vs a typed writer block |
url_match | exact or normalized (host, slash, or scheme fold) |
components_present | Inventory of canonical names on this rewrite |
curl -X POST "https://satelliteai.io/api/external/get-rewrite-component" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d "{
\"url\": \"https://www.example.com/page\",
\"user_email\": \"author@company.com\",
\"component\": \"faq\"
}"
const BASE = 'https://satelliteai.io/api/external';
async function getRewriteComponent(url, userEmail, component) {
const res = await fetch(`${BASE}/get-rewrite-component`, {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({ url, user_email: userEmail, component })
});
const data = await res.json();
if (!res.ok) throw new Error(data.error || `HTTP ${res.status}`);
if (!data.rewrite_found || !data.component_found) return null;
return data.payload;
}
rewrite_id to pin an older row.(thermofisher.com) stay in body copy. They are stripped only from page_properties.meta_description./get-schema.GET /api/external/health.Need a key or a walkthrough? Request a demo.